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.
120 lines
6.1 KiB
PHP
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');
|
|
}
|
|
}
|