+ return($nextaccntno);
+}
+
+=head2 fixaccounts
+
+ &fixaccounts($borrowernumber, $accountnumber, $amount);
+
+=cut
+
+#'
+# FIXME - I don't understand what this function does.
+sub fixaccounts {
+ my ($borrowernumber,$accountno,$amount)=@_;
+ my $dbh = C4::Context->dbh;
+ my $sth=$dbh->prepare("SELECT * FROM accountlines WHERE borrowernumber=?
+ AND accountno=?");
+ $sth->execute($borrowernumber,$accountno);
+ my $data=$sth->fetchrow_hashref;
+ # FIXME - Error-checking
+ my $diff=$amount-$data->{'amount'};
+ my $outstanding=$data->{'amountoutstanding'}+$diff;
+ $sth->finish;
+
+ $dbh->do(<<EOT);
+ UPDATE accountlines
+ SET amount = '$amount',
+ amountoutstanding = '$outstanding'
+ WHERE borrowernumber = $borrowernumber
+ AND accountno = $accountno
+EOT
+ }
+
+# FIXME - Never used, but not exported, either.
+sub returnlost{
+ my ($borrowernumber,$itemnum)=@_;
+ my $dbh = C4::Context->dbh;
+ my $borrower=GetMember($borrowernumber,'borrowernumber');
+ my $sth=$dbh->prepare("UPDATE issues SET returndate=now() WHERE
+ borrowernumber=? AND itemnumber=? AND returndate IS NULL");
+ $sth->execute($borrowernumber,$itemnum);
+ $sth->finish;
+ my @datearr = localtime(time);
+ my $date = (1900+$datearr[5])."-".($datearr[4]+1)."-".$datearr[3];
+ my $bor="$borrower->{'firstname'} $borrower->{'surname'} $borrower->{'cardnumber'}";
+ $sth=$dbh->prepare("UPDATE items SET paidfor=? WHERE itemnumber=?");
+ $sth->execute("Paid for by $bor $date",$itemnum);
+ $sth->finish;
+}
+
+=head2 manualinvoice
+
+ &manualinvoice($borrowernumber, $itemnumber, $description, $type,
+ $amount, $user);
+
+C<$borrowernumber> is the patron's borrower number.
+C<$description> is a description of the transaction.
+C<$type> may be one of C<CS>, C<CB>, C<CW>, C<CF>, C<CL>, C<N>, C<L>,
+or C<REF>.
+C<$itemnumber> is the item involved, if pertinent; otherwise, it
+should be the empty string.
+
+=cut
+
+#'
+# FIXME - Okay, so what does this function do, really?
+sub manualinvoice{
+ my ($borrowernumber,$itemnum,$desc,$type,$amount,$user)=@_;
+ my $dbh = C4::Context->dbh;
+ my $notifyid;
+ my $insert;
+ $itemnum=~ s/ //g;
+ my $accountno=getnextacctno($borrowernumber);
+ my $amountleft=$amount;
+
+ if ($type eq 'CS' || $type eq 'CB' || $type eq 'CW'
+ || $type eq 'CF' || $type eq 'CL'){
+ my $amount2=$amount*-1; # FIXME - $amount2 = -$amount
+ $amountleft=fixcredit($borrowernumber,$amount2,$itemnum,$type,$user);
+ }
+ if ($type eq 'N'){
+ $desc.="New Card";
+ }
+ if ($type eq 'F'){
+ $desc.="Fine";
+ }
+ if ($type eq 'A'){
+ $desc.="Account Management fee";
+ }
+ if ($type eq 'M'){
+ $desc.="Sundry";
+ }
+
+ if ($type eq 'L' && $desc eq ''){
+
+ $desc="Lost Item";
+ }
+ if ($type eq 'REF'){
+ $desc.="Cash Refund";
+ $amountleft=refund('',$borrowernumber,$amount);
+ }
+ if(($type eq 'L') or ($type eq 'F') or ($type eq 'A') or ($type eq 'N') or ($type eq 'M') ){
+ $notifyid=1;
+ }
+
+ if ($itemnum ne ''){
+ $desc.=" ".$itemnum;
+ my $sth=$dbh->prepare("INSERT INTO accountlines
+ (borrowernumber, accountno, date, amount, description, accounttype, amountoutstanding, itemnumber,notify_id)
+ VALUES (?, ?, now(), ?,?, ?,?,?,?)");
+# $sth->execute($borrowernumber, $accountno, $amount, $desc, $type, $amountleft, $data->{'itemnumber'});
+ $sth->execute($borrowernumber, $accountno, $amount, $desc, $type, $amountleft, $itemnum,$notifyid);
+ } else {
+ my $sth=$dbh->prepare("INSERT INTO accountlines
+ (borrowernumber, accountno, date, amount, description, accounttype, amountoutstanding,notify_id)
+ VALUES (?, ?, now(), ?, ?, ?, ?,?)");
+ $sth->execute($borrowernumber, $accountno, $amount, $desc, $type, $amountleft,$notifyid);
+ }
+}
+
+=head2 fixcredit
+
+ $amountleft = &fixcredit($borrowernumber, $data, $barcode, $type, $user);
+
+ This function is only used internally, not exported.
+ FIXME - Figure out what this function does, and write it down.
+
+=cut
+
+sub fixcredit{
+ #here we update both the accountoffsets and the account lines
+ my ($borrowernumber,$data,$barcode,$type,$user)=@_;
+ my $dbh = C4::Context->dbh;
+ my $newamtos = 0;
+ my $accdata = "";
+ my $amountleft = $data;
+ if ($barcode ne ''){
+ my $item=GetBiblioFromItemNumber('',$barcode);
+ my $nextaccntno = getnextacctno($borrowernumber);
+ my $query="SELECT * FROM accountlines WHERE (borrowernumber=?
+ AND itemnumber=? AND amountoutstanding > 0)";
+ if ($type eq 'CL'){
+ $query.=" AND (accounttype = 'L' OR accounttype = 'Rep')";
+ } elsif ($type eq 'CF'){
+ $query.=" AND (accounttype = 'F' OR accounttype = 'FU' OR
+ accounttype='Res' OR accounttype='Rent')";
+ } elsif ($type eq 'CB'){
+ $query.=" and accounttype='A'";
+ }
+# print $query;
+ my $sth=$dbh->prepare($query);
+ $sth->execute($borrowernumber,$item->{'itemnumber'});
+ $accdata=$sth->fetchrow_hashref;
+ $sth->finish;
+ if ($accdata->{'amountoutstanding'} < $amountleft) {
+ $newamtos = 0;
+ $amountleft -= $accdata->{'amountoutstanding'};
+ } else {
+ $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
+ $amountleft = 0;
+ }
+ my $thisacct = $accdata->{accountno};
+ my $usth = $dbh->prepare("UPDATE accountlines SET amountoutstanding= ?
+ WHERE (borrowernumber = ?) AND (accountno=?)");
+ $usth->execute($newamtos,$borrowernumber,$thisacct);
+ $usth->finish;
+ $usth = $dbh->prepare("INSERT INTO accountoffsets
+ (borrowernumber, accountno, offsetaccount, offsetamount)
+ VALUES (?,?,?,?)");
+ $usth->execute($borrowernumber,$accdata->{'accountno'},$nextaccntno,$newamtos);
+ $usth->finish;
+ }
+ # begin transaction
+ my $nextaccntno = getnextacctno($borrowernumber);
+ # get lines with outstanding amounts to offset
+ my $sth = $dbh->prepare("SELECT * FROM accountlines
+ WHERE (borrowernumber = ?) AND (amountoutstanding >0)
+ ORDER BY date");
+ $sth->execute($borrowernumber);
+# print $query;
+ # offset transactions
+ while (($accdata=$sth->fetchrow_hashref) and ($amountleft>0)){
+ if ($accdata->{'amountoutstanding'} < $amountleft) {
+ $newamtos = 0;
+ $amountleft -= $accdata->{'amountoutstanding'};
+ } else {
+ $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
+ $amountleft = 0;
+ }
+ my $thisacct = $accdata->{accountno};
+ my $usth = $dbh->prepare("UPDATE accountlines SET amountoutstanding= ?
+ WHERE (borrowernumber = ?) AND (accountno=?)");
+ $usth->execute($newamtos,$borrowernumber,$thisacct);
+ $usth->finish;
+ $usth = $dbh->prepare("INSERT INTO accountoffsets
+ (borrowernumber, accountno, offsetaccount, offsetamount)
+ VALUE (?,?,?,?)");
+ $usth->execute($borrowernumber,$accdata->{'accountno'},$nextaccntno,$newamtos);
+ $usth->finish;
+ }
+ $sth->finish;
+ $type="Credit ".$type;
+ UpdateStats($user,$type,$data,$user,'','',$borrowernumber);
+ $amountleft*=-1;
+ return($amountleft);
+