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:
2026-04-08 22:58:36 +02:00
parent da7afec9d7
commit d91d88855e
2 changed files with 113 additions and 0 deletions
@@ -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);
@@ -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);