diff --git a/includes/admin-data.php b/includes/admin-data.php
new file mode 100644
index 0000000..e73d26d
--- /dev/null
+++ b/includes/admin-data.php
@@ -0,0 +1,160 @@
+prefix;
+
+ // Only allow WP user with ID 1 to access this page
+ $current = wp_get_current_user();
+ if (!$current || intval($current->ID) !== 1) {
+ echo '
';
+ echo '
Datenverwaltung
';
+ echo '
Nur der Hauptadministrator (User ID 1) kann die Testdatenverwaltung verwenden.
';
+ echo '
';
+ return;
+ }
+
+ kc_admin_tabs('kc_wahlen');
+
+ echo '';
+ echo '
Datenverwaltung / Testdaten
';
+
+ // Handle actions (with nonce)
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ if (empty($_POST['kc_data_nonce']) || !wp_verify_nonce($_POST['kc_data_nonce'], 'kc_data_action')) {
+ echo '
Ungültiger Request (Nonce).
';
+ } else {
+ if (isset($_POST['kc_generate_testdata'])) {
+ // Read generation options from the form (with sensible defaults)
+ $num_workshops = max(1, intval($_POST['num_workshops'] ?? 3));
+ $num_part_per_phase = max(1, intval($_POST['num_part_per_phase'] ?? 10));
+ $phases = max(1, min(4, intval($_POST['phases'] ?? 2)));
+ $min_cap = max(1, intval($_POST['min_capacity'] ?? 4));
+ $max_cap = max($min_cap, intval($_POST['max_capacity'] ?? 8));
+
+ $created = ['wahlen'=>0, 'workshops'=>0, 'ww'=>0, 'teilnehmer'=>0];
+
+ // Create a random Wahl
+ $wahl_name = 'TEST - Zufallswahl ' . time();
+ $wpdb->insert("{$prefix}kc_wahlen", [
+ 'name' => $wahl_name,
+ 'beschreibung' => 'Automatisch erzeugte zufällige Testdaten',
+ 'anzahl_einheiten' => $phases,
+ 'freigegeben' => 1,
+ 'deleted' => 0
+ ]);
+ $wahl_id = intval($wpdb->insert_id);
+ if ($wahl_id) $created['wahlen']++;
+
+ // Create randomized workshops and map to the Wahl for each phase
+ $ws_ids = [];
+ for ($i=0; $i<$num_workshops; $i++) {
+ $cap = rand($min_cap, $max_cap);
+ $wn = 'TEST - WS '.($i+1).' #'.rand(1000,9999);
+ $wpdb->insert("{$prefix}kc_workshops", [
+ 'name' => $wn,
+ 'beschreibung' => 'Auto-generated',
+ 'max_teilnehmer' => $cap
+ ]);
+ $wid = intval($wpdb->insert_id);
+ if ($wid) {
+ $ws_ids[] = $wid;
+ $created['workshops']++;
+ for ($ph=1; $ph<=$phases; $ph++) {
+ $wpdb->insert("{$prefix}kc_wahl_workshops", ['wahl_id'=>$wahl_id, 'workshop_id'=>$wid, 'phase'=>$ph]);
+ $created['ww']++;
+ }
+ }
+ }
+
+ // Create randomized participants with random wishes
+ $firsts = ['Lukas','Mia','Jonas','Emma','Noah','Hannah','Paul','Lea','Tim','Lina','Max','Sara'];
+ $lasts = ['Müller','Schmidt','Schneider','Fischer','Weber','Mayer','Wagner','Becker','Hoffmann','Schulz'];
+
+ for ($n=0; $n<$num_part_per_phase; $n++) {
+ for ($ph=1; $ph<=$phases; $ph++) {
+ $fn = $firsts[array_rand($firsts)].rand(1,999);
+ $ln = $lasts[array_rand($lasts)];
+ // pick three wishes (distinct if possible)
+ $w1 = $ws_ids[array_rand($ws_ids)];
+ $w2 = $ws_ids[array_rand($ws_ids)];
+ $w3 = $ws_ids[array_rand($ws_ids)];
+ $wpdb->insert("{$prefix}kc_teilnehmer", [
+ 'vorname' => $fn,
+ 'nachname' => $ln,
+ 'wahl_id' => $wahl_id,
+ 'phase' => $ph,
+ 'wunsch1' => intval($w1),
+ 'wunsch2' => intval($w2),
+ 'wunsch3' => intval($w3),
+ 'deleted' => 0
+ ]);
+ if (intval($wpdb->insert_id)) $created['teilnehmer']++;
+ }
+ }
+
+ echo '
Zufalls-Testdaten erzeugt: '.intval($created['wahlen']).' Wahl(en), '.intval($created['workshops']).' Workshops, '.intval($created['ww']).' Zuweisungen, '.intval($created['teilnehmer']).' Teilnehmer.
';
+ }
+
+ if (isset($_POST['kc_reset_plugin'])) {
+ // Reset plugin DB: uninstall tables, then recreate
+ if (function_exists('kc_uninstall_tables') && function_exists('kc_install_tables')) {
+ kc_uninstall_tables();
+ kc_install_tables();
+ echo '
Plugin-Daten zurückgesetzt: Tabellen wurden gelöscht und neu erstellt.
';
+ } else {
+ echo '
Reset fehlgeschlagen: Install/Uninstall Funktionen nicht verfügbar.
';
+ }
+ }
+
+ if (isset($_POST['kc_clear_testdata'])) {
+ // Remove everything that has names starting with 'TEST - '
+ // Find workshop ids
+ $test_ws = $wpdb->get_col($wpdb->prepare("SELECT id FROM {$prefix}kc_workshops WHERE name LIKE %s", 'TEST - %'));
+ if (!empty($test_ws)) {
+ foreach($test_ws as $tw) {
+ $wpdb->delete("{$prefix}kc_workshop_teamer", ['workshop_id'=>$tw]);
+ }
+ $wpdb->query("DELETE FROM {$prefix}kc_wahl_workshops WHERE workshop_id IN (".implode(',', array_map('intval', $test_ws)).")");
+ $wpdb->query("DELETE FROM {$prefix}kc_workshops WHERE id IN (".implode(',', array_map('intval', $test_ws)).")");
+ }
+
+ // Find test wahlen
+ $test_wahlen = $wpdb->get_col($wpdb->prepare("SELECT id FROM {$prefix}kc_wahlen WHERE name LIKE %s", 'TEST - %'));
+ if (!empty($test_wahlen)) {
+ // delete related teilnehmer and zuteilung and force zuteilung
+ $ids = implode(',', array_map('intval', $test_wahlen));
+ $wpdb->query("DELETE FROM {$prefix}kc_zuteilung WHERE wahl_id IN (".$ids.")");
+ $wpdb->query("DELETE FROM {$prefix}kc_force_zuteilung WHERE wahl_id IN (".$ids.")");
+ $wpdb->query("DELETE FROM {$prefix}kc_teilnehmer WHERE wahl_id IN (".$ids.")");
+ $wpdb->query("DELETE FROM {$prefix}kc_wahl_workshops WHERE wahl_id IN (".$ids.")");
+ $wpdb->query("DELETE FROM {$prefix}kc_wahlen WHERE id IN (".$ids.")");
+ }
+
+ echo '
Alle Testdaten (Präfix "TEST - ") wurden entfernt.
';
+ }
+ }
+ }
+
+ // Form with actions and generation options
+ $nonce = wp_create_nonce('kc_data_action');
+ echo '
';
+
+ echo '
';
+}
+?>
diff --git a/includes/admin-teamer.php b/includes/admin-teamer.php
new file mode 100644
index 0000000..e40934b
--- /dev/null
+++ b/includes/admin-teamer.php
@@ -0,0 +1,141 @@
+prefix;
+ kc_admin_tabs('kc_teamer');
+
+ // --- Teamer access password (admin only) ---
+ if (isset($_POST['kc_teamer_pass_save'])) {
+ if (empty($_POST['kc_teamer_pass_nonce']) || !wp_verify_nonce($_POST['kc_teamer_pass_nonce'], 'kc_teamer_pass_action')) {
+ echo 'Ungültiger Request (Nonce).
';
+ } else {
+ $pw = trim($_POST['kc_teamer_password'] ?? '');
+ if ($pw === '') {
+ delete_option('kc_teamer_password_hash');
+ echo 'Teamer-Passwort entfernt.
';
+ } else {
+ update_option('kc_teamer_password_hash', wp_hash_password($pw));
+ echo 'Teamer-Passwort gespeichert.
';
+ }
+ }
+ }
+
+ // Show small management box for the password
+ $saved = get_option('kc_teamer_password_hash', '');
+ echo '';
+ echo '
Teamer Zugriff
';
+ echo '';
+ echo '';
+
+ // Teamer l�schen
+ if (isset($_GET['delete_teamer'])) {
+ $tid = intval($_GET['delete_teamer']);
+ $wpdb->delete("{$prefix}kc_teamer", ['id' => $tid]);
+ echo 'Teamer gelöscht!
';
+ }
+
+ // Teamer speichern (neu/�ndern)
+ if (isset($_POST['kc_teamer_save'])) {
+ $data = [
+ 'vorname' => sanitize_text_field($_POST['vorname']),
+ 'nachname' => sanitize_text_field($_POST['nachname'])
+ ];
+ if (!empty($_POST['tid'])) {
+ $wpdb->update("{$prefix}kc_teamer", $data, ['id'=>intval($_POST['tid'])]);
+ echo 'Teamer aktualisiert!
';
+ } else {
+ // Prüfe ob Kombination aus Vorname und Nachname bereits existiert
+ $existing = $wpdb->get_var($wpdb->prepare(
+ "SELECT COUNT(*) FROM {$prefix}kc_teamer WHERE vorname = %s AND nachname = %s",
+ $data['vorname'],
+ $data['nachname']
+ ));
+
+ if ($existing > 0) {
+ echo 'Ein Teamer mit dieser Kombination aus Vor- und Nachname existiert bereits!
';
+ } else {
+ $wpdb->insert("{$prefix}kc_teamer", $data);
+ echo 'Teamer angelegt!
';
+ }
+ }
+ }
+
+ // Teamer bearbeiten
+ if (isset($_GET['edit_teamer'])) {
+ $tid = intval($_GET['edit_teamer']);
+ $tm = $wpdb->get_row("SELECT * FROM {$prefix}kc_teamer WHERE id=$tid");
+ echo '';
+ echo '
Teamer bearbeiten
+
';
+ echo '
';
+ return;
+ }
+
+ // Neuen Teamer anlegen
+ if (isset($_GET['new'])) {
+ echo '';
+ echo '
Neuen Teamer anlegen
+
';
+ echo '
';
+ return;
+ }
+
+ // �bersicht
+ echo '';
+ echo '
Alle Teamer
';
+ echo '
+ Neuer Teamer';
+
+ // Sortierung
+ $sort = isset($_GET['sort']) ? sanitize_text_field($_GET['sort']) : 'vorname';
+ $order = isset($_GET['order']) ? (($_GET['order'] === 'desc') ? 'DESC' : 'ASC') : 'ASC';
+ $allowed_sort = ['vorname', 'nachname', 'id'];
+ if (!in_array($sort, $allowed_sort)) {
+ $sort = 'vorname';
+ }
+
+ // Sortier-Links
+ $vorname_order = ($sort === 'vorname' && $order === 'ASC') ? 'desc' : 'asc';
+ $nachname_order = ($sort === 'nachname' && $order === 'ASC') ? 'desc' : 'asc';
+ $vorname_arrow = ($sort === 'vorname') ? ($order === 'ASC' ? ' â–²' : ' â–¼') : '';
+ $nachname_arrow = ($sort === 'nachname') ? ($order === 'ASC' ? ' â–²' : ' â–¼') : '';
+
+ echo '
';
+ echo '';
+ echo '| Vorname'.$vorname_arrow.' | ';
+ echo 'Nachname'.$nachname_arrow.' | ';
+ echo 'Aktion | ';
+ echo '
';
+
+ $teamer = $wpdb->get_results("SELECT * FROM {$prefix}kc_teamer ORDER BY {$sort} {$order}");
+ foreach ($teamer as $tm) {
+ echo "
+ | ".esc_html($tm->vorname)." |
+ ".esc_html($tm->nachname)." |
+
+ Bearbeiten
+ Loeschen
+ |
+
";
+ }
+ echo '
';
+ echo '
';
+}
+?>
\ No newline at end of file
diff --git a/includes/admin-wahlen.php b/includes/admin-wahlen.php
new file mode 100644
index 0000000..e10dc5f
--- /dev/null
+++ b/includes/admin-wahlen.php
@@ -0,0 +1,394 @@
+ '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';
+ echo 'Zuteilung anzeigen';
+ $nonce = wp_create_nonce('kc_run_zuteilung_' . intval($wahl->id));
+ echo 'Zuteilung starten';
+ echo 'Loeschen';
+ 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);
+ }
+}
+?>
\ No newline at end of file
diff --git a/includes/force-zuteilung.php b/includes/force-zuteilung.php
new file mode 100644
index 0000000..019d290
--- /dev/null
+++ b/includes/force-zuteilung.php
@@ -0,0 +1,185 @@
+prefix;
+ kc_admin_tabs('kc_force_zuteilung');
+
+ // Force-Zuteilung löschen
+ if (isset($_GET['delete_force'])) {
+ $fid = intval($_GET['delete_force']);
+ $wpdb->delete("{$prefix}kc_force_zuteilung", ['id' => $fid]);
+ echo 'Force-Zuteilung gelöscht!
';
+ }
+
+ // Force speichern (neu/ändern)
+ if (isset($_POST['kc_force_save'])) {
+ $data = [
+ 'teilnehmer_id' => intval($_POST['teilnehmer_id']),
+ 'wahl_id' => intval($_POST['wahl_id']),
+ 'phase' => intval($_POST['phase']),
+ 'workshop_id' => intval($_POST['workshop_id']),
+ 'kommentar' => sanitize_text_field($_POST['kommentar'])
+ ];
+ if (!empty($_POST['fid'])) {
+ $wpdb->update("{$prefix}kc_force_zuteilung", $data, ['id'=>intval($_POST['fid'])]);
+ echo 'Force-Zuteilung aktualisiert!
';
+ } else {
+ $wpdb->insert("{$prefix}kc_force_zuteilung", $data);
+ echo 'Force-Zuteilung angelegt!
';
+ }
+ }
+
+ // Listen für Dropdowns
+ $teilnehmer_liste = $wpdb->get_results("SELECT * FROM {$prefix}kc_teilnehmer ORDER BY nachname, vorname");
+ $workshop_liste = $wpdb->get_results("SELECT * FROM {$prefix}kc_workshops ORDER BY name");
+ $wahlen = $wpdb->get_results("SELECT id, name FROM {$prefix}kc_wahlen WHERE deleted=0 ORDER BY name");
+
+ // Bearbeiten
+ if (isset($_GET['edit_force'])) {
+ $fid = intval($_GET['edit_force']);
+ $fz = $wpdb->get_row("SELECT * FROM {$prefix}kc_force_zuteilung WHERE id=$fid");
+ echo '';
+ echo '
Force-Zuteilung bearbeiten
+
+ ';
+ echo '
';
+ return;
+ }
+
+ // Neu anlegen
+ if (isset($_GET['new'])) {
+ echo '';
+ echo '
Neue Force-Zuteilung
+
+ ';
+ echo '
';
+ return;
+ }
+
+ // Übersicht
+ echo '';
+ echo '
Alle Force-Zuteilungen
';
+ echo '
+ Neue Force-Zuteilung';
+ echo '
';
+ echo '| Teilnehmer | Wahl | Phase | Workshop | Kommentar | Aktion |
';
+ $fz = $wpdb->get_results("SELECT * FROM {$prefix}kc_force_zuteilung ORDER BY id DESC");
+ foreach ($fz as $f) {
+ // Teilnehmer-Namen holen
+ $teilnehmer = $wpdb->get_row($wpdb->prepare("SELECT vorname, nachname FROM {$prefix}kc_teilnehmer WHERE id=%d", $f->teilnehmer_id));
+ $teilnehmer_name = $teilnehmer ? ($teilnehmer->vorname . ' ' . $teilnehmer->nachname) : 'ID ' . $f->teilnehmer_id;
+ $workshop_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$prefix}kc_workshops WHERE id=%d", $f->workshop_id));
+ $wahl_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$prefix}kc_wahlen WHERE id=%d", $f->wahl_id));
+ echo "
+ | ".esc_html($teilnehmer_name)." |
+ ".esc_html($wahl_name)." (ID ".intval($f->wahl_id).") |
+ ".intval($f->phase)." |
+ ".esc_html($workshop_name)." |
+ ".esc_html($f->kommentar)." |
+
+ Bearbeiten
+ Loeschen
+ |
+
";
+ }
+ echo '
';
+}
+?>