From 6671da35817eff21bb79231d7c4a1bc957b64c3f Mon Sep 17 00:00:00 2001
From: Lyon3 Team <koha@univ-lyon3.fr>
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 @@
 <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery-ui-timepicker-addon.js"></script>
 <script type="text/javascript">
 //<![CDATA[
+
 [% IF ( UseTablesortForCirc && dateformat == 'metric' ) %]dt_add_type_uk_date();[% END %]
 [% IF ( borrowernumber ) %]if($.cookie("holdfor") != [% borrowernumber %]){ $.cookie("holdfor",null, { path: "/", expires: 0 }); }[% ELSE %]$.cookie("holdfor",null, { path: "/", expires: 0 });[% END %]
 [% UNLESS ( borrowernumber ) %][% UNLESS ( CGIselectborrower ) %]window.onload=function(){ $('#findborrower').focus(); };[% END %][% END %]
 	 $(document).ready(function() {
+        $(function(){ hiderenew() });
         $('#patronlists').tabs([% IF ( UseTablesortForCirc ) %]{
             // Correct table sizing for tables hidden in tabs
             // http://www.datatables.net/examples/api/tabs_and_scrolling.html
@@ -68,8 +70,12 @@
         $( '#override_limit' ).click( function () {
             if ( this.checked ) {
                 $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide();
+                $("input[name='renew_checked']").val('Renew or Return checked items');
+                $("input[name='renew_all']").css('display','inline');
+
             } else {
                 $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show();
+                hiderenew();
             }
         } ).attr( 'checked', false );
         [% END %][% IF ( CircAutoPrintQuickSlip ) %]
@@ -79,7 +85,6 @@
             return printx_window('qslip'); }
         });[% END %]
 
-
 var allcheckboxes = $(".checkboxed");
 	$("#renew_all").click(function(){
 		$(allcheckboxes).checkCheckboxes(":input[name*=items]"); 
@@ -236,6 +241,22 @@ function validate1(date) {
         return false;
      }
 };
+
+function hiderenew () {
+    var valid=false;
+    $("input[name^=items]").parent().each(function(){
+        if($(this).css('display') !='none'){
+            valid = true;
+            return;
+        }
+    });
+    if(!valid){
+        $("input[name='renew_checked']").val('Return checked items');
+        $("input[name='renew_all']").css('display','none');
+    }
+    return;
+};
+
 //]]>
 </script>
 </head>
@@ -875,7 +896,7 @@ No patron matched <span class="ex">[% message %]</span>
         [% ELSE %]
             [% IF ( todayissue.can_confirm ) %]<span class="renewals-allowed" style="display: none">
                 <input type="checkbox" name="all_items[]" value="[% todayissue.itemnumber %]" checked="checked" style="display: none;" />
-                [% IF ( todayissue.od ) %]
+                [% IF ( todayissue.od and !todayissue.blockrenewal ) %]
                     <input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" checked="checked" />
                 [% ELSE %]
                     <input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" />
@@ -886,9 +907,13 @@ No patron matched <span class="ex">[% message %]</span>
 		[% IF ( todayissue.renew_error_on_reserve ) %]
             <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% todayissue.biblionumber %]">On hold</a>
 		[% END %]
-                [% IF ( todayissue.renew_error_too_many ) %]
-            Not renewable
-                [% END %]
+            [% IF ( todayissue.renew_error_restriction ) %]
+                Renewal not allowed (restriction)
+            [% ELSIF ( todayissue.renew_error_overdue ) %]
+                Renewal not allowed (overdue)
+            [% ELSIF ( todayissue.renew_error_too_many ) %]
+                Not renewable
+            [% END %]
             [% IF ( todayissue.can_confirm ) %]
                 </span>
             [% END %]
@@ -964,7 +989,7 @@ No patron matched <span class="ex">[% message %]</span>
         [% ELSE %]
             [% IF ( previssue.can_confirm ) %]<span class="renewals-allowed" style="display: none">
                 <input type="checkbox" name="all_items[]" value="[% previssue.itemnumber %]" checked="checked" style="display: none;" />
-                [% IF ( previssue.od ) %]
+                [% IF ( previssue.od and !previssue.blockrenewal ) %]
                     <input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" checked="checked" />
                 [% ELSE %]
                     <input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" />
@@ -975,9 +1000,13 @@ No patron matched <span class="ex">[% message %]</span>
 		[% IF ( previssue.renew_error_on_reserve ) %]
             <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% previssue.biblionumber %]">On hold</a>
 		[% END %]
-                [% IF ( previssue.renew_error_too_many ) %]
-            Not renewable
-                [% END %]
+            [% IF ( previssue.renew_error_restriction ) %]
+                Renewal not allowed (restriction)
+            [% ELSIF ( previssue.renew_error_overdue ) %]
+                Renewal not allowed (overdue)
+            [% ELSIF ( previssue.renew_error_too_many ) %]
+                Not renewable
+            [% END %]
             [% IF ( previssue.can_confirm ) %]
                 </span>
             [% 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 @@
 <script type="text/JavaScript">
 //<![CDATA[
 $(document).ready(function() {
+    $(function(){ hiderenew() });
     $('#finesholdsissues').tabs({
         // Correct table sizing for tables hidden in tabs
         // http://www.datatables.net/examples/api/tabs_and_scrolling.html
@@ -85,8 +86,11 @@ $(document).ready(function() {
     $( '#override_limit' ).click( function () {
         if ( this.checked ) {
            $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide();
+           $("input[name='renew_checked']").val('Renew or Return checked items');
+           $("input[name='renew_all']").css('display','inline');
         } else {
            $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show();
+           hiderenew();
         }
     } ).attr( 'checked', false );
     [% END %]
@@ -141,6 +145,22 @@ function validate1(date) {
         return false;
      }
 };
+
+function hiderenew () {
+    var valid=false;
+    $("input[name^=items]").parent().each(function(){
+        if($(this).css('display') !='none'){
+            valid = true;
+            return;
+        }
+    });
+    if(!valid){
+        $("input[name='renew_checked']").val('Return checked items');
+        $("input[name='renew_all']").css('display','none');
+    }
+    return;
+};
+
 //]]>
 </script>
 
@@ -496,7 +516,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.blockrenewal ) %]
                         <input type="checkbox" name="items[]" value="[% issueloo.itemnumber %]" checked="checked" />
                     [% ELSE %]
                         <input type="checkbox" name="items[]" value="[% issueloo.itemnumber %]" />
@@ -507,9 +527,13 @@ function validate1(date) {
                 [% IF ( issueloo.norenew_reason_on_reserve ) %]
                 <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% issueloo.biblionumber %]">On Hold</a>
                 [% END %]
-                    [% IF ( issueloo.norenew_reason_too_many ) %]
+                [% IF ( issueloo.norenew_reason_restriction ) %]
+                    Renewal not allowed (restriction)
+                [% ELSIF ( issueloo.norenew_reason_overdue ) %]
+                    Renewal not allowed (overdue)
+                [% ELSIF ( issueloo.norenew_reason_too_many ) %]
                         Not renewable
-                    [% END %]
+                [% END %]
                 [% IF ( issueloo.can_confirm ) %]
                     </span>
                 [% 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 ) %]
                     <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&amp;item=[% ISSUE.itemnumber %]&amp;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>
@@ -335,6 +338,7 @@ var MSG_CONFIRM_RESUME_HOLDS  = _("Are you sure you want to resume all suspended
 [% ELSIF ( OVERDUE.status ) %]
 [% IF ( canrenew ) %]<a href="/cgi-bin/koha/opac-renew.pl?from=opac_user&amp;item=[% OVERDUE.itemnumber %]&amp;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 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