[Koha-patches] [PATCH] Smart Rules enhancements
Henri-Damien LAURENT
henridamien.laurent at biblibre.com
Mon Aug 24 22:10:21 CEST 2009
Adding finedays and reservesallowed and renewalsallowed management in smart rules
Adding Clone Rules
Adding CanBookBeReserved and CanItemBeReserved in C4::Reserves
Manage Reservesallowed in opac and staff interface
Manage renewalsallowed in C4/Circulation.pm
Update Database follow
---
C4/Circulation.pm | 70 +++++----
C4/Reserves.pm | 173 ++++++++++++++++++++
admin/clone-rules.pl | 107 ++++++++++++
admin/smart-rules.pl | 14 +-
.../prog/en/modules/admin/clone-rules.tmpl | 72 ++++++++
.../prog/en/modules/admin/smart-rules.tmpl | 77 +++++----
opac/opac-reserve.pl | 11 +-
reserve/request.pl | 11 +-
8 files changed, 463 insertions(+), 72 deletions(-)
create mode 100755 admin/clone-rules.pl
create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/admin/clone-rules.tmpl
diff --git a/C4/Circulation.pm b/C4/Circulation.pm
index 1778a1c..7f2bfeb 100644
--- a/C4/Circulation.pm
+++ b/C4/Circulation.pm
@@ -2034,39 +2034,52 @@ sub CanBookBeRenewed {
# Look in the issues table for this item, lent to this borrower,
# and not yet returned.
- # FIXME - I think this function could be redone to use only one SQL call.
- my $sth1 = $dbh->prepare(
- "SELECT * FROM issues
- WHERE borrowernumber = ?
- AND itemnumber = ?"
- );
- $sth1->execute( $borrowernumber, $itemnumber );
- if ( my $data1 = $sth1->fetchrow_hashref ) {
-
- # Found a matching item
-
- # See if this item may be renewed. This query is convoluted
- # because it's a bit messy: given the item number, we need to find
- # the biblioitem, which gives us the itemtype, which tells us
- # whether it may be renewed.
- my $query = "SELECT renewalsallowed FROM items ";
- $query .= (C4::Context->preference('item-level_itypes'))
- ? "LEFT JOIN itemtypes ON items.itype = itemtypes.itemtype "
- : "LEFT JOIN biblioitems on items.biblioitemnumber = biblioitems.biblioitemnumber
- LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype ";
- $query .= "WHERE items.itemnumber = ?";
- my $sth2 = $dbh->prepare($query);
- $sth2->execute($itemnumber);
- if ( my $data2 = $sth2->fetchrow_hashref ) {
- $renews = $data2->{'renewalsallowed'};
- }
- if ( ( $renews && $renews > $data1->{'renewals'} ) || $override_limit ) {
+ # Look in the issues table for this item, lent to this borrower,
+ # and not yet returned.
+ my %branch = (
+ 'ItemHomeLibrary' => 'items.homebranch',
+ 'PickupLibrary' => 'items.holdingbranch',
+ 'PatronLibrary' => 'borrowers.branchcode'
+ );
+ my $controlbranch = $branch{C4::Context->preference('CircControl')};
+ my $itype = C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype';
+
+ my $sthcount = $dbh->prepare("
+ SELECT
+ borrowers.categorycode, biblioitems.itemtype, issues.renewals, renewalsallowed, $controlbranch
+ FROM issuingrules,
+ issues
+ LEFT JOIN items USING (itemnumber)
+ LEFT JOIN borrowers USING (borrowernumber)
+ LEFT JOIN biblioitems USING (biblioitemnumber)
+
+ WHERE
+ issuingrules.categorycode = borrowers.categorycode
+ AND
+ issuingrules.itemtype = $itype
+ AND
+ (issuingrules.branchcode = $controlbranch OR issuingrules.branchcode = '*')
+ AND
+ borrowernumber = ?
+ AND
+ itemnumber = ?
+ ORDER BY
+ issuingrules.categorycode desc,
+ issuingrules.itemtype desc,
+ issuingrules.branchcode desc
+ LIMIT 1;
+ ");
+
+ $sthcount->execute( $borrowernumber, $itemnumber );
+ if ( my $data1 = $sthcount->fetchrow_hashref ) {
+
+ if ( ( $data1->{renewalsallowed} && $data1->{renewalsallowed} > $data1->{renewals} ) || $override_limit ) {
$renewokay = 1;
}
else {
$error="too_many";
}
- $sth2->finish;
+
my ( $resfound, $resrec ) = C4::Reserves::CheckReserves($itemnumber);
if ($resfound) {
$renewokay = 0;
@@ -2074,7 +2087,6 @@ sub CanBookBeRenewed {
}
}
- $sth1->finish;
return ($renewokay,$error);
}
diff --git a/C4/Reserves.pm b/C4/Reserves.pm
index 8610036..2348c90 100644
--- a/C4/Reserves.pm
+++ b/C4/Reserves.pm
@@ -329,7 +329,180 @@ sub GetReservesFromBorrowernumber {
return @$data;
}
#-------------------------------------------------------------------------------------
+=item CanBookBeReserved
+$error = &CanBookBeReserved($borrowernumber, $biblionumber)
+
+=cut
+
+sub CanBookBeReserved{
+ my ($borrowernumber, $biblionumber) = @_;
+
+ my $dbh = C4::Context->dbh;
+ my $biblio = GetBiblioData($biblionumber);
+ my $borrower = C4::Members::GetMember($borrowernumber);
+ my $controlbranch = C4::Context->preference('ReservesControlBranch');
+ my $itype = C4::Context->preference('item-level_itypes');
+ my $reservesrights= 0;
+ my $reservescount = 0;
+
+ # we retrieve the user rights
+ my @args;
+ my $rightsquery = "SELECT categorycode, itemtype, branchcode, reservesallowed
+ FROM issuingrules
+ WHERE categorycode = ?";
+ push @args,$borrower->{categorycode};
+
+ if($controlbranch eq "ItemHomeLibrary"){
+ $rightsquery .= " AND branchcode = '*'";
+ }elsif($controlbranch eq "PatronLibrary"){
+ $rightsquery .= " AND branchcode IN (?,'*')";
+ push @args, $borrower->{branchcode};
+ }
+
+ if(not $itype){
+ $rightsquery .= " AND itemtype IN (?,'*')";
+ push @args, $biblio->{itemtype};
+ }else{
+ $rightsquery .= " AND itemtype = '*'";
+ }
+
+ $rightsquery .= " ORDER BY categorycode DESC, itemtype DESC, branchcode DESC";
+
+ my $sthrights = $dbh->prepare($rightsquery);
+ $sthrights->execute(@args);
+
+ if(my $row = $sthrights->fetchrow_hashref()){
+ $reservesrights = $row->{reservesallowed};
+ }
+
+ @args = ();
+ # we count how many reserves the borrower have
+ my $countquery = "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 = ?
+ ";
+ push @args, $borrowernumber;
+
+ if(not $itype){
+ $countquery .= "AND itemtype = ?";
+ push @args, $biblio->{itemtype};
+ }
+
+ if($controlbranch eq "PatronLibrary"){
+ $countquery .= " AND borrowers.branchcode = ? ";
+ push @args, $borrower->{branchcode};
+ }
+
+ my $sthcount = $dbh->prepare($countquery);
+ $sthcount->execute(@args);
+
+ if(my $row = $sthcount->fetchrow_hashref()){
+ $reservescount = $row->{count};
+ }
+
+ if($reservescount < $reservesrights){
+ return 1;
+ }else{
+ return 0;
+ }
+
+}
+
+=item CanItemBeReserved
+
+$error = &CanItemBeReserved($borrowernumber, $itemnumber)
+
+this function return 1 if an item can be issued by this borrower.
+
+=cut
+
+sub CanItemBeReserved{
+ my ($borrowernumber, $itemnumber) = @_;
+
+ my $dbh = C4::Context->dbh;
+ my $allowedreserves = 0;
+
+ my $controlbranch = C4::Context->preference('ReservesControlBranch');
+ my $itype = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype";
+
+ # we retrieve borrowers and items informations #
+ my $item = GetItem($itemnumber);
+ my $borrower = C4::Members::GetMember($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 $itemtype = $item->{$itype};
+ my $categorycode = $borrower->{categorycode};
+ my $branchcode = "";
+ my $branchfield = "reserves.branchcode";
+
+ if( $controlbranch eq "ItemHomeLibrary" ){
+ $branchfield = "items.homebranch";
+ $branchcode = $item->{homebranch};
+ }elsif( $controlbranch eq "PatronLibrary" ){
+ $branchfield = "borrowers.branchcode";
+ $branchcode = $borrower->{branchcode};
+ }
+
+ # we retrieve rights
+ $sth->execute($categorycode, $itemtype, $branchcode);
+ if(my $rights = $sth->fetchrow_hashref()){
+ $itemtype = $rights->{itemtype};
+ $allowedreserves = $rights->{reservesallowed};
+ }else{
+ $itemtype = '*';
+ }
+
+ # we retrieve count
+
+ $querycount .= "AND $branchfield = ?";
+
+ $querycount .= " AND $itype = ?" if ($itemtype ne "*");
+ my $sthcount = $dbh->prepare($querycount);
+
+ if($itemtype eq "*"){
+ $sthcount->execute($borrowernumber, $branchcode);
+ }else{
+ $sthcount->execute($borrowernumber, $branchcode, $itemtype);
+ }
+
+ my $reservecount = "0";
+ if(my $rowcount = $sthcount->fetchrow_hashref()){
+ $reservecount = $rowcount->{count};
+ }
+
+ # we check if it's ok or not
+ if( $reservecount < $allowedreserves ){
+ return 1;
+ }else{
+ return 0;
+ }
+}
+#--------------------------------------------------------------------------------
=item GetReserveCount
$number = &GetReserveCount($borrowernumber);
diff --git a/admin/clone-rules.pl b/admin/clone-rules.pl
new file mode 100755
index 0000000..7daa369
--- /dev/null
+++ b/admin/clone-rules.pl
@@ -0,0 +1,107 @@
+#!/usr/bin/perl
+# vim: et ts=4 sw=4
+# Copyright BibLibre
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA 02111-1307 USA
+
+
+# This script clones issuing rules from a library to another
+# parameters :
+# - frombranch : the branch we want to clone issuing rules from
+# - tobranch : the branch we want to clone issuing rules to
+#
+# The script can be called with one of the parameters, both or none
+
+use strict;
+use CGI;
+use C4::Context;
+use C4::Output;
+use C4::Auth;
+use C4::Koha;
+use C4::Debug;
+use C4::Branch; # GetBranches
+
+my $input = new CGI;
+my $dbh = C4::Context->dbh;
+
+my ($template, $loggedinuser, $cookie)
+ = get_template_and_user({template_name => "admin/clone-rules.tmpl",
+ query => $input,
+ type => "intranet",
+ authnotrequired => 0,
+ flagsrequired => {parameters => 1},
+ debug => 1,
+ });
+
+my $frombranch = $input->param("frombranch");
+my $tobranch = $input->param("tobranch");
+my $branchloop = GetBranchesLoop;
+
+$template->param(frombranch => $frombranch) if ($frombranch);
+$template->param(frombranchname => GetBranchName($frombranch)) if ($frombranch);
+$template->param(tobranch => $tobranch) if ($tobranch);
+$template->param(tobranchname => GetBranchName($tobranch)) if ($tobranch);
+
+$template->param(branchloop => $branchloop);
+
+if ($frombranch && $tobranch) {
+
+ my $error;
+
+ # First, we create a temporary table with the rules we want to clone
+ my $query = "CREATE TEMPORARY TABLE tmpissuingrules ENGINE=memory SELECT * FROM issuingrules WHERE branchcode=?";
+ my $sth = $dbh->prepare($query);
+ my $res = $sth->execute($frombranch);
+ $error = 1 unless ($res);
+
+ if (!$error) {
+ # We modify these rules according to the new branchcode
+ $query = "UPDATE tmpissuingrules SET branchcode=? WHERE branchcode=?";
+ $sth = $dbh->prepare($query);
+ $res = $sth->execute($tobranch, $frombranch);
+ $error = 1 unless ($res);
+ }
+
+ if (!$error) {
+ # We delete the rules for the existing branchode
+ $query = "DELETE FROM issuingrules WHERE branchcode=?";
+ $sth = $dbh->prepare($query);
+ $res = $sth->execute($tobranch);
+ $error = 1 unless ($res);
+ }
+
+
+ if (!$error) {
+ # We insert the new rules from our temporary table
+ $query = "INSERT INTO issuingrules SELECT * FROM tmpissuingrules WHERE branchcode=?";
+ $sth = $dbh->prepare($query);
+ $res = $sth->execute($tobranch);
+ $error = 1 unless ($res);
+ }
+
+ # Finally, we delete our temporary table
+ $query = "DROP TABLE tmpissuingrules";
+ $sth = $dbh->prepare($query);
+ $res = $sth->execute();
+
+ $template->param(result => "1");
+ $template->param(error => $error);
+}
+
+
+
+output_html_with_http_headers $input, $cookie, $template->output;
+
diff --git a/admin/smart-rules.pl b/admin/smart-rules.pl
index 40e9084..8e0b998 100755
--- a/admin/smart-rules.pl
+++ b/admin/smart-rules.pl
@@ -99,16 +99,19 @@ elsif ($op eq 'delete-branch-item') {
# save the values entered
elsif ($op eq 'add') {
my $sth_search = $dbh->prepare("SELECT COUNT(*) AS total FROM issuingrules WHERE branchcode=? AND categorycode=? AND itemtype=?");
- my $sth_insert = $dbh->prepare("INSERT INTO issuingrules (branchcode, categorycode, itemtype, maxissueqty, issuelength, fine, firstremind, chargeperiod) VALUES(?,?,?,?,?,?,?,?)");
- my $sth_update=$dbh->prepare("UPDATE issuingrules SET fine=?, firstremind=?, chargeperiod=?, maxissueqty=?, issuelength=? WHERE branchcode=? AND categorycode=? AND itemtype=?");
+ my $sth_insert = $dbh->prepare("INSERT INTO issuingrules (branchcode, categorycode, itemtype, maxissueqty, renewalsallowed, reservesallowed, issuelength, fine, finedays, firstremind, chargeperiod) VALUES(?,?,?,?,?,?,?,?,?,?,?)");
+ my $sth_update=$dbh->prepare("UPDATE issuingrules SET fine=?, finedays=?, firstremind=?, chargeperiod=?, maxissueqty=?, renewalsallowed=?, reservesallowed=?, issuelength=? WHERE branchcode=? AND categorycode=? AND itemtype=?");
my $br = $branch; # branch
my $bor = $input->param('categorycode'); # borrower category
my $cat = $input->param('itemtype'); # item type
my $fine = $input->param('fine');
+ my $finedays = $input->param('finedays');
my $firstremind = $input->param('firstremind');
my $chargeperiod = $input->param('chargeperiod');
my $maxissueqty = $input->param('maxissueqty');
+ my $renewalsallowed = $input->param('renewalsallowed');
+ my $reservesallowed = $input->param('reservesallowed');
$maxissueqty =~ s/\s//g;
$maxissueqty = undef if $maxissueqty !~ /^\d+/;
my $issuelength = $input->param('issuelength');
@@ -117,9 +120,9 @@ elsif ($op eq 'add') {
$sth_search->execute($br,$bor,$cat);
my $res = $sth_search->fetchrow_hashref();
if ($res->{total}) {
- $sth_update->execute($fine, $firstremind, $chargeperiod, $maxissueqty,$issuelength,$br,$bor,$cat);
+ $sth_update->execute($fine, $finedays,$firstremind, $chargeperiod, $maxissueqty, $renewalsallowed,$reservesallowed, $issuelength,$br,$bor,$cat);
} else {
- $sth_insert->execute($br,$bor,$cat,$maxissueqty,$issuelength,$fine,$firstremind,$chargeperiod);
+ $sth_insert->execute($br,$bor,$cat,$maxissueqty,$renewalsallowed,$reservesallowed,$issuelength,$fine,$finedays,$firstremind,$chargeperiod);
}
}
elsif ($op eq "set-branch-defaults") {
@@ -476,7 +479,8 @@ $template->param(categoryloop => \@category_loop,
rules => \@sorted_row_loop,
branchloop => \@branchloop,
humanbranch => ($branch ne '*' ? $branches->{$branch}->{branchname} : ''),
- branch => $branch
+ branch => $branch,
+ definedbranch => $branch eq '*'
);
output_html_with_http_headers $input, $cookie, $template->output;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/clone-rules.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/clone-rules.tmpl
new file mode 100644
index 0000000..4945f2e
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/clone-rules.tmpl
@@ -0,0 +1,72 @@
+<!-- TMPL_INCLUDE NAME="doc-head-open.inc" -->
+<title>Koha › Administration › Clone Issuing Rules</title>
+<!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
+
+</head>
+<body>
+<!-- TMPL_INCLUDE NAME="header.inc" -->
+<!-- TMPL_INCLUDE NAME="cat-search.inc" -->
+
+<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a> › Clone Issuing Rules</div>
+
+<div id="doc3" class="yui-t1">
+
+<div id="bd">
+ <div id="yui-main">
+ <div class="yui-b">
+ <h1>Cloning issuing rules
+ <!-- TMPL_IF EXPR="frombranchname || tobranchname" -->
+ <!-- TMPL_IF NAME="frombranchname" --> from "<!-- TMPL_VAR NAME="frombranchname" -->"<!-- /TMPL_IF -->
+ <!-- TMPL_IF NAME="tobranchname" --> to "<!-- TMPL_VAR NAME="tobranchname" -->"<!-- /TMPL_IF -->
+ <!-- /TMPL_IF -->
+ </h1>
+
+ <!-- TMPL_IF NAME="result" -->
+ <!-- TMPL_IF NAME="error" -->
+ <p class="error">Issuing rules cloning failed!</p>
+ <!-- TMPL_ELSE -->
+ <div class="message"><p>The rules have been cloned.</p></div>
+ <!-- /TMPL_IF -->
+ <!-- TMPL_ELSE -->
+
+ <p class="help">Use carefully ! If the destination library already has issuing rules, they will be deleted without warning !</p>
+ <form action="/cgi-bin/koha/admin/clone-rules.pl" method="post">
+ <!-- TMPL_UNLESS NAME="frombranch" -->
+ <fieldset>
+ <legend>Please choose a library to clone rules from:</legend>
+ <label for="frombranch">Source library:</label>
+ <select name="frombranch" id="frombranch">
+ <option value="">Default</option>
+ <!-- TMPL_LOOP name="branchloop" -->
+ <option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="branchname" --></option>
+ <!-- /TMPL_LOOP -->
+ </select>
+ <!-- TMPL_IF NAME="tobranch" --><input type="hidden" name="tobranch" value="<!-- TMPL_VAR NAME="tobranch" -->" /><!-- /TMPL_IF -->
+ </fieldset>
+ <!-- /TMPL_UNLESS -->
+
+ <!-- TMPL_UNLESS NAME="tobranch" -->
+ <fieldset>
+ <legend>Please choose the library to clone the rules to:</legend>
+ <label for="tobranch">Destination library:</label>
+ <select name="tobranch" id="tobranch">
+ <option value="">Default</option>
+ <!-- TMPL_LOOP name="branchloop" -->
+ <option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="branchname" --></option>
+ <!-- /TMPL_LOOP -->
+ </select>
+ <!-- TMPL_IF NAME="frombranch" --><input type="hidden" name="frombranch" value="<!-- TMPL_VAR NAME="frombranch" -->" /><!-- /TMPL_IF -->
+ </fieldset>
+ <!-- /TMPL_UNLESS -->
+ <input type="submit" />
+ </form>
+
+ <!-- /TMPL_IF -->
+ </div>
+
+</div>
+<div class="yui-b">
+<!-- TMPL_INCLUDE NAME="admin-menu.inc" -->
+</div>
+</div>
+<!-- TMPL_INCLUDE NAME="intranet-bottom.inc" -->
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tmpl
index 96481aa..27dfcb6 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tmpl
@@ -56,6 +56,7 @@ $(document).ready(function() {
<!-- /TMPL_LOOP -->
</select>
</form>
+ <!-- TMPL_IF Name="definedbranch" --><form action="/cgi-bin/koha/admin/clone-rules.pl" method="post"><input type="hidden" name="frombranch" value="<!-- TMPL_VAR NAME="branch" -->" /><input type="submit" value="Clone these rules" /></form><!-- /TMPL_IF -->
<br />
<br />
<form method="post" action="/cgi-bin/koha/admin/smart-rules.pl">
@@ -65,44 +66,54 @@ $(document).ready(function() {
<th>Patron Category</th>
<th>Item Type</th>
<th>Fine Amount</th>
+ <th>Fine Days</th>
<th>Fine Grace Period</th>
<th>Fine Charging Interval</th>
<th>Current Checkouts Allowed</th>
+ <th>Renewals Allowed</th>
+ <th>Reserves Allowed</th>
<th>Loan Period</th><th> </th>
</tr>
- <!-- TMPL_LOOP NAME="rules" -->
- <!-- TMPL_UNLESS NAME="__odd__" -->
- <tr class="highlight">
- <!-- TMPL_ELSE -->
- <tr>
- <!-- /TMPL_UNLESS -->
- <td><!-- TMPL_IF NAME="default_humancategorycode" -->
- <em>Default</em>
- <!-- TMPL_ELSE -->
- <!-- TMPL_VAR NAME="humancategorycode" -->
- <!-- /TMPL_IF -->
- </td>
- <td><!-- TMPL_IF NAME="default_humanitemtype" -->
- <em>Default</em>
- <!-- TMPL_ELSE -->
- <!-- TMPL_VAR NAME="humanitemtype" -->
- <!-- /TMPL_IF -->
- </td>
- <td><!-- TMPL_VAR NAME="fine" --></td>
- <td><!-- TMPL_IF NAME="firstremind" --><!-- TMPL_VAR NAME="firstremind" --> day(s)<!-- /TMPL_IF --></td>
- <td><!-- TMPL_IF NAME="chargeperiod" --><!-- TMPL_VAR NAME="chargeperiod" --> day(s)<!-- /TMPL_IF --></td>
- <td><!-- TMPL_IF NAME="unlimited_maxissueqty" -->
- Unlimited
- <!-- TMPL_ELSE -->
- <!-- TMPL_VAR NAME="maxissueqty" -->
- <!-- /TMPL_IF -->
- </td>
- <td><!-- TMPL_IF NAME="issuelength" --><!-- TMPL_VAR NAME="issuelength" --> day(s)<!-- /TMPL_IF --></td>
- <td>
- <a class="button" href="/cgi-bin/koha/admin/smart-rules.pl?op=delete&itemtype=<!-- TMPL_VAR NAME="itemtype" -->&categorycode=<!-- TMPL_VAR NAME="categorycode" -->&branch=<!-- TMPL_VAR NAME="branch" -->">Delete</a>
- </td>
- </tr>
- <!-- /TMPL_LOOP -->
+ <!-- TMPL_LOOP NAME="rules" -->
+ <!-- TMPL_UNLESS NAME="__odd__" -->
+ <tr class="highlight">
+ <!-- TMPL_ELSE -->
+ <tr>
+ <!-- /TMPL_UNLESS -->
+ <td><!-- TMPL_IF NAME="default_humancategorycode" -->
+ <em>Default</em>
+ <!-- TMPL_ELSE -->
+ <!-- TMPL_VAR NAME="humancategorycode" -->
+ <!-- /TMPL_IF -->
+ </td>
+ <td><!-- TMPL_IF NAME="default_humanitemtype" -->
+ <em>Default</em>
+ <!-- TMPL_ELSE -->
+ <!-- TMPL_VAR NAME="humanitemtype" -->
+ <!-- /TMPL_IF -->
+ </td>
+ <td><!-- TMPL_VAR NAME="fine" --></td>
+ <td>
+ <!-- TMPL_IF NAME="finedays" -->
+ <!-- TMPL_VAR NAME="finedays" --> day(s)
+ <!-- /TMPL_IF -->
+ </td>
+ <td><!-- TMPL_IF NAME="firstremind" --><!-- TMPL_VAR NAME="firstremind" --> day(s)<!-- /TMPL_IF --></td>
+ <td><!-- TMPL_IF NAME="chargeperiod" --><!-- TMPL_VAR NAME="chargeperiod" --> day(s)<!-- /TMPL_IF --></td>
+ <td><!-- TMPL_IF NAME="unlimited_maxissueqty" -->
+ Unlimited
+ <!-- TMPL_ELSE -->
+ <!-- TMPL_VAR NAME="maxissueqty" -->
+ <!-- /TMPL_IF -->
+ </td>
+ <td><!-- TMPL_IF NAME="renewalsallowed" --><!-- TMPL_VAR NAME="renewalsallowed" --> time(s)<!-- /TMPL_IF --></td>
+ <td><!-- TMPL_IF NAME="reservesallowed" --><!-- TMPL_VAR NAME="reservesallowed" --> time(s)<!-- /TMPL_IF --></td>
+ <td><!-- TMPL_IF NAME="issuelength" --><!-- TMPL_VAR NAME="issuelength" --> day(s)<!-- /TMPL_IF --></td>
+ <td>
+ <a class="button" href="/cgi-bin/koha/admin/smart-rules.pl?op=delete&itemtype=<!-- TMPL_VAR NAME="itemtype" -->&categorycode=<!-- TMPL_VAR NAME="categorycode" -->&branch=<!-- TMPL_VAR NAME="branch" -->">Delete</a>
+ </td>
+ </tr>
+ <!-- /TMPL_LOOP -->
<tr>
<td>
<select name="categorycode">
diff --git a/opac/opac-reserve.pl b/opac/opac-reserve.pl
index 4471dff..991383b 100755
--- a/opac/opac-reserve.pl
+++ b/opac/opac-reserve.pl
@@ -150,8 +150,8 @@ foreach my $biblioNumber (@biblionumbers) {
#
#
if ( $query->param('place_reserve') ) {
-
my $notes = $query->param('notes');
+ my $canreserve=0;
# List is composed of alternating biblio/item/branch
my $selectedItems = $query->param('selecteditems');
@@ -204,6 +204,7 @@ if ( $query->param('place_reserve') ) {
# holdingbranch, force the value $rank and $found.
my $rank = $biblioData->{rank};
if ($itemNum ne ''){
+ $canreserve = 1 if CanItemBeReserved($borrowernumber,$itemNum);
$rank = '0' unless C4::Context->preference('ReservesNeedReturns');
my $item = GetItem($itemNum);
if ( $item->{'holdingbranch'} eq $branch ){
@@ -211,13 +212,14 @@ if ( $query->param('place_reserve') ) {
}
}
else {
+ $canreserve = 1 if CanBookBeReserved($borrowernumber,$biblioNum);
# Inserts a null into the 'itemnumber' field of 'reserves' table.
$itemNum = undef;
}
# Here we actually do the reserveration. Stage 3.
AddReserve($branch, $borrowernumber, $biblioNum, 'a', [$biblioNum], $rank, $startdate, $notes,
- $biblioData->{'title'}, $itemNum, $found);
+ $biblioData->{'title'}, $itemNum, $found) if ($canreserve);
}
print $query->redirect("/cgi-bin/koha/opac-user.pl#opac-user-holds");
@@ -430,7 +432,7 @@ foreach my $biblioNum (@biblionumbers) {
$policy_holdallowed = 0;
}
- if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed) {
+ if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed and CanItemBeReserved($borrowernumber,$itemNum)) {
$itemLoopIter->{available} = 1;
$numCopiesAvailable++;
}
@@ -455,6 +457,9 @@ foreach my $biblioNum (@biblionumbers) {
if ($biblioLoopIter{already_reserved}) {
$biblioLoopIter{holdable} = undef;
}
+ if(not CanBookBeReserved($borrowernumber,$biblioNum)){
+ $biblioLoopIter{holdable} = undef;
+ }
push @$biblioLoop, \%biblioLoopIter;
}
diff --git a/reserve/request.pl b/reserve/request.pl
index 2a744e3..26e229f 100755
--- a/reserve/request.pl
+++ b/reserve/request.pl
@@ -215,9 +215,14 @@ my @biblioloop = ();
foreach my $biblionumber (@biblionumbers) {
my %biblioloopiter = ();
+ my $maxreserves;
my $dat = GetBiblioData($biblionumber);
+ if ( not CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
+ $warnings = 1;
+ $maxreserves = 1;
+ }
# get existing reserves .....
my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
my $totalcount = $count;
@@ -238,7 +243,9 @@ foreach my $biblionumber (@biblionumbers) {
$template->param( alreadyreserved => $alreadyreserved,
messages => $messages,
- warnings => $warnings );
+ warnings => $warnings,
+ maxreserves=>$maxreserves
+ );
# FIXME think @optionloop, is maybe obsolete, or must be switchable by a systeme preference fixed rank or not
@@ -400,7 +407,7 @@ foreach my $biblionumber (@biblionumbers) {
$policy_holdallowed = 0;
}
- if (IsAvailableForItemLevelRequest($itemnumber) and not $item->{cantreserve}) {
+ if (IsAvailableForItemLevelRequest($itemnumber) and not $item->{cantreserve} and CanItemBeReserved($borrowerinfo->{borrowernumber}, $itemnumber) ) {
if ( not $policy_holdallowed and C4::Context->preference( 'AllowHoldPolicyOverride' ) ) {
$item->{override} = 1;
$num_override++;
--
1.6.0.4
More information about the Koha-patches
mailing list