@@ -, +, @@ disallow_overpayment="1" for the login to be used in this test. patron's balance is less --- C4/SIP/ILS.pm | 4 ++-- C4/SIP/ILS/Transaction/FeePayment.pm | 11 ++++++++++- C4/SIP/Sip/MsgType.pm | 3 ++- Koha/Account/Lines.pm | 10 ++++++++++ Koha/Patron.pm | 17 +++++++++++++++++ etc/SIPconfig.xml | 2 +- t/db_dependent/Patron.t | 23 ++++++++++++++++++++++- 7 files changed, 64 insertions(+), 6 deletions(-) --- a/C4/SIP/ILS.pm +++ a/C4/SIP/ILS.pm @@ -247,7 +247,7 @@ sub end_patron_session { } sub pay_fee { - my ($self, $patron_id, $patron_pwd, $fee_amt, $fee_type, $pay_type, $fee_id, $trans_id, $currency, $is_writeoff) = @_; + my ($self, $patron_id, $patron_pwd, $fee_amt, $fee_type, $pay_type, $fee_id, $trans_id, $currency, $is_writeoff, $disallow_overpayment ) = @_; my $trans = C4::SIP::ILS::Transaction::FeePayment->new(); @@ -258,7 +258,7 @@ sub pay_fee { $trans->screen_msg('Invalid patron barcode.'); return $trans; } - my $ok = $trans->pay( $patron->{borrowernumber}, $fee_amt, $pay_type, $fee_id, $is_writeoff ); + my $ok = $trans->pay( $patron->{borrowernumber}, $fee_amt, $pay_type, $fee_id, $is_writeoff, $disallow_overpayment ); $trans->ok($ok); return $trans; --- a/C4/SIP/ILS/Transaction/FeePayment.pm +++ a/C4/SIP/ILS/Transaction/FeePayment.pm @@ -21,7 +21,7 @@ use strict; # along with Koha; if not, see . use C4::Accounts qw(recordpayment makepayment WriteOffFee); -use Koha::Account::Lines; +use Koha::Patrons; use parent qw(C4::SIP::ILS::Transaction); @@ -48,9 +48,18 @@ sub pay { my $type = shift; my $fee_id = shift; my $is_writeoff = shift; + my $disallow_overpayment = shift; warn("RECORD:$borrowernumber::$amt"); + if ($disallow_overpayment) { + my $patron = Koha::Patrons->find($borrowernumber); + return 0 unless $patron; + + my $balance = $patron->account_balance(); + return 0 if $balance < $amt; + } + my $fee = $fee_id ? Koha::Account::Lines->find($fee_id) : undef; if ($is_writeoff) { # Writeoffs require a fee id to be sent --- a/C4/SIP/Sip/MsgType.pm +++ a/C4/SIP/Sip/MsgType.pm @@ -1068,6 +1068,7 @@ sub handle_fee_paid { my $status; my $resp = FEE_PAID_RESP; + my $disallow_overpayment = $server->{account}->{disallow_overpayment}; my $payment_type_writeoff = $server->{account}->{payment_type_writeoff}; my $is_writeoff = $pay_type eq $payment_type_writeoff; @@ -1080,7 +1081,7 @@ sub handle_fee_paid { $ils->check_inst_id( $inst_id, "handle_fee_paid" ); - $status = $ils->pay_fee( $patron_id, $patron_pwd, $fee_amt, $fee_type, $pay_type, $fee_id, $trans_id, $currency, $is_writeoff ); + $status = $ils->pay_fee( $patron_id, $patron_pwd, $fee_amt, $fee_type, $pay_type, $fee_id, $trans_id, $currency, $is_writeoff, $disallow_overpayment ); $resp .= ( $status->ok ? 'Y' : 'N' ) . timestamp; $resp .= add_field( FID_INST_ID, $inst_id ); --- a/Koha/Account/Lines.pm +++ a/Koha/Account/Lines.pm @@ -36,6 +36,16 @@ Koha::Account::Lines - Koha Account Line Object set class =cut +=head3 amount_outstanding + +=cut + +sub amount_outstanding { + my ( $self ) = @_; + + return $self->_resultset()->get_column('amountoutstanding')->sum(); +} + =head3 type =cut --- a/Koha/Patron.pm +++ a/Koha/Patron.pm @@ -23,6 +23,7 @@ use Modern::Perl; use Carp; use C4::Context; +use Koha::Account::Lines; use Koha::Database; use Koha::Issues; use Koha::OldIssues; @@ -42,6 +43,22 @@ Koha::Patron - Koha Patron Object class =cut +=head3 account_balance + +Returns the total amount owed by this patron + +=cut + +sub account_balance { + my ($self) = @_; + + return Koha::Account::Lines->search( + { + borrowernumber => $self->id + } + )->amount_outstanding(); +} + =head3 guarantor Returns a Koha::Patron object for this patron's guarantor --- a/etc/SIPconfig.xml +++ a/etc/SIPconfig.xml @@ -36,7 +36,7 @@ - + --- a/t/db_dependent/Patron.t +++ a/t/db_dependent/Patron.t @@ -17,11 +17,12 @@ use Modern::Perl; -use Test::More tests => 13; +use Test::More tests => 14; use Test::Warn; use C4::Context; use Koha::Database; +use Koha::Account::Line; BEGIN { use_ok('Koha::Object'); @@ -50,6 +51,26 @@ my $borrowernumber = $object->borrowernumber; my $patron = $schema->resultset('Borrower')->find( $borrowernumber ); is( $patron->surname(), "Test Surname", "Object found in database" ); +my $accountline_1 = Koha::Account::Line->new( + { + borrowernumber => $patron->id, + accountno => 1, + amount => 10.00, + amountoutstanding => 5.00, + } +)->store(); + +my $accountline_2 = Koha::Account::Line->new( + { + borrowernumber => $patron->id, + accountno => 2, + amount => 7.00, + amountoutstanding => 7.00, + } +)->store(); + +is( $object->account_balance, '12.000000', "Got correct patron account balance" ); + is( $object->is_changed(), 0, "Object is unchanged" ); $object->surname("Test Surname"); is( $object->is_changed(), 0, "Object is still unchanged" ); --