assertNotEmpty($vorlage, 'Seed-Vorlage "Essensbeleg n. abzugsfähig (nur USt.)" vorhanden'); $vid = (int)$vorlage['id']; // ── Feld netto_0 mit 0% USt. vorhanden ────────────────────────────── $felder = \Steuerkram\Models\Buchungsvorlage::getFelder($vid); $feldNamen = array_column($felder, 'feldname'); $this->assert(in_array('netto_0', $feldNamen, true), 'Feld netto_0 (0% USt.) ist Teil der Vorlage'); $feldNull = current(array_filter($felder, fn($f) => $f['feldname'] === 'netto_0')); $this->assertEquals('ust_zeile', $feldNull['typ'], 'netto_0 ist eine ust_zeile'); $this->assertEquals(0.0, (float)$feldNull['ust_satz'], 'netto_0 hat 0% USt.-Satz'); // ── Regel für netto_0 bucht auf Konto 4657 ────────────────────────── $regeln = \Steuerkram\Models\Buchungsvorlage::getRegeln($vid); $regelNull = current(array_filter($regeln, fn($r) => $r['bedingung_feld'] === 'netto_0')); $this->assertNotEmpty($regelNull, 'Regel für netto_0 vorhanden'); $this->assertEquals('4657', $regelNull['buchungen'][0]['nach_konto'], 'netto_0 bucht auf Konto 4657 (ohne Vorsteuer)'); // ── Buchungsausführung mit allen drei Zeilen (7%, 19%, 0%) ───────── $bankId = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontonummer = '1200' LIMIT 1" ); $this->assertNotEmpty($bankId, 'Konto 1200 gefunden'); $belegNr = 'TEST-ESS-' . uniqid(); $belegId = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => $belegNr, 'filename' => 'test-essensbeleg-trinkgeld.pdf', 'storage_path' => 'static/uploads/test/test-essensbeleg-trinkgeld.pdf', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', $belegNr), 'beleg_datum' => date('Y-m-d'), 'belegtyp' => 'Eingangsrechnung', ]); $this->assertGreaterThan(0, $belegId, 'Beleg angelegt'); $svc = new \Steuerkram\Services\VorlageBuchungsService(); $ids = $svc->buchen($belegId, $vid, [ 'netto_7' => '10.00', 'ust_7' => '0.70', 'netto_19' => '20.00', 'ust_19' => '3.80', 'netto_0' => '5.00', 'zahlungskonto_id' => (int)$bankId['id'], 'lieferant' => 'Test-Restaurant', 'belegdatum' => date('Y-m-d'), ], date('Y-m-d')); $this->assertEquals(5, count($ids), '5 Buchungszeilen erzeugt (2x Netto+USt, 1x Trinkgeld ohne USt.)'); $bookings = \Steuerkram\Models\Booking::forBeleg($belegId); $kontonummern = array_column($bookings, 'kategorie_nr'); sort($kontonummern); $this->assertEquals(['1571', '1576', '4654', '4656', '4657'], $kontonummern, 'Buchungen auf Konten 1571, 1576, 4654, 4656 und 4657'); $trinkgeldBuchung = current(array_filter($bookings, fn($b) => $b['kategorie_nr'] === '4657')); $this->assertEquals(5.0, (float)$trinkgeldBuchung['betrag_netto'], 'Trinkgeld-Betrag korrekt gebucht'); } }