get_vendor auf aktuellen Stand gebracht.
[kivitendo-erp.git] / SL / IR.pm
index 702c9f5..2a74e06 100644 (file)
--- a/SL/IR.pm
+++ b/SL/IR.pm
@@ -35,6 +35,8 @@
 package IR;
 
 use SL::AM;
+use SL::Common;
+use SL::DBUtils;
 
 sub post_invoice {
   $main::lxdebug->enter_sub();
@@ -80,9 +82,6 @@ sub post_invoice {
     $sth->finish;
   }
 
-  ($null, $form->{contact_id}) = split /--/, $form->{contact};
-  $form->{contact_id} *= 1;
-
   map { $form->{$_} =~ s/\'/\'\'/g } qw(invnumber ordnumber quonumber);
 
   my ($amount, $linetotal, $lastinventoryaccno, $lastexpenseaccno);
@@ -101,14 +100,20 @@ sub post_invoice {
     ? $exchangerate
     : $form->parse_amount($myconfig, $form->{exchangerate});
 
+  $form->{exchangerate} = 1 unless ($form->{exchangerate} * 1);
+
   for my $i (1 .. $form->{rowcount}) {
     $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"});
     
     if ($form->{storno}) {
       $form->{"qty_$i"} *= -1;
     }
+
+    if ($main::eur) {
+      $form->{"inventory_accno_$i"} = $form->{"expense_accno_$i"};
+    }
     
-    if ($form->{"qty_$i"} != 0) {
+    if ($form->{"id_$i"}) {
 
       # get item baseunit
       $query = qq|SELECT p.unit
@@ -271,9 +276,9 @@ sub post_invoice {
             # add entry for inventory, this one is for the sold item
             if ($linetotal != 0) {
               $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,
-                         transdate)
+                         transdate, taxkey)
                          VALUES ($ref->{trans_id}, $ref->{inventory_accno_id},
-                         $linetotal, '$ref->{transdate}')|;
+                         $linetotal, '$ref->{transdate}', (SELECT taxkey_id FROM chart WHERE id = $ref->{inventory_accno_id}))|;
               $dbh->do($query) || $form->dberror($query);
 
               # add expense
@@ -368,10 +373,6 @@ sub post_invoice {
 
       }
 
-      $project_id = 'NULL';
-      if ($form->{"projectnumber_$i"}) {
-        $project_id = $form->{"projectnumber_$i"};
-      }
       $deliverydate =
         ($form->{"deliverydate_$i"})
         ? qq|'$form->{"deliverydate_$i"}'|
@@ -384,12 +385,14 @@ sub post_invoice {
                  VALUES ($form->{id}, $form->{"id_$i"},
                  '$form->{"description_$i"}', | . ($form->{"qty_$i"} * -1) . qq|,  | . ($baseqty * -1) . qq|,
                  $form->{"sellprice_$i"}, $fxsellprice, $allocated,
-                 '$form->{"unit_$i"}', $deliverydate, (SELECT id FROM project WHERE projectnumber = '$project_id'),
+                 '$form->{"unit_$i"}', $deliverydate, | . conv_i($form->{"project_id_$i"}, 'NULL') . qq|,
                  '$form->{"serialnumber_$i"}')|;
       $dbh->do($query) || $form->dberror($query);
     }
   }
 
+  $project_id = conv_i($form->{"globalproject_id"});
+
   $form->{datepaid} = $form->{invdate};
 
   # all amounts are in natural state, netamount includes the taxes
@@ -477,12 +480,12 @@ sub post_invoice {
           ) != 0
         ) {
         $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,
-                   transdate, taxkey)
+                   transdate, taxkey, project_id)
                    VALUES ($trans_id, (SELECT c.id FROM chart c
                                         WHERE c.accno = '$accno'),
                    $form->{amount}{$trans_id}{$accno}, '$form->{invdate}',
-                   (SELECT taxkey_id  FROM chart WHERE accno = '$accno'))|;
-        $dbh->do($query) || $form->dberror($query);
+                   (SELECT taxkey_id  FROM chart WHERE accno = '$accno'), ?)|;
+        do_query($form, $dbh, $query, $project_id);
       }
     }
   }
@@ -519,22 +522,24 @@ sub post_invoice {
 
       if ($form->{amount}{ $form->{id} }{ $form->{AP} } != 0) {
         $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,
-                   transdate)
+                   transdate, taxkey, project_id)
                    VALUES ($form->{id}, (SELECT c.id FROM chart c
-                                       WHERE c.accno = '$form->{AP}'),
-                   $amount, '$form->{"datepaid_$i"}')|;
-        $dbh->do($query) || $form->dberror($query);
+                                       WHERE c.accno = ?),
+                   $amount, '$form->{"datepaid_$i"}',
+                    (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|;
+        do_query($form, $dbh, $query, $form->{AP}, $form->{AP}, $project_id);
       }
 
       # record payment
 
       $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate,
-                  source, memo)
+                  source, memo, taxkey, project_id)
                   VALUES ($form->{id}, (SELECT c.id FROM chart c
-                                     WHERE c.accno = '$accno'),
+                                     WHERE c.accno = ?),
                   $form->{"paid_$i"}, '$form->{"datepaid_$i"}',
-                 '$form->{"source_$i"}', '$form->{"memo_$i"}')|;
-      $dbh->do($query) || $form->dberror($query);
+                 '$form->{"source_$i"}', '$form->{"memo_$i"}',
+                  (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|;
+      do_query($form, $dbh, $query, $accno, $accno, $project_id);
 
       $exchangerate = 0;
 
@@ -588,11 +593,11 @@ sub post_invoice {
         ) {
 
         $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,
-                   transdate, cleared, fx_transaction)
+                   transdate, cleared, fx_transaction, taxkey, project_id)
                    VALUES ($form->{id}, (SELECT c.id FROM chart c
                                        WHERE c.accno = '$accno'),
-                    $form->{fx}{$accno}{$transdate}, '$transdate', '0', '1')|;
-        $dbh->do($query) || $form->dberror($query);
+                    $form->{fx}{$accno}{$transdate}, '$transdate', '0', '1', 0, ?)|;
+        do_query($form, $dbh, $query, $project_id);
       }
     }
   }
@@ -620,6 +625,8 @@ sub post_invoice {
              ordnumber = '$form->{ordnumber}',
              quonumber = '$form->{quonumber}',
               transdate = '$form->{invdate}',
+              orddate = | . conv_dateq($form->{"orddate"}) . qq|,
+              quodate = | . conv_dateq($form->{"quodate"}) . qq|,
               vendor_id = $form->{vendor_id},
               amount = $amount,
               netamount = $netamount,
@@ -634,7 +641,8 @@ sub post_invoice {
              curr = '$form->{currency}',
              department_id = $form->{department_id},
               storno = '$form->{storno}',
-              cp_id = $form->{contact_id}
+              globalproject_id = | . conv_i($form->{"globalproject_id"}, 'NULL') . qq|,
+              cp_id = | . conv_i($form->{cp_id}, 'NULL') . qq|
               WHERE id = $form->{id}|;
   $dbh->do($query) || $form->dberror($query);
 
@@ -661,9 +669,7 @@ sub post_invoice {
               WHERE amount = 0|;
   $dbh->do($query) || $form->dberror($query);
 
-  if ($form->{webdav}) {
-    &webdav_folder($myconfig, $form);
-  }
+  Common::webdav_folder($form) if ($main::webdav);
 
   my $rc = $dbh->commit;
   $dbh->disconnect;
@@ -841,7 +847,8 @@ sub retrieve_invoice {
 
     # retrieve invoice
     $query = qq|SELECT a.cp_id, a.invnumber, a.transdate AS invdate, a.duedate,
-                a.ordnumber, a.quonumber, a.paid, a.taxincluded, a.notes, a.taxzone_id, a.storno,
+                a.orddate, a.quodate, a.globalproject_id,
+                a.ordnumber, a.quonumber, a.paid, a.taxincluded, a.notes, a.taxzone_id, a.storno, a.gldate,
                a.intnotes, a.curr AS currency
                FROM ap a
                WHERE a.id = $form->{id}|;
@@ -866,10 +873,9 @@ sub retrieve_invoice {
     delete($ref->{id});
     map { $form->{$_} = $ref->{$_} } keys %$ref;
     $sth->finish;
-    my $transdate = "current_date";
-    if($form->{invdate}) {
-     $transdate = "'$form->{invdate}'";
-    }
+
+    my $transdate =
+      $form->{invdate} ? $dbh->quote($form->{invdate}) : "current_date";
 
     if(!$form->{taxzone_id}) {
       $form->{taxzone_id} = 0;
@@ -925,25 +931,13 @@ sub retrieve_invoice {
         $stw->finish;
       }
 
-
-
-      #set expense_accno=inventory_accno if they are different => bilanz
-      $vendor_accno =
-        ($ref->{expense_accno} != $ref->{inventory_accno})
-        ? $ref->{inventory_accno}
-        : $ref->{expense_accno};
-      $vendor_accno =
-        ($ref->{inventory_accno})
-        ? $ref->{inventory_accno}
-        : $ref->{expense_accno};
-
       # get tax rates and description
       $accno_id =
-        ($form->{vc} eq "customer") ? $ref->{income_accno} : $vendor_accno;
-      $query = qq|SELECT c.accno, t.taxdescription, t.rate, t.taxnumber
-                FROM tax t LEFT join chart c ON (c.id=t.chart_id)
-                WHERE t.taxkey in (SELECT taxkey_id from chart where accno = '$accno_id')
-                ORDER BY accno|;
+        ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno};
+    $query = qq|SELECT c.accno, t.taxdescription, t.rate, t.taxnumber
+             FROM tax t LEFT JOIN chart c on (c.id=t.chart_id)
+             WHERE t.id in (SELECT tk.tax_id from taxkeys tk where tk.chart_id = (SELECT id from chart WHERE accno='$accno_id') AND startdate<=$transdate ORDER BY startdate desc LIMIT 1)
+             ORDER BY c.accno|;
       $stw = $dbh->prepare($query);
       $stw->execute || $form->dberror($query);
       $ref->{taxaccounts} = "";
@@ -971,10 +965,7 @@ sub retrieve_invoice {
     }
     $sth->finish;
 
-    if ($form->{webdav}) {
-      &webdav_folder($myconfig, $form);
-    }
-
+    Common::webdav_folder($form) if ($main::webdav);
   }
 
   my $rc = $dbh->commit;
@@ -1007,108 +998,81 @@ sub get_vendor {
   my $query = qq|SELECT v.name AS vendor, v.creditlimit, v.terms,
                  v.email, v.cc, v.bcc, v.language_id, v.payment_id,
                 v.street, v.zipcode, v.city, v.country, v.taxzone_id,
-                 $duedate + v.terms AS duedate
+                 $duedate + COALESCE(pt.terms_netto, 0) AS duedate,
+                 b.description AS business
                  FROM vendor v
-                WHERE v.id = $form->{vendor_id}|;
-  my $sth = $dbh->prepare($query);
-  $sth->execute || $form->dberror($query);
-
-  $ref = $sth->fetchrow_hashref(NAME_lc);
+                 LEFT JOIN business b ON b.id = v.business_id
+                 LEFT JOIN payment_terms pt ON v.payment_id = pt.id
+                WHERE v.id = ?|;
+  $ref = selectfirst_hashref_query($form, $dbh, $query, $form->{vendor_id});
   map { $form->{$_} = $ref->{$_} } keys %$ref;
-  $sth->finish;
 
   $form->{creditremaining} = $form->{creditlimit};
-  $query = qq|SELECT SUM(a.amount - a.paid)
-              FROM ap a
-             WHERE a.vendor_id = $form->{vendor_id}|;
-  $sth = $dbh->prepare($query);
-  $sth->execute || $form->dberror($query);
-
-  ($form->{creditremaining}) -= $sth->fetchrow_array;
-
-  $sth->finish;
+  $query = qq|SELECT SUM(a.amount - a.paid) FROM ap a WHERE a.vendor_id = ?|;
+  ($form->{creditremaining}) -= selectfirst_array_query($form, $dbh, $query, $form->{vendor_id});
 
   $query = qq|SELECT o.amount,
-                (SELECT e.sell FROM exchangerate e
-                WHERE e.curr = o.curr
-                AND e.transdate = o.transdate)
-             FROM oe o
-             WHERE o.vendor_id = $form->{vendor_id}
-             AND o.quotation = '0'
-             AND o.closed = '0'|;
-  $sth = $dbh->prepare($query);
-  $sth->execute || $form->dberror($query);
-
-  while (my ($amount, $exch) = $sth->fetchrow_array) {
+                (SELECT e.sell FROM exchangerate e 
+                 WHERE e.curr = o.curr AND e.transdate = o.transdate)
+             FROM oe o WHERE o.vendor_id = ?  
+                AND o.quotation = '0' AND o.closed = '0'|;
+  while (my ($amount, $exch) = selectfirst_array_query($form, $dbh, $query, $form->{vendor_id})) {
     $exch = 1 unless $exch;
     $form->{creditremaining} -= $amount * $exch;
   }
-  $sth->finish;
-
-  $form->get_contacts($dbh, $form->{vendor_id});
-
-  ($null, $form->{cp_id}) = split /--/, $form->{contact};
-
-  # get contact if selected
-  if ($form->{contact} ne "--" && $form->{contact} ne "") {
-    $form->get_contact($dbh, $form->{cp_id});
-  }
 
   # get shipto if we do not convert an order or invoice
   if (!$form->{shipto}) {
     map { delete $form->{$_} }
       qw(shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax shiptoemail);
 
-    $query = qq|SELECT s.* FROM shipto s
-                WHERE s.trans_id = $form->{vendor_id} AND s.module= 'CT'|;
-    $sth = $dbh->prepare($query);
-    $sth->execute || $form->dberror($query);
-
-    $ref = $sth->fetchrow_hashref(NAME_lc);
+    $query = qq|SELECT s.* FROM shipto s WHERE s.trans_id = ? AND s.module= 'CT'|;
+    $ref = selectfirst_hashref_query($form, $dbh, $query, $form->{vendor_id});
     map { $form->{$_} = $ref->{$_} } keys %$ref;
-    $sth->finish;
   }
 
   # get taxes for vendor
-  $query = qq|SELECT c.accno
-              FROM chart c
+  $query = qq|SELECT c.accno FROM chart c
              JOIN vendortax v ON (v.chart_id = c.id)
-             WHERE v.vendor_id = $form->{vendor_id}|;
-  $sth = $dbh->prepare($query);
-  $sth->execute || $form->dberror($query);
-
+             WHERE v.vendor_id = ?|;
   my $vendortax = ();
-  while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
-    $vendortax{ $ref->{accno} } = 1;
-  }
-  $sth->finish;
+  $ref = selectall_hashref_query($form, $dbh, $query, $form->{vendor_id});
+  map { $vendortax{ $_->{accno} } = 1 } @$ref;
 
   if (!$form->{id} && $form->{type} !~ /_(order|quotation)/) {
 
     # setup last accounts used
-    $query = qq|SELECT c.accno, c.description, c.link, c.category
+    $query = qq|SELECT c.id, c.accno, c.description, c.link, c.category
                FROM chart c
                JOIN acc_trans ac ON (ac.chart_id = c.id)
                JOIN ap a ON (a.id = ac.trans_id)
-               WHERE a.vendor_id = $form->{vendor_id}
-               AND NOT (c.link LIKE '%_tax%' OR c.link LIKE '%_paid%')
+               WHERE a.vendor_id = ?
+                AND NOT (c.link LIKE '%_tax%' OR c.link LIKE '%_paid%')
                AND a.id IN (SELECT max(a2.id) FROM ap a2
-                            WHERE a2.vendor_id = $form->{vendor_id})|;
-    $sth = $dbh->prepare($query);
-    $sth->execute || $form->dberror($query);
+                            WHERE a2.vendor_id = ?)|;
+    $refs = selectall_hashref_query($form, $dbh, $query, $form->{vendor_id}, $form->{vendor_id});
 
     my $i = 0;
-    while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
+    for $ref (@$refs) {
       if ($ref->{category} eq 'E') {
         $i++;
-        $form->{"AP_amount_$i"} = "$ref->{accno}--$ref->{description}";
+
+        if ($form->{initial_transdate}) {
+          my $tax_query = qq|SELECT tk.tax_id, t.rate FROM taxkeys tk
+                             LEFT JOIN tax t ON tk.tax_id = t.id
+                             WHERE tk.chart_id = ? AND startdate <= ?
+                             ORDER BY tk.startdate DESC LIMIT 1|;
+          my ($tax_id, $rate) = selectrow_query($form, $dbh, $tax_query, $ref->{id},
+                                                $form->{initial_transdate});
+          $form->{"taxchart_$i"} = "${tax_id}--${rate}";
+        }
+
+        $form->{"AP_amount_$i"} = "$ref->{accno}--$tax_id";
       }
       if ($ref->{category} eq 'L') {
-        $form->{APselected} = $form->{AP_1} =
-          "$ref->{accno}--$ref->{description}";
+        $form->{APselected} = $form->{AP_1} = $ref->{accno};
       }
     }
-    $sth->finish;
     $form->{rowcount} = $i if ($i && !$form->{type});
   }
 
@@ -1122,6 +1086,9 @@ sub retrieve_item {
 
   my ($self, $myconfig, $form) = @_;
 
+  # connect to database
+  my $dbh = $form->dbconnect($myconfig);
+
   my $i = $form->{rowcount};
 
   # don't include assemblies or obsolete parts
@@ -1150,21 +1117,14 @@ sub retrieve_item {
 
   my $transdate = "";
   if ($form->{type} eq "invoice") {
-    $transdate = "'$form->{invdate}'";
-  } elsif ($form->{type} eq "purchase_order") {
-    $transdate = "'$form->{transdate}'";
-  } elsif ($form->{type} eq "request_quotation") {
-    $transdate = "'$form->{transdate}'";
-  }
-
-  if ($transdate eq "") {
-    $transdate = "current_date";
+    $transdate =
+      $form->{invdate} ? $dbh->quote($form->{invdate}) : "current_date";
+  } else {
+    $transdate =
+      $form->{transdate} ? $dbh->quote($form->{transdate}) : "current_date";
   }
 
-  # connect to database
-  my $dbh = $form->dbconnect($myconfig);
-
-  my $query = qq|SELECT p.id, p.partnumber, p.description, p.sellprice,
+  my $query = qq|SELECT p.id, p.partnumber, p.description, p.lastcost AS sellprice,
                         p.listprice, p.inventory_accno_id,
                         c1.accno AS inventory_accno, c1.new_chart_id AS inventory_new_chart, date($transdate) - c1.valid_from as inventory_valid,
                        c2.accno AS income_accno, c2.new_chart_id AS income_new_chart, date($transdate)  - c2.valid_from as income_valid,
@@ -1190,22 +1150,12 @@ sub retrieve_item {
     }
     delete($ref->{inventory_accno_id});
 
-    #set expense_accno=inventory_accno if they are different => bilanz
-    $vendor_accno =
-      ($ref->{expense_accno} != $ref->{inventory_accno})
-      ? $ref->{inventory_accno}
-      : $ref->{expense_accno};
-    $vendor_accno =
-      ($ref->{inventory_accno})
-      ? $ref->{inventory_accno}
-      : $ref->{expense_accno};
-
     # get tax rates and description
     $accno_id =
-      ($form->{vc} eq "customer") ? $ref->{income_accno} : $vendor_accno;
+      ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno};
     $query = qq|SELECT c.accno, t.taxdescription, t.rate, t.taxnumber
-             FROM tax t LEFT JOIN chart c ON (c.id=t.chart_id)
-             WHERE t.taxkey in (SELECT taxkey_id from chart where accno = '$accno_id')
+             FROM tax t LEFT JOIN chart c on (c.id=t.chart_id)
+             WHERE t.id in (SELECT tk.tax_id from taxkeys tk where tk.chart_id = (SELECT id from chart WHERE accno='$accno_id') AND startdate<=$transdate ORDER BY startdate desc LIMIT 1)
              ORDER BY c.accno|;
     $stw = $dbh->prepare($query);
     $stw->execute || $form->dberror($query);
@@ -1245,7 +1195,7 @@ sub retrieve_item {
 sub vendor_details {
   $main::lxdebug->enter_sub();
 
-  my ($self, $myconfig, $form) = @_;
+  my ($self, $myconfig, $form, @wanted_vars) = @_;
 
   # connect to database
   my $dbh = $form->dbconnect($myconfig);
@@ -1272,6 +1222,14 @@ sub vendor_details {
 
   # remove id and taxincluded before copy back
   delete @$ref{qw(id taxincluded)};
+
+  @wanted_vars = grep({ $_ } @wanted_vars);
+  if (scalar(@wanted_vars) > 0) {
+    my %h_wanted_vars;
+    map({ $h_wanted_vars{$_} = 1; } @wanted_vars);
+    map({ delete($ref->{$_}) unless ($h_wanted_vars{$_}); } keys(%{$ref}));
+  }
+
   map { $form->{$_} = $ref->{$_} } keys %$ref;
 
   $sth->finish;
@@ -1309,38 +1267,6 @@ sub item_links {
   $main::lxdebug->leave_sub();
 }
 
-sub webdav_folder {
-  $main::lxdebug->enter_sub();
-
-  my ($myconfig, $form) = @_;
-
-SWITCH: {
-    $path = "webdav/rechnungen/" . $form->{invnumber}, last SWITCH
-      if ($form->{vc} eq "customer");
-    $path = "webdav/einkaufsrechnungen/" . $form->{invnumber}, last SWITCH
-      if ($form->{vc} eq "vendor");
-  }
-
-  if (!-d $path) {
-    mkdir($path, 0770) or die "can't make directory $!\n";
-  } else {
-    if ($form->{id}) {
-      @files = <$path/*>;
-      foreach $file (@files) {
-
-        $file =~ /\/([^\/]*)$/;
-        $fname = $1;
-        $ENV{'SCRIPT_NAME'} =~ /\/([^\/]*)\//;
-        $lxerp = $1;
-        $link  = "http://" . $ENV{'SERVER_NAME'} . "/" . $lxerp . "/" . $file;
-        $form->{WEBDAV}{$fname} = $link;
-      }
-    }
-  }
-
-  $main::lxdebug->leave_sub();
-}
-
 sub post_payment {
   $main::lxdebug->enter_sub();
 
@@ -1362,6 +1288,8 @@ sub post_payment {
       $form->get_exchangerate($dbh, $form->{currency}, $form->{invdate},
                               "buy");
 
+  my $project_id = conv_i($form->{"globalproject_id"});
+
   # record payments and offsetting AP
   for my $i (1 .. $form->{paidaccounts}) {
 
@@ -1396,11 +1324,12 @@ sub post_payment {
       $dbh->do($query) || $form->dberror($query);
 
       $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,
-                  transdate)
+                  transdate, taxkey, project_id)
                   VALUES ($form->{id}, (SELECT c.id FROM chart c
-                                      WHERE c.accno = '$form->{AP}'),
-                  $amount, '$form->{"datepaid_$i"}')|;
-      $dbh->do($query) || $form->dberror($query);
+                                      WHERE c.accno = ?),
+                  $amount, '$form->{"datepaid_$i"}',
+                  (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|;
+      do_query($form, $dbh, $query, $form->{AP}, $form->{AP}, $project_id);
 
 
 
@@ -1409,12 +1338,13 @@ sub post_payment {
       $dbh->do($query) || $form->dberror($query);
 
       $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate,
-                  source, memo)
+                  source, memo, taxkey, project_id)
                   VALUES ($form->{id}, (SELECT c.id FROM chart c
-                                     WHERE c.accno = '$accno'),
+                                     WHERE c.accno = ?),
                  $form->{"paid_$i"}, '$form->{"datepaid_$i"}',
-                 '$form->{"source_$i"}', '$form->{"memo_$i"}')|;
-      $dbh->do($query) || $form->dberror($query);
+                 '$form->{"source_$i"}', '$form->{"memo_$i"}',
+                  (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|;
+      do_query($form, $dbh, $query, $accno, $accno, $project_id);
 
 
       # gain/loss
@@ -1452,12 +1382,13 @@ sub post_payment {
                                         WHERE c.accno = '$accno') AND amount=$form->{fx}{$accno}{$transdate} AND transdate='$transdate' AND cleared='0' AND fx_transaction='1'|;
         $dbh->do($query) || $form->dberror($query);
         $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,
-                   transdate, cleared, fx_transaction)
+                   transdate, cleared, fx_transaction, taxkey, project_id)
                    VALUES ($form->{id},
                           (SELECT c.id FROM chart c
-                           WHERE c.accno = '$accno'),
-                   $form->{fx}{$accno}{$transdate}, '$transdate', '0', '1')|;
-        $dbh->do($query) || $form->dberror($query);
+                           WHERE c.accno = ?),
+                   $form->{fx}{$accno}{$transdate}, '$transdate', '0', '1',
+                    (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|;
+        do_query($form, $dbh, $query, $accno, $accno, $project_id);
       }
     }
   }