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.
+amount that was paid.
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
$newamtos = $accdata->{'amountoutstanding'} - $amountleft;
$amountleft = 0;
}
- my $thisacct = $accdata->{accountno};
+ my $thisacct = $accdata->{accountlines_id};
my $usth = $dbh->prepare(
"UPDATE accountlines SET amountoutstanding= ?
- WHERE (borrowernumber = ?) AND (accountno=?)"
+ WHERE (accountlines_id = ?)"
);
- $usth->execute( $newamtos, $borrowernumber, $thisacct );
+ $usth->execute( $newamtos, $thisacct );
$usth->finish;
# $usth = $dbh->prepare(
# "INSERT INTO accountoffsets
=head2 makepayment
- &makepayment($borrowernumber, $acctnumber, $amount, $branchcode);
+ &makepayment($accountlines_id, $borrowernumber, $acctnumber, $amount, $branchcode);
Records the fact that a patron has paid off the entire amount he or
she owes.
#here we update both the accountoffsets and the account lines
#updated to check, if they are paying off a lost item, we return the item
# from their card, and put a note on the item record
- my ( $borrowernumber, $accountno, $amount, $user, $branch ) = @_;
+ my ( $accountlines_id, $borrowernumber, $accountno, $amount, $user, $branch ) = @_;
my $dbh = C4::Context->dbh;
my $manager_id = 0;
$manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
# begin transaction
my $nextaccntno = getnextacctno($borrowernumber);
my $newamtos = 0;
- my $sth =
- $dbh->prepare(
- "SELECT * FROM accountlines WHERE borrowernumber=? AND accountno=?");
- $sth->execute( $borrowernumber, $accountno );
+ my $sth = $dbh->prepare("SELECT * FROM accountlines WHERE accountlines_id=?");
+ $sth->execute( $accountlines_id );
my $data = $sth->fetchrow_hashref;
$sth->finish;
$dbh->prepare(
"UPDATE accountlines
SET amountoutstanding = 0, description = 'Payment,thanks'
- WHERE borrowernumber = ?
- AND accountno = ?
+ WHERE accountlines_id = ?
"
);
- $udp->execute($borrowernumber, $accountno );
+ $udp->execute($accountlines_id);
$udp->finish;
}else{
my $udp =
$dbh->prepare(
"UPDATE accountlines
SET amountoutstanding = 0
- WHERE borrowernumber = ?
- AND accountno = ?
+ WHERE accountlines_id = ?
"
);
- $udp->execute($borrowernumber, $accountno );
+ $udp->execute($accountlines_id);
$udp->finish;
# create new line
if ( $data->{'accounttype'} eq 'Rep' || $data->{'accounttype'} eq 'L' ) {
C4::Circulation::ReturnLostItem( $borrowernumber, $data->{'itemnumber'} );
}
+ my $sthr = $dbh->prepare("SELECT max(accountlines_id) AS lastinsertid FROM accountlines");
+ $sthr->execute();
+ my $datalastinsertid = $sthr->fetchrow_hashref;
+ $sthr->finish;
+ return $datalastinsertid->{'lastinsertid'};
}
=head2 getnextacctno
=head2 fixaccounts (removed)
- &fixaccounts($borrowernumber, $accountnumber, $amount);
+ &fixaccounts($accountlines_id, $borrowernumber, $accountnumber, $amount);
#'
# FIXME - I don't understand what this function does.
sub fixaccounts {
- my ( $borrowernumber, $accountno, $amount ) = @_;
+ my ( $accountlines_id, $borrowernumber, $accountno, $amount ) = @_;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare(
- "SELECT * FROM accountlines WHERE borrowernumber=?
- AND accountno=?"
+ "SELECT * FROM accountlines WHERE accountlines_id=?"
);
- $sth->execute( $borrowernumber, $accountno );
+ $sth->execute( $accountlines_id );
my $data = $sth->fetchrow_hashref;
# FIXME - Error-checking
UPDATE accountlines
SET amount = '$amount',
amountoutstanding = '$outstanding'
- WHERE borrowernumber = $borrowernumber
- AND accountno = $accountno
+ WHERE accountlines_id = $accountlines_id
EOT
# FIXME: exceedingly bad form. Use prepare with placholders ("?") in query and execute args.
}
$newamtos = $accdata->{'amountoutstanding'} - $amountleft;
$amountleft = 0;
}
- my $thisacct = $accdata->{accountno};
+ my $thisacct = $accdata->{accountlines_id};
my $usth = $dbh->prepare(
"UPDATE accountlines SET amountoutstanding= ?
- WHERE (borrowernumber = ?) AND (accountno=?)"
+ WHERE (accountlines_id = ?)"
);
- $usth->execute( $newamtos, $borrowernumber, $thisacct );
+ $usth->execute( $newamtos, $thisacct );
$usth->finish;
$usth = $dbh->prepare(
"INSERT INTO accountoffsets
$newamtos = $accdata->{'amountoutstanding'} - $amountleft;
$amountleft = 0;
}
- my $thisacct = $accdata->{accountno};
+ my $thisacct = $accdata->{accountlines_id};
my $usth = $dbh->prepare(
"UPDATE accountlines SET amountoutstanding= ?
- WHERE (borrowernumber = ?) AND (accountno=?)"
+ WHERE (accountlines_id = ?)"
);
- $usth->execute( $newamtos, $borrowernumber, $thisacct );
+ $usth->execute( $newamtos, $thisacct );
$usth->finish;
$usth = $dbh->prepare(
"INSERT INTO accountoffsets
}
# print $amountleft;
- my $thisacct = $accdata->{accountno};
+ my $thisacct = $accdata->{accountlines_id};
my $usth = $dbh->prepare(
"UPDATE accountlines SET amountoutstanding= ?
- WHERE (borrowernumber = ?) AND (accountno=?)"
+ WHERE (accountlines_id = ?)"
);
- $usth->execute( $newamtos, $borrowernumber, $thisacct );
+ $usth->execute( $newamtos, $thisacct );
$usth->finish;
$usth = $dbh->prepare(
"INSERT INTO accountoffsets
}
sub ModNote {
- my ( $borrowernumber, $accountno, $note ) = @_;
+ my ( $accountlines_id, $note ) = @_;
my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare('UPDATE accountlines SET note = ? WHERE borrowernumber = ? AND accountno = ?');
- $sth->execute( $note, $borrowernumber, $accountno );
+ my $sth = $dbh->prepare('UPDATE accountlines SET note = ? WHERE accountlines_id = ?');
+ $sth->execute( $note, $accountlines_id );
}
sub getcredits {
}
sub ReversePayment {
- my ( $borrowernumber, $accountno ) = @_;
- my $dbh = C4::Context->dbh;
-
- my $sth = $dbh->prepare('SELECT amountoutstanding FROM accountlines WHERE borrowernumber = ? AND accountno = ?');
- $sth->execute( $borrowernumber, $accountno );
- my $row = $sth->fetchrow_hashref();
- my $amount_outstanding = $row->{'amountoutstanding'};
-
- if ( $amount_outstanding <= 0 ) {
- $sth = $dbh->prepare('UPDATE accountlines SET amountoutstanding = amount * -1, description = CONCAT( description, " Reversed -" ) WHERE borrowernumber = ? AND accountno = ?');
- $sth->execute( $borrowernumber, $accountno );
- } else {
- $sth = $dbh->prepare('UPDATE accountlines SET amountoutstanding = 0, description = CONCAT( description, " Reversed -" ) WHERE borrowernumber = ? AND accountno = ?');
- $sth->execute( $borrowernumber, $accountno );
- }
+ my ( $accountlines_id ) = @_;
+ my $dbh = C4::Context->dbh;
+
+ my $sth = $dbh->prepare('SELECT amountoutstanding FROM accountlines WHERE accountlines_id = ?');
+ $sth->execute( $accountlines_id );
+ my $row = $sth->fetchrow_hashref();
+ my $amount_outstanding = $row->{'amountoutstanding'};
+
+ if ( $amount_outstanding <= 0 ) {
+ $sth = $dbh->prepare('UPDATE accountlines SET amountoutstanding = amount * -1, description = CONCAT( description, " Reversed -" ) WHERE accountlines_id = ?');
+ $sth->execute( $accountlines_id );
+ } else {
+ $sth = $dbh->prepare('UPDATE accountlines SET amountoutstanding = 0, description = CONCAT( description, " Reversed -" ) WHERE accountlines_id = ?');
+ $sth->execute( $accountlines_id );
+ }
}
=head2 recordpayment_selectaccts
# offset transactions
my $sth = $dbh->prepare('UPDATE accountlines SET amountoutstanding= ? ' .
- 'WHERE (borrowernumber = ?) AND (accountno=?)');
+ 'WHERE accountlines_id=?');
for my $accdata ( @{$rows} ) {
if ($amountleft == 0) {
last;
$newamtos = $accdata->{amountoutstanding} - $amountleft;
$amountleft = 0;
}
- my $thisacct = $accdata->{accountno};
- $sth->execute( $newamtos, $borrowernumber, $thisacct );
+ my $thisacct = $accdata->{accountlines_id};
+ $sth->execute( $newamtos, $thisacct );
}
# create new line
# makepayment needs to be fixed to handle partials till then this separate subroutine
# fills in
sub makepartialpayment {
- my ( $borrowernumber, $accountno, $amount, $user, $branch ) = @_;
+ my ( $accountlines_id, $borrowernumber, $accountno, $amount, $user, $branch ) = @_;
my $manager_id = 0;
$manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
if (!$amount || $amount < 0) {
my $newamtos = 0;
my $data = $dbh->selectrow_hashref(
- 'SELECT * FROM accountlines WHERE borrowernumber=? AND accountno=?',undef,$borrowernumber,$accountno);
+ 'SELECT * FROM accountlines WHERE accountlines_id=?',undef,$accountlines_id);
my $new_outstanding = $data->{amountoutstanding} - $amount;
- my $update = 'UPDATE accountlines SET amountoutstanding = ? WHERE borrowernumber = ? '
- . ' AND accountno = ?';
- $dbh->do( $update, undef, $new_outstanding, $borrowernumber, $accountno);
+ my $update = 'UPDATE accountlines SET amountoutstanding = ? WHERE accountlines_id = ? ';
+ $dbh->do( $update, undef, $new_outstanding, $accountlines_id);
# create new line
my $insert = 'INSERT INTO accountlines (borrowernumber, accountno, date, amount, '
return 0 unless $data; # no warning, there's just nothing to fix
my $uquery;
- my @bind = ($borrowernumber, $item, $data->{'accountno'});
+ my @bind = ($data->{'accountlines_id'});
if ($exemptfine) {
$uquery = "update accountlines set accounttype='FFOR', amountoutstanding=0";
if (C4::Context->preference("FinesLog")) {
} else {
$uquery = "update accountlines set accounttype='F' ";
}
- $uquery .= " where (borrowernumber = ?) and (itemnumber = ?) and (accountno = ?)";
+ $uquery .= " where (accountlines_id = ?)";
my $usth = $dbh->prepare($uquery);
return $usth->execute(@bind);
}
$amountleft = $data->{'amountoutstanding'} - $amount; # Um, isn't this the same as ZERO? We just tested those two things are ==
}
my $usth = $dbh->prepare("UPDATE accountlines SET accounttype = 'LR',amountoutstanding='0'
- WHERE (borrowernumber = ?)
- AND (itemnumber = ?) AND (accountno = ?) ");
- $usth->execute($data->{'borrowernumber'},$itemnumber,$acctno); # We might be adjusting an account for some OTHER borrowernumber now. Not the one we passed in.
+ WHERE (accountlines_id = ?)");
+ $usth->execute($data->{'accountlines_id'}); # We might be adjusting an account for some OTHER borrowernumber now. Not the one we passed in.
#check if any credit is left if so writeoff other accounts
my $nextaccntno = getnextacctno($data->{'borrowernumber'});
$amountleft *= -1 if ($amountleft < 0);
$newamtos = $accdata->{'amountoutstanding'} - $amountleft;
$amountleft = 0;
}
- my $thisacct = $accdata->{'accountno'};
+ my $thisacct = $accdata->{'accountlines_id'};
# FIXME: move prepares outside while loop!
my $usth = $dbh->prepare("UPDATE accountlines SET amountoutstanding= ?
- WHERE (borrowernumber = ?)
- AND (accountno=?)");
- $usth->execute($newamtos,$data->{'borrowernumber'},'$thisacct'); # FIXME: '$thisacct' is a string literal!
+ WHERE (accountlines_id = ?)");
+ $usth->execute($newamtos,'$thisacct'); # FIXME: '$thisacct' is a string literal!
$usth = $dbh->prepare("INSERT INTO accountoffsets
(borrowernumber, accountno, offsetaccount, offsetamount)
VALUES
use C4::Members::Attributes qw(GetBorrowerAttributes);
our $input = CGI->new;
+our $writeoff_sth;
+our $add_writeoff_sth;
our ( $template, $loggedinuser, $cookie ) = get_template_and_user(
{ template_name => 'members/pay.tmpl',
if ($writeoff_all) {
writeoff_all(@names);
} elsif ($writeoff_item) {
- my $accountno = $input->param('accountno');
+ my $accountlines_id = $input->param('accountlines_id');
my $itemno = $input->param('itemnumber');
my $account_type = $input->param('accounttype');
my $amount = $input->param('amountoutstanding');
- WriteOffFee( $borrowernumber, $accountno, $itemno, $account_type, $amount, $branch );
+ WriteOffFee( $borrowernumber, $accountlines_id, $itemno, $account_type, $amount, $branch );
}
for (@names) {
output_html_with_http_headers $input, $cookie, $template->output;
+sub writeoff {
+ my ( $accountlines_id, $itemnum, $accounttype, $amount ) = @_;
+ my $manager_id = 0;
+ $manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
+
+ # if no item is attached to fine, make sure to store it as a NULL
+ $itemnum ||= undef;
+ get_writeoff_sth();
+ $writeoff_sth->execute( $accountlines_id );
+
+ my $acct = getnextacctno($borrowernumber);
+ $add_writeoff_sth->execute( $borrowernumber, $acct, $itemnum, $amount, $manager_id );
+
+ UpdateStats( $branch, 'writeoff', $amount, q{}, q{}, q{}, $borrowernumber );
+
+ return;
+}
sub add_accounts_to_template {
$redirect .= get_for_redirect( 'itemnumber', "itemnumber$line_no", 0 );
$redirect .= get_for_redirect( 'notify_id', "notify_id$line_no", 0 );
$redirect .= get_for_redirect( 'notify_level', "notify_level$line_no", 0 );
+ $redirect .= get_for_redirect( 'accountlines_id', "accountlines_id$line_no", 0 );
$redirect .= '&remote_user=';
$redirect .= $user;
return print $input->redirect($redirect);
my $itemno = $input->param("itemnumber$value");
my $amount = $input->param("amountoutstanding$value");
my $accountno = $input->param("accountno$value");
- WriteOffFee( $borrowernumber, $accountno, $itemno, $accounttype, $amount, $branch );
+ my $accountlines_id = $input->param("accountlines_id$value");
+ WriteOffFee( $borrowernumber, $accountlines_id, $itemno, $accounttype, $amount, $branch );
}
}
print $input->redirect($redirect);
return;
}
+
+sub get_writeoff_sth {
+
+ # lets prepare these statement handles only once
+ if ($writeoff_sth) {
+ return;
+ } else {
+ my $dbh = C4::Context->dbh;
+
+ # Do we need to validate accounttype
+ my $sql = 'Update accountlines set amountoutstanding=0 '
+ . 'WHERE accountlines_id=?';
+ $writeoff_sth = $dbh->prepare($sql);
+ my $insert =
+q{insert into accountlines (borrowernumber,accountno,itemnumber,date,amount,description,accounttype,manager_id)}
+ . q{values (?,?,?,now(),?,'Writeoff','W',?)};
+ $add_writeoff_sth = $dbh->prepare($insert);
+ }
+ return;
+}