Smart Rules enhancements
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 Signed-off-by: Galen Charlton <gmcharlt@gmail.com>
This commit is contained in:
parent
ef6f41c329
commit
3c741d2376
|
|
@ -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 ) {
|
||||
# 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;
|
||||
");
|
||||
|
||||
# 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 ) {
|
||||
$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);
|
||||
}
|
||||
|
||||
|
|
|
|||
173
C4/Reserves.pm
173
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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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" -->
|
||||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
@ -432,7 +434,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++;
|
||||
}
|
||||
|
|
@ -463,6 +465,9 @@ foreach my $biblioNum (@biblionumbers) {
|
|||
if ($biblioLoopIter{already_reserved}) {
|
||||
$biblioLoopIter{holdable} = undef;
|
||||
}
|
||||
if(not CanBookBeReserved($borrowernumber,$biblioNum)){
|
||||
$biblioLoopIter{holdable} = undef;
|
||||
}
|
||||
|
||||
push @$biblioLoop, \%biblioLoopIter;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
|
|
|
|||
Loading…
Reference in New Issue