159 lines
6.6 KiB
PHP
159 lines
6.6 KiB
PHP
<?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');
|
||
}
|
||
}
|