6 use Getopt::Long qw( GetOptions );
7 use Pod::Usage qw( pod2usage );
9 use Koha::Account::Lines;
10 use Koha::DateUtils qw( dt_from_string );
12 use Koha::Script -cron;
14 my ( $help, $verbose, @type, $before, $after, @category_code, $file, $confirm );
17 'v|verbose+' => \$verbose,
19 'ab|added_before|added-before:s' => \$before,
20 'aa|added_after|added-after:s' => \$after,
21 'cc|category_code|category-code:s' => \@category_code,
23 'c|confirm' => \$confirm,
25 @type = split( /,/, join( ',', @type ) );
27 pod2usage(1) if ( $help || !$confirm && !$verbose || !$file && !@type && !$before && !$after );
29 my $where = { 'amountoutstanding' => { '>' => 0 } };
33 my @accounts_from_file;
34 open( my $fh, '<:encoding(UTF-8)', $file )
35 or die "Could not open file '$file' $!";
36 while ( my $line = <$fh> ) {
38 push @accounts_from_file, $line;
41 $where->{accountlines_id} = { '-in' => \@accounts_from_file };
45 $where->{debit_type_code} = \@type;
49 if ($before||$after) {
50 $dtf = Koha::Database->new->schema->storage->datetime_parser;
54 my $added_before = dt_from_string( $before, 'iso' );
55 $where->{date}->{'<'} = $dtf->format_datetime($added_before);
59 my $added_after = dt_from_string( $after, 'iso' );
60 $where->{date}->{'>'} = $dtf->format_datetime($added_after);
64 $where->{'patron.categorycode'}->{'-in'} = \@category_code;
65 push @{ $attr->{'join'} }, 'patron';
68 my $lines = Koha::Account::Lines->search( $where, $attr );
70 print "Attempting to write off " . $lines->count . " debts";
71 print " of type " . join(',',@type) if @type;
72 print " added before " . $before if $before;
73 print " from the passed list" if $file;
77 while ( my $line = $lines->next ) {
78 say "Skipping " . $line->accountlines_id . "; Not a debt" and next
79 if $line->is_credit && $verbose > 1;
80 say "Skipping " . $line->accountlines_id . "; Is a PAYOUT" and next
81 if $line->debit_type_code eq 'PAYOUT' && $verbose > 1;
84 $line->_result->result_source->schema->txn_do(
87 # A 'writeoff' is a 'credit'
88 my $writeoff = Koha::Account::Line->new(
91 amount => 0 - $line->amountoutstanding,
92 credit_type_code => 'WRITEOFF',
94 amountoutstanding => 0 - $line->amountoutstanding,
96 borrowernumber => $line->borrowernumber,
97 interface => 'intranet',
102 my $writeoff_offset = Koha::Account::Offset->new(
104 credit_id => $writeoff->accountlines_id,
106 amount => $line->amountoutstanding
110 # Link writeoff to charge
116 $writeoff->status('APPLIED')->store();
118 # Update status of original debit
119 $line->status('FORGIVEN')->store;
126 say "Accountline " . $line->accountlines_id . " written off";
129 say "Accountline " . $line->accountlines_id . " will be written off";
144 ./writeoff_debts.pl --added_before DATE --type OVERDUE --file REPORT --confirm
146 This script batch waives debts.
148 The options to select the debt records to writeoff are cumulative. For
149 example, supplying both --added_before and --type specifies that the
150 accountline must meet both conditions to be selected for writeoff.
152 You must pass at least one of the filtering options for the script to run.
153 This is to prevent an accidental 'writeoff all' operation.
161 Prints this help message
163 =item B<--added-before>
165 Writeoff debts added before the date passed.
167 Dates should be in ISO format, e.g., 2013-07-19, and can be generated
168 with `date -d '-3 month' --iso-8601`.
170 =item B<--added-after>
172 Writeoff debts added after the date passed.
174 Dates should be in ISO format, e.g., 2013-07-19, and can be generated
175 with `date -d '-3 month' --iso-8601`.
177 =item B<--category-code>
179 Writeoff debts for patrons belonging to the passed categories.
181 Can be used multiple times for additional category codes.
185 Writeoff debts of the passed type. Accepts a list of CREDIT_TYPE_CODEs.
189 Writeoff debts passed as one accountlines_id per line in this file. If other
190 criteria are defined it will only writeoff those in the file that match those
193 =item B<-v|--verbose>
195 This flag set the script to output logging for the actions it will perform.
197 =item B<-c|--confirm>
199 This flag must be provided in order for the script to actually
200 writeoff debts. If it is not supplied, the script will
201 only report on the accountline records it would have been written off.
207 Martin Renvoize <martin.renvoize@ptfs-europe.com>
211 Copyright 2020 PTFS Europe
215 This file is part of Koha.
217 Koha is free software; you can redistribute it and/or modify it
218 under the terms of the GNU General Public License as published by
219 the Free Software Foundation; either version 3 of the License, or
220 (at your option) any later version.
222 Koha is distributed in the hope that it will be useful, but
223 WITHOUT ANY WARRANTY; without even the implied warranty of
224 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
225 GNU General Public License for more details.
227 You should have received a copy of the GNU General Public License
228 along with Koha; if not, see <http://www.gnu.org/licenses>.
230 =head1 DISCLAIMER OF WARRANTY
232 Koha is distributed in the hope that it will be useful, but WITHOUT ANY
233 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
234 A PARTICULAR PURPOSE. See the GNU General Public License for more details.