X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=members%2Fpaycollect.pl;h=d5cbd60bfce17f6992c01e09d2e09ac84cb375ef;hb=9d6d641d1f8b77271800f43bc027b651f9aea52b;hp=d66702ec727d38df429e2adb743094d890fdbb04;hpb=8768162c8e24ad830b53944839fa6a41f9384df1;p=srvgit diff --git a/members/paycollect.pl b/members/paycollect.pl index d66702ec72..d5cbd60bfc 100755 --- a/members/paycollect.pl +++ b/members/paycollect.pl @@ -4,171 +4,256 @@ # # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; +use URI::Escape qw( uri_escape uri_unescape ); +use CGI qw ( -utf8 ); -use strict; -use warnings; use C4::Context; -use C4::Auth; -use C4::Output; -use CGI; -use C4::Members; +use C4::Auth qw( get_template_and_user ); +use C4::Output qw( output_and_exit_if_error output_and_exit output_html_with_http_headers ); use C4::Accounts; use C4::Koha; -use C4::Branch; + +use Koha::Cash::Registers; +use Koha::Patrons; +use Koha::Patron::Categories; +use Koha::AuthorisedValues; +use Koha::Account; +use Koha::Token; +use Koha::DateUtils qw( output_pref ); my $input = CGI->new(); +my $payment_id = $input->param('payment_id'); +my $writeoff_individual = $input->param('writeoff_individual'); +my $change_given = $input->param('change_given'); +my $type = scalar $input->param('type') || 'PAYMENT'; + +my $updatecharges_permissions = ($writeoff_individual || $type eq 'WRITEOFF') ? 'writeoff' : 'remaining_permissions'; my ( $template, $loggedinuser, $cookie ) = get_template_and_user( - { template_name => 'members/paycollect.tmpl', + { template_name => 'members/paycollect.tt', query => $input, type => 'intranet', - authnotrequired => 0, - flagsrequired => { borrowers => 1, updatecharges => 1 }, - debug => 1, + flagsrequired => { borrowers => 'edit_borrowers', updatecharges => $updatecharges_permissions }, } ); # get borrower details my $borrowernumber = $input->param('borrowernumber'); -my $borrower = GetMember( borrowernumber => $borrowernumber ); +my $logged_in_user = Koha::Patrons->find( $loggedinuser ); +my $patron = Koha::Patrons->find( $borrowernumber ); +output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } ); + +my $borrower = $patron->unblessed; +my $account = $patron->account; +my $category = $patron->category; my $user = $input->remote_user; -# get account details -my $branch = GetBranch( $input, GetBranches() ); +my $library_id = C4::Context->userenv->{'branch'}; +my $total_due = $account->outstanding_debits->total_outstanding; -my ( $total_due, $accts, $numaccts ) = GetMemberAccountRecords($borrowernumber); -my $total_paid = $input->param('paid'); +my $total_paid = $input->param('paid'); +my $total_collected = $input->param('collected'); -my $individual = $input->param('pay_individual'); -my $writeoff = $input->param('writeoff_individual'); -my $select_lines = $input->param('selected'); -my $select = $input->param('selected_accts'); -my $accountno; +my $selected_lines = $input->param('selected'); # comes from pay.pl +my $pay_individual = $input->param('pay_individual'); +my $selected_accts = $input->param('selected_accts'); # comes from paycollect.pl +my $payment_note = uri_unescape scalar $input->param('payment_note'); +my $payment_type = scalar $input->param('payment_type'); my $accountlines_id; -if ( $individual || $writeoff ) { - if ($individual) { + +my $cash_register_id = $input->param('cash_register'); +if ( $pay_individual || $writeoff_individual ) { + if ($pay_individual) { $template->param( pay_individual => 1 ); - } elsif ($writeoff) { + } elsif ($writeoff_individual) { $template->param( writeoff_individual => 1 ); } - my $accounttype = $input->param('accounttype'); - $accountlines_id = $input->param('accountlines_id'); + my $debit_type_code = $input->param('debit_type_code'); + $accountlines_id = $input->param('accountlines_id'); my $amount = $input->param('amount'); my $amountoutstanding = $input->param('amountoutstanding'); - $accountno = $input->param('accountno'); my $itemnumber = $input->param('itemnumber'); my $description = $input->param('description'); my $title = $input->param('title'); - my $notify_id = $input->param('notify_id'); - my $notify_level = $input->param('notify_level'); $total_due = $amountoutstanding; $template->param( - accounttype => $accounttype, + debit_type_code => $debit_type_code, accountlines_id => $accountlines_id, - accountno => $accountno, amount => $amount, amountoutstanding => $amountoutstanding, title => $title, itemnumber => $itemnumber, - description => $description, - notify_id => $notify_id, - notify_level => $notify_level, + individual_description => $description, + payment_note => $payment_note, ); -} elsif ($select_lines) { +} elsif ($selected_lines) { $total_due = $input->param('amt'); $template->param( - selected_accts => $select_lines, - amt => $total_due + selected_accts => $selected_lines, + amt => $total_due, + selected_accts_notes => scalar $input->param('notes'), + ); +} + +my @selected_accountlines; +if ( $selected_accts ) { + if ( $selected_accts =~ /^([\d,]*).*/ ) { + $selected_accts = $1; # ensure passing no junk + } + my @acc = split /,/, $selected_accts; + + my $search_params = { + borrowernumber => $borrowernumber, + amountoutstanding => { '<>' => 0 }, + accountlines_id => { 'in' => \@acc }, + }; + + @selected_accountlines = Koha::Account::Lines->search( + $search_params, + { order_by => 'date' } ); + + my $sum = Koha::Account::Lines->search( + $search_params, + { + select => [ { sum => 'amountoutstanding' } ], + as => [ 'total_amountoutstanding'], + } + ); + $total_due = $sum->_resultset->first->get_column('total_amountoutstanding'); } if ( $total_paid and $total_paid ne '0.00' ) { + $total_paid = $total_due if (abs($total_paid - $total_due) < 0.01) && C4::Context->preference('RoundFinesAtPayment'); if ( $total_paid < 0 or $total_paid > $total_due ) { $template->param( error_over => 1, total_due => $total_due ); + } elsif ( $total_collected < $total_paid && !( $writeoff_individual || $type eq 'WRITEOFF' ) ) { + $template->param( + error_under => 1, + total_paid => $total_paid + ); } else { - if ($individual) { - if ( $total_paid == $total_due ) { - makepayment( $accountlines_id, $borrowernumber, $accountno, $total_paid, $user, - $branch ); - } else { - makepartialpayment( $accountlines_id, $borrowernumber, $accountno, $total_paid, - $user, $branch ); - } - print $input->redirect( - "/cgi-bin/koha/members/pay.pl?borrowernumber=$borrowernumber"); + output_and_exit( $input, $cookie, $template, 'wrong_csrf_token' ) + unless Koha::Token->new->check_csrf( { + session_id => $input->cookie('CGISESSID'), + token => scalar $input->param('csrf_token'), + }); + + my $url; + my $pay_result; + if ($pay_individual) { + my $line = Koha::Account::Lines->find($accountlines_id); + $pay_result = $account->pay( + { + lines => [$line], + amount => $total_paid, + library_id => $library_id, + note => $payment_note, + interface => C4::Context->interface, + payment_type => $payment_type, + cash_register => $cash_register_id + } + ); + $payment_id = $pay_result->{payment_id}; + + $url = "/cgi-bin/koha/members/pay.pl"; } else { - if ($select) { - if ( $select =~ /^([\d,]*).*/ ) { - $select = $1; # ensure passing no junk + if ($selected_accts) { + if ( $total_paid > $total_due ) { + $template->param( + error_over => 1, + total_due => $total_due + ); + } else { + my $note = $input->param('selected_accts_notes'); + + $pay_result = $account->pay( + { + type => $type, + amount => $total_paid, + library_id => $library_id, + lines => \@selected_accountlines, + note => $note, + interface => C4::Context->interface, + payment_type => $payment_type, + cash_register => $cash_register_id + } + ); } - my @acc = split /,/, $select; - recordpayment_selectaccts( $borrowernumber, $total_paid, - \@acc ); - } else { - recordpayment( $borrowernumber, $total_paid ); + $payment_id = $pay_result->{payment_id}; } + else { + my $note = $input->param('selected_accts_notes'); + $pay_result = $account->pay( + { + amount => $total_paid, + library_id => $library_id, + note => $note, + payment_type => $payment_type, + interface => C4::Context->interface, + payment_type => $payment_type, + cash_register => $cash_register_id + } + ); + $payment_id = $pay_result->{payment_id}; + } + $payment_id = $pay_result->{payment_id}; -# recordpayment does not return success or failure so lets redisplay the boraccount - - print $input->redirect( -"/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber" - ); + $url = "/cgi-bin/koha/members/boraccount.pl"; } + # It's possible renewals took place, parse any renew results + # and pass on + my @renew_result = (); + foreach my $ren( @{$pay_result->{renew_result}} ) { + my $str = "renew_result=$ren->{itemnumber},$ren->{success},"; + my $app = $ren->{success} ? + uri_escape( + output_pref({ dt => $ren->{due_date}, as_due_date => 1 }) + ) : $ren->{error}; + push @renew_result, "${str}${app}"; + } + my $append = scalar @renew_result ? '&' . join('&', @renew_result) : ''; + + $url .= "?borrowernumber=$borrowernumber&payment_id=$payment_id&change_given=${change_given}${append}"; + + print $input->redirect($url); } } else { $total_paid = '0.00'; #TODO not right with pay_individual } -borrower_add_additional_fields($borrower); +$template->param(%$borrower); + +if ( $input->param('error_over') ) { + $template->param( error_over => 1, total_due => scalar $input->param('amountoutstanding') ); +} $template->param( + payment_id => $payment_id, + + type => $type, borrowernumber => $borrowernumber, # some templates require global - borrower => $borrower, - total => $total_due, - activeBorrowerRelationship => (C4::Context->preference('borrowerRelationship') ne ''), + patron => $patron, + total => $total_due, + + csrf_token => Koha::Token->new->generate_csrf( { session_id => scalar $input->cookie('CGISESSID') } ), ); output_html_with_http_headers $input, $cookie, $template->output; - -sub borrower_add_additional_fields { - my $b_ref = shift; - -# some borrower info is not returned in the standard call despite being assumed -# in a number of templates. It should not be the business of this script but in lieu of -# a revised api here it is ... - if ( $b_ref->{category_type} eq 'C' ) { - my ( $catcodes, $labels ) = - GetborCatFromCatType( 'A', 'WHERE category_type = ?' ); - if ( @{$catcodes} ) { - if ( @{$catcodes} > 1 ) { - $b_ref->{CATCODE_MULTI} = 1; - } elsif ( @{$catcodes} == 1 ) { - $b_ref->{catcode} = $catcodes->[0]; - } - } - } elsif ( $b_ref->{category_type} eq 'A' ) { - $b_ref->{adultborrower} = 1; - } - my ( $picture, $dberror ) = GetPatronImage( $b_ref->{cardnumber} ); - if ($picture) { - $b_ref->{has_picture} = 1; - } - - $b_ref->{branchname} = GetBranchName( $b_ref->{branchcode} ); - return; -}