110 lines
4.7 KiB
PHP
110 lines
4.7 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
|
|
$aufwandId = $this->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');
|
|
}
|
|
}
|