# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1335, USA.
#======================================================================
#
# Check and receipt printing payment module backend routines
#======================================================================
package CP;
+use SL::DBUtils;
+use SL::DB;
+use strict;
sub new {
$main::lxdebug->enter_sub();
my ($type, $countrycode) = @_;
- $self = {};
+ my $self = {};
if ($countrycode) {
if (-f "locale/$countrycode/Num2text") {
bless $self, $type;
}
-
sub paymentaccounts {
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my $query = qq|SELECT c.accno, c.description, c.link
- FROM chart c
- WHERE c.link LIKE '%$form->{ARAP}%'
- ORDER BY c.accno|;
- my $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
-
- $form->{PR}{$form->{ARAP}} = ();
+ my $dbh = SL::DB->client->dbh;
+
+ my $ARAP = $form->{ARAP} eq "AR" ? "AR" : "AP";
+
+ my $query =
+ qq|SELECT accno, description, link | .
+ qq|FROM chart | .
+ qq|WHERE link LIKE ? |.
+ qq|ORDER BY accno|;
+ my $sth = prepare_execute_query($form, $dbh, $query, like($ARAP));
+
+ $form->{PR}{ $form->{ARAP} } = ();
$form->{PR}{"$form->{ARAP}_paid"} = ();
-
- while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
- foreach my $item (split /:/, $ref->{link}) {
+
+ while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
+ foreach my $item (split(/:/, $ref->{link})) {
if ($item eq $form->{ARAP}) {
- push @{ $form->{PR}{$form->{ARAP}} }, $ref;
+ push(@{ $form->{PR}{ $form->{ARAP} } }, $ref);
}
if ($item eq "$form->{ARAP}_paid") {
- push @{ $form->{PR}{"$form->{ARAP}_paid"} }, $ref;
+ push(@{ $form->{PR}{"$form->{ARAP}_paid"} }, $ref);
}
}
}
$sth->finish;
-
- # get currencies and closedto
- $query = qq|SELECT curr, closedto
- FROM defaults|;
- $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
-
- ($form->{currencies}, $form->{closedto}) = $sth->fetchrow_array;
- $sth->finish;
- $dbh->disconnect;
+ # get closedto
+ $query = qq|SELECT closedto FROM defaults|;
+ ($form->{closedto}) = selectrow_query($form, $dbh, $query);
$main::lxdebug->leave_sub();
}
-
-sub get_openvc {
+sub get_openinvoices {
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
- my $dbh = $form->dbconnect($myconfig);
-
- my $arap = ($form->{vc} eq 'customer') ? 'ar' : 'ap';
- my $query = qq|SELECT count(*)
- FROM $form->{vc} ct, $arap a
- WHERE a.$form->{vc}_id = ct.id
- AND a.amount != a.paid|;
- my $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
- my ($count) = $sth->fetchrow_array;
- $sth->finish;
-
- my $ref;
-
- # build selection list
- if ($count < $myconfig->{vclimit}) {
- $query = qq|SELECT DISTINCT ct.id, ct.name
- FROM $form->{vc} ct, $arap a
- WHERE a.$form->{vc}_id = ct.id
- AND a.amount != a.paid
- ORDER BY ct.name|;
- $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
-
- while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
- push @{ $form->{"all_$form->{vc}"} }, $ref;
- }
-
- $sth->finish;
+ # connect to database
+ my $dbh = SL::DB->client->dbh;
- }
+ my $vc = $form->{vc} eq "customer" ? "customer" : "vendor";
- if ($form->{ARAP} eq 'AR') {
- $query = qq|SELECT d.id, d.description
- FROM department d
- WHERE d.role = 'P'
- ORDER BY 2|;
- } else {
- $query = qq|SELECT d.id, d.description
- FROM department d
- ORDER BY 2|;
- }
- $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
+ my $buysell = $form->{vc} eq 'customer' ? "buy" : "sell";
+ my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
- while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
- push @{ $form->{all_departments} }, $ref;
+ my @values = (conv_i($form->{"${vc}_id"}), "$form->{currency}");
+ my $whereinvoice = '';
+ if ($::form->{invnumber}) {
+ $whereinvoice = ' AND a.invnumber LIKE ? ';
+ push @values, $::form->{invnumber};
}
- $sth->finish;
-
- $dbh->disconnect;
- $main::lxdebug->leave_sub();
-}
+ my $query =
+ qq|SELECT a.id, a.invnumber, a.transdate, a.amount, a.paid, cu.name AS curr | .
+ qq|FROM $arap a | .
+ qq|LEFT JOIN currencies cu ON (cu.id=a.currency_id)| .
+ qq|WHERE (a.${vc}_id = ?) AND cu.name = ? AND NOT (a.amount = a.paid)| .
+ $whereinvoice .
+ qq|ORDER BY a.id|;
+ my $sth = prepare_execute_query($form, $dbh, $query, @values);
-sub get_openinvoices {
- $main::lxdebug->enter_sub();
+ $form->{PR} = [];
+ while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my $where = qq|WHERE a.$form->{vc}_id = $form->{"$form->{vc}_id"}
- AND a.curr = '$form->{currency}'
- AND NOT a.amount = paid|;
-
- my ($buysell);
- if ($form->{vc} eq 'customer') {
- $buysell = "buy";
- } else {
- $buysell = "sell";
- }
-
- my $query = qq|SELECT a.id, a.invnumber, a.transdate, a.amount, a.paid, a.curr
- FROM $form->{arap} a
- $where
- ORDER BY a.id|;
- my $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
-
- while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
# if this is a foreign currency transaction get exchangerate
- $ref->{exchangerate} = $form->get_exchangerate($dbh, $ref->{curr}, $ref->{transdate}, $buysell) if ($form->{currency} ne $form->{defaultcurrency});
+ $ref->{exchangerate} =
+ $form->get_exchangerate($dbh, $ref->{curr}, $ref->{transdate}, $buysell)
+ if ($form->{currency} ne $form->{defaultcurrency});
push @{ $form->{PR} }, $ref;
}
-
+
$sth->finish;
- $dbh->disconnect;
+
+ $query = <<SQL;
+ SELECT COUNT(*)
+ FROM $arap
+ WHERE (${vc}_id = ?)
+ AND ((SELECT cu.name FROM currencies cu WHERE cu.id=${arap}.currency_id) <> ?)
+ AND (amount <> paid)
+SQL
+ ($form->{openinvoices_other_currencies}) = selectfirst_array_query($form, $dbh, $query, conv_i($form->{"${vc}_id"}), "$form->{currency}");
$main::lxdebug->leave_sub();
}
-
-
sub process_payment {
+ my ($self, $myconfig, $form) = @_;
$main::lxdebug->enter_sub();
+ my $rc = SL::DB->client->with_transaction(\&_process_payment, $self, $myconfig, $form);
+
+ $::lxdebug->leave_sub;
+ return $rc;
+}
+
+sub _process_payment {
my ($self, $myconfig, $form) = @_;
-
- # connect to database, turn AutoCommit off
- my $dbh = $form->dbconnect_noauto($myconfig);
+ my $amount;
+
+ my $dbh = SL::DB->client->dbh;
my ($paymentaccno) = split /--/, $form->{account};
-
+
# if currency ne defaultcurrency update exchangerate
if ($form->{currency} ne $form->{defaultcurrency}) {
- $form->{exchangerate} = $form->parse_amount($myconfig, $form->{exchangerate});
+ $form->{exchangerate} =
+ $form->parse_amount($myconfig, $form->{exchangerate});
if ($form->{vc} eq 'customer') {
$form->update_exchangerate($dbh, $form->{currency}, $form->{datepaid}, $form->{exchangerate}, 0);
$form->{exchangerate} = 1;
}
- my $query = qq|SELECT fxgain_accno_id, fxloss_accno_id
- FROM defaults|;
- my $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
+ my $query = qq|SELECT fxgain_accno_id, fxloss_accno_id FROM defaults|;
+ my ($fxgain_accno_id, $fxloss_accno_id) = selectrow_query($form, $dbh, $query);
- my ($fxgain_accno_id, $fxloss_accno_id) = $sth->fetchrow_array;
- $sth->finish;
-
- my ($buysell);
-
- if ($form->{vc} eq 'customer') {
- $buysell = "buy";
- } else {
- $buysell = "sell";
- }
+ my $buysell = $form->{vc} eq "customer" ? "buy" : "sell";
+ my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
my $ml;
my $where;
-
+
if ($form->{ARAP} eq 'AR') {
- $ml = 1;
- $where = qq|
- (c.link = 'AR'
- OR c.link LIKE 'AR:%')
- |;
+ $ml = 1;
+ $where = qq| ((c.link = 'AR') OR (c.link LIKE 'AR:%')) |;
} else {
- $ml = -1;
- $where = qq|
- (c.link = 'AP'
- OR c.link LIKE '%:AP'
- OR c.link LIKE '%:AP:%')
- |;
+ $ml = -1;
+ $where =
+ qq| ((c.link = 'AP') OR | .
+ qq| (c.link LIKE '%:AP') OR | .
+ qq| (c.link LIKE '%:AP:%')) |;
}
-
- $paymentamount = $form->{amount};
-
-# $paymentamount = $form->{amount};
- my $null;
- ($null, $form->{department_id}) = split /--/, $form->{department};
- $form->{department_id} *= 1;
# query to retrieve paid amount
- $query = qq|SELECT a.paid FROM ar a
- WHERE a.id = ?
- FOR UPDATE|;
- my $pth = $dbh->prepare($query) || $form->dberror($query);
+ $query =
+ qq|SELECT a.paid FROM ar a | .
+ qq|WHERE a.id = ? | .
+ qq|FOR UPDATE|;
+ my $pth = prepare_query($form, $dbh, $query);
# go through line by line
for my $i (1 .. $form->{rowcount}) {
$form->{"paid_$i"} = $form->parse_amount($myconfig, $form->{"paid_$i"});
- $form->{"due_$i"} = $form->parse_amount($myconfig, $form->{"due_$i"});
-
- if ($form->{"checked_$i"} && $form->{"paid_$i"}) {
- $paymentamount = (($paymentamount * 1000) - ($form->{"paid_$i"} * 1000)) / 1000;
-
- # get exchangerate for original
- $query = qq|SELECT $buysell
- FROM exchangerate e
- JOIN $form->{arap} a ON (a.transdate = e.transdate)
- WHERE e.curr = '$form->{currency}'
- AND a.id = $form->{"id_$i"}|;
- $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
-
- my ($exchangerate) = $sth->fetchrow_array;
- $sth->finish;
+ $form->{"due_$i"} = $form->parse_amount($myconfig, $form->{"due_$i"});
- $exchangerate = 1 unless $exchangerate;
+ if ($form->{"checked_$i"} && $form->{"paid_$i"}) {
+
+ # get exchangerate for original
+ $query =
+ qq|SELECT $buysell | .
+ qq|FROM exchangerate e | .
+ qq|JOIN ${arap} a ON (a.transdate = e.transdate) | .
+ qq|WHERE (e.currency_id = (SELECT id FROM currencies WHERE name = ?)) AND (a.id = ?)|;
+ my ($exchangerate) =
+ selectrow_query($form, $dbh, $query,
+ $form->{currency}, $form->{"id_$i"});
- $query = qq|SELECT c.id
- FROM chart c
- JOIN acc_trans a ON (a.chart_id = c.id)
- WHERE $where
- AND a.trans_id = $form->{"id_$i"}|;
- $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
+ $exchangerate = 1 unless $exchangerate;
- my ($id) = $sth->fetchrow_array;
- $sth->finish;
+ $query =
+ qq|SELECT c.id | .
+ qq|FROM chart c | .
+ qq|JOIN acc_trans a ON (a.chart_id = c.id) | .
+ qq|WHERE $where | .
+ qq|AND (a.trans_id = ?)|;
+ my ($id) = selectrow_query($form, $dbh, $query, $form->{"id_$i"});
-
$amount = $form->round_amount($form->{"paid_$i"} * $exchangerate, 2);
-
+
# add AR/AP
- $query = qq|INSERT INTO acc_trans (trans_id, chart_id, transdate,
- amount)
- VALUES ($form->{"id_$i"}, $id, '$form->{datepaid}',
- $amount * $ml)|;
- $dbh->do($query) || $form->dberror($query);
+ $query =
+ qq|INSERT INTO acc_trans (trans_id, chart_id, transdate, amount, chart_link, taxkey, tax_id) | .
+ qq|VALUES (?, ?, ?, ?, (SELECT link FROM chart WHERE id=?), 0, (SELECT id FROM tax WHERE taxkey=0 LIMIT 1))|;
+ do_query($form, $dbh, $query, $form->{"id_$i"}, $id,
+ conv_date($form->{datepaid}), $amount * $ml, $id);
+
# add payment
- $query = qq|INSERT INTO acc_trans (trans_id, chart_id, transdate,
- amount, source, memo)
- VALUES ($form->{"id_$i"},
- (SELECT c.id FROM chart c
- WHERE c.accno = '$paymentaccno'),
- '$form->{datepaid}', $form->{"paid_$i"} * $ml * -1,
- '$form->{source}', '$form->{memo}')|;
- $dbh->do($query) || $form->dberror($query);
+ $query =
+ qq|INSERT INTO acc_trans (trans_id, chart_id, transdate, amount, | .
+ qq| source, memo, chart_link, taxkey, tax_id) | .
+ qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, (SELECT link FROM chart WHERE accno=?), 0, (SELECT id FROM tax WHERE taxkey=0 LIMIT 1))|;
+ my @values = (conv_i($form->{"id_$i"}), $paymentaccno,
+ conv_date($form->{datepaid}),
+ $form->{"paid_$i"} * $ml * -1, $form->{source},
+ $form->{memo}, $paymentaccno);
+ do_query($form, $dbh, $query, @values);
+
# add exchangerate difference if currency ne defaultcurrency
- $amount = $form->round_amount($form->{"paid_$i"} * ($form->{exchangerate} - 1), 2);
+ $amount = $form->round_amount($form->{"paid_$i"} * ($form->{exchangerate} - 1),
+ 2);
if ($amount != 0) {
+
# exchangerate difference
- $query = qq|INSERT INTO acc_trans (trans_id, chart_id, transdate,
- amount, cleared, fx_transaction)
- VALUES ($form->{"id_$i"},
- (SELECT c.id FROM chart c
- WHERE c.accno = '$paymentaccno'),
- '$form->{datepaid}', $amount * $ml * -1, '0', '1')|;
- $dbh->do($query) || $form->dberror($query);
+ $query =
+ qq|INSERT INTO acc_trans (trans_id, chart_id, transdate, amount, | .
+ qq| cleared, fx_transaction, chart_link, taxkey, tax_id) | .
+ qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, (SELECT link FROM chart WHERE accno = ?), 0, (SELECT id FROM tax WHERE taxkey=0 LIMIT 1))|;
+ @values = (conv_i($form->{"id_$i"}), $paymentaccno,
+ conv_date($form->{datepaid}), ($amount * $ml * -1), '0',
+ '1', $paymentaccno);
+ do_query($form, $dbh, $query, @values);
# gain/loss
-
- $amount = $form->round_amount($form->{"paid_$i"} * ($exchangerate - $form->{exchangerate}), 2);
- if ($amount != 0) {
- my $accno_id = ($amount < 0) ? $fxgain_accno_id : $fxloss_accno_id;
- $query = qq|INSERT INTO acc_trans (trans_id, chart_id, transdate,
- amount, cleared, fx_transaction)
- VALUES ($form->{"id_$i"}, $accno_id,
- '$form->{datepaid}', $amount * $ml * -1, '0', '1')|;
- $dbh->do($query) || $form->dberror($query);
- }
- }
- $form->{"paid_$i"} = $form->round_amount($form->{"paid_$i"} * $exchangerate, 2);
+ $amount =
+ $form->round_amount($form->{"paid_$i"} *
+ ($exchangerate - $form->{exchangerate}), 2);
+ if ($amount != 0) {
+ my $accno_id = ($amount < 0) ? $fxgain_accno_id : $fxloss_accno_id;
+ $query =
+ qq|INSERT INTO acc_trans (trans_id, chart_id, transdate, | .
+ qq| amount, cleared, fx_transaction, chart_link, taxkey, tax_id) | .
+ qq|VALUES (?, ?, ?, ?, ?, ?, (SELECT link FROM chart WHERE id=?), 0, (SELECT id FROM tax WHERE taxkey=0 LIMIT 1))|;
+ @values = (conv_i($form->{"id_$i"}), $accno_id,
+ conv_date($form->{datepaid}), $amount * $ml * -1, '0',
+ '1', $accno_id);
+ do_query($form, $dbh, $query, @values);
+ }
+ }
+ $form->{"paid_$i"} =
+ $form->round_amount($form->{"paid_$i"} * $exchangerate, 2);
$pth->execute($form->{"id_$i"}) || $form->dberror;
($amount) = $pth->fetchrow_array;
$pth->finish;
$amount += $form->{"paid_$i"};
-
- # update AR/AP transaction
- $query = qq|UPDATE $form->{arap} set
- paid = $amount,
- datepaid = '$form->{datepaid}'
- WHERE id = $form->{"id_$i"}|;
- $dbh->do($query) || $form->dberror($query);
- }
- }
+ my $paid;
+ # BUG 324
+ if ($form->{arap} eq 'ap') {
+ $paid = "paid = paid + $amount";
+ } else {
+ $paid = "paid = $amount";
+ }
- # record a AR/AP with a payment
- if ($form->round_amount($paymentamount, 2) > 0) {
- $form->{invnumber} = "";
- OP::overpayment("", $myconfig, $form, $dbh, $paymentamount, $ml, 1);
+ # update AR/AP transaction
+ $query = qq|UPDATE $arap SET $paid, datepaid = ? WHERE id = ?|;
+ @values = (conv_date($form->{datepaid}), conv_i($form->{"id_$i"}));
+ do_query($form, $dbh, $query, @values);
+ # saving the history
+ $form->{id} = $form->{"id_$i"};
+ if(!exists $form->{addition}) {
+ $form->{snumbers} = qq|invnumber_| . $form->{"invnumber_$i"};
+ $form->{what_done} = "invoice";
+ $form->{addition} = "PAYMENT POSTED";
+ $form->save_history;
+ }
+ # /saving the history
+ }
}
-
- if ($form->round_amount($paymentamount, 2) < 0) {
- $dbh->rollback;
- $rc = 0;
- }
- if ($form->round_amount($paymentamount, 2) == 0) {
- $rc = $dbh->commit;
- }
-
- $dbh->disconnect;
-
- $main::lxdebug->leave_sub();
- return $rc;
+ return 1;
}
-
1;
-