Steuerkram/src/Models/Buchungsvorlage.php
fds2610-bot 3fe5015027 Feature: Buchungsvorlagen – Bankbuchung verknüpfen, Zahldatum, Standard-Lieferant
- Vorlagenbuchung verknüpft jetzt korrekt die Bankbuchung (bank_tx_id)
- Buchungs-Redirect bleibt nach Vorlagenbuchung auf dem Beleg
- Zahldatum (Wertstellung der Bankbuchung) im Vorlagendialog neben Belegdatum
- USt-Felder im Vorlagendialog als Text (nicht mehr als editierbare Inputs)
- Standard-Lieferant pro Vorlage speicherbar; wird im Buchungsdialog vorbelegt
- Migration 081: spalte standard_lieferant in buchungsvorlagen
2026-05-30 14:22:48 +02:00

132 lines
4.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Steuerkram\Models;
use Steuerkram\Database;
class Buchungsvorlage
{
public static function findAll(): array
{
return Database::fetchAll(
'SELECT * FROM buchungsvorlagen WHERE aktiv = 1 ORDER BY sort_order, name'
);
}
public static function findAllIncludingInactive(): array
{
return Database::fetchAll(
'SELECT * FROM buchungsvorlagen ORDER BY sort_order, name'
);
}
public static function find(int $id): array|false
{
return Database::fetchOne('SELECT * FROM buchungsvorlagen WHERE id = ?', [$id]);
}
public static function getFelder(int $vorlageId): array
{
return Database::fetchAll(
'SELECT * FROM buchungsvorlage_felder
WHERE vorlage_id = ?
ORDER BY gruppe_nr, sort_order',
[$vorlageId]
);
}
public static function getRegeln(int $vorlageId): array
{
$rows = Database::fetchAll(
'SELECT * FROM buchungsvorlage_regeln
WHERE vorlage_id = ?
ORDER BY sort_order',
[$vorlageId]
);
foreach ($rows as &$row) {
$row['buchungen'] = json_decode($row['buchungen'], true) ?? [];
}
return $rows;
}
public static function create(array $data): int
{
Database::execute(
'INSERT INTO buchungsvorlagen (name, beschreibung, standard_lieferant, aktiv, sort_order)
VALUES (?, ?, ?, ?, ?)',
[
trim($data['name']),
$data['beschreibung'] ?? null,
$data['standard_lieferant'] !== '' ? trim($data['standard_lieferant'] ?? '') : null,
isset($data['aktiv']) ? (int)$data['aktiv'] : 1,
(int)($data['sort_order'] ?? 0),
]
);
return (int)Database::lastInsertId();
}
public static function update(int $id, array $data): void
{
Database::execute(
'UPDATE buchungsvorlagen
SET name = ?, beschreibung = ?, standard_lieferant = ?, aktiv = ?, sort_order = ?
WHERE id = ?',
[
trim($data['name']),
$data['beschreibung'] ?? null,
$data['standard_lieferant'] !== '' ? trim($data['standard_lieferant'] ?? '') : null,
isset($data['aktiv']) ? (int)$data['aktiv'] : 1,
(int)($data['sort_order'] ?? 0),
$id,
]
);
}
public static function delete(int $id): void
{
Database::execute('DELETE FROM buchungsvorlagen WHERE id = ?', [$id]);
}
public static function saveFelderForVorlage(int $vorlageId, array $felder): void
{
Database::execute('DELETE FROM buchungsvorlage_felder WHERE vorlage_id = ?', [$vorlageId]);
foreach ($felder as $i => $f) {
Database::execute(
'INSERT INTO buchungsvorlage_felder
(vorlage_id, gruppe_nr, sort_order, feldname, label, typ, ust_satz, meta_key)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
[
$vorlageId,
(int)($f['gruppe_nr'] ?? 1),
(int)($f['sort_order'] ?? ($i * 10)),
trim($f['feldname']),
trim($f['label']),
$f['typ'],
isset($f['ust_satz']) && $f['ust_satz'] !== '' ? (float)$f['ust_satz'] : null,
$f['meta_key'] !== '' ? $f['meta_key'] : null,
]
);
}
}
public static function saveRegelnForVorlage(int $vorlageId, array $regeln): void
{
Database::execute('DELETE FROM buchungsvorlage_regeln WHERE vorlage_id = ?', [$vorlageId]);
foreach ($regeln as $i => $r) {
Database::execute(
'INSERT INTO buchungsvorlage_regeln
(vorlage_id, sort_order, bedingung_feld, bedingung_op, buchungen)
VALUES (?, ?, ?, ?, ?)',
[
$vorlageId,
(int)($r['sort_order'] ?? ($i * 10)),
trim($r['bedingung_feld']),
$r['bedingung_op'] ?? 'neq_zero',
json_encode($r['buchungen'] ?? []),
]
);
}
}
}