From 9513ff25211015afcb34d57e8ed169c39bf5bed2 Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Wed, 21 Mar 2012 10:35:33 -0400 Subject: [PATCH] Bug 7710 - multiple holds per title - Part 3 - Add multiple holds per record for intranet --- C4/Reserves.pm | 75 +++++++++++++------- .../prog/en/modules/reserve/request.tt | 4 +- reserve/request.pl | 20 ++++-- 3 files changed, 63 insertions(+), 36 deletions(-) diff --git a/C4/Reserves.pm b/C4/Reserves.pm index 45b7a52..77dfa1f 100644 --- a/C4/Reserves.pm +++ b/C4/Reserves.pm @@ -429,8 +429,10 @@ This function return 1 if an item can be issued by this borrower. sub CanItemBeReserved{ my ($borrowernumber, $itemnumber) = @_; - my $dbh = C4::Context->dbh; + my $dbh = C4::Context->dbh; my $allowedreserves = 0; + my $multi_holds_allowed_same = 0; + my $multi_holds_allowed_diff = 0; my $controlbranch = C4::Context->preference('ReservesControlBranch'); my $itype = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype"; @@ -439,27 +441,14 @@ sub CanItemBeReserved{ my $item = GetItem($itemnumber); my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber); - # we retrieve user rights on this itemtype and branchcode - my $sth = $dbh->prepare("SELECT categorycode, itemtype, branchcode, reservesallowed - FROM issuingrules - WHERE (categorycode in (?,'*') ) - AND (itemtype IN (?,'*')) - AND (branchcode IN (?,'*')) - ORDER BY - categorycode DESC, - itemtype DESC, - branchcode DESC;" - ); - - my $querycount ="SELECT - count(*) as count - FROM reserves - LEFT JOIN items USING (itemnumber) - LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber) - LEFT JOIN borrowers USING (borrowernumber) - WHERE borrowernumber = ? - "; - + my $querycount = " + SELECT count(*) AS count + FROM reserves + LEFT JOIN items USING (itemnumber) + LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber) + LEFT JOIN borrowers USING (borrowernumber) + WHERE borrowernumber = ? + "; my $itemtype = $item->{$itype}; my $categorycode = $borrower->{categorycode}; @@ -475,14 +464,19 @@ sub CanItemBeReserved{ } # we retrieve rights - $sth->execute($categorycode, $itemtype, $branchcode); - if(my $rights = $sth->fetchrow_hashref()){ + my $rights = C4::Circulation::GetIssuingRule( $categorycode, $itemtype, $branchcode ); + if ( defined $rights ) { $itemtype = $rights->{itemtype}; $allowedreserves = $rights->{reservesallowed}; }else{ $itemtype = '*'; } + my $multi_holds_same = GetMultiHoldsCountSameEnum( + borrowernumber => $borrowernumber, + itemnumber => $itemnumber + ); + # we retrieve count $querycount .= "AND $branchfield = ?"; @@ -502,10 +496,10 @@ sub CanItemBeReserved{ } # we check if it's ok or not - if( $reservecount < $allowedreserves ){ - return 1; - }else{ + if( $reservecount >= $allowedreserves ){ ## too many reserves return 0; + }else{ + return 1; } } #-------------------------------------------------------------------------------- @@ -1893,6 +1887,33 @@ sub ReserveSlip { ); } +=head2 GetMultiHoldsCountSameEnum + + my $count = GetMultiHoldsCountSameEnum( + borrowernumber => $borrowernumber, + itemnumber => $itemnumber, + ) + + This function returns the number of holds a borrower has placed + on specific items with the same enumchron field as the given + item, on the same bibliographic record. + +=cut + +sub GetMultiHoldsCountSameEnum { + my %params = @_; + my $borrowernumber = $params{'borrowernumber'}; + my $itemnumber = $params{'itemnumber'}; + + return unless ( $borrowernumber && $itemnumber ); + + my $dbh = C4::Context->dbh; + my $query = " + SELECT COUNT(*) AS count FROM reserves + LEFT JOIN items ON ( reserves.itemnumber = items.itemnumber ) + "; +} + =head1 AUTHOR Koha Development Team diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt index d4cf225..468f23a 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt @@ -54,7 +54,7 @@ function check() { } if (alreadyreserved > "0"){ - msg += (_("- This patron had already placed a hold on this item") + "\n" + _("Please cancel the previous hold first") + "\n"); + msg += (_("This patron has already placed the maximum number of holds for this record") + "\n" + _("Please cancel a previous hold first") + "\n"); } if (msg == "") return(true); @@ -207,7 +207,7 @@ function checkMultiHold() {
  • Too Many Holds: [% borrowerfirstname %] [% borrowersurname %] has too many holds.
  • [% END %] [% IF ( alreadyreserved ) %] -
  • [% borrowerfirstname %] [% borrowersurname %] already has a hold on this item
  • +
  • [% borrowerfirstname %] [% borrowersurname %] has already placed the maximum allowed number of holds on this record
  • [% END %] [% IF ( none_available ) %]
  • No copies are available to be placed on hold
  • diff --git a/reserve/request.pl b/reserve/request.pl index 5f8b1f9..6bbbbd9 100755 --- a/reserve/request.pl +++ b/reserve/request.pl @@ -216,6 +216,7 @@ if ($borrowerslist) { # FIXME launch another time GetMember perhaps until my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold ); +my $max_holds_per_record = C4::Context->preference('MaxHoldsPerRecord'); my @biblionumbers = (); my $biblionumbers = $input->param('biblionumbers'); @@ -241,7 +242,8 @@ foreach my $biblionumber (@biblionumbers) { # get existing reserves ..... my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1); my $totalcount = $count; - my $alreadyreserved; + my $holds_count = 0; + my $alreadyreserved = 0; foreach my $res (@$reserves) { if ( defined $res->{found} && $res->{found} eq 'W' ) { @@ -249,17 +251,21 @@ foreach my $biblionumber (@biblionumbers) { } if ( defined $borrowerinfo && ($borrowerinfo->{borrowernumber} eq $res->{borrowernumber}) ) { - $warnings = 1; + $holds_count++; + } + } + + if ( $holds_count >= $max_holds_per_record ) { $alreadyreserved = 1; + $warnings = 1; $biblioloopiter{warn} = 1; - $biblioloopiter{alreadyres} = 1; - } + $biblioloopiter{alreadyres} = 1; } $template->param( alreadyreserved => $alreadyreserved, - messages => $messages, - warnings => $warnings, - maxreserves=>$maxreserves + messages => $messages, + warnings => $warnings, + maxreserves=> $maxreserves ); -- 1.7.2.5