Steuerkram/tests/15_NichtAbzugsfaehigEuerTest.php

142 lines
5.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* Test 15: Nicht abzugsfähige Betriebsausgaben (KZ 165) in der EÜR.
*
* Buchungen auf Konten mit euer_zeile='51' (z.B. 4654, 4656) dürfen nicht
* in total_ausgaben oder gewinn einfließen, sondern erscheinen nur im
* separaten Abschnitt 'nicht_abzugsfaehig'.
*/
class NichtAbzugsfaehigEuerTest extends TestCase
{
protected string $testName = 'Test 15: Nicht abzugsfähige Kosten (KZ 165) in EÜR';
public function run(): void
{
$datum = date('Y-m-d');
$bankId = $this->findAccountId('1200');
$erloesId = $this->findAccountId('8400'); // Erlöse 19% USt
$konto4654Id = $this->findAccountId('4654');
$konto4600Id = $this->findAccountId('4600'); // normale Betriebsausgabe
if (!$bankId || !$erloesId || !$konto4654Id || !$konto4600Id) {
$this->assert(false, 'Benötigte Konten (1200, 8400, 4654, 4600) nicht gefunden');
return;
}
// Prüfen, dass 4654 wirklich euer_zeile='51' hat
$kto = \Steuerkram\Database::fetchOne(
"SELECT euer_zeile FROM accounts WHERE kontonummer = '4654'"
);
$this->assertEquals('51', $kto['euer_zeile'] ?? null, 'Konto 4654 hat euer_zeile=51');
// Einnahme buchen (Referenz für Gewinnberechnung)
$belegEin = \Steuerkram\Models\Beleg::create([
'beleg_nr' => 'TEST-KZ165-EIN-' . uniqid(),
'filename' => 'test.pdf',
'storage_path' => '',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', 'kz165ein' . uniqid()),
'beleg_datum' => $datum,
'belegtyp' => 'Ausgangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegEin,
'buchungs_datum' => $datum,
'buchungstyp' => 'Einnahme',
'kategorie_konto_id' => $erloesId,
'zahlungskonto_id' => $bankId,
'betrag_netto' => 1000.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test Einnahme KZ165',
]);
// Normale Betriebsausgabe (soll in ausgaben erscheinen)
$belegAus = \Steuerkram\Models\Beleg::create([
'beleg_nr' => 'TEST-KZ165-AUS-' . uniqid(),
'filename' => 'test2.pdf',
'storage_path' => '',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', 'kz165aus' . uniqid()),
'beleg_datum' => $datum,
'belegtyp' => 'Eingangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegAus,
'buchungs_datum' => $datum,
'buchungstyp' => 'Ausgabe',
'kategorie_konto_id' => $konto4600Id,
'zahlungskonto_id' => $bankId,
'betrag_netto' => 200.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test normale Ausgabe KZ165',
]);
// Nicht abzugsfähige Bewirtungskosten (soll in nicht_abzugsfaehig erscheinen)
$belegNa = \Steuerkram\Models\Beleg::create([
'beleg_nr' => 'TEST-KZ165-NA-' . uniqid(),
'filename' => 'test3.pdf',
'storage_path' => '',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', 'kz165na' . uniqid()),
'beleg_datum' => $datum,
'belegtyp' => 'Eingangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegNa,
'buchungs_datum' => $datum,
'buchungstyp' => 'Ausgabe',
'kategorie_konto_id' => $konto4654Id,
'zahlungskonto_id' => $bankId,
'betrag_netto' => 30.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test nicht abzugsfähige Kosten',
]);
$euer = (new \Steuerkram\Services\EuerCalculator())->calculate((int)date('Y'));
// 4654-Buchung muss in nicht_abzugsfaehig auftauchen
$naKonten = array_column($euer['nicht_abzugsfaehig'], 'kontonummer');
$this->assert(
in_array('4654', $naKonten),
'Konto 4654 erscheint in nicht_abzugsfaehig'
);
// 4654-Buchung darf NICHT in ausgaben sein
$ausKonten = array_column($euer['ausgaben'], 'kontonummer');
$this->assert(
!in_array('4654', $ausKonten),
'Konto 4654 erscheint NICHT in ausgaben'
);
// total_nicht_abzugsfaehig enthält den Betrag
$this->assertGreaterThan(0, (float)$euer['total_nicht_abzugsfaehig'], 'total_nicht_abzugsfaehig > 0');
// total_ausgaben enthält die 200 € normale Ausgabe, NICHT die 30 € nicht abzugsfähige
// (Es könnten weitere Buchungen aus anderen Tests vorhanden sein, daher nur prüfen
// dass total_ausgaben keine 30 € mehr enthält als ohne die 4654-Buchung)
$this->assert(
(float)$euer['total_nicht_abzugsfaehig'] >= 30.0,
'total_nicht_abzugsfaehig enthält mindestens 30 €'
);
// Gewinn = Einnahmen - normale Ausgaben (nicht abzugsfähige zählen nicht)
$erwartetGewinn = round(
(float)$euer['total_einnahmen'] - (float)$euer['total_ausgaben'],
2
);
$this->assertEquals($erwartetGewinn, (float)$euer['gewinn'], 'Gewinn = Einnahmen - normale Ausgaben');
// Die nicht abzugsfähigen Kosten sind im Gewinn nicht enthalten
$gewinnOhneNa = round(
(float)$euer['total_einnahmen'] - (float)$euer['total_ausgaben'] - (float)$euer['total_nicht_abzugsfaehig'],
2
);
$this->assert(
(float)$euer['gewinn'] > $gewinnOhneNa || (float)$euer['total_nicht_abzugsfaehig'] > 0,
'Nicht abzugsfähige Kosten reduzieren den Gewinn nicht'
);
}
}