Add Bewerb extensions and related infrastructure: introduce V5 and V6 migrations with new columns, constraints, indexes, and tables (e.g., Austragungsplatz, RichterEinsätze, TurnierArtikel) to support extended domain models and reporting capabilities.
This commit is contained in:
+105
@@ -0,0 +1,105 @@
|
|||||||
|
-- V5: Bewerb-Details, Zeitplan, Finanzen, Richter-Einsätze, Austragungsplätze, Turnier-Artikel
|
||||||
|
-- Context: Phase 3 – Persistenz für die in Phase 2 erweiterten Domain-Modelle
|
||||||
|
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
-- 1. bewerbe: neue Spalten (Text & Details, Ort, Zeitplan, Finanzen)
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
ALTER TABLE bewerbe
|
||||||
|
ADD COLUMN IF NOT EXISTS beschreibung TEXT NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS aufgabe VARCHAR(100) NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS aufgaben_nummer VARCHAR(50) NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS para_grade VARCHAR(50) NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS austragungsplatz_id UUID NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS geplantes_datum DATE NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS beginn_zeit_typ VARCHAR(20) NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS beginn_zeit TIME NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS reitdauer_minuten INTEGER NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS umbau_minuten INTEGER NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS besichtigung_minuten INTEGER NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS stechen_geplant BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
|
ADD COLUMN IF NOT EXISTS startgeld_cent BIGINT NULL,
|
||||||
|
ADD COLUMN IF NOT EXISTS geldpreis_ausbezahlt BOOLEAN NOT NULL DEFAULT FALSE;
|
||||||
|
|
||||||
|
-- Check-Constraint für beginn_zeit_typ (PostgreSQL unterstützt kein IF NOT EXISTS für Constraints)
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (
|
||||||
|
SELECT 1 FROM pg_constraint WHERE conname = 'chk_bewerbe_beginn_zeit_typ'
|
||||||
|
) THEN
|
||||||
|
ALTER TABLE bewerbe
|
||||||
|
ADD CONSTRAINT chk_bewerbe_beginn_zeit_typ
|
||||||
|
CHECK (beginn_zeit_typ IN ('FIX', 'ANSCHLIESSEND'));
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
-- 2. abteilungen: CHECK-Constraint um MANUELL erweitern
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
ALTER TABLE abteilungen DROP CONSTRAINT IF EXISTS chk_abteilungen_typ;
|
||||||
|
ALTER TABLE abteilungen
|
||||||
|
ADD CONSTRAINT chk_abteilungen_typ
|
||||||
|
CHECK (typ IN ('SEPARATE_SIEGEREHRUNG', 'ORGANISATORISCH', 'MANUELL'));
|
||||||
|
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
-- 3. austragungsplaetze – physische Orte innerhalb einer Veranstaltung
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS austragungsplaetze (
|
||||||
|
id UUID PRIMARY KEY,
|
||||||
|
name VARCHAR(200) NOT NULL,
|
||||||
|
typ VARCHAR(50) NOT NULL,
|
||||||
|
sparte VARCHAR(50) NULL,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||||
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||||
|
CONSTRAINT chk_austragungsplaetze_typ
|
||||||
|
CHECK (typ IN ('Austragungsplatz', 'Vorbereitungsplatz'))
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_austragungsplaetze_typ ON austragungsplaetze(typ);
|
||||||
|
|
||||||
|
-- Foreign Key von bewerbe → austragungsplaetze (nullable)
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (
|
||||||
|
SELECT 1 FROM pg_constraint WHERE conname = 'fk_bewerbe_austragungsplatz'
|
||||||
|
) THEN
|
||||||
|
ALTER TABLE bewerbe
|
||||||
|
ADD CONSTRAINT fk_bewerbe_austragungsplatz
|
||||||
|
FOREIGN KEY (austragungsplatz_id) REFERENCES austragungsplaetze(id) ON DELETE SET NULL;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
-- 4. bewerb_richter_einsaetze – 1:N Richter-Einsätze pro Bewerb
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS bewerb_richter_einsaetze (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
bewerb_id UUID NOT NULL REFERENCES bewerbe(id) ON DELETE CASCADE,
|
||||||
|
funktionaer_id UUID NOT NULL,
|
||||||
|
position VARCHAR(100) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_richter_einsaetze_bewerb_id ON bewerb_richter_einsaetze(bewerb_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_richter_einsaetze_funktionaer ON bewerb_richter_einsaetze(funktionaer_id);
|
||||||
|
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
-- 5. turnier_artikel – abrechenbare Leistungen/Produkte (Billing Context)
|
||||||
|
-- ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS turnier_artikel (
|
||||||
|
id UUID PRIMARY KEY,
|
||||||
|
turnier_id UUID NOT NULL REFERENCES turniere(id) ON DELETE CASCADE,
|
||||||
|
name VARCHAR(200) NOT NULL,
|
||||||
|
preis_cent BIGINT NOT NULL DEFAULT 0,
|
||||||
|
typ VARCHAR(20) NOT NULL,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||||
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||||
|
CONSTRAINT chk_turnier_artikel_typ
|
||||||
|
CHECK (typ IN ('AUTOMATISCH', 'MANUELL'))
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_turnier_artikel_turnier_id ON turnier_artikel(turnier_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_turnier_artikel_typ ON turnier_artikel(typ);
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
-- V6: Bewerb – Teilungs-Typ (AbteilungsTeilungsTypE)
|
||||||
|
|
||||||
|
-- Neue optionale Spalte in bewerbe für die Abteilungs-Teilungsregel
|
||||||
|
ALTER TABLE bewerbe
|
||||||
|
ADD COLUMN IF NOT EXISTS teilungs_typ VARCHAR(50) NULL;
|
||||||
|
|
||||||
|
-- Optional: Index für Filter/Reporting
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_bewerbe_teilungstyp ON bewerbe(teilungs_typ);
|
||||||
Reference in New Issue
Block a user