Refactor Spielplan-Filterlogik in separate Utility-Funktionen und verbessere die Filterung im PDF-Generierungsprozess

This commit is contained in:
Torsten Schulz (local)
2026-07-15 11:30:06 +02:00
parent d9c5d242ec
commit 0ab71166aa
3 changed files with 133 additions and 281 deletions

View File

@@ -2,6 +2,7 @@ import fs from 'fs/promises'
import path from 'path'
import { readSpielplanData, validateSeasonSlug } from '../../utils/spielplan-data.js'
import { info as loggerInfo, error as loggerError } from '../../utils/logger.js'
import { filterSpielplanRows } from '../../../utils/spielplan-filter.js'
function seasonSlugToLabel(slug) {
const match = String(slug || '').match(/^(\d{2})--(\d{2})$/)
@@ -35,116 +36,8 @@ export default defineEventHandler(async (event) => {
const dataRows = spielplan.data
// Filtere Daten basierend auf Team
let filteredData = dataRows
if (team !== 'all') {
filteredData = dataRows.filter(row => {
const heimMannschaft = (row.HeimMannschaft || '').toLowerCase()
const gastMannschaft = (row.GastMannschaft || '').toLowerCase()
const heimAltersklasse = (row.HeimMannschaftAltersklasse || '').toLowerCase()
const gastAltersklasse = (row.GastMannschaftAltersklasse || '').toLowerCase()
// Prüfe ob eine der Mannschaften Harheimer TC ist
const isHarheimerHeim = heimMannschaft.includes('harheimer tc')
const isHarheimerGast = gastMannschaft.includes('harheimer tc')
if (!isHarheimerHeim && !isHarheimerGast) {
return false // Kein Harheimer TC Spiel
}
// Mapping zwischen Team-Namen und CSV-Daten
const mannschaftMapping = {
'erwachsene': ['harheimer tc'], // Alle Erwachsenen-Mannschaften
'nachwuchs': ['harheimer tc'], // Alle Jugend-Mannschaften
'erwachsene_1': ['harheimer tc'], // Nur ohne römische Zahl
'erwachsene_2': ['harheimer tc ii'],
'erwachsene_3': ['harheimer tc iii'],
'erwachsene_4': ['harheimer tc iv'],
'erwachsene_5': ['harheimer tc v'],
'jugendmannschaft': ['harheimer tc'] // Jugend hat keine römische Zahl
}
const csvVariants = mannschaftMapping[team] || []
if (csvVariants.length === 0) {
return false
}
// Prüfe Mannschafts-Zuordnung UND Altersklasse
const mannschaftMatch = csvVariants.some(variant => {
// Strikte Übereinstimmung: Prüfe exakte Mannschaftsnamen
if (isHarheimerHeim) {
// Für "harheimer tc" (Erwachsene 1): Nur wenn KEINE römische Zahl folgt
if (variant === 'harheimer tc') {
return heimMannschaft === 'harheimer tc' ||
heimMannschaft.startsWith('harheimer tc ') &&
!heimMannschaft.match(/harheimer tc\s+[ivx]+/i)
}
// Für andere Mannschaften: Exakte Übereinstimmung
return heimMannschaft === variant || heimMannschaft.startsWith(variant + ' ')
}
if (isHarheimerGast) {
// Für "harheimer tc" (Erwachsene 1): Nur wenn KEINE römische Zahl folgt
if (variant === 'harheimer tc') {
return gastMannschaft === 'harheimer tc' ||
gastMannschaft.startsWith('harheimer tc ') &&
!gastMannschaft.match(/harheimer tc\s+[ivx]+/i)
}
// Für andere Mannschaften: Exakte Übereinstimmung
return gastMannschaft === variant || gastMannschaft.startsWith(variant + ' ')
}
return false
})
if (!mannschaftMatch) {
return false
}
// Zusätzliche Altersklassen-Prüfung für spezifische Mannschaften
if (team.startsWith('erwachsene')) {
// Erwachsenen-Mannschaften: MUSS Erwachsene sein, DARF NICHT Jugend sein
const isErwachsenenHeim = isHarheimerHeim &&
heimAltersklasse.includes('erwachsene') &&
!heimAltersklasse.includes('jugend')
const isErwachsenenGast = isHarheimerGast &&
gastAltersklasse.includes('erwachsene') &&
!gastAltersklasse.includes('jugend')
return isErwachsenenHeim || isErwachsenenGast
} else if (team === 'jugendmannschaft' || team === 'nachwuchs') {
// Jugend-Mannschaft: MUSS Jugend sein
const isJugendHeim = isHarheimerHeim &&
(heimAltersklasse.includes('jugend') || heimMannschaft.includes('jugend'))
const isJugendGast = isHarheimerGast &&
(gastAltersklasse.includes('jugend') || gastMannschaft.includes('jugend'))
return isJugendHeim || isJugendGast
}
return true // Fallback für unbekannte Mannschaften
})
}
// Filtere nach Wettbewerb (Standard: Punktrunde)
// Muss zur Frontend-Logik passen: Punktrunde = alles, was kein Pokal ist.
const wettbewerb = String(query.wettbewerb || 'punktrunde').toLowerCase().trim()
if (wettbewerb !== 'alle') {
filteredData = filteredData.filter(row => {
const runde = (row.Runde || '').toLowerCase()
const staffel = (row.Staffel || '').toLowerCase()
const liga = (row.Liga || '').toLowerCase()
const isPokal = runde.includes('pokal') || staffel.includes('pokal') || liga.includes('pokal')
if (wettbewerb === 'punktrunde') {
return !isPokal
} else if (wettbewerb === 'pokal') {
return isPokal
}
return true
})
}
const filteredData = filterSpielplanRows(dataRows, { team, wettbewerb })
// Sammle Halle-Informationen für die jeweilige Mannschaft
const hallenMap = new Map()