-- 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.