Koha/members/paycollect.pl
Martin Renvoize 89716a78e9 Bug 26269: Fix variable name mismatch for cash_register in paycollect
It appears that through various rebases the variable names in the form
and the controller script have become mismatched.  This patch corrects
the situation and clarifies their intended use.

Test plan:
1/ Turn on cash registers in sysprefs
2/ Define at least 2 cash registers in Admin
3/ Create a manual invoice on a patron
4/ Pay off half of your fee, selecting the first register
5/ Pay off the remaining fee, selecting the second register
6/ Query accountlines.register_id for your two payments
8/ Confirm the two accountlines.register_id's do not match (thus the
passed variable was used)

https://bugs.koha-community.org/show_bug.cgi?id=26469

Signed-off-by: Jessie Zairo <jzairo@bywatersolutions.com>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
2020-09-18 10:38:04 +02:00

286 lines
10 KiB
Perl
Executable file

#!/usr/bin/perl
# Copyright 2009,2010 PTFS Inc.
# Copyright 2011 PTFS-Europe Ltd
#
# 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 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.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use URI::Escape;
use CGI qw ( -utf8 );
use C4::Context;
use C4::Auth;
use C4::Output;
use C4::Members;
use C4::Accounts;
use C4::Koha;
use Koha::Cash::Registers;
use Koha::Patrons;
use Koha::Patron::Categories;
use Koha::AuthorisedValues;
use Koha::Account;
use Koha::Token;
use Koha::DateUtils;
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.tt',
query => $input,
type => 'intranet',
flagsrequired => { borrowers => 'edit_borrowers', updatecharges => $updatecharges_permissions },
debug => 1,
}
);
# get borrower details
my $borrowernumber = $input->param('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;
my $library_id = C4::Context->userenv->{'branch'};
my $total_due = $account->outstanding_debits->total_outstanding;
my $total_paid = $input->param('paid');
my $total_collected = $input->param('collected');
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;
my $cash_register_id;
if ( C4::Context->preference('UseCashRegisters') ) {
$cash_register_id = $input->param('cash_register');
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 ( !$cash_register_id ) {
my $default_register = Koha::Cash::Registers->find(
{ branch => $library_id, branch_default => 1 } );
$cash_register_id = $default_register->id if $default_register;
}
$cash_register_id = $registers->next->id if !$cash_register_id;
$template->param(
default_register => $cash_register_id,
registers => $registers,
);
}
}
if ( $pay_individual || $writeoff_individual ) {
if ($pay_individual) {
$template->param( pay_individual => 1 );
} elsif ($writeoff_individual) {
$template->param( writeoff_individual => 1 );
}
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');
my $itemnumber = $input->param('itemnumber');
my $description = $input->param('description');
my $title = $input->param('title');
$total_due = $amountoutstanding;
$template->param(
debit_type_code => $debit_type_code,
accountlines_id => $accountlines_id,
amount => $amount,
amountoutstanding => $amountoutstanding,
title => $title,
itemnumber => $itemnumber,
individual_description => $description,
payment_note => $payment_note,
);
} elsif ($selected_lines) {
$total_due = $input->param('amt');
$template->param(
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 },
};
my @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 {
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 ($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
}
);
}
$payment_id = $pay_result->{payment_id};
}
else {
my $note = $input->param('selected_accts_notes');
$pay_result = $payment_id = $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};
$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
}
$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
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;