313 lines
15 KiB
PHP
313 lines
15 KiB
PHP
<?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>
|