1 package C4::Accounts2; #assumes C4/Accounts2
4 # Copyright 2000-2002 Katipo Communications
6 # This file is part of Koha.
8 # Koha is free software; you can redistribute it and/or modify it under the
9 # terms of the GNU General Public License as published by the Free Software
10 # Foundation; either version 2 of the License, or (at your option) any later
13 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
14 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License along with
18 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
19 # Suite 330, Boston, MA 02111-1307 USA
27 use C4::Circulation::Circ2;
28 use vars qw($VERSION @ISA @EXPORT);
30 # set the version for version checking
31 $VERSION = 0.01; # FIXME - Should probably be different from
32 # the version for C4::Accounts
36 C4::Accounts - Functions for dealing with Koha accounts
44 The functions in this module deal with the monetary aspect of Koha,
45 including looking up and modifying the amount of money owed by a
55 @EXPORT = qw(&recordpayment &fixaccounts &makepayment &manualinvoice
65 &recordpayment($env, $borrowernumber, $payment);
67 Record payment by a patron. C<$borrowernumber> is the patron's
68 borrower number. C<$payment> is a floating-point number, giving the
69 amount that was paid. C<$env> is a reference-to-hash;
70 C<$env-E<gt>{branchcode}> is the code of the branch where payment was
73 Amounts owed are paid off oldest first. That is, if the patron has a
74 $1 fine from Feb. 1, another $1 fine from Mar. 1, and makes a payment
75 of $1.50, then the oldest fine will be paid off in full, and $0.50
76 will be credited to the next one.
81 #here we update both the accountoffsets and the account lines
82 my ($env,$bornumber,$data)=@_;
87 my $branch=$env->{'branchcode'};
88 my $amountleft = $data;
90 my $nextaccntno = getnextacctno($env,$bornumber,$dbh);
91 # get lines with outstanding amounts to offset
92 my $query = "select * from accountlines
93 where (borrowernumber = '$bornumber') and (amountoutstanding<>0)
95 my $sth = $dbh->prepare($query);
98 while (($accdata=$sth->fetchrow_hashref) and ($amountleft>0)){
99 if ($accdata->{'amountoutstanding'} < $amountleft) {
101 $amountleft = $amountleft - $accdata->{'amountoutstanding'};
103 $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
106 my $thisacct = $accdata->{accountno};
107 $updquery = "update accountlines set amountoutstanding= '$newamtos'
108 where (borrowernumber = '$bornumber') and (accountno='$thisacct')";
109 my $usth = $dbh->prepare($updquery);
112 $updquery = "insert into accountoffsets
113 (borrowernumber, accountno, offsetaccount, offsetamount)
114 values ($bornumber,$accdata->{'accountno'},$nextaccntno,$newamtos)";
115 $usth = $dbh->prepare($updquery);
120 $updquery = "insert into accountlines
121 (borrowernumber, accountno,date,amount,description,accounttype,amountoutstanding)
122 values ($bornumber,$nextaccntno,now(),0-$data,'Payment,thanks',
123 'Pay',0-$amountleft)";
124 my $usth = $dbh->prepare($updquery);
127 UpdateStats($env,$branch,'payment',$data,'','','',$bornumber);
134 &makepayment($borrowernumber, $acctnumber, $amount, $branchcode);
136 Records the fact that a patron has paid off the entire amount he or
139 C<$borrowernumber> is the patron's borrower number. C<$acctnumber> is
140 the account that was credited. C<$amount> is the amount paid (this is
141 only used to record the payment. It is assumed to be equal to the
142 amount owed). C<$branchcode> is the code of the branch where payment
147 # FIXME - I'm not at all sure about the above, because I don't
148 # understand what the acct* tables in the Koha database are for.
150 #here we update both the accountoffsets and the account lines
151 #updated to check, if they are paying off a lost item, we return the item
152 # from their card, and put a note on the item record
153 my ($bornumber,$accountno,$amount,$user)=@_;
157 my $nextaccntno = getnextacctno($env,$bornumber,$dbh);
159 my $sel="Select * from accountlines where borrowernumber=$bornumber and
160 accountno=$accountno";
161 my $sth=$dbh->prepare($sel);
163 my $data=$sth->fetchrow_hashref;
165 # FIXME - This prepare/execute/finish sequence could be done with
167 my $updquery="Update accountlines set amountoutstanding=0 where
168 borrowernumber=$bornumber and accountno=$accountno";
169 $sth=$dbh->prepare($updquery);
173 $updquery = "insert into accountoffsets
174 (borrowernumber, accountno, offsetaccount, offsetamount)
175 values ($bornumber,$accountno,$nextaccntno,$newamtos)";
176 my $usth = $dbh->prepare($updquery);
180 my $payment=0-$amount;
181 $updquery = "insert into accountlines
182 (borrowernumber, accountno,date,amount,description,accounttype,amountoutstanding)
183 values ($bornumber,$nextaccntno,now(),$payment,'Payment,thanks - $user', 'Pay',0)";
184 $usth = $dbh->prepare($updquery);
187 # FIXME - The second argument to &UpdateStats is supposed to be the
189 UpdateStats($env,$user,'payment',$amount,'','','',$bornumber);
192 #check to see what accounttype
193 if ($data->{'accounttype'} eq 'Rep' || $data->{'accounttype'} eq 'L'){
194 returnlost($bornumber,$data->{'itemnumber'});
200 $nextacct = &getnextacctno($env, $borrowernumber, $dbh);
202 Returns the next unused account number for the patron with the given
205 C<$dbh> is a DBI::db handle to the Koha database.
211 # FIXME - Okay, so what does the above actually _mean_?
213 my ($env,$bornumber,$dbh)=@_;
215 my $query = "select * from accountlines
216 where (borrowernumber = '$bornumber')
217 order by accountno desc";
218 my $sth = $dbh->prepare($query);
220 if (my $accdata=$sth->fetchrow_hashref){
221 $nextaccntno = $accdata->{'accountno'} + 1;
224 return($nextaccntno);
229 &fixaccounts($borrowernumber, $accountnumber, $amount);
233 # FIXME - I don't understand what this function does.
235 my ($borrowernumber,$accountno,$amount)=@_;
237 my $query="Select * from accountlines where borrowernumber=$borrowernumber
238 and accountno=$accountno";
239 my $sth=$dbh->prepare($query);
241 my $data=$sth->fetchrow_hashref;
242 # FIXME - Error-checking
243 my $diff=$amount-$data->{'amount'};
244 my $outstanding=$data->{'amountoutstanding'}+$diff;
246 $query="Update accountlines set amount='$amount',amountoutstanding='$outstanding' where
247 borrowernumber=$borrowernumber and accountno=$accountno";
248 $sth=$dbh->prepare($query);
255 # FIXME - Never used, but not exported, either.
257 my ($borrnum,$itemnum)=@_;
259 my $borrower=borrdata('',$borrnum); #from C4::Search;
260 my $upiss="Update issues set returndate=now() where
261 borrowernumber='$borrnum' and itemnumber='$itemnum' and returndate is null";
262 my $sth=$dbh->prepare($upiss);
265 my @datearr = localtime(time);
266 my $date = (1900+$datearr[5])."-".($datearr[4]+1)."-".$datearr[3];
267 my $bor="$borrower->{'firstname'} $borrower->{'surname'} $borrower->{'cardnumber'}";
268 my $upitem="Update items set paidfor='Paid for by $bor $date' where itemnumber='$itemnum'";
269 $sth=$dbh->prepare($upitem);
277 &manualinvoice($borrowernumber, $itemnumber, $description, $type,
280 C<$borrowernumber> is the patron's borrower number.
281 C<$description> is a description of the transaction.
282 C<$type> may be one of C<CS>, C<CB>, C<CW>, C<CF>, C<CL>, C<N>, C<L>,
284 C<$itemnumber> is the item involved, if pertinent; otherwise, it
285 should be the empty string.
289 # FIXME - Okay, so what does this function do, really?
291 my ($bornum,$itemnum,$desc,$type,$amount,$user)=@_;
296 my $accountno=getnextacctno('',$bornum,$dbh);
297 my $amountleft=$amount;
299 if ($type eq 'CS' || $type eq 'CB' || $type eq 'CW'
300 || $type eq 'CF' || $type eq 'CL'){
301 my $amount2=$amount*-1; # FIXME - $amount2 = -$amount
302 $amountleft=fixcredit(\%env,$bornum,$amount2,$itemnum,$type,$user);
307 if ($type eq 'L' && $desc eq ''){
311 $amountleft=refund('',$bornum,$amount);
314 my $sth=$dbh->prepare("Select * from items where barcode='$itemnum'");
316 my $data=$sth->fetchrow_hashref;
319 $desc=$dbh->quote($desc);
320 $insert="insert into accountlines (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding,itemnumber)
321 values ($bornum,$accountno,now(),'$amount',$desc,'$type','$amountleft','$data->{'itemnumber'}')";
323 $desc=$dbh->quote($desc);
324 $insert="insert into accountlines (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)
325 values ($bornum,$accountno,now(),'$amount',$desc,'$type','$amountleft')";
328 my $sth=$dbh->prepare($insert);
336 # $amountleft = &fixcredit($env, $bornumber, $data, $barcode, $type, $user);
338 # This function is only used internally.
339 # FIXME - Figure out what this function does, and write it down.
341 #here we update both the accountoffsets and the account lines
342 my ($env,$bornumber,$data,$barcode,$type,$user)=@_;
347 my $amountleft = $data;
349 my $item=getiteminformation($env,'',$barcode);
350 my $nextaccntno = getnextacctno($env,$bornumber,$dbh);
351 my $query="Select * from accountlines where (borrowernumber='$bornumber'
352 and itemnumber='$item->{'itemnumber'}' and amountoutstanding > 0)";
354 $query.=" and (accounttype = 'L' or accounttype = 'Rep')";
355 } elsif ($type eq 'CF'){
356 $query.=" and (accounttype = 'F' or accounttype = 'FU' or
357 accounttype='Res' or accounttype='Rent')";
358 } elsif ($type eq 'CB'){
359 $query.=" and accounttype='A'";
362 my $sth=$dbh->prepare($query);
364 $accdata=$sth->fetchrow_hashref;
366 if ($accdata->{'amountoutstanding'} < $amountleft) {
368 $amountleft = $amountleft - $accdata->{'amountoutstanding'};
370 $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
373 my $thisacct = $accdata->{accountno};
374 my $updquery = "update accountlines set amountoutstanding= '$newamtos'
375 where (borrowernumber = '$bornumber') and (accountno='$thisacct')";
376 my $usth = $dbh->prepare($updquery);
379 $updquery = "insert into accountoffsets
380 (borrowernumber, accountno, offsetaccount, offsetamount)
381 values ($bornumber,$accdata->{'accountno'},$nextaccntno,$newamtos)";
382 $usth = $dbh->prepare($updquery);
387 my $nextaccntno = getnextacctno($env,$bornumber,$dbh);
388 # get lines with outstanding amounts to offset
389 my $query = "select * from accountlines
390 where (borrowernumber = '$bornumber') and (amountoutstanding >0)
392 my $sth = $dbh->prepare($query);
395 # offset transactions
396 while (($accdata=$sth->fetchrow_hashref) and ($amountleft>0)){
397 if ($accdata->{'amountoutstanding'} < $amountleft) {
399 $amountleft = $amountleft - $accdata->{'amountoutstanding'};
401 $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
404 my $thisacct = $accdata->{accountno};
405 $updquery = "update accountlines set amountoutstanding= '$newamtos'
406 where (borrowernumber = '$bornumber') and (accountno='$thisacct')";
407 my $usth = $dbh->prepare($updquery);
410 $updquery = "insert into accountoffsets
411 (borrowernumber, accountno, offsetaccount, offsetamount)
412 values ($bornumber,$accdata->{'accountno'},$nextaccntno,$newamtos)";
413 $usth = $dbh->prepare($updquery);
419 $env->{'branch'}=$user;
420 $type="Credit ".$type;
421 UpdateStats($env,$user,$type,$data,$user,'','',$bornumber);
427 # FIXME - Figure out what this function does, and write it down.
429 #here we update both the accountoffsets and the account lines
430 my ($env,$bornumber,$data)=@_;
435 # my $branch=$env->{'branchcode'};
436 my $amountleft = $data *-1;
439 my $nextaccntno = getnextacctno($env,$bornumber,$dbh);
440 # get lines with outstanding amounts to offset
441 my $query = "select * from accountlines
442 where (borrowernumber = '$bornumber') and (amountoutstanding<0)
444 my $sth = $dbh->prepare($query);
448 # offset transactions
449 while (($accdata=$sth->fetchrow_hashref) and ($amountleft<0)){
450 if ($accdata->{'amountoutstanding'} > $amountleft) {
452 $amountleft = $amountleft - $accdata->{'amountoutstanding'};
454 $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
458 my $thisacct = $accdata->{accountno};
459 $updquery = "update accountlines set amountoutstanding= '$newamtos'
460 where (borrowernumber = '$bornumber') and (accountno='$thisacct')";
461 my $usth = $dbh->prepare($updquery);
464 $updquery = "insert into accountoffsets
465 (borrowernumber, accountno, offsetaccount, offsetamount)
466 values ($bornumber,$accdata->{'accountno'},$nextaccntno,$newamtos)";
467 $usth = $dbh->prepare($updquery);
476 END { } # module clean-up code here (global destructor)