- =head1 NAME
- OP
- =head1 SYNOPSIS
- This module provides an overpayment function used by CP.pm
- =head1 COPYRIGHT
- #====================================================================
- # 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
- #
- #====================================================================
- =head1 METHODS
- =over
- =cut
- package OP;
- =item OP::overpayment('', $myconfig, $form, $dbh, $amount, $ml);
- Adds entries to acc_trans and ar or ap relating to overpayments found while
- processing payments with CP->post_payment and CP->post_payments. Also adds an
- audit trail entry with a formname of 'deposit' if it is on an AR transaction
- or 'pre-payment' if the transaction is an AP transaction. $amount is the
- overpayment amount without the exchange rate applied.
- $form attributes used by this function:
- =over
- =item $form->{arap}
- Possible values are 'ar' and 'ap'. Indicates part of the transaction type.
- =item $form->{ARAP}
- Possible values are 'AR' and 'AP'. Should be the upper case variant of the
- value in $form->{arap}.
- =item $form->{vc}
- Possible values are 'vendor' and 'customer'. Should be 'customer' if
- $form->{arap} is 'ar' and 'vendor' if $form->{arap} is 'ap'.
- =item $form->{invnumber}
- Invoice number for the transaction being processed.
- =item $form->{exchangerate}
- Exchange rate used in the transaction.
- =item $form->{currency}
- Currency used by the transaction.
- =item $form->{account}
- Of the form 'accno--description'. Used to obtain the account number of the
- payment account.
- =item $form->{$form->{ARAP}}
- Of the form 'accno--description'. Used to obtain the account number of the
- non-payment account.
- =item $form->{department}
- Of the form 'description--department_id'. Used to obtain the id of the
- department involved in the transaction.
- =item $form->{$form->{vc}_id}
- The id of the customer or vendor involved in the overpayment.
- =item $form->{datepaid}
- The date to enter in as all the date fields related to the overpayment entries.
- =item $form->{source}
- Payment source
- =item $form->{memo}
- Payment memo
- =item $form->{approved}
- If this is false but defined, add a voucher entry. Otherwise, is set to true.
- =item $form->{batch_id}
- Batch id for a voucher, only used if $form->{approved} is false but defined.
- =back
- =cut
- 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,
- approved)
- VALUES (?, (SELECT id FROM chart
- WHERE accno = ?), ?, ?, ?)|;
- if (not defined $form->{approved}){
- $form->{approved} = 1;
- }
- if (!$form->{approved}){
- if (not defined $form->{batch_id}){
- $form->error($locale->text('Batch ID Missing'));
- }
- $query = qq|
- INSERT INTO voucher (batch_id, trans_id) VALUES (?, ?)|;
- $sth = $dbh->prepare($query);
- $sth->execute($form->{batch_id}, $uid) ||
- $form->dberror($query);
- }
- $sth = $dbh->prepare($query);
- $sth->execute( $uid, $accno, $form->{datepaid}, $fxamount * $ml,
- $form->{approved} )
- || $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;
- =back
|