Steuerkram/tests/42_BuchungsvorlageTest.php
fds2610-bot f9b6a5d303 Feature: Buchungsvorlagen im Buchungsdialog
Neues Vorlagen-Badge zwischen Bank-Badge und Buchungsformular in
/belege/{id}. Vorlage auswählen öffnet modalen Dialog mit Feldgruppen
(Metadaten, USt-Zeilen mit Live-Berechnung, Zahlungskonto). Buchungen
werden per VorlageBuchungsService aus JSON-Regeln in der DB erstellt.
Pflege-UI unter /einstellungen/buchungsvorlagen (CRUD inkl. Felder und
Regeln). Initiale Vorlage "Essensbeleg n. abzugsfähig (nur USt.)" via
Migration 080 eingespielt. Test 42 prüft CRUD und Buchungsausführung.
2026-05-28 21:57:04 +02:00

120 lines
6.1 KiB
PHP

<?php
declare(strict_types=1);
class BuchungsvorlageTest extends TestCase
{
protected string $testName = 'Test 42: Buchungsvorlagen CRUD und Buchungsausführung';
public function run(): void
{
// ── Vorlage anlegen ──────────────────────────────────────────────
$vid = \Steuerkram\Models\Buchungsvorlage::create([
'name' => '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');
}
}