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>.
26 use Koha::Account::Lines;
27 use Koha::Account::Offsets;
31 use vars qw(@ISA @EXPORT);
38 purge_zero_balance_fees
44 C4::Accounts - Functions for dealing with Koha accounts
52 The functions in this module deal with the monetary aspect of Koha,
53 including looking up and modifying the amount of money owed by a
60 In a default install of Koha the following lost values are set
65 FIXME: itemlost should be set to 3 after payment is made, should be a warning to the interface that a charge has been added
66 FIXME : if no replacement price, borrower just doesn't get charged?
71 my $dbh = C4::Context->dbh();
72 my ($borrowernumber, $itemnumber, $amount, $description) = @_;
73 my $itype = Koha::ItemTypes->find({ itemtype => Koha::Items->find($itemnumber)->effective_itemtype() });
74 my $replacementprice = $amount;
75 my $defaultreplacecost = $itype->defaultreplacecost;
76 my $processfee = $itype->processfee;
77 my $usedefaultreplacementcost = C4::Context->preference("useDefaultReplacementCost");
78 my $processingfeenote = C4::Context->preference("ProcessingFeeNote");
79 if ($usedefaultreplacementcost && $amount == 0 && $defaultreplacecost){
80 $replacementprice = $defaultreplacecost;
82 my $checkout = Koha::Checkouts->find({ itemnumber => $itemnumber });
83 my $issue_id = $checkout ? $checkout->issue_id : undef;
85 my $account = Koha::Account->new({ patron_id => $borrowernumber });
86 # first make sure the borrower hasn't already been charged for this item (for this issuance)
87 my $existing_charges = $account->lines->search(
89 itemnumber => $itemnumber,
90 debit_type_code => 'LOST',
96 unless ($existing_charges) {
98 if ($processfee && $processfee > 0){
99 my $accountline = $account->add_debit(
101 amount => $processfee,
102 description => $description,
103 note => $processingfeenote,
104 user_id => C4::Context->userenv ? C4::Context->userenv->{'number'} : undef,
105 interface => C4::Context->interface,
106 library_id => C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef,
107 type => 'PROCESSING',
108 item_id => $itemnumber,
109 issue_id => $issue_id,
114 if ($replacementprice > 0){
115 my $accountline = $account->add_debit(
117 amount => $replacementprice,
118 description => $description,
120 user_id => C4::Context->userenv ? C4::Context->userenv->{'number'} : undef,
121 interface => C4::Context->interface,
122 library_id => C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef,
124 item_id => $itemnumber,
125 issue_id => $issue_id,
132 =head2 purge_zero_balance_fees
134 purge_zero_balance_fees( $days );
136 Delete accountlines entries where amountoutstanding is 0 or NULL which are more than a given number of days old.
138 B<$days> -- Zero balance fees older than B<$days> days old will be deleted.
140 B<Warning:> Because fines and payments are not linked in accountlines, it is
141 possible for a fine to be deleted without the accompanying payment,
142 or vise versa. This won't affect the account balance, but might be
147 sub purge_zero_balance_fees {
151 my $dbh = C4::Context->dbh;
152 my $sth = $dbh->prepare(
154 DELETE a1 FROM accountlines a1
156 LEFT JOIN account_offsets credit_offset ON ( a1.accountlines_id = credit_offset.credit_id )
157 LEFT JOIN accountlines a2 ON ( credit_offset.debit_id = a2.accountlines_id )
159 LEFT JOIN account_offsets debit_offset ON ( a1.accountlines_id = debit_offset.debit_id )
160 LEFT JOIN accountlines a3 ON ( debit_offset.credit_id = a3.accountlines_id )
162 WHERE a1.date < date_sub(curdate(), INTERVAL ? DAY)
163 AND ( a1.amountoutstanding = 0 OR a1.amountoutstanding IS NULL )
164 AND ( a2.amountoutstanding = 0 OR a2.amountoutstanding IS NULL )
165 AND ( a3.amountoutstanding = 0 OR a3.amountoutstanding IS NULL )
168 $sth->execute($days) or die $dbh->errstr;
171 END { } # module clean-up code here (global destructor)