feat: integrate new desktop shell and extend backend & ADRs

- Added `meldestelle-desktop` module using JVM/Compose Desktop, registered in `settings.gradle.kts`.
- Integrated new screens and desktop navigation into core: `Veranstaltungen`, `TurnierDetail`, etc.
- Expanded backend with `ExposedFunktionaerRepository` in `officials-infrastructure`.
- Completed ADRs for bounded context mapping (`ADR-0014`) and context map (`ADR-0015`).
- Updated and extended project documentation with session logs and architecture decisions.

Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
2026-03-24 18:22:15 +01:00
parent c624df8744
commit 354bd49de6
75 changed files with 7616 additions and 48 deletions
@@ -0,0 +1,82 @@
-- Migration V001: Create Funktionaere (Officials) table
-- Speichert alle Funktionärs-Daten inkl. Rollen (JSON), Richterqualifikation
-- und Sparten-Qualifikationen (JSON) gemäß ÖTO-Anforderungen.
CREATE TABLE IF NOT EXISTS funktionaere
(
id
UUID
PRIMARY
KEY
DEFAULT
gen_random_uuid
(
),
richter_nummer VARCHAR
(
50
),
vorname VARCHAR
(
100
) NOT NULL,
nachname VARCHAR
(
100
) NOT NULL,
geburtsdatum DATE,
rollen TEXT NOT NULL DEFAULT '[]',
richter_qualifikation VARCHAR
(
50
),
qualifiziert_fuer_sparten TEXT NOT NULL DEFAULT '[]',
email VARCHAR
(
255
),
telefon VARCHAR
(
50
),
vereins_nummer VARCHAR
(
20
),
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
bemerkungen TEXT,
daten_quelle VARCHAR
(
50
) NOT NULL DEFAULT 'MANUELL',
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Unique index für Richternummer (wenn gesetzt)
CREATE UNIQUE INDEX IF NOT EXISTS uk_funktionaere_richter_nummer
ON funktionaere(richter_nummer)
WHERE richter_nummer IS NOT NULL;
-- Performance-Indizes
CREATE INDEX IF NOT EXISTS idx_funktionaere_nachname ON funktionaere(nachname);
CREATE INDEX IF NOT EXISTS idx_funktionaere_vorname ON funktionaere(vorname);
CREATE INDEX IF NOT EXISTS idx_funktionaere_vereins_nummer ON funktionaere(vereins_nummer);
CREATE INDEX IF NOT EXISTS idx_funktionaere_ist_aktiv ON funktionaere(ist_aktiv);
CREATE INDEX IF NOT EXISTS idx_funktionaere_richter_qual ON funktionaere(richter_qualifikation);
-- Dokumentation
COMMENT
ON TABLE funktionaere IS 'Funktionäre (Richter, Parcoursbauer, TBA, etc.) gemäß ÖTO-Regelwerk';
COMMENT
ON COLUMN funktionaere.id IS 'Eindeutige interne ID (UUID)';
COMMENT
ON COLUMN funktionaere.richter_nummer IS 'Offizielle OEPS-Richternummer (eindeutig, optional)';
COMMENT
ON COLUMN funktionaere.rollen IS 'JSON-Array der Funktionärs-Rollen (FunktionaerRolleE)';
COMMENT
ON COLUMN funktionaere.richter_qualifikation IS 'Richter-Qualifikationsstufe (RichterQualifikationE): GA, G1, G2, G3, INTERNATIONAL';
COMMENT
ON COLUMN funktionaere.qualifiziert_fuer_sparten IS 'JSON-Array der Sparten-Qualifikationen (SparteE)';
COMMENT
ON COLUMN funktionaere.daten_quelle IS 'Datenherkunft: MANUELL, IMPORT_ZNS, IMPORT_FEI';