Bug 23415: Notify patron fines when renewing

It is possible to renew items for patron who has fines over accepted
limit on renew page or from checkout list. This patch adds confirmation
alerts to these renew actions when patron has fines over
"noissuescharge" syspref.

Test plan:
1. Have patron with checkouts and fines over allowed limit
2. Renew checkouts either from renew page or checkout list
=> renew is successful
3. Apply patch
4. Repeat steps 1 and 2
=> On renew page an alert is displayed and user has to confirm
renew
=> When renew is done from checkout list confirmation pop-up
is displayed

Sponsored-by: Koha-Suomi Oy
Signed-off-by: Shi Yao Wang <shi-yao.wang@inlibro.com>
Signed-off-by: Andrew Fuerste Henry <andrew@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
This commit is contained in:
Emmi Takkinen 2024-09-17 10:54:32 +03:00 committed by Martin Renvoize
parent b91ff527a2
commit 2589c5ef9d
No known key found for this signature in database
GPG Key ID: 2D86E0EAEC83711B
7 changed files with 52 additions and 2 deletions

View File

@ -293,7 +293,7 @@ if ($patron) {
$template->param(
overduecount => $overdues->count,
issuecount => $issues->count,
finetotal => $balance,
fines => $balance,
);
if ( $patron and $patron->is_debarred ) {

View File

@ -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,
);
}

View File

@ -656,6 +656,7 @@ OPAC:
- pref: OPACFineNoRenewals
class: currency
- '[% local_currency %] in charges (leave blank to disable).'
- <br /><strong>NOTE:</strong> If set, confirmation dialog is shown when renewing for patron with charges from staff interface.'
-
- pref: OPACFineNoRenewalsIncludeCredits
choices:

View File

@ -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");

View File

@ -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 @@
<button type="submit" class="btn btn-default approve"><i class="fa fa-check"></i> Override limit and renew</button>
</form>
[% END %]
[% ELSIF error == "too_much_debt" %]
<li>The patron has a debt of [% balance | $Price %].</li>
<form method="post" action="/cgi-bin/koha/circ/renew.pl">
<input type="hidden" name="barcode" value="[% item.barcode | html %]"/>
<input type="hidden" name="override_debt" value="1" />
<button type="submit" class="approve"><i class="fa fa-check"></i>Renew checkout(s)</button>
</form>
[% ELSIF error == "on_reserve" %]
<p>[% INCLUDE 'biblio-title.inc' biblio=item.biblio link = 1 %] ( [% item.barcode | html %] ): This item is on hold for another patron.</p>
@ -164,6 +173,7 @@
<p>Item cannot be renewed because it's an onsite checkout</p>
[% ELSIF error == 'recalled' %]
<p>This item has been recalled.</p>
[% ELSE %]
[% error | html %]

View File

@ -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[]"){

View File

@ -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("<img id='renew_" + item_id+ "' src='" + interface + "/" + theme + "/img/spinner-small.gif' />");
const client = APIClient.circulation;
return client.checkouts.renew(params).then(
success => {