X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FReserves.pm;h=df063700916d3d5c003b930b5e72b799f0a94498;hb=1c0401e867b85ddd5dd5ef211ab8c1ef5b63276f;hp=2a1a820660eddd07839954335b922faadd343bfa;hpb=6883d37fe75183fdf622c9087116749fa3b600d5;p=koha_fer diff --git a/C4/Reserves.pm b/C4/Reserves.pm old mode 100755 new mode 100644 index 2a1a820660..df06370091 --- a/C4/Reserves.pm +++ b/C4/Reserves.pm @@ -4,6 +4,8 @@ package C4::Reserves; # Copyright 2000-2002 Katipo Communications +# 2006 SAN Ouest Provence +# 2007 BibLibre Paul POULAIN # # This file is part of Koha. # @@ -20,20 +22,18 @@ package C4::Reserves; # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, # Suite 330, Boston, MA 02111-1307 USA -# $Id$ use strict; -require Exporter; use C4::Context; use C4::Biblio; +use C4::Items; use C4::Search; use C4::Circulation; +use C4::Accounts; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); -my $library_name = C4::Context->preference("LibraryName"); -# set the version for version checking -$VERSION = do { my @v = '$Revision$' =~ /\d+/g; shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); }; +my $library_name = C4::Context->preference("LibraryName"); =head1 NAME @@ -45,45 +45,73 @@ C4::Reserves - Koha functions for dealing with reservation. =head1 DESCRIPTION -this modules provides somes functions to deal with reservations. - + this modules provides somes functions to deal with reservations. + + Reserves are stored in reserves table. + The following columns contains important values : + - priority >0 : then the reserve is at 1st stage, and not yet affected to any item. + =0 : then the reserve is being dealed + - found : NULL : means the patron requested the 1st available, and we haven't choosen the item + W(aiting) : the reserve has an itemnumber affected, and is on the way + F(inished) : the reserve has been completed, and is done + - itemnumber : empty : the reserve is still unaffected to an item + filled: the reserve is attached to an item + The complete workflow is : + ==== 1st use case ==== + patron request a document, 1st available : P >0, F=NULL, I=NULL + a library having it run "transfertodo", and clic on the list + if there is no transfer to do, the reserve waiting + patron can pick it up P =0, F=W, I=filled + if there is a transfer to do, write in branchtransfer P =0, F=NULL, I=filled + The pickup library recieve the book, it check in P =0, F=W, I=filled + The patron borrow the book P =0, F=F, I=filled + + ==== 2nd use case ==== + patron requests a document, a given item, + If pickup is holding branch P =0, F=W, I=filled + If transfer needed, write in branchtransfer P =0, F=NULL, I=filled + The pickup library recieve the book, it checks it in P =0, F=W, I=filled + The patron borrow the book P =0, F=F, I=filled + =head1 FUNCTIONS =over 2 =cut -@ISA = qw(Exporter); - -@EXPORT = qw( - &AddReserve - - &GetReservesFromItemnumber - &GetReservesFromBiblionumber - &GetReservesFromBorrowernumber - GetReservesForBranch - GetReservesToBranch - &GetReserveCount - &GetReserveFee - GetReservesForBranch - GetReservesToBranch - &GetOtherReserves +BEGIN { + # set the version for version checking + $VERSION = 3.01; + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw( + &AddReserve - &ModReserveFill - &ModReserveAffect - &ModReserve - &ModReserveStatus - &ModReserveCancelAll - &ModReserveMinusPriority - - &CheckReserves - &CancelReserve -); - + &GetReservesFromItemnumber + &GetReservesFromBiblionumber + &GetReservesFromBorrowernumber + &GetReservesForBranch + &GetReservesToBranch + &GetReserveCount + &GetReserveFee + + &GetOtherReserves + + &ModReserveFill + &ModReserveAffect + &ModReserve + &ModReserveStatus + &ModReserveCancelAll + &ModReserveMinusPriority + + &CheckReserves + &CancelReserve + ); +} =item AddReserve -AddReserve($branch,$borrowernumber,$biblionumber,$constraint,$bibitems,$priority,$notes,$title,$checkitem,$found) + AddReserve($branch,$borrowernumber,$biblionumber,$constraint,$bibitems,$priority,$notes,$title,$checkitem,$found) =cut @@ -187,7 +215,8 @@ sub GetReservesFromBiblionumber { reservedate, constrainttype, found, - itemnumber + itemnumber, + reservenotes FROM reserves WHERE cancellationdate IS NULL AND (found <> \'F\' OR found IS NULL) @@ -245,6 +274,14 @@ sub GetReservesFromBiblionumber { return ( $#results + 1, \@results ); } +=item GetReservesFromItemnumber + + ( $reservedate, $borrowernumber, $branchcode ) = GetReservesFromItemnumber($itemnumber); + + TODO :: Description here + +=cut + sub GetReservesFromItemnumber { my ( $itemnumber ) = @_; my $dbh = C4::Context->dbh; @@ -261,6 +298,14 @@ sub GetReservesFromItemnumber { return ( $reservedate, $borrowernumber, $branchcode ); } +=item GetReservesFromBorrowernumber + + $borrowerreserv = GetReservesFromBorrowernumber($borrowernumber,$tatus); + + TODO :: Descritpion + +=cut + sub GetReservesFromBorrowernumber { my ( $borrowernumber, $status ) = @_; my $dbh = C4::Context->dbh; @@ -286,11 +331,8 @@ sub GetReservesFromBorrowernumber { "); $sth->execute($borrowernumber); } - my @borrowerreserv; - while ( my $data = $sth->fetchrow_hashref ) { - push @borrowerreserv, $data; - } - return \@borrowerreserv; + my $data = $sth->fetchall_arrayref({}); + return @$data; } #------------------------------------------------------------------------------------- @@ -372,6 +414,14 @@ sub GetOtherReserves { return ( $messages, $nextreservinfo ); } +=item GetReserveFee + +$fee = GetReserveFee($borrowernumber,$biblionumber,$constraint,$biblionumber); + +Calculate the fee for a reserve + +=cut + sub GetReserveFee { my ($borrowernumber, $biblionumber, $constraint, $bibitems ) = @_; @@ -379,9 +429,9 @@ sub GetReserveFee { my $dbh = C4::Context->dbh; my $const = lc substr( $constraint, 0, 1 ); my $query = qq/ - SELECT * FROM borrowers,categories + SELECT * FROM borrowers + LEFT JOIN categories ON borrowers.categorycode = categories.categorycode WHERE borrowernumber = ? - AND borrowers.categorycode = categories.categorycode /; my $sth = $dbh->prepare($query); $sth->execute($borrowernumber); @@ -396,9 +446,8 @@ sub GetReserveFee { # first find biblioitem records my @biblioitems; my $sth1 = $dbh->prepare( - "SELECT * FROM biblio,biblioitems - WHERE (biblio.biblionumber = ?) - AND (biblio.biblionumber = biblioitems.biblionumber)" + "SELECT * FROM biblio LEFT JOIN biblioitems on biblio.biblionumber = biblioitems.biblionumber + WHERE (biblio.biblionumber = ?)" ); $sth1->execute($biblionumber); while ( my $data1 = $sth1->fetchrow_hashref ) { @@ -466,12 +515,10 @@ sub GetReserveFee { } } } - - # print "fee $fee"; return $fee; } -=head2 GetReservesToBranch +=item GetReservesToBranch @transreserv = GetReservesToBranch( $frombranch ); @@ -500,7 +547,7 @@ sub GetReservesToBranch { return (@transreserv); } -=head2 GetReservesForBranch +=item GetReservesForBranch @transreserv = GetReservesForBranch($frombranch); @@ -509,15 +556,22 @@ sub GetReservesToBranch { sub GetReservesForBranch { my ($frombranch) = @_; my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( " - SELECT borrowernumber,reservedate,itemnumber,waitingdate + my $query = "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); + AND found='W' "; + if ($frombranch){ + $query .= " AND branchcode=? "; + } + $query .= "ORDER BY waitingdate" ; + my $sth = $dbh->prepare($query); + if ($frombranch){ + $sth->execute($frombranch); + } + else { + $sth->execute(); + } my @transreserv; my $i = 0; while ( my $data = $sth->fetchrow_hashref ) { @@ -563,10 +617,10 @@ sub CheckReserves { # Look up the item by itemnumber my $query = " SELECT items.biblionumber, items.biblioitemnumber, itemtypes.notforloan - FROM items, biblioitems, itemtypes - WHERE items.biblioitemnumber = biblioitems.biblioitemnumber - AND biblioitems.itemtype = itemtypes.itemtype - AND itemnumber=$qitem + FROM items + LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber + LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype + WHERE itemnumber=$qitem "; $sth = $dbh->prepare($query); } @@ -575,7 +629,9 @@ sub CheckReserves { # Look up the item by barcode my $query = " SELECT items.biblionumber, items.biblioitemnumber, itemtypes.notforloan - FROM items, biblioitems, itemtypes + FROM items + LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber + LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype WHERE items.biblioitemnumber = biblioitems.biblioitemnumber AND biblioitems.itemtype = itemtypes.itemtype AND barcode=$qbc @@ -655,7 +711,7 @@ priorities of the other people who are waiting on the book. sub CancelReserve { my ( $biblio, $item, $borr ) = @_; my $dbh = C4::Context->dbh; - if ( ( $item and $borr ) and ( not $biblio ) ) { + if ( $item and $borr ) { # removing a waiting reserve record.... # update the database... my $query = " @@ -670,7 +726,7 @@ sub CancelReserve { $sth->execute( $item, $borr ); $sth->finish; } - if ( ( $biblio and $borr ) and ( not $item ) ) { + else { # removing a reserve record.... # get the prioritiy on this record.... my $priority; @@ -836,7 +892,7 @@ 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. +if $transferToDo is not 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 @@ -880,9 +936,6 @@ sub ModReserveAffect { $sth = $dbh->prepare($query); $sth->execute( $itemnumber, $borrowernumber,$biblionumber); $sth->finish; - - # now fix up the remaining priorities.... -# _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; } @@ -984,12 +1037,13 @@ sub _FixPriority { # 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) + # This is wrong a waiting reserve has W set + # The assumption that having an itemnumber set means waiting is wrong and should be corrected any place it occurs 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 /; @@ -1091,14 +1145,6 @@ sub _Findgroupreserve { return @results; } -=item GetReserveFee - -$fee = GetReserveFee($borrowernumber,$biblionumber,$constraint,$biblionumber); - -Calculate the fee for a reserve - -=cut - =back =head1 AUTHOR @@ -1107,3 +1153,4 @@ Koha Developement team =cut +1;