From 8b14c15f47850055d50d0f67ba3aea154bf82912 Mon Sep 17 00:00:00 2001 From: Lyon3 Team <koha@univ-lyon3.fr> Date: Mon, 19 Nov 2012 12:09:02 +0100 Subject: [PATCH] Bug 8236 Block renewing for overdue items If any of patron's document is late, renewal can be allowed, blocked on every checked out items or only on overdue ones. The renewal remains nevertheless possible for the librarian checking the Override renewal limit Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> --- C4/Circulation.pm | 5 +++-- C4/ILSDI/Services.pm | 14 +++++++++++--- circ/circulation.pl | 12 +++++++++--- installer/data/mysql/sysprefs.sql | 1 + installer/data/mysql/updatedatabase.pl | 7 +++++++ .../en/modules/admin/preferences/circulation.pref | 8 ++++++++ .../prog/en/modules/circ/circulation.tt | 12 ++++++++++-- .../prog/en/modules/members/moremember.tt | 7 ++++++- koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt | 6 +++++- members/moremember.pl | 11 ++++++++--- opac/opac-user.pl | 10 +++++++++- 11 files changed, 77 insertions(+), 16 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 71fe20f..626cca5 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2424,7 +2424,7 @@ already renewed the loan. $error will contain the reason the renewal can not pro sub CanBookBeRenewed { # check renewal status - my ( $borrowernumber, $itemnumber, $override_limit ) = @_; + my ( $borrowernumber, $itemnumber, $override_limit, $overdue, $overduesblockrenew ) = @_; my $dbh = C4::Context->dbh; my $renews = 1; my $renewokay = 0; @@ -2473,7 +2473,8 @@ sub CanBookBeRenewed { if ( my $data1 = $sthcount->fetchrow_hashref ) { if ( ( $data1->{renewalsallowed} && $data1->{renewalsallowed} > $data1->{renewals} ) || $override_limit ) { - $renewokay = 1; + $renewokay = ($overduesblockrenew eq 'blockitem' and $overdue and !$override_limit)? 0 : 1; + $error = 'overdue' unless $renewokay; } else { $error="too_many"; diff --git a/C4/ILSDI/Services.pm b/C4/ILSDI/Services.pm index 68cbdb3..678b727 100644 --- a/C4/ILSDI/Services.pm +++ b/C4/ILSDI/Services.pm @@ -561,10 +561,18 @@ sub RenewLoan { return { code => 'RecordNotFound' } unless $$item{itemnumber}; # Add renewal if possible - my @renewal = CanBookBeRenewed( $borrowernumber, $itemnumber ); - if ( $renewal[0] ) { AddRenewal( $borrowernumber, $itemnumber ); } - my $issue = GetItemIssue($itemnumber); + # Check for overdue on this document + my $dt_due = $issue->{'date_due'}->truncate( to => 'day' ); + my $dt_today = DateTime->now( time_zone => C4::Context->tz() ); + my $overdue = 1 if DateTime->compare( $dt_today,$dt_due ) == 1; + # Check if any of patron's documents is late + my ($memberblocked) = C4::Members::IsMemberBlocked($borrowernumber); + # Is renewal allowed on overdue documents ? + my $overduesblockrenew = C4::Context->preference('OverduesBlockRenew'); + my $norenewal = 1 if ( $overduesblockrenew eq 'blockall' and $memberblocked == -1 ) or ( $overduesblockrenew eq 'blockitem' and $overdue ) or $memberblocked == 1;# last to check if patron is restricted + my @renewal = $norenewal ? (0,'overdue') : CanBookBeRenewed( $borrowernumber, $itemnumber ); + if ( $renewal[0] ) { AddRenewal( $borrowernumber, $itemnumber ); } # Hashref building my $out; diff --git a/circ/circulation.pl b/circ/circulation.pl index 91fd1a2..4361c4b 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -429,6 +429,13 @@ my $displayrelissues; our $totalprice = 0; +# Check if any of patron's documents is late +my ($memberblocked) = C4::Members::IsMemberBlocked($borrowernumber); +# and if renewal is allowed in that case +my $overduesblockrenew = C4::Context->preference('OverduesBlockRenew'); +my $norenewal = 1 if $overduesblockrenew eq 'blockall' and $memberblocked == -1; +$template->param( norenewal => 1 ) if $overduesblockrenew ne 'allow'; + sub build_issue_data { my $issueslist = shift; my $relatives = shift; @@ -444,9 +451,8 @@ sub build_issue_data { $it->{'itemnumber'}, $it->{'borrowernumber'} ); $it->{'charge'} = sprintf("%.2f", $it->{'charge'}); - my ($can_renew, $can_renew_error) = CanBookBeRenewed( - $it->{'borrowernumber'},$it->{'itemnumber'} - ); + my ($can_renew, $can_renew_error) = $norenewal ? (0, 'overdue') : CanBookBeRenewed( + $it->{'borrowernumber'},$it->{'itemnumber'}, undef, $it->{'overdue'}, $overduesblockrenew); $it->{"renew_error_${can_renew_error}"} = 1 if defined $can_renew_error; my ( $restype, $reserves, undef ) = CheckReserves( $it->{'itemnumber'} ); $it->{'can_renew'} = $can_renew; diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index d5d15d7..6633987 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -406,3 +406,4 @@ INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES(' INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('NotesBlacklist','','List of notes fields that should not appear in the title notes/description separator of details',NULL,'free'); INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('SCOUserCSS', '', NULL, 'Add CSS to be included in the SCO module in an embedded <style> tag.', 'free'); INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('SCOUserJS', '', NULL, 'Define custom javascript for inclusion in the SCO module', 'free'); +INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OverduesBlockRenew','allow','If any of patron\'s checked out documents is late, should renewal be allowed, blocked only on overdue items or blocked on whatever checked out document','allow|blockitem|blockall','Choice'); diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 77265f4..49f0275 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -6339,6 +6339,13 @@ if ( CheckVersion($DBversion) ) { SetVersion ($DBversion); } +$DBversion = "3.11.00.XXX"; +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OverduesBlockRenew','allow','If any of a patron\\'s checked out documents is late, should renewal be allowed, blocked only on overdue items or blocked on whatever checked out document','allow|blockitem|blockall','Choice')"); + print "Upgrade to $DBversion done (Add system preference BlockRenewal ))\n"; + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref index 645b19b..3d0d3ce 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -286,6 +286,14 @@ Circulation: confirmation: Ask for confirmation - when checking out to a borrower that has overdues outstanding - + - If any of a patron's checked out items are late, + - pref: OverduesBlockRenew + type: choice + choices: + allow: allow renewing of items. + blockall: block renewing for all items. + blockitem: block renewing only for overdue items. + - - On checkin route the returned item to - pref: HomeOrHoldingBranchReturn type: choice diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt index 9c045cd..ea07934 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -812,7 +812,7 @@ No patron matched <span class="ex">[% message %]</span> <td><span style="padding: 0 1em;">[% IF ( todayissue.renewals ) %][% todayissue.renewals %][% ELSE %]0[% END %]</span> [% IF ( todayissue.can_renew ) %] <input type="checkbox" name="all_items[]" value="[% todayissue.itemnumber %]" checked="checked" style="display: none;" /> - [% IF ( todayissue.od ) %] + [% IF ( todayissue.od and !previssue.renew_error_overdue ) %] <input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" checked="checked" /> [% ELSE %] <input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" /> @@ -834,6 +834,9 @@ No patron matched <span class="ex">[% message %]</span> [% IF ( todayissue.renew_error_too_many ) %] Not renewable [% END %] + [% IF ( todayissue.renew_error_overdue ) %] + Renewal not allowed (overdue) + [% END %] [% IF ( todayissue.can_confirm ) %] </span> [% END %] @@ -893,7 +896,7 @@ No patron matched <span class="ex">[% message %]</span> <td><span style="padding: 0 1em;">[% IF ( previssue.renewals ) %][% previssue.renewals %][% ELSE %]0[% END %]</span> [% IF ( previssue.can_renew ) %] <input type="checkbox" name="all_items[]" value="[% previssue.itemnumber %]" checked="checked" style="display: none;" /> - [% IF ( previssue.od ) %] + [% IF ( previssue.od and !previssue.renew_error_overdue ) %] <input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" checked="checked" /> [% ELSE %] <input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" /> @@ -915,6 +918,9 @@ No patron matched <span class="ex">[% message %]</span> [% IF ( previssue.renew_error_too_many ) %] Not renewable [% END %] + [% IF ( previssue.renew_error_overdue ) %] + Renewal not allowed (overdue) + [% END %] [% IF ( previssue.can_confirm ) %] </span> [% END %] @@ -954,7 +960,9 @@ No patron matched <span class="ex">[% message %]</span> [% END %] [% END %] <input type="submit" name="renew_checked" value="Renew or Return checked items" /> + [% UNLESS ( norenewal ) %] <input type="submit" id="renew_all" name="renew_all" value="Renew all" /> + [% END %] [% IF export_remove_fields OR export_with_csv_profile %] <br/><br/> Don't export fields : <input type="text" id="export_remove_fields" name="export_remove_fields" value="[% export_remove_fields %]" title="Use for iso2709 exports" /> diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt index 4e6271f..c3d5162 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt @@ -475,7 +475,7 @@ function validate1(date) { [% IF ( issueloo.norenew ) %] [% IF ( issueloo.can_confirm ) %]<span class="renewals-allowed" style="display: none"> <input type="checkbox" name="all_items[]" value="[% issueloo.itemnumber %]" checked="checked" style="display: none;" /> - [% IF ( issueloo.od ) %] + [% IF ( issueloo.od and !issueloo.norenew_reason_overdue ) %] <input type="checkbox" name="items[]" value="[% issueloo.itemnumber %]" checked="checked" /> [% ELSE %] <input type="checkbox" name="items[]" value="[% issueloo.itemnumber %]" /> @@ -483,6 +483,9 @@ function validate1(date) { </span> <span class="renewals-disabled"> [% END %] + [% IF ( issueloo.norenew_reason_overdue ) %] + Renewal not allowed (overdue) + [% END %] [% IF ( issueloo.norenew_reason_on_reserve ) %] <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% issueloo.biblionumber %]">On Hold</a> [% END %] @@ -525,7 +528,9 @@ function validate1(date) { [% END %] [% END %] <input type="submit" name="renew_checked" value="Renew or return checked items" /> + [% UNLESS ( norenewal ) %] <input type="submit" id="renew_all" name="renew_all" value="Renew all" /> + [% END %] </fieldset> [% ELSE %]<p>Patron has nothing checked out.</p> [% END %] diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt index c28d84f..e022b9a 100644 --- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt +++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt @@ -186,8 +186,11 @@ $.tablesorter.addParser({ [% IF ( OpacRenewalAllowed ) %] <td class="renew">[% IF ( ISSUE.status ) %][% IF ( canrenew ) %]<input type="checkbox" name="item" value="[% ISSUE.itemnumber %]"/> <a href="/cgi-bin/koha/opac-renew.pl?from=opac_user&item=[% ISSUE.itemnumber %]&borrowernumber=[% ISSUE.borrowernumber %]">Renew</a>[% END %] <span class="renewals">([% ISSUE.renewsleft %] of [% ISSUE.renewsallowed %] renewals remaining)</span> [% ELSE %] + [% IF ( ISSUE.norenew_overdue ) %] + Renewal not allowed <span class="renewals">(overdue on a document)</span> + [% ELSE %] Not renewable[% IF ( ISSUE.too_many ) %] <span class="renewals">([% ISSUE.renewsleft %] of [% ISSUE.renewsallowed %] renewals remaining)</span>[% ELSE %][% IF ( ISSUE.on_reserve ) %] <span class="renewals">(On hold)</span>[% END %][% END %] - [% END %]</td> + [% END %][% END %]</td> [% END %] [% IF ( OPACFinesTab ) %] <td class="fines">[% IF ( ISSUE.charges ) %]Yes[% ELSE %]No[% END %]</td> @@ -330,6 +333,7 @@ $.tablesorter.addParser({ [% ELSIF ( OVERDUE.status ) %] [% IF ( canrenew ) %]<a href="/cgi-bin/koha/opac-renew.pl?from=opac_user&item=[% OVERDUE.itemnumber %]&bornum=[% OVERDUE.borrowernumber %]">Renew</a>[% END %] <span class="renewals">([% OVERDUE.renewsleft %] of [% OVERDUE.renewsallowed %] renewals remaining)</span> [% ELSIF ( OVERDUE.onreserve ) %]On hold +[% ELSIF ( OVERDUE.norenew_overdue ) %]Renewal not allowed<span class="renewals">(overdue on a document)</span> [% ELSE %]No renewals left [% END %] </td>[% END %] diff --git a/members/moremember.pl b/members/moremember.pl index 3928286..68ba148 100755 --- a/members/moremember.pl +++ b/members/moremember.pl @@ -258,6 +258,13 @@ my @borrowers_with_issues; my $overdues_exist = 0; my $totalprice = 0; +# Check if any of patron's documents is late +my ($memberblocked)=C4::Members::IsMemberBlocked($borrowernumber); +# and if renewal is allowed in that case +my $overduesblockrenew = C4::Context->preference('OverduesBlockRenew'); +my $norenewal = 1 if $overduesblockrenew eq 'blockall' and $memberblocked == -1; +$template->param( norenewal => 1 ) if $overduesblockrenew ne 'allow'; + my @issuedata = build_issue_data($issue); my @relissuedata = build_issue_data($relissue); @@ -513,9 +520,7 @@ sub build_issue_data { $row{'charge'} = sprintf( "%.2f", $charge ); - my ( $renewokay, $renewerror ) = - CanBookBeRenewed( $borrowernumber, $issue->{itemnumber}, - $override_limit ); + my ( $renewokay, $renewerror ) = $norenewal ? (0, 'overdue') : CanBookBeRenewed( $borrowernumber, $issue->{itemnumber}, $override_limit, $issue->{overdue}, $overduesblockrenew ); $row{'norenew'} = !$renewokay; $row{'can_confirm'} = ( !$renewokay && $renewerror ne 'on_reserve' ); $row{"norenew_reason_$renewerror"} = 1 if $renewerror; diff --git a/opac/opac-user.pl b/opac/opac-user.pl index 1c942d5..b9fb5b7 100755 --- a/opac/opac-user.pl +++ b/opac/opac-user.pl @@ -153,6 +153,13 @@ my @overdues; my @issuedat; my $itemtypes = GetItemTypes(); my $issues = GetPendingIssues($borrowernumber); + +# Check if any of patron's documents is late +my ($memberblocked) = C4::Members::IsMemberBlocked($borrowernumber); +# and if renewal is allowed in that case +my $overduesblockrenew = C4::Context->preference('OverduesBlockRenew'); +my $norenewal = 1 if $overduesblockrenew eq 'blockall' and $memberblocked == -1; + if ($issues){ foreach my $issue ( sort { $b->{date_due}->datetime() cmp $a->{date_due}->datetime() } @{$issues} ) { # check for reserves @@ -179,11 +186,12 @@ if ($issues){ $issue->{$publictype} = 1; # check if item is renewable - my ($status,$renewerror) = CanBookBeRenewed( $borrowernumber, $issue->{'itemnumber'} ); + my ($status,$renewerror) = $norenewal ? (0, 'overdue') : CanBookBeRenewed( $borrowernumber, $issue->{'itemnumber'}, undef, $issue->{'overdue'}, $overduesblockrenew); ($issue->{'renewcount'},$issue->{'renewsallowed'},$issue->{'renewsleft'}) = GetRenewCount($borrowernumber, $issue->{'itemnumber'}); if($status && C4::Context->preference("OpacRenewalAllowed")){ $issue->{'status'} = $status; } + $issue->{'norenew_overdue'} = 1 if $renewerror and $renewerror eq 'overdue'; $issue->{'too_many'} = 1 if $renewerror and $renewerror eq 'too_many'; $issue->{'on_reserve'} = 1 if $renewerror and $renewerror eq 'on_reserve'; -- 1.7.2.5