From 2dd9e35a4e7351b916cfde3c355d88956fedf3cf Mon Sep 17 00:00:00 2001
From: Kyle M Hall <kyle@bywatersolutions.com>
Date: Tue, 28 Feb 2012 09:17:04 -0500
Subject: [PATCH] Bug 7597 - Part 2 - move sub writeoff to C4::Accounts

Currently, the subroutine writeoff lives in pay.pl, which
is a violation of the Koha coding guidelines, as it writes
to the database. This commit restructures and moves writeoff
to C4::Accounts::WriteOff(), and modifies pay.pl to use it.
---
 C4/Accounts.pm |   62 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 members/pay.pl |   44 +-------------------------------------
 2 files changed, 59 insertions(+), 47 deletions(-)

diff --git a/C4/Accounts.pm b/C4/Accounts.pm
index c3d121d..28bd56b 100644
--- a/C4/Accounts.pm
+++ b/C4/Accounts.pm
@@ -33,12 +33,20 @@ BEGIN {
 	require Exporter;
 	@ISA    = qw(Exporter);
 	@EXPORT = qw(
-		&recordpayment &makepayment &manualinvoice
-		&getnextacctno &reconcileaccount &getcharges &ModNote &getcredits
-		&getrefunds &chargelostitem
+		&recordpayment
+		&makepayment
+		&manualinvoice
+		&getnextacctno
+		&reconcileaccount
+		&getcharges 
+		&ModNote 
+		&getcredits
+		&getrefunds 
+		&chargelostitem
 		&ReversePayment
-        makepartialpayment
-        recordpayment_selectaccts
+                &makepartialpayment
+                &recordpayment_selectaccts
+                &WriteOff
 	);
 }
 
@@ -756,7 +764,51 @@ sub makepartialpayment {
     return;
 }
 
+=head2 WriteOff
 
+  WriteOff( $borrowernumber, $accountnum, $itemnum, $accounttype, $amount, $branch );
+
+Write off a fine for a patron.
+C<$borrowernumber> is the patron's borrower number.
+C<$accountnum> is the accountnumber of the fee to write off.
+C<$itemnum> is the itemnumber of of item whose fine is being written off.
+C<$accounttype> is the account type of the fine being written off.
+C<$amount> is a floating-point number, giving the amount that is being written off. 
+C<$branch> is the branchcode of the library where the writeoff occurred.
+
+=cut
+
+sub WriteOff {
+    my ( $borrowernumber, $accountnum, $itemnum, $accounttype, $amount, $branch ) = @_;
+    my $branch ||= C4::Context->userenv->{branch};
+    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;
+    
+    my ( $sth, $query );
+    my $dbh = C4::Context->dbh();
+    
+    $query = "
+        UPDATE accountlines SET amountoutstanding = 0 
+        WHERE accountno = ? AND borrowernumber = ?
+    ";
+    $sth = $dbh->prepare( $query );
+    $sth->execute( $accountnum, $borrowernumber );
+
+    $query ="
+        INSERT INTO accountlines 
+        ( borrowernumber, accountno, itemnumber, date, amount, description, accounttype, manager_id )
+        VALUES ( ?, ?, ?, NOW(), ?, 'Writeoff', 'W', ? )
+    ";
+    $sth = $dbh->prepare( $query );
+    my $acct = getnextacctno($borrowernumber);
+    $sth->execute( $borrowernumber, $acct, $itemnum, $amount, $manager_id );
+
+    UpdateStats( $branch, 'writeoff', $amount, q{}, q{}, q{}, $borrowernumber );
+
+}
 
 END { }    # module clean-up code here (global destructor)
 
diff --git a/members/pay.pl b/members/pay.pl
index 9533922..9343c90 100755
--- a/members/pay.pl
+++ b/members/pay.pl
@@ -53,9 +53,6 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     }
 );
 
-my $writeoff_sth;
-my $add_writeoff_sth;
-
 my @names = $input->param;
 
 my $borrowernumber = $input->param('borrowernumber');
@@ -90,7 +87,7 @@ if ($writeoff_all) {
     my $itemno       = $input->param('itemnumber');
     my $account_type = $input->param('accounttype');
     my $amount       = $input->param('amountoutstanding');
-    writeoff( $accountno, $itemno, $account_type, $amount );
+    WriteOff( $borrowernumber, $accountno, $itemno, $account_type, $amount, $branch );
 }
 
 for (@names) {
@@ -109,23 +106,6 @@ add_accounts_to_template();
 
 output_html_with_http_headers $input, $cookie, $template->output;
 
-sub writeoff {
-    my ( $accountnum, $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( $accountnum, $borrowernumber );
-
-    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 {
 
@@ -204,7 +184,7 @@ sub writeoff_all {
             my $itemno    = $input->param("itemnumber$value");
             my $amount    = $input->param("amount$value");
             my $accountno = $input->param("accountno$value");
-            writeoff( $accountno, $itemno, $accounttype, $amount );
+            WriteOff( $borrowernumber, $accountno, $itemno, $accounttype, $amount, $branch );
         }
     }
 
@@ -270,23 +250,3 @@ 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 accountno=? and borrowernumber=?';
-        $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;
-}
-- 
1.7.2.5