Merge remote-tracking branch 'origin/new/bug_7671'

This commit is contained in:
Paul Poulain 2012-09-15 07:35:25 +02:00
commit f32be62ef6
12 changed files with 130 additions and 78 deletions

View file

@ -72,7 +72,7 @@ patron.
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
@ -115,12 +115,12 @@ sub recordpayment {
$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
@ -146,7 +146,7 @@ sub recordpayment {
=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.
@ -167,7 +167,7 @@ sub makepayment {
#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;
@ -175,10 +175,8 @@ sub makepayment {
# 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;
@ -187,22 +185,20 @@ sub makepayment {
$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
@ -229,6 +225,11 @@ sub makepayment {
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
@ -256,18 +257,17 @@ sub 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
@ -279,8 +279,7 @@ sub fixaccounts {
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.
}
@ -460,12 +459,12 @@ sub fixcredit {
$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
@ -499,12 +498,12 @@ sub fixcredit {
$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
@ -565,12 +564,12 @@ sub refund {
}
# 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
@ -603,10 +602,10 @@ sub getcharges {
}
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 {
@ -651,21 +650,21 @@ sub getrefunds {
}
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
@ -709,7 +708,7 @@ sub 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;
@ -722,8 +721,8 @@ sub recordpayment_selectaccts {
$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
@ -738,7 +737,7 @@ sub recordpayment_selectaccts {
# 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) {
@ -750,12 +749,11 @@ sub makepartialpayment {
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, '

View file

@ -1953,7 +1953,7 @@ sub _FixOverduesOnReturn {
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")) {
@ -1973,7 +1973,7 @@ sub _FixOverduesOnReturn {
} 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);
}
@ -2016,9 +2016,8 @@ sub _FixAccountForLostAndReturned {
$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);
@ -2037,12 +2036,11 @@ sub _FixAccountForLostAndReturned {
$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

View file

@ -2466,6 +2466,7 @@ CREATE TABLE `messages` ( -- circulation messages left via the patron's check ou
DROP TABLE IF EXISTS `accountlines`;
CREATE TABLE `accountlines` (
`accountlines_id` int(11) NOT NULL AUTO_INCREMENT,
`borrowernumber` int(11) NOT NULL default 0,
`accountno` smallint(6) NOT NULL default 0,
`itemnumber` int(11) default NULL,
@ -2481,6 +2482,7 @@ CREATE TABLE `accountlines` (
`notify_level` int(2) NOT NULL default 0,
`note` text NULL default NULL,
`manager_id` int(11) NULL,
PRIMARY KEY (`accountlines_id`),
KEY `acctsborridx` (`borrowernumber`),
KEY `timeidx` (`timestamp`),
KEY `itemnumber` (`itemnumber`),

View file

@ -5788,6 +5788,13 @@ if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
SetVersion($DBversion);
}
$DBversion = "3.09.00.046";
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
$dbh->do("ALTER TABLE `accountlines` ADD `accountlines_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;");
print "Upgrade to $DBversion done (adding accountlines_id field in accountlines table)\n";
SetVersion($DBversion);
}
=head1 FUNCTIONS
=head2 TableExists($table)

View file

@ -51,7 +51,7 @@
[% IF ( reverse_col ) %]
<td>
[% IF ( account.payment ) %]
<a href="boraccount.pl?action=reverse&amp;borrowernumber=[% account.borrowernumber %]&amp;accountno=[% account.accountno %]">Reverse</a>
<a href="boraccount.pl?action=reverse&amp;accountlines_id=[% account.accountlines_id %]&amp;borrowernumber=[% account.borrowernumber %]">Reverse</a>
[% ELSE %]
&nbsp;
[% END %]
@ -59,9 +59,9 @@
[% END %]
<td>
[% IF ( account.payment ) %]
<a target="_blank" href="printfeercpt.pl?action=print&amp;borrowernumber=[% account.borrowernumber %]&amp;accountno=[% account.accountno %]">Print</a>
<a target="_blank" href="printfeercpt.pl?action=print&amp;accountlines_id=[% account.accountlines_id %]&amp;borrowernumber=[% account.borrowernumber %]">Print</a>
[% ELSE %]
<a target="_blank" href="printinvoice.pl?action=print&amp;borrowernumber=[% account.borrowernumber %]&amp;accountno=[% account.accountno %]">Print</a>
<a target="_blank" href="printinvoice.pl?action=print&amp;accountlines_id=[% account.accountlines_id %]&amp;borrowernumber=[% account.borrowernumber %]">Print</a>
[% END %]
</td>
</tr>

View file

@ -73,6 +73,7 @@
<input type="hidden" name="description[% line.accountno %]" value="[% line.description %]" />
<input type="hidden" name="accounttype[% line.accountno %]" value="[% line.accounttype %]" />
<input type="hidden" name="amount[% line.accountno %]" value="[% line.amount %]" />
<input type="hidden" name="accountlines_id[% line.accountno %]" value="[% line.accountlines_id %]" />
<input type="hidden" name="amountoutstanding[% line.accountno %]" value="[% line.amountoutstanding %]" />
<input type="hidden" name="borrowernumber[% line.accountno %]" value="[% line.borrowernumber %]" />
<input type="hidden" name="accountno[% line.accountno %]" value="[% line.accountno %]" />

View file

@ -102,6 +102,7 @@ function moneyFormat(textObj) {
<input type="hidden" name="amount" id="amount" value="[% amount %]" />
<input type="hidden" name="amountoutstanding" id="amountoutstanding" value="[% amountoutstanding %]" />
<input type="hidden" name="accountno" id="accountno" value="[% accountno %]" />
<input type="hidden" name="accountlines_id" id="accountlines_id" value="[% accountlines_id %]" />
<input type="hidden" name="title" id="title" value="[% title %]" />
<fieldset class="rows">
@ -157,6 +158,7 @@ function moneyFormat(textObj) {
<input type="hidden" name="amount" id="amount" value="[% amount %]" />
<input type="hidden" name="amountoutstanding" id="amountoutstanding" value="[% amountoutstanding %]" />
<input type="hidden" name="accountno" id="accountno" value="[% accountno %]" />
<input type="hidden" name="accountlines_id" id="accountlines_id" value="[% accountlines_id %]" />
<input type="hidden" name="title" id="title" value="[% title %]" />
<table>
<thead><tr>

View file

@ -16,7 +16,7 @@ the kohaversion is divided in 4 parts :
use strict;
sub kohaversion {
our $VERSION = '3.09.00.045';
our $VERSION = '3.09.00.046';
# version needs to be set this way
# so that it can be picked up by Makefile.PL
# during install

View file

@ -53,7 +53,7 @@ my $action = $input->param('action') || '';
my $data=GetMember('borrowernumber' => $borrowernumber);
if ( $action eq 'reverse' ) {
ReversePayment( $borrowernumber, $input->param('accountno') );
ReversePayment( $input->param('accountlines_id') );
}
if ( $data->{'category_type'} eq 'C') {

View file

@ -42,6 +42,8 @@ use C4::Branch;
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',
@ -83,11 +85,11 @@ my $writeoff_all = $input->param('woall'); # writeoff all fines
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) {
@ -106,6 +108,23 @@ add_accounts_to_template();
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 {
@ -167,6 +186,7 @@ sub redirect_to_paycollect {
$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);
@ -184,7 +204,8 @@ sub writeoff_all {
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 );
}
}
@ -250,3 +271,23 @@ sub payselected {
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;
}

View file

@ -56,7 +56,7 @@ my $writeoff = $input->param('writeoff_individual');
my $select_lines = $input->param('selected');
my $select = $input->param('selected_accts');
my $accountno;
my $accountlines_id;
if ( $individual || $writeoff ) {
if ($individual) {
$template->param( pay_individual => 1 );
@ -64,6 +64,7 @@ if ( $individual || $writeoff ) {
$template->param( writeoff_individual => 1 );
}
my $accounttype = $input->param('accounttype');
$accountlines_id = $input->param('accountlines_id');
my $amount = $input->param('amount');
my $amountoutstanding = $input->param('amountoutstanding');
$accountno = $input->param('accountno');
@ -75,6 +76,7 @@ if ( $individual || $writeoff ) {
$total_due = $amountoutstanding;
$template->param(
accounttype => $accounttype,
accountlines_id => $accountlines_id,
accountno => $accountno,
amount => $amount,
amountoutstanding => $amountoutstanding,
@ -101,10 +103,10 @@ if ( $total_paid and $total_paid ne '0.00' ) {
} else {
if ($individual) {
if ( $total_paid == $total_due ) {
makepayment( $borrowernumber, $accountno, $total_paid, $user,
makepayment( $accountlines_id, $borrowernumber, $accountno, $total_paid, $user,
$branch );
} else {
makepartialpayment( $borrowernumber, $accountno, $total_paid,
makepartialpayment( $accountlines_id, $borrowernumber, $accountno, $total_paid,
$user, $branch );
}
print $input->redirect(

View file

@ -48,6 +48,7 @@ my ($template, $loggedinuser, $cookie)
my $borrowernumber=$input->param('borrowernumber');
my $action = $input->param('action') || '';
my $accountno = $input->param('accountno');
my $accountlines_id = $input->param('accountlines_id');
#get borrower details
my $data=GetMember('borrowernumber' => $borrowernumber);