+=cut
+
+sub returnlost{
+ my ( $borrowernumber, $itemnum ) = @_;
+ C4::Circulation::MarkIssueReturned( $borrowernumber, $itemnum );
+ my $borrower = C4::Members::GetMember( $borrowernumber, 'borrowernumber' );
+ my @datearr = localtime(time);
+ my $date = ( 1900 + $datearr[5] ) . "-" . ( $datearr[4] + 1 ) . "-" . $datearr[3];
+ my $bor = "$borrower->{'firstname'} $borrower->{'surname'} $borrower->{'cardnumber'}";
+ ModItem({ paidfor => "Paid for by $bor $date" }, undef, $itemnum);
+}
+
+
+sub chargelostitem{
+# http://wiki.koha.org/doku.php?id=en:development:kohastatuses
+# lost ==1 Lost, lost==2 longoverdue, lost==3 lost and paid for
+# FIXME: itemlost should be set to 3 after payment is made, should be a warning to the interface that
+# a charge has been added
+# FIXME : if no replacement price, borrower just doesn't get charged?
+
+ my $dbh = C4::Context->dbh();
+ my ($itemnumber) = @_;
+ my $sth=$dbh->prepare("SELECT * FROM issues, items WHERE issues.itemnumber=items.itemnumber and issues.itemnumber=?");
+ $sth->execute($itemnumber);
+ my $issues=$sth->fetchrow_hashref();
+
+ # if a borrower lost the item, add a replacement cost to the their record
+ if ( $issues->{borrowernumber} ){
+
+ # first make sure the borrower hasn't already been charged for this item
+ my $sth1=$dbh->prepare("SELECT * from accountlines
+ WHERE borrowernumber=? AND itemnumber=? and accounttype='L'");
+ $sth1->execute($issues->{'borrowernumber'},$itemnumber);
+ my $existing_charge_hashref=$sth1->fetchrow_hashref();
+
+ # OK, they haven't
+ unless ($existing_charge_hashref) {
+ # This item is on issue ... add replacement cost to the borrower's record and mark it returned
+ # Note that we add this to the account even if there's no replacement price, allowing some other
+ # process (or person) to update it, since we don't handle any defaults for replacement prices.
+ my $accountno = getnextacctno($issues->{'borrowernumber'});
+ my $sth2=$dbh->prepare("INSERT INTO accountlines
+ (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding,itemnumber)
+ VALUES (?,?,now(),?,?,'L',?,?)");
+ $sth2->execute($issues->{'borrowernumber'},$accountno,$issues->{'replacementprice'},
+ "Lost Item $issues->{'title'} $issues->{'barcode'}",
+ $issues->{'replacementprice'},$itemnumber);
+ $sth2->finish;
+ # FIXME: Log this ?
+ }
+ #FIXME : Should probably have a way to distinguish this from an item that really was returned.
+ warn " $issues->{'borrowernumber'} / $itemnumber ";
+ C4::Circulation::MarkIssueReturned($issues->{borrowernumber},$itemnumber);
+ # Shouldn't MarkIssueReturned do this?
+ ModItem({ onloan => undef }, undef, $itemnumber);
+ }
+ $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: In Koha 3.0 , the only account adjustment 'types' passed to this function
+# are :
+# 'C' = CREDIT
+# 'FOR' = FORGIVEN (Formerly 'F', but 'F' is taken to mean 'FINE' elsewhere)
+# 'N' = New Card fee
+# 'F' = Fine
+# 'A' = Account Management fee
+# 'M' = Sundry
+# 'L' = Lost Item
+#
+
+sub manualinvoice {
+ my ( $borrowernumber, $itemnum, $desc, $type, $amount, $user ) = @_;
+ my $dbh = C4::Context->dbh;
+ my $notifyid = 0;
+ 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, $itemnum,$notifyid) || return $sth->errstr;
+ } 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 );
+ }
+ return 0;
+}
+
+=head2 fixcredit #### DEPRECATED
+
+ $amountleft = &fixcredit($borrowernumber, $data, $barcode, $type, $user);
+
+ This function is only used internally, not exported.
+
+=cut
+
+# This function is deprecated in 3.0
+
+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