'Wahlen', 'kc_teamer' => 'Teamer', 'kc_workshops' => 'Workshops', 'kc_teilnehmer' => 'Teilnehmer', 'kc_force_zuteilung'=> 'Force-Zuteilung', 'kc_zuteilungen' => 'Zuteilungen' ]; echo '
'; foreach($menu as $slug=>$label) { $url = admin_url('admin.php?page='.$slug); $class = ($active==$slug) ? "kc-tabnav-active" : ""; echo "$label"; } echo '
'; } function kc_wahlen_page() { global $wpdb; $prefix = $wpdb->prefix; kc_admin_tabs('kc_wahlen'); // Workshops zuweisen (Formular und Speicherung) if (isset($_GET['zuweisen'])) { $wahl_id = intval($_GET['zuweisen']); $wahl = $wpdb->get_row("SELECT * FROM {$prefix}kc_wahlen WHERE id=$wahl_id"); $workshops = $wpdb->get_results("SELECT * FROM {$prefix}kc_workshops ORDER BY name"); // Sortiere erst nach KC-Nummer (kleinste zuerst), dann nach Wochentag usort($workshops, function($a, $b) { $kcA = 999; $kcB = 999; if (preg_match('/(kc\s*)?(\d+)/i', $a->name, $m)) { $kcA = intval($m[2]); } if (preg_match('/(kc\s*)?(\d+)/i', $b->name, $m)) { $kcB = intval($m[2]); } if ($kcA !== $kcB) return $kcA <=> $kcB; $days = [ 'montag' => 1, 'dienstag' => 2, 'mittwoch' => 3, 'donnerstag' => 4, 'freitag' => 5, 'samstag' => 6, 'sonntag' => 7 ]; $dA = 99; $dB = 99; $la = strtolower($a->name); $lb = strtolower($b->name); foreach ($days as $day => $order) { if ($dA === 99 && strpos($la, $day) !== false) $dA = $order; if ($dB === 99 && strpos($lb, $day) !== false) $dB = $order; } if ($dA !== $dB) return $dA <=> $dB; return strcasecmp($a->name, $b->name); }); if (isset($_POST['kc_workshop_zuweisung_save'])) { $wpdb->delete("{$prefix}kc_wahl_workshops", ['wahl_id'=>$wahl_id]); $anzahl_einheiten = intval($wahl->anzahl_einheiten); for($phase=1; $phase<=$anzahl_einheiten; $phase++) { if (!empty($_POST["phase{$phase}_workshops"])) { foreach($_POST["phase{$phase}_workshops"] as $workshop_id) { $wpdb->insert("{$prefix}kc_wahl_workshops", [ 'wahl_id'=>$wahl_id, 'workshop_id'=>intval($workshop_id), 'phase'=>$anzahl_einheiten>1?$phase:1 ]); } } } echo '
Workshops zugewiesen!
'; } $zugeordnet = $wpdb->get_results("SELECT * FROM {$prefix}kc_wahl_workshops WHERE wahl_id=$wahl_id"); $phase_map = []; foreach($zugeordnet as $z) $phase_map[$z->phase][] = $z->workshop_id; echo '
'; echo '

Workshops der Wahl „'.esc_html($wahl->name).'“ zuweisen

'; echo '
'; echo '
' .'' .'' .'Alle anzeigen' .'
' .'' .'' .'' .'' .'' .'
' .'
'; $anzahl_einheiten = intval($wahl->anzahl_einheiten); for($phase=1; $phase<=$anzahl_einheiten; $phase++) { echo "

Phase {$phase}".($anzahl_einheiten==2?($phase==1?" (Früh)":" (Spät)"):"")."

"; echo ''; echo '
'; foreach ($workshops as $ws) { $checked = !empty($phase_map[$phase]) && in_array($ws->id, $phase_map[$phase]) ? 'checked' : ''; $label = esc_html($ws->name); if (!empty($ws->beschreibung)) { $label .= ' (' . esc_html($ws->beschreibung) . ')'; } echo ""; } echo '

'; } echo ' Zurück
'; echo ''; echo '
'; return; } // Wahl speichern (Bearbeiten) if (isset($_POST['kc_wahl_update'])) { $wahl_id = intval($_POST['wahl_id']); $wpdb->update("{$prefix}kc_wahlen", [ 'name' => sanitize_text_field($_POST['name']), 'beschreibung' => sanitize_textarea_field($_POST['beschreibung']), 'anzahl_einheiten' => intval($_POST['anzahl_einheiten']), 'freigegeben' => isset($_POST['freigegeben']) ? 1 : 0 ], ['id' => $wahl_id]); echo '
Wahl gespeichert!
'; echo ""; return; } // Bearbeitungsformular if (isset($_GET['edit_wahl'])) { $wahl_id = intval($_GET['edit_wahl']); $wahl = $wpdb->get_row("SELECT * FROM {$prefix}kc_wahlen WHERE id=$wahl_id"); echo '
'; echo '

Wahl bearbeiten

Abbrechen
'; echo '
'; return; } // Neue Wahl anlegen if(isset($_POST['kc_wahl_neu'])) { $wpdb->insert("{$prefix}kc_wahlen", [ 'name' => sanitize_text_field($_POST['name']), 'beschreibung' => sanitize_textarea_field($_POST['beschreibung']), 'anzahl_einheiten' => intval($_POST['anzahl_einheiten']), 'freigegeben' => isset($_POST['freigegeben']) ? 1 : 0 ]); echo '
Wahl angelegt!
'; echo ""; return; } // Freigabe ändern if(isset($_POST['kc_wahl_freigabe'])) { $wpdb->update("{$prefix}kc_wahlen", ['freigegeben' => intval($_POST['kc_wahl_freigabe'])], ['id' => $_POST['wahl_id']]); echo '
Wahl-Freigabe geändert!
'; } // Wahl löschen (cascade: Teilnehmer, Zuteilungen, Force-Zuteilungen, Wahl-Workshop-Mapping) if (isset($_GET['delete_wahl'])) { $wahl_id = intval($_GET['delete_wahl']); // delete zuteilungen for this wahl $wpdb->delete("{$prefix}kc_zuteilung", ['wahl_id' => $wahl_id]); // delete force zuteilungen $wpdb->delete("{$prefix}kc_force_zuteilung", ['wahl_id' => $wahl_id]); // delete teilnehmer $wpdb->delete("{$prefix}kc_teilnehmer", ['wahl_id' => $wahl_id]); // delete wahl-workshop mappings $wpdb->delete("{$prefix}kc_wahl_workshops", ['wahl_id' => $wahl_id]); // mark the wahl as deleted (soft delete) $wpdb->update("{$prefix}kc_wahlen", ['deleted'=>1], ['id'=>$wahl_id]); echo '
Wahl und zugehörige Teilnehmer/Zuteilungen wurden entfernt.
'; } // Zuteilung ausführen (per Button auf der Übersicht) if (isset($_GET['run_zuteilung'])) { $wahl_id = intval($_GET['run_zuteilung']); // nonce check for safety if (!empty($_GET['_wpnonce']) && wp_verify_nonce($_GET['_wpnonce'], 'kc_run_zuteilung_' . $wahl_id)) { if (function_exists('kc_run_zuteilung')) { kc_run_zuteilung($wahl_id); // nach Zuteilung anzeigen echo '
Zuteilung wurde ausgeführt.
'; echo ""; return; } else { echo '
Zuteilungsfunktion nicht verfügbar.
'; } } else { echo '
Ungültiger Sicherheits-Token.
'; } } echo '
'; echo '

Alle Wahlen

'; $wahlen = $wpdb->get_results("SELECT * FROM {$prefix}kc_wahlen WHERE deleted=0"); // Sortiere Übersicht: erst KC-Nummer (aufsteigend), dann Wochentag (Mo-So), dann Name usort($wahlen, function($a, $b) { $kcA = 999; $kcB = 999; if (preg_match('/(kc\s*)?(\d+)/i', $a->name, $m)) { $kcA = intval($m[2]); } if (preg_match('/(kc\s*)?(\d+)/i', $b->name, $m)) { $kcB = intval($m[2]); } if ($kcA !== $kcB) return $kcA <=> $kcB; $days = [ 'montag' => 1, 'dienstag' => 2, 'mittwoch' => 3, 'donnerstag' => 4, 'freitag' => 5, 'samstag' => 6, 'sonntag' => 7 ]; $dA = 99; $dB = 99; $la = strtolower($a->name); $lb = strtolower($b->name); foreach ($days as $day => $order) { if ($dA === 99 && strpos($la, $day) !== false) $dA = $order; if ($dB === 99 && strpos($lb, $day) !== false) $dB = $order; } if ($dA !== $dB) return $dA <=> $dB; return strcasecmp($a->name, $b->name); }); echo ''; echo ''; foreach($wahlen as $wahl) { // compute per-phase capacity and participant counts $anz = intval($wahl->anzahl_einheiten); $caps = []; $counts = []; $insufficient = false; for($phase=1;$phase<=$anz;$phase++) { // total capacity = sum of max_teilnehmer for workshops assigned to this wahl and phase $caps[$phase] = intval($wpdb->get_var($wpdb->prepare( "SELECT COALESCE(SUM(ws.max_teilnehmer),0) FROM {$prefix}kc_workshops ws JOIN {$prefix}kc_wahl_workshops ww ON ws.id=ww.workshop_id WHERE ww.wahl_id=%d AND ww.phase=%d", $wahl->id, $phase ))); // number of participants for this wahl and phase $counts[$phase] = intval($wpdb->get_var($wpdb->prepare( "SELECT COUNT(*) FROM {$prefix}kc_teilnehmer WHERE wahl_id=%d AND phase=%d", $wahl->id, $phase ))); if ($caps[$phase] < $counts[$phase]) $insufficient = true; } echo ''; echo ''; echo ''; // capacity column (show per phase) echo ''; // participants column (show per phase, highlight if exceeding capacity) echo ''; echo ''; echo ''; echo ''; echo ''; } echo '
NamePhasenKapazität (pro Phase)Teilnehmer (pro Phase)FreigegebenShortcodeAktion
'.esc_html($wahl->name).''.intval($wahl->anzahl_einheiten).''; $cap_labels = []; for($phase=1;$phase<=$anz;$phase++) { $cap_labels[] = 'P'.$phase.': '.esc_html($caps[$phase]); } echo implode('
', $cap_labels); echo '
'; $count_labels = []; for($phase=1;$phase<=$anz;$phase++) { $label = 'P'.$phase.': '.esc_html($counts[$phase]); if ($caps[$phase] < $counts[$phase]) { $diff = $counts[$phase] - $caps[$phase]; $label .= ' (+'.intval($diff).' fehlen)'; } else { $label .= ' (OK)'; } $count_labels[] = $label; } echo implode('
', $count_labels); echo '
'; echo "
"; echo ""; echo ""; echo "
"; echo ''.($wahl->freigegeben ? "freigegeben" : "geschlossen").''; echo '
[konficastle_workshopwahl wahl="'.intval($wahl->id).'"]'; echo 'Workshops zuweisen'; echo 'Bearbeiten'; echo 'Zuteilung anzeigen'; $nonce = wp_create_nonce('kc_run_zuteilung_' . intval($wahl->id)); echo 'Zuteilung starten'; echo 'Löschen'; echo '
'; // Neue Wahl anlegen-Formular echo '

Neue Wahl anlegen

'; echo '
'; // Zeige die Zuteilung, wenn angefordert: if (isset($_GET['show_zuteilung'])) { $wahl_id = intval($_GET['show_zuteilung']); if (function_exists('kc_zeige_zuteilung')) kc_zeige_zuteilung($wahl_id); } } ?>