@@ -, +, @@ guarantor's guarantees --- C4/Circulation.pm | 37 ++++++++++++++++++ C4/Members.pm | 31 +++++++++++++-- Koha/Borrower.pm | 6 +++ circ/circulation.pl | 15 ++++++++ installer/data/mysql/atomicupdate/bug_14577.sql | 2 + installer/data/mysql/sysprefs.sql | 1 + .../en/modules/admin/preferences/circulation.pref | 5 +++ .../prog/en/modules/circ/circulation.tt | 44 +++++++++++++++------- 8 files changed, 123 insertions(+), 18 deletions(-) create mode 100644 installer/data/mysql/atomicupdate/bug_14577.sql --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -53,6 +53,7 @@ use Koha::Borrower::Debarments; use Koha::Database; use Carp; use List::MoreUtils qw( uniq ); +use Scalar::Util qw( looks_like_number ); use Date::Calc qw( Today Today_and_Now @@ -840,9 +841,44 @@ sub CanBookBeIssued { # DEBTS my ($balance, $non_issue_charges, $other_charges) = C4::Members::GetMemberAccountBalance( $borrower->{'borrowernumber'} ); + my $amountlimit = C4::Context->preference("noissuescharge"); my $allowfineoverride = C4::Context->preference("AllowFineOverride"); my $allfinesneedoverride = C4::Context->preference("AllFinesNeedOverride"); + + # Check the debt of this patrons guarantees + my $no_issues_charge_guarantees = C4::Context->preference("NoIssuesChargeGuarantees"); + $no_issues_charge_guarantees = undef unless looks_like_number( $no_issues_charge_guarantees ); + if ( defined $no_issues_charge_guarantees ) { + my $b = Koha::Borrowers->find( $borrower->{borrowernumber} ); + my @guarantees = $b->guarantees(); + my $guarantees_non_issues_charges; + foreach my $g ( @guarantees ) { + my ( $b, $n, $o ) = C4::Members::GetMemberAccountBalance( $g->id ); + $guarantees_non_issues_charges += $n; + } + + if ( C4::Context->preference("IssuingInProcess") ) { + if ( $guarantees_non_issues_charges > $no_issues_charge_guarantees && !$inprocess && !$allowfineoverride) { + $issuingimpossible{DEBT_GUARANTEES} = sprintf( "%.2f", $guarantees_non_issues_charges ); + } elsif ( $guarantees_non_issues_charges > $no_issues_charge_guarantees && !$inprocess && $allowfineoverride) { + $needsconfirmation{DEBT_GUARANTEES} = sprintf( "%.2f", $guarantees_non_issues_charges ); + } elsif ( $allfinesneedoverride && $guarantees_non_issues_charges > 0 && $guarantees_non_issues_charges <= $no_issues_charge_guarantees && !$inprocess ) { + $needsconfirmation{DEBT_GUARANTEES} = sprintf( "%.2f", $guarantees_non_issues_charges ); + } + } + else { + if ( $guarantees_non_issues_charges > $no_issues_charge_guarantees && $allowfineoverride ) { + $needsconfirmation{DEBT_GUARANTEES} = sprintf( "%.2f", $guarantees_non_issues_charges ); + } elsif ( $guarantees_non_issues_charges > $no_issues_charge_guarantees && !$allowfineoverride) { + $issuingimpossible{DEBT_GUARANTEES} = sprintf( "%.2f", $guarantees_non_issues_charges ); + } elsif ( $guarantees_non_issues_charges > 0 && $allfinesneedoverride ) { + $needsconfirmation{DEBT_GUARANTEES} = sprintf( "%.2f", $guarantees_non_issues_charges ); + } + } + + } + if ( C4::Context->preference("IssuingInProcess") ) { if ( $non_issue_charges > $amountlimit && !$inprocess && !$allowfineoverride) { $issuingimpossible{DEBT} = sprintf( "%.2f", $non_issue_charges ); @@ -861,6 +897,7 @@ sub CanBookBeIssued { $needsconfirmation{DEBT} = sprintf( "%.2f", $non_issue_charges ); } } + if ($balance > 0 && $other_charges > 0) { $alerts{OTHER_CHARGES} = sprintf( "%.2f", $other_charges ); } --- a/C4/Members.pm +++ a/C4/Members.pm @@ -24,6 +24,7 @@ use strict; #use warnings; FIXME - Bug 2505 use C4::Context; use String::Random qw( random_string ); +use Scalar::Util qw( looks_like_number ); use Date::Calc qw/Today Add_Delta_YM check_date Date_to_Days/; use C4::Log; # logaction use C4::Overdues; @@ -326,13 +327,13 @@ sub patronflags { my ($balance, $owing) = GetMemberAccountBalance( $patroninformation->{'borrowernumber'}); if ( $owing > 0 ) { my %flaginfo; - my $noissuescharge = C4::Context->preference("noissuescharge") || 5; - $flaginfo{'message'} = sprintf 'Patron owes %.02f', $owing; + my $noissuescharge = c4::context->preference("noissuescharge") || 5; + $flaginfo{'message'} = sprintf 'patron owes %.02f', $owing; $flaginfo{'amount'} = sprintf "%.02f", $owing; - if ( $owing > $noissuescharge && !C4::Context->preference("AllowFineOverride") ) { + if ( $owing > $noissuescharge && !c4::context->preference("allowfineoverride") ) { $flaginfo{'noissues'} = 1; } - $flags{'CHARGES'} = \%flaginfo; + $flags{'charges'} = \%flaginfo; } elsif ( $balance < 0 ) { my %flaginfo; @@ -340,6 +341,28 @@ sub patronflags { $flaginfo{'amount'} = sprintf "%.02f", $balance; $flags{'CREDITS'} = \%flaginfo; } + + # Check the debt of the guarntees of this patron + my $no_issues_charge_guarantees = C4::Context->preference("NoIssuesChargeGuarantees"); + $no_issues_charge_guarantees = undef unless looks_like_number( $no_issues_charge_guarantees ); + if ( defined $no_issues_charge_guarantees ) { + my $b = Koha::Borrowers->find( $patroninformation->{borrowernumber} ); + my @guarantees = $b->guarantees(); + my $guarantees_non_issues_charges; + foreach my $g ( @guarantees ) { + my ( $b, $n, $o ) = C4::Members::GetMemberAccountBalance( $g->id ); + $guarantees_non_issues_charges += $n; + } + + if ( $guarantees_non_issues_charges > $no_issues_charge_guarantees ) { + my %flaginfo; + $flaginfo{'message'} = sprintf 'patron guarantees owe %.02f', $guarantees_non_issues_charges; + $flaginfo{'amount'} = sprintf "%.02f", $guarantees_non_issues_charges; + $flaginfo{'noissues'} = 1 unless C4::Context->preference("allowfineoverride"); + $flags{'CHARGES_GUARANTEES'} = \%flaginfo; + } + } + if ( $patroninformation->{'gonenoaddress'} && $patroninformation->{'gonenoaddress'} == 1 ) { --- a/Koha/Borrower.pm +++ a/Koha/Borrower.pm @@ -47,6 +47,12 @@ sub guarantor { return Koha::Borrowers->find( $self->guarantorid() ); } +sub guarantees { + my ( $self ) = @_; + + return Koha::Borrowers->search( { guarantorid => $self->id } ); +} + =head3 type =cut --- a/circ/circulation.pl +++ a/circ/circulation.pl @@ -500,6 +500,14 @@ foreach my $flag ( sort keys %$flags ) { charges_is_blocker => 1 ); } + elsif ( $flag eq 'CHARGES_GUARANTEES' ) { + $template->param( + charges_guarantees => 'true', + chargesmsg_guarantees => $flags->{'CHARGES_GUARANTEES'}->{'message'}, + chargesamount_guarantees => $flags->{'CHARGES_GUARANTEES'}->{'amount'}, + charges_guarantees_is_blocker => 1 + ); + } elsif ( $flag eq 'CREDITS' ) { $template->param( credits => 'true', @@ -516,6 +524,13 @@ foreach my $flag ( sort keys %$flags ) { chargesamount => $flags->{'CHARGES'}->{'amount'}, ); } + elsif ( $flag eq 'CHARGES_GUARANTEES' ) { + $template->param( + charges_guarantees => 'true', + chargesmsg_guarantees => $flags->{'CHARGES_GUARANTEES'}->{'message'}, + chargesamount_guarantees => $flags->{'CHARGES_GUARANTEES'}->{'amount'}, + ); + } elsif ( $flag eq 'CREDITS' ) { $template->param( credits => 'true', --- a/installer/data/mysql/atomicupdate/bug_14577.sql +++ a/installer/data/mysql/atomicupdate/bug_14577.sql @@ -0,0 +1,2 @@ +INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES +('NoIssuesChargeGuarantees','','','Define maximum amount withstanding before check outs are blocked','Integer'); --- a/installer/data/mysql/sysprefs.sql +++ a/installer/data/mysql/sysprefs.sql @@ -231,6 +231,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('NewItemsDefaultLocation','','','If set, all new items will have a location of the given Location Code ( Authorized Value type LOC )',''), ('NewsAuthorDisplay','none','none|opac|staff|both','Display the author name for news items.','Choice'), ('noissuescharge','5','','Define maximum amount withstanding before check outs are blocked','Integer'), +('NoIssuesChargeGuarantees','','','Define maximum amount withstanding before check outs are blocked','Integer'), ('noItemTypeImages','0',NULL,'If ON, disables item-type images','YesNo'), ('NoLoginInstructions', '', '60|10', 'Instructions to display on the OPAC login form when a patron is not logged in', 'Textarea'), ('NorwegianPatronDBEnable','0',NULL,'Enable communication with the Norwegian national patron database.', 'YesNo'), --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -291,6 +291,11 @@ Circulation: class: integer - '[% local_currency %] in fines.' - + - Prevent patrons from checking out books if the have guarantees owing in total more than + - pref: NoIssuesChargeGuarantees + class: integer + - '[% local_currency %] in fines.' + - - pref: RentalsInNoissuesCharge choices: yes: Include --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -229,6 +229,11 @@ $(document).ready(function() { [% IF ( DEBT ) %]
  • The patron has a debt of [% DEBT %].
  • [% END %] + +[% IF ( DEBT_GUARANTEES ) %] +
  • The patron's guarantees collectively have a debt of [% DEBT_GUARANTEES %].
  • +[% END %] + [% IF ( RENTALCHARGE && RENTALCHARGE > 0 ) %]
  • Rental charge for this item: [% RENTALCHARGE %]
  • [% END %] @@ -787,21 +792,32 @@ No patron matched [% message %] [% IF ( odues ) %]
  • [% IF ( nonreturns ) %]Overdues: Patron has ITEMS OVERDUE. See highlighted items below[% END %]
  • [% END %] - [% IF ( charges ) %] -
  • - Fees & Charges: Patron has Outstanding fees & charges[% IF ( chargesamount ) %] of [% chargesamount %][% END %]. - [% IF ( charges_is_blocker ) %] - Checkouts are BLOCKED because fine balance is OVER THE LIMIT. - [% END %] - Make payment or - Pay all fines
  • - [% END %] + [% IF ( charges ) %] +
  • + Fees & Charges: Patron has Outstanding fees & charges[% IF ( chargesamount ) %] of [% chargesamount %][% END %]. + [% IF ( charges_is_blocker ) %] + Checkouts are BLOCKED because fine balance is OVER THE LIMIT. + [% END %] + Make payment or + Pay all fines +
  • + [% END %] - [% IF ( credits ) %] -
  • - Credits: Patron has a credit[% IF ( creditsamount ) %] of [% creditsamount %][% END %] -
  • - [% END %] + [% IF ( charges_guarantees ) %] +
  • + Fees & Charges: Patron's guarantees collectively owe [% chargesamount_guarantees %]. + [% IF ( charges_guarantees_is_blocker ) %] + Checkouts are BLOCKED because fine balance is OVER THE LIMIT. + [% END %] +
  • + [% END %] + + + [% IF ( credits ) %] +
  • + Credits: Patron has a credit[% IF ( creditsamount ) %] of [% creditsamount %][% END %] +
  • + [% END %] --