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" %] + +
  • The patron has a debt of [% balance | $Price %].
  • +
    + + + +
    [% ELSIF error == "on_reserve" %]

    [% 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 => {