From: tipaul Date: Tue, 24 Apr 2007 16:10:36 +0000 (+0000) Subject: BIG COMMIT : cleaning of Reserves.pm. See detail on koha-devel X-Git-Tag: dev_week~309 X-Git-Url: http://git.rot13.org/?a=commitdiff_plain;h=fb143b71bad78a63baa961fc6fd607543958843f;hp=ee40bfb5c61d7c5e78f26ef9a324c6630ce35995;p=koha.git BIG COMMIT : cleaning of Reserves.pm. See detail on koha-devel --- diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 3c0e716d42..3a3f998668 100755 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -911,7 +911,7 @@ if ($borrower and $barcode){ if ( $resbor eq $borrower->{'borrowernumber'} ) { # The item is reserved by the current patron - FillReserve($res); + ModReserveFill($res); } elsif ( $restype eq "Waiting" ) { @@ -929,7 +929,7 @@ if ($borrower and $barcode){ else { # set waiting reserve to first in reserve queue as book isn't waiting now - UpdateReserve( + ModReserve( 1, $res->{'biblionumber'}, $res->{'borrowernumber'}, @@ -1235,7 +1235,7 @@ sub AddReturn { $sth->execute( $iteminformation->{'itemnumber'} ); $sth->finish; # now we check if there is a reservation with the validate of transfer if we have one, we can set it with the status 'W' - SetWaitingStatus( $iteminformation->{'itemnumber'} ); + ModReserveStatus( $iteminformation->{'itemnumber'},'W' ); } else { $messages->{'WrongTransfer'} = $tobranch; diff --git a/C4/Members.pm b/C4/Members.pm index 4f40b084e0..703a6ac651 100644 --- a/C4/Members.pm +++ b/C4/Members.pm @@ -442,13 +442,13 @@ sub patronflags { } $flags{'ODUES'} = \%flaginfo; } - my $itemswaiting = - GetWaitingReserves( $patroninformation->{'borrowernumber'} ); - my $nowaiting = scalar @$itemswaiting; + my @itemswaiting = + GetReservesFromBorrowernumber( $patroninformation->{'borrowernumber'},'W' ); + my $nowaiting = scalar @itemswaiting; if ( $nowaiting > 0 ) { my %flaginfo; $flaginfo{'message'} = "Reserved items available"; - $flaginfo{'itemlist'} = $itemswaiting; + $flaginfo{'itemlist'} = \@itemswaiting; $flags{'WAITING'} = \%flaginfo; } return ( \%flags ); diff --git a/C4/Reserves.pm b/C4/Reserves.pm index aab6bc8e13..10cb366e24 100755 --- a/C4/Reserves.pm +++ b/C4/Reserves.pm @@ -56,273 +56,126 @@ this modules provides somes functions to deal with reservations. @ISA = qw(Exporter); @EXPORT = qw( - &FindReserves - &CheckReserves - &GetWaitingReserves - &CancelReserve - &CalcReserveFee - &FillReserve - &ReserveWaiting - &CreateReserve - &UpdateReserve - &GetReserveTitle - &GetReservations - &SetWaitingStatus - &GlobalCancel - &MinusPriority - &OtherReserves - &GetFirstReserveDateFromItem - &CountReservesFromBorrower - &FixPriority - &FindReservesInQueue + &AddReserve + + &GetReservesFromItemnumber + &GetReservesFromBiblionumber + &GetReservesFromBorrowernumber GetReservesForBranch GetReservesToBranch -); - -# make all your functions, whether exported or not; - -=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); + &GetReserveCount + &GetReserveFee + GetReservesForBranch + GetReservesToBranch + &GetOtherReserves + + &ModReserveFill + &ModReserveAffect + &ModReserve + &ModReserveStatus + &ModReserveCancelAll + &ModReserveMinusPriority - return ( $messages, $nextreservinfo ); -} + &CheckReserves + &CancelReserve +); -=item OtherReserves -($messages,$nextreservinfo)=$OtherReserves(itemnumber); +=item AddReserve -Check queued list of this document and check if this document must be transfered +AddReserve($branch,$borrowernumber,$biblionumber,$constraint,$bibitems,$priority,$notes,$title,$checkitem,$found) =cut -#' -sub OtherReserves { - my ($itemnumber) = @_; - my $messages; - my $nextreservinfo; - my ( $restype, $checkreserves ) = CheckReserves($itemnumber); - if ($checkreserves) { - my $iteminfo = GetItem($itemnumber); - 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::ModItemTransfer( - $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); - } +sub AddReserve { + my ( + $branch, $borrowernumber, $biblionumber, + $constraint, $bibitems, $priority, $notes, + $title, $checkitem, $found + ) = @_; + my $fee = + GetReserveFee($borrowernumber, $biblionumber, $constraint, + $bibitems ); + my $dbh = C4::Context->dbh; + my $const = lc substr( $constraint, 0, 1 ); + my @datearr = localtime(time); + my $resdate = + ( 1900 + $datearr[5] ) . "-" . ( $datearr[4] + 1 ) . "-" . $datearr[3]; + my $waitingdate; - $nextreservinfo = $checkreserves->{'borrowernumber'}; + # If the reserv had the waiting status, we had the value of the resdate + if ( $found eq 'W' ) { + $waitingdate = $resdate; } - 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 = " - 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 = " - 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 = " - 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; + #eval { + # updates take place here + if ( $fee > 0 ) { + my $nextacctno = &getnextacctno( $borrowernumber ); + my $query = qq/ + INSERT INTO accountlines + (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding) + VALUES + (?,?,now(),?,?,'Res',?) + /; + my $usth = $dbh->prepare($query); + $usth->execute( $borrowernumber, $nextacctno, $fee, + "Reserve Charge - $title", $fee ); + $usth->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 = " - 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 = " - 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 = " - 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 = " - SELECT * - FROM reserves - WHERE borrowernumber=? - AND cancellationdate IS NULL - AND (found != 'F' or found is null) - ORDER BY reservedate - "; + #if ($const eq 'a'){ + my $query = qq/ + INSERT INTO reserves + (borrowernumber,biblionumber,reservedate,branchcode,constrainttype, + priority,reservenotes,itemnumber,found,waitingdate) + VALUES + (?,?,?,?,?, + ?,?,?,?,?) + /; + my $sth = $dbh->prepare($query); + $sth->execute( + $borrowernumber, $biblionumber, $resdate, $branch, + $const, $priority, $notes, $checkitem, + $found, $waitingdate + ); + $sth->finish; - my $sth_find = $dbh->prepare($query); - $sth_find->execute($borrowernumber); - my @borrowerreserv; - while ( my $data = $sth_find->fetchrow_hashref ) { - push @borrowerreserv, $data; + #} + if ( ( $const eq "o" ) || ( $const eq "e" ) ) { + my $numitems = @$bibitems; + my $i = 0; + while ( $i < $numitems ) { + my $biblioitem = @$bibitems[$i]; + my $query = qq/ + INSERT INTO reserveconstraints + (borrowernumber,biblionumber,reservedate,biblioitemnumber) + VALUES + (?,?,?,?) + /; + my $sth = $dbh->prepare(""); + $sth->execute( $borrowernumber, $biblionumber, $resdate, + $biblioitem ); + $sth->finish; + $i++; } - return @borrowerreserv; } + return; } -=item FindReserves - - $results = &FindReserves($biblionumber, $borrowernumber); - -Looks books up in the reserves. C<$biblionumber> is the biblionumber -of the book to look up. C<$borrowernumber> is the borrower number of a -patron whose books to look up. +=item GetReservesFromBiblionumber -Either C<$biblionumber> or C<$borrowernumber> may be the empty string, -but not both. If both are specified, C<&FindReserves> looks up the -given book for the given patron. If only C<$biblionumber> is -specified, C<&FindReserves> looks up that book for all patrons. If -only C<$borrowernumber> is specified, C<&FindReserves> looks up all of -that patron's reserves. If neither is specified, C<&FindReserves> -barfs. +@borrowerreserv=&GetReserves($biblionumber,$itemnumber,$borrowernumber); -For each book thus found, C<&FindReserves> checks the reserve -constraints and does something I don't understand. - -C<&FindReserves> returns a two-element array: - -C<$results> is a reference to an array of references of hashes. Each hash -has for keys a list of column from reserves table (see details in function). +this function get the list of reservation for an C<$biblionumber>, C<$itemnumber> or C<$borrowernumber> +given on input arg. +Only 1 argument has to be passed. =cut -#' -sub FindReserves { - my ( $biblionumber, $bor ) = @_; - my $dbh = C4::Context->dbh; - my @bind; +sub GetReservesFromBiblionumber { + my ( $biblionumber, $itemnumber, $borrowernumber ) = @_; + my $dbh = C4::Context->dbh; # Find the desired items in the reserves my $query = " @@ -335,30 +188,13 @@ sub FindReserves { constrainttype, found, itemnumber - FROM reserves - WHERE cancellationdate IS NULL - AND (found <> \'F\' OR found IS NULL) - "; - - if ( $biblionumber ne '' ) { - $query .= ' - AND biblionumber = ? - '; - push @bind, $biblionumber; - } - - if ( $bor ne '' ) { - $query .= ' - AND borrowernumber = ? - '; - push @bind, $bor; - } - - $query .= ' - ORDER BY priority - '; + FROM reserves + WHERE cancellationdate IS NULL + AND (found <> \'F\' OR found IS NULL) + AND biblionumber = ? + ORDER BY priority"; my $sth = $dbh->prepare($query); - $sth->execute(@bind); + $sth->execute($biblionumber); my @results; my $i = 0; while ( my $data = $sth->fetchrow_hashref ) { @@ -370,7 +206,7 @@ sub FindReserves { FROM reserveconstraints WHERE biblionumber = ? AND borrowernumber = ? - AND reservedate = ? + AND reservedate = ? '; my $csth = $dbh->prepare($query); $csth->execute( $data->{biblionumber}, $data->{borrowernumber}, @@ -406,21 +242,67 @@ sub FindReserves { push @results, $data; } $sth->finish; - return ( $#results + 1, \@results ); } +sub GetReservesFromItemnumber { + my ( $itemnumber ) = @_; + my $dbh = C4::Context->dbh; + my $query = " + SELECT reservedate,borrowernumber,branchcode + 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,$branchcode ) = $sth_res->fetchrow_array; + return ( $reservedate, $borrowernumber, $branchcode ); +} + +sub GetReservesFromBorrowernumber { + my ( $borrowernumber, $status ) = @_; + my $dbh = C4::Context->dbh; + my $sth; + if ($status) { + $sth = $dbh->prepare(" + SELECT * + FROM reserves + WHERE borrowernumber=? + AND cancellationdate IS NULL + AND found =? + ORDER BY reservedate + "); + $sth->execute($borrowernumber,$status); + } else { + $sth = $dbh->prepare(" + SELECT * + FROM reserves + WHERE borrowernumber=? + AND cancellationdate IS NULL + AND (found != 'F' or found is null) + ORDER BY reservedate + "); + $sth->execute($borrowernumber); + } + my @borrowerreserv; + while ( my $data = $sth->fetchrow_hashref ) { + push @borrowerreserv, $data; + } + return @borrowerreserv; +} #------------------------------------------------------------------------------------- -=item CountReservesFromBorrower +=item GetReserveCount -$number = &CountReservesFromBorrower($borrowernumber); +$number = &GetReserveCount($borrowernumber); this function returns the number of reservation for a borrower given on input arg. =cut -sub CountReservesFromBorrower { +sub GetReserveCount { my ($borrowernumber) = @_; my $dbh = C4::Context->dbh; @@ -440,51 +322,219 @@ sub CountReservesFromBorrower { return $row->{counter}; } -#------------------------------------------------------------------------------------- - -=item GetFirstReserveDateFromItem +=item GetOtherReserves -$date = GetFirstReserveDateFromItem($itemnumber) +($messages,$nextreservinfo)=$GetOtherReserves(itemnumber); -this function returns the first date a item has been reserved. +Check queued list of this document and check if this document must be transfered =cut -sub GetFirstReserveDateFromItem { +sub GetOtherReserves { my ($itemnumber) = @_; + my $messages; + my $nextreservinfo; + my ( $restype, $checkreserves ) = CheckReserves($itemnumber); + if ($checkreserves) { + my $iteminfo = GetItem($itemnumber); + if ( $iteminfo->{'holdingbranch'} ne $checkreserves->{'branchcode'} ) { + $messages->{'transfert'} = $checkreserves->{'branchcode'}; + #minus priorities of others reservs + ModReserveMinusPriority( + $itemnumber, + $checkreserves->{'borrowernumber'}, + $iteminfo->{'biblionumber'} + ); - my $dbh = C4::Context->dbh; - - my $query = ' - SELECT reservedate, - borrowernumber, - branchcode - FROM reserves - WHERE itemnumber = ? - AND cancellationdate IS NULL - AND (found != \'F\' OR found IS NULL) - '; - my $sth = $dbh->prepare($query); - $sth->execute($itemnumber); - my $row = $sth->fetchrow_hashref; - - return ($row->{reservedate},$row->{borrowernumber},$row->{branchcode}); -} + #launch the subroutine dotransfer + C4::Circulation::ModItemTransfer( + $itemnumber, + $iteminfo->{'holdingbranch'}, + $checkreserves->{'branchcode'} + ), + ; + } -#------------------------------------------------------------------------------------- + #step 2b : case of a reservation on the same branch, set the waiting status + else { + $messages->{'waiting'} = 1; + ModReserveMinusPriority( + $itemnumber, + $checkreserves->{'borrowernumber'}, + $iteminfo->{'biblionumber'} + ); + ModReserveStatus($itemnumber,'W'); + } + + $nextreservinfo = $checkreserves->{'borrowernumber'}; + } + + return ( $messages, $nextreservinfo ); +} + +sub GetReserveFee { + my ($borrowernumber, $biblionumber, $constraint, $bibitems ) = @_; + + #check for issues; + my $dbh = C4::Context->dbh; + my $const = lc substr( $constraint, 0, 1 ); + my $query = qq/ + SELECT * FROM borrowers,categories + WHERE borrowernumber = ? + AND borrowers.categorycode = categories.categorycode + /; + my $sth = $dbh->prepare($query); + $sth->execute($borrowernumber); + my $data = $sth->fetchrow_hashref; + $sth->finish(); + my $fee = $data->{'reservefee'}; + my $cntitems = @- > $bibitems; + + if ( $fee > 0 ) { + + # check for items on issue + # first find biblioitem records + my @biblioitems; + my $sth1 = $dbh->prepare( + "SELECT * FROM biblio,biblioitems + WHERE (biblio.biblionumber = ?) + AND (biblio.biblionumber = biblioitems.biblionumber)" + ); + $sth1->execute($biblionumber); + while ( my $data1 = $sth1->fetchrow_hashref ) { + if ( $const eq "a" ) { + push @biblioitems, $data1; + } + else { + my $found = 0; + my $x = 0; + while ( $x < $cntitems ) { + if ( @$bibitems->{'biblioitemnumber'} == + $data->{'biblioitemnumber'} ) + { + $found = 1; + } + $x++; + } + if ( $const eq 'o' ) { + if ( $found == 1 ) { + push @biblioitems, $data1; + } + } + else { + if ( $found == 0 ) { + push @biblioitems, $data1; + } + } + } + } + $sth1->finish; + my $cntitemsfound = @biblioitems; + my $issues = 0; + my $x = 0; + my $allissued = 1; + while ( $x < $cntitemsfound ) { + my $bitdata = $biblioitems[$x]; + my $sth2 = $dbh->prepare( + "SELECT * FROM items + WHERE biblioitemnumber = ?" + ); + $sth2->execute( $bitdata->{'biblioitemnumber'} ); + while ( my $itdata = $sth2->fetchrow_hashref ) { + my $sth3 = $dbh->prepare( + "SELECT * FROM issues + WHERE itemnumber = ? + AND returndate IS NULL" + ); + $sth3->execute( $itdata->{'itemnumber'} ); + if ( my $isdata = $sth3->fetchrow_hashref ) { + } + else { + $allissued = 0; + } + } + $x++; + } + if ( $allissued == 0 ) { + my $rsth = + $dbh->prepare("SELECT * FROM reserves WHERE biblionumber = ?"); + $rsth->execute($biblionumber); + if ( my $rdata = $rsth->fetchrow_hashref ) { + } + else { + $fee = 0; + } + } + } + + # print "fee $fee"; + return $fee; +} + +=head2 GetReservesToBranch + +@transreserv = GetReservesToBranch( $frombranch ); + +Get reserve list for a given branch + +=cut + +sub GetReservesToBranch { + my ( $frombranch ) = @_; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare( + "SELECT borrowernumber,reservedate,itemnumber,timestamp + FROM reserves + WHERE priority='0' AND cancellationdate is null + AND branchcode=? + AND found IS NULL " + ); + $sth->execute( $frombranch ); + my @transreserv; + my $i = 0; + while ( my $data = $sth->fetchrow_hashref ) { + $transreserv[$i] = $data; + $i++; + } + $sth->finish; + return (@transreserv); +} + +=head2 GetReservesForBranch + +@transreserv = GetReservesForBranch($frombranch); + +=cut + +sub GetReservesForBranch { + my ($frombranch) = @_; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare( " + SELECT borrowernumber,reservedate,itemnumber,waitingdate + FROM reserves + WHERE priority='0' + AND cancellationdate IS NULL + AND found='W' + AND branchcode=? + ORDER BY waitingdate" ); + $sth->execute($frombranch); + my @transreserv; + my $i = 0; + while ( my $data = $sth->fetchrow_hashref ) { + $transreserv[$i] = $data; + $i++; + } + $sth->finish; + return (@transreserv); +} =item CheckReserves - ($status, $reserve) = &CheckReserves($itemnumber, $barcode); + ($status, $reserve) = &CheckReserves($itemnumber); Find a book in the reserves. -C<$itemnumber> is the book's item number. C<$barcode> is its barcode. -Either one, but not both, may be false. If both are specified, -C<&CheckReserves> uses C<$itemnumber>. - -$itemnubmer can be false, in which case uses the barcode. (Never uses -both. $itemnumber gets priority). +C<$itemnumber> is the book's item number. As I understand it, C<&CheckReserves> looks for the given item in the reserves. If it is found, that's a match, and C<$status> is set to @@ -504,7 +554,6 @@ table in the Koha database. =cut -#' sub CheckReserves { my ( $item, $barcode ) = @_; my $dbh = C4::Context->dbh; @@ -544,11 +593,11 @@ sub CheckReserves { # get the reserves... # Find this item in the reserves - my @reserves = Findgroupreserve( $bibitem, $biblio ); + my @reserves = _Findgroupreserve( $bibitem, $biblio ); my $count = scalar @reserves; # $priority and $highest are used to find the most important item - # in the list returned by &Findgroupreserve. (The lower $priority, + # in the list returned by &_Findgroupreserve. (The lower $priority, # the more important the item.) # $highest is the most important item we've seen so far. my $priority = 10000000; @@ -585,8 +634,6 @@ sub CheckReserves { } } -#------------------------------------------------------------------------------------- - =item CancelReserve &CancelReserve($biblionumber, $itemnumber, $borrowernumber); @@ -605,7 +652,6 @@ priorities of the other people who are waiting on the book. =cut -#' sub CancelReserve { my ( $biblio, $item, $borr ) = @_; my $dbh = C4::Context->dbh; @@ -657,15 +703,54 @@ sub CancelReserve { $sth->finish; # now fix the priority on the others.... - FixPriority( $priority, $biblio ); + _FixPriority( $priority, $biblio ); } } -#------------------------------------------------------------------------------------- +=item ModReserve + +&ModReserve($rank,$biblio,$borrower,$branch) + +=cut + +sub ModReserve { + #subroutine to update a reserve + my ( $rank, $biblio, $borrower, $branch , $itemnumber) = @_; + return if $rank eq "W"; + return if $rank eq "n"; + my $dbh = C4::Context->dbh; + if ( $rank eq "del" ) { + my $query = qq/ + UPDATE reserves + SET cancellationdate=now() + WHERE biblionumber = ? + AND borrowernumber = ? + AND cancellationdate is NULL + AND (found <> 'F' or found is NULL) + /; + my $sth = $dbh->prepare($query); + $sth->execute( $biblio, $borrower ); + $sth->finish; + + } + else { + my $query = qq/ + UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL + WHERE biblionumber = ? + AND borrowernumber = ? + AND cancellationdate is NULL + AND (found <> 'F' or found is NULL) + /; + my $sth = $dbh->prepare($query); + $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower); + $sth->finish; + _FixPriority( $biblio, $borrower, $rank); + } +} -=item FillReserve +=item ModReserveFill - &FillReserve($reserve); + &ModReserveFill($reserve); Fill a reserve. If I understand this correctly, this means that the reserved book has been found and given to the patron who reserved it. @@ -675,13 +760,12 @@ whose keys are fields from the reserves table in the Koha database. =cut -#' -sub FillReserve { +sub ModReserveFill { my ($res) = @_; my $dbh = C4::Context->dbh; # fill in a reserve record.... - my $qbiblio = $res->{'biblionumber'}; - my $borr = $res->{'borrowernumber'}; + my $biblionumber = $res->{'biblionumber'}; + my $borrowernumber = $res->{'borrowernumber'}; my $resdate = $res->{'reservedate'}; # get the priority on this record.... @@ -692,7 +776,7 @@ sub FillReserve { AND borrowernumber = ? AND reservedate = ?"; my $sth = $dbh->prepare($query); - $sth->execute( $qbiblio, $borr, $resdate ); + $sth->execute( $biblionumber, $borrowernumber, $resdate ); ($priority) = $sth->fetchrow_array; $sth->finish; @@ -705,212 +789,258 @@ sub FillReserve { AND borrowernumber = ? "; $sth = $dbh->prepare($query); - $sth->execute( $qbiblio, $resdate, $borr ); + $sth->execute( $biblionumber, $resdate, $borrowernumber ); $sth->finish; # now fix the priority on the others (if the priority wasn't # already sorted!).... unless ( $priority == 0 ) { - FixPriority( $priority, $qbiblio ); + _FixPriority( $priority, $biblionumber ); } } -#------------------------------------------------------------------------------------- +=item ModReserveStatus -=item FixPriority +&ModReserveStatus($itemnumber, $newstatus); -&FixPriority($biblio,$borrowernumber,$rank); +Update the reserve status for the active (priority=0) reserve. - Only used internally (so don't export it) - Changed how this functions works # - Now just gets an array of reserves in the rank order and updates them with - the array index (+1 as array starts from 0) - and if $rank is supplied will splice item from the array and splice it back in again - in new priority rank +$itemnumber is the itemnumber the reserve is on -=cut +$newstatus is the new status. -sub FixPriority { - my ( $biblio, $borrowernumber, $rank ) = @_; - my $dbh = C4::Context->dbh; - if ( $rank eq "del" ) { - CancelReserve( $biblio, undef, $borrowernumber ); - } - if ( $rank eq "W" || $rank eq "0" ) { +=cut - # make sure priority for waiting items is 0 - my $query = qq/ - UPDATE reserves - SET priority = 0 - WHERE biblionumber = ? - AND borrowernumber = ? - AND cancellationdate IS NULL - AND found ='W' - /; - my $sth = $dbh->prepare($query); - $sth->execute( $biblio, $borrowernumber ); - } - my @priority; - my @reservedates; +sub ModReserveStatus { - # get whats left -# FIXME adding a new security in returned elements for changing priority, -# now, we don't care anymore any reservations with itemnumber linked (suppose a waiting reserve) - my $query = qq/ - SELECT borrowernumber, reservedate, constrainttype - FROM reserves - WHERE biblionumber = ? - AND cancellationdate IS NULL - AND itemnumber IS NULL - AND ((found <> 'F' and found <> 'W') or found is NULL) - ORDER BY priority ASC - /; - my $sth = $dbh->prepare($query); - $sth->execute($biblio); - while ( my $line = $sth->fetchrow_hashref ) { - push( @reservedates, $line ); - push( @priority, $line ); - } - - # To find the matching index - my $i; - my $key = -1; # to allow for 0 to be a valid result - for ( $i = 0 ; $i < @priority ; $i++ ) { - if ( $borrowernumber == $priority[$i]->{'borrowernumber'} ) { - $key = $i; # save the index - last; - } - } - - # if index exists in array then move it to new position - if ( $key > -1 && $rank ne 'del' && $rank > 0 ) { - my $new_rank = $rank - - 1; # $new_rank is what you want the new index to be in the array - my $moving_item = splice( @priority, $key, 1 ); - splice( @priority, $new_rank, 0, $moving_item ); - } - - # now fix the priority on those that are left.... - $query = " - UPDATE reserves - SET priority = ? - WHERE biblionumber = ? - AND borrowernumber = ? - AND reservedate = ? - AND found IS NULL + #first : check if we have a reservation for this item . + my ($itemnumber, $newstatus) = @_; + my $dbh = C4::Context->dbh; + my $query = " UPDATE reserves + SET found=?,waitingdate = now() + WHERE itemnumber=? + AND found IS NULL + AND priority = 0 "; - $sth = $dbh->prepare($query); - for ( my $j = 0 ; $j < @priority ; $j++ ) { - $sth->execute( - $j + 1, $biblio, - $priority[$j]->{'borrowernumber'}, - $priority[$j]->{'reservedate'} - ); - $sth->finish; - } + my $sth_set = $dbh->prepare($query); + $sth_set->execute( $newstatus, $itemnumber ); + $sth_set->finish; } -#------------------------------------------------------------------------------------- +=item ModReserveAffect -=item ReserveWaiting +&ModReserveAffect($itemnumber,$borrowernumber,$diffBranchSend); -branchcode = &ReserveWaiting($item,$borr); -this function set FOUND to 'W' for Waiting into the database. +This function affect an item and a status for a given reserve +The itemnumber parameter is used to find the biblionumber. +with the biblionumber & the borrowernumber, we can affect the itemnumber +to the correct reserve. +if $transferToDo is set, then the status is set to "Waiting" as well. +otherwise, a transfer is on the way, and the end of the transfer will +take care of the waiting status =cut -sub ReserveWaiting { - my ( $item, $borr,$diffBranchSend ) = @_; +sub ModReserveAffect { + my ( $itemnumber, $borrowernumber,$transferToDo ) = @_; my $dbh = C4::Context->dbh; - # get priority and biblionumber.... - my $query = qq/ - SELECT reserves.priority as priority, - reserves.biblionumber as biblionumber, - reserves.branchcode as branchcode, - reserves.timestamp as timestamp - FROM reserves,items - WHERE reserves.biblionumber = items.biblionumber - AND items.itemnumber = ? - AND reserves.borrowernumber = ? - AND reserves.cancellationdate IS NULL - AND (reserves.found <> 'F' OR reserves.found IS NULL) - /; - my $sth = $dbh->prepare($query); - $sth->execute( $item, $borr ); - my $data = $sth->fetchrow_hashref; - $sth->finish; - my $biblio = $data->{'biblionumber'}; - my $timestamp = $data->{'timestamp'}; - - # update reserves record.... - if ($diffBranchSend) { + # we want to attach $itemnumber to $borrowernumber, find the biblionumber + # attached to $itemnumber + my $sth = $dbh->prepare("SELECT biblionumber FROM items WHERE itemnumber=?"); + $sth->execute($itemnumber); + my ($biblionumber) = $sth->fetchrow; + # If we affect a reserve that has to be transfered, don't set to Waiting + my $query; + if ($transferToDo) { $query = " UPDATE reserves SET priority = 0, itemnumber = ? WHERE borrowernumber = ? AND biblionumber = ? - AND timestamp = ? + AND reserves.cancellationdate IS NULL + AND (reserves.found <> 'F' OR reserves.found IS NULL) "; } else { + # affect the reserve to Waiting as well. $query = " UPDATE reserves - SET priority = 0, - found = 'W', - waitingdate=now(), - itemnumber = ? + SET priority = 0, + found = 'W', + waitingdate=now(), + itemnumber = ? WHERE borrowernumber = ? AND biblionumber = ? - AND timestamp = ? + AND reserves.cancellationdate IS NULL + AND (reserves.found <> 'F' OR reserves.found IS NULL) "; } $sth = $dbh->prepare($query); - $sth->execute( $item, $borr, $biblio, $timestamp ); + $sth->execute( $itemnumber, $borrowernumber,$biblionumber); $sth->finish; # now fix up the remaining priorities.... - FixPriority( $data->{'priority'}, $biblio ); - my $branchcode = $data->{'branchcode'}; - return $branchcode; +# _FixPriority( $data->{'priority'}, $biblio ); # can't work, 1st parameter should be $biblionumbern NOT priority. FIXME : remove this line if no problem seen once it is commented. + return; } -#------------------------------------------------------------------------------------- +=item ModReserveCancelAll + +($messages,$nextreservinfo) = &ModReserveCancelAll($itemnumber,$borrowernumber); + + function to cancel reserv,check other reserves, and transfer document if it's necessary + +=cut -=item GetWaitingReserves +sub ModReserveCancelAll { + 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 ) = GetOtherReserves($itemnumber); -\@itemswaiting=GetWaitingReserves($borr); + return ( $messages, $nextreservinfo ); +} + +=item ModReserveMinusPriority + +&ModReserveMinusPriority($itemnumber,$borrowernumber,$biblionumber) -this funtion fetch the list of waiting reserves from database. +Reduce the values of queuded list =cut -sub GetWaitingReserves { - my ($borr) = @_; - my $dbh = C4::Context->dbh; - my @itemswaiting; +sub ModReserveMinusPriority { + my ( $itemnumber, $borrowernumber, $biblionumber ) = @_; + + #first step update the value of the first person on reserv + my $dbh = C4::Context->dbh; my $query = " - SELECT * - FROM reserves - WHERE borrowernumber = ? - AND reserves.found = 'W' - AND cancellationdate IS NULL + 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 = " + UPDATE reserves + SET priority = priority-1 + WHERE biblionumber = ? + AND priority > 0 + AND cancellationdate IS NULL "; + my $sth_upd = $dbh->prepare($query); + $sth_upd->execute( $biblionumber ); + $sth_upd->finish; + $sth_upd->finish; +} + +=item _FixPriority + +&_FixPriority($biblio,$borrowernumber,$rank); + + Only used internally (so don't export it) + Changed how this functions works # + Now just gets an array of reserves in the rank order and updates them with + the array index (+1 as array starts from 0) + and if $rank is supplied will splice item from the array and splice it back in again + in new priority rank + +=cut + +sub _FixPriority { + my ( $biblio, $borrowernumber, $rank ) = @_; + my $dbh = C4::Context->dbh; + if ( $rank eq "del" ) { + CancelReserve( $biblio, undef, $borrowernumber ); + } + if ( $rank eq "W" || $rank eq "0" ) { + + # make sure priority for waiting items is 0 + my $query = qq/ + UPDATE reserves + SET priority = 0 + WHERE biblionumber = ? + AND borrowernumber = ? + AND cancellationdate IS NULL + AND found ='W' + /; + my $sth = $dbh->prepare($query); + $sth->execute( $biblio, $borrowernumber ); + } + my @priority; + my @reservedates; + + # get whats left +# FIXME adding a new security in returned elements for changing priority, +# now, we don't care anymore any reservations with itemnumber linked (suppose a waiting reserve) + my $query = qq/ + SELECT borrowernumber, reservedate, constrainttype + FROM reserves + WHERE biblionumber = ? + AND cancellationdate IS NULL + AND itemnumber IS NULL + AND ((found <> 'F' and found <> 'W') or found is NULL) + ORDER BY priority ASC + /; my $sth = $dbh->prepare($query); - $sth->execute($borr); - while ( my $data = $sth->fetchrow_hashref ) { - push( @itemswaiting, $data ); + $sth->execute($biblio); + while ( my $line = $sth->fetchrow_hashref ) { + push( @reservedates, $line ); + push( @priority, $line ); } - $sth->finish; - return \@itemswaiting; -} -#------------------------------------------------------------------------------------- + # To find the matching index + my $i; + my $key = -1; # to allow for 0 to be a valid result + for ( $i = 0 ; $i < @priority ; $i++ ) { + if ( $borrowernumber == $priority[$i]->{'borrowernumber'} ) { + $key = $i; # save the index + last; + } + } + + # if index exists in array then move it to new position + if ( $key > -1 && $rank ne 'del' && $rank > 0 ) { + my $new_rank = $rank - + 1; # $new_rank is what you want the new index to be in the array + my $moving_item = splice( @priority, $key, 1 ); + splice( @priority, $new_rank, 0, $moving_item ); + } + + # now fix the priority on those that are left.... + $query = " + UPDATE reserves + SET priority = ? + WHERE biblionumber = ? + AND borrowernumber = ? + AND reservedate = ? + AND found IS NULL + "; + $sth = $dbh->prepare($query); + for ( my $j = 0 ; $j < @priority ; $j++ ) { + $sth->execute( + $j + 1, $biblio, + $priority[$j]->{'borrowernumber'}, + $priority[$j]->{'reservedate'} + ); + $sth->finish; + } +} -=item Findgroupreserve +=item _Findgroupreserve - @results = &Findgroupreserve($biblioitemnumber, $biblionumber); + @results = &_Findgroupreserve($biblioitemnumber, $biblionumber); ****** FIXME ****** I don't know what this does, because I don't understand how reserve @@ -919,15 +1049,14 @@ biblio, and the constraint allows you to restrict it to a given biblioitem (e.g., if you want to borrow the audio book edition of "The Prophet", rather than the first available publication). -C<&Findgroupreserve> returns : +C<&_Findgroupreserve> returns : C<@results> is an array of references-to-hash whose keys are mostly fields from the reserves table of the Koha database, plus C. =cut -#' -sub Findgroupreserve { +sub _Findgroupreserve { my ( $bibitem, $biblio ) = @_; my $dbh = C4::Context->dbh; my $query = qq/ @@ -962,486 +1091,14 @@ sub Findgroupreserve { return @results; } -=item CreateReserve +=item GetReserveFee -CreateReserve($branch,$borrowernumber,$biblionumber,$constraint,$bibitems,$priority,$notes,$title,$checkitem,$found) +$fee = GetReserveFee($borrowernumber,$biblionumber,$constraint,$biblionumber); -FIXME - A somewhat different version of this function appears in -C4::Reserves. Pick one and stick with it. +Calculate the fee for a reserve =cut -sub CreateReserve { - my ( - $branch, $borrowernumber, $biblionumber, - $constraint, $bibitems, $priority, $notes, - $title, $checkitem, $found - ) = @_; - my $fee; - if ( $library_name =~ /Horowhenua/ ) { - $fee = - CalcHLTReserveFee($borrowernumber, $biblionumber, $constraint, - $bibitems ); - } - else { - $fee = - CalcReserveFee($borrowernumber, $biblionumber, $constraint, - $bibitems ); - } - my $dbh = C4::Context->dbh; - my $const = lc substr( $constraint, 0, 1 ); - my @datearr = localtime(time); - my $resdate = - ( 1900 + $datearr[5] ) . "-" . ( $datearr[4] + 1 ) . "-" . $datearr[3]; - my $waitingdate; - - # If the reserv had the waiting status, we had the value of the resdate - if ( $found eq 'W' ) { - $waitingdate = $resdate; - } - - #eval { - # updates take place here - if ( $fee > 0 ) { - my $nextacctno = &getnextacctno( $borrowernumber ); - my $query = qq/ - INSERT INTO accountlines - (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding) - VALUES - (?,?,now(),?,?,'Res',?) - /; - my $usth = $dbh->prepare($query); - $usth->execute( $borrowernumber, $nextacctno, $fee, - "Reserve Charge - $title", $fee ); - $usth->finish; - } - - #if ($const eq 'a'){ - my $query = qq/ - INSERT INTO reserves - (borrowernumber,biblionumber,reservedate,branchcode,constrainttype, - priority,reservenotes,itemnumber,found,waitingdate) - VALUES - (?,?,?,?,?, - ?,?,?,?,?) - /; - my $sth = $dbh->prepare($query); - $sth->execute( - $borrowernumber, $biblionumber, $resdate, $branch, - $const, $priority, $notes, $checkitem, - $found, $waitingdate - ); - $sth->finish; - - #} - if ( ( $const eq "o" ) || ( $const eq "e" ) ) { - my $numitems = @$bibitems; - my $i = 0; - while ( $i < $numitems ) { - my $biblioitem = @$bibitems[$i]; - my $query = qq/ - INSERT INTO reserveconstraints - (borrowernumber,biblionumber,reservedate,biblioitemnumber) - VALUES - (?,?,?,?) - /; - my $sth = $dbh->prepare(""); - $sth->execute( $borrowernumber, $biblionumber, $resdate, - $biblioitem ); - $sth->finish; - $i++; - } - } - return; -} - -# FIXME - A functionally identical version of this function appears in -# C4::Reserves. Pick one and stick with it. -# XXX - Internal use only -# FIXME - opac-reserves.pl need to use it, temporarily put into @EXPORT - -sub CalcReserveFee { - my ($borrowernumber, $biblionumber, $constraint, $bibitems ) = @_; - - #check for issues; - my $dbh = C4::Context->dbh; - my $const = lc substr( $constraint, 0, 1 ); - my $query = qq/ - SELECT * FROM borrowers,categories - WHERE borrowernumber = ? - AND borrowers.categorycode = categories.categorycode - /; - my $sth = $dbh->prepare($query); - $sth->execute($borrowernumber); - my $data = $sth->fetchrow_hashref; - $sth->finish(); - my $fee = $data->{'reservefee'}; - my $cntitems = @- > $bibitems; - - if ( $fee > 0 ) { - - # check for items on issue - # first find biblioitem records - my @biblioitems; - my $sth1 = $dbh->prepare( - "SELECT * FROM biblio,biblioitems - WHERE (biblio.biblionumber = ?) - AND (biblio.biblionumber = biblioitems.biblionumber)" - ); - $sth1->execute($biblionumber); - while ( my $data1 = $sth1->fetchrow_hashref ) { - if ( $const eq "a" ) { - push @biblioitems, $data1; - } - else { - my $found = 0; - my $x = 0; - while ( $x < $cntitems ) { - if ( @$bibitems->{'biblioitemnumber'} == - $data->{'biblioitemnumber'} ) - { - $found = 1; - } - $x++; - } - if ( $const eq 'o' ) { - if ( $found == 1 ) { - push @biblioitems, $data1; - } - } - else { - if ( $found == 0 ) { - push @biblioitems, $data1; - } - } - } - } - $sth1->finish; - my $cntitemsfound = @biblioitems; - my $issues = 0; - my $x = 0; - my $allissued = 1; - while ( $x < $cntitemsfound ) { - my $bitdata = $biblioitems[$x]; - my $sth2 = $dbh->prepare( - "SELECT * FROM items - WHERE biblioitemnumber = ?" - ); - $sth2->execute( $bitdata->{'biblioitemnumber'} ); - while ( my $itdata = $sth2->fetchrow_hashref ) { - my $sth3 = $dbh->prepare( - "SELECT * FROM issues - WHERE itemnumber = ? - AND returndate IS NULL" - ); - $sth3->execute( $itdata->{'itemnumber'} ); - if ( my $isdata = $sth3->fetchrow_hashref ) { - } - else { - $allissued = 0; - } - } - $x++; - } - if ( $allissued == 0 ) { - my $rsth = - $dbh->prepare("SELECT * FROM reserves WHERE biblionumber = ?"); - $rsth->execute($biblionumber); - if ( my $rdata = $rsth->fetchrow_hashref ) { - } - else { - $fee = 0; - } - } - } - - # print "fee $fee"; - return $fee; -} - -# The following are junior and young adult item types that should not incur a -# reserve charge. -# -# Juniors: BJC, BJCN, BJF, BJK, BJM, BJN, BJP, BJSF, BJSN, DJ, DJP, FJ, JVID, -# VJ, VJP, PJ, TJ, TJP, VJ, VJP. -# -# Young adults: BYF, BYN, BYP, DY, DYP, PY, PYP, TY, TYP, VY, VYP. -# -# All other item types should incur a reserve charge. -sub CalcHLTReserveFee { - my ($borrowernumber, $biblionumber, $constraint, $bibitems ) = @_; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( - "SELECT * FROM borrowers,categories - WHERE (borrowernumber = ?) - AND (borrowers.categorycode = categories.categorycode)" - ); - $sth->execute($borrowernumber); - my $data = $sth->fetchrow_hashref; - $sth->finish(); - my $fee = $data->{'reservefee'}; - - my $matchno; - my @nocharge = - qw/BJC BJCN BJF BJK BJM BJN BJP BJSF BJSN DJ DJP FJ NJ CJ VJ VJP PJ TJ TJP BYF BYN BYP DY DYP PY PYP TY TYP VY VYP/; - $sth = $dbh->prepare( - "SELECT * FROM biblio,biblioitems - WHERE (biblio.biblionumber = ?) - AND (biblio.biblionumber = biblioitems.biblionumber)" - ); - $sth->execute($biblionumber); - $data = $sth->fetchrow_hashref; - my $itemtype = $data->{'itemtype'}; - for ( my $i = 0 ; $i < @nocharge ; $i++ ) { - if ( $itemtype eq $nocharge[$i] ) { - $matchno++; - last; - } - } - - if ( $matchno > 0 ) { - $fee = 0; - } - return $fee; -} - -=item GetNextAccountNumber - -GetNextAccountNumber() - -=cut - -sub GetNextAccountNumber { - my ($borrowernumber, $dbh ) = @_; - my $nextaccntno = 1; - my $sth = $dbh->prepare( - "select * from accountlines - where (borrowernumber = ?) - order by accountno desc" - ); - $sth->execute($borrowernumber); - if ( my $accdata = $sth->fetchrow_hashref ) { - $nextaccntno = $accdata->{'accountno'} + 1; - } - $sth->finish; - return ($nextaccntno); -} - -#------------------------------------------------------------------------------------- - -=item UpdateReserve - -&UpdateReserve($rank,$biblio,$borrower,$branch) - -=cut - -sub UpdateReserve { - #subroutine to update a reserve - my ( $rank, $biblio, $borrower, $branch , $itemnumber) = @_; - return if $rank eq "W"; - return if $rank eq "n"; - my $dbh = C4::Context->dbh; - if ( $rank eq "del" ) { - my $query = qq/ - UPDATE reserves - SET cancellationdate=now() - WHERE biblionumber = ? - AND borrowernumber = ? - AND cancellationdate is NULL - AND (found <> 'F' or found is NULL) - /; - my $sth = $dbh->prepare($query); - $sth->execute( $biblio, $borrower ); - $sth->finish; - - } - else { - my $query = qq/ - UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL - WHERE biblionumber = ? - AND borrowernumber = ? - AND cancellationdate is NULL - AND (found <> 'F' or found is NULL) - /; - my $sth = $dbh->prepare($query); - $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower); - $sth->finish; - FixPriority( $biblio, $borrower, $rank); - } -} - -=item GetReserveTitle - -$data = GetReserveTitle($biblio,$bor,$date,$timestamp); - -=cut - -sub GetReserveTitle { - my ( $biblio, $bor, $date, $timestamp ) = @_; - my $dbh = C4::Context->dbh; - my $query = qq/ - SELECT * - FROM reserveconstraints,biblioitems - WHERE reserveconstraints.biblioitemnumber=biblioitems.biblioitemnumber - AND reserveconstraints.biblionumber=? - AND reserveconstraints.borrowernumber = ? - AND reserveconstraints.reservedate=? - AND reserveconstraints.timestamp=? - /; - my $sth = $dbh->prepare($query); - $sth->execute( $biblio, $bor, $date, $timestamp ); - my $data = $sth->fetchrow_hashref; - $sth->finish; - return $data; -} - -=item FindReservesInQueue - - $results = &FindReservesInQueue($biblionumber); - -Simple variant of FindReserves, exept the result is now displaying only the queue list of reservations with the same biblionumber (At this time only displayed in request.pl) - -C<&FindReservesInQueue> returns a two-element array: - -C<$results> is a reference to an array of references of hashes. Each hash -has for keys a list of column from reserves table (see details in function). - -=cut - -#' - -sub FindReservesInQueue { - my ($biblionumber) = @_; - my $dbh = C4::Context->dbh; - - # Find the desired items in the reserves - my $query = qq/ - SELECT branchcode, - timestamp AS rtimestamp, - priority, - biblionumber, - borrowernumber, - reservedate, - constrainttype, - found, - itemnumber - FROM reserves - WHERE cancellationdate IS NULL - AND biblionumber = ? - AND (found <> \'F\' OR found IS NULL) - AND priority <> \'0\' - ORDER BY priority - /; - my $sth = $dbh->prepare($query); - $sth->execute($biblionumber); - my @results; - my $i = 0; - while ( my $data = $sth->fetchrow_hashref ) { - - # FIXME - What is this if-statement doing? How do constraints work? - if ( $data->{constrainttype} eq 'o' ) { - $query = ' - SELECT biblioitemnumber - FROM reserveconstraints - WHERE biblionumber = ? - AND borrowernumber = ? - AND reservedate = ? - '; - my $csth = $dbh->prepare($query); - $csth->execute( $data->{biblionumber}, $data->{borrowernumber}, - $data->{reservedate}, ); - - my @bibitemno; - while ( my $bibitemnos = $csth->fetchrow_array ) { - push( @bibitemno, $bibitemnos ); - } - my $count = @bibitemno; - - # if we have two or more different specific itemtypes - # reserved by same person on same day - my $bdata; - if ( $count > 1 ) { - $bdata = GetBiblioItemData( $bibitemno[$i] ); - $i++; - } - else { - # Look up the book we just found. - $bdata = GetBiblioItemData( $bibitemno[0] ); - } - $csth->finish; - - # Add the results of this latest search to the current - # results. - # FIXME - An 'each' would probably be more efficient. - foreach my $key ( keys %$bdata ) { - $data->{$key} = $bdata->{$key}; - } - } - push @results, $data; - } - $sth->finish; - - return ( $#results + 1, \@results ); -} - - -=head2 GetReservesToBranch - -@transreserv = GetReservesToBranch( $frombranch ); - -Get reserve list for a given branch - -=cut - -sub GetReservesToBranch { - my ( $frombranch ) = @_; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( - "SELECT borrowernumber,reservedate,itemnumber,timestamp - FROM reserves - WHERE priority='0' AND cancellationdate is null - AND branchcode=? - AND found IS NULL " - ); - $sth->execute( $frombranch ); - my @transreserv; - my $i = 0; - while ( my $data = $sth->fetchrow_hashref ) { - $transreserv[$i] = $data; - $i++; - } - $sth->finish; - return (@transreserv); -} - -=head2 GetReservesForBranch - -@transreserv = GetReservesForBranch($frombranch); - -=cut - -sub GetReservesForBranch { - my ($frombranch) = @_; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( " - SELECT borrowernumber,reservedate,itemnumber,waitingdate - FROM reserves - WHERE priority='0' - AND cancellationdate IS NULL - AND found='W' - AND branchcode=? - ORDER BY waitingdate" ); - $sth->execute($frombranch); - my @transreserv; - my $i = 0; - while ( my $data = $sth->fetchrow_hashref ) { - $transreserv[$i] = $data; - $i++; - } - $sth->finish; - return (@transreserv); -} - =back =head1 AUTHOR diff --git a/circ/branchtransfers.pl b/circ/branchtransfers.pl index 70184dc9f9..76b1d14e6a 100755 --- a/circ/branchtransfers.pl +++ b/circ/branchtransfers.pl @@ -78,7 +78,7 @@ if ( $request eq "KillWaiting" ) { my $ignoreRs = 0; if ( $request eq "SetWaiting" ) { my $item = $query->param('itemnumber'); - $tobranchcd = ReserveWaiting( $item, $borrowernumber ); + ModReserveAffect( $item, $borrowernumber ); $ignoreRs = 1; $setwaiting = 1; $reqmessage = 1; diff --git a/circ/circulation.pl b/circ/circulation.pl index 5782ae5e17..4277ae1068 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -266,7 +266,7 @@ if ($borrowernumber) { # new op dev # now we show the status of the borrower's reservations - my @borrowerreserv = GetReservations( 0, $borrowernumber ); + my @borrowerreserv = GetReservesFromBorrowernumber$borrowernumber ); my @reservloop; my @WaitingReserveLoop; diff --git a/circ/returns.pl b/circ/returns.pl index ba57d832cc..1c8cfa4738 100755 --- a/circ/returns.pl +++ b/circ/returns.pl @@ -113,7 +113,7 @@ if ( $query->param('resbarcode') ) { my $iteminfo = GetBiblioFromItemNumber($item); my $diffBranchSend; -# addin in ReserveWaiting the possibility to check if the document is expected in this library or not, +# addin in ModReserveAffect the possibility to check if the document is expected in this library or not, # if not we send a value in reserve waiting for not implementting waiting status if ($diffBranchReturned) { $diffBranchSend = $diffBranchReturned; @@ -122,9 +122,9 @@ if ( $query->param('resbarcode') ) { $diffBranchSend = undef; } - my $tobranchcd = ReserveWaiting( $item, $borrowernumber,$diffBranchSend); + ModReserveAffect( $item, $borrowernumber,$diffBranchSend); # check if we have other reservs for this document, if we have a return send the message of transfer - my ( $messages, $nextreservinfo ) = OtherReserves($item); + my ( $messages, $nextreservinfo ) = GetOtherReserves($item); my $branchname = GetBranchName( $messages->{'transfert'} ); my ($borr) = GetMemberDetails( $nextreservinfo, 0 ); diff --git a/circ/transferstoreceive.pl b/circ/transferstoreceive.pl index 5ec5dac3f8..547321e86a 100644 --- a/circ/transferstoreceive.pl +++ b/circ/transferstoreceive.pl @@ -106,7 +106,7 @@ foreach my $br ( keys %$branches ) { $getransf{'itemcallnumber'} = $gettitle->{'itemcallnumber'}; # we check if we have a reserv for this transfer - my @checkreserv = GetReservations( $num->{'itemnumber'} ); + my @checkreserv = GetReservesFromItemnumber($num->{'itemnumber'} ); if ( $checkreserv[0] ) { my $getborrower = GetMemberDetails( $checkreserv[1] ); diff --git a/circ/waitingreserves.pl b/circ/waitingreserves.pl index 5c85937628..509a6f5f2b 100755 --- a/circ/waitingreserves.pl +++ b/circ/waitingreserves.pl @@ -74,7 +74,7 @@ if ($item) { my $messages; my $nextreservinfo; my $waiting; - ( $messages, $nextreservinfo ) = GlobalCancel( $item, $borrowernumber ); + ( $messages, $nextreservinfo ) = ModReserveCancelAll( $item, $borrowernumber ); # if we have a result if ($nextreservinfo) { diff --git a/members/moremember.pl b/members/moremember.pl index 662ab65e2e..0fa672a2cc 100755 --- a/members/moremember.pl +++ b/members/moremember.pl @@ -242,24 +242,6 @@ for ( my $i = 0 ; $i < $count ; $i++ ) { push( @issuedata, \%row ); } -# -# find reserves -# -# my ($rescount,$reserves)=FindReserves('',$borrowernumber); #From C4::Reserves -# my @reservedata; -# $toggle = 0; -# foreach my $reserveline (@$reserves) { -# $reserveline->{'reservedate2'} = format_date($reserveline->{'reservedate'}); -# my $restitle; -# my %row = %$reserveline; -# $row{toggle} = $toggle++%2; -# if ($reserveline->{'constrainttype'} eq 'o'){ -# $restitle=GetReserveTitle($reserveline->{'biblionumber'},$reserveline->{'borrowernumber'},$reserveline->{'reservedate'},$reserveline->{'rtimestamp'}); -# %row = (%row , %$restitle) if $restitle; -# } -# push (@reservedata, \%row); -# } - ################################################################################## # BUILD HTML # show all reserves of this borrower, and the position of the reservation .... @@ -267,7 +249,7 @@ if ($borrowernumber) { # new op dev # now we show the status of the borrower's reservations - my @borrowerreserv = GetReservations( 0, $borrowernumber ); + my @borrowerreserv = GetReservesFromBorrowernumber($borrowernumber ); my @reservloop; foreach my $num_res (@borrowerreserv) { my %getreserv; diff --git a/opac/opac-reserve.pl b/opac/opac-reserve.pl index bb79c53c2b..3f5d9d7e0d 100755 --- a/opac/opac-reserve.pl +++ b/opac/opac-reserve.pl @@ -53,7 +53,7 @@ $template->param($bibdata); $template->param( biblionumber => $biblionumber ); # get the rank number.... -my ( $rank, $reserves ) = FindReserves( $biblionumber, '' ); +my ( $rank, $reserves ) = GetReservesFromBiblionumber( $biblionumber); $template->param( reservecount => $rank ); foreach my $res (@$reserves) { @@ -147,8 +147,7 @@ foreach my $itm (@items) { if defined $itm->{'date_due'}; $itm->{ $itm->{'publictype'} } = 1; - # FIXME CalcReserveFee is supposed to be internal-use-only - my $fee = CalcReserveFee( undef, $borrowernumber, $itm->{'biblionumber'}, + my $fee = GetReserveFee( undef, $borrowernumber, $itm->{'biblionumber'}, 'a', ( $itm->{'biblioitemnumber'} ) ); $fee = sprintf "%.02f", $fee; $itm->{'reservefee'} = $fee; @@ -216,7 +215,7 @@ if ( $query->param('item_types_selected') ) { } } $fee += - CalcReserveFee( undef, $borrowernumber, $biblionumber, 'o', + GetReserveFee( undef, $borrowernumber, $biblionumber, 'o', \@reqbibs ); } $proceed = 1; @@ -254,11 +253,11 @@ elsif ( $query->param('place_reserve') ) { push @reqbibs, $item->{'biblioitemnumber'}; } } - CreateReserve( undef, $branch, $borrowernumber, $biblionumber, 'o', + AddReserve( $branch, $borrowernumber, $biblionumber, 'o', \@reqbibs, $rank, '', $title ); } if ( $query->param('all') ) { - CreateReserve( undef, $branch, $borrowernumber, $biblionumber, 'a', + AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, $rank, '', $title ); } print $query->redirect("/cgi-bin/koha/opac-user.pl"); @@ -296,7 +295,7 @@ else { debarred => 1 ); } - my ( $resnum, $reserves ) = FindReserves( '', $borrowernumber ); + my ( $resnum, $reserves ) = GetReservesFromBorrowernumber( $borrowernumber ); $template->param( RESERVES => $reserves ); if ( $resnum >= $MAXIMUM_NUMBER_OF_RESERVES ) { $template->param( message => 1 ); diff --git a/opac/opac-user.pl b/opac/opac-user.pl index fe9bb4a370..225b075529 100755 --- a/opac/opac-user.pl +++ b/opac/opac-user.pl @@ -141,7 +141,7 @@ $template->param( overdues_count => $overdues_count ); my $branches = GetBranches(); # now the reserved items.... -my ( $rcount, $reserves ) = FindReserves( undef, $borrowernumber ); +my ( $rcount, $reserves ) = GetReservesFromBorrowernumber( $borrowernumber ); foreach my $res (@$reserves) { $res->{'reservedate'} = format_date( $res->{'reservedate'} ); my $publictype = $res->{'publictype'}; diff --git a/reserve/modrequest.pl b/reserve/modrequest.pl index c2aa3ffc96..6c2aa4bd82 100755 --- a/reserve/modrequest.pl +++ b/reserve/modrequest.pl @@ -43,16 +43,16 @@ my $CancelItemnumber=$input->param('CancelItemnumber'); # 2 possibilitys : cancel an item reservation, or modify or cancel the queded list -# 1) cancel an item reservation by fonction GlobalCancel (in reserves.pm) +# 1) cancel an item reservation by fonction ModReserveCancelAll (in reserves.pm) if ($CancelBorrowerNumber) { - GlobalCancel($CancelItemnumber, $CancelBorrowerNumber); + ModReserveCancelAll($CancelItemnumber, $CancelBorrowerNumber); $biblionumber[0] = $CancelBiblioNumber, } # 2) Cancel or modify the queue list of reserves (without item linked) else { for (my $i=0;$i<$count;$i++){ - UpdateReserve($rank[$i],$biblionumber[$i],$borrower[$i],$branch[$i],$itemnumber[$i]); #from C4::Reserves + ModReserve($rank[$i],$biblionumber[$i],$borrower[$i],$branch[$i],$itemnumber[$i]); #from C4::Reserves } } my $from=$input->param('from'); diff --git a/reserve/placerequest.pl b/reserve/placerequest.pl index 932ff671dc..cb1c5aaaf9 100755 --- a/reserve/placerequest.pl +++ b/reserve/placerequest.pl @@ -75,12 +75,12 @@ if ($type eq 'str8' && $borrowernumber ne ''){ my $const; if ($input->param('request') eq 'any'){ $const='a'; - CreateReserve($branch,$borrowernumber->{'borrowernumber'},$biblionumber,$const,\@realbi,$rank[0],$notes,$title,$checkitem,$found); + AddReserve($branch,$borrowernumber->{'borrowernumber'},$biblionumber,$const,\@realbi,$rank[0],$notes,$title,$checkitem,$found); } elsif ($reqbib[0] ne ''){ $const='o'; - CreateReserve($branch,$borrowernumber->{'borrowernumber'},$biblionumber,$const,\@reqbib,$rank[0],$notes,$title,$checkitem, $found); + AddReserve($branch,$borrowernumber->{'borrowernumber'},$biblionumber,$const,\@reqbib,$rank[0],$notes,$title,$checkitem, $found); } else { - CreateReserve($branch,$borrowernumber->{'borrowernumber'},$biblionumber,'a',\@realbi,$rank[0],$notes,$title,$checkitem, $found); + AddReserve($branch,$borrowernumber->{'borrowernumber'},$biblionumber,'a',\@realbi,$rank[0],$notes,$title,$checkitem, $found); } print $input->redirect("request.pl?biblionumber=$biblionumber"); diff --git a/reserve/request.pl b/reserve/request.pl index f4615193e8..b9c08afa3b 100755 --- a/reserve/request.pl +++ b/reserve/request.pl @@ -97,7 +97,7 @@ if ($cardnumber) { # FIXME At this time we have a simple count of reservs, but, later, we could improve the infos "title" ... my $number_reserves = - CountReservesFromBorrower( $borrowerinfo->{'borrowernumber'} ); + GetReserveCount( $borrowerinfo->{'borrowernumber'} ); if ( $number_reserves > C4::Context->preference('maxreserves') ) { $maxreserves = 1; @@ -160,7 +160,7 @@ if ($borrowerslist) { } # get existing reserves ..... -my ( $count, $reserves ) = FindReserves($biblionumber); +my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber); my $totalcount = $count; my $alreadyreserved; @@ -259,7 +259,7 @@ foreach my $biblioitemnumber (@biblioitemnumbers) { } # checking reserve - my ($reservedate,$reservedfor,$expectedAt) = GetFirstReserveDateFromItem($itemnumber); + my ($reservedate,$reservedfor,$expectedAt) = GetReservesFromItemnumber($itemnumber); my $ItemBorrowerReserveInfo = GetMemberDetails( $reservedfor, 0); if ( defined $reservedate ) { @@ -326,7 +326,7 @@ foreach my $biblioitemnumber (@biblioitemnumbers) { # existingreserves building my @reserveloop; my $branches = GetBranches(); -my ( $count, $reserves ) = FindReservesInQueue($biblionumber); +my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber); foreach my $res ( sort { $a->{found} cmp $b->{found} } @$reserves ) { my %reserve; my @optionloop; @@ -350,7 +350,7 @@ foreach my $res ( sort { $a->{found} cmp $b->{found} } @$reserves ) { if ( ( $res->{'found'} eq 'W' ) or ( $res->{'priority'} eq '0' ) ) { my $item = $res->{'itemnumber'}; - $item = getiteminformation($item,undef); + $item = GetBiblioFromItemNumber($item,undef); $reserve{'wait'}= 1; $reserve{'holdingbranch'}=$item->{'holdingbranch'}; $reserve{'biblionumber'}=$item->{'biblionumber'}; diff --git a/serials/routing-preview.pl b/serials/routing-preview.pl index 548b4facf1..06fa34cbad 100755 --- a/serials/routing-preview.pl +++ b/serials/routing-preview.pl @@ -47,7 +47,7 @@ if($ok){ my $biblio = $subs->{'biblionumber'}; # get existing reserves ..... - my ($count,$reserves) = FindReserves($biblio); + my ($count,$reserves) = GetReservesFromBiblionumber($biblio); my $totalcount = $count; foreach my $res (@$reserves) { if ($res->{'found'} eq 'W') { @@ -68,9 +68,9 @@ if($ok){ # warn "$routinglist[$i]->{'borrowernumber'} is the same as $data->{'borrowernumber'}"; if($routinglist[$i]->{'borrowernumber'} == $data->{'borrowernumber'}){ - UpdateReserve($routinglist[$i]->{'ranking'},$biblio,$routinglist[$i]->{'borrowernumber'},$branch); + ModReserve($routinglist[$i]->{'ranking'},$biblio,$routinglist[$i]->{'borrowernumber'},$branch); } else { - CreateReserve($branch,$routinglist[$i]->{'borrowernumber'},$biblio,$const,\@bibitems,$routinglist[$i]->{'ranking'},$notes,$title); + AddReserve($branch,$routinglist[$i]->{'borrowernumber'},$biblio,$const,\@bibitems,$routinglist[$i]->{'ranking'},$notes,$title); } }