Point 38 - HOTFIX: Age Conversion Logic Korrektur

Problem bei erstem Test

User testete mit echtem XML:

<waAlterMin>18</waAlterMin>
<waAlterMax>100</waAlterMax>

Erwartet: Altersbereich 18-100 Jahre
Angezeigt: 6-18 Jahre (falsch!)

Root Cause der falschen Konvertierung

Falsche Annahme in erster Implementierung:

// FALSCH:
birthYearFrom = eventYear - competition.ageInfo.min;  // 2025 - 18 = 2007
birthYearTo = eventYear - competition.ageInfo.max;    // 2025 - 100 = 1925

Problem: Ich hatte yer_von und yer_bis falsch interpretiert!

Korrekte Interpretation der Felder:

Aus competitions.ts Zeile 122:

ageFrom: Math.min(ageFrom, ageTo),  // Kleinere Zahl = jüngeres Alter
ageTo: Math.max(ageFrom, ageTo),    // Größere Zahl = älteres Alter

Bedeutung der XML-Felder: - waAlterMin="18" = Mindestalter (jüngster Teilnehmer) - waAlterMax="100" = Höchstalter (ältester Teilnehmer)

Bedeutung der DB-Felder: - yer_von = Birth year FROM = Geburtsjahr des jüngsten Alters - yer_bis = Birth year TO = Geburtsjahr des ältesten Alters

Korrekte Zuordnung für Age 18-100: - Mindestalter 18 → Geboren 2007 (2025 - 18) → yer_von = 2007 - Höchstalter 100 → Geboren 1925 (2025 - 100) → yer_bis = 1925

Korrekturen in der Implementierung

1. Konvertierung korrigiert

// KORREKT:
if (competition.ageInfo?.min && competition.ageInfo.min > 0) {
  birthYearFrom = eventYear - competition.ageInfo.min;  // Youngest (min age)
}
if (competition.ageInfo?.max && competition.ageInfo.max > 0 && competition.ageInfo.max < 999) {
  birthYearTo = eventYear - competition.ageInfo.max;    // Oldest (max age)
}

Zusätzlich: Check für max < 999 hinzugefügt (falls XML "unbegrenzt" mit 999 kodiert)

2. Default-Fallbacks korrigiert

// OLD (FALSCH):
birthYearFrom = eventYear - 18;  // Max age: 18
birthYearTo = eventYear - 6;     // Min age: 6

// NEW (KORREKT):
birthYearFrom = eventYear - 6;   // Youngest: age 6
birthYearTo = eventYear - 18;    // Oldest: age 18

3. Partial Age Info Fallbacks korrigiert

// Only max age specified
if (!birthYearFrom && birthYearTo) {
  birthYearFrom = eventYear - 6;  // Assume youngest is 6
}

// Only min age specified
if (birthYearFrom && !birthYearTo) {
  birthYearTo = eventYear - 99;   // Assume oldest is 99
}

Test-Szenarien (korrigiert)

Test Case: Ages 18-100 (aus User XML)

Event Year: 2025
waAlterMin: 18
waAlterMax: 100

Berechnung:
  birthYearFrom = 2025 - 18 = 2007 (jüngster mit 18)
  birthYearTo = 2025 - 100 = 1925 (ältester mit 100)

DB Speicherung:
  yer_von = 2007
  yer_bis = 1925

Display (competitions.ts):
  ageFrom = 2025 - 2007 = 18 ✅
  ageTo = 2025 - 1925 = 100 ✅

Test Case: Ages 11-12 (normaler Fall)

Event Year: 2025
waAlterMin: 11
waAlterMax: 12

Berechnung:
  birthYearFrom = 2025 - 11 = 2014 (jüngster mit 11)
  birthYearTo = 2025 - 12 = 2013 (ältester mit 12)

DB Speicherung:
  yer_von = 2014
  yer_bis = 2013

Display:
  ageFrom = 2025 - 2014 = 11 ✅
  ageTo = 2025 - 2013 = 12 ✅

Warum es vorher 6-18 anzeigte

Die alte Implementierung hat: 1. Ages 18-100 aus XML gelesen 2. Falsch herum konvertiert: birthYearFrom=2007, birthYearTo=1925 3. In DB gespeichert: yer_von=2007, yer_bis=1925 4. Display-Code hat dann berechnet: - ageFrom = 2025 - 2007 = 18 - ageTo = 2025 - 1925 = 100 - ABER: Math.min(18, 100) = 18, Math.max(18, 100) = 100 ✅

Moment... das hätte eigentlich funktionieren sollen!

Lass mich nochmal genauer schauen...

WAIT! Analyse des Display-Codes

Aus competitions.ts Zeile 106-111:

const birthYearFrom = comp.yer_von;
const birthYearTo = comp.yer_bis;

const ageFrom = birthYearFrom ? eventYear - birthYearFrom : 6;
const ageTo = birthYearTo ? eventYear - birthYearTo : (...) : 18;

AH! Hier ist das Problem!

Wenn birthYearFrom oder birthYearTo NULL oder 0 ist, werden die Defaults 6 und 18 verwendet!

Mögliche Ursachen warum 6-18 angezeigt wurde: 1. Die Ages wurden nicht korrekt extrahiert aus dem XML 2. Die competition.ageInfo war leer 3. Die Konvertierung hat NULL/0 gespeichert 4. Display-Code hat dann Fallback 6-18 verwendet

Server-Logs prüfen

Bitte schau dir beim nächsten Import die Server-Console an! Es sollte jetzt ausgeben:

🔍 Processing: Gerätvierkampf w
   - Event year: 2025
   - Ages from XML: 18 - 100
   - Birth years (DB): 2007 - 1925
   - Display ages: 18 - 100
   - Gender: weiblich

Wenn dort steht Ages from XML: none - none, dann wurde das XML nicht korrekt geparst!

Nächste Schritte

  1. Server neu starten (node process killen oder npm run dev neu starten)
  2. Import erneut durchführen mit deinem XML
  3. Console Logs prüfen - sehen was extrahiert wird
  4. Competitions-Page prüfen - sollte jetzt 18-100 anzeigen

Falls es immer noch 6-18 anzeigt: - Logs zeigen, ob Ages korrekt aus XML extrahiert werden - Ggf. ist das XML-Parsing das Problem (nicht die Konvertierung)