Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 0e68056c

Von Kivitendo Admin vor etwa 10 Jahren hinzugefügt

  • ID 0e68056cbc17b531266c16454f3a74ae1e57dea6
  • Vorgänger 71233175
  • Nachfolger 3270e883

Rundung bei Debitorenbuchung, Kreditorenbuchung und Dialogbuchung

Zwei neue Hilfsfunktionen für Form eingeführt die von ap/ar/gl genutzt
werden:

  • calculate_tax wird zur Berechnung der Steuer bei
    • update in ar, ap und gl
    • post_transaction in AR.pm und AP.pm innerhalb von calculate_arap
  • calculate_arap berechnet netamount, amount und totaltax anhand einer
    vorhandenen $form in ar/ap, und formatiert und rundet die amount_$i and
    tax_$i in der $form.

Das Ziel war es, daß diese drei Belege mit den gleichen Formeln zur
Steuerberechnung bei Steuer inkl./exkl. arbeiten. Ein Vorteil im
Vergleich zur Einkaufs- und Verkaufsrechnung ist, daß es hier keine
Positionen/Mengen/Rabatte/etc gibt, sondern direkt Werte auf Konten
bebucht werden, man muß nur Währungskurse berücksichtigen und beim
Schreiben in die Datenbank auf die Vorzeichen achten. Einkaufs- und
Verkaufsrechnungen werden hiervon nicht beeinflußt.

Vor allem bei der Einstellung "MwSt. inkl" wird die Steuer nun immer auf
zwei Stellen gerundet in die Datenbank geschrieben, und nicht (wie
bisher in manchen Fällen) mit 5 Nachkommastellen, was zu mehreren Bugs
geführt hat.

Es gibt einen neuen Test t/form/arap.t der die Berechnungen dieser
beiden Funktionen testet, nicht aber das eigentliche Buchen der Belege.

Mit diesem Commit sollten für zukünftige Buchungen folgende Bugs behoben
sein:

1691 - Rundung bei Berichten bei Buchungen mit MwSt inkl.
2029 - Rundungsfehler bei Dialogbuchung
2033 - Unterschiede in Rundungen durch taxincluded
2094 - Rundungsprobleme in Kreditorenbuchungen: Cent "kippt" bei Zahlungseinbuchung
2435 - Rundungsfehler in Kreditorenbuchungen (Netto vs. Brutto)

Dieser Commit greift in die Eingeweide von Uraltcode ein, wo die
diversen Stellen alle mal mit copy&paste entstanden und dann langsam
divergiert sind, hat also hohes Fehlerpotential. Es lohnt sich, den
DATEV-Check anzuschalten.

Unterschiede anzeigen:

SL/AP.pm
55 55
  my $exchangerate = 0;
56 56

  
57 57
  $form->{defaultcurrency} = $form->get_default_currency($myconfig);
58
  $form->{taxincluded} = 0 unless $form->{taxincluded};
58 59

  
59 60
  ($null, $form->{department_id}) = split(/--/, $form->{department});
60 61

  
......
69 70
    $form->{AP_amounts}{"amount_$i"} =
70 71
      (split(/--/, $form->{"AP_amount_$i"}))[0];
71 72
  }
73

  
72 74
  ($form->{AP_amounts}{payables}) = split(/--/, $form->{APselected});
73 75
  ($form->{AP_payables})          = split(/--/, $form->{APselected});
74 76

  
75
  # reverse and parse amounts
76
  for my $i (1 .. $form->{rowcount}) {
77
    $form->{"amount_$i"} =
78
      $form->round_amount(
79
                         $form->parse_amount($myconfig, $form->{"amount_$i"}) *
80
                           $form->{exchangerate} * -1,
81
                         2);
82
    $amount += ($form->{"amount_$i"} * -1);
83

  
84
    # parse tax_$i for later
85
    $form->{"tax_$i"} = $form->parse_amount($myconfig, $form->{"tax_$i"}) * -1;
86
  }
87

  
88
  # this is for ap
89
  $form->{amount} = $amount;
90

  
91
  # taxincluded doesn't make sense if there is no amount
92
  $form->{taxincluded} = 0 if ($form->{amount} == 0);
93

  
94
  for my $i (1 .. $form->{rowcount}) {
95
    ($form->{"tax_id_$i"}, undef) = split /--/, $form->{"taxchart_$i"};
96

  
97
    my $query =
98
      qq|SELECT c.accno, t.taxkey, t.rate | .
99
      qq|FROM tax t LEFT JOIN chart c on (c.id=t.chart_id) | .
100
      qq|WHERE t.id = ? | .
101
      qq|ORDER BY c.accno|;
102
    my $sth = $dbh->prepare($query);
103
    $sth->execute($form->{"tax_id_$i"}) || $form->dberror($query . " (" . $form->{"tax_id_$i"} . ")");
104
    ($form->{AP_amounts}{"tax_$i"}, $form->{"taxkey_$i"}, $form->{"taxrate_$i"}) = $sth->fetchrow_array();
105

  
106
    $sth->finish;
107

  
108
    my ($tax, $diff);
109
    if ($form->{taxincluded} *= 1) {
110
      $tax = $form->{"amount_$i"} - ($form->{"amount_$i"} / ($form->{"taxrate_$i"} + 1));
111
      $amount = $form->{"amount_$i"} - $tax;
112
      $form->{"amount_$i"} = $form->round_amount($amount, 2);
113
      $diff += $amount - $form->{"amount_$i"};
114
      $form->{"tax_$i"} = $form->round_amount($tax, 2);
115
      $form->{netamount} += $form->{"amount_$i"};
116
    } else {
117
      $form->{"tax_$i"} = $form->{"amount_$i"} * $form->{"taxrate_$i"};
118
      $form->{netamount} += $form->{"amount_$i"};
119
    }
120
    $form->{total_tax} += $form->{"tax_$i"} * -1;
121
  }
77
  # calculate the totals while calculating and reformatting the $amount_$i and $tax_$i
78
  ($form->{netamount},$form->{total_tax},$form->{invtotal}) = $form->calculate_arap('buy',$form->{taxincluded}, $form->{exchangerate});
122 79

  
123 80
  # adjust paidaccounts if there is no date in the last row
124 81
  $form->{paidaccounts}-- unless ($form->{"datepaid_$form->{paidaccounts}"});
125 82

  
126 83
  $form->{invpaid} = 0;
127
  $form->{netamount} *= -1;
128 84

  
129 85
  # add payments
130 86
  for my $i (1 .. $form->{paidaccounts}) {
......
140 96
  $form->{invpaid} =
141 97
    $form->round_amount($form->{invpaid} * $form->{exchangerate}, 2);
142 98

  
143
  # store invoice total, this goes into ap table
144
  $form->{invtotal} = $form->{netamount} + $form->{total_tax};
99
  # # store invoice total, this goes into ap table
100
  # $form->{invtotal} = $form->{netamount} + $form->{total_tax};
145 101

  
146 102
  # amount for total AP
147 103
  $form->{payables} = $form->{invtotal};

Auch abrufbar als: Unified diff