Finanzmanager/migrations/005_berichte.sql
fds2610-bot 90bba06585 Phase 4: Auswertungen mit Berichtsmodul
Fünf Berichtstypen wie im FinanzManager – Summen-, Buchungs-, Vergleichs-,
Kontostands- und Budgetbericht – mit Filterleiste, gespeicherten Berichten in
Berichtsgruppen, Drilldown in die Buchungen und CSV-Export.

Ein Bericht speichert nur seine Frage; die Zahlen entstehen bei jedem Aufruf neu
aus den Buchungen. Gezählt werden Bewegungen (gesplittete Buchungen über ihre
Splitzeilen), Umbuchungen bleiben außen vor, Unkategorisiertes bekommt eine
eigene Zeile. Im Ausgabenabschnitt steht der Betrag ohne Minus wie im Original,
die Schlusszeile rechnet mit den echten Vorzeichen.

Einzelheiten in docs/auswertungen.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 17:38:30 +02:00

52 lines
2.7 KiB
SQL
Raw Permalink 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.

-- Phase 4: Auswertungen.
--
-- Ein gespeicherter Bericht ist ein Name plus die Einstellungen der Filterleiste
-- (Berichtstyp, Zeitraum, Zeilen-Summe, Spalten-Aufteilung, Einschränkung auf
-- Konten/Kategorien/Klassen). Berichtsgruppen bündeln sie zu Kacheln, wie im
-- FinanzManager unter „Bankgeschäfte“, „Planung“ oder „Steuern“.
CREATE TABLE IF NOT EXISTS berichtsgruppen (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
benutzer_id INT UNSIGNED NOT NULL,
name VARCHAR(120) NOT NULL,
sortierung INT NOT NULL DEFAULT 0,
erstellt_am DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_berichtsgruppe_name (benutzer_id, name),
CONSTRAINT fk_berichtsgruppe_benutzer FOREIGN KEY (benutzer_id)
REFERENCES benutzer (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Die Filtereinstellungen stehen als JSON in einer einzigen Spalte, nicht als
-- eigene Spalten je Feld: Sie sind reine Anzeigeparameter ohne Fremdschlüssel
-- und ohne Abfragen darauf, und jede neue Filtermöglichkeit bräuchte sonst eine
-- Migration. Auswertung::normalisiere() prüft den Inhalt beim Lesen – ein Feld,
-- das dort nicht vorgesehen ist, wird verworfen.
CREATE TABLE IF NOT EXISTS berichte (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
benutzer_id INT UNSIGNED NOT NULL,
gruppe_id INT UNSIGNED NULL,
name VARCHAR(120) NOT NULL,
typ VARCHAR(30) NOT NULL DEFAULT 'summenbericht',
filter LONGTEXT NULL,
sortierung INT NOT NULL DEFAULT 0,
zuletzt_am DATETIME NULL,
erstellt_am DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
geaendert_am DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_bericht_name (benutzer_id, name),
KEY idx_bericht_gruppe (gruppe_id),
-- Zuletzt geöffnete Berichte stehen in der Übersicht obenauf.
KEY idx_bericht_zuletzt (benutzer_id, zuletzt_am),
CONSTRAINT fk_bericht_benutzer FOREIGN KEY (benutzer_id)
REFERENCES benutzer (id) ON DELETE CASCADE,
-- Wird eine Gruppe gelöscht, bleiben ihre Berichte erhalten und rücken in
-- die Kachel „Nicht gruppiert“ – ein Bericht ist Arbeit, eine Gruppe nicht.
CONSTRAINT fk_bericht_gruppe FOREIGN KEY (gruppe_id)
REFERENCES berichtsgruppen (id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Keine neuen Einstellungen: Zeitraum, Zeilen-Summe und Einrückung sind keine
-- Programmvorgaben, sondern gehören zum einzelnen Bericht und stehen deshalb in
-- dessen Filter-JSON. Im Einstellungsdialog wären sie ein Wert, den niemand
-- bedient.