From d91d88855e37b325e6298add16c2b96cf9be479d Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Wed, 8 Apr 2026 22:58:36 +0200 Subject: [PATCH] =?UTF-8?q?Add=20Bewerb=20extensions=20and=20related=20inf?= =?UTF-8?q?rastructure:=20introduce=20V5=20and=20V6=20migrations=20with=20?= =?UTF-8?q?new=20columns,=20constraints,=20indexes,=20and=20tables=20(e.g.?= =?UTF-8?q?,=20Austragungsplatz,=20RichterEins=C3=A4tze,=20TurnierArtikel)?= =?UTF-8?q?=20to=20support=20extended=20domain=20models=20and=20reporting?= =?UTF-8?q?=20capabilities.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._add_bewerb_details_and_infrastructure.sql | 105 ++++++++++++++++++ .../db/tenant/V6__add_bewerb_teilungstyp.sql | 8 ++ 2 files changed, 113 insertions(+) create mode 100644 backend/services/entries/entries-service/src/main/resources/db/tenant/V5__add_bewerb_details_and_infrastructure.sql create mode 100644 backend/services/entries/entries-service/src/main/resources/db/tenant/V6__add_bewerb_teilungstyp.sql diff --git a/backend/services/entries/entries-service/src/main/resources/db/tenant/V5__add_bewerb_details_and_infrastructure.sql b/backend/services/entries/entries-service/src/main/resources/db/tenant/V5__add_bewerb_details_and_infrastructure.sql new file mode 100644 index 00000000..60a9763c --- /dev/null +++ b/backend/services/entries/entries-service/src/main/resources/db/tenant/V5__add_bewerb_details_and_infrastructure.sql @@ -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); diff --git a/backend/services/entries/entries-service/src/main/resources/db/tenant/V6__add_bewerb_teilungstyp.sql b/backend/services/entries/entries-service/src/main/resources/db/tenant/V6__add_bewerb_teilungstyp.sql new file mode 100644 index 00000000..8010a96a --- /dev/null +++ b/backend/services/entries/entries-service/src/main/resources/db/tenant/V6__add_bewerb_teilungstyp.sql @@ -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);