'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 '';
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
';
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 '| Name | Phasen | Kapazität (pro Phase) | Teilnehmer (pro Phase) | Freigegeben | Shortcode | Aktion |
';
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 '| '.esc_html($wahl->name).' | ';
echo ''.intval($wahl->anzahl_einheiten).' | ';
// capacity column (show per phase)
echo '';
$cap_labels = [];
for($phase=1;$phase<=$anz;$phase++) {
$cap_labels[] = 'P'.$phase.': '.esc_html($caps[$phase]);
}
echo implode(' ', $cap_labels);
echo ' | ';
// participants column (show per phase, highlight if exceeding capacity)
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 ''.($wahl->freigegeben ? "freigegeben" : "geschlossen").'';
echo ' | ';
echo '[konficastle_workshopwahl wahl="'.intval($wahl->id).'"] | ';
echo '';
echo 'Workshops zuweisen';
echo 'Bearbeiten';
$nonce = wp_create_nonce('kc_run_zuteilung_' . intval($wahl->id));
echo 'Zuteilung starten';
echo 'Zuteilung anzeigen';
echo 'Löschen';
echo ' | ';
echo '
';
}
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);
}
}
?>