#=====================================================================
# LedgerSMB
# Small Medium Business Accounting software
# http://www.ledgersmb.org/
#
# Copyright (C) 2006
# This work contains copyrighted information from a number of sources all used
# with permission.
#
# This file contains source code included with or based on SQL-Ledger which
# is Copyright Dieter Simader and DWS Systems Inc. 2000-2005 and licensed
# under the GNU General Public License version 2 or, at your option, any later
# version.  For a full list including contact information of contributors,
# maintainers, and copyright holders, see the CONTRIBUTORS file.
#
# Original Copyright Notice from SQL-Ledger 2.6.17 (before the fork):
# Copyright (C) 2001
#
#  Author: DWS Systems Inc.
#     Web: http://www.sql-ledger.org
#
#  Contributors:
#
#======================================================================
#
# This file has undergone whitespace cleanup.
#
#======================================================================
#
# Overpayment function
# used in AR, AP, IS, IR, OE, CP
#
#======================================================================

package OP;

sub overpayment {
    my ( $self, $myconfig, $form, $dbh, $amount, $ml ) = @_;
    my $invnumber = $form->{invnumber};

    $invnumber =
      $form->update_defaults( $myconfig, ( $form->{arap} eq 'ar' )
        ? "sinumber"
        : "vinumber", $dbh )
      unless $invnumber;
    my $fxamount = $form->round_amount( $amount * $form->{exchangerate}, 2 );
    my ($paymentaccno) = split /--/, $form->{account};

    my ( $null, $department_id ) = split /--/, $form->{department};
    $department_id *= 1;

    my $uid = localtime;
    $uid .= "$$";

    # add AR/AP header transaction with a payment
    my $login = $dbh->quote( $form->{login} );
    $query = qq|
		INSERT INTO $form->{arap} (invnumber, employee_id)
		     VALUES ('$uid', (SELECT id FROM employee
		      WHERE login = $login))|;
    $dbh->do($query) || $form->dberror($query);

    $query = qq|SELECT id FROM $form->{arap} WHERE invnumber = '$uid'|;
    ($uid) = $dbh->selectrow_array($query);


    $query = qq|
		UPDATE $form->{arap} 
		   set invnumber = ?,
		       $form->{vc}_id = ?,
		       transdate = ?,
		       datepaid = ?,
		       duedate = ?,
		       netamount = 0,
		       amount = 0,
		       paid = ?,
		       curr = ?,
		       department_id = ?
		 WHERE id = ?|;
    $sth = $dbh->prepare($query);
    $sth->execute(
        $invnumber,        $form->{"$form->{vc}_id"},
        $form->{datepaid}, $form->{datepaid},
        $form->{datepaid}, $fxamount,
        $form->{currency}, $department_id,
        $uid
    ) || $form->dberror($query);

    # add AR/AP
    ($accno) = split /--/, $form->{ $form->{ARAP} };

    $query = qq|
		INSERT INTO acc_trans (trans_id, chart_id, transdate, amount)
		     VALUES (?, (SELECT id FROM chart 
		                  WHERE accno = ?), ?, ?)|;
    $sth = $dbh->prepare($query);
    $sth->execute( $uid, $accno, $form->{datepaid}, $fxamount * $ml )
      || $form->dberror($query);

    # add payment
    $query = qq|
		INSERT INTO acc_trans (trans_id, chart_id, transdate, 
		                      amount, source, memo)
		     VALUES (?, (SELECT id FROM chart WHERE accno = ?),
		            ?, ?, ?, ?)|;
    $sth = $dbh->prepare($query);
    $sth->execute( $uid, $paymentaccno, $form->{datepaid}, $amount * $ml * -1,
        $form->{source}, $form->{memo} )
      || $form->dberror($query);

    # add exchangerate difference
    if ( $fxamount != $amount ) {
        $query = qq|
			INSERT INTO acc_trans (trans_id, chart_id, transdate,
			            amount, cleared, fx_transaction, source)
			     VALUES (?, (SELECT id FROM chart WHERE accno = ?),
			            ?, ?, '1', '1', ?)|;
        $sth = $dbh->prepare($query);
        $sth->execute( $uid, $paymentaccno, $form->{datepaid},
            ( $fxamount - $amount ) * $ml * -1,
            $form->{source} )
          || $form->dberror($query);
    }

    my %audittrail = (
        tablename => $form->{arap},
        reference => $invnumber,
        formname  => ( $form->{arap} eq 'ar' )
        ? 'deposit'
        : 'pre-payment',
        action => 'posted',
        id     => $uid
    );

    $form->audittrail( $dbh, "", \%audittrail );

}

1;

