antragsideen-hagen/data/schema.sql
Dotty Dotter 34d5671997 Initial commit: Antragsideen-App Skeleton
- Backend (FastAPI)
- Frontend
- Docker Compose
- README
2026-03-30 23:49:13 +02:00

193 lines
5.8 KiB
SQL

-- ============================================
-- ANTRAGSIDEEN HAGEN - Relationales Schema
-- Version: 2.0
-- Erstellt: 2026-03-06
-- ============================================
PRAGMA foreign_keys = ON;
-- ============================================
-- STAMMDATEN
-- ============================================
CREATE TABLE IF NOT EXISTS prioritaeten (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
reihenfolge INTEGER,
farbe TEXT
);
CREATE TABLE IF NOT EXISTS status_typen (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
reihenfolge INTEGER,
farbe TEXT
);
CREATE TABLE IF NOT EXISTS bereiche (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
kuerzel TEXT,
farbe TEXT,
icon TEXT
);
CREATE TABLE IF NOT EXISTS ausschuesse (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
kuerzel TEXT,
farbe TEXT
);
CREATE TABLE IF NOT EXISTS personen (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
rolle TEXT,
email TEXT,
telefon TEXT
);
-- ============================================
-- HAUPTTABELLE
-- ============================================
CREATE TABLE IF NOT EXISTS antraege (
id INTEGER PRIMARY KEY,
titel TEXT NOT NULL,
kurzbeschreibung TEXT,
prioritaet_id INTEGER REFERENCES prioritaeten(id),
status_id INTEGER REFERENCES status_typen(id),
bereich_id INTEGER REFERENCES bereiche(id),
dossier TEXT,
antragstext TEXT,
omnifocus_projekt TEXT,
referenzen TEXT,
kontakte TEXT,
notizen TEXT,
allris_referenzen TEXT,
position_x REAL,
position_y REAL,
erstellt_am DATE DEFAULT (date('now')),
aktualisiert_am DATE DEFAULT (date('now'))
);
-- ============================================
-- VERKNÜPFUNGEN
-- ============================================
CREATE TABLE IF NOT EXISTS antrag_ausschuesse (
antrag_id INTEGER REFERENCES antraege(id) ON DELETE CASCADE,
ausschuss_id INTEGER REFERENCES ausschuesse(id) ON DELETE CASCADE,
ist_federfuehrend INTEGER DEFAULT 0,
PRIMARY KEY (antrag_id, ausschuss_id)
);
CREATE TABLE IF NOT EXISTS antrag_personen (
antrag_id INTEGER REFERENCES antraege(id) ON DELETE CASCADE,
person_id INTEGER REFERENCES personen(id) ON DELETE CASCADE,
rolle TEXT,
PRIMARY KEY (antrag_id, person_id)
);
CREATE TABLE IF NOT EXISTS verbindungen (
id INTEGER PRIMARY KEY,
von_antrag_id INTEGER REFERENCES antraege(id) ON DELETE CASCADE,
nach_antrag_id INTEGER REFERENCES antraege(id) ON DELETE CASCADE,
typ TEXT CHECK(typ IN ('manuell', 'thematisch', 'abhaengig', 'siehe_auch')),
gewicht INTEGER DEFAULT 1,
notiz TEXT,
erstellt_am DATE DEFAULT (date('now')),
UNIQUE(von_antrag_id, nach_antrag_id)
);
-- ============================================
-- KOMMUNIKATION
-- ============================================
CREATE TABLE IF NOT EXISTS kommunikation (
id INTEGER PRIMARY KEY,
antrag_id INTEGER REFERENCES antraege(id) ON DELETE CASCADE,
typ TEXT CHECK(typ IN ('Pressemitteilung', 'Instagram', 'Facebook', 'Twitter', 'Website')),
titel TEXT NOT NULL,
inhalt TEXT,
zielgruppe TEXT,
status TEXT CHECK(status IN ('Entwurf', 'Review', 'Freigegeben', 'Veröffentlicht')),
erstellt_am DATE DEFAULT (date('now')),
veroeffentlicht_am DATE
);
-- ============================================
-- VIEW-KONFIGURATIONEN
-- ============================================
CREATE TABLE IF NOT EXISTS view_configs (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
typ TEXT CHECK(typ IN ('graph', 'table', 'kanban', 'timeline')),
config TEXT,
ist_default INTEGER DEFAULT 0,
erstellt_am DATE DEFAULT (date('now'))
);
-- ============================================
-- INDIZES
-- ============================================
CREATE INDEX IF NOT EXISTS idx_antraege_prioritaet ON antraege(prioritaet_id);
CREATE INDEX IF NOT EXISTS idx_antraege_status ON antraege(status_id);
CREATE INDEX IF NOT EXISTS idx_antraege_bereich ON antraege(bereich_id);
CREATE INDEX IF NOT EXISTS idx_verbindungen_von ON verbindungen(von_antrag_id);
CREATE INDEX IF NOT EXISTS idx_verbindungen_nach ON verbindungen(nach_antrag_id);
CREATE INDEX IF NOT EXISTS idx_kommunikation_antrag ON kommunikation(antrag_id);
-- ============================================
-- STAMMDATEN EINFÜGEN
-- ============================================
INSERT OR IGNORE INTO prioritaeten (id, name, reihenfolge, farbe) VALUES
(1, 'Hoch', 1, '#E53935'),
(2, 'Mittel', 2, '#FB8C00'),
(3, 'Niedrig', 3, '#43A047'),
(4, 'Abgeschlossen', 4, '#78909C');
INSERT OR IGNORE INTO status_typen (id, name, reihenfolge, farbe) VALUES
(1, 'Ideenspeicher', 1, '#90CAF9'),
(2, 'Recherche', 2, '#FFF59D'),
(3, 'Entwurf', 3, '#FFCC80'),
(4, 'Eingereicht', 4, '#A5D6A7'),
(5, 'Beschlossen', 5, '#81C784'),
(6, 'Abgelehnt', 6, '#EF9A9A'),
(7, 'Abgeschlossen', 7, '#B0BEC5');
INSERT OR IGNORE INTO bereiche (id, name, kuerzel, farbe, icon) VALUES
(1, 'Umwelt', 'UMW', '#4CAF50', '🌿'),
(2, 'Infra', 'INF', '#2196F3', '🚗'),
(3, 'HFA', 'HFA', '#FFC107', '💰'),
(4, 'Soziales', 'SOZ', '#E91E63', '🤝'),
(5, 'Stadt', 'STD', '#9C27B0', '🏙️'),
(6, 'Wirtschaft', 'WIR', '#FF5722', '💼');
INSERT OR IGNORE INTO ausschuesse (id, name, kuerzel) VALUES
(1, 'Umweltausschuss', 'UKM'),
(2, 'Infrastrukturausschuss', 'IFA'),
(3, 'Haupt- und Finanzausschuss', 'HFA'),
(4, 'Stadtentwicklungsausschuss', 'STA'),
(5, 'Sozialausschuss', 'SOZ'),
(6, 'Wirtschaftsausschuss', 'WIA'),
(7, 'Sport- und Freizeitausschuss', 'SPO'),
(8, 'Schulausschuss', 'SCH'),
(9, 'Ausschuss für Bürgerbeteiligung', 'BÜR');
INSERT OR IGNORE INTO personen (id, name, rolle) VALUES
(1, 'Rüdiger Ludwig', 'Vorsitz Umweltausschuss'),
(2, 'Heike Heuer', 'Infrastruktur'),
(3, 'Jörg Fritzsche', 'HFA / Digitales'),
(4, 'Karin Köppen', 'Soziales'),
(5, 'Daniel Adam', 'Bürgerbeteiligung'),
(6, 'Nicole Pfefferer', 'Schule');