diff --git a/.claude/docs/functional/DOMAIN_MODEL.md b/.claude/docs/functional/DOMAIN_MODEL.md index 1e3b310..e690c4c 100644 --- a/.claude/docs/functional/DOMAIN_MODEL.md +++ b/.claude/docs/functional/DOMAIN_MODEL.md @@ -1,7 +1,7 @@ # Shinkan Jinkendo - Fachliches Domänenmodell -**Version:** 0.2.0 -**Stand:** 2026-04-23 +**Version:** 0.3.4 +**Stand:** 2026-04-23 (Migration 009: Target Groups M:N Refactoring) **Basis:** `shinkan_anforderungsdokument_entwurf.md` --- @@ -40,39 +40,37 @@ Dieses Dokument beschreibt die **fachliche Datenstruktur** von Shinkan Jinkendo. ### 3. Hierarchischer Kontext (§8.1) -**Fachliche Grundstruktur:** +**Fachliche Grundstruktur (ab Migration 009 - M:N):** ``` Fokusbereich (Sportart/Bereich) └─ Stil - └─ Zielgruppe + └─ Zielgruppen (M:N Zuordnung, wiederverwendbar) ``` -**Beispiele:** -``` -Karate - ├─ Shotokan - │ ├─ Breitensportler - │ ├─ Leistungssportler - │ └─ Kinder - ├─ Goju-Ryu - │ ├─ Erwachsene - │ └─ Jugendliche - └─ Wado-Ryu - └─ Gemischt +**🔄 ÄNDERUNG:** Zielgruppen sind global und können mehreren Stilen zugeordnet sein! -Selbstverteidigung - ├─ Erwachsene - │ ├─ Männer - │ ├─ Frauen - │ └─ Gemischt - └─ Kinder - └─ 6-12 Jahre - -Gewaltschutz - ├─ Frauen - ├─ Kinder - └─ Senioren +**Beispiel-Architektur (vereinfacht):** ``` +Global definierte Zielgruppen: +├─ Breitensportler +├─ Leistungssportler +├─ Kinder +├─ Erwachsene +└─ Senioren + +Zuordnungen (M:N): +Karate → Shotokan → [Breitensportler, Leistungssportler, Kinder] +Karate → Goju-Ryu → [Breitensportler, Erwachsene] +Karate → Wado-Ryu → [Leistungssportler] + +Selbstverteidigung → [Erwachsene, Kinder, Senioren] +Gewaltschutz → [Kinder, Senioren] +``` + +**Admin-UI Darstellung:** +- **Tree-View (Tab "Hierarchie"):** Zeigt Fokusbereich → Stil → zugeordnete Zielgruppen +- **Matrix (Tab "Zuordnungen"):** Checkbox-Matrix: Stile × Zielgruppen +- **Global (Tab "Zielgruppen"):** Verwaltung aller Zielgruppen unabhängig von Stilen **Bedeutung für Reifegradmodelle:** @@ -132,33 +130,42 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo ### Dimension 3: Zielgruppe -**Definition:** Konkrete Trainingsempfänger-Gruppe innerhalb eines Stils. +**Definition:** Globale Trainingsempfänger-Gruppe, die MEHREREN Stilen zugeordnet werden kann (M:N). + +**🔄 ÄNDERUNG ab Migration 009:** Zielgruppen sind NICHT mehr hierarchisch an Stile gebunden! **Beispiele:** -- Breitensportler -- Leistungssportler -- Kinder (6-12 Jahre) +- Breitensportler (kann in Shotokan, Goju-Ryu, Wado-Ryu gültig sein) +- Leistungssportler (kann in verschiedenen Stilen genutzt werden) +- Kinder (6-12 Jahre) (stilunabhängig) - Jugendliche (13-17 Jahre) - Erwachsene - Frauen - Senioren - Gemischt -**Hierarchie:** -- Gehört zu genau EINEM Trainingsstil -- Kann Altersbereich definieren +**Architektur (ab Migration 009):** +- ✅ **Global unabhängig:** Keine direkte FK zu `training_style_id` +- ✅ **M:N Zuordnung:** Über Junction-Tabelle `training_style_target_groups` +- ✅ **Wiederverwendbar:** Eine Zielgruppe kann mehreren Stilen zugeordnet sein +- ✅ **Primary Flag:** `is_primary` kennzeichnet Hauptzuordnung **Eigenschaften:** - Name, Beschreibung -- Stil-Zuordnung - Optionale Altersangabe (min_age, max_age) - Status +- **KEINE direkte Stil-Zuordnung mehr!** **Verwaltung:** - Admin-Level: Systemadmin, Vereinsadmin, Spartenadmin -- CRUD: Voll administrierbar -- Verschieben: Zwischen Stilen möglich -- Löschen: Cascade oder Restrict (konfigurierbar) +- CRUD: Voll administrierbar (global) +- Zuordnungen: Über M:N Matrix im Admin-UI +- Löschen: Nur wenn keine Übungen UND keine Stil-Zuordnungen + +**Admin-UI:** +- Tab "Zielgruppen": Global verwalten (ohne Stil-Dropdown) +- Tab "Hierarchie": Tree-View (Fokusbereich → Stil → zugeordnete Zielgruppen) +- Tab "Zuordnungen": Checkbox-Matrix für M:N Assignments ### Dimension 4: Altersgruppen (separate Dimension!) diff --git a/.claude/docs/technical/DATABASE_SCHEMA.md b/.claude/docs/technical/DATABASE_SCHEMA.md index 134851b..df77f88 100644 --- a/.claude/docs/technical/DATABASE_SCHEMA.md +++ b/.claude/docs/technical/DATABASE_SCHEMA.md @@ -1,8 +1,8 @@ # Shinkan Jinkendo - Datenbank-Schema (Technisch) -**Version:** 0.2.0 +**Version:** 0.3.4 **Stand:** 2026-04-23 -**Aktuell deployed:** Migration 007 (idempotent) +**Aktuell deployed:** Migration 009 (Target Groups M:N Refactoring) --- @@ -26,6 +26,51 @@ Dieses Dokument beschreibt die **technische Datenbankstruktur** von Shinkan Jink | 006 | 2026-04-21 | Training Planning | ✅ Deployed | | 007 | 2026-04-22 | Exercise Catalogs (idempotent) | ✅ Deployed | | 008 | 2026-04-23 | M:N Exercise Relations + Hierarchical Catalogs | ✅ Deployed | +| 009 | 2026-04-23 | **Target Groups M:N Refactoring** (BREAKING) | ✅ Deployed | + +--- + +## Migration 009: Target Groups M:N Refactoring (BREAKING CHANGE) + +**Problem:** Zielgruppen waren hierarchisch an Trainingsstile gebunden (1:N via FK `training_style_id`). +**Lösung:** M:N Beziehung über Junction-Tabelle `training_style_target_groups`. + +**Änderungen:** +- ❌ **Entfernt:** `target_groups.training_style_id` (FK constraint + column) +- ✅ **Neu:** `training_style_target_groups` Junction-Tabelle +- ✅ **Migriert:** Alte Zuordnungen zu M:N (alle mit `is_primary = true`) +- ✅ **Architektur:** Eine Zielgruppe kann mehreren Stilen zugeordnet sein + +**Neue Struktur:** +```sql +-- Global unabhängige Zielgruppen (KEINE training_style_id mehr) +target_groups ( + id, name, description, min_age, max_age, + sort_order, status, created_at, updated_at +) + +-- M:N Junction-Tabelle +training_style_target_groups ( + id SERIAL PRIMARY KEY, + training_style_id INT REFERENCES training_styles(id) ON DELETE CASCADE, + target_group_id INT REFERENCES target_groups(id) ON DELETE CASCADE, + is_primary BOOLEAN DEFAULT false, + created_at TIMESTAMP DEFAULT NOW(), + UNIQUE(training_style_id, target_group_id) +) +``` + +**Backend API:** 5 neue Endpoints: +- `GET /api/training-style-target-groups` (Liste mit Filtern + Enrichment) +- `POST /api/training-style-target-groups` (Upsert-Logik) +- `PUT /api/training-style-target-groups/{id}` (is_primary Flag) +- `DELETE /api/training-style-target-groups/{id}` +- `GET /api/training-styles/hierarchy` (Hierarchische Struktur für Tree-View) + +**Frontend:** +- Admin-UI Tab "Hierarchie" (Tree-View: Fokusbereich → Stil → Zielgruppen) +- Admin-UI Tab "Zuordnungen" (Checkbox-Matrix für M:N) +- Tab "Zielgruppen" überarbeitet (global, ohne training_style_id Dropdown) ---