Koha/C4/Accounts.pm
Martin Renvoize 3770ebc0e9
Bug 28854: Record and display who lost the item
This patch records the bundle issue from which an item is marked as lost
so that we may use that to infer who lost the item (for later charges
and display).

Test plan
0) Apply all patches up to this point
1) Checkout a bundle to a user
2) Checkin the bundle and do not scan one of the barcodes at
   confirmation
   * Note that the item not scanned is marked as lost
3) Navigate to the biblio for the lost item and note that it is marked
   as lost.
4) Navigate to the biblio for the collection and expand the collection
   item that contains the lost item. Note the item is marked as lost and
   checkout details are listed.
5) Checkin the lost item
   * The item should be marked as found and the return_claims line should
   be marked as resolved.

Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2022-07-13 10:35:31 -03:00

186 lines
5.9 KiB
Perl

package C4::Accounts;
# Copyright 2000-2002 Katipo Communications
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use C4::Context;
use C4::Stats;
use C4::Members;
use Koha::Account;
use Koha::Account::Lines;
use Koha::Account::Offsets;
use Koha::Items;
use vars qw(@ISA @EXPORT);
BEGIN {
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(
chargelostitem
purge_zero_balance_fees
);
}
=head1 NAME
C4::Accounts - Functions for dealing with Koha accounts
=head1 SYNOPSIS
use C4::Accounts;
=head1 DESCRIPTION
The functions in this module deal with the monetary aspect of Koha,
including looking up and modifying the amount of money owed by a
patron.
=head1 FUNCTIONS
=head2 chargelostitem
In a default install of Koha the following lost values are set
1 = Lost
2 = Long overdue
3 = Lost and paid for
FIXME: itemlost should be set to 3 after payment is made, should be a warning to the interface that a charge has been added
FIXME : if no replacement price, borrower just doesn't get charged?
=cut
sub chargelostitem {
my $dbh = C4::Context->dbh();
my ($borrowernumber, $itemnumber, $amount, $description) = @_;
my $item = Koha::Items->find($itemnumber);
my $itype = Koha::ItemTypes->find({ itemtype => $item->effective_itemtype() });
my $replacementprice = $amount;
my $defaultreplacecost = $itype->defaultreplacecost;
my $processfee = $itype->processfee;
my $usedefaultreplacementcost = C4::Context->preference("useDefaultReplacementCost");
my $processingfeenote = C4::Context->preference("ProcessingFeeNote");
if ($usedefaultreplacementcost && $amount == 0 && $defaultreplacecost){
$replacementprice = $defaultreplacecost;
}
my $checkout = Koha::Checkouts->find({ itemnumber => $itemnumber });
if ( !$checkout && $item->in_bundle ) {
my $host = $item->bundle_host;
$checkout = $host->checkout;
}
my $issue_id = $checkout ? $checkout->issue_id : undef;
my $account = Koha::Account->new({ patron_id => $borrowernumber });
# first make sure the borrower hasn't already been charged for this item (for this issuance)
my $existing_charges = $account->lines->search(
{
itemnumber => $itemnumber,
debit_type_code => 'LOST',
issue_id => $issue_id
}
)->count();
# OK, they haven't
unless ($existing_charges) {
#add processing fee
if ($processfee && $processfee > 0){
my $accountline = $account->add_debit(
{
amount => $processfee,
description => $description,
note => $processingfeenote,
user_id => C4::Context->userenv ? C4::Context->userenv->{'number'} : undef,
interface => C4::Context->interface,
library_id => C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef,
type => 'PROCESSING',
item_id => $itemnumber,
issue_id => $issue_id,
}
);
}
#add replace cost
if ($replacementprice > 0){
my $accountline = $account->add_debit(
{
amount => $replacementprice,
description => $description,
note => undef,
user_id => C4::Context->userenv ? C4::Context->userenv->{'number'} : undef,
interface => C4::Context->interface,
library_id => C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef,
type => 'LOST',
item_id => $itemnumber,
issue_id => $issue_id,
}
);
}
}
}
=head2 purge_zero_balance_fees
purge_zero_balance_fees( $days );
Delete accountlines entries where amountoutstanding is 0 or NULL which are more than a given number of days old.
B<$days> -- Zero balance fees older than B<$days> days old will be deleted.
B<Warning:> Because fines and payments are not linked in accountlines, it is
possible for a fine to be deleted without the accompanying payment,
or vise versa. This won't affect the account balance, but might be
confusing to staff.
=cut
sub purge_zero_balance_fees {
my $days = shift;
my $count = 0;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare(
q{
DELETE a1 FROM accountlines a1
LEFT JOIN account_offsets credit_offset ON ( a1.accountlines_id = credit_offset.credit_id )
LEFT JOIN accountlines a2 ON ( credit_offset.debit_id = a2.accountlines_id )
LEFT JOIN account_offsets debit_offset ON ( a1.accountlines_id = debit_offset.debit_id )
LEFT JOIN accountlines a3 ON ( debit_offset.credit_id = a3.accountlines_id )
WHERE a1.date < date_sub(curdate(), INTERVAL ? DAY)
AND ( a1.amountoutstanding = 0 OR a1.amountoutstanding IS NULL )
AND ( a2.amountoutstanding = 0 OR a2.amountoutstanding IS NULL )
AND ( a3.amountoutstanding = 0 OR a3.amountoutstanding IS NULL )
}
);
$sth->execute($days) or die $dbh->errstr;
}
END { } # module clean-up code here (global destructor)
1;
__END__
=head1 SEE ALSO
DBI(3)
=cut