Bug 25752: Stay in cwd after koha-shell
[koha.git] / C4 / Accounts.pm
blobbf8076d804638500d43fbd48a7d7eaa811afdffd
1 package C4::Accounts;
3 # Copyright 2000-2002 Katipo Communications
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
21 use Modern::Perl;
22 use C4::Context;
23 use C4::Stats;
24 use C4::Members;
25 use C4::Log qw(logaction);
26 use Koha::Account;
27 use Koha::Account::Lines;
28 use Koha::Account::Offsets;
29 use Koha::Items;
31 use Mojo::Util qw(deprecated);
32 use Data::Dumper qw(Dumper);
34 use vars qw(@ISA @EXPORT);
36 BEGIN {
37 require Exporter;
38 @ISA = qw(Exporter);
39 @EXPORT = qw(
40 &chargelostitem
41 &purge_zero_balance_fees
45 =head1 NAME
47 C4::Accounts - Functions for dealing with Koha accounts
49 =head1 SYNOPSIS
51 use C4::Accounts;
53 =head1 DESCRIPTION
55 The functions in this module deal with the monetary aspect of Koha,
56 including looking up and modifying the amount of money owed by a
57 patron.
59 =head1 FUNCTIONS
61 =head2 chargelostitem
63 In a default install of Koha the following lost values are set
64 1 = Lost
65 2 = Long overdue
66 3 = Lost and paid for
68 FIXME: itemlost should be set to 3 after payment is made, should be a warning to the interface that a charge has been added
69 FIXME : if no replacement price, borrower just doesn't get charged?
71 =cut
73 sub chargelostitem {
74 my $dbh = C4::Context->dbh();
75 my ($borrowernumber, $itemnumber, $amount, $description) = @_;
76 my $itype = Koha::ItemTypes->find({ itemtype => Koha::Items->find($itemnumber)->effective_itemtype() });
77 my $replacementprice = $amount;
78 my $defaultreplacecost = $itype->defaultreplacecost;
79 my $processfee = $itype->processfee;
80 my $usedefaultreplacementcost = C4::Context->preference("useDefaultReplacementCost");
81 my $processingfeenote = C4::Context->preference("ProcessingFeeNote");
82 if ($usedefaultreplacementcost && $amount == 0 && $defaultreplacecost){
83 $replacementprice = $defaultreplacecost;
85 my $checkout = Koha::Checkouts->find({ itemnumber => $itemnumber });
86 my $issue_id = $checkout ? $checkout->issue_id : undef;
88 my $account = Koha::Account->new({ patron_id => $borrowernumber });
89 # first make sure the borrower hasn't already been charged for this item (for this issuance)
90 my $existing_charges = $account->lines->search(
92 itemnumber => $itemnumber,
93 debit_type_code => 'LOST',
94 issue_id => $issue_id
96 )->count();
98 # OK, they haven't
99 unless ($existing_charges) {
100 #add processing fee
101 if ($processfee && $processfee > 0){
102 my $accountline = $account->add_debit(
104 amount => $processfee,
105 description => $description,
106 note => $processingfeenote,
107 user_id => C4::Context->userenv ? C4::Context->userenv->{'number'} : undef,
108 interface => C4::Context->interface,
109 library_id => C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef,
110 type => 'PROCESSING',
111 item_id => $itemnumber,
112 issue_id => $issue_id,
116 #add replace cost
117 if ($replacementprice > 0){
118 my $accountline = $account->add_debit(
120 amount => $replacementprice,
121 description => $description,
122 note => undef,
123 user_id => C4::Context->userenv ? C4::Context->userenv->{'number'} : undef,
124 interface => C4::Context->interface,
125 library_id => C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef,
126 type => 'LOST',
127 item_id => $itemnumber,
128 issue_id => $issue_id,
135 =head2 manualinvoice
137 &manualinvoice($borrowernumber, $itemnumber, $description, $type,
138 $amount, $note);
140 This function is now deprecated and not used anywhere within koha. It is due for complete removal in 19.11
142 =cut
144 sub manualinvoice {
145 my ( $borrowernumber, $itemnum, $desc, $type, $amount, $note ) = @_;
147 deprecated "C4::Accounts::manualinvoice is deprecated in favor of Koha::Account->add_debit";
149 my $manager_id = C4::Context->userenv ? C4::Context->userenv->{'number'} : undef;
150 my $dbh = C4::Context->dbh;
151 my $amountleft = $amount;
153 my $branchcode = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
155 my $issue_id;
156 if ( $type eq 'LOST' && $itemnum ) {
157 my $checkouts = Koha::Checkouts->search(
158 { itemnumber => $itemnum, borrowernumber => $borrowernumber } );
159 my $checkout =
160 $checkouts->count
161 ? $checkouts->next
162 : Koha::Old::Checkouts->search(
163 { itemnumber => $itemnum, borrowernumber => $borrowernumber },
164 { order_by => { -desc => 'returndate' }, rows => 1 }
165 )->next;
166 $issue_id = $checkout ? $checkout->issue_id : undef;
169 my $accountline = Koha::Account::Line->new(
171 borrowernumber => $borrowernumber,
172 date => \'NOW()',
173 amount => $amount,
174 description => $desc,
175 debit_type_code => $type,
176 amountoutstanding => $amountleft,
177 itemnumber => $itemnum || undef,
178 issue_id => $issue_id,
179 note => $note,
180 manager_id => $manager_id,
181 interface => C4::Context->interface,
182 branchcode => $branchcode,
184 )->store();
186 my $account_offset = Koha::Account::Offset->new(
188 debit_id => $accountline->id,
189 type => 'Manual Debit',
190 amount => $amount,
192 )->store();
194 if ( C4::Context->preference("FinesLog") ) {
195 logaction("FINES", 'CREATE',$borrowernumber,Dumper({
196 action => 'create_fee',
197 borrowernumber => $borrowernumber,
198 amount => $amount,
199 description => $desc,
200 debit_type_code => $type,
201 amountoutstanding => $amountleft,
202 note => $note,
203 itemnumber => $itemnum,
204 manager_id => $manager_id,
205 }));
208 return 0;
211 =head2 purge_zero_balance_fees
213 purge_zero_balance_fees( $days );
215 Delete accountlines entries where amountoutstanding is 0 or NULL which are more than a given number of days old.
217 B<$days> -- Zero balance fees older than B<$days> days old will be deleted.
219 B<Warning:> Because fines and payments are not linked in accountlines, it is
220 possible for a fine to be deleted without the accompanying payment,
221 or vise versa. This won't affect the account balance, but might be
222 confusing to staff.
224 =cut
226 sub purge_zero_balance_fees {
227 my $days = shift;
228 my $count = 0;
230 my $dbh = C4::Context->dbh;
231 my $sth = $dbh->prepare(
233 DELETE a1 FROM accountlines a1
235 LEFT JOIN account_offsets credit_offset ON ( a1.accountlines_id = credit_offset.credit_id )
236 LEFT JOIN accountlines a2 ON ( credit_offset.debit_id = a2.accountlines_id )
238 LEFT JOIN account_offsets debit_offset ON ( a1.accountlines_id = debit_offset.debit_id )
239 LEFT JOIN accountlines a3 ON ( debit_offset.credit_id = a3.accountlines_id )
241 WHERE a1.date < date_sub(curdate(), INTERVAL ? DAY)
242 AND ( a1.amountoutstanding = 0 OR a1.amountoutstanding IS NULL )
243 AND ( a2.amountoutstanding = 0 OR a2.amountoutstanding IS NULL )
244 AND ( a3.amountoutstanding = 0 OR a3.amountoutstanding IS NULL )
247 $sth->execute($days) or die $dbh->errstr;
250 END { } # module clean-up code here (global destructor)
253 __END__
255 =head1 SEE ALSO
257 DBI(3)
259 =cut