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 '

Mit diesen Schaltern kannst du in der Testumgebung automatisch Beispiel-Daten erzeugen oder wieder komplett entfernen. Die Aktionen sind reversibel und zielen nur auf Einträge mit dem Präfix "TEST - ".

'; + echo ''; + + echo '

Generierungs-Optionen

'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
Anzahl Workshops
Teilnehmer pro Phase
Phasen (Einheiten)
Min. Workshop-Kapazität
Max. Workshop-Kapazität
'; + + echo '

'; + echo ' '; + echo '

'; + 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 '
'; + $nonce = wp_create_nonce('kc_teamer_pass_action'); + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + 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

+
+ + + + + Abbrechen +
'; + echo '
'; + return; + } + + // Neuen Teamer anlegen + if (isset($_GET['new'])) { + echo '
'; + echo '

Neuen Teamer anlegen

+
+ + + + Abbrechen +
'; + 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 ''; + echo ''; + echo ''; + echo ''; + + $teamer = $wpdb->get_results("SELECT * FROM {$prefix}kc_teamer ORDER BY {$sort} {$order}"); + foreach ($teamer as $tm) { + echo " + + + + "; + } + echo '
Vorname'.$vorname_arrow.'Nachname'.$nachname_arrow.'Aktion
".esc_html($tm->vorname)."".esc_html($tm->nachname)." + Bearbeiten + Loeschen +
'; + 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 '
' + .'' + .'' + .'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 'Loeschen'; + 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

+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + Abbrechen +
+ '; + echo '
'; + return; + } + + // Neu anlegen + if (isset($_GET['new'])) { + echo '
'; + echo '

Neue Force-Zuteilung

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + Abbrechen +
+ '; + echo '
'; + return; + } + + // Übersicht + echo '
'; + echo '

Alle Force-Zuteilungen

'; + echo '+ Neue Force-Zuteilung'; + echo ''; + echo ''; + $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 " + + + + + + + "; + } + echo '
TeilnehmerWahlPhaseWorkshopKommentarAktion
".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 +
'; +} +?>