Consolidation and extended test runs
[kivitendo-erp.git] / SL / IS.pm
index 88c015d..fde061d 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -966,9 +966,12 @@ SQL
     }
   }
 
-  $form->{amount}{ $form->{id} }{ $form->{AR} } = $netamount + $tax;
-  $form->{paid} =
-    $form->round_amount($form->{paid} * $form->{exchangerate} + $diff, 2);
+  # Invoice Summary includes Rounding
+  my $totalamount = $netamount + $tax;
+  my $rounding = $form->round_amount( $form->round_amount( $totalamount, 2, 1 ) - $totalamount, 2 );
+  my $rnd_accno = $rounding == 0 ? 0 : $rounding > 0 ? $form->{rndgain_accno} : $form->{rndloss_accno};
+  $form->{amount}{ $form->{id} }{ $form->{AR} } = $totalamount = $form->round_amount( $totalamount, 2, 1 );
+  $form->{paid} = $form->round_amount($form->{paid} * $form->{exchangerate} + $diff, 2);
 
   # reverse AR
   $form->{amount}{ $form->{id} }{ $form->{AR} } *= -1;
@@ -986,9 +989,7 @@ SQL
   foreach my $trans_id (keys %{ $form->{amount_cogs} }) {
     foreach my $accno (keys %{ $form->{amount_cogs}{$trans_id} }) {
       next unless ($form->{expense_inventory} =~ /\Q$accno\E/);
-
       $form->{amount_cogs}{$trans_id}{$accno} = $form->round_amount($form->{amount_cogs}{$trans_id}{$accno}, 2);
-
       if (!$payments_only && ($form->{amount_cogs}{$trans_id}{$accno} != 0)) {
         $query =
           qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link)
@@ -1001,7 +1002,6 @@ SQL
 
     foreach my $accno (keys %{ $form->{amount_cogs}{$trans_id} }) {
       $form->{amount_cogs}{$trans_id}{$accno} = $form->round_amount($form->{amount_cogs}{$trans_id}{$accno}, 2);
-
       if (!$payments_only && ($form->{amount_cogs}{$trans_id}{$accno} != 0)) {
         $query =
           qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link)
@@ -1015,9 +1015,7 @@ SQL
   foreach my $trans_id (keys %{ $form->{amount} }) {
     foreach my $accno (keys %{ $form->{amount}{$trans_id} }) {
       next unless ($form->{expense_inventory} =~ /\Q$accno\E/);
-
       $form->{amount}{$trans_id}{$accno} = $form->round_amount($form->{amount}{$trans_id}{$accno}, 2);
-
       if (!$payments_only && ($form->{amount}{$trans_id}{$accno} != 0)) {
         $query =
           qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link)
@@ -1043,10 +1041,8 @@ SQL
         $form->{amount}{$trans_id}{$accno} = 0;
       }
     }
-
     foreach my $accno (keys %{ $form->{amount}{$trans_id} }) {
       $form->{amount}{$trans_id}{$accno} = $form->round_amount($form->{amount}{$trans_id}{$accno}, 2);
-
       if (!$payments_only && ($form->{amount}{$trans_id}{$accno} != 0)) {
         $query =
           qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link)
@@ -1071,6 +1067,14 @@ SQL
         do_query($form, $dbh, $query, @values);
       }
     }
+    if (!$payments_only && ($rnd_accno != 0)) {
+      $query =
+        qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link)
+             VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT id FROM tax WHERE taxkey=0), 0, ?, (SELECT link FROM chart WHERE accno = ?))|;
+      @values = (conv_i($trans_id), $rnd_accno, $rounding, conv_date($form->{invdate}), conv_i($project_id), $rnd_accno);
+      do_query($form, $dbh, $query, @values);
+      $rnd_accno = 0;
+    }
   }
 
   # deduct payment differences from diff
@@ -1233,7 +1237,7 @@ SQL
     return;
   }
 
-  $amount = $netamount + $tax;
+  $amount = $form->round_amount( $netamount + $tax, 2, 1);
 
   # save AR record
   #erweiterung fuer lieferscheinnummer (donumber) 12.02.09 jb
@@ -1871,7 +1875,9 @@ sub retrieve_invoice {
          (SELECT c.accno FROM chart c WHERE d.income_accno_id = c.id)    AS income_accno,
          (SELECT c.accno FROM chart c WHERE d.expense_accno_id = c.id)   AS expense_accno,
          (SELECT c.accno FROM chart c WHERE d.fxgain_accno_id = c.id)    AS fxgain_accno,
-         (SELECT c.accno FROM chart c WHERE d.fxloss_accno_id = c.id)    AS fxloss_accno
+         (SELECT c.accno FROM chart c WHERE d.fxloss_accno_id = c.id)    AS fxloss_accno,
+         (SELECT c.accno FROM chart c WHERE d.rndgain_accno_id = c.id)   AS rndgain_accno,
+         (SELECT c.accno FROM chart c WHERE d.rndloss_accno_id = c.id)   AS rndloss_accno
          ${query_transdate}
        FROM defaults d|;
 
@@ -1892,6 +1898,7 @@ sub retrieve_invoice {
            a.shippingpoint, a.shipvia, a.notes, a.intnotes, a.taxzone_id,
            a.duedate, a.taxincluded, (SELECT cu.name FROM currencies cu WHERE cu.id=a.currency_id) AS currency, a.shipto_id, a.cp_id,
            a.employee_id, a.salesman_id, a.payment_id,
+           a.mtime, a.itime,
            a.language_id, a.delivery_customer_id, a.delivery_vendor_id, a.type,
            a.transaction_description, a.donumber, a.invnumber_for_credit_note,
            a.marge_total, a.marge_percent, a.direct_debit, a.delivery_term_id,
@@ -1903,6 +1910,8 @@ sub retrieve_invoice {
          WHERE a.id = ?|;
     $ref = selectfirst_hashref_query($form, $dbh, $query, $id);
     map { $form->{$_} = $ref->{$_} } keys %{ $ref };
+    $form->{mtime} = $form->{itime} if !$form->{mtime};
+    $form->{lastmtime} = $form->{mtime};
 
     $form->{exchangerate} = $form->get_exchangerate($dbh, $form->{currency}, $form->{invdate}, "buy");