Finanzmanager/src/Views/vorlagen/index.php
fds2610-bot c58837dee8 Fix #124: Umbuchungskonten in jeder Kategorieauswahl
Unter den Kategorien stehen überall die aktiven Umbuchungskonten, je
Kontengruppe gruppiert und in deren Reihenfolge (Konto::umbuchungsgruppen()):
Regeln samt Splitzeilen, Umsatzabgleich, Buchungsvorlagen, Regelmäßige
Buchungen, Zahlungsverkehr, Verträge sowie die Filter von Buchungsbericht
und Export. Die Masken nutzen dafür die gemeinsame Liste Kategorie /
Gegenkonto der Buchungsmaske; das getrennte Gegenkonto-Feld der Regel
entfällt.

Regel-Splitzeilen können auf ein Umbuchungskonto zeigen. Zahlungsaufträge
und Verträge bekommen ein Gegenkonto (Migration 030). Ein schon gewähltes
inaktives Konto bleibt sichtbar, damit keine Zuordnung verloren geht.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:30:44 +02:00

157 lines
6.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use Finanzmanager\Controllers\BuchungenController;
use Finanzmanager\View;
/**
* @var list<array<string,mixed>> $vorlagen
* @var string $suche
* @var int $anzahl
* @var list<array<string,mixed>> $konten
* @var list<array<string,mixed>> $kategorien
* @var list<array<string,mixed>> $klassen
* @var string $csrfToken
*/
include __DIR__ . '/../layout/kopf.php';
?>
<div class="tableiste">
<span class="tab aktiv" title="Eine Vorlage füllt die Buchung vor: Empfänger, Kategorie und Splitzeilen stehen schon, einzutragen bleibt das Datum – und der Betrag, wenn er schwankt. Weicht er ab, werden die Splitzeilen im gleichen Verhältnis mitgezogen.">Buchungsvorlagen</span>
<a href="/termine" class="tab">Regelmäßige Buchungen</a>
<a href="/termine/kalender" class="tab">Finanzkalender</a>
</div>
<div class="seitenaktionen">
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
</div>
<form method="get" action="/vorlagen" class="filterleiste">
<label for="suche">Suchen</label>
<input type="search" id="suche" name="suche" value="<?= View::h($suche) ?>"
placeholder="Name oder Empfänger">
<button type="submit" class="knopf">Suchen</button>
<?php if ($suche !== ''): ?>
<a href="/vorlagen" class="knopf">Alle zeigen</a>
<?php endif; ?>
<span class="nebentext"><?= (int)$anzahl ?> Vorlagen insgesamt</span>
</form>
<?php if ($vorlagen === []): ?>
<p class="platzhalter">
<?= $suche === ''
? 'Noch keine Vorlagen. Sie kommen aus dem QIF-Import oder entstehen aus einer vorhandenen Buchung.'
: 'Keine Vorlage passt zur Suche.' ?>
</p>
<?php else: ?>
<?php foreach ($vorlagen as $vorlage): ?>
<form id="vorlage-buchen-<?= (int)$vorlage['id'] ?>" method="post"
action="/vorlagen/<?= (int)$vorlage['id'] ?>/buchen"></form>
<form id="vorlage-loeschen-<?= (int)$vorlage['id'] ?>" method="post"
action="/vorlagen/<?= (int)$vorlage['id'] ?>/loeschen"
data-bestaetigen="Vorlage „<?= View::h($vorlage['name']) ?>“ löschen?"></form>
<?php endforeach; ?>
<table class="liste">
<thead>
<tr>
<th>Vorlage</th><th>Kategorie / Gegenkonto</th><th>Konto</th>
<th class="rechts">Betrag</th><th>Buchen am</th>
<th class="rechts">Genutzt</th><th class="rechts">Aktion</th>
</tr>
</thead>
<tbody>
<?php foreach ($vorlagen as $vorlage): ?>
<?php $f = 'vorlage-buchen-' . (int)$vorlage['id']; ?>
<tr>
<td>
<?= View::h($vorlage['name']) ?>
<?php if (($vorlage['splits'] ?? null) !== null): ?>
<span class="marke">Split</span>
<?php endif; ?>
</td>
<td><?= View::h($vorlage['gegenkontoname'] !== null
? '[' . $vorlage['gegenkontoname'] . ']'
: ($vorlage['kategorie_pfad'] ?? '–')) ?></td>
<td>
<input type="hidden" form="<?= $f ?>" name="csrf_token" value="<?= View::h($csrfToken) ?>">
<?php if ($vorlage['konto_id'] === null): ?>
<select form="<?= $f ?>" name="konto_id" required>
<option value="">– Konto wählen –</option>
<?php foreach ($konten as $konto): ?>
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
<?php endforeach; ?>
</select>
<?php else: ?>
<?= View::h($vorlage['kontoname']) ?>
<?php endif; ?>
</td>
<td class="rechts">
<input type="text" form="<?= $f ?>" name="betrag" class="schmal" inputmode="decimal"
value="<?= View::h(number_format((float)$vorlage['betrag'], 2, ',', '')) ?>">
</td>
<td>
<input type="date" form="<?= $f ?>" name="datum" value="<?= View::h(date('Y-m-d')) ?>">
</td>
<td class="rechts"><?= (int)$vorlage['verwendet'] ?></td>
<td class="rechts nowrap">
<input type="hidden" form="vorlage-loeschen-<?= (int)$vorlage['id'] ?>"
name="csrf_token" value="<?= View::h($csrfToken) ?>">
<button type="submit" form="<?= $f ?>" class="knopf klein primaer">Buchen</button>
<button type="submit" form="vorlage-loeschen-<?= (int)$vorlage['id'] ?>"
class="knopf klein gefahr">Löschen</button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
<dialog id="neudialog" class="splitdialog neudialog">
<form method="post" action="/vorlagen/neu" class="formular breit">
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
<h2>Neue Vorlage</h2>
<label for="name">Name</label>
<input type="text" id="name" name="name" required>
<label for="empfaenger">Empfänger</label>
<input type="text" id="empfaenger" name="empfaenger">
<label for="konto_id">Konto</label>
<select id="konto_id" name="konto_id">
<option value="">– beim Buchen wählen –</option>
<?php foreach ($konten as $konto): ?>
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
<?php endforeach; ?>
</select>
<label for="betrag">Betrag</label>
<input type="text" id="betrag" name="betrag" inputmode="decimal" value="0,00">
<label for="zuordnung"
title="Unter den Kategorien stehen die aktiven Umbuchungskonten in eckigen Klammern. Eines davon macht aus der Buchung eine Umbuchung.">Kategorie / Gegenkonto</label>
<select id="zuordnung" name="zuordnung">
<?php $gewaehlt = ''; $eigenesKonto = 0; $mitSplit = false; $mitDepot = false; ?>
<?php include __DIR__ . '/../buchungen/zuordnungsliste.php'; ?>
</select>
<label for="klasse_id">Klasse</label>
<select id="klasse_id" name="klasse_id">
<option value="">– keine –</option>
<?php foreach ($klassen as $klasse): ?>
<option value="<?= (int)$klasse['id'] ?>"><?= View::h($klasse['name']) ?></option>
<?php endforeach; ?>
</select>
<label for="buchungstext">Buchungstext</label>
<input type="text" id="buchungstext" name="buchungstext">
<div class="knopfleiste">
<button type="submit" class="knopf primaer">Vorlage anlegen</button>
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
</div>
</form>
</dialog>
<?php include __DIR__ . '/../layout/fuss.php'; ?>