Finanzmanager/src/Views/termine/index.php
fds2610-bot 1fc78abc11 Fix n.n.: Regelmäßige Buchungen – Buchen zum gewählten Datum
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 10:48:51 +02:00

313 lines
15 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\View;
/**
* @var list<array<string,mixed>> $reihen
* @var list<array<string,mixed>> $faellig
* @var array{faellig:int, automatisch:int, wartend:int} $vorschau
* @var list<array<string,mixed>> $konten
* @var list<array<string,mixed>> $kategorien
* @var list<array<string,mixed>> $klassen
* @var array<string,string> $intervalle
* @var string $csrfToken
*/
include __DIR__ . '/../layout/kopf.php';
?>
<div class="tableiste">
<a href="/vorlagen" class="tab">Buchungsvorlagen</a>
<span class="tab aktiv">Regelmäßige Buchungen</span>
<a href="/termine/kalender" class="tab">Finanzkalender</a>
<a href="/termine/erinnerungen" class="tab">Erinnerungen</a>
</div>
<div class="seitenaktionen">
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
</div>
<?php if ($vorschau['faellig'] > 0): ?>
<div class="seitenaktionen">
<span class="hinweis">
<?= (int)$vorschau['faellig'] ?> Termin(e) fällig,
davon <?= (int)$vorschau['automatisch'] ?> automatisch.
</span>
<?php if ($vorschau['automatisch'] > 0): ?>
<form method="post" action="/termine/lauf" class="inline">
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
<button type="submit" class="knopf primaer">Fälligkeitslauf starten</button>
</form>
<?php endif; ?>
</div>
<h3>Jetzt fällig</h3>
<?php foreach ($faellig as $reihe): ?>
<form id="buchen-<?= (int)$reihe['id'] ?>" method="post"
action="/termine/<?= (int)$reihe['id'] ?>/buchen">
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
</form>
<?php endforeach; ?>
<table class="liste faellig">
<thead>
<tr><th>Fällig am</th><th>Name</th><th>Konto</th><th class="rechts">Betrag</th>
<th>Art</th><th class="rechts">Aktion</th></tr>
</thead>
<tbody>
<?php foreach ($faellig as $reihe): ?>
<tr<?= (string)$reihe['naechste_faelligkeit'] < date('Y-m-d') ? ' class="ueberfaellig"' : '' ?>>
<td>
<div class="feld" data-datum>
<span class="anzeige"><?= View::h(View::datum($reihe['naechste_faelligkeit'])) ?></span>
<input type="date" form="buchen-<?= (int)$reihe['id'] ?>" name="datum" hidden
id="buchen-datum-<?= (int)$reihe['id'] ?>"
value="<?= View::h((string)$reihe['naechste_faelligkeit']) ?>">
</div>
</td>
<td><?= View::h($reihe['name']) ?></td>
<td><?= View::h($reihe['kontoname']) ?></td>
<td class="rechts <?= View::betragKlasse($reihe['betrag']) ?>">
<?= View::betrag($reihe['betrag']) ?>
</td>
<td>
<?= (int)$reihe['automatisch'] === 1
? '<span class="marke">automatisch</span>'
: '<span class="marke">auf Bestätigung</span>' ?>
</td>
<td class="rechts nowrap">
<button type="submit" form="buchen-<?= (int)$reihe['id'] ?>"
id="buchen-knopf-<?= (int)$reihe['id'] ?>" class="knopf klein primaer">Buchen</button>
<form method="post" action="/termine/<?= (int)$reihe['id'] ?>/ueberspringen" class="inline">
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
<button type="submit" class="knopf klein">Überspringen</button>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<p class="hinweis">Zurzeit ist nichts fällig.</p>
<?php endif; ?>
<h3>Alle Reihen</h3>
<?php if ($reihen === []): ?>
<p class="platzhalter">Noch keine regelmäßige Buchung angelegt.</p>
<?php else: ?>
<?php foreach ($reihen as $reihe): ?>
<form id="reihe-<?= (int)$reihe['id'] ?>" method="post"
action="/termine/<?= (int)$reihe['id'] ?>"></form>
<form id="reihe-loeschen-<?= (int)$reihe['id'] ?>" method="post"
action="/termine/<?= (int)$reihe['id'] ?>/loeschen"
data-bestaetigen="Reihe „<?= View::h($reihe['name']) ?>“ löschen? Gebuchte Zahlungen bleiben erhalten."></form>
<?php endforeach; ?>
<table class="liste reihen">
<thead>
<tr>
<th>Name und Buchungstext</th><th>Konto und Klasse</th><th class="rechts">Betrag</th><th>Rhythmus</th>
<th>Nächster Termin</th><th>Ende</th><th>Auto</th><th>Aktiv</th><th class="rechts">Aktion</th>
</tr>
</thead>
<tbody>
<?php foreach ($reihen as $reihe): ?>
<?php $f = 'reihe-' . (int)$reihe['id']; ?>
<?php
$konto = '';
foreach ($konten as $k) {
if ((int)$k['id'] === (int)$reihe['konto_id']) {
$konto = (string)$k['name'];
}
}
$klasseName = '';
foreach ($klassen as $k) {
if ((int)$k['id'] === (int)($reihe['klasse_id'] ?? 0)) {
$klasseName = (string)$k['name'];
}
}
?>
<tr<?= (int)$reihe['aktiv'] === 1 ? '' : ' class="inaktiv"' ?>>
<td>
<input type="hidden" form="<?= $f ?>" name="csrf_token" value="<?= View::h($csrfToken) ?>">
<input type="hidden" form="<?= $f ?>" name="empfaenger" value="<?= View::h($reihe['empfaenger']) ?>">
<input type="hidden" form="<?= $f ?>" name="kategorie_id" value="<?= View::h((string)$reihe['kategorie_id']) ?>">
<input type="hidden" form="<?= $f ?>" name="gegenkonto_id" value="<?= View::h((string)$reihe['gegenkonto_id']) ?>">
<input type="hidden" form="<?= $f ?>" name="vorlauf_tage" value="<?= (int)$reihe['vorlauf_tage'] ?>">
<input type="hidden" form="<?= $f ?>" name="faktor" value="<?= (int)$reihe['faktor'] ?>">
<input type="hidden" form="<?= $f ?>" name="beginn" value="<?= View::h((string)$reihe['beginn']) ?>">
<div class="feld" data-leer="–">
<span class="anzeige"><strong><?= View::h($reihe['name']) ?></strong></span>
<input type="text" form="<?= $f ?>" name="name" required hidden
value="<?= View::h($reihe['name']) ?>">
</div>
<div class="feld" data-leer="Buchungstext">
<span class="anzeige"><?= View::h($reihe['buchungstext'] ?? '') ?></span>
<input type="text" form="<?= $f ?>" name="buchungstext" placeholder="Buchungstext" hidden
value="<?= View::h($reihe['buchungstext'] ?? '') ?>">
</div>
</td>
<td>
<div class="feld">
<span class="anzeige"><?= View::h($konto) ?></span>
<select form="<?= $f ?>" name="konto_id" hidden>
<?php foreach ($konten as $k): ?>
<option value="<?= (int)$k['id'] ?>"
<?= (int)$reihe['konto_id'] === (int)$k['id'] ? 'selected' : '' ?>>
<?= View::h($k['name']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="feld" data-leer="keine Klasse">
<span class="anzeige"><?= View::h($klasseName) ?></span>
<select form="<?= $f ?>" name="klasse_id" hidden>
<option value="">– keine Klasse –</option>
<?php foreach ($klassen as $k): ?>
<option value="<?= (int)$k['id'] ?>"
<?= (int)($reihe['klasse_id'] ?? 0) === (int)$k['id'] ? 'selected' : '' ?>>
<?= View::h($k['name']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
</td>
<td class="rechts">
<div class="feld">
<span class="anzeige <?= View::betragKlasse($reihe['betrag']) ?>"><?= View::betrag($reihe['betrag']) ?></span>
<input type="text" form="<?= $f ?>" name="betrag" class="schmal" inputmode="decimal" hidden
value="<?= View::h(number_format((float)$reihe['betrag'], 2, ',', '')) ?>">
</div>
</td>
<td>
<div class="feld">
<span class="anzeige"><?= View::h($intervalle[$reihe['intervall']] ?? (string)$reihe['intervall']) ?></span>
<select form="<?= $f ?>" name="intervall" hidden>
<?php foreach ($intervalle as $schluessel => $name): ?>
<option value="<?= View::h($schluessel) ?>"
<?= $reihe['intervall'] === $schluessel ? 'selected' : '' ?>>
<?= View::h($name) ?>
</option>
<?php endforeach; ?>
</select>
</div>
</td>
<td>
<div class="feld" data-datum>
<span class="anzeige"><?= View::h(View::datum($reihe['naechste_faelligkeit'])) ?></span>
<input type="date" form="<?= $f ?>" name="naechste_faelligkeit" hidden
value="<?= View::h((string)($reihe['naechste_faelligkeit'] ?? '')) ?>">
</div>
</td>
<td>
<div class="feld" data-datum>
<span class="anzeige"><?= View::h(View::datum($reihe['ende'] ?? null)) ?></span>
<input type="date" form="<?= $f ?>" name="ende" hidden
value="<?= View::h((string)($reihe['ende'] ?? '')) ?>">
</div>
</td>
<td>
<div class="feld" data-schalter>
<span class="anzeige"><?= (int)$reihe['automatisch'] === 1 ? 'Ja' : 'Nein' ?></span>
<input type="checkbox" form="<?= $f ?>" name="automatisch" value="1" hidden
<?= (int)$reihe['automatisch'] === 1 ? 'checked' : '' ?>>
</div>
</td>
<td>
<div class="feld" data-schalter>
<span class="anzeige"><?= (int)$reihe['aktiv'] === 1 ? 'Ja' : 'Nein' ?></span>
<input type="checkbox" form="<?= $f ?>" name="aktiv" value="1" hidden
<?= (int)$reihe['aktiv'] === 1 ? 'checked' : '' ?>>
</div>
</td>
<td class="rechts nowrap">
<input type="hidden" form="reihe-loeschen-<?= (int)$reihe['id'] ?>"
name="csrf_token" value="<?= View::h($csrfToken) ?>">
<button type="submit" form="<?= $f ?>" class="knopf klein" data-speichern hidden>Speichern</button>
<button type="submit" form="reihe-loeschen-<?= (int)$reihe['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="/termine/neu" class="formular breit">
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
<h2>Neue regelmäßige Buchung</h2>
<label for="name">Name</label>
<input type="text" id="name" name="name" required placeholder="z. B. Miete">
<label for="neu_konto">Konto</label>
<select id="neu_konto" name="konto_id" required>
<?php foreach ($konten as $konto): ?>
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
<?php endforeach; ?>
</select>
<label for="neu_betrag">Betrag</label>
<input type="text" id="neu_betrag" name="betrag" inputmode="decimal" required
placeholder="Ausgaben mit Minus, z. B. -850,00">
<label for="neu_empfaenger">Empfänger</label>
<input type="text" id="neu_empfaenger" name="empfaenger">
<label for="neu_buchungstext">Buchungstext</label>
<input type="text" id="neu_buchungstext" name="buchungstext">
<label for="neu_kategorie">Kategorie</label>
<select id="neu_kategorie" name="kategorie_id">
<option value="">– keine –</option>
<?php foreach ($kategorien as $kategorie): ?>
<option value="<?= (int)$kategorie['id'] ?>"><?= View::h($kategorie['pfad']) ?></option>
<?php endforeach; ?>
</select>
<label for="neu_klasse">Klasse</label>
<select id="neu_klasse" 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="neu_intervall">Rhythmus</label>
<select id="neu_intervall" name="intervall">
<?php foreach ($intervalle as $schluessel => $name): ?>
<option value="<?= View::h($schluessel) ?>" <?= $schluessel === 'monatlich' ? 'selected' : '' ?>>
<?= View::h($name) ?>
</option>
<?php endforeach; ?>
</select>
<label for="neu_beginn">Erster Termin</label>
<input type="date" id="neu_beginn" name="beginn" value="<?= View::h(date('Y-m-d')) ?>" required>
<label for="neu_ende">Letzter Termin <span class="optional">(optional)</span></label>
<input type="date" id="neu_ende" name="ende">
<label class="ankreuzfeld">
<input type="checkbox" name="automatisch" value="1">
automatisch buchen
</label>
<p class="feldhinweis">
Ohne Haken meldet sich die Reihe nur und wartet auf Bestätigung – richtig überall
dort, wo der Betrag schwankt.
</p>
<label class="ankreuzfeld">
<input type="checkbox" name="aktiv" value="1" checked> aktiv
</label>
<div class="knopfleiste">
<button type="submit" class="knopf primaer">Reihe anlegen</button>
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
</div>
</form>
</dialog>
<?php include __DIR__ . '/../layout/fuss.php'; ?>
<script src="/static/reihenliste.js" defer></script>