@@ -, +, @@
---
C4/Reserves.pm | 75 +++++++++++++-------
.../prog/en/modules/reserve/request.tt | 4 +-
reserve/request.pl | 20 ++++--
3 files changed, 63 insertions(+), 36 deletions(-)
--- a/C4/Reserves.pm
+++ a/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