111 lines
4.9 KiB
PHP
111 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,
|
|
'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');
|
|
}
|
|
}
|