+=item GlobalCancel
+
+($messages,$nextreservinfo) = &GlobalCancel($itemnumber,$borrowernumber);
+
+ New op dev for the circulation based on item, global is a function to cancel reserv,check other reserves, and transfer document if it's necessary
+
+=cut
+
+#'
+sub GlobalCancel {
+ my $messages;
+ my $nextreservinfo;
+ my ( $itemnumber, $borrowernumber ) = @_;
+
+ #step 1 : cancel the reservation
+ my $CancelReserve = CancelReserve( undef, $itemnumber, $borrowernumber );
+
+ #step 2 launch the subroutine of the others reserves
+ ( $messages, $nextreservinfo ) = OtherReserves($itemnumber);
+
+ return ( $messages, $nextreservinfo );
+}
+
+=item OtherReserves
+
+($messages,$nextreservinfo)=$OtherReserves(itemnumber);
+
+Check queued list of this document and check if this document must be transfered
+
+=cut
+
+#'
+sub OtherReserves {
+ my ($itemnumber) = @_;
+ my $messages;
+ my $nextreservinfo;
+ my ( $restype, $checkreserves ) = CheckReserves($itemnumber);
+ if ($checkreserves) {
+ my $iteminfo = C4::Circulation::Circ2::getiteminformation($itemnumber,undef);
+ if ( $iteminfo->{'holdingbranch'} ne $checkreserves->{'branchcode'} ) {
+ $messages->{'transfert'} = $checkreserves->{'branchcode'};
+ #minus priorities of others reservs
+ MinusPriority(
+ $itemnumber,
+ $checkreserves->{'borrowernumber'},
+ $iteminfo->{'biblionumber'}
+ );
+
+ #launch the subroutine dotransfer
+ C4::Circulation::Circ2::dotransfer(
+ $itemnumber,
+ $iteminfo->{'holdingbranch'},
+ $checkreserves->{'branchcode'}
+ ),
+ ;
+ }
+
+ #step 2b : case of a reservation on the same branch, set the waiting status
+ else {
+ $messages->{'waiting'} = 1;
+ MinusPriority(
+ $itemnumber,
+ $checkreserves->{'borrowernumber'},
+ $iteminfo->{'biblionumber'}
+ );
+ SetWaitingStatus($itemnumber);
+ }
+
+ $nextreservinfo = $checkreserves->{'borrowernumber'};
+ }
+
+ return ( $messages, $nextreservinfo );
+}
+
+=item MinusPriority
+
+&MinusPriority($itemnumber,$borrowernumber,$biblionumber)
+
+Reduce the values of queuded list
+
+=cut
+
+#'
+sub MinusPriority {
+ my ( $itemnumber, $borrowernumber, $biblionumber ) = @_;
+
+ #first step update the value of the first person on reserv
+ my $dbh = C4::Context->dbh;
+ my $query = qq/
+ UPDATE reserves
+ SET priority = 0 , itemnumber = ?
+ WHERE cancellationdate IS NULL
+ AND borrowernumber=?
+ AND biblionumber=?
+ /;
+ my $sth_upd = $dbh->prepare($query);
+ $sth_upd->execute( $itemnumber, $borrowernumber, $biblionumber );
+ $sth_upd->finish;
+ # second step update all others reservs
+ $query = qq/
+ SELECT priority,borrowernumber,biblionumber,reservedate
+ FROM reserves
+ WHERE priority !='0'
+ AND biblionumber = ?
+ AND cancellationdate IS NULL
+ /;
+ my $sth_oth = $dbh->prepare($query);
+ $sth_oth->execute($biblionumber);
+ while ( my ( $priority, $borrowernumber, $biblionumber, $reservedate ) =
+ $sth_oth->fetchrow_array )
+ {
+ $priority--;
+ $query = qq/
+ UPDATE reserves
+ SET priority = ?
+ WHERE biblionumber = ?
+ AND borrowernumber = ?
+ AND reservedate = ?
+ /;
+ my $sth_upd_oth = $dbh->prepare($query);
+ $sth_upd_oth->execute( $priority, $biblionumber, $borrowernumber,
+ $reservedate );
+ $sth_upd_oth->finish;
+ }
+ $sth_oth->finish;
+}
+
+=item SetWaitingStatus
+
+&SetWaitingStatus($itemnumber);
+
+we check if we have a reserves with itemnumber (New op system of reserves), if we found one, we update the status of the reservation when we have : 'priority' = 0, and we have an itemnumber
+
+=cut
+
+sub SetWaitingStatus {
+
+ #first : check if we have a reservation for this item .
+ my ($itemnumber) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq/
+ SELECT priority,borrowernumber
+ FROM reserves
+ WHERE itemnumber=?
+ AND cancellationdate IS NULL
+ AND found IS NULL AND priority='0'
+ /;
+ my $sth_find = $dbh->prepare($query);
+ $sth_find->execute($itemnumber);
+ my ( $priority, $borrowernumber ) = $sth_find->fetchrow_array;
+ $sth_find->finish;
+ return unless $borrowernumber;
+
+# step 2 : if we have a borrowernumber, we update the value found to 'W' to notify the borrower
+ $query = qq/
+ UPDATE reserves
+ SET found='W',waitingdate = now()
+ WHERE borrowernumber=?
+ AND itemnumber=?
+ AND found IS NULL
+ /;
+ my $sth_set = $dbh->prepare($query);
+ $sth_set->execute( $borrowernumber, $itemnumber );
+ $sth_set->finish;
+}
+
+=item GetReservations
+
+@borrowerreserv=&GetReservations($itemnumber,$borrowernumber);
+
+this function get the list of reservation for an C<$itemnumber> or C<$borrowernumber>
+given on input arg. You should give $itemnumber OR $borrowernumber but not both.
+
+=cut
+
+sub GetReservations {
+ my ( $itemnumber, $borrowernumber ) = @_;
+ if ($itemnumber) {
+ my $dbh = C4::Context->dbh;
+ my $query = qq/
+ SELECT reservedate,borrowernumber
+ FROM reserves
+ WHERE itemnumber=?
+ AND cancellationdate IS NULL
+ AND (found <> 'F' OR found IS NULL)
+ /;
+ my $sth_res = $dbh->prepare($query);
+ $sth_res->execute($itemnumber);
+ my ( $reservedate, $borrowernumber ) = $sth_res->fetchrow_array;
+ return ( $reservedate, $borrowernumber );
+ }
+ if ($borrowernumber) {
+ my $dbh = C4::Context->dbh;
+ my $query = qq/
+ SELECT *
+ FROM reserves
+ WHERE borrowernumber=?
+ AND cancellationdate IS NULL
+ AND (found != 'F' or found is null)
+ ORDER BY reservedate
+ /;
+
+ my $sth_find = $dbh->prepare($query);
+ $sth_find->execute($borrowernumber);
+ my @borrowerreserv;
+ while ( my $data = $sth_find->fetchrow_hashref ) {
+ push @borrowerreserv, $data;
+ }
+ return @borrowerreserv;
+ }
+}
+