Merge pull request 'Fix n.n.: „+ Neu“ öffnet das Formular zur Neuanlage als modalen Dialog' (#106) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/106
This commit is contained in:
commit
d5b4c8d350
19 changed files with 505 additions and 345 deletions
|
|
@ -1,5 +1,10 @@
|
||||||
# Änderungen
|
# Änderungen
|
||||||
|
|
||||||
|
## „+ Neu“ öffnet das Formular als Dialog (01.10.2026)
|
||||||
|
|
||||||
|
- Das Formular zur Neuanlage stand in elf Ansichten unter der Liste. Jetzt öffnet der Knopf „+ Neu“ es als modalen Dialog (`app.js`, `.neudialog`); nach dem Speichern erscheint die Liste wieder, mit dem neuen Eintrag. Betroffen: Klassen, Buchungsvorlagen, Regelmäßige Buchungen, Erinnerungen, Verträge, Adressen, Sparziele, Kredite, Abgleichregeln, Budgets, Berichtsgruppen.
|
||||||
|
- E2E: `neudialog.spec.js`; bestehende Specs öffnen den Dialog zuerst.
|
||||||
|
|
||||||
## Regelmäßige Buchungen: Klick zum Bearbeiten (01.10.2026)
|
## Regelmäßige Buchungen: Klick zum Bearbeiten (01.10.2026)
|
||||||
|
|
||||||
- In „Alle Reihen“ erscheinen alle Felder zunächst als Text und werden erst beim Anklicken zum Eingabefeld (`reihenliste.js`). Ja/Nein-Felder schalten per Klick um, „Speichern“ erscheint erst nach einer Änderung. Konto und Klasse stehen untereinander, die Spalte Name/Buchungstext nimmt den freien Platz.
|
- In „Alle Reihen“ erscheinen alle Felder zunächst als Text und werden erst beim Anklicken zum Eingabefeld (`reihenliste.js`). Ja/Nein-Felder schalten per Klick um, „Speichern“ erscheint erst nach einer Änderung. Konto und Klasse stehen untereinander, die Spalte Name/Buchungstext nimmt den freien Platz.
|
||||||
|
|
|
||||||
|
|
@ -1289,6 +1289,19 @@ table.splittabelle input.rechts { text-align: right; }
|
||||||
„Speichern“ und „Abbrechen“, damit es nicht im Vorbeigehen getroffen wird. */
|
„Speichern“ und „Abbrechen“, damit es nicht im Vorbeigehen getroffen wird. */
|
||||||
.splitdialog .knopfleiste .knopf.gefahr { margin-left: auto; }
|
.splitdialog .knopfleiste .knopf.gefahr { margin-left: auto; }
|
||||||
|
|
||||||
|
/* „+ Neu“ in den Listenansichten: Das Formular zur Neuanlage liegt in einem
|
||||||
|
modalen Dialog, den der Knopf öffnet. Der Dialog trägt den Rahmen, das
|
||||||
|
Formular darin braucht ihn nicht noch einmal. */
|
||||||
|
.neudialog { max-height: 92vh; overflow-y: auto; }
|
||||||
|
|
||||||
|
.neudialog .formular.breit {
|
||||||
|
max-width: none;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* Die Formatwahl vor Import und Export – als Dialog auf der Verwaltungsseite
|
/* Die Formatwahl vor Import und Export – als Dialog auf der Verwaltungsseite
|
||||||
und als Kachelinhalt auf der Ausweichseite, deshalb zwei Ebenen: der Dialog
|
und als Kachelinhalt auf der Ausweichseite, deshalb zwei Ebenen: der Dialog
|
||||||
trägt den Rahmen, .formatwahl die Karten. */
|
trägt den Rahmen, .formatwahl die Karten. */
|
||||||
|
|
|
||||||
|
|
@ -314,6 +314,20 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// „+ Neu“ in den Listenansichten: Der Knopf öffnet den Dialog mit dem
|
||||||
|
// Formular zur Neuanlage. Gespeichert wird per Formularversand; die Ansicht
|
||||||
|
// lädt danach neu und zeigt die Liste samt neuem Eintrag.
|
||||||
|
document.querySelectorAll('[data-neudialog]').forEach(function (knopf) {
|
||||||
|
knopf.addEventListener('click', function () {
|
||||||
|
const dialog = document.getElementById(knopf.dataset.neudialog);
|
||||||
|
if (dialog && typeof dialog.showModal === 'function') {
|
||||||
|
dialog.showModal();
|
||||||
|
const feld = dialog.querySelector('input:not([type=hidden]), select, textarea');
|
||||||
|
if (feld) { feld.focus(); }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// Übermittlungsprotokoll im Zahlungsverkehr: Ein Klick auf den Status holt das
|
// Übermittlungsprotokoll im Zahlungsverkehr: Ein Klick auf den Status holt das
|
||||||
// Protokoll der Überweisung in einen modalen Dialog. Ohne <dialog> oder
|
// Protokoll der Überweisung in einen modalen Dialog. Ohne <dialog> oder
|
||||||
// fetch bleibt der Status ein Link auf dieselbe Ansicht als eigene Seite.
|
// fetch bleibt der Status ein Link auf dieselbe Ansicht als eigene Seite.
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="seitenaktionen">
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
<a href="/auswertungen" class="knopf">Zur Übersicht</a>
|
<a href="/auswertungen" class="knopf">Zur Übersicht</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -28,7 +29,7 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
und rücken unter „Nicht gruppiert“.
|
und rücken unter „Nicht gruppiert“.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="kachel einzeln">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<h2>Neue Berichtsgruppe</h2>
|
<h2>Neue Berichtsgruppe</h2>
|
||||||
<form method="post" action="/auswertungen/gruppen/neu" class="zeilenform">
|
<form method="post" action="/auswertungen/gruppen/neu" class="zeilenform">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
|
@ -39,8 +40,9 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
<input type="number" name="sortierung" value="0" class="schmal">
|
<input type="number" name="sortierung" value="0" class="schmal">
|
||||||
</label>
|
</label>
|
||||||
<button type="submit" class="knopf primaer">Anlegen</button>
|
<button type="submit" class="knopf primaer">Anlegen</button>
|
||||||
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</dialog>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$echte = array_filter($gruppen, static fn(array $eintrag): bool => $eintrag['gruppe'] !== null);
|
$echte = array_filter($gruppen, static fn(array $eintrag): bool => $eintrag['gruppe'] !== null);
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="seitenaktionen">
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
<form method="post" action="/banking/regeln/pruefen" class="inline">
|
<form method="post" action="/banking/regeln/pruefen" class="inline">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
<button type="submit" class="knopf"
|
<button type="submit" class="knopf"
|
||||||
|
|
@ -147,16 +148,19 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</table>
|
</table>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/banking/regeln/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/banking/regeln/neu" class="formular breit">
|
||||||
<h3>Neue Regel</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
<h2>Neue Regel</h2>
|
||||||
|
|
||||||
<?php $regel = ['aktiv' => 1]; $idPrefix = 'neu_'; ?>
|
<?php $regel = ['aktiv' => 1]; $idPrefix = 'neu_'; ?>
|
||||||
<?php include __DIR__ . '/regelfelder.php'; ?>
|
<?php include __DIR__ . '/regelfelder.php'; ?>
|
||||||
|
|
||||||
<div class="knopfleiste">
|
<div class="knopfleiste">
|
||||||
<button type="submit" class="knopf primaer">Regel anlegen</button>
|
<button type="submit" class="knopf primaer">Regel anlegen</button>
|
||||||
</div>
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</form>
|
</div>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
|
|
||||||
<div class="seitenaktionen">
|
<div class="seitenaktionen">
|
||||||
<a href="/planung/budget" class="knopf primaer">Budgetplaner öffnen</a>
|
<a href="/planung/budget" class="knopf primaer">Budgetplaner öffnen</a>
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
<a href="/planung" class="knopf">Zurück zur Planung</a>
|
<a href="/planung" class="knopf">Zurück zur Planung</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -66,27 +67,28 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</table>
|
</table>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
|
<h2>Neues Budget</h2>
|
||||||
|
<form method="post" action="/planung/budget/neu" class="formular">
|
||||||
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
|
||||||
|
<label for="name">Name</label>
|
||||||
|
<input type="text" id="name" name="name" required>
|
||||||
|
|
||||||
|
<label for="jahr">Jahr</label>
|
||||||
|
<input type="number" id="jahr" name="jahr" value="<?= $jahr + 1 ?>" step="1" required>
|
||||||
|
|
||||||
|
<label for="beschreibung">Beschreibung <span class="optional">(optional)</span></label>
|
||||||
|
<input type="text" id="beschreibung" name="beschreibung">
|
||||||
|
|
||||||
|
<div class="knopfleiste">
|
||||||
|
<button type="submit" class="knopf primaer">Budget anlegen</button>
|
||||||
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<div class="kachelraster">
|
<div class="kachelraster">
|
||||||
<div class="kachel">
|
|
||||||
<header><h2>Neues Budget</h2></header>
|
|
||||||
<form method="post" action="/planung/budget/neu" class="formular">
|
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
|
||||||
|
|
||||||
<label for="name">Name</label>
|
|
||||||
<input type="text" id="name" name="name" required>
|
|
||||||
|
|
||||||
<label for="jahr">Jahr</label>
|
|
||||||
<input type="number" id="jahr" name="jahr" value="<?= $jahr + 1 ?>" step="1" required>
|
|
||||||
|
|
||||||
<label for="beschreibung">Beschreibung <span class="optional">(optional)</span></label>
|
|
||||||
<input type="text" id="beschreibung" name="beschreibung">
|
|
||||||
|
|
||||||
<div class="knopfleiste">
|
|
||||||
<button type="submit" class="knopf primaer">Budget anlegen</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?php if ($budgets !== []): ?>
|
<?php if ($budgets !== []): ?>
|
||||||
<div class="kachel">
|
<div class="kachel">
|
||||||
<header><h2>Budget kopieren</h2></header>
|
<header><h2>Budget kopieren</h2></header>
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,10 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
kündigen“, „Steuerbescheid prüfen“. Offene Erinnerungen erscheinen im Finanzkalender.
|
kündigen“, „Steuerbescheid prüfen“. Offene Erinnerungen erscheinen im Finanzkalender.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php if ($erinnerungen === []): ?>
|
<?php if ($erinnerungen === []): ?>
|
||||||
<p class="platzhalter">Keine Erinnerungen.</p>
|
<p class="platzhalter">Keine Erinnerungen.</p>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
|
|
@ -65,22 +69,25 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</table>
|
</table>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/termine/erinnerungen/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/termine/erinnerungen/neu" class="formular breit">
|
||||||
<h3>Neue Erinnerung</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
<h2>Neue Erinnerung</h2>
|
||||||
|
|
||||||
<label for="text">Erinnerung</label>
|
<label for="text">Erinnerung</label>
|
||||||
<input type="text" id="text" name="text" required>
|
<input type="text" id="text" name="text" required>
|
||||||
|
|
||||||
<label for="faellig_am">Fällig am</label>
|
<label for="faellig_am">Fällig am</label>
|
||||||
<input type="date" id="faellig_am" name="faellig_am" value="<?= View::h(date('Y-m-d')) ?>" required>
|
<input type="date" id="faellig_am" name="faellig_am" value="<?= View::h(date('Y-m-d')) ?>" required>
|
||||||
|
|
||||||
<label for="notiz">Notiz <span class="optional">(optional)</span></label>
|
<label for="notiz">Notiz <span class="optional">(optional)</span></label>
|
||||||
<input type="text" id="notiz" name="notiz">
|
<input type="text" id="notiz" name="notiz">
|
||||||
|
|
||||||
<div class="knopfleiste">
|
<div class="knopfleiste">
|
||||||
<button type="submit" class="knopf primaer">Erinnerung anlegen</button>
|
<button type="submit" class="knopf primaer">Erinnerung anlegen</button>
|
||||||
</div>
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</form>
|
</div>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,10 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
<a href="/termine/erinnerungen" class="tab">Erinnerungen</a>
|
<a href="/termine/erinnerungen" class="tab">Erinnerungen</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php if ($vorschau['faellig'] > 0): ?>
|
<?php if ($vorschau['faellig'] > 0): ?>
|
||||||
<div class="seitenaktionen">
|
<div class="seitenaktionen">
|
||||||
<span class="hinweis">
|
<span class="hinweis">
|
||||||
|
|
@ -217,78 +221,81 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</table>
|
</table>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/termine/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/termine/neu" class="formular breit">
|
||||||
<h3>Neue regelmäßige Buchung</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
<h2>Neue regelmäßige Buchung</h2>
|
||||||
|
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
<input type="text" id="name" name="name" required placeholder="z. B. Miete">
|
<input type="text" id="name" name="name" required placeholder="z. B. Miete">
|
||||||
|
|
||||||
<label for="neu_konto">Konto</label>
|
<label for="neu_konto">Konto</label>
|
||||||
<select id="neu_konto" name="konto_id" required>
|
<select id="neu_konto" name="konto_id" required>
|
||||||
<?php foreach ($konten as $konto): ?>
|
<?php foreach ($konten as $konto): ?>
|
||||||
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
|
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="neu_betrag">Betrag</label>
|
<label for="neu_betrag">Betrag</label>
|
||||||
<input type="text" id="neu_betrag" name="betrag" inputmode="decimal" required
|
<input type="text" id="neu_betrag" name="betrag" inputmode="decimal" required
|
||||||
placeholder="Ausgaben mit Minus, z. B. -850,00">
|
placeholder="Ausgaben mit Minus, z. B. -850,00">
|
||||||
|
|
||||||
<label for="neu_empfaenger">Empfänger</label>
|
<label for="neu_empfaenger">Empfänger</label>
|
||||||
<input type="text" id="neu_empfaenger" name="empfaenger">
|
<input type="text" id="neu_empfaenger" name="empfaenger">
|
||||||
|
|
||||||
<label for="neu_buchungstext">Buchungstext</label>
|
<label for="neu_buchungstext">Buchungstext</label>
|
||||||
<input type="text" id="neu_buchungstext" name="buchungstext">
|
<input type="text" id="neu_buchungstext" name="buchungstext">
|
||||||
|
|
||||||
<label for="neu_kategorie">Kategorie</label>
|
<label for="neu_kategorie">Kategorie</label>
|
||||||
<select id="neu_kategorie" name="kategorie_id">
|
<select id="neu_kategorie" name="kategorie_id">
|
||||||
<option value="">– keine –</option>
|
<option value="">– keine –</option>
|
||||||
<?php foreach ($kategorien as $kategorie): ?>
|
<?php foreach ($kategorien as $kategorie): ?>
|
||||||
<option value="<?= (int)$kategorie['id'] ?>"><?= View::h($kategorie['pfad']) ?></option>
|
<option value="<?= (int)$kategorie['id'] ?>"><?= View::h($kategorie['pfad']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="neu_klasse">Klasse</label>
|
<label for="neu_klasse">Klasse</label>
|
||||||
<select id="neu_klasse" name="klasse_id">
|
<select id="neu_klasse" name="klasse_id">
|
||||||
<option value="">– keine –</option>
|
<option value="">– keine –</option>
|
||||||
<?php foreach ($klassen as $klasse): ?>
|
<?php foreach ($klassen as $klasse): ?>
|
||||||
<option value="<?= (int)$klasse['id'] ?>"><?= View::h($klasse['name']) ?></option>
|
<option value="<?= (int)$klasse['id'] ?>"><?= View::h($klasse['name']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="neu_intervall">Rhythmus</label>
|
<label for="neu_intervall">Rhythmus</label>
|
||||||
<select id="neu_intervall" name="intervall">
|
<select id="neu_intervall" name="intervall">
|
||||||
<?php foreach ($intervalle as $schluessel => $name): ?>
|
<?php foreach ($intervalle as $schluessel => $name): ?>
|
||||||
<option value="<?= View::h($schluessel) ?>" <?= $schluessel === 'monatlich' ? 'selected' : '' ?>>
|
<option value="<?= View::h($schluessel) ?>" <?= $schluessel === 'monatlich' ? 'selected' : '' ?>>
|
||||||
<?= View::h($name) ?>
|
<?= View::h($name) ?>
|
||||||
</option>
|
</option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="neu_beginn">Erster Termin</label>
|
<label for="neu_beginn">Erster Termin</label>
|
||||||
<input type="date" id="neu_beginn" name="beginn" value="<?= View::h(date('Y-m-d')) ?>" required>
|
<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>
|
<label for="neu_ende">Letzter Termin <span class="optional">(optional)</span></label>
|
||||||
<input type="date" id="neu_ende" name="ende">
|
<input type="date" id="neu_ende" name="ende">
|
||||||
|
|
||||||
<label class="ankreuzfeld">
|
<label class="ankreuzfeld">
|
||||||
<input type="checkbox" name="automatisch" value="1">
|
<input type="checkbox" name="automatisch" value="1">
|
||||||
automatisch buchen
|
automatisch buchen
|
||||||
</label>
|
</label>
|
||||||
<p class="feldhinweis">
|
<p class="feldhinweis">
|
||||||
Ohne Haken meldet sich die Reihe nur und wartet auf Bestätigung – richtig überall
|
Ohne Haken meldet sich die Reihe nur und wartet auf Bestätigung – richtig überall
|
||||||
dort, wo der Betrag schwankt.
|
dort, wo der Betrag schwankt.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<label class="ankreuzfeld">
|
<label class="ankreuzfeld">
|
||||||
<input type="checkbox" name="aktiv" value="1" checked> aktiv
|
<input type="checkbox" name="aktiv" value="1" checked> aktiv
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div class="knopfleiste">
|
<div class="knopfleiste">
|
||||||
<button type="submit" class="knopf primaer">Reihe anlegen</button>
|
<button type="submit" class="knopf primaer">Reihe anlegen</button>
|
||||||
</div>
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</form>
|
</div>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
hinausgeht.
|
hinausgeht.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<form method="get" action="/vertraege/adressen" class="filterleiste">
|
<form method="get" action="/vertraege/adressen" class="filterleiste">
|
||||||
<label for="suche">Suchen</label>
|
<label for="suche">Suchen</label>
|
||||||
<input type="search" id="suche" name="suche" value="<?= View::h($suche) ?>"
|
<input type="search" id="suche" name="suche" value="<?= View::h($suche) ?>"
|
||||||
|
|
@ -126,57 +130,60 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</table>
|
</table>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/vertraege/adressen/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/vertraege/adressen/neu" class="formular breit">
|
||||||
<h3>Neue Adresse</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
<h2>Neue Adresse</h2>
|
||||||
|
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
<input type="text" id="name" name="name" required>
|
<input type="text" id="name" name="name" required>
|
||||||
|
|
||||||
<label for="zusatz">Zusatz <span class="optional">(optional)</span></label>
|
<label for="zusatz">Zusatz <span class="optional">(optional)</span></label>
|
||||||
<input type="text" id="zusatz" name="zusatz">
|
<input type="text" id="zusatz" name="zusatz">
|
||||||
|
|
||||||
<label for="strasse">Straße</label>
|
<label for="strasse">Straße</label>
|
||||||
<input type="text" id="strasse" name="strasse">
|
<input type="text" id="strasse" name="strasse">
|
||||||
|
|
||||||
<div class="feldpaar">
|
<div class="feldpaar">
|
||||||
<div>
|
<div>
|
||||||
<label for="plz">PLZ</label>
|
<label for="plz">PLZ</label>
|
||||||
<input type="text" id="plz" name="plz">
|
<input type="text" id="plz" name="plz">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="ort">Ort</label>
|
||||||
|
<input type="text" id="ort" name="ort">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="land">Land</label>
|
||||||
|
<input type="text" id="land" name="land">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label for="ort">Ort</label>
|
<label for="iban">IBAN</label>
|
||||||
<input type="text" id="ort" name="ort">
|
<input type="text" id="iban" name="iban" placeholder="DE00 0000 0000 0000 0000 00">
|
||||||
|
|
||||||
|
<label for="bic">BIC</label>
|
||||||
|
<input type="text" id="bic" name="bic">
|
||||||
|
|
||||||
|
<div class="feldpaar">
|
||||||
|
<div>
|
||||||
|
<label for="email">E-Mail</label>
|
||||||
|
<input type="text" id="email" name="email">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="telefon">Telefon</label>
|
||||||
|
<input type="text" id="telefon" name="telefon">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label for="land">Land</label>
|
<label for="notiz">Notiz</label>
|
||||||
<input type="text" id="land" name="land">
|
<input type="text" id="notiz" name="notiz">
|
||||||
|
|
||||||
|
<div class="knopfleiste">
|
||||||
|
<button type="submit" class="knopf primaer">Adresse anlegen</button>
|
||||||
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</form>
|
||||||
|
</dialog>
|
||||||
<label for="iban">IBAN</label>
|
|
||||||
<input type="text" id="iban" name="iban" placeholder="DE00 0000 0000 0000 0000 00">
|
|
||||||
|
|
||||||
<label for="bic">BIC</label>
|
|
||||||
<input type="text" id="bic" name="bic">
|
|
||||||
|
|
||||||
<div class="feldpaar">
|
|
||||||
<div>
|
|
||||||
<label for="email">E-Mail</label>
|
|
||||||
<input type="text" id="email" name="email">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="telefon">Telefon</label>
|
|
||||||
<input type="text" id="telefon" name="telefon">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label for="notiz">Notiz</label>
|
|
||||||
<input type="text" id="notiz" name="notiz">
|
|
||||||
|
|
||||||
<div class="knopfleiste">
|
|
||||||
<button type="submit" class="knopf primaer">Adresse anlegen</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,10 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
<a href="/vertraege/kredite" class="tab">Kredite</a>
|
<a href="/vertraege/kredite" class="tab">Kredite</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php if ($fristen !== []): ?>
|
<?php if ($fristen !== []): ?>
|
||||||
<div class="kachel einzeln">
|
<div class="kachel einzeln">
|
||||||
<header><h2>Kündigungsfristen laufen ab</h2></header>
|
<header><h2>Kündigungsfristen laufen ab</h2></header>
|
||||||
|
|
@ -131,80 +135,83 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</table>
|
</table>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/vertraege/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/vertraege/neu" class="formular breit">
|
||||||
<h3>Neuer Vertrag</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
<h2>Neuer Vertrag</h2>
|
||||||
|
|
||||||
<label for="name">Bezeichnung</label>
|
<label for="name">Bezeichnung</label>
|
||||||
<input type="text" id="name" name="name" required placeholder="z. B. Hausratversicherung">
|
<input type="text" id="name" name="name" required placeholder="z. B. Hausratversicherung">
|
||||||
|
|
||||||
<label for="partner">Vertragspartner</label>
|
<label for="partner">Vertragspartner</label>
|
||||||
<input type="text" id="partner" name="partner">
|
<input type="text" id="partner" name="partner">
|
||||||
|
|
||||||
<label for="adresse_id">Adresse <span class="optional">(optional)</span></label>
|
<label for="adresse_id">Adresse <span class="optional">(optional)</span></label>
|
||||||
<select id="adresse_id" name="adresse_id">
|
<select id="adresse_id" name="adresse_id">
|
||||||
<option value="">– keine –</option>
|
<option value="">– keine –</option>
|
||||||
<?php foreach ($adressen as $adresse): ?>
|
<?php foreach ($adressen as $adresse): ?>
|
||||||
<option value="<?= (int)$adresse['id'] ?>"><?= View::h($adresse['name']) ?></option>
|
<option value="<?= (int)$adresse['id'] ?>"><?= View::h($adresse['name']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="vertragsnummer">Vertragsnummer</label>
|
<label for="vertragsnummer">Vertragsnummer</label>
|
||||||
<input type="text" id="vertragsnummer" name="vertragsnummer">
|
<input type="text" id="vertragsnummer" name="vertragsnummer">
|
||||||
|
|
||||||
<label for="betrag">Betrag je Zahlung</label>
|
<label for="betrag">Betrag je Zahlung</label>
|
||||||
<input type="text" id="betrag" name="betrag" inputmode="decimal" value="0,00">
|
<input type="text" id="betrag" name="betrag" inputmode="decimal" value="0,00">
|
||||||
|
|
||||||
<label for="intervall">Rhythmus</label>
|
<label for="intervall">Rhythmus</label>
|
||||||
<select id="intervall" name="intervall">
|
<select id="intervall" name="intervall">
|
||||||
<?php foreach ($intervalle as $schluessel => $name): ?>
|
<?php foreach ($intervalle as $schluessel => $name): ?>
|
||||||
<option value="<?= View::h($schluessel) ?>" <?= $schluessel === 'monatlich' ? 'selected' : '' ?>>
|
<option value="<?= View::h($schluessel) ?>" <?= $schluessel === 'monatlich' ? 'selected' : '' ?>>
|
||||||
<?= View::h($name) ?>
|
<?= View::h($name) ?>
|
||||||
</option>
|
</option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="kategorie_id">Kategorie</label>
|
<label for="kategorie_id">Kategorie</label>
|
||||||
<select id="kategorie_id" name="kategorie_id">
|
<select id="kategorie_id" name="kategorie_id">
|
||||||
<option value="">– keine –</option>
|
<option value="">– keine –</option>
|
||||||
<?php foreach ($kategorien as $kategorie): ?>
|
<?php foreach ($kategorien as $kategorie): ?>
|
||||||
<option value="<?= (int)$kategorie['id'] ?>"><?= View::h($kategorie['pfad']) ?></option>
|
<option value="<?= (int)$kategorie['id'] ?>"><?= View::h($kategorie['pfad']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<div class="feldpaar">
|
<div class="feldpaar">
|
||||||
<div>
|
<div>
|
||||||
<label for="beginn">Beginn</label>
|
<label for="beginn">Beginn</label>
|
||||||
<input type="date" id="beginn" name="beginn">
|
<input type="date" id="beginn" name="beginn">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="ende">Ende</label>
|
||||||
|
<input type="date" id="ende" name="ende">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="kuendigungsfrist_tage">Kündigungsfrist (Tage)</label>
|
||||||
|
<input type="number" id="kuendigungsfrist_tage" name="kuendigungsfrist_tage" value="0" min="0">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label for="ende">Ende</label>
|
<label for="regelmaessige_id">Zahlung über <span class="optional">(optional)</span></label>
|
||||||
<input type="date" id="ende" name="ende">
|
<select id="regelmaessige_id" name="regelmaessige_id">
|
||||||
|
<option value="">– keine regelmäßige Buchung –</option>
|
||||||
|
<?php foreach ($reihen as $reihe): ?>
|
||||||
|
<option value="<?= (int)$reihe['id'] ?>"><?= View::h($reihe['name']) ?></option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<label for="notiz">Notiz</label>
|
||||||
|
<input type="text" id="notiz" name="notiz">
|
||||||
|
|
||||||
|
<label class="ankreuzfeld">
|
||||||
|
<input type="checkbox" name="aktiv" value="1" checked> aktiv
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="knopfleiste">
|
||||||
|
<button type="submit" class="knopf primaer">Vertrag anlegen</button>
|
||||||
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
</form>
|
||||||
<label for="kuendigungsfrist_tage">Kündigungsfrist (Tage)</label>
|
</dialog>
|
||||||
<input type="number" id="kuendigungsfrist_tage" name="kuendigungsfrist_tage" value="0" min="0">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label for="regelmaessige_id">Zahlung über <span class="optional">(optional)</span></label>
|
|
||||||
<select id="regelmaessige_id" name="regelmaessige_id">
|
|
||||||
<option value="">– keine regelmäßige Buchung –</option>
|
|
||||||
<?php foreach ($reihen as $reihe): ?>
|
|
||||||
<option value="<?= (int)$reihe['id'] ?>"><?= View::h($reihe['name']) ?></option>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<label for="notiz">Notiz</label>
|
|
||||||
<input type="text" id="notiz" name="notiz">
|
|
||||||
|
|
||||||
<label class="ankreuzfeld">
|
|
||||||
<input type="checkbox" name="aktiv" value="1" checked> aktiv
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<div class="knopfleiste">
|
|
||||||
<button type="submit" class="knopf primaer">Vertrag anlegen</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,10 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
<span class="tab aktiv">Kredite</span>
|
<span class="tab aktiv">Kredite</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php if ($kredite !== []): ?>
|
<?php if ($kredite !== []): ?>
|
||||||
<table class="liste zahlen">
|
<table class="liste zahlen">
|
||||||
<thead>
|
<thead>
|
||||||
|
|
@ -201,58 +205,61 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</form>
|
</form>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/vertraege/kredite/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/vertraege/kredite/neu" class="formular breit">
|
||||||
<h3>Neuer Kredit</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
<p class="feldhinweis">
|
<h2>Neuer Kredit</h2>
|
||||||
Gerechnet wird als Annuitätendarlehen: gleichbleibende Rate, sinkender Zinsanteil.
|
<p class="feldhinweis">
|
||||||
Der Tilgungsplan entsteht aus diesen Angaben und wird nicht gespeichert.
|
Gerechnet wird als Annuitätendarlehen: gleichbleibende Rate, sinkender Zinsanteil.
|
||||||
</p>
|
Der Tilgungsplan entsteht aus diesen Angaben und wird nicht gespeichert.
|
||||||
|
</p>
|
||||||
|
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
<input type="text" id="name" name="name" required placeholder="z. B. Baufinanzierung">
|
<input type="text" id="name" name="name" required placeholder="z. B. Baufinanzierung">
|
||||||
|
|
||||||
<div class="feldpaar">
|
<div class="feldpaar">
|
||||||
<div>
|
<div>
|
||||||
<label for="darlehensbetrag">Darlehensbetrag</label>
|
<label for="darlehensbetrag">Darlehensbetrag</label>
|
||||||
<input type="text" id="darlehensbetrag" name="darlehensbetrag" inputmode="decimal" required>
|
<input type="text" id="darlehensbetrag" name="darlehensbetrag" inputmode="decimal" required>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="zinssatz">Zinssatz (%)</label>
|
||||||
|
<input type="text" id="zinssatz" name="zinssatz" inputmode="decimal" required>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="rate">Rate</label>
|
||||||
|
<input type="text" id="rate" name="rate" inputmode="decimal" required>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label for="zinssatz">Zinssatz (%)</label>
|
|
||||||
<input type="text" id="zinssatz" name="zinssatz" inputmode="decimal" required>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="rate">Rate</label>
|
|
||||||
<input type="text" id="rate" name="rate" inputmode="decimal" required>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="feldpaar">
|
<div class="feldpaar">
|
||||||
<div>
|
<div>
|
||||||
<label for="rhythmus">Rhythmus</label>
|
<label for="rhythmus">Rhythmus</label>
|
||||||
<select id="rhythmus" name="rhythmus">
|
<select id="rhythmus" name="rhythmus">
|
||||||
<?php foreach (Kredit::RHYTHMUS_NAMEN as $schluessel => $name): ?>
|
<?php foreach (Kredit::RHYTHMUS_NAMEN as $schluessel => $name): ?>
|
||||||
<option value="<?= View::h($schluessel) ?>"><?= View::h($name) ?></option>
|
<option value="<?= View::h($schluessel) ?>"><?= View::h($name) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="beginn">Beginn</label>
|
||||||
|
<input type="date" id="beginn" name="beginn" value="<?= View::h(date('Y-m-d')) ?>" required>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="zinsbindung_bis">Zinsbindung bis</label>
|
||||||
|
<input type="date" id="zinsbindung_bis" name="zinsbindung_bis">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label for="beginn">Beginn</label>
|
|
||||||
<input type="date" id="beginn" name="beginn" value="<?= View::h(date('Y-m-d')) ?>" required>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="zinsbindung_bis">Zinsbindung bis</label>
|
|
||||||
<input type="date" id="zinsbindung_bis" name="zinsbindung_bis">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label class="ankreuzfeld">
|
<label class="ankreuzfeld">
|
||||||
<input type="checkbox" name="aktiv" value="1" checked> aktiv
|
<input type="checkbox" name="aktiv" value="1" checked> aktiv
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div class="knopfleiste">
|
<div class="knopfleiste">
|
||||||
<button type="submit" class="knopf primaer">Kredit anlegen</button>
|
<button type="submit" class="knopf primaer">Kredit anlegen</button>
|
||||||
</div>
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</form>
|
</div>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,10 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
auf dem Konto lag.
|
auf dem Konto lag.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php if ($ziele === []): ?>
|
<?php if ($ziele === []): ?>
|
||||||
<p class="platzhalter">Noch kein Sparziel angelegt.</p>
|
<p class="platzhalter">Noch kein Sparziel angelegt.</p>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
|
|
@ -93,46 +97,49 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/vertraege/sparziele/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/vertraege/sparziele/neu" class="formular breit">
|
||||||
<h3>Neues Sparziel</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
<h2>Neues Sparziel</h2>
|
||||||
|
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
<input type="text" id="name" name="name" required placeholder="z. B. Neues Auto">
|
<input type="text" id="name" name="name" required placeholder="z. B. Neues Auto">
|
||||||
|
|
||||||
<label for="konto_id">Konto</label>
|
<label for="konto_id">Konto</label>
|
||||||
<select id="konto_id" name="konto_id">
|
<select id="konto_id" name="konto_id">
|
||||||
<option value="">– keines –</option>
|
<option value="">– keines –</option>
|
||||||
<?php foreach ($konten as $konto): ?>
|
<?php foreach ($konten as $konto): ?>
|
||||||
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
|
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
<p class="feldhinweis">Der Stand des Ziels ist der Saldo dieses Kontos.</p>
|
<p class="feldhinweis">Der Stand des Ziels ist der Saldo dieses Kontos.</p>
|
||||||
|
|
||||||
<div class="feldpaar">
|
<div class="feldpaar">
|
||||||
<div>
|
<div>
|
||||||
<label for="zielbetrag">Zielbetrag</label>
|
<label for="zielbetrag">Zielbetrag</label>
|
||||||
<input type="text" id="zielbetrag" name="zielbetrag" inputmode="decimal" required>
|
<input type="text" id="zielbetrag" name="zielbetrag" inputmode="decimal" required>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="startbetrag">Startbetrag</label>
|
||||||
|
<input type="text" id="startbetrag" name="startbetrag" inputmode="decimal" value="0,00">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="zieldatum">Zieldatum</label>
|
||||||
|
<input type="date" id="zieldatum" name="zieldatum">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label for="startbetrag">Startbetrag</label>
|
<label for="monatsrate">Geplante Monatsrate <span class="optional">(optional)</span></label>
|
||||||
<input type="text" id="startbetrag" name="startbetrag" inputmode="decimal" value="0,00">
|
<input type="text" id="monatsrate" name="monatsrate" inputmode="decimal">
|
||||||
|
|
||||||
|
<label for="notiz">Notiz</label>
|
||||||
|
<input type="text" id="notiz" name="notiz">
|
||||||
|
|
||||||
|
<div class="knopfleiste">
|
||||||
|
<button type="submit" class="knopf primaer">Sparziel anlegen</button>
|
||||||
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
</form>
|
||||||
<label for="zieldatum">Zieldatum</label>
|
</dialog>
|
||||||
<input type="date" id="zieldatum" name="zieldatum">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label for="monatsrate">Geplante Monatsrate <span class="optional">(optional)</span></label>
|
|
||||||
<input type="text" id="monatsrate" name="monatsrate" inputmode="decimal">
|
|
||||||
|
|
||||||
<label for="notiz">Notiz</label>
|
|
||||||
<input type="text" id="notiz" name="notiz">
|
|
||||||
|
|
||||||
<div class="knopfleiste">
|
|
||||||
<button type="submit" class="knopf primaer">Sparziel anlegen</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="seitenaktionen">
|
<div class="seitenaktionen">
|
||||||
|
<button type="button" class="knopf primaer" id="neu-knopf" data-neudialog="neudialog">+ Neu</button>
|
||||||
<a href="/verwaltung" class="knopf">Zurück zur Verwaltung</a>
|
<a href="/verwaltung" class="knopf">Zurück zur Verwaltung</a>
|
||||||
<a href="/verwaltung/import" class="knopf">QIF-Import</a>
|
<a href="/verwaltung/import" class="knopf">QIF-Import</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -69,19 +70,22 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</table>
|
</table>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/verwaltung/klassen/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/verwaltung/klassen/neu" class="formular breit">
|
||||||
<h3>Neue Klasse</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
<h2>Neue Klasse</h2>
|
||||||
|
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
<input type="text" id="name" name="name" required>
|
<input type="text" id="name" name="name" required>
|
||||||
|
|
||||||
<label for="beschreibung">Beschreibung <span class="optional">(optional)</span></label>
|
<label for="beschreibung">Beschreibung <span class="optional">(optional)</span></label>
|
||||||
<input type="text" id="beschreibung" name="beschreibung">
|
<input type="text" id="beschreibung" name="beschreibung">
|
||||||
|
|
||||||
<div class="knopfleiste">
|
<div class="knopfleiste">
|
||||||
<button type="submit" class="knopf primaer">Klasse anlegen</button>
|
<button type="submit" class="knopf primaer">Klasse anlegen</button>
|
||||||
</div>
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</form>
|
</div>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,10 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
die Splitzeilen im gleichen Verhältnis mitgezogen.
|
die Splitzeilen im gleichen Verhältnis mitgezogen.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<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">
|
<form method="get" action="/vorlagen" class="filterleiste">
|
||||||
<label for="suche">Suchen</label>
|
<label for="suche">Suchen</label>
|
||||||
<input type="search" id="suche" name="suche" value="<?= View::h($suche) ?>"
|
<input type="search" id="suche" name="suche" value="<?= View::h($suche) ?>"
|
||||||
|
|
@ -106,49 +110,52 @@ include __DIR__ . '/../layout/kopf.php';
|
||||||
</table>
|
</table>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" action="/vorlagen/neu" class="formular breit">
|
<dialog id="neudialog" class="splitdialog neudialog">
|
||||||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
<form method="post" action="/vorlagen/neu" class="formular breit">
|
||||||
<h3>Neue Vorlage</h3>
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||||||
|
<h2>Neue Vorlage</h2>
|
||||||
|
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
<input type="text" id="name" name="name" required>
|
<input type="text" id="name" name="name" required>
|
||||||
|
|
||||||
<label for="empfaenger">Empfänger</label>
|
<label for="empfaenger">Empfänger</label>
|
||||||
<input type="text" id="empfaenger" name="empfaenger">
|
<input type="text" id="empfaenger" name="empfaenger">
|
||||||
|
|
||||||
<label for="konto_id">Konto</label>
|
<label for="konto_id">Konto</label>
|
||||||
<select id="konto_id" name="konto_id">
|
<select id="konto_id" name="konto_id">
|
||||||
<option value="">– beim Buchen wählen –</option>
|
<option value="">– beim Buchen wählen –</option>
|
||||||
<?php foreach ($konten as $konto): ?>
|
<?php foreach ($konten as $konto): ?>
|
||||||
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
|
<option value="<?= (int)$konto['id'] ?>"><?= View::h($konto['name']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="betrag">Betrag</label>
|
<label for="betrag">Betrag</label>
|
||||||
<input type="text" id="betrag" name="betrag" inputmode="decimal" value="0,00">
|
<input type="text" id="betrag" name="betrag" inputmode="decimal" value="0,00">
|
||||||
|
|
||||||
<label for="kategorie_id">Kategorie</label>
|
<label for="kategorie_id">Kategorie</label>
|
||||||
<select id="kategorie_id" name="kategorie_id">
|
<select id="kategorie_id" name="kategorie_id">
|
||||||
<option value="">– keine –</option>
|
<option value="">– keine –</option>
|
||||||
<?php foreach ($kategorien as $kategorie): ?>
|
<?php foreach ($kategorien as $kategorie): ?>
|
||||||
<option value="<?= (int)$kategorie['id'] ?>"><?= View::h($kategorie['pfad']) ?></option>
|
<option value="<?= (int)$kategorie['id'] ?>"><?= View::h($kategorie['pfad']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="klasse_id">Klasse</label>
|
<label for="klasse_id">Klasse</label>
|
||||||
<select id="klasse_id" name="klasse_id">
|
<select id="klasse_id" name="klasse_id">
|
||||||
<option value="">– keine –</option>
|
<option value="">– keine –</option>
|
||||||
<?php foreach ($klassen as $klasse): ?>
|
<?php foreach ($klassen as $klasse): ?>
|
||||||
<option value="<?= (int)$klasse['id'] ?>"><?= View::h($klasse['name']) ?></option>
|
<option value="<?= (int)$klasse['id'] ?>"><?= View::h($klasse['name']) ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="buchungstext">Buchungstext</label>
|
<label for="buchungstext">Buchungstext</label>
|
||||||
<input type="text" id="buchungstext" name="buchungstext">
|
<input type="text" id="buchungstext" name="buchungstext">
|
||||||
|
|
||||||
<div class="knopfleiste">
|
<div class="knopfleiste">
|
||||||
<button type="submit" class="knopf primaer">Vorlage anlegen</button>
|
<button type="submit" class="knopf primaer">Vorlage anlegen</button>
|
||||||
</div>
|
<button type="submit" class="knopf" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
</form>
|
</div>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|
||||||
|
|
|
||||||
|
|
@ -54,8 +54,9 @@ test.describe('Buchungen', () => {
|
||||||
await page.click('.formular button[type="submit"]')
|
await page.click('.formular button[type="submit"]')
|
||||||
|
|
||||||
await page.goto('/verwaltung/klassen')
|
await page.goto('/verwaltung/klassen')
|
||||||
|
await page.click('#neu-knopf')
|
||||||
await page.fill('form[action="/verwaltung/klassen/neu"] #name', KLASSE)
|
await page.fill('form[action="/verwaltung/klassen/neu"] #name', KLASSE)
|
||||||
await page.click('form[action="/verwaltung/klassen/neu"] button[type="submit"]')
|
await page.click('form[action="/verwaltung/klassen/neu"] button.primaer')
|
||||||
|
|
||||||
await page.close()
|
await page.close()
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -201,6 +201,7 @@ test.describe('Module der Phasen 4 bis 7', () => {
|
||||||
|
|
||||||
test('Eine falsche IBAN wird beim Anlegen einer Adresse abgewiesen', async ({ page }) => {
|
test('Eine falsche IBAN wird beim Anlegen einer Adresse abgewiesen', async ({ page }) => {
|
||||||
await page.goto('/vertraege/adressen')
|
await page.goto('/vertraege/adressen')
|
||||||
|
await page.click('#neu-knopf')
|
||||||
|
|
||||||
await page.fill('#name', 'E2E-Falschtest')
|
await page.fill('#name', 'E2E-Falschtest')
|
||||||
await page.fill('#iban', 'DE02120300000000202052')
|
await page.fill('#iban', 'DE02120300000000202052')
|
||||||
|
|
@ -211,6 +212,7 @@ test.describe('Module der Phasen 4 bis 7', () => {
|
||||||
|
|
||||||
test('Ein Kredit zeigt seinen gerechneten Tilgungsplan', async ({ page }) => {
|
test('Ein Kredit zeigt seinen gerechneten Tilgungsplan', async ({ page }) => {
|
||||||
await page.goto('/vertraege/kredite')
|
await page.goto('/vertraege/kredite')
|
||||||
|
await page.click('#neu-knopf')
|
||||||
|
|
||||||
await page.fill('#name', 'E2E-Darlehen')
|
await page.fill('#name', 'E2E-Darlehen')
|
||||||
await page.fill('#darlehensbetrag', '100000')
|
await page.fill('#darlehensbetrag', '100000')
|
||||||
|
|
@ -314,10 +316,11 @@ test.describe('Module der Phasen 4 bis 7', () => {
|
||||||
|
|
||||||
test('Regelmäßige Buchungen werden per Klick bearbeitbar', async ({ page }) => {
|
test('Regelmäßige Buchungen werden per Klick bearbeitbar', async ({ page }) => {
|
||||||
await page.goto('/termine')
|
await page.goto('/termine')
|
||||||
|
await page.click('#neu-knopf')
|
||||||
await page.fill('#name', 'E2E-Reihe')
|
await page.fill('#name', 'E2E-Reihe')
|
||||||
await page.fill('#neu_betrag', '-12,50')
|
await page.fill('#neu_betrag', '-12,50')
|
||||||
await page.fill('#neu_buchungstext', 'E2E-Text')
|
await page.fill('#neu_buchungstext', 'E2E-Text')
|
||||||
await page.click('form[action="/termine/neu"] button[type="submit"]')
|
await page.click('form[action="/termine/neu"] button.primaer')
|
||||||
|
|
||||||
const zeile = page.locator('table.reihen tr', { hasText: 'E2E-Reihe' })
|
const zeile = page.locator('table.reihen tr', { hasText: 'E2E-Reihe' })
|
||||||
await expect(zeile.locator('input[name="betrag"]')).toBeHidden()
|
await expect(zeile.locator('input[name="betrag"]')).toBeHidden()
|
||||||
|
|
@ -398,6 +401,7 @@ test.describe('Module der Phasen 4 bis 7', () => {
|
||||||
|
|
||||||
// Erst eine Adresse anlegen, damit die Auswahl etwas zu bieten hat.
|
// Erst eine Adresse anlegen, damit die Auswahl etwas zu bieten hat.
|
||||||
await page.goto('/vertraege/adressen')
|
await page.goto('/vertraege/adressen')
|
||||||
|
await page.click('#neu-knopf')
|
||||||
await page.fill('#name', empfaenger)
|
await page.fill('#name', empfaenger)
|
||||||
await page.fill('#iban', 'DE02120300000000202051')
|
await page.fill('#iban', 'DE02120300000000202051')
|
||||||
await page.click('button:has-text("Adresse anlegen")')
|
await page.click('button:has-text("Adresse anlegen")')
|
||||||
|
|
|
||||||
60
tests/e2e/specs/neudialog.spec.js
Normal file
60
tests/e2e/specs/neudialog.spec.js
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
// @ts-check
|
||||||
|
const { test, expect } = require('@playwright/test')
|
||||||
|
|
||||||
|
const BENUTZER = process.env.E2E_USER || 'e2e'
|
||||||
|
const PASSWORT = process.env.E2E_PASSWORD || 'e2e-testpasswort'
|
||||||
|
const MARKE = Date.now().toString().slice(-6)
|
||||||
|
|
||||||
|
// Alle Listenansichten, in denen „+ Neu“ ein modales Formular zur Neuanlage öffnet.
|
||||||
|
const ANSICHTEN = [
|
||||||
|
'/verwaltung/klassen',
|
||||||
|
'/vorlagen',
|
||||||
|
'/termine',
|
||||||
|
'/termine/erinnerungen',
|
||||||
|
'/vertraege',
|
||||||
|
'/vertraege/adressen',
|
||||||
|
'/vertraege/sparziele',
|
||||||
|
'/vertraege/kredite',
|
||||||
|
'/banking/regeln',
|
||||||
|
'/planung/budget/verwaltung',
|
||||||
|
'/auswertungen/gruppen',
|
||||||
|
]
|
||||||
|
|
||||||
|
async function anmelden(page) {
|
||||||
|
await page.goto('/login')
|
||||||
|
await page.fill('#benutzername', BENUTZER)
|
||||||
|
await page.fill('#passwort', PASSWORT)
|
||||||
|
await page.click('button[type="submit"]')
|
||||||
|
await expect(page).toHaveURL(/\/$/)
|
||||||
|
}
|
||||||
|
|
||||||
|
test.describe('„+ Neu“ öffnet den Dialog zur Neuanlage', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await anmelden(page)
|
||||||
|
})
|
||||||
|
|
||||||
|
for (const pfad of ANSICHTEN) {
|
||||||
|
test(`${pfad}: Dialog erst nach Klick, Abbrechen schließt ihn`, async ({ page }) => {
|
||||||
|
await page.goto(pfad)
|
||||||
|
|
||||||
|
await expect(page.locator('#neudialog')).toBeHidden()
|
||||||
|
await page.click('#neu-knopf')
|
||||||
|
await expect(page.locator('#neudialog')).toBeVisible()
|
||||||
|
|
||||||
|
await page.locator('#neudialog button', { hasText: 'Abbrechen' }).click()
|
||||||
|
await expect(page.locator('#neudialog')).toBeHidden()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
test('Klasse anlegen: Dialog verschwindet, Eintrag steht in der Liste', async ({ page }) => {
|
||||||
|
const name = `E2E Dialogklasse ${MARKE}`
|
||||||
|
|
||||||
|
await page.goto('/verwaltung/klassen')
|
||||||
|
await page.click('#neu-knopf')
|
||||||
|
await page.fill('#neudialog #name', name)
|
||||||
|
await page.locator('#neudialog button[type="submit"]', { hasText: 'Klasse anlegen' }).click()
|
||||||
|
|
||||||
|
await expect(page.locator('#neudialog')).toBeHidden()
|
||||||
|
await expect(page.locator(`input[value="${name}"]`).first()).toBeVisible()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
@ -35,6 +35,7 @@ async function anmelden(page) {
|
||||||
*/
|
*/
|
||||||
async function budgetAnlegen(page, name) {
|
async function budgetAnlegen(page, name) {
|
||||||
await page.goto('/planung/budget/verwaltung')
|
await page.goto('/planung/budget/verwaltung')
|
||||||
|
await page.click('#neu-knopf')
|
||||||
await page.fill('#name', name)
|
await page.fill('#name', name)
|
||||||
await page.fill('#jahr', String(JAHR))
|
await page.fill('#jahr', String(JAHR))
|
||||||
await page.click('.formular button:has-text("Budget anlegen")')
|
await page.click('.formular button:has-text("Budget anlegen")')
|
||||||
|
|
|
||||||
|
|
@ -163,9 +163,10 @@ test.describe('Stammdaten', () => {
|
||||||
const name = `E2E Projekt ${MARKE}`
|
const name = `E2E Projekt ${MARKE}`
|
||||||
|
|
||||||
await page.goto('/verwaltung/klassen')
|
await page.goto('/verwaltung/klassen')
|
||||||
|
await page.click('#neu-knopf')
|
||||||
await page.fill('.formular #name', name)
|
await page.fill('.formular #name', name)
|
||||||
await page.fill('.formular #beschreibung', 'aus dem E2E-Test')
|
await page.fill('.formular #beschreibung', 'aus dem E2E-Test')
|
||||||
await page.click('.formular button[type="submit"]')
|
await page.click('.formular button:has-text("Klasse anlegen")')
|
||||||
|
|
||||||
await expect(page.locator('.meldung-erfolg')).toBeVisible()
|
await expect(page.locator('.meldung-erfolg')).toBeVisible()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue