From 3d023a89f15c1ab9f23ee50428acef645940eb9b Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Mon, 11 Jul 2016 15:36:54 +0000 Subject: [PATCH] Bug 16899 - Add ability to disallow overpayments Some SIP services ( such as Comprise ) require that an attempt at over-paying a patron's account via SIP2 should fail, rather than create a credit on the account. We should make this a configurable option on a per-login basis in the SIP2 config file. Test Plan: 1) Apply this patch 2) Enable the new parameter disallow_overpayment="1" for the login to be used in this test. 3) Restart your SIP server 4) Create or find a patron with fines 5) Attempt to send a payment via SIP for more than what the patron's balance is 6) Note the response indicates a payment failure 7) Attempt to send a payment via SIP for the account balance or less 8) Note the response indicates the payment has succeeded 9) Verify in Koha that the payment was processed Signed-off-by: Rhonda Kuiper --- C4/SIP/ILS.pm | 4 ++-- C4/SIP/ILS/Transaction/FeePayment.pm | 20 ++++++++++++++------ C4/SIP/Sip/MsgType.pm | 3 ++- Koha/Account/Lines.pm | 10 ++++++++++ etc/SIPconfig.xml | 2 +- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/C4/SIP/ILS.pm b/C4/SIP/ILS.pm index 35879af..5d3f189 100644 --- a/C4/SIP/ILS.pm +++ b/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; diff --git a/C4/SIP/ILS/Transaction/FeePayment.pm b/C4/SIP/ILS/Transaction/FeePayment.pm index 9cedce5..5e1373f 100644 --- a/C4/SIP/ILS/Transaction/FeePayment.pm +++ b/C4/SIP/ILS/Transaction/FeePayment.pm @@ -42,19 +42,27 @@ sub new { } sub pay { - my $self = shift; - my $borrowernumber = shift; - my $amt = shift; - my $sip_type = shift; - my $fee_id = shift; - my $is_writeoff = shift; + my $self = shift; + my $borrowernumber = shift; + my $amt = shift; + my $sip_type = shift; + my $fee_id = shift; + my $is_writeoff = shift; + my $disallow_overpayment = shift; my $type = $is_writeoff ? 'writeoff' : undef; warn("RECORD:$borrowernumber::$amt"); + my $fee = $fee_id ? Koha::Account::Lines->find($fee_id) : undef; + my $account = Koha::Account->new( { patron_id => $borrowernumber } ); + if ($disallow_overpayment) { + my $balance = $patron->account_balance(); + return 0 if $account->balance < $amt; + } + if ($fee_id) { my $fee = Koha::Account::Lines->find($fee_id); if ( $fee && $fee->amountoutstanding == $amt ) { diff --git a/C4/SIP/Sip/MsgType.pm b/C4/SIP/Sip/MsgType.pm index 3660aa4..df9957e 100644 --- a/C4/SIP/Sip/MsgType.pm +++ b/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 ); diff --git a/Koha/Account/Lines.pm b/Koha/Account/Lines.pm index 0e0677c..33e5e22 100644 --- a/Koha/Account/Lines.pm +++ b/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 diff --git a/etc/SIPconfig.xml b/etc/SIPconfig.xml index db25975..c08673b 100644 --- a/etc/SIPconfig.xml +++ b/etc/SIPconfig.xml @@ -44,7 +44,7 @@ - + -- 2.1.4