@@ -, +, @@
- auto_renew (renewal shouldn't be done manually)
- auto_too_soon (renewal is premature and shouldn't be done manually)
one without it.
- automatic renewal by issuing rule
- automatic renewal by Checkbox on the checkout page
- no automatic renewal
Home > Circulation > Checkouts
Home > Patrons > Patron details
even if there are still renewals left and it's not too soon to renew.
renewals are displayed. If no renewals are left "Not renewable" should
be displayed.
---
C4/Circulation.pm | 67 ++++++++++----------
circ/circulation.pl | 7 +-
.../intranet-tmpl/prog/en/includes/strings.inc | 2 +
koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js | 14 ++++
.../prog/en/modules/circ/circulation.tt | 9 +++
5 files changed, 65 insertions(+), 34 deletions(-)
--- a/C4/Circulation.pm
+++ a/C4/Circulation.pm
@@ -1183,7 +1183,7 @@ AddIssue does the following things :
=cut
sub AddIssue {
- my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode) = @_;
+ my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode, $auto_renew ) = @_;
my $dbh = C4::Context->dbh;
my $barcodecheck=CheckValidBarcode($barcode);
if ($datedue && ref $datedue ne 'DateTime') {
@@ -1249,12 +1249,18 @@ sub AddIssue {
$sth->execute(C4::Context->userenv->{'branch'},$item->{'itemnumber'});
}
+ # If automatic renewal wasn't selected while issuing, set the value according to the issuing rule.
+ unless ($auto_renew) {
+ my $issuingrule = GetIssuingRule($borrower->{categorycode}, $item->{itype}, $branch);
+ $auto_renew = $issuingrule->{auto_renew};
+ }
+
# Record in the database the fact that the book was issued.
my $sth =
$dbh->prepare(
"INSERT INTO issues
- (borrowernumber, itemnumber,issuedate, date_due, branchcode)
- VALUES (?,?,?,?,?)"
+ (borrowernumber, itemnumber,issuedate, date_due, branchcode, auto_renew)
+ VALUES (?,?,?,?,?,?)"
);
unless ($datedue) {
my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'};
@@ -1267,7 +1273,8 @@ sub AddIssue {
$item->{'itemnumber'}, # itemnumber
$issuedate->strftime('%Y-%m-%d %H:%M:00'), # issuedate
$datedue->strftime('%Y-%m-%d %H:%M:00'), # date_due
- C4::Context->userenv->{'branch'} # branchcode
+ C4::Context->userenv->{'branch'}, # branchcode
+ $auto_renew ? 1 : 0 # automatic renewal
);
if ( C4::Context->preference('ReturnToShelvingCart') ) { ## ReturnToShelvingCart is on, anything issued should be taken off the cart.
CartToShelf( $item->{'itemnumber'} );
@@ -2599,7 +2606,9 @@ C<$itemnumber> is the number of the item to renew.
C<$override_limit>, if supplied with a true value, causes
the limit on the number of times that the loan can be renewed
-(as controlled by the item type) to be ignored.
+(as controlled by the item type) to be ignored. Overriding also allows
+to renew sooner than "No renewal before" and to manually renew loans
+that are automatically renewed.
C<$CanBookBeRenewed> returns a true value if the item may be renewed. The
item must currently be on loan to the specified borrower; renewals
@@ -2611,10 +2620,8 @@ already renewed the loan. $error will contain the reason the renewal can not pro
sub CanBookBeRenewed {
my ( $borrowernumber, $itemnumber, $override_limit ) = @_;
- my $dbh = C4::Context->dbh;
- my $renews = 1;
- my $renewokay = 1;
- my $error;
+ my $dbh = C4::Context->dbh;
+ my $renews = 1;
my $item = GetItem($itemnumber) or return ( 0, 'no_item' );
my $itemissue = GetItemIssue($itemnumber) or return ( 0, 'no_checkout' );
@@ -2623,42 +2630,36 @@ sub CanBookBeRenewed {
my $borrower = C4::Members::GetMember( borrowernumber => $borrowernumber )
or return;
- my $branchcode = _GetCircControlBranch($item, $borrower);
+ my ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves($itemnumber);
- my $issuingrule = GetIssuingRule($borrower->{categorycode}, $item->{itype}, $branchcode);
+ return ( 0, "on_reserve" ) if $resfound; # '' when no hold was found
+
+ return ( 1, undef ) if $override_limit;
+
+ my $branchcode = _GetCircControlBranch( $item, $borrower );
+ my $issuingrule =
+ GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $branchcode );
+
+ return ( 0, "too_many" )
+ if $issuingrule->{renewalsallowed} <= $itemissue->{renewals};
if ( $issuingrule->{norenewalbefore} ) {
- # Get current time and add norenewalbefore. If this is smaller than date_due, it's too soon for renewal.
+ # Get current time and add norenewalbefore.
+ # If this is smaller than date_due, it's too soon for renewal.
if (
DateTime->now( time_zone => C4::Context->tz() )->add(
$issuingrule->{lengthunit} => $issuingrule->{norenewalbefore}
) < $itemissue->{date_due}
- )
+ )
{
- $renewokay = 0;
- $error = "too_soon";
+ return ( 0, "auto_too_soon" ) if $itemissue->{auto_renew};
+ return ( 0, "too_soon" );
}
}
- if ( $issuingrule->{renewalsallowed} <= $itemissue->{renewals} ) {
- $renewokay = 0;
- $error = "too_many";
- }
-
- if ( $override_limit ) {
- $renewokay = 1;
- $error = undef;
- }
-
- my ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves( $itemnumber );
-
- if ( $resfound ) { # '' when no hold was found
- $renewokay = 0;
- $error = "on_reserve";
- }
-
- return ( $renewokay, $error );
+ return ( 0, "auto_renew" ) if $itemissue->{auto_renew};
+ return ( 1, undef );
}
=head2 AddRenewal
--- a/circ/circulation.pl
+++ a/circ/circulation.pl
@@ -134,6 +134,10 @@ if ( $barcode ) {
$stickyduedate = $query->param('stickyduedate');
$duedatespec = $query->param('duedatespec');
}
+ $session->param('auto_renew', $query->param('auto_renew'));
+}
+else {
+ $session->clear('auto_renew');
}
my ($datedue,$invalidduedate);
@@ -344,7 +348,8 @@ if ($barcode) {
}
}
unless($confirm_required) {
- AddIssue( $borrower, $barcode, $datedue, $cancelreserve );
+ AddIssue( $borrower, $barcode, $datedue, $cancelreserve, undef, undef, $session->param('auto_renew') );
+ $session->clear('auto_renew');
$inprocess = 1;
}
}
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/strings.inc
+++ a/koha-tmpl/intranet-tmpl/prog/en/includes/strings.inc
@@ -14,6 +14,8 @@
var ON_HOLD = _("On hold");
var NOT_RENEWABLE = _("Not renewable");
var NOT_RENEWABLE_TOO_SOON = _("No renewal before %s");
+ var NOT_RENEWABLE_AUTO_TOO_SOON = _("Scheduled for automatic renewal");
+ var NOT_RENEWABLE_AUTO_RENEW = _("Scheduled for automatic renewal");
var RENEWALS_REMAINING = _("%s of %s renewals remaining");
var HOLD_IS_SUSPENDED = _("Hold is suspended");
var UNTIL = _("until %s");
--- a/koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js
+++ a/koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js
@@ -255,6 +255,20 @@ $(document).ready(function() {
span_style = "display: none";
span_class = "renewals-allowed";
+ } else if ( oObj.can_renew_error == "auto_too_soon" ) {
+ content += ""
+ + NOT_RENEWABLE_AUTO_TOO_SOON
+ + "";
+
+ span_style = "display: none";
+ span_class = "renewals-allowed";
+ } else if ( oObj.can_renew_error == "auto_renew" ) {
+ content += ""
+ + NOT_RENEWABLE_AUTO_RENEW
+ + "";
+
+ span_style = "display: none";
+ span_class = "renewals-allowed";
} else {
content += ""
+ oObj.can_renew_error
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt
+++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt
@@ -489,6 +489,15 @@ No patron matched [% message %]
[% END %]
+
+ [% IF NEEDSCONFIRMATION %]
+
+ [% ELSE %]
+
+ [% END %]
+
+