@@ -, +, @@ - 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. displayed. If no renewals are left "Not renewable" should be displayed. --- C4/Circulation.pm | 67 ++++++++++---------- circ/circulation.pl | 7 +- .../prog/en/modules/circ/circulation.tt | 19 +++++- .../prog/en/modules/members/moremember.tt | 5 +- 4 files changed, 61 insertions(+), 37 deletions(-) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -1176,7 +1176,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') { @@ -1242,12 +1242,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'}; @@ -1260,7 +1266,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'} ); @@ -2553,7 +2560,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" und 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 @@ -2565,10 +2574,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' ); @@ -2577,42 +2584,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 @@ -145,6 +145,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); @@ -355,7 +359,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/modules/circ/circulation.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -528,6 +528,15 @@ No patron matched [% message %] [% END %] +
+ [% IF NEEDSCONFIRMATION %] + + [% ELSE %] + + [% END %] + +
+ [% IF ( SpecifyDueDate ) %]
Specify due date [% INCLUDE 'date-format.inc' %]:
[% IF ( duedatespec ) %][% ELSE %] @@ -789,7 +798,7 @@ No patron matched [% message %] [% END %] - [% IF todayissue.renewsallowed && todayissue.renewsleft && !todayissue.renew_error_too_soon %] + [% IF todayissue.renewsallowed && todayissue.renewsleft && !todayissue.renew_error_too_soon && !todayissue.renew_error_auto_renew && !todayissue.renew_error_auto_too_soon %] ([% todayissue.renewsleft %] of [% todayissue.renewsallowed %] renewals remaining) [% END %] @@ -798,6 +807,9 @@ No patron matched [% message %] On hold [% ELSIF ( todayissue.renew_error_too_many ) %] Not renewable + [% ELSIF ( todayissue.renew_error_auto_renew || todayissue.renew_error_auto_too_soon ) %] + Automatic renewal + ([% todayissue.renewsleft %] of [% todayissue.renewsallowed %] renewals remaining) [% ELSIF ( todayissue.renew_error_too_soon ) %] No renewal before [% todayissue.soonestrenewdate %] ([% todayissue.renewsleft %] of [% todayissue.renewsallowed %] renewals remaining) @@ -886,7 +898,7 @@ No patron matched [% message %] [% END %] - [% IF previssue.renewsallowed && previssue.renewsleft && !previssue.renew_error_too_soon %] + [% IF previssue.renewsallowed && previssue.renewsleft && !previssue.renew_error_too_soon && !previssue.renew_error_auto_renew && !previssue.renew_error_auto_too_soon %] ([% previssue.renewsleft %] of [% previssue.renewsallowed %] renewals remaining) [% END %] @@ -895,6 +907,9 @@ No patron matched [% message %] On Hold [% ELSIF ( previssue.renew_error_too_many ) %] Not renewable + [% ELSIF ( previssue.renew_error_auto_renew || previssue.renew_error_auto_too_soon ) %] + Automatic renewal + ([% previssue.renewsleft %] of [% previssue.renewsallowed %] renewals remaining) [% ELSIF ( previssue.renew_error_too_soon ) %] No renewal before [% previssue.soonestrenewdate %] ([% previssue.renewsleft %] of [% previssue.renewsallowed %] renewals remaining) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt @@ -497,7 +497,7 @@ function validate1(date) { [% END %] - [% IF issueloo.renewsallowed && issueloo.renewsleft && !issueloo.norenew_reason_too_soon %] + [% IF issueloo.renewsallowed && issueloo.renewsleft && !issueloo.norenew_reason_too_soon && !issueloo.norenew_reason_auto_renew && !issueloo.norenew_reason_auto_too_soon %] ([% issueloo.renewsleft %] of [% issueloo.renewsallowed %] renewals remaining) [% END %] @@ -506,6 +506,9 @@ function validate1(date) { On Hold [% ELSIF ( issueloo.norenew_reason_too_many ) %] Not renewable + [% ELSIF ( issueloo.norenew_reason_auto_renew || issueloo.norenew_reason_auto_too_soon ) %] + Automatic renewal + ([% issueloo.renewsleft %] of [% issueloo.renewsallowed %] renewals remaining) [% ELSIF ( issueloo.norenew_reason_too_soon ) %] No renewal before [% issueloo.soonestrenewdate %] ([% issueloo.renewsleft %] of [% issueloo.renewsallowed %] renewals remaining) --