f406aa2ae3
I believe the error is triggered when borrowernumbers are left empty in the accountlines table. Not sure why this would happen, but it appears to be what causes the problem. Do not apply the first patch if testing this patch. To test: 1) sudo koha-mysql INSTANCENAME 2) Create a test borrower, add any payment etc to create an accountline, then delete this borrower 3) ensure the AccountAutoReconcile syspref is disabled 4) Go to another borrower's accounting tab 5) Create a manual credit or debit. Confirm this shows in the 'Make a payment' tab as an amount that COULD be applied, but isn't automatically applied 6) in your terminal, run the reconcile_balances.pl script 7) Confirm the error does not show in the logs and the balance for the borrower is correctly reconciled. Sponsored-by: Horowhenua District Council Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
123 lines
2.9 KiB
Perl
Executable file
123 lines
2.9 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
# Copyright 2018 Theke Solutions
|
|
#
|
|
# 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>.
|
|
|
|
=head1 NAME
|
|
|
|
reconcile_balances.pl - cron script to reconcile patron's balances
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
./reconcile_balances.pl
|
|
|
|
or, in crontab:
|
|
0 1 * * * reconcile_balances.pl
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This script loops through patrons with outstanding credits and proceeds
|
|
to reconcile their balances.
|
|
|
|
=head1 OPTIONS
|
|
|
|
=over 8
|
|
|
|
=item B<--help>
|
|
|
|
Prints a brief help message and exits.
|
|
|
|
=item B<--verbose>
|
|
|
|
Makes the process print information about the taken actions.
|
|
|
|
=back
|
|
|
|
=cut
|
|
|
|
use Modern::Perl;
|
|
|
|
use Getopt::Long;
|
|
use Pod::Usage;
|
|
use Try::Tiny;
|
|
|
|
BEGIN {
|
|
# find Koha's Perl modules
|
|
# test carefully before changing this
|
|
use FindBin;
|
|
eval { require "$FindBin::Bin/../kohalib.pl" };
|
|
}
|
|
|
|
use Koha::Script -cron;
|
|
use C4::Log;
|
|
|
|
use Koha::Account::Lines;
|
|
use Koha::Patrons;
|
|
|
|
my $help = 0;
|
|
my $verbose = 0;
|
|
|
|
GetOptions(
|
|
'help' => \$help,
|
|
'verbose' => \$verbose
|
|
) or pod2usage(2);
|
|
|
|
pod2usage(1) if $help;
|
|
cronlogaction();
|
|
|
|
my @patron_ids = map { $_->borrowernumber } Koha::Account::Lines->search(
|
|
{
|
|
amountoutstanding => { '<' => 0 },
|
|
borrowernumber => { '!=' => undef }
|
|
},
|
|
{
|
|
columns => [ qw/borrowernumber/ ],
|
|
distinct => 1,
|
|
}
|
|
);
|
|
|
|
my $patrons = Koha::Patrons->search({ borrowernumber => { -in => \@patron_ids } });
|
|
|
|
while (my $patron = $patrons->next) {
|
|
|
|
my $account = $patron->account;
|
|
my $total_outstanding_credit = $account->outstanding_credits->total_outstanding;
|
|
my $total_outstanding_debit = $account->outstanding_debits->total_outstanding;
|
|
|
|
if ( $total_outstanding_credit < 0
|
|
and $total_outstanding_debit > 0) {
|
|
|
|
try {
|
|
|
|
$account->reconcile_balance;
|
|
|
|
print $patron->id . ": credit: $total_outstanding_credit " .
|
|
"debit: $total_outstanding_debit " .
|
|
"=> outstanding " .
|
|
"credit: " . $account->outstanding_credits->total_outstanding .
|
|
" debit: " . $account->outstanding_debits->total_outstanding . "\n"
|
|
if $verbose;
|
|
}
|
|
catch {
|
|
print "Problem with patron " . $patron->borrowernumber . ": $_";
|
|
};
|
|
}
|
|
}
|
|
|
|
1;
|
|
|
|
__END__
|