'Test-Vorlage Essensbeleg', 'beschreibung'=> 'Nur für Test', 'aktiv' => 1, 'sort_order' => 99, ]); $this->assertGreaterThan(0, $vid, 'Vorlage angelegt'); $vorlage = \Steuerkram\Models\Buchungsvorlage::find($vid); $this->assertNotEmpty($vorlage, 'Vorlage findbar'); $this->assertEquals('Test-Vorlage Essensbeleg', $vorlage['name'], 'Name korrekt'); // ── Felder speichern ───────────────────────────────────────────── \Steuerkram\Models\Buchungsvorlage::saveFelderForVorlage($vid, [ ['gruppe_nr' => 1, 'sort_order' => 10, 'feldname' => 'lieferant', 'label' => 'Lieferant', 'typ' => 'text', 'ust_satz' => '', 'meta_key' => 'supplier_name'], ['gruppe_nr' => 2, 'sort_order' => 10, 'feldname' => 'netto_7', 'label' => '7% USt.', 'typ' => 'ust_zeile','ust_satz' => '7','meta_key' => ''], ['gruppe_nr' => 3, 'sort_order' => 10, 'feldname' => 'zahlungskonto','label' => 'Zahlung', 'typ' => 'account_select','ust_satz'=>'','meta_key'=>''], ]); $felder = \Steuerkram\Models\Buchungsvorlage::getFelder($vid); $this->assertEquals(3, count($felder), '3 Felder gespeichert'); // ── Regeln speichern ───────────────────────────────────────────── \Steuerkram\Models\Buchungsvorlage::saveRegelnForVorlage($vid, [ [ 'sort_order' => 10, 'bedingung_feld' => 'netto_7', 'bedingung_op' => 'neq_zero', 'buchungen' => [ ['betrag_ref' => 'netto_7', 'nach_konto' => '4656'], ['betrag_ref' => 'ust_7', 'nach_konto' => '1571'], ], ], ]); $regeln = \Steuerkram\Models\Buchungsvorlage::getRegeln($vid); $this->assertEquals(1, count($regeln), '1 Regel gespeichert'); $this->assertEquals(2, count($regeln[0]['buchungen']), '2 Buchungen in Regel'); // ── Buchungen ausführen ────────────────────────────────────────── $bankId = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontonummer = '1200' LIMIT 1" ); $this->assertNotEmpty($bankId, 'Konto 1200 gefunden'); $belegNr = 'TEST-VL-' . uniqid(); $belegId = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => $belegNr, 'filename' => 'test-essensbeleg.pdf', 'storage_path' => 'static/uploads/test/test-essensbeleg.pdf', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', $belegNr), 'beleg_datum' => date('Y-m-d'), 'belegtyp' => 'Eingangsrechnung', ]); $this->assertGreaterThan(0, $belegId, 'Beleg für Vorlage-Test angelegt'); $svc = new \Steuerkram\Services\VorlageBuchungsService(); $ids = $svc->buchen($belegId, $vid, [ 'netto_7' => '10.00', 'ust_7' => '0.70', 'brutto_7' => '10.70', 'zahlungskonto_id' => (int)$bankId['id'], 'lieferant' => 'Test-Restaurant', 'belegdatum' => date('Y-m-d'), ], date('Y-m-d')); $this->assertEquals(2, count($ids), '2 Buchungszeilen erzeugt (Netto + USt)'); $bookings = \Steuerkram\Models\Booking::forBeleg($belegId); $this->assertEquals(2, count($bookings), '2 Buchungen am Beleg abrufbar'); $kontonummern = array_column($bookings, 'kategorie_nr'); sort($kontonummern); $this->assertEquals(['1571', '4656'], $kontonummern, 'Buchungen auf Konten 1571 und 4656'); // ── Bedingung neq_zero: netto_7 = 0 → keine Buchungen ─────────── $belegNr2 = 'TEST-VL2-' . uniqid(); $belegId2 = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => $belegNr2, 'filename' => 'test2.pdf', 'storage_path' => 'static/uploads/test/test2.pdf', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', $belegNr2), 'beleg_datum' => date('Y-m-d'), 'belegtyp' => 'Eingangsrechnung', ]); $ids2 = $svc->buchen($belegId2, $vid, [ 'netto_7' => '0', 'ust_7' => '0', 'zahlungskonto_id' => (int)$bankId['id'], ], date('Y-m-d')); $this->assertEquals(0, count($ids2), 'Keine Buchungen wenn Betrag = 0'); // ── findAll / findAllIncludingInactive ──────────────────────────── $alle = \Steuerkram\Models\Buchungsvorlage::findAll(); $gefunden = array_filter($alle, fn($v) => $v['id'] === $vid); $this->assertNotEmpty($gefunden, 'findAll enthält neue Vorlage'); // ── Update ──────────────────────────────────────────────────────── \Steuerkram\Models\Buchungsvorlage::update($vid, [ 'name' => 'Test-Vorlage Geändert', 'aktiv' => 1, 'sort_order' => 99, ]); $aktualisiert = \Steuerkram\Models\Buchungsvorlage::find($vid); $this->assertEquals('Test-Vorlage Geändert', $aktualisiert['name'], 'Name aktualisiert'); } }