From 391b845744748e3df58280c9fadb804344ac755d Mon Sep 17 00:00:00 2001 From: Kyle Hall Date: Tue, 14 Mar 2023 07:06:21 -0400 Subject: [PATCH] Bug 33216: Catch and handle RegisterRequired exceptions for SIP fee paid messages If registers are being used in Koha, they are required. If a SIP account has no register and a fee paid message is sent, the SIP server crashes and the client never gets a response. It would be much better if Koha would response with 38 response where "payment accepted" is N, and an AF field stating that the SIP account needs to be associated with a register. Test Plan: 1) Enable UseCashRegisters, set RequireCashRegister to "always require a cash register". Do *not* set a cash register for the SIP account you will be testing with. 2) Using the SIP cli tester, send a fee paid message for a patron owing fees. 3) Note the lack of a SIP response 4) Apply this patch 5) Restart the SIP server 6) Repeat step 2, you should now get a SIP response with the error message in it! Signed-off-by: Martin Renvoize --- C4/SIP/ILS.pm | 3 ++- C4/SIP/ILS/Transaction/FeePayment.pm | 26 +++++++++++++++++++++++--- C4/SIP/Sip/MsgType.pm | 1 + 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/C4/SIP/ILS.pm b/C4/SIP/ILS.pm index f33aaee5c48..e6ff28cf5b5 100644 --- a/C4/SIP/ILS.pm +++ b/C4/SIP/ILS.pm @@ -310,7 +310,8 @@ sub pay_fee { return { status => $trans, - pay_response => $trans_result->{pay_response} + pay_response => $trans_result->{pay_response}, + error => $trans_result->{error}, }; } diff --git a/C4/SIP/ILS/Transaction/FeePayment.pm b/C4/SIP/ILS/Transaction/FeePayment.pm index 80d9698694d..a9fae17da9a 100644 --- a/C4/SIP/ILS/Transaction/FeePayment.pm +++ b/C4/SIP/ILS/Transaction/FeePayment.pm @@ -20,6 +20,8 @@ use strict; # You should have received a copy of the GNU General Public License # along with Koha; if not, see . +use Try::Tiny; + use Koha::Account; use Koha::Account::Lines; @@ -76,10 +78,28 @@ sub pay { }; } } - my $pay_response = $account->pay($pay_options); + + my $ok = 1; + my $pay_response; + my $error; + try { + $pay_response = $account->pay($pay_options); + } + catch { + $ok = 0; + + if ( ref($_) =~ /^Koha::Exceptions/ ) { + $error = $_->description; + } + else { + $_->rethrow; + } + }; + return { - ok => 1, - pay_response => $pay_response + ok => $ok, + pay_response => $pay_response, + error => $error, }; } diff --git a/C4/SIP/Sip/MsgType.pm b/C4/SIP/Sip/MsgType.pm index 3510683d84f..6cfabeb9b6c 100644 --- a/C4/SIP/Sip/MsgType.pm +++ b/C4/SIP/Sip/MsgType.pm @@ -1194,6 +1194,7 @@ sub handle_fee_paid { $resp .= add_field( FID_INST_ID, $inst_id, $server ); $resp .= add_field( FID_PATRON_ID, $patron_id, $server ); $resp .= maybe_add( FID_TRANSACTION_ID, $status->transaction_id, $server ); + $resp .= maybe_add( FID_SCREEN_MSG, $pay_result->{error}, $server ); $resp .= maybe_add( FID_SCREEN_MSG, $status->screen_msg, $server ); $resp .= maybe_add( FID_PRINT_LINE, $status->print_line, $server ); -- 2.30.2