feat(docs): expand masterdata documentation with Reiter- and Pferdeprüfungen

- Added `REITER_PRUEFUNGEN.md` and `PFERDEPRUEFUNGEN_BEWERTUNG.md` to document evaluation criteria, scoring logic, and system requirements for dressage and show jumping.
- Updated `README.md` with links to new documentation on rider- and horse-specific regulations.
- Created database schemas for `TurnierklasseTable`, `RichtverfahrenTable`, `GebuehrTable`, `LicenseTable`, and `RegulationConfigTable`, aligning with ÖTO 2026.
- Logged architectural decisions and analysis in `session-logs` and created ADRs `0017-masterdata-importer-worker` and `0019-api-ingestion-layers`.

Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
2026-03-30 14:29:55 +02:00
parent 6375ec23c3
commit e8757c5c32
29 changed files with 1663 additions and 18 deletions
@@ -37,7 +37,12 @@ class MasterdataDatabaseConfiguration {
ReiterTable,
HorseTable,
VereinTable,
FunktionaerTable
FunktionaerTable,
TurnierklasseTable,
LicenseTable,
RichtverfahrenTable,
GebuehrTable,
RegulationConfigTable
)
log.info("Masterdata database schema initialized successfully")
}
@@ -77,7 +82,12 @@ class MasterdataTestDatabaseConfiguration {
ReiterTable,
HorseTable,
VereinTable,
FunktionaerTable
FunktionaerTable,
TurnierklasseTable,
LicenseTable,
RichtverfahrenTable,
GebuehrTable,
RegulationConfigTable
)
log.info("Test masterdata database schema initialized successfully")
}
@@ -0,0 +1,148 @@
-- V005: Create Turnierklasse, License, Richtverfahren, Gebuehr, RegulationConfig Tables
-- Basierend auf ÖTO 2026 und ADR-0018
CREATE TABLE IF NOT EXISTS turnierklasse
(
turnierklasse_id
UUID
PRIMARY
KEY,
sparte
VARCHAR
(
20
) NOT NULL,
code VARCHAR
(
10
) NOT NULL,
bezeichnung VARCHAR
(
100
) NOT NULL,
max_hoehe INTEGER,
aufgaben_niveau VARCHAR
(
100
),
valid_from TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
valid_to TIMESTAMP WITH TIME ZONE,
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_turnierklasse_sparte_code ON turnierklasse (sparte, code);
CREATE TABLE IF NOT EXISTS license_matrix
(
license_id
UUID
PRIMARY
KEY,
sparte
VARCHAR
(
20
) NOT NULL,
lizenz_klasse VARCHAR
(
20
) NOT NULL,
max_turnierklasse_code VARCHAR
(
10
) NOT NULL,
valid_from TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
valid_to TIMESTAMP WITH TIME ZONE,
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_license_sparte_klasse ON license_matrix (sparte, lizenz_klasse);
CREATE TABLE IF NOT EXISTS richtverfahren
(
richtverfahren_id
UUID
PRIMARY
KEY,
sparte
VARCHAR
(
20
) NOT NULL,
code VARCHAR
(
10
) NOT NULL,
bezeichnung VARCHAR
(
200
) NOT NULL,
beschreibung TEXT,
valid_from TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
valid_to TIMESTAMP WITH TIME ZONE,
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_richtverfahren_sparte_code ON richtverfahren (sparte, code);
CREATE TABLE IF NOT EXISTS gebuehr
(
gebuehr_id
UUID
PRIMARY
KEY,
bezeichnung
VARCHAR
(
200
) NOT NULL,
typ VARCHAR
(
50
) NOT NULL,
betrag DECIMAL
(
10,
2
) NOT NULL,
waehrung VARCHAR
(
3
) NOT NULL DEFAULT 'EUR',
valid_from TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
valid_to TIMESTAMP WITH TIME ZONE,
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS regulation_config
(
config_id
UUID
PRIMARY
KEY,
config_key
VARCHAR
(
100
) NOT NULL,
config_value TEXT NOT NULL,
beschreibung VARCHAR
(
255
),
valid_from TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
valid_to TIMESTAMP WITH TIME ZONE,
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_regulation_config_key ON regulation_config (config_key);
@@ -0,0 +1,248 @@
-- V006: Missing Core Masterdata Tables (Reiter, Horse, Verein, Funktionaer)
-- Diese Tabellen wurden in V1 (Initial) teilweise unter anderen Namen angelegt (dom_verein, dom_person).
-- Um konsistent mit den Exposed-Tabellen (ReiterTable, HorseTable, etc.) zu sein, legen wir sie hier final an.
CREATE TABLE IF NOT EXISTS reiter
(
reiter_id
UUID
PRIMARY
KEY,
person_id
UUID,
satznummer
VARCHAR
(
10
) UNIQUE NOT NULL,
lizenz_nummer VARCHAR
(
20
),
lizenz_klasse VARCHAR
(
20
) NOT NULL,
startkart_aktiv BOOLEAN NOT NULL DEFAULT false,
startkart_saison INTEGER,
fei_id VARCHAR
(
20
),
nation VARCHAR
(
3
),
nachname VARCHAR
(
100
) NOT NULL,
vorname VARCHAR
(
100
) NOT NULL,
geburtsdatum DATE,
vereins_nummer VARCHAR
(
10
),
vereins_name VARCHAR
(
200
),
ist_gastreiter BOOLEAN NOT NULL DEFAULT false,
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
daten_quelle VARCHAR
(
50
) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_reiter_satznummer ON reiter (satznummer);
CREATE INDEX idx_reiter_name ON reiter (nachname, vorname);
CREATE TABLE IF NOT EXISTS horse
(
horse_id
UUID
PRIMARY
KEY,
pferde_name
VARCHAR
(
200
) NOT NULL,
geschlecht VARCHAR
(
20
) NOT NULL,
geburtsdatum DATE,
rasse VARCHAR
(
100
),
farbe VARCHAR
(
100
),
besitzer_id UUID,
verantwortliche_person_id UUID,
zuechter_name VARCHAR
(
200
),
zuchtbuch_nummer VARCHAR
(
50
),
lebensnummer VARCHAR
(
50
),
chip_nummer VARCHAR
(
50
),
pass_nummer VARCHAR
(
50
),
oeps_nummer VARCHAR
(
50
),
fei_nummer VARCHAR
(
50
),
vater_name VARCHAR
(
200
),
mutter_name VARCHAR
(
200
),
mutter_vater_name VARCHAR
(
200
),
stockmass INTEGER,
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
bemerkungen TEXT,
daten_quelle VARCHAR
(
50
) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_horse_lebensnummer ON horse (lebensnummer);
CREATE INDEX idx_horse_name ON horse (pferde_name);
CREATE TABLE IF NOT EXISTS verein
(
verein_id
UUID
PRIMARY
KEY,
vereins_nummer
VARCHAR
(
10
) UNIQUE NOT NULL,
name VARCHAR
(
200
) NOT NULL,
kurzname VARCHAR
(
100
),
bundesland VARCHAR
(
100
),
ort VARCHAR
(
100
),
plz VARCHAR
(
10
),
strasse VARCHAR
(
200
),
email VARCHAR
(
200
),
telefon VARCHAR
(
50
),
website VARCHAR
(
255
),
oeps_region_nummer VARCHAR
(
10
),
ist_veranstalter BOOLEAN NOT NULL DEFAULT false,
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
bemerkungen TEXT,
daten_quelle VARCHAR
(
50
) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS funktionaer
(
funktionaer_id
UUID
PRIMARY
KEY,
richter_nummer
VARCHAR
(
10
) UNIQUE,
vorname VARCHAR
(
100
) NOT NULL,
nachname VARCHAR
(
100
) NOT NULL,
geburtsdatum DATE,
email VARCHAR
(
200
),
telefon VARCHAR
(
50
),
vereins_nummer VARCHAR
(
10
),
ist_aktiv BOOLEAN NOT NULL DEFAULT true,
bemerkungen TEXT,
daten_quelle VARCHAR
(
50
) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);