findAccountId('4920'); // Bürobedarf (Aufwand) $bankId = $this->findAccountId('1200'); // Bank (Aktiv) if (!$aufwandId || !$bankId) { // Fallback: irgendein Aufwand- und Aktiv-Konto suchen $aufwandRow = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontenart = 'Aufwand' AND aktiv = 1 LIMIT 1" ); $bankRow = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontenart = 'Aktiv' AND aktiv = 1 LIMIT 1" ); $aufwandId = $aufwandRow ? (int)$aufwandRow['id'] : null; $bankId = $bankRow ? (int)$bankRow['id'] : null; } $this->assertNotEmpty($aufwandId, 'Aufwandskonto gefunden'); $this->assertNotEmpty($bankId, 'Aktiv-/Bankkonto gefunden'); if (!$aufwandId || !$bankId) { return; // Voraussetzungen nicht erfüllt, weitere Asserts wären sinnlos } // 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 $buchungId = \Steuerkram\Models\Booking::create([ 'beleg_id' => $belegId, 'buchungs_datum' => $datum, 'soll_konto_id' => $aufwandId, 'haben_konto_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'); // 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; // Vollständigkeit prüfen $this->assertNotEmpty($row['buchungs_nr'], 'Buchungsnummer im Journal vorhanden'); $this->assertNotEmpty($row['soll_nr'], 'Soll-Kontonummer im Journal vorhanden'); $this->assertNotEmpty($row['haben_nr'], 'Haben-Kontonummer im Journal vorhanden'); $this->assertNotEmpty($row['beleg_nr'], 'Belegnummer im Journal vorhanden'); 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'); } }