Budgetplaner mit Monatswerten je Kategorie, Monatsabschluss mit Prüflauf, Snapshot und Buchungssperre. Dazu drei Vorarbeiten in der Oberfläche. Budgetplaner - Migration 004: budgets, budget_positionen, monatsabschluesse - Zeilen sind der Kategoriebaum, Spalten die Monate; die ganze Tabelle wird in einem Formular gespeichert, damit mehrere Änderungen zusammen ankommen - Zwei Ansichten: Verlauf (Jahressumme, abgelaufene Monate zusammengefasst, laufender Monat mit Budget/Ist/Saldo, danach Folgemonate) und alle Monate - Ausgaben ohne Vorzeichen eingeben, es kommt aus der Kategorieart. Saldo ist Ist minus Budget: positiv heißt besser als geplant, negativ ist die Überschreitung und wird rot ausgewiesen - Übergeordnete Kategorien summieren ihre Nachfahren und sind nicht beplanbar - Ein Monat ohne Position ist "nicht geplant" und damit etwas anderes als "mit 0,00 geplant" - Wert auf Folgemonate übertragen, Budget als Kopie ins neue Jahr Monatsabschluss - Prüflauf über nicht kategorisierte Buchungen, nicht abgeglichene Umsätze und Splitsummen-Differenzen; er hält niemanden auf, sondern zeigt den Stand - Snapshot der Kontosalden und Kategoriesummen als JSON, bleibt auch nach einer Wiedereröffnung stehen - Abgeschlossene Monate sperren Buchungen in beide Richtungen: weder hinein noch heraus verschieben. Abschaltbar über monatsabschluss_sperrt_buchungen Vorarbeiten - .knopf.primaer trug einen eigenen margin-top und stand dadurch in jeder Knopfleiste tiefer als seine Nachbarn - sichtbar an "Abbrechen" neben "Konto anlegen". Der Abstand liegt jetzt allein bei der Knopfleiste - Kontengruppen werden wie Konten und Kategorien auf einer eigenen Formularseite gepflegt statt inline; dort hängt auch die Zuordnung der Konten (ankreuzen statt jedes Konto einzeln zu öffnen) - Der QIF-Export enthält keine Kontengruppen: kein Feld im !Account-Eintrag, nichts in der QSD-Datei. Import-Oberfläche und Doku sagen das jetzt - Die Baum-Einrückung lief über ein style-Attribut und wurde von der Content-Security-Policy verworfen; sie steht jetzt als data-ebene im Markup. Aus demselben Grund blendete app.js Erfolgsmeldungen nie aus Tests: 11_BudgetTest, 12_MonatsabschlussTest (76 Prüfungen), E2E planung.spec.js. Einzelheiten in docs/planung.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
37 lines
1.3 KiB
PHP
37 lines
1.3 KiB
PHP
<?php
|
|
|
|
use Finanzmanager\View;
|
|
|
|
/** @var array<string,mixed> $budget */
|
|
/** @var string $csrfToken */
|
|
|
|
include __DIR__ . '/../layout/kopf.php';
|
|
?>
|
|
|
|
<div class="seitenaktionen">
|
|
<a href="/planung/budget/verwaltung" class="knopf">Zurück zu den Budgets</a>
|
|
</div>
|
|
|
|
<form method="post" action="/planung/budget/<?= (int)$budget['id'] ?>/bearbeiten" class="formular breit">
|
|
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
|
|
|
<label for="name">Name</label>
|
|
<input type="text" id="name" name="name" value="<?= View::h($budget['name']) ?>" required autofocus>
|
|
|
|
<label for="jahr">Jahr</label>
|
|
<input type="number" id="jahr" name="jahr" value="<?= (int)$budget['jahr'] ?>" step="1" required>
|
|
<p class="feldhinweis">
|
|
Das Jahr bestimmt, aus welchen Buchungen die Ist-Werte kommen. Die geplanten
|
|
Monatswerte bleiben beim Wechsel erhalten.
|
|
</p>
|
|
|
|
<label for="beschreibung">Beschreibung <span class="optional">(optional)</span></label>
|
|
<input type="text" id="beschreibung" name="beschreibung" value="<?= View::h($budget['beschreibung']) ?>">
|
|
|
|
<div class="knopfleiste">
|
|
<button type="submit" class="knopf primaer">Speichern</button>
|
|
<a href="/planung/budget/verwaltung" class="knopf">Abbrechen</a>
|
|
</div>
|
|
</form>
|
|
|
|
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|