Steuerkram/tests/05_TaxSummenTest.php

159 lines
6.6 KiB
PHP
Raw 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)
$debitorId = $this->findAccountId('1400'); // Forderungen (Aktiv)
$erloesId = $this->findAccountId('8000'); // Erlöse 19 % (Ertrag)
$aufwandId = $this->findAccountId('4920'); // Bürobedarf (Aufwand)
$bankId = $this->findAccountId('1200'); // Bank (Aktiv)
// Fallback auf beliebige Konten der passenden Art
if (!$erloesId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Ertrag' AND aktiv = 1 LIMIT 1"
);
$erloesId = $row ? (int)$row['id'] : null;
}
if (!$aufwandId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Aufwand' AND aktiv = 1 LIMIT 1"
);
$aufwandId = $row ? (int)$row['id'] : null;
}
if (!$debitorId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Aktiv' AND aktiv = 1 LIMIT 1"
);
$debitorId = $row ? (int)$row['id'] : null;
}
if (!$bankId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Aktiv' AND aktiv = 1 AND id != ? LIMIT 1",
[$debitorId ?? 0]
);
$bankId = $row ? (int)$row['id'] : null;
}
if (!$debitorId || !$erloesId || !$aufwandId || !$bankId) {
$this->assert(false, 'Benötigte Konten nicht gefunden – SKR03-Seed vorhanden?');
return;
}
$this->assert(true, 'Alle benötigten Konten gefunden');
// ── Ausgangsbuchung (Ertrag, 19 %) ────────────────────────────────
// Debitor an Erlös 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,
'eingangs_datum' => $datum,
'belegtyp' => 'Ausgangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegAr,
'buchungs_datum' => $datum,
'soll_konto_id' => $debitorId,
'haben_konto_id' => $erloesId,
'betrag_netto' => 500.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test Ausgangsbuchung USt 19%',
]);
// ── Eingangsbuchung (Aufwand, 19 %) ───────────────────────────────
// Aufwand an Bank: 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,
'eingangs_datum' => $datum,
'belegtyp' => 'Eingangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegEr,
'buchungs_datum' => $datum,
'soll_konto_id' => $aufwandId,
'haben_konto_id' => $bankId,
'betrag_netto' => 200.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test Eingangsbuchung 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 Ausgangsbuchung ≥ 500 €'
);
// Kz 83: USt auf Umsätze 19% – abgeleitet (19% von Kz81-Betrag)
$this->assert(
(float)$kz['83']['steuer'] >= 95.00,
'UStVA Kz 83 (USt 19%): Steuerbetrag ≥ 95 €'
);
// Kz 61: Vorsteuer 19% – muss mindestens 38 € enthalten
$this->assert(
(float)$kz['61']['steuer'] >= 38.00,
'UStVA Kz 61 (Vorsteuer 19%): Steuerbetrag enthält Eingangsbuchung ≥ 38 €'
);
// Kz 66: Vorsteuer gesamt – muss ≥ Kz 61 sein
$this->assert(
(float)$kz['66']['steuer'] >= (float)$kz['61']['steuer'],
'UStVA Kz 66 (Vorsteuer gesamt): ≥ Kz 61'
);
// Kz 69 Berechnung: USt gesamt - Vorsteuer gesamt
$erwKz69 = round(
((float)$kz['83']['steuer'] + (float)$kz['84']['steuer']) - (float)$kz['66']['steuer'],
2
);
$this->assertEquals($erwKz69, (float)$kz['69']['steuer'], 'UStVA Kz 69 (Zahllast) korrekt berechnet');
// ── 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 € (Ausgangsbuchung eingeflossen)'
);
// Ausgaben müssen vorhanden sein
$this->assert(
(float)$euer['total_ausgaben'] >= 200.00,
'EÜR: Ausgaben ≥ 200 € (Eingangsbuchung 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');
}
}