diff --git a/Changes.md b/Changes.md index fe9ffe4..1b0a900 100644 --- a/Changes.md +++ b/Changes.md @@ -2,6 +2,13 @@ --- +## 2026-05-14 – Feature: UStVA Kz 81/89 auf volle Euro abgerundet + +- `UstvaCalculator`: Kz 81 und 89 werden mit `floor()` auf volle Euro abgerundet; USt wird auf dem gerundeten Wert berechnet +- Darstellung: Kz 81/89 zeigen "1.234,- €" statt "1.234,00 €" (in Tabelle und Zusammenfassung) +- USt-Felder (ust81, ust89) bleiben als Dezimalzahl unverändert +- Test 31: prüft floor-Verhalten für Kz 81 und 89 + ## 2026-05-14 – Refactor: UStVA auf 5-Kennzahlen-Schema vereinfacht - Migration 048: Kontenrahmen bereinigt – nur noch `ustva_kz` ∈ {81, 83, 61, 66} aktiv; 1571/1576 → 66, 1574 → 61, 1771/1774 → 83, alle anderen auf NULL diff --git a/docs/berechnungslogik.md b/docs/berechnungslogik.md index 4e3e4c4..a14acea 100644 --- a/docs/berechnungslogik.md +++ b/docs/berechnungslogik.md @@ -47,8 +47,8 @@ Diese Berechnung wird ausschließlich für **monatliche** Voranmeldungen unterst | Kz | Bezeichnung | Quelle | Berechnung | |---|---|---|---| -| **81** | Steuerpflichtige Umsätze zum Steuersatz von 19 % | Konto | `SUM(betrag_netto)` WHERE `ustva_kz='81'`, EU-Steuerarten ausgeschlossen | -| **89** | Steuerpfl. innergemeinschaftliche Erwerbe 19 % | Steuerart | `SUM(betrag_netto)` WHERE `steuerart='ig_erwerb_19'` | +| **81** | Steuerpflichtige Umsätze zum Steuersatz von 19 % | Konto | `floor(SUM(betrag_netto))` WHERE `ustva_kz='81'`, EU-Steuerarten ausgeschlossen – **auf volle Euro abgerundet (floor)** | +| **89** | Steuerpfl. innergemeinschaftliche Erwerbe 19 % | Steuerart | `floor(SUM(betrag_netto))` WHERE `steuerart='ig_erwerb_19'` – **auf volle Euro abgerundet (floor)** | | **66** | Gesamte Vorsteuerbeträge | Konto | `SUM(betrag_netto)` WHERE `ustva_kz='66'` (Konten 1571, 1576) | | **61** | Vorsteuerbeträge i.g. Erwerb | Konto | `SUM(betrag_netto)` WHERE `ustva_kz='61'` (Konto 1574) | | **83** | Vorauszahlung / Überschuss | abgeleitet | `(Summe ustva_kz='83') − Kz 66 − Kz 61` | @@ -57,8 +57,8 @@ Zusätzlich werden zwei **reine Anzeigefelder** berechnet (erscheinen im Bericht | Feld | Bezeichnung | Berechnung | |---|---|---| -| ust81 | Abzuführende USt aus Kz 81 (19 %) | `Kz 81 × 0,19` | -| ust89 | Abzuführende USt aus Kz 89 (19 %) | `Kz 89 × 0,19` | +| ust81 | Abzuführende USt aus Kz 81 (19 %) | `round(Kz 81 × 0,19, 2)` (Kz 81 ist bereits abgerundet) | +| ust89 | Abzuführende USt aus Kz 89 (19 %) | `round(Kz 89 × 0,19, 2)` (Kz 89 ist bereits abgerundet) | ### Datenquellen diff --git a/src/Services/UstvaCalculator.php b/src/Services/UstvaCalculator.php index 80e0adf..d147df6 100644 --- a/src/Services/UstvaCalculator.php +++ b/src/Services/UstvaCalculator.php @@ -75,7 +75,9 @@ class UstvaCalculator // ── 3. Kennzahlen zusammensetzen ───────────────────────────────────── $n = fn(string $kz): float => (float)($byKz[$kz] ?? 0.0); - $kz81 = $n('81'); + // Kz 81 und 89 werden laut UStVA auf volle Euro abgerundet + $kz81 = floor($n('81')); + $kz89 = floor($kz89); $kz66 = $n('66'); $kz61 = $n('61'); $kz83 = $n('83') - $kz66 - $kz61; @@ -83,13 +85,13 @@ class UstvaCalculator $ust89 = round($kz89 * 0.19, 2); return [ - '81' => ['name' => 'Steuerpflichtige Umsätze zum Steuersatz von 19 %', 'betrag' => round($kz81, 2), 'steuer' => null, 'xml' => true], - 'ust81' => ['name' => 'Abzuführende USt aus Kz 81 (19 %)', 'betrag' => null, 'steuer' => $ust81, 'xml' => false], - '89' => ['name' => 'Steuerpfl. innergemeinschaftliche Erwerbe 19 %', 'betrag' => round($kz89, 2), 'steuer' => null, 'xml' => true], - 'ust89' => ['name' => 'Abzuführende USt aus Kz 89 (19 %)', 'betrag' => null, 'steuer' => $ust89, 'xml' => false], - '66' => ['name' => 'Gesamte Vorsteuerbeträge', 'betrag' => null, 'steuer' => round($kz66, 2), 'xml' => true], - '61' => ['name' => 'Vorsteuerbeträge i.g. Erwerb', 'betrag' => null, 'steuer' => round($kz61, 2), 'xml' => true], - '83' => ['name' => 'Vorauszahlung / Überschuss', 'betrag' => null, 'steuer' => round($kz83, 2), 'xml' => true], + '81' => ['name' => 'Steuerpflichtige Umsätze zum Steuersatz von 19 %', 'betrag' => $kz81, 'steuer' => null, 'xml' => true, 'ganze_euro' => true], + 'ust81' => ['name' => 'Abzuführende USt aus Kz 81 (19 %)', 'betrag' => null, 'steuer' => $ust81, 'xml' => false, 'ganze_euro' => false], + '89' => ['name' => 'Steuerpfl. innergemeinschaftliche Erwerbe 19 %', 'betrag' => $kz89, 'steuer' => null, 'xml' => true, 'ganze_euro' => true], + 'ust89' => ['name' => 'Abzuführende USt aus Kz 89 (19 %)', 'betrag' => null, 'steuer' => $ust89, 'xml' => false, 'ganze_euro' => false], + '66' => ['name' => 'Gesamte Vorsteuerbeträge', 'betrag' => null, 'steuer' => round($kz66, 2), 'xml' => true, 'ganze_euro' => false], + '61' => ['name' => 'Vorsteuerbeträge i.g. Erwerb', 'betrag' => null, 'steuer' => round($kz61, 2), 'xml' => true, 'ganze_euro' => false], + '83' => ['name' => 'Vorauszahlung / Überschuss', 'betrag' => null, 'steuer' => round($kz83, 2), 'xml' => true, 'ganze_euro' => false], ]; } diff --git a/src/Views/tax/ustva_show.php b/src/Views/tax/ustva_show.php index 5bbb223..ed8c425 100644 --- a/src/Views/tax/ustva_show.php +++ b/src/Views/tax/ustva_show.php @@ -2,7 +2,8 @@ use Steuerkram\View; $h = fn($v) => View::h($v); $fmt = fn($v) => View::formatMoney($v); -$fmtKz = fn($v) => $v !== null ? number_format((float)$v, 2, ',', '.') . ' €' : '–'; +$fmtKz = fn($v) => $v !== null ? number_format((float)$v, 2, ',', '.') . ' €' : '–'; +$fmtKzGanz = fn($v) => $v !== null ? number_format((float)$v, 0, ',', '.') . ',- €' : '–'; ?>
| Umsatz 19 % (Kz 81) | -= $fmtKz($kz81val) ?> | += $fmtKzGanz($kz81val) ?> |
| ig. Erwerb 19 % (Kz 89) | -= $fmtKz($kz89val) ?> | += $fmtKzGanz($kz89val) ?> |