diff --git a/circ/circulation.pl b/circ/circulation.pl
index dddd2a1f5f..1e319d88dd 100755
--- a/circ/circulation.pl
+++ b/circ/circulation.pl
@@ -293,7 +293,7 @@ if ($patron) {
$template->param(
overduecount => $overdues->count,
issuecount => $issues->count,
- finetotal => $balance,
+ fines => $balance,
);
if ( $patron and $patron->is_debarred ) {
diff --git a/circ/renew.pl b/circ/renew.pl
index 523070ad52..fc527ee997 100755
--- a/circ/renew.pl
+++ b/circ/renew.pl
@@ -27,6 +27,7 @@ use C4::Circulation qw( barcodedecode CanBookBeRenewed GetLatestAutoRenewDate Ad
use Koha::DateUtils qw( dt_from_string );
use Koha::Database;
use Koha::BiblioFrameworks;
+use Koha::Patrons;
my $cgi = CGI->new;
@@ -47,11 +48,12 @@ my $unseen = $cgi->param('unseen') || 0;
$barcode = barcodedecode($barcode) if $barcode;
my $override_limit = $cgi->param('override_limit');
my $override_holds = $cgi->param('override_holds');
+my $override_debt = $cgi->param('override_debt');
my $hard_due_date = $cgi->param('hard_due_date');
my ( $item, $checkout, $patron );
my $error = q{};
-my ( $soonest_renew_date, $latest_auto_renew_date );
+my ( $soonest_renew_date, $latest_auto_renew_date, $balance );
if ( $op eq 'cud-renew' && $barcode ) {
$barcode = barcodedecode($barcode) if $barcode;
@@ -66,6 +68,9 @@ if ( $op eq 'cud-renew' && $barcode ) {
$patron = $checkout->patron;
my $borrowernumber = $patron->borrowernumber;
+ $balance = $patron->account->balance;
+ my $amountlimit = C4::Context->preference("OPACFineNoRenewals");
+
if ( ( $patron->is_debarred || q{} ) lt dt_from_string()->ymd() ) {
my $confirmations;
my $can_renew;
@@ -92,6 +97,16 @@ if ( $op eq 'cud-renew' && $barcode ) {
$checkout,
);
}
+
+ if ( $balance > $amountlimit ) {
+ $error = "too_much_debt";
+ $can_renew = 0;
+ if ($override_debt) {
+ $can_renew = 1;
+ $error = undef;
+ }
+ }
+
if ($can_renew) {
my $branchcode = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
my $date_due =
@@ -127,6 +142,7 @@ if ( $op eq 'cud-renew' && $barcode ) {
error => $error,
soonestrenewdate => $soonest_renew_date,
latestautorenewdate => $latest_auto_renew_date,
+ balance => $balance,
);
}
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref
index 7e038fad75..b81af3e1bc 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref
@@ -656,6 +656,7 @@ OPAC:
- pref: OPACFineNoRenewals
class: currency
- '[% local_currency %] in charges (leave blank to disable).'
+ -
NOTE: If set, confirmation dialog is shown when renewing for patron with charges from staff interface.'
-
- pref: OPACFineNoRenewalsIncludeCredits
choices:
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 a28891dc14..a7e58cd309 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt
@@ -1133,6 +1133,10 @@
[% UNLESS ( patron.borrowernumber ) %]window.onload=function(){ $('#findborrower').focus(); };[% END %]
+ var amountlimit = "[% Koha.Preference('OPACFineNoRenewals') | html %]";
+ var fines = "[% fines | $Price %]";
+ var MSG_CONFIRM_RENEW = _("The patron has a debt of %s\nAre you sure you want to renew checkout(s)?").format(fines);
+
// On-site checkout
function toggle_onsite_checkout(){
const duedatespec = document.querySelector("#duedatespec");
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/renew.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/renew.tt
index 90659df0e2..3ea9b86281 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/renew.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/renew.tt
@@ -2,6 +2,7 @@
[% USE Asset %]
[% USE Koha %]
[% USE KohaDates %]
+[% USE Price %]
[% PROCESS 'i18n.inc' %]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
@@ -138,6 +139,14 @@
[% END %]
+ [% ELSIF error == "too_much_debt" %]
+
+
[% INCLUDE 'biblio-title.inc' biblio=item.biblio link = 1 %] ( [% item.barcode | html %] ): This item is on hold for another patron.
@@ -164,6 +173,7 @@Item cannot be renewed because it's an onsite checkout
[% ELSIF error == 'recalled' %]This item has been recalled.
+ [% ELSE %] [% error | html %] 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 69ea88ae52..0895e3acf0 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt @@ -861,6 +861,10 @@ CAN_user_circulate_manage_bookings = [% CAN_user_circulate_manage_bookings | $raw %] patron_borrowernumber = [% patron.borrowernumber | $raw %] + var amountlimit = "[% Koha.Preference('OPACFineNoRenewals') | html %]"; + var fines = "[% fines | $Price %]"; + var MSG_CONFIRM_RENEW = _("The patron has a debt of %s\n Are you sure you want to renew checkout(s)?").format(fines); + function uncheck_sibling(me){ nodename=me.getAttribute("name"); if (nodename =="barcodes[]"){ diff --git a/koha-tmpl/intranet-tmpl/prog/js/checkouts.js b/koha-tmpl/intranet-tmpl/prog/js/checkouts.js index 90ebf4dbeb..51cb9a2324 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/checkouts.js +++ b/koha-tmpl/intranet-tmpl/prog/js/checkouts.js @@ -796,6 +796,8 @@ if (AlwaysLoadCheckoutsTable) { $(document).ready(function () { var onHoldDueDateSet = false; + var show_confirm = true; + var onHoldChecked = function () { var isChecked = false; $("input[data-on-reserve]").each(function () { @@ -985,6 +987,16 @@ $(document).ready(function () { $("#RenewChecked").on("click", function (e) { e.preventDefault(); let refresh_table = true; + + if(show_confirm && parseFloat(fines) > parseFloat(amountlimit) ) { + var result = confirm(MSG_CONFIRM_RENEW); + if(!result){ + return false; + } + // Prevent displaying confirm box again + show_confirm = false; + } + function renew(item_id) { var override_limit = $("#override_limit").is(":checked") ? 1 : 0; @@ -1020,6 +1032,9 @@ $(document).ready(function () { params.date_due = dueDate; } + + $(this).parent().parent().replaceWith("
");
+
const client = APIClient.circulation;
return client.checkouts.renew(params).then(
success => {
");
+
const client = APIClient.circulation;
return client.checkouts.renew(params).then(
success => {