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