[Koha-patches] [PATCH] Bug 7671 : add a real primary key accountlinesid in accountlines

Martin Renvoize martin.renvoize at ptfs-europe.com
Sat Jun 9 15:08:10 CEST 2012


From: Stéphane Delaune <stephane.delaune at biblibre.com>

Signed-off-by: Stéphane Delaune <stephane.delaune at biblibre.com>
---
 C4/Accounts.pm                                     |  114 ++++++++++----------
 C4/Circulation.pm                                  |   16 ++--
 installer/data/mysql/kohastructure.sql             |    2 +
 installer/data/mysql/updatedatabase.pl             |    7 ++
 .../prog/en/modules/members/boraccount.tt          |    6 +-
 .../intranet-tmpl/prog/en/modules/members/pay.tt   |    1 +
 .../prog/en/modules/members/paycollect.tt          |    2 +
 members/boraccount.pl                              |    2 +-
 members/pay.pl                                     |   45 +++++++-
 members/paycollect.pl                              |    8 +-
 members/printinvoice.pl                            |    1 +
 11 files changed, 127 insertions(+), 77 deletions(-)

diff --git a/C4/Accounts.pm b/C4/Accounts.pm
index b7aef01..2824cdf 100644
--- a/C4/Accounts.pm
+++ b/C4/Accounts.pm
@@ -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
@@ -113,12 +113,12 @@ sub recordpayment {
             $newamtos   = $accdata->{'amountoutstanding'} - $amountleft;
             $amountleft = 0;
         }
-        my $thisacct = $accdata->{accountno};
+        my $thisacct = $accdata->{accountlinesid};
         my $usth     = $dbh->prepare(
             "UPDATE accountlines SET amountoutstanding= ?
-     WHERE (borrowernumber = ?) AND (accountno=?)"
+     WHERE (accountlinesid = ?)"
         );
-        $usth->execute( $newamtos, $borrowernumber, $thisacct );
+        $usth->execute( $newamtos, $thisacct );
         $usth->finish;
 #        $usth = $dbh->prepare(
 #            "INSERT INTO accountoffsets
@@ -144,7 +144,7 @@ sub recordpayment {
 
 =head2 makepayment
 
-  &makepayment($borrowernumber, $acctnumber, $amount, $branchcode);
+  &makepayment($accountlinesid, $borrowernumber, $acctnumber, $amount, $branchcode);
 
 Records the fact that a patron has paid off the entire amount he or
 she owes.
@@ -165,7 +165,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 ( $accountlinesid, $borrowernumber, $accountno, $amount, $user, $branch ) = @_;
     my $dbh = C4::Context->dbh;
     my $manager_id = 0;
     $manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv; 
@@ -173,10 +173,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 accountlinesid=?");
+    $sth->execute( $accountlinesid );
     my $data = $sth->fetchrow_hashref;
     $sth->finish;
 
@@ -185,22 +183,20 @@ sub makepayment {
             $dbh->prepare(
                 "UPDATE accountlines
                     SET amountoutstanding = 0, description = 'Payment,thanks'
-                    WHERE borrowernumber = ?
-                    AND accountno = ?
+                    WHERE accountlinesid = ?
                 "
             );
-        $udp->execute($borrowernumber, $accountno );
+        $udp->execute($accountlinesid);
         $udp->finish;
     }else{
         my $udp = 		
             $dbh->prepare(
                 "UPDATE accountlines
                     SET amountoutstanding = 0
-                    WHERE borrowernumber = ?
-                    AND accountno = ?
+                    WHERE accountlinesid = ?
                 "
             );
-        $udp->execute($borrowernumber, $accountno );
+        $udp->execute($accountlinesid);
         $udp->finish;
 
          # create new line
@@ -227,6 +223,11 @@ sub makepayment {
     if ( $data->{'accounttype'} eq 'Rep' || $data->{'accounttype'} eq 'L' ) {
         C4::Circulation::ReturnLostItem( $borrowernumber, $data->{'itemnumber'} );
     }
+    my $sthr = $dbh->prepare("SELECT max(accountlinesid) AS lastinsertid FROM accountlines");
+    $sthr->execute();
+    my $datalastinsertid = $sthr->fetchrow_hashref;
+    $sthr->finish;
+    return $datalastinsertid->{'lastinsertid'};
 }
 
 =head2 getnextacctno
@@ -254,18 +255,17 @@ sub getnextacctno ($) {
 
 =head2 fixaccounts (removed)
 
-  &fixaccounts($borrowernumber, $accountnumber, $amount);
+  &fixaccounts($accountlinesid, $borrowernumber, $accountnumber, $amount);
 
 #'
 # FIXME - I don't understand what this function does.
 sub fixaccounts {
-    my ( $borrowernumber, $accountno, $amount ) = @_;
+    my ( $accountlinesid, $borrowernumber, $accountno, $amount ) = @_;
     my $dbh = C4::Context->dbh;
     my $sth = $dbh->prepare(
-        "SELECT * FROM accountlines WHERE borrowernumber=?
-     AND accountno=?"
+        "SELECT * FROM accountlines WHERE accountlinesid=?"
     );
-    $sth->execute( $borrowernumber, $accountno );
+    $sth->execute( $accountlinesid );
     my $data = $sth->fetchrow_hashref;
 
     # FIXME - Error-checking
@@ -277,8 +277,7 @@ sub fixaccounts {
         UPDATE  accountlines
         SET     amount = '$amount',
                 amountoutstanding = '$outstanding'
-        WHERE   borrowernumber = $borrowernumber
-          AND   accountno = $accountno
+        WHERE   accountlinesid = $accountlinesid
 EOT
 	# FIXME: exceedingly bad form.  Use prepare with placholders ("?") in query and execute args.
 }
@@ -456,12 +455,12 @@ sub fixcredit {
             $newamtos   = $accdata->{'amountoutstanding'} - $amountleft;
             $amountleft = 0;
         }
-        my $thisacct = $accdata->{accountno};
+        my $thisacct = $accdata->{accountlinesid};
         my $usth     = $dbh->prepare(
             "UPDATE accountlines SET amountoutstanding= ?
-     WHERE (borrowernumber = ?) AND (accountno=?)"
+     WHERE (accountlinesid = ?)"
         );
-        $usth->execute( $newamtos, $borrowernumber, $thisacct );
+        $usth->execute( $newamtos, $thisacct );
         $usth->finish;
         $usth = $dbh->prepare(
             "INSERT INTO accountoffsets
@@ -495,12 +494,12 @@ sub fixcredit {
             $newamtos   = $accdata->{'amountoutstanding'} - $amountleft;
             $amountleft = 0;
         }
-        my $thisacct = $accdata->{accountno};
+        my $thisacct = $accdata->{accountlinesid};
         my $usth     = $dbh->prepare(
             "UPDATE accountlines SET amountoutstanding= ?
-     WHERE (borrowernumber = ?) AND (accountno=?)"
+     WHERE (accountlinesid = ?)"
         );
-        $usth->execute( $newamtos, $borrowernumber, $thisacct );
+        $usth->execute( $newamtos, $thisacct );
         $usth->finish;
         $usth = $dbh->prepare(
             "INSERT INTO accountoffsets
@@ -561,12 +560,12 @@ sub refund {
         }
 
         #     print $amountleft;
-        my $thisacct = $accdata->{accountno};
+        my $thisacct = $accdata->{accountlinesid};
         my $usth     = $dbh->prepare(
             "UPDATE accountlines SET amountoutstanding= ?
-     WHERE (borrowernumber = ?) AND (accountno=?)"
+     WHERE (accountlinesid = ?)"
         );
-        $usth->execute( $newamtos, $borrowernumber, $thisacct );
+        $usth->execute( $newamtos, $thisacct );
         $usth->finish;
         $usth = $dbh->prepare(
             "INSERT INTO accountoffsets
@@ -599,10 +598,10 @@ sub getcharges {
 }
 
 sub ModNote {
-    my ( $borrowernumber, $accountno, $note ) = @_;
+    my ( $accountlinesid, $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 accountlinesid = ?');
+    $sth->execute( $note, $accountlinesid );
 }
 
 sub getcredits {
@@ -647,21 +646,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 ( $accountlinesid ) = @_;
+    my $dbh = C4::Context->dbh;
+
+    my $sth = $dbh->prepare('SELECT amountoutstanding FROM accountlines WHERE accountlinesid = ?');
+    $sth->execute( $accountlinesid );
+    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 accountlinesid = ?');
+        $sth->execute( $accountlinesid );
+    } else {
+        $sth = $dbh->prepare('UPDATE accountlines SET amountoutstanding = 0, description = CONCAT( description, " Reversed -" ) WHERE accountlinesid = ?');
+        $sth->execute( $accountlinesid );
+    }
 }
 
 =head2 recordpayment_selectaccts
@@ -703,7 +702,7 @@ sub recordpayment_selectaccts {
 
     # offset transactions
     my $sth     = $dbh->prepare('UPDATE accountlines SET amountoutstanding= ? ' .
-        'WHERE (borrowernumber = ?) AND (accountno=?)');
+        'WHERE accountlinesid=?');
     for my $accdata ( @{$rows} ) {
         if ($amountleft == 0) {
             last;
@@ -716,8 +715,8 @@ sub recordpayment_selectaccts {
             $newamtos   = $accdata->{amountoutstanding} - $amountleft;
             $amountleft = 0;
         }
-        my $thisacct = $accdata->{accountno};
-        $sth->execute( $newamtos, $borrowernumber, $thisacct );
+        my $thisacct = $accdata->{accountlinesid};
+        $sth->execute( $newamtos, $thisacct );
     }
 
     # create new line
@@ -732,7 +731,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 ( $accountlinesid, $borrowernumber, $accountno, $amount, $user, $branch ) = @_;
     my $manager_id = 0;
     $manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
     if (!$amount || $amount < 0) {
@@ -744,12 +743,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  accountlinesid=?',undef,$accountlinesid);
     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   accountlinesid = ? ';
+    $dbh->do( $update, undef, $new_outstanding, $accountlinesid);
 
     # create new line
     my $insert = 'INSERT INTO accountlines (borrowernumber, accountno, date, amount, '
diff --git a/C4/Circulation.pm b/C4/Circulation.pm
index c26de76..4b25d47 100644
--- a/C4/Circulation.pm
+++ b/C4/Circulation.pm
@@ -1894,7 +1894,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->{'accountlinesid'});
     if ($exemptfine) {
         $uquery = "update accountlines set accounttype='FFOR', amountoutstanding=0";
         if (C4::Context->preference("FinesLog")) {
@@ -1914,7 +1914,7 @@ sub _FixOverduesOnReturn {
     } else {
         $uquery = "update accountlines set accounttype='F' ";
     }
-    $uquery .= " where (borrowernumber = ?) and (itemnumber = ?) and (accountno = ?)";
+    $uquery .= " where (accountlinesid = ?)";
     my $usth = $dbh->prepare($uquery);
     return $usth->execute(@bind);
 }
@@ -1957,9 +1957,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 (accountlinesid = ?)");
+    $usth->execute($data->{'accountlinesid'});      # 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);
@@ -1978,12 +1977,11 @@ sub _FixAccountForLostAndReturned {
                 $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
                 $amountleft = 0;
             }
-            my $thisacct = $accdata->{'accountno'};
+            my $thisacct = $accdata->{'accountlinesid'};
             # 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 (accountlinesid = ?)");
+            $usth->execute($newamtos,'$thisacct');    # FIXME: '$thisacct' is a string literal!
             $usth = $dbh->prepare("INSERT INTO accountoffsets
                 (borrowernumber, accountno, offsetaccount,  offsetamount)
                 VALUES
diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql
index 3137f38..a4464f1 100644
--- a/installer/data/mysql/kohastructure.sql
+++ b/installer/data/mysql/kohastructure.sql
@@ -2457,6 +2457,7 @@ CREATE TABLE `messages` ( -- circulation messages left via the patron's check ou
 
 DROP TABLE IF EXISTS `accountlines`;
 CREATE TABLE `accountlines` (
+  `accountlinesid` 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,
@@ -2472,6 +2473,7 @@ CREATE TABLE `accountlines` (
   `notify_level` int(2) NOT NULL default 0,
   `note` text NULL default NULL,
   `manager_id` int(11) NULL,
+  PRIMARY KEY (`accountlinesid`),
   KEY `acctsborridx` (`borrowernumber`),
   KEY `timeidx` (`timestamp`),
   KEY `itemnumber` (`itemnumber`),
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index dbbdee3..696cf26 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -5308,6 +5308,13 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
     SetVersion ($DBversion);
 }
 
+$DBversion = "XXX";
+if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
+    $dbh->do("ALTER TABLE `accountlines` ADD `accountlinesid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;");
+    print "Upgrade to $DBversion done (adding accountlinesid field in accountlines table)\n";
+    SetVersion($DBversion);
+}
+
 =head1 FUNCTIONS
 
 =head2 TableExists($table)
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/boraccount.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/boraccount.tt
index 995ea8c..fd12197 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/boraccount.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/boraccount.tt
@@ -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;accountlinesid=[% account.accountlinesid %]&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;accountlinesid=[% account.accountlinesid %]&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;accountlinesid=[% account.accountlinesid %]&amp;borrowernumber=[% account.borrowernumber %]">Print</a>
 	[% END %]
       </td>
     </tr>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/pay.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/pay.tt
index fb06325..246290e 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/pay.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/pay.tt
@@ -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="accountlinesid[% line.accountno %]" value="[% line.accountlinesid %]" />
     <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 %]" />
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/paycollect.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/paycollect.tt
index d5102cc..31aed6e 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/paycollect.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/paycollect.tt
@@ -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="accountlinesid" id="accountlinesid" value="[% accountlinesid %]" />
     <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="accountlinesid" id="accountlinesid" value="[% accountlinesid %]" />
     <input type="hidden" name="title" id="title" value="[% title %]" />
     <table>
     <thead><tr>
diff --git a/members/boraccount.pl b/members/boraccount.pl
index 44db953..a0aed2f 100755
--- a/members/boraccount.pl
+++ b/members/boraccount.pl
@@ -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('accountlinesid') );
 }
 
 if ( $data->{'category_type'} eq 'C') {
diff --git a/members/pay.pl b/members/pay.pl
index 8f5233c..cd71c5e 100755
--- a/members/pay.pl
+++ b/members/pay.pl
@@ -83,11 +83,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 $accountlinesid = $input->param('accountlinesid');
     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, $accountlinesid, $itemno, $account_type, $amount, $branch );
 }
 
 for (@names) {
@@ -106,6 +106,23 @@ add_accounts_to_template();
 
 output_html_with_http_headers $input, $cookie, $template->output;
 
+sub writeoff {
+    my ( $accountlinesid, $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( $accountlinesid );
+
+    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 +184,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( 'accountlinesid', "accountlinesid$line_no", 0 );
     $redirect .= '&remote_user=';
     $redirect .= $user;
     return print $input->redirect($redirect);
@@ -184,7 +202,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 $accountlinesid = $input->param("accountlinesid$value");
+            WriteOffFee( $borrowernumber, $accountlinesid, $itemno, $accounttype, $amount, $branch );
         }
     }
 
@@ -250,3 +269,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 accountlinesid=?';
+        $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;
+}
diff --git a/members/paycollect.pl b/members/paycollect.pl
index 7dfb622..8eb03b0 100755
--- a/members/paycollect.pl
+++ b/members/paycollect.pl
@@ -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 $accountlinesid;
 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');
+    $accountlinesid       = $input->param('accountlinesid');
     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,
+        accountlinesid    => $accountlinesid,
         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( $accountlinesid, $borrowernumber, $accountno, $total_paid, $user,
                     $branch );
             } else {
-                makepartialpayment( $borrowernumber, $accountno, $total_paid,
+                makepartialpayment( $accountlinesid, $borrowernumber, $accountno, $total_paid,
                     $user, $branch );
             }
             print $input->redirect(
diff --git a/members/printinvoice.pl b/members/printinvoice.pl
index 039132f..1bfe632 100755
--- a/members/printinvoice.pl
+++ b/members/printinvoice.pl
@@ -48,6 +48,7 @@ my ($template, $loggedinuser, $cookie)
 my $borrowernumber=$input->param('borrowernumber');
 my $action = $input->param('action') || '';
 my $accountno = $input->param('accountno');
+my $accountlinesid = $input->param('accountlinesid');
 
 #get borrower details
 my $data=GetMember('borrowernumber' => $borrowernumber);
-- 
1.7.2.5



More information about the Koha-patches mailing list