Steuerkram/tests/02_BelegBuchungTest.php
fds2610 fb579c585c Fix #5: Buchungsmodell von Soll/Haben auf reines EÜR-System umgestellt
Schema: bookings mit buchungstyp (Einnahme/Ausgabe), kategorie_konto_id,
zahlungskonto_id statt soll_konto_id/haben_konto_id. Kontenarten umbenannt
(Ertrag→Betriebseinnahme, Aufwand→Betriebsausgabe, Aktiv→Zahlungskonto,
Passiv→Verbindlichkeit, Neutral→Privat). UI, Services, Controller, Tests
vollständig auf EÜR-Terminologie umgestellt. Alle 78 Tests bestanden.
2026-03-26 10:53:59 +01:00

112 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* Test 2: Beleg buchen und Buchung im Buchungsjournal prüfen.
*
* Erstellt einen Beleg und eine zugehörige Buchung, dann wird geprüft,
* ob die Buchung in Booking::journal() und Booking::forBeleg() auffindbar ist.
*/
class BelegBuchungTest extends TestCase
{
protected string $testName = 'Test 2: Beleg buchen → Buchungsjournal';
public function run(): void
{
// Konten aus der SKR03-Seed-Datei abrufen
$ausgabeId = $this->findAccountId('4920'); // Bürobedarf (Betriebsausgabe)
$bankId = $this->findAccountId('1200'); // Bank (Zahlungskonto)
if (!$ausgabeId || !$bankId) {
// Fallback: irgendein Betriebsausgabe- und Zahlungskonto suchen
$ausgabeRow = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Betriebsausgabe' AND aktiv = 1 LIMIT 1"
);
$bankRow = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Zahlungskonto' AND aktiv = 1 LIMIT 1"
);
$ausgabeId = $ausgabeRow ? (int)$ausgabeRow['id'] : null;
$bankId = $bankRow ? (int)$bankRow['id'] : null;
}
$this->assertNotEmpty($ausgabeId, 'Betriebsausgabe-Konto gefunden');
$this->assertNotEmpty($bankId, 'Zahlungskonto gefunden');
if (!$ausgabeId || !$bankId) {
return;
}
// Beleg anlegen
$belegNr = 'TEST-' . uniqid();
$datum = date('Y-m-d');
$belegId = \Steuerkram\Models\Beleg::create([
'beleg_nr' => $belegNr,
'filename' => 'eingangsrechnung-test.pdf',
'storage_path' => 'static/uploads/test/eingangsrechnung-test.pdf',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', $belegNr . 'buch'),
'beleg_datum' => $datum,
'eingangs_datum' => $datum,
'rechnungs_nr' => 'RE-BUCH-001',
'betrag_brutto' => 59.50,
'belegtyp' => 'Eingangsrechnung',
]);
$this->assertGreaterThan(0, $belegId, 'Beleg für Buchungstest angelegt');
// Buchung erstellen (EÜR: Ausgabe mit Kategorie + Zahlungskonto)
$buchungId = \Steuerkram\Models\Booking::create([
'beleg_id' => $belegId,
'buchungs_datum' => $datum,
'buchungstyp' => 'Ausgabe',
'kategorie_konto_id' => $ausgabeId,
'zahlungskonto_id' => $bankId,
'betrag_netto' => 50.00,
'ust_satz' => 19.0,
'buchungstext' => 'Testbuchung Bürobedarf',
]);
$this->assertGreaterThan(0, $buchungId, 'Buchung wurde angelegt (ID > 0)');
// Buchung via Booking::find() abrufbar
$buchung = \Steuerkram\Models\Booking::find($buchungId);
$this->assertNotEmpty($buchung, 'Booking::find() liefert die Buchung');
$this->assertEquals(50.00, (float)($buchung['betrag_netto'] ?? 0), 'Nettobetrag korrekt');
$this->assertEquals(19.0, (float)($buchung['ust_satz'] ?? 0), 'USt-Satz korrekt');
$this->assertEquals('Ausgabe', $buchung['buchungstyp'] ?? '', 'Buchungstyp ist Ausgabe');
// Buchung via Booking::forBeleg() abrufbar
$buchungen = \Steuerkram\Models\Booking::forBeleg($belegId);
$this->assertGreaterThan(0, count($buchungen), 'Booking::forBeleg() liefert Buchungen');
$foundInBeleg = false;
foreach ($buchungen as $bk) {
if ((int)$bk['id'] === $buchungId) {
$foundInBeleg = true;
break;
}
}
$this->assert($foundInBeleg, 'Buchung erscheint in Booking::forBeleg()');
// Buchung im Journal
$year = (int)date('Y');
$month = (int)date('n');
$journal = \Steuerkram\Models\Booking::journal(['year' => $year, 'month' => $month], 1, 999);
$foundInJournal = false;
foreach ($journal['rows'] as $row) {
if ((int)$row['id'] === $buchungId) {
$foundInJournal = true;
$this->assertNotEmpty($row['buchungs_nr'], 'Buchungsnummer im Journal vorhanden');
$this->assertNotEmpty($row['kategorie_nr'], 'Kategorie-Kontonummer im Journal vorhanden');
$this->assertNotEmpty($row['zahlungs_nr'], 'Zahlungskonto-Nr. im Journal vorhanden');
$this->assertNotEmpty($row['beleg_nr'], 'Belegnummer im Journal vorhanden');
$this->assertEquals('Ausgabe', $row['buchungstyp'], 'Buchungstyp im Journal korrekt');
break;
}
}
$this->assert($foundInJournal, 'Buchung erscheint vollständig im Buchungsjournal');
// Beleg ist jetzt als gebucht markiert
$belegNeu = \Steuerkram\Models\Beleg::find($belegId);
$this->assertEquals(1, (int)($belegNeu['booked'] ?? 0), 'Beleg ist als gebucht markiert');
}
}