$konto */ /** @var list> $zeilen */ /** @var int $gesamt */ /** @var int $seite */ /** @var int $seiten */ /** @var array $filter */ /** @var list> $kategorien */ /** @var list> $klassen */ /** @var list> $konten */ /** @var array>> $splits */ /** @var bool $bargeld Ist ein Bargeld-Tool eingerichtet? */ $kategorieNamen = []; foreach ($kategorien as $k) { $kategorieNamen[(int)$k['id']] = $k['pfad']; } $klassenNamen = []; foreach ($klassen as $k) { $klassenNamen[(int)$k['id']] = $k['name']; } $kontenNamen = array_column($konten, 'name', 'id'); $eigenesKonto = (int)$konto['id']; $gefiltert = ($filter['suche'] ?? '') !== '' || !empty($filter['von']) || !empty($filter['bis']) || !empty($filter['kategorie_id']) || !empty($filter['klasse_id']) || !empty($filter['nur_offene']); $seitenPfad = static function (int $nr) use ($filter): string { $p = array_filter([ 'suche' => $filter['suche'] ?? '', 'von' => $filter['von'] ?? '', 'bis' => $filter['bis'] ?? '', 'kategorie_id' => $filter['kategorie_id'] ?? '', 'klasse_id' => $filter['klasse_id'] ?? '', 'nur_offene' => !empty($filter['nur_offene']) ? '1' : '', 'seite' => (string)$nr, ], static fn(string $v): bool => $v !== ''); return '?' . http_build_query($p); }; // Nach dem Löschen soll dieselbe Ansicht wieder erscheinen – Filter und Seite // hängen deshalb am Ziel des Löschformulars. Dasselbe gilt für die // Schnellzuordnung: Ihre Ziele setzt kontoblatt.js aus dieser Abfrage zusammen. $abfrage = $seitenPfad($seite); $loeschZiel = '/konten/' . (int)$konto['id'] . '/buchungen/loeschen' . $abfrage; $verknuepfenZiel = '/konten/' . (int)$konto['id'] . '/buchungen/verknuepfen' . $abfrage; /** * Die Zuordnung einer Zeile als Wert der gemeinsamen Auswahlliste – dieselben * Präfixe wie in der Buchungsmaske. */ $zuordnungswert = static function (array $zeile): string { if ((int)($zeile['gesplittet'] ?? 0) === 1) { return 'split'; } if (!empty($zeile['gegenkonto_id'])) { return 'konto:' . (int)$zeile['gegenkonto_id']; } if (!empty($zeile['kategorie_id'])) { return 'kategorie:' . (int)$zeile['kategorie_id']; } return ''; }; /** * Die Splitzeilen einer Buchung, wie der Dialog sie braucht. Sie hängen als * JSON an der Zelle statt nachgeladen zu werden: Es sind die Zeilen der wenigen * aufgeteilten Buchungen dieser Seite, und ein zweiter Weg zu denselben Daten * wäre auch ein zweiter Weg, sie falsch zu lesen. * * @param list> $splitzeilen */ $splitdaten = static function (array $splitzeilen) use ($zuordnungswert): string { return (string)json_encode(array_map(static fn(array $zeile): array => [ 'zuordnung' => $zuordnungswert($zeile), 'klasse_id' => (int)($zeile['klasse_id'] ?? 0), 'notiz' => (string)$zeile['notiz'], 'betrag' => View::betrag($zeile['betrag'], false), ], $splitzeilen), JSON_UNESCAPED_UNICODE); }; /** * Der Tooltip einer Splitbuchung: je Zeile Kategorie und Betrag. In der Spalte * steht nur „Splitbuchung“ – wohin das Geld geht, wäre sonst erst im Dialog zu * sehen. Notiz und Klasse bleiben draußen; sie stünden im Weg. * * @param list> $splitzeilen */ $splituebersicht = static function (array $splitzeilen) use ($kategorieNamen, $kontenNamen): string { $texte = []; foreach ($splitzeilen as $zeile) { $name = match (true) { !empty($zeile['gegenkonto_id']) => '[' . ($kontenNamen[(int)$zeile['gegenkonto_id']] ?? '?') . ']', !empty($zeile['kategorie_id']) => (string)($kategorieNamen[(int)$zeile['kategorie_id']] ?? '?'), default => '(ohne Kategorie)', }; $texte[] = $name . ': ' . View::betrag($zeile['betrag']); } return implode("\n", $texte); }; /** * Das Symbol der Abgleichspalte, siehe View::bargeldMarke() – die Schnell- * zuordnung (kontoblatt.js) braucht dasselbe Symbol für eine einzelne Zeile, * ohne die Seite neu zu laden. * * @param array $zeile */ $bargeldmarke = static fn(array $zeile): string => View::bargeldMarke($zeile['bargeld_status'] ?? null, $zeile['bargeld_hinweis'] ?? null); include __DIR__ . '/../layout/kopf.php'; ?>
Kontoblatt Kontodaten
Neue Buchung Kontenübersicht
Aktueller Saldo 0.005): ?> Erwartet
Filter zurücksetzen

'Splitbuchung', $gegenkonto !== '' => $gegenkonto, default => (string)($kategorieNamen[(int)$zeile['kategorie_id']] ?? ''), }; // Eine Splitbuchung nennt im Tooltip ihre Zeilen, alles andere // seine eigene – womöglich abgeschnittene – Beschriftung. $zuordnungstitel = match (true) { isset($splits[(int)$zeile['id']]) => $splituebersicht($splits[(int)$zeile['id']]), $beschriftung !== '' => $beschriftung, default => 'Kategorie oder Gegenkonto zuordnen', }; ?>
Datum Nr. Empfänger Buchungstext Kategorie Klasse Bar Betrag Saldo ✓
Umbuchung
data-splits="" title=""> Splitbuchung
Buchungen 1): ?> 1): ?> Neuer Seite von Älter

Splitbuchung

über 0,00

Kategorie / GegenkontoKlasseNotiz Betrag
Summe der Zeilen / Restbetrag 0,00

Die Summe der Zeilen muss dem Buchungsbetrag entsprechen. Bleiben alle Zeilen leer, wird die Splitbuchung aufgehoben.

Wertpapiergeschäft

über 0,00 · Depot

'', 'wkn' => '']; ?>
Einstandspreis 0,00

Kosten