9 use Koha::Account::Lines;
12 use Koha::Script -cron;
14 my ( $help, $verbose, @type, $added, $file, $confirm );
17 'v|verbose+' => \$verbose,
19 'ab|added_before:s' => \$added,
21 'c|confirm' => \$confirm,
23 @type = split( /,/, join( ',', @type ) );
25 pod2usage(1) if ( $help || !$confirm && !$verbose || !$file && !@type && !$added );
27 my $where = { 'amountoutstanding' => { '>' => 0 } };
31 my @accounts_from_file;
32 open( my $fh, '<:encoding(UTF-8)', $file )
33 or die "Could not open file '$file' $!";
34 while ( my $line = <$fh> ) {
36 push @accounts_from_file, $line;
39 $where->{accountlines_id} = { '-in' => \@accounts_from_file };
43 $where->{debit_type_code} = \@type;
47 my $added_before = dt_from_string( $added, 'iso' );
48 my $dtf = Koha::Database->new->schema->storage->datetime_parser;
49 $where->{date} = { '<' => $dtf->format_datetime($added_before) };
52 my $lines = Koha::Account::Lines->search( $where, $attr );
54 print "Attempting to write off " . $lines->count . " debts";
55 print " of type " . join(',',@type) if @type;
56 print " added before " . $added if $added;
57 print " from the passed list" if $file;
61 while ( my $line = $lines->next ) {
62 say "Skipping " . $line->accountlines_id . "; Not a debt" and next
63 if $line->is_credit && $verbose > 1;
64 say "Skipping " . $line->accountlines_id . "; Is a PAYOUT" and next
65 if $line->debit_type_code eq 'PAYOUT' && $verbose > 1;
68 $line->_result->result_source->schema->txn_do(
71 # A 'writeoff' is a 'credit'
72 my $writeoff = Koha::Account::Line->new(
75 amount => 0 - $line->amount,
76 credit_type_code => 'WRITEOFF',
78 amountoutstanding => 0 - $line->amount,
80 borrowernumber => $line->borrowernumber,
81 interface => 'intranet',
86 my $writeoff_offset = Koha::Account::Offset->new(
88 credit_id => $writeoff->accountlines_id,
90 amount => $line->amount
94 # Link writeoff to charge
98 offset_type => 'WRITEOFF'
101 $writeoff->status('APPLIED')->store();
103 # Update status of original debit
104 $line->status('FORGIVEN')->store;
111 say "Accountline " . $line->accountlines_id . " written off";
114 say "Accountline " . $line->accountlines_id . " will be written off";
129 ./writeoff_debts.pl --added_before DATE --type OVERDUE --file REPORT --confirm
131 This script batch waives debts.
133 The options to select the debt records to writeoff are cumulative. For
134 example, supplying both --added_before and --type specifies that the
135 accountline must meet both conditions to be selected for writeoff.
137 You must pass at least one of the filtering options for the script to run.
138 This is to prevent an accidental 'writeoff all' operation.
146 Prints this help message
148 =item B<--added_before>
150 Writeoff debts added before the date passed.
152 Dates should be in ISO format, e.g., 2013-07-19, and can be generated
153 with `date -d '-3 month' --iso-8601`.
157 Writeoff debts of the passed type. Accepts a list of CREDIT_TYPE_CODEs.
161 Writeoff debts passed as one accountlines_id per line in this file. If other
162 criteria are defined it will only writeoff those in the file that match those
165 =item B<-v|--verbose>
167 This flag set the script to output logging for the actions it will perform.
169 =item B<-c|--confirm>
171 This flag must be provided in order for the script to actually
172 writeoff debts. If it is not supplied, the script will
173 only report on the accountline records it would have been written off.
179 Martin Renvoize <martin.renvoize@ptfs-europe.com>
183 Copyright 2020 PTFS Europe
187 This file is part of Koha.
189 Koha is free software; you can redistribute it and/or modify it
190 under the terms of the GNU General Public License as published by
191 the Free Software Foundation; either version 3 of the License, or
192 (at your option) any later version.
194 Koha is distributed in the hope that it will be useful, but
195 WITHOUT ANY WARRANTY; without even the implied warranty of
196 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
197 GNU General Public License for more details.
199 You should have received a copy of the GNU General Public License
200 along with Koha; if not, see <http://www.gnu.org/licenses>.
202 =head1 DISCLAIMER OF WARRANTY
204 Koha is distributed in the hope that it will be useful, but WITHOUT ANY
205 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
206 A PARTICULAR PURPOSE. See the GNU General Public License for more details.