Lines 131-136
BEGIN {
Link Here
|
131 |
&SuspendAll |
131 |
&SuspendAll |
132 |
|
132 |
|
133 |
&GetReservesControlBranch |
133 |
&GetReservesControlBranch |
|
|
134 |
&ReservesOnSamePeriod |
134 |
|
135 |
|
135 |
IsItemOnHoldAndFound |
136 |
IsItemOnHoldAndFound |
136 |
|
137 |
|
Lines 279-285
sub AddReserve {
Link Here
|
279 |
|
280 |
|
280 |
=head2 CanBookBeReserved |
281 |
=head2 CanBookBeReserved |
281 |
|
282 |
|
282 |
$canReserve = &CanBookBeReserved($borrowernumber, $biblionumber, $branchcode) |
283 |
$canReserve = &CanBookBeReserved($borrowernumber, $biblionumber, $branchcode, { |
|
|
284 |
hold_date => $hold_date, |
285 |
expiration_date => $expiration_date, |
286 |
}) |
283 |
if ($canReserve eq 'OK') { #We can reserve this Item! } |
287 |
if ($canReserve eq 'OK') { #We can reserve this Item! } |
284 |
|
288 |
|
285 |
See CanItemBeReserved() for possible return values. |
289 |
See CanItemBeReserved() for possible return values. |
Lines 287-293
See CanItemBeReserved() for possible return values.
Link Here
|
287 |
=cut |
291 |
=cut |
288 |
|
292 |
|
289 |
sub CanBookBeReserved{ |
293 |
sub CanBookBeReserved{ |
290 |
my ($borrowernumber, $biblionumber, $pickup_branchcode) = @_; |
294 |
my ($borrowernumber, $biblionumber, $pickup_branchcode, $params) = @_; |
291 |
|
295 |
|
292 |
my @itemnumbers = Koha::Items->search({ biblionumber => $biblionumber})->get_column("itemnumber"); |
296 |
my @itemnumbers = Koha::Items->search({ biblionumber => $biblionumber})->get_column("itemnumber"); |
293 |
#get items linked via host records |
297 |
#get items linked via host records |
Lines 298-304
sub CanBookBeReserved{
Link Here
|
298 |
|
302 |
|
299 |
my $canReserve = { status => '' }; |
303 |
my $canReserve = { status => '' }; |
300 |
foreach my $itemnumber (@itemnumbers) { |
304 |
foreach my $itemnumber (@itemnumbers) { |
301 |
$canReserve = CanItemBeReserved( $borrowernumber, $itemnumber, $pickup_branchcode ); |
305 |
$canReserve = CanItemBeReserved( $borrowernumber, $itemnumber, $pickup_branchcode, $params ); |
302 |
return { status => 'OK' } if $canReserve->{status} eq 'OK'; |
306 |
return { status => 'OK' } if $canReserve->{status} eq 'OK'; |
303 |
} |
307 |
} |
304 |
return $canReserve; |
308 |
return $canReserve; |
Lines 306-312
sub CanBookBeReserved{
Link Here
|
306 |
|
310 |
|
307 |
=head2 CanItemBeReserved |
311 |
=head2 CanItemBeReserved |
308 |
|
312 |
|
309 |
$canReserve = &CanItemBeReserved($borrowernumber, $itemnumber, $branchcode) |
313 |
$canReserve = &CanItemBeReserved($borrowernumber, $itemnumber, $branchcode, { |
|
|
314 |
hold_date => $hold_date, |
315 |
expiration_date => $expiration_date, |
316 |
}) |
310 |
if ($canReserve->{status} eq 'OK') { #We can reserve this Item! } |
317 |
if ($canReserve->{status} eq 'OK') { #We can reserve this Item! } |
311 |
|
318 |
|
312 |
@RETURNS { status => OK }, if the Item can be reserved. |
319 |
@RETURNS { status => OK }, if the Item can be reserved. |
Lines 324-330
sub CanBookBeReserved{
Link Here
|
324 |
=cut |
331 |
=cut |
325 |
|
332 |
|
326 |
sub CanItemBeReserved { |
333 |
sub CanItemBeReserved { |
327 |
my ( $borrowernumber, $itemnumber, $pickup_branchcode ) = @_; |
334 |
my ( $borrowernumber, $itemnumber, $pickup_branchcode, $params ) = @_; |
|
|
335 |
|
336 |
$params //= {}; |
328 |
|
337 |
|
329 |
my $dbh = C4::Context->dbh; |
338 |
my $dbh = C4::Context->dbh; |
330 |
my $ruleitemtype; # itemtype of the matching issuing rule |
339 |
my $ruleitemtype; # itemtype of the matching issuing rule |
Lines 513-518
sub CanItemBeReserved {
Link Here
|
513 |
} |
522 |
} |
514 |
} |
523 |
} |
515 |
|
524 |
|
|
|
525 |
if (C4::Context->preference('PreventReservesOnSamePeriod')) { |
526 |
my $overlapping_reserves = ReservesOnSamePeriod($item->biblionumber, $item->itemnumber, $params->{hold_date}, $params->{expiration_date}); |
527 |
if ($overlapping_reserves && 0 < scalar @$overlapping_reserves) { |
528 |
return { status => 'reservesOnSamePeriod' }; |
529 |
} |
530 |
} |
531 |
|
516 |
return { status => 'OK' }; |
532 |
return { status => 'OK' }; |
517 |
} |
533 |
} |
518 |
|
534 |
|
Lines 2243-2248
sub GetHoldRule {
Link Here
|
2243 |
return $rules; |
2259 |
return $rules; |
2244 |
} |
2260 |
} |
2245 |
|
2261 |
|
|
|
2262 |
=head2 ReservesOnSamePeriod |
2263 |
|
2264 |
my $reserve = ReservesOnSamePeriod( $biblionumber, $itemnumber, $resdate, $expdate); |
2265 |
|
2266 |
Return the reserve that match the period ($resdate => $expdate), |
2267 |
undef if no reserve match. |
2268 |
|
2269 |
=cut |
2270 |
|
2271 |
sub ReservesOnSamePeriod { |
2272 |
my ($biblionumber, $itemnumber, $resdate, $expdate) = @_; |
2273 |
|
2274 |
unless ($resdate && $expdate) { |
2275 |
return; |
2276 |
} |
2277 |
|
2278 |
my @reserves = Koha::Holds->search({ biblionumber => $biblionumber }); |
2279 |
|
2280 |
$resdate = output_pref({ str => $resdate, dateonly => 1, dateformat => 'iso' }); |
2281 |
$expdate = output_pref({ str => $expdate, dateonly => 1, dateformat => 'iso' }); |
2282 |
|
2283 |
my @reserves_overlaps; |
2284 |
foreach my $reserve ( @reserves ) { |
2285 |
|
2286 |
unless ($reserve->reservedate && $reserve->expirationdate) { |
2287 |
next; |
2288 |
} |
2289 |
|
2290 |
if (date_ranges_overlap($resdate, $expdate, |
2291 |
$reserve->reservedate, |
2292 |
$reserve->expirationdate)) { |
2293 |
|
2294 |
# If reserve is item level and the requested periods overlap. |
2295 |
if ($itemnumber && $reserve->itemnumber == $itemnumber ) { |
2296 |
return [$reserve->unblessed]; |
2297 |
} |
2298 |
push @reserves_overlaps, $reserve->unblessed; |
2299 |
} |
2300 |
} |
2301 |
|
2302 |
if ( @reserves_overlaps >= Koha::Items->search({ biblionumber => $biblionumber })->count() ) { |
2303 |
return \@reserves_overlaps; |
2304 |
} |
2305 |
|
2306 |
return; |
2307 |
} |
2308 |
|
2246 |
=head1 AUTHOR |
2309 |
=head1 AUTHOR |
2247 |
|
2310 |
|
2248 |
Koha Development Team <http://koha-community.org/> |
2311 |
Koha Development Team <http://koha-community.org/> |