From 198ad17159f54e0e807fe2f5cc58e1eab6ff8281 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Thu, 21 Nov 2019 13:59:43 +0000 Subject: [PATCH] Bug 24080: Add payout option to patron account page This enhancement adds a refined workflow to allow librarians to pay out money to patrons and record these payouts on the patrons account. The use case is that a patron has somehow accrued credit, through a refund perhaps, and the library wants to be able to physically hand over some money to balance the patrons account. Test plan: 1) Undertake a series of transactions that result in some outstanding credit on a patrons account. 2) Note that a new 'Issue payout' button appears next to a credit with an outstanding balance (but only if your user has the payout permission or is a superlibrarian) 3) Click the 'Issue payout' button and a modal should appear pre-populated with the amountoutstanding. 4) You should be able to edit the amount you wish to payout, make payment or cancel. 5) Signoff Signed-off-by: Kyle M Hall --- .../prog/en/modules/members/boraccount.tt | 82 +++++++++++++++++++ members/boraccount.pl | 51 ++++++++++++ 2 files changed, 133 insertions(+) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/boraccount.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/boraccount.tt index 2ad20bb340..8e2039edaa 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/boraccount.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/boraccount.tt @@ -84,6 +84,9 @@ [% IF account.is_credit %] Void [% END %] + [% IF CAN_user_updatecharges_payout && account.is_credit && ( account.amountoutstanding < 0 ) %] + + [% END %] @@ -113,6 +116,73 @@ + + + [% MACRO jsinclude BLOCK %] [% INCLUDE 'datatables.inc' %] [% INCLUDE 'columns_settings.inc' %] @@ -157,6 +227,18 @@ e.preventDefault(); } }); + + $("#issuePayoutModal").on("shown.bs.modal", function(e){ + var button = $(e.relatedTarget); + var account = button.data('account'); + $("#account + span").replaceWith(account); + var accountline = button.data('accountline'); + $('#payoutline').val(accountline); + var amount = button.data('amount') * -1; + $("#paid + span").replaceWith(amount); + $("#amount").attr({ "value": amount, "max": amount }); + $("#amount, #transaction_type").focus(); + }); }); [% END %] diff --git a/members/boraccount.pl b/members/boraccount.pl index 251a3aa565..df2ad35815 100755 --- a/members/boraccount.pl +++ b/members/boraccount.pl @@ -29,6 +29,7 @@ use C4::Output; use CGI qw ( -utf8 ); use C4::Members; use C4::Accounts; +use Koha::Cash::Registers; use Koha::Patrons; use Koha::Patron::Categories; @@ -47,12 +48,14 @@ my ($template, $loggedinuser, $cookie) = get_template_and_user( } ); +my $schema = Koha::Database->new->schema; my $borrowernumber = $input->param('borrowernumber'); my $payment_id = $input->param('payment_id'); my $change_given = $input->param('change_given'); my $action = $input->param('action') || ''; my $logged_in_user = Koha::Patrons->find( $loggedinuser ) or die "Not logged in"; +my $library_id = C4::Context->userenv->{'branch'}; my $patron = Koha::Patrons->find( $borrowernumber ); unless ( $patron ) { print $input->redirect("/cgi-bin/koha/circ/circulation.pl?borrowernumber=$borrowernumber"); @@ -61,12 +64,60 @@ unless ( $patron ) { output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } ); +my $registerid; +if ( C4::Context->preference('UseCashRegisters') ) { + $registerid = scalar $input->param('registerid'); + my $registers = Koha::Cash::Registers->search( + { branch => $library_id, archived => 0 }, + { order_by => { '-asc' => 'name' } } + ); + + if ( !$registers->count ) { + $template->param( error_registers => 1 ); + } + else { + + if ( !$registerid ) { + my $default_register = Koha::Cash::Registers->find( + { branch => $library_id, branch_default => 1 } ); + $registerid = $default_register->id if $default_register; + } + $registerid = $registers->next->id if !$registerid; + + $template->param( + registerid => $registerid, + registers => $registers, + ); + } +} + if ( $action eq 'void' ) { my $payment_id = scalar $input->param('accountlines_id'); my $payment = Koha::Account::Lines->find( $payment_id ); $payment->void(); } +if ( $action eq 'payout' ) { + my $payment_id = scalar $input->param('accountlines_id'); + my $payment = Koha::Account::Lines->find($payment_id); + my $amount = scalar $input->param('amount'); + my $transaction_type = scalar $input->param('transaction_type'); + $schema->txn_do( + sub { + my $payout = $payment->payout( + { + payout_type => $transaction_type, + branch => $library_id, + staff_id => $logged_in_user->id, + cash_register => $registerid, + interface => 'intranet', + amount => $amount + } + ); + } + ); +} + #get account details my $total = $patron->account->balance; -- 2.21.0 (Apple Git-122.2)