From 6671da35817eff21bb79231d7c4a1bc957b64c3f Mon Sep 17 00:00:00 2001 From: Lyon3 Team Date: Thu, 6 Jun 2013 16:24:22 -0400 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 --- C4/Circulation.pm | 46 +++++++++++++++++-- C4/ILSDI/Services.pm | 5 +-- circ/circulation.pl | 8 ++-- installer/data/mysql/sysprefs.sql | 1 + installer/data/mysql/updatedatabase.pl | 8 ++++ .../en/modules/admin/preferences/circulation.pref | 8 ++++ .../prog/en/modules/circ/circulation.tt | 47 ++++++++++++++++---- .../prog/en/modules/members/moremember.tt | 30 +++++++++++-- koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt | 6 ++- members/moremember.pl | 7 +-- opac/opac-renew.pl | 6 ++- opac/opac-user.pl | 11 ++++- reserve/renewscript.pl | 5 ++- 13 files changed, 159 insertions(+), 29 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 1dc7a45..8d3bee3 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -75,6 +75,7 @@ BEGIN { push @EXPORT, qw( &CanBookBeIssued &CanBookBeRenewed + &HasWhateverRenewalToBeBlocked &AddIssue &AddRenewal &GetRenewCount @@ -2466,7 +2467,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, $overduesblockrenew ) = @_; my $dbh = C4::Context->dbh; my $renews = 1; my $renewokay = 0; @@ -2475,13 +2476,15 @@ sub CanBookBeRenewed { my $borrower = C4::Members::GetMemberDetails( $borrowernumber, 0 ) or return; my $item = GetItem($itemnumber) or return; my $itemissue = GetItemIssue($itemnumber) or return; + my $overdue = $itemissue->{'overdue'}; my $branchcode = _GetCircControlBranch($item, $borrower); my $issuingrule = GetIssuingRule($borrower->{categorycode}, $item->{itype}, $branchcode); if ( ( $issuingrule->{renewalsallowed} > $itemissue->{renewals} ) || $override_limit ) { - $renewokay = 1; + $renewokay = ( $overduesblockrenew eq 'blockitem' and $overdue and !$override_limit ) ? 0 : 1; + $error = 'overdue' unless $renewokay; } else { $error = "too_many"; } @@ -2492,10 +2495,47 @@ sub CanBookBeRenewed { $renewokay = 0; $error = "on_reserve"; } - return ( $renewokay, $error ); } +=head2 HasWhateverRenewalToBeBlocked + + ($blockallitems, $reasonwhy, $overduesblockrenew) = &HasWhateverRenewalToBeBlocked($borrowernumber, $override_limit); + +Check whether whatever renewal must be blocked in the case patron is restricted or any of his documents are late. + +C<$blockallitems> if true, causes the renewal to be blocked for every items. + +C<$reasonwhy> if $blockallitems is true, will be an information displayed in checkouts table on patron page. + +C<$overduesblockrenew> is the value of the syspref OverduesBlockRenew. + +=cut + +sub HasWhateverRenewalToBeBlocked { + my $borrowernumber = shift; + my $override_limit = shift; + # get the option selected for the syspref OverduesBlockRenew + my $overduesblockrenew = C4::Context->preference('OverduesBlockRenew'); + my $blockallitems; + my $reasonwhy; + unless ( $override_limit ) { + # check if patron is restricted or if any of his documents are late + my ($memberblocked) = C4::Members::IsMemberBlocked($borrowernumber); + if ($memberblocked == 1) { + $reasonwhy = 'restriction'; + $blockallitems = 1; + } elsif ($memberblocked == -1) { + # check if renewal must be blocked for all the patron's documents on loan + if ( $overduesblockrenew eq 'blockall' ) { + $blockallitems = 1; + $reasonwhy = 'overdue'; + } + } + } + return($blockallitems,$reasonwhy,$overduesblockrenew); +} + =head2 AddRenewal &AddRenewal($borrowernumber, $itemnumber, $branch, [$datedue], [$lastreneweddate]); diff --git a/C4/ILSDI/Services.pm b/C4/ILSDI/Services.pm index dd43743..1bb3de8 100644 --- a/C4/ILSDI/Services.pm +++ b/C4/ILSDI/Services.pm @@ -561,11 +561,10 @@ sub RenewLoan { return { code => 'RecordNotFound' } unless $$item{itemnumber}; # Add renewal if possible - my @renewal = CanBookBeRenewed( $borrowernumber, $itemnumber ); + my ($blockallitems,$reasonwhy,$overduesblockrenew) = HasAnyRenewalToBeBlocked($borrowernumber,undef); + my @renewal = $blockallitems ? (0, $reasonwhy) : CanBookBeRenewed( $borrowernumber, $itemnumber, undef, $overduesblockrenew ); if ( $renewal[0] ) { AddRenewal( $borrowernumber, $itemnumber ); } - my $issue = GetItemIssue($itemnumber); - # Hashref building my $out; $out->{'renewals'} = $issue->{'renewals'}; diff --git a/circ/circulation.pl b/circ/circulation.pl index efd533e..f6bbe62 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -469,6 +469,8 @@ my $displayrelissues; our $totalprice = 0; +my ($blockallitems, $reasonwhy, $overduesblockrenew) = HasWhateverRenewalToBeBlocked($borrowernumber, undef); + sub build_issue_data { my $issueslist = shift; my $relatives = shift; @@ -484,10 +486,10 @@ 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) = $blockallitems ? (0, $reasonwhy) : CanBookBeRenewed( + $it->{'borrowernumber'},$it->{'itemnumber'}, undef, $overduesblockrenew); $it->{"renew_error_${can_renew_error}"} = 1 if defined $can_renew_error; + $it->{'blockrenewal'} = ($can_renew_error=~/overdue|restriction/) ? 1 : 0; my $restype = C4::Reserves::GetReserveStatus( $it->{'itemnumber'} ); $it->{'can_renew'} = $can_renew; $it->{'can_confirm'} = !$can_renew && !$restype; diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index 32ce6ab..2e21589 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -282,6 +282,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('OrderPdfFormat','pdfformat::layout3pages','Controls what script is used for printing (basketgroups)','','free'), ('OverdueNoticeBcc','','','Email address to bcc outgoing overdue notices sent by email','free'), ('OverduesBlockCirc','noblock','noblock|confirmation|block','When checking out an item should overdues block checkout, generate a confirmation dialogue, or allow checkout','Choice'), +('OverduesBlockRenew','allow','allow|blockitem|blockall','If any of patron checked out documents is late, should renewal be allowed, blocked only on overdue items or blocked on whatever checked out document','Choice'), ('patronimages','0',NULL,'Enable patron images for the Staff Client','YesNo'), ('PatronSelfRegistration','0',NULL,'If enabled, patrons will be able to register themselves via the OPAC.','YesNo'), ('PatronSelfRegistrationAdditionalInstructions','','','A free text field to display additional instructions to newly self registered patrons.','free'), diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 74aeb3e..1146966 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -7067,6 +7067,14 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } +$DBversion = "3.13.00.XXX"; +if ( CheckVersion($DBversion) ) { + $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OverduesBlockRenew','allow','If any of a patron 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 OverduesBlockRenew)\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 026b7fa..af278b9 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 @@ -310,6 +310,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 f19a8af..1d0383b 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -21,10 +21,12 @@ @@ -875,7 +896,7 @@ No patron matched [% message %] [% ELSE %] [% IF ( todayissue.can_confirm ) %] [% END %] @@ -964,7 +989,7 @@ No patron matched [% message %] [% ELSE %] [% IF ( previssue.can_confirm ) %] [% END %] 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 e674c3c..06c551a 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt @@ -18,6 +18,7 @@ @@ -496,7 +516,7 @@ function validate1(date) { [% IF ( issueloo.norenew ) %] [% IF ( issueloo.can_confirm ) %] [% 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 31d6c32..451d5ce 100644 --- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt +++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt @@ -191,8 +191,11 @@ var MSG_CONFIRM_RESUME_HOLDS = _("Are you sure you want to resume all suspended [% IF ( OpacRenewalAllowed ) %] [% IF ( ISSUE.status ) %][% IF ( canrenew ) %] Renew[% END %] ([% ISSUE.renewsleft %] of [% ISSUE.renewsallowed %] renewals remaining) [% ELSE %] + [% IF ( ISSUE.norenew_overdue ) %] + Renewal not allowed (overdue on a document) + [% ELSE %] Not renewable[% IF ( ISSUE.too_many ) %] ([% ISSUE.renewsleft %] of [% ISSUE.renewsallowed %] renewals remaining)[% ELSE %][% IF ( ISSUE.on_reserve ) %] (On hold)[% END %][% END %] - [% END %] + [% END %][% END %] [% END %] [% IF ( OPACFinesTab ) %] [% IF ( ISSUE.charges ) %]Yes[% ELSE %]No[% END %] @@ -335,6 +338,7 @@ var MSG_CONFIRM_RESUME_HOLDS = _("Are you sure you want to resume all suspended [% ELSIF ( OVERDUE.status ) %] [% IF ( canrenew ) %]Renew[% END %] ([% OVERDUE.renewsleft %] of [% OVERDUE.renewsallowed %] renewals remaining) [% ELSIF ( OVERDUE.onreserve ) %]On hold +[% ELSIF ( OVERDUE.norenew_overdue ) %]Renewal not allowed(overdue on a document) [% ELSE %]No renewals left [% END %] [% END %] diff --git a/members/moremember.pl b/members/moremember.pl index 7ed96d3..6448bbc 100755 --- a/members/moremember.pl +++ b/members/moremember.pl @@ -251,6 +251,8 @@ my @borrowers_with_issues; my $overdues_exist = 0; my $totalprice = 0; +my ($blockallitems, $reasonwhy, $overduesblockrenew) = HasWhateverRenewalToBeBlocked($borrowernumber, $override_limit); + my @issuedata = build_issue_data($issue); my @relissuedata = build_issue_data($relissue); @@ -506,12 +508,11 @@ sub build_issue_data { $row{'charge'} = sprintf( "%.2f", $charge ); - my ( $renewokay, $renewerror ) = - CanBookBeRenewed( $borrowernumber, $issue->{itemnumber}, - $override_limit ); + my ( $renewokay, $renewerror ) = $blockallitems ? (0, $reasonwhy) : CanBookBeRenewed( $borrowernumber, $issue->{itemnumber}, $override_limit, $overduesblockrenew ); $row{'norenew'} = !$renewokay; $row{'can_confirm'} = ( !$renewokay && $renewerror ne 'on_reserve' ); $row{"norenew_reason_$renewerror"} = 1 if $renewerror; + $row{'blockrenewal'} = ($renewerror=~ /overdue|restriction/) ? 1 : 0; $row{renew_failed} = $renew_failed{ $issue->{itemnumber} }; $row{return_failed} = $return_failed{ $issue->{barcode} }; push( @{$localissue}, \%row ); diff --git a/opac/opac-renew.pl b/opac/opac-renew.pl index c699b35..08e44f9 100755 --- a/opac/opac-renew.pl +++ b/opac/opac-renew.pl @@ -46,8 +46,12 @@ my @items = $query->param('item'); my $opacrenew = C4::Context->preference("OpacRenewalAllowed"); my $errorstring=''; + +my ($blockallitems, $reasonwhy, $overduesblockrenew) = HasWhateverRenewalToBeBlocked($borrowernumber, $override_limit); + for my $itemnumber ( @items ) { - my ($status,$error) = CanBookBeRenewed( $borrowernumber, $itemnumber ); + + my ($status,$error) = $blockallitems ? (0, $reasonwhy) : CanBookBeRenewed( $borrowernumber, $itemnumber, undef, $overduesblockrenew ); if ( $status == 1 && $opacrenew == 1 ) { my $renewalbranch = C4::Context->preference('OpacRenewalBranch'); my $branchcode; diff --git a/opac/opac-user.pl b/opac/opac-user.pl index 5c01ae2..43da3ed 100755 --- a/opac/opac-user.pl +++ b/opac/opac-user.pl @@ -155,6 +155,10 @@ my @overdues; my @issuedat; my $itemtypes = GetItemTypes(); my $issues = GetPendingIssues($borrowernumber); + + +my ($blockallitems, $reasonwhy, $overduesblockrenew) = HasWhateverRenewalToBeBlocked($borrowernumber, undef); + if ($issues){ foreach my $issue ( sort { $b->{date_due}->datetime() cmp $a->{date_due}->datetime() } @{$issues} ) { # check for reserves @@ -178,11 +182,12 @@ if ($issues){ $issue->{'charges'} = $charges; # check if item is renewable - my ($status,$renewerror) = CanBookBeRenewed( $borrowernumber, $issue->{'itemnumber'} ); + my ($status,$renewerror) = $blockallitems ? (0, $reasonwhy) : CanBookBeRenewed( $borrowernumber, $issue->{'itemnumber'}, undef, $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'; @@ -218,12 +223,16 @@ if ($issues){ } } } + +$canrenew = 0 if ($overduesblockrenew ne 'allow' and $overdues_count == $count); + $template->param( ISSUES => \@issuedat ); $template->param( issues_count => $count ); $template->param( canrenew => $canrenew ); $template->param( OVERDUES => \@overdues ); $template->param( overdues_count => $overdues_count ); + my $show_barcode = C4::Members::AttributeTypes::AttributeTypeExists( ATTRIBUTE_SHOW_BARCODE ); if ($show_barcode) { my $patron_show_barcode = GetBorrowerAttributeValue($borrowernumber, ATTRIBUTE_SHOW_BARCODE); diff --git a/reserve/renewscript.pl b/reserve/renewscript.pl index 9293cb5..ea7ae3e 100755 --- a/reserve/renewscript.pl +++ b/reserve/renewscript.pl @@ -81,11 +81,12 @@ my $borrowernumber = $input->param("borrowernumber"); my $exemptfine = $input->param("exemptfine") || 0; my $override_limit = $input->param("override_limit") || 0; my $failedrenews = q{}; +my ($blockallitems, $reasonwhy, $overduesblockrenew) = HasWhateverRenewalToBeBlocked($borrowernumber, $override_limit); + foreach my $itemno (@data) { # check status before renewing issue - my ( $renewokay, $error ) = - CanBookBeRenewed( $borrowernumber, $itemno, $override_limit ); + my ( $renewokay, $error ) = $blockallitems ? (0, $reasonwhy) : CanBookBeRenewed( $borrowernumber, $itemno, $override_limit, $overduesblockrenew ); if ($renewokay) { AddRenewal( $borrowernumber, $itemno, $branch, $datedue ); } -- 1.7.10.4