Konten, Kontengruppen, Kategorien und Klassen samt Übernahme aus dem
QIF-Export des Lexware FinanzManagers.
Kontenübersicht nach Kontengruppen gebündelt, mit Gruppensummen und
Gesamtsumme; die drei Saldospalten (Online-Saldo, aktueller und erwarteter
Saldo) sind angelegt und werden bis Phase 2 aus dem Anfangssaldo gespeist.
Kategorien sind hierarchisch mit ":" als Trenner. Der vollständige Pfad
steht redundant in der Tabelle, weil jede Anzeige und der gesamte Import
darüber laufen; Umbenennen und Verschieben schreiben den Teilbaum neu. Die
Art (Einnahme/Ausgabe) gilt für den ganzen Ast. Register wie im Original:
Alle, Einnahmen, Ausgaben, Umbuchungskonten.
QifParser liest zustandsbehaftet und sequenziell, wandelt ISO-8859-1 nach
UTF-8 und versteht US-Beträge sowie das Datumsformat aus der Kopfzeile.
QifStammdatenImport ist idempotent und bietet Trockenlauf und Protokoll -
im Dialog unter Verwaltung sowie über scripts/qif-import.php. Am echten
Export geprüft: 17 Klassen, 105 Kategorien, 37 Konten.
Enthält außerdem die Korrektur der englischen Monatsnamen im
Einstellungsdialog: date('F') ist sprachlich nicht umschaltbar, deshalb
liegen die Namen jetzt zentral als View::MONATE vor. Die Änderung ließ
sich nicht als eigener Commit trennen, weil sie dieselben Dateien berührt
wie Phase 1.
Tests: 227 PHP-Prüfungen und 14 Playwright-Tests, alle grün.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
88 lines
4.3 KiB
SQL
88 lines
4.3 KiB
SQL
-- Phase 1: Stammdaten – Kontengruppen, Konten, Kategorien, Klassen.
|
||
--
|
||
-- Alle Kernobjekte führen benutzer_id, auch wenn die Oberfläche vorerst
|
||
-- einbenutzerig ist (siehe PLAN.md, Kapitel 3).
|
||
|
||
CREATE TABLE IF NOT EXISTS kontengruppen (
|
||
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||
benutzer_id INT UNSIGNED NOT NULL,
|
||
name VARCHAR(128) NOT NULL,
|
||
beschreibung VARCHAR(255) NOT NULL DEFAULT '',
|
||
sortierung INT NOT NULL DEFAULT 0,
|
||
erstellt_am DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uq_kontengruppe (benutzer_id, name),
|
||
CONSTRAINT fk_kontengruppe_benutzer FOREIGN KEY (benutzer_id)
|
||
REFERENCES benutzer (id) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
||
-- kontoart entspricht den Kontoarten des FinanzManagers; die Zuordnung zu den
|
||
-- QIF-Typen (Bank, CCard, Oth A …) steht in Konto::QIF_ARTEN.
|
||
CREATE TABLE IF NOT EXISTS konten (
|
||
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||
benutzer_id INT UNSIGNED NOT NULL,
|
||
kontengruppe_id INT UNSIGNED NULL,
|
||
name VARCHAR(128) NOT NULL,
|
||
kontoart VARCHAR(32) NOT NULL DEFAULT 'bank',
|
||
bankname VARCHAR(128) NOT NULL DEFAULT '',
|
||
kontonummer VARCHAR(64) NOT NULL DEFAULT '',
|
||
iban VARCHAR(34) NOT NULL DEFAULT '',
|
||
bic VARCHAR(11) NOT NULL DEFAULT '',
|
||
beschreibung VARCHAR(255) NOT NULL DEFAULT '',
|
||
anfangssaldo DECIMAL(15,2) NOT NULL DEFAULT 0.00,
|
||
kreditlimit DECIMAL(15,2) NULL,
|
||
waehrung CHAR(3) NOT NULL DEFAULT 'EUR',
|
||
aktiv TINYINT(1) NOT NULL DEFAULT 1,
|
||
sortierung INT NOT NULL DEFAULT 0,
|
||
erstellt_am DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uq_konto (benutzer_id, name),
|
||
KEY idx_konto_gruppe (kontengruppe_id),
|
||
CONSTRAINT fk_konto_benutzer FOREIGN KEY (benutzer_id)
|
||
REFERENCES benutzer (id) ON DELETE CASCADE,
|
||
CONSTRAINT fk_konto_gruppe FOREIGN KEY (kontengruppe_id)
|
||
REFERENCES kontengruppen (id) ON DELETE SET NULL
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
||
-- Kategorien sind hierarchisch. "name" ist nur der Blattname, "pfad" der
|
||
-- vollständige Name mit ":" als Trenner ("400 - Leben:B-Essen alleine") – er
|
||
-- wird beim Anlegen und Verschieben mitgepflegt, weil praktisch jede Anzeige
|
||
-- und der gesamte QIF-Import darüber laufen.
|
||
CREATE TABLE IF NOT EXISTS kategorien (
|
||
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||
benutzer_id INT UNSIGNED NOT NULL,
|
||
eltern_id INT UNSIGNED NULL,
|
||
name VARCHAR(128) NOT NULL,
|
||
pfad VARCHAR(512) NOT NULL,
|
||
art ENUM('einnahme','ausgabe') NOT NULL DEFAULT 'ausgabe',
|
||
steuerrelevant TINYINT(1) NOT NULL DEFAULT 0,
|
||
steuerformular VARCHAR(32) NOT NULL DEFAULT '',
|
||
beschreibung VARCHAR(255) NOT NULL DEFAULT '',
|
||
aktiv TINYINT(1) NOT NULL DEFAULT 1,
|
||
sortierung INT NOT NULL DEFAULT 0,
|
||
erstellt_am DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uq_kategorie_pfad (benutzer_id, pfad),
|
||
KEY idx_kategorie_eltern (eltern_id),
|
||
CONSTRAINT fk_kategorie_benutzer FOREIGN KEY (benutzer_id)
|
||
REFERENCES benutzer (id) ON DELETE CASCADE,
|
||
CONSTRAINT fk_kategorie_eltern FOREIGN KEY (eltern_id)
|
||
REFERENCES kategorien (id) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
||
CREATE TABLE IF NOT EXISTS klassen (
|
||
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||
benutzer_id INT UNSIGNED NOT NULL,
|
||
name VARCHAR(128) NOT NULL,
|
||
beschreibung VARCHAR(255) NOT NULL DEFAULT '',
|
||
aktiv TINYINT(1) NOT NULL DEFAULT 1,
|
||
erstellt_am DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uq_klasse (benutzer_id, name),
|
||
CONSTRAINT fk_klasse_benutzer FOREIGN KEY (benutzer_id)
|
||
REFERENCES benutzer (id) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
||
INSERT INTO einstellungen (schluessel, wert, bereich) VALUES
|
||
('import_qif_verzeichnis', 'data/import', 'import')
|
||
ON DUPLICATE KEY UPDATE schluessel = schluessel;
|