Bug 24786: Update borroaccount to use session register
[koha.git] / C4 / Accounts.pm
blob7d7ac7601842575a25fd55f5db06241326418c3e
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 purge_zero_balance_fees
137 purge_zero_balance_fees( $days );
139 Delete accountlines entries where amountoutstanding is 0 or NULL which are more than a given number of days old.
141 B<$days> -- Zero balance fees older than B<$days> days old will be deleted.
143 B<Warning:> Because fines and payments are not linked in accountlines, it is
144 possible for a fine to be deleted without the accompanying payment,
145 or vise versa. This won't affect the account balance, but might be
146 confusing to staff.
148 =cut
150 sub purge_zero_balance_fees {
151 my $days = shift;
152 my $count = 0;
154 my $dbh = C4::Context->dbh;
155 my $sth = $dbh->prepare(
157 DELETE a1 FROM accountlines a1
159 LEFT JOIN account_offsets credit_offset ON ( a1.accountlines_id = credit_offset.credit_id )
160 LEFT JOIN accountlines a2 ON ( credit_offset.debit_id = a2.accountlines_id )
162 LEFT JOIN account_offsets debit_offset ON ( a1.accountlines_id = debit_offset.debit_id )
163 LEFT JOIN accountlines a3 ON ( debit_offset.credit_id = a3.accountlines_id )
165 WHERE a1.date < date_sub(curdate(), INTERVAL ? DAY)
166 AND ( a1.amountoutstanding = 0 OR a1.amountoutstanding IS NULL )
167 AND ( a2.amountoutstanding = 0 OR a2.amountoutstanding IS NULL )
168 AND ( a3.amountoutstanding = 0 OR a3.amountoutstanding IS NULL )
171 $sth->execute($days) or die $dbh->errstr;
174 END { } # module clean-up code here (global destructor)
177 __END__
179 =head1 SEE ALSO
181 DBI(3)
183 =cut