145 lines
6.1 KiB
PHP
145 lines
6.1 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,
|
|
'eingangs_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,
|
|
'eingangs_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,
|
|
'eingangs_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'
|
|
);
|
|
}
|
|
}
|