Steuerkram/tests/05_TaxSummenTest.php

146 lines
6.2 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
/**
* Test 5: Buchungen in UStVA und EÜR.
*
* Erstellt Buchungen mit bekannten Beträgen und prüft, ob
* UstvaCalculator und EuerCalculator die Werte korrekt summieren.
*/
class TaxSummenTest extends TestCase
{
protected string $testName = 'Test 5: Buchungen in UStVA und EÜR';
public function run(): void
{
$year = (int)date('Y');
$month = (int)date('n');
$datum = date('Y-m-d');
// Benötigte Konten (SKR03)
$zahlungsId = $this->findAccountId('1200'); // Bank (Zahlungskonto)
$erloesId = $this->findAccountId('8400'); // Erlöse 19 % USt (Betriebseinnahme, kz=81)
$ausgabeId = $this->findAccountId('4920'); // Bürobedarf (Betriebsausgabe)
$bankId = $this->findAccountId('1200'); // Bank (Zahlungskonto)
// Fallback: explizit ein Konto mit ustva_kz=81 suchen, damit kz81/83 befüllt werden
if (!$erloesId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Betriebseinnahme' AND ustva_kz = '81' AND aktiv = 1 LIMIT 1"
);
$erloesId = $row ? (int)$row['id'] : null;
}
if (!$ausgabeId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Betriebsausgabe' AND aktiv = 1 LIMIT 1"
);
$ausgabeId = $row ? (int)$row['id'] : null;
}
if (!$zahlungsId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Zahlungskonto' AND aktiv = 1 LIMIT 1"
);
$zahlungsId = $row ? (int)$row['id'] : null;
}
if (!$bankId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Zahlungskonto' AND aktiv = 1 AND id != ? LIMIT 1",
[$zahlungsId ?? 0]
);
$bankId = $row ? (int)$row['id'] : null;
}
if (!$zahlungsId || !$erloesId || !$ausgabeId || !$bankId) {
$this->assert(false, 'Benötigte Konten nicht gefunden – SKR03-Seed vorhanden?');
return;
}
$this->assert(true, 'Alle benötigten Konten gefunden');
// ── Einnahme-Buchung (19 %) ─────────────────────────────────
// Erlöse 19%: Netto=500, USt=95, Brutto=595
$belegAr = \Steuerkram\Models\Beleg::create([
'beleg_nr' => 'TEST-AR-' . uniqid(),
'filename' => 'test-ar.pdf',
'storage_path' => '',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', 'test-ar'),
'beleg_datum' => $datum,
'belegtyp' => 'Ausgangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegAr,
'buchungs_datum' => $datum,
'buchungstyp' => 'Einnahme',
'kategorie_konto_id' => $erloesId,
'zahlungskonto_id' => $zahlungsId,
'betrag_netto' => 500.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test Einnahme USt 19%',
]);
// ── Ausgabe-Buchung (19 %) ──────────────────────────────────
// Bürobedarf: Netto=200, USt=38, Brutto=238
$belegEr = \Steuerkram\Models\Beleg::create([
'beleg_nr' => 'TEST-ER-' . uniqid(),
'filename' => 'test-er.pdf',
'storage_path' => 'static/uploads/test/test-er.pdf',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', 'test-er'),
'beleg_datum' => $datum,
'belegtyp' => 'Eingangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegEr,
'buchungs_datum' => $datum,
'buchungstyp' => 'Ausgabe',
'kategorie_konto_id' => $ausgabeId,
'zahlungskonto_id' => $bankId,
'betrag_netto' => 200.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test Ausgabe USt 19%',
]);
// ── UStVA prüfen ──────────────────────────────────────────────────
$calc = new \Steuerkram\Services\UstvaCalculator();
$kz = $calc->calculate($year, $month);
// Kz 81: Steuerpfl. Umsätze 19% – muss mindestens 500 € enthalten
$this->assert(
(float)$kz['81']['betrag'] >= 500.00,
'UStVA Kz 81 (Umsätze 19%): Betrag enthält Einnahme ≥ 500 €'
);
// Kz 66: Vorsteuer gesamt (1571+1576) – muss mindestens 38 € enthalten
$this->assert(
(float)$kz['66']['steuer'] >= 38.00,
'UStVA Kz 66 (Vorsteuer gesamt): Steuerbetrag enthält Ausgabe ≥ 38 €'
);
// Kz 83: Vorauszahlung = (USt-Konten) - Kz66 - Kz61
$this->assert(
isset($kz['83']['steuer']),
'UStVA Kz 83 (Vorauszahlung/Überschuss) vorhanden'
);
// ── EÜR prüfen ────────────────────────────────────────────────────
$euerCalc = new \Steuerkram\Services\EuerCalculator();
$euer = $euerCalc->calculate($year);
// Einnahmen müssen vorhanden sein
$this->assert(
(float)$euer['total_einnahmen'] >= 500.00,
'EÜR: Einnahmen ≥ 500 € (Einnahme-Buchung eingeflossen)'
);
// Ausgaben müssen vorhanden sein
$this->assert(
(float)$euer['total_ausgaben'] >= 200.00,
'EÜR: Ausgaben ≥ 200 € (Ausgabe-Buchung eingeflossen)'
);
// Gewinn = Einnahmen - Ausgaben
$erwGewinn = round((float)$euer['total_einnahmen'] - (float)$euer['total_ausgaben'], 2);
$this->assertEquals($erwGewinn, (float)$euer['gewinn'], 'EÜR: Gewinn = Einnahmen - Ausgaben');
}
}