3 # Copyright ByWater Solutions 2014
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
27 use base qw(Koha::Objects);
31 Koha::Holds - Koha Hold object set class
37 =head3 filter_by_found
39 my $found_holds = $holds->filter_by_found;
41 Returns a filtered resultset without holds that are considered I<found>.
42 i.e. 'P', 'T' and 'W'.
49 return $self->search( { found => [ 'P', 'T', 'W' ] } );
54 returns a set of holds that are waiting from an existing set
61 return $self->search( { found => 'W' } );
66 returns a set of holds that are processing from an existing set
73 return $self->search( { found => 'P' } );
78 returns a set of holds that are unfilled from an existing set
85 return $self->search( { found => undef } );
88 =head3 forced_hold_level
90 If a patron has multiple holds for a single record,
91 those holds must be either all record level holds,
92 or they must all be item level holds.
94 This method should be used with Hold sets where all
95 Hold objects share the same patron and record.
97 This method will return 'item' if the patron has
98 at least one item level hold. It will return 'record'
99 if the patron has holds but none are item level,
100 Finally, if the patron has no holds, it will return
101 undef which indicates the patron may select either
102 record or item level holds, barring any other rules
103 that would prevent one or the other.
107 sub forced_hold_level {
110 my $item_level_count = $self->search( { itemnumber => { '!=' => undef } } )->count();
111 return 'item' if $item_level_count > 0;
113 my $item_group_level_count = $self->search( { item_group_id => { '!=' => undef } } )->count();
114 return 'item_group' if $item_group_level_count > 0;
116 my $record_level_count = $self->search( { itemnumber => undef } )->count();
117 return 'record' if $record_level_count > 0;
122 =head3 get_items_that_can_fill
124 my $items = $holds->get_items_that_can_fill();
126 Return the list of items that can fill the hold set.
139 sub get_items_that_can_fill {
142 return Koha::Items->new->empty()
143 unless $self->count() > 0;
145 my @itemnumbers = $self->search({ 'me.itemnumber' => { '!=' => undef } })->get_column('itemnumber');
146 my @biblionumbers = $self->search({ 'me.itemnumber' => undef })->get_column('biblionumber');
148 push @bibs_or_items, 'me.itemnumber' => { in => \@itemnumbers } if @itemnumbers;
149 push @bibs_or_items, 'me.biblionumber' => { in => \@biblionumbers } if @biblionumbers;
151 my @branchtransfers = Koha::Item::Transfers->filter_by_current->search({}, {
152 columns => ['itemnumber'],
155 )->get_column('itemnumber');
156 my @waiting_holds = Koha::Holds->search(
159 columns => ['itemnumber'],
162 )->get_column('itemnumber');
164 return Koha::Items->search(
166 -or => \@bibs_or_items,
167 itemnumber => { -not_in => [ @branchtransfers, @waiting_holds ] },
171 )->filter_by_for_hold();
174 =head3 filter_by_has_cancellation_requests
176 my $with_cancellation_reqs = $holds->filter_by_has_cancellation_requests;
178 Returns a filtered resultset only containing holds that have cancellation requests.
182 sub filter_by_has_cancellation_requests {
185 return $self->search( { 'hold_cancellation_request_id' => { '!=' => undef } },
186 { join => 'cancellation_requests' } );
189 =head3 filter_out_has_cancellation_requests
191 my $holds_without_cancellation_requests = $holds->filter_out_has_cancellation_requests;
193 Returns a filtered resultset without holds with cancellation requests.
197 sub filter_out_has_cancellation_requests {
200 return $self->search( { 'hold_cancellation_request_id' => { '=' => undef } },
201 { join => 'cancellation_requests' } );
204 =head2 Internal methods
224 Kyle M Hall <kyle@bywatersolutions.com>