use C4::Members;
use C4::Circulation qw(ReturnLostItem);
use C4::Log qw(logaction);
+use Koha::Account;
use Data::Dumper qw(Dumper);
-use vars qw($VERSION @ISA @EXPORT);
+use vars qw(@ISA @EXPORT);
BEGIN {
- # set the version for version checking
- $VERSION = 3.07.00.049;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(
- &recordpayment
&makepayment
&manualinvoice
&getnextacctno
&getrefunds
&chargelostitem
&ReversePayment
- &makepartialpayment
- &recordpayment_selectaccts
- &WriteOffFee
+ &makepartialpayment
+ &recordpayment_selectaccts
+ &WriteOffFee
+ &purge_zero_balance_fees
);
}
=head1 FUNCTIONS
-=head2 recordpayment
-
- &recordpayment($borrowernumber, $payment, $sip_paytype, $note);
-
-Record payment by a patron. C<$borrowernumber> is the patron's
-borrower number. C<$payment> is a floating-point number, giving the
-amount that was paid. C<$sip_paytype> is an optional flag to indicate this
-payment was made over a SIP2 interface, rather than the staff client. The
-value passed is the SIP2 payment type value (message 37, characters 21-22)
-
-Amounts owed are paid off oldest first. That is, if the patron has a
-$1 fine from Feb. 1, another $1 fine from Mar. 1, and makes a payment
-of $1.50, then the oldest fine will be paid off in full, and $0.50
-will be credited to the next one.
-
-=cut
-
-#'
-sub recordpayment {
-
- #here we update the account lines
- my ( $borrowernumber, $data, $sip_paytype, $payment_note ) = @_;
- my $dbh = C4::Context->dbh;
- my $newamtos = 0;
- my $accdata = "";
- my $branch = C4::Context->userenv->{'branch'};
- my $amountleft = $data;
- my $manager_id = 0;
- $manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
-
- $payment_note //= "";
-
- # begin transaction
- my $nextaccntno = getnextacctno($borrowernumber);
-
- # get lines with outstanding amounts to offset
- my $sth = $dbh->prepare(
- "SELECT * FROM accountlines
- WHERE (borrowernumber = ?) AND (amountoutstanding<>0)
- ORDER BY date"
- );
- $sth->execute($borrowernumber);
-
- # offset transactions
- my @ids;
- while ( ( $accdata = $sth->fetchrow_hashref ) and ( $amountleft > 0 ) ) {
- if ( $accdata->{'amountoutstanding'} < $amountleft ) {
- $newamtos = 0;
- $amountleft -= $accdata->{'amountoutstanding'};
- }
- else {
- $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
- $amountleft = 0;
- }
- my $thisacct = $accdata->{accountlines_id};
- my $usth = $dbh->prepare(
- "UPDATE accountlines SET amountoutstanding= ?
- WHERE (accountlines_id = ?)"
- );
- $usth->execute( $newamtos, $thisacct );
-
- if ( C4::Context->preference("FinesLog") ) {
- $accdata->{'amountoutstanding_new'} = $newamtos;
- logaction("FINES", 'MODIFY', $borrowernumber, Dumper({
- action => 'fee_payment',
- borrowernumber => $accdata->{'borrowernumber'},
- old_amountoutstanding => $accdata->{'amountoutstanding'},
- new_amountoutstanding => $newamtos,
- amount_paid => $accdata->{'amountoutstanding'} - $newamtos,
- accountlines_id => $accdata->{'accountlines_id'},
- accountno => $accdata->{'accountno'},
- manager_id => $manager_id,
- note => $payment_note,
- }));
- push( @ids, $accdata->{'accountlines_id'} );
- }
- }
-
- # create new line
- my $usth = $dbh->prepare(
- "INSERT INTO accountlines
- (borrowernumber, accountno,date,amount,description,accounttype,amountoutstanding,manager_id, note)
- VALUES (?,?,now(),?,'',?,?,?,?)"
- );
-
- my $paytype = "Pay";
- $paytype .= $sip_paytype if defined $sip_paytype;
- $usth->execute( $borrowernumber, $nextaccntno, 0 - $data, $paytype, 0 - $amountleft, $manager_id, $payment_note );
- $usth->finish;
-
- UpdateStats({
- branch => $branch,
- type =>'payment',
- amount => $data,
- borrowernumber => $borrowernumber,
- accountno => $nextaccntno }
- );
-
- if ( C4::Context->preference("FinesLog") ) {
- $accdata->{'amountoutstanding_new'} = $newamtos;
- logaction("FINES", 'CREATE',$borrowernumber,Dumper({
- action => 'create_payment',
- borrowernumber => $borrowernumber,
- accountno => $nextaccntno,
- amount => $data * -1,
- amountoutstanding => $amountleft * -1,
- accounttype => 'Pay',
- accountlines_paid => \@ids,
- manager_id => $manager_id,
- }));
- }
-
-}
-
=head2 makepayment
&makepayment($accountlines_id, $borrowernumber, $acctnumber, $amount, $branchcode);
}
UpdateStats({
- branch => $user,
- type => 'payment',
- amount => $amount,
- borrowernumber => $borrowernumber,
- accountno => $accountno}
- );
+ branch => $branch,
+ type => 'payment',
+ amount => $amount,
+ borrowernumber => $borrowernumber,
+ accountno => $accountno
+ });
#check to see what accounttype
if ( $data->{'accounttype'} eq 'Rep' || $data->{'accounttype'} eq 'L' ) {
my $sql = 'SELECT * FROM accountlines WHERE (borrowernumber = ?) ' .
'AND (amountoutstanding<>0) ';
if (@{$accts} ) {
- $sql .= ' AND accountno IN ( ' . join ',', @{$accts};
+ $sql .= ' AND accountlines_id IN ( ' . join ',', @{$accts};
$sql .= ' ) ';
}
$sql .= ' ORDER BY date';
'', 'Pay', $data->{'itemnumber'}, $manager_id, $payment_note);
UpdateStats({
- branch => $user,
- type => 'payment',
- amount => $amount,
- borrowernumber => $borrowernumber,
- accountno => $accountno}
- );
+ branch => $branch,
+ type => 'payment',
+ amount => $amount,
+ borrowernumber => $borrowernumber,
+ accountno => $accountno
+ });
if ( C4::Context->preference("FinesLog") ) {
logaction("FINES", 'CREATE',$borrowernumber,Dumper({
}
+=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 FROM accountlines
+ WHERE date < date_sub(curdate(), INTERVAL ? DAY)
+ AND ( amountoutstanding = 0 or amountoutstanding IS NULL );
+ }
+ );
+ $sth->execute($days) or die $dbh->errstr;
+}
+
END { } # module clean-up code here (global destructor)
1;