prefix;
kc_admin_tabs('kc_teilnehmer');
// Alle Wahlen + Workshops für Dropdowns und Validierung
$all_wahlen = $wpdb->get_results("SELECT id, name, anzahl_einheiten FROM {$prefix}kc_wahlen WHERE deleted=0 ORDER BY id DESC");
$all_workshops = $wpdb->get_results("SELECT id, name FROM {$prefix}kc_workshops ORDER BY name");
// Map of workshop id => name for quick lookup in overview
$workshops_map = [];
if (!empty($all_workshops)) {
foreach ($all_workshops as $ws) {
$workshops_map[intval($ws->id)] = $ws->name;
}
}
// Build map of wahl -> phases + workshops (for JS)
$wahl_map = [];
foreach($all_wahlen as $w) {
$wahl_map[intval($w->id)] = ['phases' => max(1,intval($w->anzahl_einheiten)), 'workshops' => []];
}
if (!empty($all_workshops)) {
foreach($all_workshops as $ws) {
$ww = $wpdb->get_col($wpdb->prepare("SELECT wahl_id FROM {$prefix}kc_wahl_workshops WHERE workshop_id=%d", $ws->id));
if (!empty($ww)) {
foreach($ww as $wid) {
if (isset($wahl_map[intval($wid)])) {
$wahl_map[intval($wid)]['workshops'][] = ['id'=>intval($ws->id),'name'=>$ws->name];
}
}
}
}
}
// Teilnehmer l�schen
if (isset($_GET['delete_teilnehmer'])) {
$tid = intval($_GET['delete_teilnehmer']);
$wpdb->delete("{$prefix}kc_teilnehmer", ['id' => $tid]);
echo '
Teilnehmer gel�scht!
';
}
// Teilnehmer speichern (neu/�ndern)
if (isset($_POST['kc_teilnehmer_save'])) {
// sanitize inputs
$vorname = sanitize_text_field($_POST['vorname']);
$nachname = sanitize_text_field($_POST['nachname']);
$wahl_id_post = intval($_POST['wahl_id']);
$phase_post = intval($_POST['phase']);
$w1 = intval($_POST['wunsch1']);
$w2 = intval($_POST['wunsch2']);
$w3 = intval($_POST['wunsch3']);
// Server-side validation: duplicate name in same Wahl (exclude self on edit)
$norm_v = mb_strtolower(trim($vorname));
$norm_n = mb_strtolower(trim($nachname));
if (!empty($_POST['tid'])) {
$exclude_id = intval($_POST['tid']);
$exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM {$prefix}kc_teilnehmer WHERE LOWER(TRIM(vorname))=%s AND LOWER(TRIM(nachname))=%s AND wahl_id=%d AND id<>%d", $norm_v, $norm_n, $wahl_id_post, $exclude_id));
} else {
$exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM {$prefix}kc_teilnehmer WHERE LOWER(TRIM(vorname))=%s AND LOWER(TRIM(nachname))=%s AND wahl_id=%d", $norm_v, $norm_n, $wahl_id_post));
}
if ($exists && $exists > 0) {
echo '
Diese Kombination aus Vorname und Nachname existiert bereits für diese Wahl.
';
} else {
// validate phase within wahl
$wahl_row = $wpdb->get_row($wpdb->prepare("SELECT anzahl_einheiten FROM {$prefix}kc_wahlen WHERE id=%d", $wahl_id_post));
$max_ph = $wahl_row ? max(1,intval($wahl_row->anzahl_einheiten)) : 1;
if ($phase_post < 1 || $phase_post > $max_ph) {
echo '
Ungültige Phase für die gewählte Wahl.
';
} else {
// validate that selected workshops belong to the chosen wahl (if mapping exists)
$valid_ws = [];
$ww_rows = $wpdb->get_col($wpdb->prepare("SELECT workshop_id FROM {$prefix}kc_wahl_workshops WHERE wahl_id=%d", $wahl_id_post));
if (!empty($ww_rows)) foreach($ww_rows as $r) $valid_ws[] = intval($r);
// if mapping exists, enforce membership
$check_membership = function($wid) use ($valid_ws) {
if (empty($valid_ws)) return true; // no mapping -> allow
return in_array(intval($wid), $valid_ws);
};
if (!$check_membership($w1) || !$check_membership($w2) || !$check_membership($w3)) {
echo '
Einer oder mehrere ausgewählte Workshops gehören nicht zur gewählten Wahl.