[Koha-patches] [PATCH] bug_2830: Remove reserve when checking out if the borrower is not the first one in the reserve queue
Srdjan Jankovic
srdjan at catalyst.net.nz
Tue Sep 20 05:57:53 CEST 2011
---
C4/Circulation.pm | 34 +-----------------
C4/Reserves.pm | 58 ++++++++++++++++++++++++++++--
t/db_dependent/lib/KohaTest/Reserves.pm | 1 +
3 files changed, 57 insertions(+), 36 deletions(-)
diff --git a/C4/Circulation.pm b/C4/Circulation.pm
index 520c116..5865d91 100644
--- a/C4/Circulation.pm
+++ b/C4/Circulation.pm
@@ -984,38 +984,8 @@ sub AddIssue {
}
# See if the item is on reserve.
- my ( $restype, $res ) =
- C4::Reserves::CheckReserves( $item->{'itemnumber'} );
- if ($restype) {
- my $resbor = $res->{'borrowernumber'};
- if ( $resbor eq $borrower->{'borrowernumber'} ) {
- # The item is reserved by the current patron
- ModReserveFill($res);
- }
- elsif ( $restype eq "Waiting" ) {
- # warn "Waiting";
- # The item is on reserve and waiting, but has been
- # reserved by some other patron.
- }
- elsif ( $restype eq "Reserved" ) {
- # warn "Reserved";
- # The item is reserved by someone else.
- if ($cancelreserve) { # cancel reserves on this item
- CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
- }
- }
- if ($cancelreserve) {
- CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
- }
- else {
- # set waiting reserve to first in reserve queue as book isn't waiting now
- ModReserve(1,
- $res->{'biblionumber'},
- $res->{'borrowernumber'},
- $res->{'branchcode'}
- );
- }
- }
+ MoveReserve( $item->{'itemnumber'}, $borrower->{'borrowernumber'}, $cancelreserve );
+
# Starting process for transfer job (checking transfert and validate it if we have one)
my ($datesent) = GetTransfers($item->{'itemnumber'});
diff --git a/C4/Reserves.pm b/C4/Reserves.pm
index 8373840..469b719 100644
--- a/C4/Reserves.pm
+++ b/C4/Reserves.pm
@@ -109,6 +109,7 @@ BEGIN {
&ModReserveStatus
&ModReserveCancelAll
&ModReserveMinusPriority
+ &MoveReserve
&CheckReserves
&CanBookBeReserved
@@ -731,8 +732,8 @@ sub GetReserveStatus {
=head2 CheckReserves
- ($status, $reserve) = &CheckReserves($itemnumber);
- ($status, $reserve) = &CheckReserves(undef, $barcode);
+ ($status, $reserve, $all_reserves) = &CheckReserves($itemnumber);
+ ($status, $reserve, $all_reserves) = &CheckReserves(undef, $barcode);
Find a book in the reserves.
@@ -800,7 +801,7 @@ sub CheckReserves {
my $priority = 10000000;
foreach my $res (@reserves) {
if ( $res->{'itemnumber'} == $itemnumber && $res->{'priority'} == 0) {
- return ( "Waiting", $res ); # Found it
+ return ( "Waiting", $res, \@reserves ); # Found it
} else {
# See if this item is more important than what we've got so far
if ( $res->{'priority'} && $res->{'priority'} < $priority ) {
@@ -821,7 +822,7 @@ sub CheckReserves {
# We return the most important (i.e. next) reservation.
if ($highest) {
$highest->{'itemnumber'} = $item;
- return ( "Reserved", $highest );
+ return ( "Reserved", $highest, \@reserves );
}
else {
return ( 0, 0 );
@@ -1794,6 +1795,55 @@ sub _ShiftPriorityByDateAndPriority {
return $new_priority; # so the caller knows what priority they wind up receiving
}
+
+=head2 MoveReserve
+
+ MoveReserve( $itemnumber, $borrowernumber, $cancelreserve )
+
+Use when checking out an item to handle reserves
+If $cancelreserve boolean is set to true, it will remove existing reserve
+
+=cut
+
+sub MoveReserve {
+ my ( $itemnumber, $borrowernumber, $cancelreserve ) = @_;
+
+ my ( $restype, $res, $all_reserves ) = CheckReserves( $itemnumber );
+ return unless $res;
+
+ my $biblionumber = $res->{biblionumber};
+ my $biblioitemnumber = $res->{biblioitemnumber};
+
+ if ($res->{borrowernumber} == $borrowernumber) {
+ ModReserveFill($res);
+ }
+ else {
+ # warn "Reserved";
+ # The item is reserved by someone else.
+ # Find this item in the reserves
+
+ my $borr_res;
+ foreach (@$all_reserves) {
+ $_->{'borrowernumber'} == $borrowernumber or next;
+ $_->{'biblionumber'} == $biblionumber or next;
+
+ $borr_res = $_;
+ last;
+ }
+
+ if ( $borr_res ) {
+ # The item is reserved by the current patron
+ ModReserveFill($borr_res);
+ }
+
+ if ($cancelreserve) { # cancel reserves on this item
+ CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
+ CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
+ }
+ }
+}
+
+
=head1 AUTHOR
Koha Development Team <http://koha-community.org/>
diff --git a/t/db_dependent/lib/KohaTest/Reserves.pm b/t/db_dependent/lib/KohaTest/Reserves.pm
index 5317029..8b05dd0 100644
--- a/t/db_dependent/lib/KohaTest/Reserves.pm
+++ b/t/db_dependent/lib/KohaTest/Reserves.pm
@@ -29,6 +29,7 @@ sub methods : Test( 1 ) {
ModReserveAffect
ModReserveCancelAll
ModReserveMinusPriority
+ MoveReserve
GetReserveInfo
_FixPriority
_Findgroupreserve
--
1.6.5
More information about the Koha-patches
mailing list