1060 lines
50 KiB
PHP
1060 lines
50 KiB
PHP
<?php
|
|
session_start();
|
|
|
|
require_once __DIR__ . "/../inc/config.inc.php";
|
|
require_once __DIR__ . "/../inc/functions.inc.php";
|
|
require_once __DIR__ . "/../inc/functions.impfen.inc.php";
|
|
|
|
$user = check_admin_user();
|
|
include __DIR__ . "/templates/header.inc.php";
|
|
|
|
if (!$user) {
|
|
echo "<div class='container main-container'><h3>Erst anmelden: <a href='login.php'>Login</a></h3></div>";
|
|
include __DIR__ . "/templates/footer.inc.php";
|
|
exit;
|
|
}
|
|
|
|
if (!check_worker()) {
|
|
echo "<div class='container main-container'>Dieser Bereich ist nur für Bearbeiter freigeschaltet.</div>";
|
|
include __DIR__ . "/templates/footer.inc.php";
|
|
exit;
|
|
}
|
|
|
|
function esc($v): string
|
|
{
|
|
return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
|
|
}
|
|
|
|
function weekdayName(int $d): string
|
|
{
|
|
$map = [1 => 'Montag', 2 => 'Dienstag', 3 => 'Mittwoch', 4 => 'Donnerstag', 5 => 'Freitag', 6 => 'Samstag', 7 => 'Sonntag'];
|
|
return $map[$d] ?? 'Unbekannt';
|
|
}
|
|
|
|
function workflowImpfartName(int $impfart): string
|
|
{
|
|
$map = [
|
|
1 => 'Erstimpfung',
|
|
2 => 'Zweitimpfung',
|
|
3 => 'Drittimpfung',
|
|
4 => 'Viertimpfung',
|
|
];
|
|
return $map[$impfart] ?? 'Unbekannt';
|
|
}
|
|
|
|
function workflowWarteStatus(int $checked): string
|
|
{
|
|
if ($checked === 1) {
|
|
return 'Bestätigt';
|
|
}
|
|
if ($checked === 0) {
|
|
return 'Unbestätigt';
|
|
}
|
|
return 'Status ' . $checked;
|
|
}
|
|
|
|
function workflowTerminStatus(int $checked, int $behandelt): string
|
|
{
|
|
if ($behandelt === 1) {
|
|
return 'Behandelt';
|
|
}
|
|
$map = [
|
|
0 => 'Anfrage offen',
|
|
1 => 'Bestätigt',
|
|
2 => 'Abgesagt',
|
|
3 => 'Vom Praxisteam abgesagt',
|
|
4 => 'Systemstorno',
|
|
];
|
|
return $map[$checked] ?? ('Status ' . $checked);
|
|
}
|
|
|
|
function workflowPlanLabel(array $plan): string
|
|
{
|
|
return impfZeitraumLabel($plan);
|
|
}
|
|
|
|
function ensureWorkflowTables(PDO $pdo): void
|
|
{
|
|
impfWorkflowEnsureTables($pdo);
|
|
}
|
|
|
|
function workflowAddWartelisteEntry(
|
|
PDO $pdo,
|
|
int $personId,
|
|
int $impfstoffId,
|
|
int $planId,
|
|
int $impfart,
|
|
?string $letzteImpfung,
|
|
int $checked
|
|
): array {
|
|
if ($personId <= 0) {
|
|
return [false, "Bitte eine Person auswaehlen."];
|
|
}
|
|
|
|
$impfstoffId = max(0, $impfstoffId);
|
|
$planId = max(0, $planId);
|
|
$impfart = ($impfart >= 1 && $impfart <= 4) ? $impfart : 1;
|
|
if ($impfart > 1 && !$letzteImpfung) {
|
|
$impfart = 1;
|
|
}
|
|
|
|
$stPerson = $pdo->prepare("SELECT person_id, patientenart, vorname, nachname
|
|
FROM persons
|
|
WHERE person_id = :pid
|
|
LIMIT 1");
|
|
$stPerson->execute(['pid' => $personId]);
|
|
$person = $stPerson->fetch(PDO::FETCH_ASSOC);
|
|
if (!$person) {
|
|
return [false, "Ausgewaehlte Person wurde nicht gefunden."];
|
|
}
|
|
|
|
$impfstoffValue = $impfstoffId;
|
|
$impfstoffName = 'ohne Vorgabe';
|
|
$zeitraum = 'Flexibel';
|
|
|
|
if ($planId > 0) {
|
|
$plan = impfLoadZeitraumById($pdo, $planId, true);
|
|
if (!$plan) {
|
|
return [false, "Das ausgewaehlte Zeitfenster ist nicht mehr verfuegbar."];
|
|
}
|
|
|
|
$zugeordneteImpfstoffe = $plan['impfstoff_id_list'] ?? [];
|
|
if ($impfstoffId > 0 && !in_array($impfstoffId, $zugeordneteImpfstoffe, true)) {
|
|
return [false, "Impfstoff und Zeitfenster passen nicht zusammen."];
|
|
}
|
|
|
|
if ($impfstoffId <= 0) {
|
|
if (count($zugeordneteImpfstoffe) !== 1) {
|
|
return [false, "Bitte einen Impfstoff auswaehlen, der dem Zeitfenster zugeordnet ist."];
|
|
}
|
|
$impfstoffId = (int)$zugeordneteImpfstoffe[0];
|
|
}
|
|
|
|
$stImpfstoff = $pdo->prepare("SELECT impfid, impfname
|
|
FROM impfstoff
|
|
WHERE impfid = :iid
|
|
LIMIT 1");
|
|
$stImpfstoff->execute(['iid' => $impfstoffId]);
|
|
$impfstoff = $stImpfstoff->fetch(PDO::FETCH_ASSOC);
|
|
if (!$impfstoff) {
|
|
return [false, "Der ausgewaehlte Impfstoff wurde nicht gefunden."];
|
|
}
|
|
|
|
$impfstoffValue = $impfstoffId;
|
|
$impfstoffName = (string)$impfstoff['impfname'];
|
|
$zeitraum = workflowPlanLabel($plan);
|
|
} elseif ($impfstoffId > 0) {
|
|
$stImpfstoff = $pdo->prepare("SELECT impfid, impfname
|
|
FROM impfstoff
|
|
WHERE impfid = :iid
|
|
LIMIT 1");
|
|
$stImpfstoff->execute(['iid' => $impfstoffId]);
|
|
$impfstoff = $stImpfstoff->fetch(PDO::FETCH_ASSOC);
|
|
if (!$impfstoff) {
|
|
return [false, "Der ausgewaehlte Impfstoff wurde nicht gefunden."];
|
|
}
|
|
$impfstoffName = (string)$impfstoff['impfname'];
|
|
} else {
|
|
$impfstoffValue = 0;
|
|
}
|
|
|
|
$stDup = $pdo->prepare("SELECT warteid
|
|
FROM warteliste
|
|
WHERE userid = :uid
|
|
AND checked IN (0, 1)
|
|
LIMIT 1");
|
|
$stDup->execute(['uid' => $personId]);
|
|
if ($stDup->fetch()) {
|
|
return [false, "Die Person ist bereits auf der aktiven Warteliste eingetragen."];
|
|
}
|
|
|
|
$patientenart = ((int)($person['patientenart'] ?? 0) === 1) ? 1 : 0;
|
|
$hash = md5('admin-warte-' . $personId . '-' . microtime(true) . '-' . random_int(1000, 9999));
|
|
$checkedValue = ($checked === 0) ? 0 : 1;
|
|
$letzteValue = ($impfart === 1) ? null : ($letzteImpfung ?: null);
|
|
|
|
$stInsert = $pdo->prepare("INSERT INTO warteliste
|
|
(userid, checked, hash, impfenangebot, impfstoff, Patientenart, Impfaufklaerung, WeitereFragen, impfart, impfenmit, letzteimpfung, impfenzeitraum, date_created)
|
|
VALUES
|
|
(:userid, :checked, :hash, 1, :impfstoff, :patientenart, 0, 0, :impfart, '', :letzteimpfung, :impfenzeitraum, NOW())");
|
|
$stInsert->execute([
|
|
'userid' => $personId,
|
|
'checked' => $checkedValue,
|
|
'hash' => $hash,
|
|
'impfstoff' => $impfstoffValue,
|
|
'patientenart' => $patientenart,
|
|
'impfart' => $impfart,
|
|
'letzteimpfung' => $letzteValue,
|
|
'impfenzeitraum' => $zeitraum,
|
|
]);
|
|
|
|
$personName = trim((string)$person['vorname'] . ' ' . (string)$person['nachname']);
|
|
return [true, "Wartelistenplatz fuer {$personName} ({$impfstoffName}) gespeichert."];
|
|
}
|
|
|
|
$message = "";
|
|
$error = "";
|
|
$personSearch = trim((string)($_POST['person_search'] ?? ''));
|
|
$view = (string)($_GET['view'] ?? 'event-create');
|
|
$validViews = ['warteliste', 'teilnehmer', 'event-create', 'event-teilnehmer'];
|
|
if (!in_array($view, $validViews, true)) {
|
|
$view = 'event-create';
|
|
}
|
|
|
|
try {
|
|
ensureWorkflowTables($pdo);
|
|
} catch (Throwable $e) {
|
|
$error = "Workflow-Tabellen konnten nicht erstellt werden: " . $e->getMessage();
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$aktion = (string)($_POST['aktion'] ?? '');
|
|
|
|
if ($aktion === 'create_event') {
|
|
$impfstoffId = (int)($_POST['impfstoff_id'] ?? 0);
|
|
$planId = (int)($_POST['plan_id'] ?? 0);
|
|
$datum = trim((string)($_POST['event_date'] ?? ''));
|
|
|
|
if ($impfstoffId <= 0 || $planId <= 0 || $datum === '') {
|
|
$error = "Bitte Impfstoff, Zeitraum und Datum auswählen.";
|
|
} else {
|
|
$stRule = $pdo->prepare("SELECT dosen_pro_flasche FROM impfstoff_workflow WHERE impfstoff_id = :iid LIMIT 1");
|
|
$stRule->execute(['iid' => $impfstoffId]);
|
|
$rule = $stRule->fetch(PDO::FETCH_ASSOC);
|
|
|
|
$plan = impfLoadZeitraumById($pdo, $planId, true);
|
|
|
|
if (!$rule || !$plan || !in_array($impfstoffId, $plan['impfstoff_id_list'] ?? [], true)) {
|
|
$error = "Bitte zuerst Stammdaten und Zeitraeume fuer den Impfstoff pflegen.";
|
|
} else {
|
|
$dow = (int)date('N', strtotime($datum));
|
|
if ($dow !== (int)$plan['wochentag']) {
|
|
$error = "Datum passt nicht zum gewaehlten Zeitraum (" . weekdayName((int)$plan['wochentag']) . ").";
|
|
} else {
|
|
$dosen = (int)$rule['dosen_pro_flasche'];
|
|
|
|
$stCount = $pdo->prepare("SELECT COUNT(*) FROM warteliste WHERE checked = 1 AND (impfstoff = :iid OR impfstoff = 0)");
|
|
$stCount->execute(['iid' => $impfstoffId]);
|
|
$wartende = (int)$stCount->fetchColumn();
|
|
|
|
if ($wartende < $dosen) {
|
|
$error = "Nicht genug bestätigte Warteteilnehmer: {$wartende} von {$dosen}.";
|
|
} else {
|
|
$stDup = $pdo->prepare("SELECT timeid FROM timeslots WHERE date = :date AND start = :start AND impfstoff = :iid LIMIT 1");
|
|
$stDup->execute(['date' => $datum, 'start' => $plan['start'], 'iid' => $impfstoffId]);
|
|
|
|
if ($stDup->fetch()) {
|
|
$error = "Für diesen Impfstoff existiert am gewählten Datum/Zeit bereits ein Event.";
|
|
} else {
|
|
$terminIds = [];
|
|
$mailTemplateId = ($impfstoffId === 5) ? '39' : '6';
|
|
|
|
try {
|
|
$pdo->beginTransaction();
|
|
|
|
$stInsSlot = $pdo->prepare("INSERT INTO timeslots (date, start, ende, aktiv, impfdosen, impfstoff, terminart, impfortid)
|
|
VALUES (:date, :start, :ende, 1, :dosen, :iid, 1, :oid)");
|
|
$stInsSlot->execute([
|
|
'date' => $datum,
|
|
'start' => $plan['start'],
|
|
'ende' => $plan['ende'],
|
|
'dosen' => $dosen,
|
|
'iid' => $impfstoffId,
|
|
'oid' => (int)$plan['impfortid'],
|
|
]);
|
|
$timeid = (int)$pdo->lastInsertId();
|
|
|
|
$stW = $pdo->prepare("SELECT warteid, userid, hash, impfart, Impfaufklaerung, WeitereFragen, letzteimpfung
|
|
FROM warteliste
|
|
WHERE checked = 1 AND (impfstoff = :iid OR impfstoff = 0)
|
|
ORDER BY date_created ASC, warteid ASC
|
|
LIMIT :lim");
|
|
$stW->bindValue(':iid', $impfstoffId, PDO::PARAM_INT);
|
|
$stW->bindValue(':lim', $dosen, PDO::PARAM_INT);
|
|
$stW->execute();
|
|
$warteRows = $stW->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
if (count($warteRows) < $dosen) {
|
|
throw new RuntimeException("Warteliste während Verarbeitung zu klein geworden.");
|
|
}
|
|
|
|
$stInsTermin = $pdo->prepare("INSERT INTO impftermin
|
|
(userid, timeid, hash, checked, behandelt, coronafragen, astraok, impfart, Impfaufklaerung, WeitereFragen, letzteimpfung)
|
|
VALUES
|
|
(:userid, :timeid, :hash, 0, 0, 0, 1, :impfart, :aufkl, :fragen, :letzte)");
|
|
$stDelW = $pdo->prepare("DELETE FROM warteliste WHERE warteid = :wid");
|
|
|
|
foreach ($warteRows as $w) {
|
|
$terminHash = md5((string)$w['hash'] . microtime(true) . random_int(100, 999));
|
|
$stInsTermin->execute([
|
|
'userid' => (int)$w['userid'],
|
|
'timeid' => $timeid,
|
|
'hash' => $terminHash,
|
|
'impfart' => max(1, (int)$w['impfart']),
|
|
'aufkl' => (int)($w['Impfaufklaerung'] ?? 0),
|
|
'fragen' => (int)($w['WeitereFragen'] ?? 0),
|
|
'letzte' => $w['letzteimpfung'] ?: null,
|
|
]);
|
|
$terminIds[] = (int)$pdo->lastInsertId();
|
|
$stDelW->execute(['wid' => (int)$w['warteid']]);
|
|
}
|
|
|
|
$stReduce = $pdo->prepare("UPDATE timeslots SET impfdosen = GREATEST(impfdosen - :cnt, 0) WHERE timeid = :timeid");
|
|
$stReduce->execute(['cnt' => count($terminIds), 'timeid' => $timeid]);
|
|
|
|
$pdo->commit();
|
|
|
|
foreach ($terminIds as $tid) {
|
|
SendMailMessageVorlage($pdo, '1', $tid, $mailTemplateId);
|
|
}
|
|
|
|
$message = count($terminIds) . " Terminanfragen wurden erstellt und versendet.";
|
|
} catch (Throwable $e) {
|
|
if ($pdo->inTransaction()) {
|
|
$pdo->rollBack();
|
|
}
|
|
$error = "Fehler beim Erstellen des Impfevents: " . $e->getMessage();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} elseif ($aktion === 'search_person') {
|
|
if ($personSearch === '') {
|
|
$error = "Bitte einen Suchbegriff für den Patientenstamm eingeben.";
|
|
}
|
|
} elseif ($aktion === 'add_waitlist_existing') {
|
|
$personId = (int)($_POST['wl_person_id'] ?? 0);
|
|
$impfstoffId = (int)($_POST['wl_impfstoff_id'] ?? 0);
|
|
$planId = (int)($_POST['wl_plan_id'] ?? 0);
|
|
|
|
[$ok, $msg] = workflowAddWartelisteEntry(
|
|
$pdo,
|
|
$personId,
|
|
$impfstoffId,
|
|
$planId,
|
|
1,
|
|
null,
|
|
1
|
|
);
|
|
if ($ok) {
|
|
$message = $msg;
|
|
} else {
|
|
$error = $msg;
|
|
}
|
|
} elseif ($aktion === 'add_waitlist_new') {
|
|
$vorname = trim((string)($_POST['new_vorname'] ?? ''));
|
|
$nachname = trim((string)($_POST['new_nachname'] ?? ''));
|
|
$geburtstag = trim((string)($_POST['new_geburtstag'] ?? ''));
|
|
$email = trim((string)($_POST['new_email'] ?? ''));
|
|
$tele = trim((string)($_POST['new_tele'] ?? ''));
|
|
$plz = trim((string)($_POST['new_plz'] ?? ''));
|
|
$ort = trim((string)($_POST['new_ort'] ?? ''));
|
|
$strasse = trim((string)($_POST['new_strasse'] ?? ''));
|
|
$patientenart = ((int)($_POST['new_patientenart'] ?? 0) === 1) ? 1 : 0;
|
|
|
|
$impfstoffId = (int)($_POST['new_impfstoff_id'] ?? 0);
|
|
$planId = (int)($_POST['new_plan_id'] ?? 0);
|
|
|
|
if ($vorname === '' || $nachname === '' || $geburtstag === '') {
|
|
$error = "Für neue Patienten sind Vorname, Nachname und Geburtstag erforderlich.";
|
|
} else {
|
|
try {
|
|
$personId = (int)Userspeichern(
|
|
$vorname,
|
|
$nachname,
|
|
$geburtstag,
|
|
$email,
|
|
$tele,
|
|
$ort,
|
|
$plz,
|
|
$strasse,
|
|
0,
|
|
$patientenart,
|
|
0
|
|
);
|
|
[$ok, $msg] = workflowAddWartelisteEntry(
|
|
$pdo,
|
|
$personId,
|
|
$impfstoffId,
|
|
$planId,
|
|
1,
|
|
null,
|
|
1
|
|
);
|
|
if ($ok) {
|
|
$message = $msg;
|
|
} else {
|
|
$error = $msg;
|
|
}
|
|
} catch (Throwable $e) {
|
|
$error = "Neuer Patient konnte nicht gespeichert werden: " . $e->getMessage();
|
|
}
|
|
}
|
|
} elseif ($aktion === 'cancel_event_participant') {
|
|
$terminId = (int)($_POST['terminid'] ?? 0);
|
|
if ($terminId <= 0) {
|
|
$error = "Ungültiger Termin.";
|
|
} else {
|
|
try {
|
|
$pdo->beginTransaction();
|
|
|
|
$stTermin = $pdo->prepare("SELECT it.terminid, it.timeid, it.checked, it.behandelt, p.vorname, p.nachname
|
|
FROM impftermin it
|
|
LEFT JOIN persons p ON p.person_id = it.userid
|
|
WHERE it.terminid = :tid
|
|
LIMIT 1");
|
|
$stTermin->execute(['tid' => $terminId]);
|
|
$termin = $stTermin->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$termin) {
|
|
throw new RuntimeException("Termin nicht gefunden.");
|
|
}
|
|
|
|
if ((int)$termin['behandelt'] === 1) {
|
|
throw new RuntimeException("Behandelte Termine können nicht abgesagt werden.");
|
|
}
|
|
|
|
$altStatus = (int)$termin['checked'];
|
|
if (in_array($altStatus, [2, 3, 4], true)) {
|
|
throw new RuntimeException("Der Termin ist bereits abgesagt.");
|
|
}
|
|
|
|
$stUpdate = $pdo->prepare("UPDATE impftermin
|
|
SET checked = 3
|
|
WHERE terminid = :tid");
|
|
$stUpdate->execute(['tid' => $terminId]);
|
|
|
|
if (in_array($altStatus, [0, 1], true)) {
|
|
$stDosen = $pdo->prepare("UPDATE timeslots
|
|
SET impfdosen = impfdosen + 1
|
|
WHERE timeid = :timeid");
|
|
$stDosen->execute(['timeid' => (int)$termin['timeid']]);
|
|
}
|
|
|
|
$pdo->commit();
|
|
$personName = trim((string)($termin['vorname'] ?? '') . ' ' . (string)($termin['nachname'] ?? ''));
|
|
$message = "Termin für " . trim($personName) . " wurde vom Praxisteam abgesagt.";
|
|
} catch (Throwable $e) {
|
|
if ($pdo->inTransaction()) {
|
|
$pdo->rollBack();
|
|
}
|
|
$error = "Termin konnte nicht abgesagt werden: " . $e->getMessage();
|
|
}
|
|
}
|
|
} elseif ($aktion === 'delete_event_participant') {
|
|
$terminId = (int)($_POST['terminid'] ?? 0);
|
|
if ($terminId <= 0) {
|
|
$error = "Ungültiger Termin.";
|
|
} else {
|
|
try {
|
|
$pdo->beginTransaction();
|
|
|
|
$stTermin = $pdo->prepare("SELECT it.terminid, it.timeid, it.checked, it.behandelt, p.vorname, p.nachname
|
|
FROM impftermin it
|
|
LEFT JOIN persons p ON p.person_id = it.userid
|
|
WHERE it.terminid = :tid
|
|
LIMIT 1");
|
|
$stTermin->execute(['tid' => $terminId]);
|
|
$termin = $stTermin->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$termin) {
|
|
throw new RuntimeException("Termin nicht gefunden.");
|
|
}
|
|
|
|
if ((int)$termin['behandelt'] === 1) {
|
|
throw new RuntimeException("Behandelte Termine können nicht gelöscht werden.");
|
|
}
|
|
|
|
$altStatus = (int)$termin['checked'];
|
|
if (in_array($altStatus, [0, 1], true)) {
|
|
$stDosen = $pdo->prepare("UPDATE timeslots
|
|
SET impfdosen = impfdosen + 1
|
|
WHERE timeid = :timeid");
|
|
$stDosen->execute(['timeid' => (int)$termin['timeid']]);
|
|
}
|
|
|
|
$stDelete = $pdo->prepare("DELETE FROM impftermin WHERE terminid = :tid");
|
|
$stDelete->execute(['tid' => $terminId]);
|
|
|
|
$pdo->commit();
|
|
$personName = trim((string)($termin['vorname'] ?? '') . ' ' . (string)($termin['nachname'] ?? ''));
|
|
$message = "Termin für " . trim($personName) . " wurde gelöscht.";
|
|
} catch (Throwable $e) {
|
|
if ($pdo->inTransaction()) {
|
|
$pdo->rollBack();
|
|
}
|
|
$error = "Termin konnte nicht gelöscht werden: " . $e->getMessage();
|
|
}
|
|
}
|
|
} elseif ($aktion === 'delete_waitlist') {
|
|
$warteid = (int)($_POST['warteid'] ?? 0);
|
|
if ($warteid <= 0) {
|
|
$error = "Ungültiger Wartelisten-Eintrag.";
|
|
} else {
|
|
$stDelete = $pdo->prepare("DELETE FROM warteliste WHERE warteid = :wid");
|
|
$stDelete->execute(['wid' => $warteid]);
|
|
if ($stDelete->rowCount() > 0) {
|
|
$message = "Wartelisten-Eintrag wurde gelöscht.";
|
|
} else {
|
|
$error = "Wartelisten-Eintrag nicht gefunden.";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$rules = [];
|
|
$plans = [];
|
|
$configuredImpfstoffe = [];
|
|
$eligible = [];
|
|
$personResults = [];
|
|
$waitRows = [];
|
|
$upcomingRows = [];
|
|
$eventOverview = [];
|
|
|
|
try {
|
|
$stRules = $pdo->prepare("SELECT r.impfstoff_id, r.dosen_pro_flasche, i.impfname,
|
|
COALESCE((SELECT COUNT(*) FROM warteliste w WHERE w.checked = 1 AND (w.impfstoff = r.impfstoff_id OR w.impfstoff = 0)),0) AS wartende
|
|
FROM impfstoff_workflow r
|
|
INNER JOIN impfstoff i ON i.impfid = r.impfstoff_id
|
|
ORDER BY i.impfname");
|
|
$stRules->execute();
|
|
$rules = $stRules->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
$plans = impfGetZeitraumRows($pdo, true);
|
|
|
|
$planExistsForImpfstoff = [];
|
|
foreach ($plans as $p) {
|
|
foreach ($p['impfstoff_id_list'] as $impfstoffId) {
|
|
$planExistsForImpfstoff[(int)$impfstoffId] = true;
|
|
}
|
|
}
|
|
|
|
foreach ($rules as $r) {
|
|
$iid = (int)$r['impfstoff_id'];
|
|
$dosen = (int)$r['dosen_pro_flasche'];
|
|
if ($dosen > 0 && isset($planExistsForImpfstoff[$iid])) {
|
|
$configuredImpfstoffe[] = $r;
|
|
if ((int)$r['wartende'] >= $dosen) {
|
|
$eligible[] = $r;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($personSearch !== '') {
|
|
$searchLike = '%' . $personSearch . '%';
|
|
$searchExactId = ctype_digit($personSearch) ? (int)$personSearch : -1;
|
|
$stPersons = $pdo->prepare("SELECT person_id, vorname, nachname, geburtstag, email, tele, ort, plz, strasse
|
|
FROM persons
|
|
WHERE person_id = :pid
|
|
OR vorname LIKE :q
|
|
OR nachname LIKE :q
|
|
OR email LIKE :q
|
|
OR tele LIKE :q
|
|
ORDER BY nachname, vorname
|
|
LIMIT 30");
|
|
$stPersons->execute([
|
|
'pid' => $searchExactId,
|
|
'q' => $searchLike,
|
|
]);
|
|
$personResults = $stPersons->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
$stWait = $pdo->prepare("SELECT w.warteid, w.userid, w.checked, w.impfstoff, w.impfart, w.impfenzeitraum, w.letzteimpfung, w.date_created,
|
|
p.vorname, p.nachname, p.geburtstag, p.email, p.tele,
|
|
i.impfname
|
|
FROM warteliste w
|
|
INNER JOIN persons p ON p.person_id = w.userid
|
|
LEFT JOIN impfstoff i ON i.impfid = w.impfstoff
|
|
WHERE w.checked IN (0, 1)
|
|
ORDER BY w.checked DESC, w.date_created ASC
|
|
LIMIT 500");
|
|
$stWait->execute();
|
|
$waitRows = $stWait->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
$stUpcoming = $pdo->prepare("SELECT ts.timeid, ts.date, ts.start, ts.ende, ts.impfdosen,
|
|
i.impfname, o.anzeigename, o.adresse,
|
|
it.terminid, it.checked, it.behandelt, it.impfart,
|
|
p.vorname, p.nachname, p.geburtstag, p.email, p.tele
|
|
FROM timeslots ts
|
|
INNER JOIN impfstoff i ON i.impfid = ts.impfstoff
|
|
LEFT JOIN impfort o ON o.ortid = ts.impfortid
|
|
LEFT JOIN impftermin it ON it.timeid = ts.timeid
|
|
LEFT JOIN persons p ON p.person_id = it.userid
|
|
WHERE ts.date >= :today
|
|
AND ts.aktiv = 1
|
|
ORDER BY ts.date, ts.start, ts.ende, i.impfname, p.nachname, p.vorname");
|
|
$stUpcoming->execute(['today' => date('Y-m-d')]);
|
|
$upcomingRows = $stUpcoming->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
foreach ($upcomingRows as $row) {
|
|
$timeid = (int)$row['timeid'];
|
|
if (!isset($eventOverview[$timeid])) {
|
|
$eventOverview[$timeid] = [
|
|
'timeid' => $timeid,
|
|
'date' => $row['date'],
|
|
'start' => $row['start'],
|
|
'ende' => $row['ende'],
|
|
'impfdosen' => (int)$row['impfdosen'],
|
|
'impfname' => $row['impfname'],
|
|
'anzeigename' => $row['anzeigename'],
|
|
'adresse' => $row['adresse'],
|
|
'teilnehmer' => [],
|
|
];
|
|
}
|
|
if (!empty($row['terminid'])) {
|
|
$eventOverview[$timeid]['teilnehmer'][] = [
|
|
'terminid' => (int)$row['terminid'],
|
|
'checked' => (int)($row['checked'] ?? 0),
|
|
'behandelt' => (int)($row['behandelt'] ?? 0),
|
|
'impfart' => (int)($row['impfart'] ?? 1),
|
|
'vorname' => (string)($row['vorname'] ?? ''),
|
|
'nachname' => (string)($row['nachname'] ?? ''),
|
|
'geburtstag' => (string)($row['geburtstag'] ?? ''),
|
|
'email' => (string)($row['email'] ?? ''),
|
|
'tele' => (string)($row['tele'] ?? ''),
|
|
];
|
|
}
|
|
}
|
|
} catch (Throwable $e) {
|
|
$error = trim($error . ' Fehler beim Laden der Impfverwaltung: ' . $e->getMessage());
|
|
}
|
|
?>
|
|
<div class="container main-container">
|
|
<h2>Impfverwaltung - Impfevent</h2>
|
|
|
|
<div class="row" style="margin-bottom: 15px;">
|
|
<div class="col-sm-12">
|
|
<a class="btn <?php echo ($view === 'warteliste') ? 'btn-primary' : 'btn-default'; ?>" href="impfworkflow_warteliste.php">Warteliste</a>
|
|
<a class="btn <?php echo ($view === 'teilnehmer') ? 'btn-primary' : 'btn-default'; ?>" href="impfworkflow_teilnehmer.php">Teilnehmer pflegen</a>
|
|
<a class="btn <?php echo ($view === 'event-create') ? 'btn-success' : 'btn-default'; ?>" href="impfworkflow_event_create.php">Impfevent erstellen</a>
|
|
<a class="btn <?php echo ($view === 'event-teilnehmer') ? 'btn-primary' : 'btn-default'; ?>" href="impfworkflow_event_teilnehmer.php">Geplante Event-Teilnehmer</a>
|
|
<a class="btn btn-default" href="impfworkflow_stammdaten.php">Stammdaten</a>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if ($message): ?>
|
|
<div class="alert alert-success"><?php echo esc($message); ?></div>
|
|
<?php endif; ?>
|
|
<?php if ($error): ?>
|
|
<div class="alert alert-danger"><?php echo esc($error); ?></div>
|
|
<?php endif; ?>
|
|
|
|
<style>
|
|
.workflow-action-row {
|
|
margin-top: 12px;
|
|
text-align: left;
|
|
}
|
|
</style>
|
|
|
|
<?php if ($view === 'warteliste'): ?>
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading"><strong>Aktive Impfwarteliste</strong></div>
|
|
<div class="panel-body">
|
|
<?php if (empty($waitRows)): ?>
|
|
<p>Aktuell gibt es keine aktiven Wartelisten-Einträge.</p>
|
|
<?php else: ?>
|
|
<table class="table table-bordered table-striped table-condensed">
|
|
<thead>
|
|
<tr>
|
|
<th>Patient</th>
|
|
<th>Kontakt</th>
|
|
<th>Impfstoff</th>
|
|
<th>Zeitraum</th>
|
|
<th>Impfungsart</th>
|
|
<th>Status</th>
|
|
<th>Eingetragen</th>
|
|
<th>Aktion</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($waitRows as $w): ?>
|
|
<tr>
|
|
<td>
|
|
<?php echo esc(trim((string)$w['vorname'] . ' ' . (string)$w['nachname'])); ?><br>
|
|
<small><?php echo esc((string)$w['geburtstag']); ?></small>
|
|
</td>
|
|
<td>
|
|
<?php echo esc((string)$w['email']); ?><br>
|
|
<?php echo esc((string)$w['tele']); ?>
|
|
</td>
|
|
<td><?php echo esc((string)($w['impfname'] ?: 'Unbekannt')); ?></td>
|
|
<td><?php echo esc((string)$w['impfenzeitraum']); ?></td>
|
|
<td>
|
|
<?php echo esc(workflowImpfartName((int)$w['impfart'])); ?>
|
|
<?php if (!empty($w['letzteimpfung'])): ?>
|
|
<br><small>Letzte: <?php echo esc((string)$w['letzteimpfung']); ?></small>
|
|
<?php endif; ?>
|
|
</td>
|
|
<td><?php echo esc(workflowWarteStatus((int)$w['checked'])); ?></td>
|
|
<td><?php echo esc((string)$w['date_created']); ?></td>
|
|
<td>
|
|
<form method="post" onsubmit="return confirm('Eintrag wirklich löschen?');">
|
|
<input type="hidden" name="aktion" value="delete_waitlist">
|
|
<input type="hidden" name="warteid" value="<?php echo (int)$w['warteid']; ?>">
|
|
<button class="btn btn-danger btn-xs" type="submit">Löschen</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($view === 'teilnehmer'): ?>
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading"><strong>Patient aus Kundenstamm zur Warteliste hinzufügen</strong></div>
|
|
<div class="panel-body">
|
|
<form method="post" class="form-inline" style="margin-bottom:12px;">
|
|
<input type="hidden" name="aktion" value="search_person">
|
|
<label>Patientensuche</label>
|
|
<input class="form-control" type="text" name="person_search" value="<?php echo esc($personSearch); ?>" placeholder="Name, E-Mail, Telefon oder ID">
|
|
<div class="workflow-action-row">
|
|
<button class="btn btn-default" type="submit">Suchen</button>
|
|
</div>
|
|
</form>
|
|
|
|
<?php if ($personSearch !== ''): ?>
|
|
<?php if (empty($personResults)): ?>
|
|
<div class="alert alert-warning">Keine Person im Kundenstamm gefunden.</div>
|
|
<?php else: ?>
|
|
<div class="alert alert-info"><?php echo count($personResults); ?> Treffer gefunden. Impfangaben sind optional, neue Eintraege werden automatisch als bestaetigt gespeichert.</div>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
|
|
<form method="post" class="form-inline">
|
|
<input type="hidden" name="aktion" value="add_waitlist_existing">
|
|
<input type="hidden" name="person_search" value="<?php echo esc($personSearch); ?>">
|
|
|
|
<label>Patient</label>
|
|
<select class="form-control" name="wl_person_id" required <?php echo empty($personResults) ? 'disabled' : ''; ?>>
|
|
<option value="">Bitte wählen</option>
|
|
<?php foreach ($personResults as $p): ?>
|
|
<?php
|
|
$pid = (int)$p['person_id'];
|
|
$selected = ((int)($_POST['wl_person_id'] ?? 0) === $pid) ? 'selected' : '';
|
|
$personLabel = trim((string)$p['nachname'] . ', ' . (string)$p['vorname']) . ' | ' . (string)$p['geburtstag'] . ' | ' . (string)$p['email'];
|
|
?>
|
|
<option value="<?php echo $pid; ?>" <?php echo $selected; ?>><?php echo esc($personLabel); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
|
|
<label style="margin-left:10px;">Impfstoff</label>
|
|
<select class="form-control" name="wl_impfstoff_id" id="existing_impfstoff">
|
|
<option value="0" <?php echo ((int)($_POST['wl_impfstoff_id'] ?? 0) === 0) ? 'selected' : ''; ?>>Keine Vorgabe</option>
|
|
<?php foreach ($configuredImpfstoffe as $r): ?>
|
|
<?php
|
|
$iid = (int)$r['impfstoff_id'];
|
|
$selected = ((int)($_POST['wl_impfstoff_id'] ?? 0) === $iid) ? 'selected' : '';
|
|
?>
|
|
<option value="<?php echo $iid; ?>" <?php echo $selected; ?>>
|
|
<?php echo esc($r['impfname'] . ' (Dosen: ' . $r['dosen_pro_flasche'] . ')'); ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
|
|
<label style="margin-left:10px;">Zeitfenster</label>
|
|
<select class="form-control" name="wl_plan_id" id="existing_plan">
|
|
<option value="0" <?php echo ((int)($_POST['wl_plan_id'] ?? 0) === 0) ? 'selected' : ''; ?>>Ohne Zeitfenster</option>
|
|
<?php foreach ($plans as $p): ?>
|
|
<?php
|
|
$planId = (int)$p['zeitraum_id'];
|
|
$selected = ((int)($_POST['wl_plan_id'] ?? 0) === $planId) ? 'selected' : '';
|
|
$impfstoffeCsv = implode(',', $p['impfstoff_id_list']);
|
|
$impfstoffeText = empty($p['impfstoff_name_list']) ? 'ohne Impfstoff' : implode(', ', $p['impfstoff_name_list']);
|
|
?>
|
|
<option value="<?php echo $planId; ?>" data-impfstoffe="<?php echo esc($impfstoffeCsv); ?>" <?php echo $selected; ?>>
|
|
<?php echo esc(workflowPlanLabel($p) . ' | Impfstoffe: ' . $impfstoffeText); ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<div class="workflow-action-row">
|
|
<button class="btn btn-primary" type="submit" <?php echo empty($personResults) ? 'disabled' : ''; ?>>
|
|
Zur Warteliste hinzufügen
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading"><strong>Neuen Patienten anlegen und zur Warteliste hinzufügen</strong></div>
|
|
<div class="panel-body">
|
|
<form method="post">
|
|
<input type="hidden" name="aktion" value="add_waitlist_new">
|
|
<div class="row">
|
|
<div class="col-sm-3">
|
|
<label>Vorname</label>
|
|
<input class="form-control" type="text" name="new_vorname" value="<?php echo esc((string)($_POST['new_vorname'] ?? '')); ?>" required>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<label>Nachname</label>
|
|
<input class="form-control" type="text" name="new_nachname" value="<?php echo esc((string)($_POST['new_nachname'] ?? '')); ?>" required>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<label>Geburtstag</label>
|
|
<input class="form-control" type="date" name="new_geburtstag" value="<?php echo esc((string)($_POST['new_geburtstag'] ?? '')); ?>" required>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<label>E-Mail</label>
|
|
<input class="form-control" type="email" name="new_email" value="<?php echo esc((string)($_POST['new_email'] ?? '')); ?>">
|
|
</div>
|
|
</div>
|
|
<div class="row" style="margin-top:10px;">
|
|
<div class="col-sm-3">
|
|
<label>Telefon</label>
|
|
<input class="form-control" type="text" name="new_tele" value="<?php echo esc((string)($_POST['new_tele'] ?? '')); ?>">
|
|
</div>
|
|
<div class="col-sm-2">
|
|
<label>PLZ</label>
|
|
<input class="form-control" type="text" name="new_plz" value="<?php echo esc((string)($_POST['new_plz'] ?? '')); ?>">
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<label>Ort</label>
|
|
<input class="form-control" type="text" name="new_ort" value="<?php echo esc((string)($_POST['new_ort'] ?? '')); ?>">
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<label>Straße</label>
|
|
<input class="form-control" type="text" name="new_strasse" value="<?php echo esc((string)($_POST['new_strasse'] ?? '')); ?>">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row" style="margin-top:10px;">
|
|
<div class="col-sm-3">
|
|
<label>Schon Patient in der Praxis</label>
|
|
<select class="form-control" name="new_patientenart" required>
|
|
<option value="">Bitte wählen</option>
|
|
<option value="1" <?php echo ((string)($_POST['new_patientenart'] ?? '') === '1') ? 'selected' : ''; ?>>Ja</option>
|
|
<option value="0" <?php echo ((string)($_POST['new_patientenart'] ?? '') === '0') ? 'selected' : ''; ?>>Nein</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<label>Impfstoff</label>
|
|
<select class="form-control" name="new_impfstoff_id" id="new_impfstoff">
|
|
<option value="0" <?php echo ((int)($_POST['new_impfstoff_id'] ?? 0) === 0) ? 'selected' : ''; ?>>Keine Vorgabe</option>
|
|
<?php foreach ($configuredImpfstoffe as $r): ?>
|
|
<?php
|
|
$iid = (int)$r['impfstoff_id'];
|
|
$selected = ((int)($_POST['new_impfstoff_id'] ?? 0) === $iid) ? 'selected' : '';
|
|
?>
|
|
<option value="<?php echo $iid; ?>" <?php echo $selected; ?>>
|
|
<?php echo esc($r['impfname'] . ' (Dosen: ' . $r['dosen_pro_flasche'] . ')'); ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<label>Zeitfenster</label>
|
|
<select class="form-control" name="new_plan_id" id="new_plan">
|
|
<option value="0" <?php echo ((int)($_POST['new_plan_id'] ?? 0) === 0) ? 'selected' : ''; ?>>Ohne Zeitfenster</option>
|
|
<?php foreach ($plans as $p): ?>
|
|
<?php
|
|
$planId = (int)$p['zeitraum_id'];
|
|
$selected = ((int)($_POST['new_plan_id'] ?? 0) === $planId) ? 'selected' : '';
|
|
$impfstoffeCsv = implode(',', $p['impfstoff_id_list']);
|
|
$impfstoffeText = empty($p['impfstoff_name_list']) ? 'ohne Impfstoff' : implode(', ', $p['impfstoff_name_list']);
|
|
?>
|
|
<option value="<?php echo $planId; ?>" data-impfstoffe="<?php echo esc($impfstoffeCsv); ?>" <?php echo $selected; ?>>
|
|
<?php echo esc(workflowPlanLabel($p) . ' | Impfstoffe: ' . $impfstoffeText); ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row" style="margin-top:10px;">
|
|
<div class="col-sm-12">
|
|
<p class="help-block" style="margin-bottom:0;">
|
|
Der Eintrag wird automatisch als bestaetigt gespeichert.
|
|
</p>
|
|
<div class="workflow-action-row">
|
|
<button class="btn btn-primary" type="submit">
|
|
Patienten speichern und zur Warteliste hinzufügen
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($view === 'event-create'): ?>
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading"><strong>Konkretes Impfevent erstellen</strong></div>
|
|
<div class="panel-body">
|
|
<p>Es werden nur Impfstoffe angeboten, bei denen die bestätigte Warteliste mindestens eine Flasche füllt.</p>
|
|
|
|
<form method="post" class="form-inline" style="margin-bottom:14px;">
|
|
<input type="hidden" name="aktion" value="create_event">
|
|
<label>Impfstoff (bereit)</label>
|
|
<select class="form-control" name="impfstoff_id" id="event_impfstoff" required>
|
|
<option value="">Bitte wählen</option>
|
|
<?php foreach ($eligible as $e): ?>
|
|
<option value="<?php echo (int)$e['impfstoff_id']; ?>"><?php echo esc($e['impfname'] . ' (Wartende: ' . $e['wartende'] . ', Dosen: ' . $e['dosen_pro_flasche'] . ')'); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
|
|
<label style="margin-left:10px;">Zeitraum</label>
|
|
<select class="form-control" name="plan_id" id="event_plan" required>
|
|
<option value="">Bitte wählen</option>
|
|
<?php foreach ($plans as $p): ?>
|
|
<?php
|
|
$impfstoffeCsv = implode(',', $p['impfstoff_id_list']);
|
|
$impfstoffeText = empty($p['impfstoff_name_list']) ? 'ohne Impfstoff' : implode(', ', $p['impfstoff_name_list']);
|
|
?>
|
|
<option value="<?php echo (int)$p['zeitraum_id']; ?>" data-impfstoffe="<?php echo esc($impfstoffeCsv); ?>">
|
|
<?php echo esc(workflowPlanLabel($p) . ' | Impfstoffe: ' . $impfstoffeText); ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
|
|
<label style="margin-left:10px;">Konkretes Datum</label>
|
|
<input class="form-control" type="date" name="event_date" required>
|
|
<div class="workflow-action-row">
|
|
<button class="btn btn-success" type="submit">Impfevent erstellen</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($view === 'event-teilnehmer'): ?>
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading"><strong>Teilnehmer geplanter Impfevents</strong></div>
|
|
<div class="panel-body">
|
|
<?php if (empty($eventOverview)): ?>
|
|
<p>Aktuell sind keine zukünftigen Impfevents vorhanden.</p>
|
|
<?php else: ?>
|
|
<?php foreach ($eventOverview as $event): ?>
|
|
<div class="panel panel-info">
|
|
<div class="panel-heading">
|
|
<strong><?php echo esc((string)$event['impfname']); ?></strong>
|
|
| <?php echo esc((string)$event['date']); ?> <?php echo esc(substr((string)$event['start'], 0, 5)); ?>-<?php echo esc(substr((string)$event['ende'], 0, 5)); ?>
|
|
| <?php echo esc((string)($event['anzeigename'] ?? '')); ?>
|
|
</div>
|
|
<div class="panel-body">
|
|
<?php if (!empty($event['adresse'])): ?>
|
|
<p><small><?php echo esc((string)$event['adresse']); ?></small></p>
|
|
<?php endif; ?>
|
|
<p><strong>Geplante Dosen:</strong> <?php echo (int)$event['impfdosen']; ?> |
|
|
<strong>Teilnehmer:</strong> <?php echo count($event['teilnehmer']); ?></p>
|
|
|
|
<?php if (empty($event['teilnehmer'])): ?>
|
|
<p>Für dieses Event sind noch keine Teilnehmer angelegt.</p>
|
|
<?php else: ?>
|
|
<table class="table table-bordered table-striped table-condensed">
|
|
<thead>
|
|
<tr>
|
|
<th>Patient</th>
|
|
<th>Kontakt</th>
|
|
<th>Impfungsart</th>
|
|
<th>Status</th>
|
|
<th>Aktion</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($event['teilnehmer'] as $t): ?>
|
|
<tr>
|
|
<td>
|
|
<?php echo esc(trim((string)$t['vorname'] . ' ' . (string)$t['nachname'])); ?><br>
|
|
<small><?php echo esc((string)$t['geburtstag']); ?></small>
|
|
</td>
|
|
<td>
|
|
<?php echo esc((string)$t['email']); ?><br>
|
|
<?php echo esc((string)$t['tele']); ?>
|
|
</td>
|
|
<td><?php echo esc(workflowImpfartName((int)$t['impfart'])); ?></td>
|
|
<td><?php echo esc(workflowTerminStatus((int)$t['checked'], (int)$t['behandelt'])); ?></td>
|
|
<td>
|
|
<?php
|
|
$terminId = (int)$t['terminid'];
|
|
$behandelt = (int)$t['behandelt'];
|
|
$checked = (int)$t['checked'];
|
|
$kannAbsagen = ($behandelt === 0) && !in_array($checked, [2, 3, 4], true);
|
|
$kannLoeschen = ($behandelt === 0);
|
|
?>
|
|
<form method="post" style="display:inline-block; margin-right:6px;" onsubmit="return confirm('Termin wirklich absagen?');">
|
|
<input type="hidden" name="aktion" value="cancel_event_participant">
|
|
<input type="hidden" name="terminid" value="<?php echo $terminId; ?>">
|
|
<button class="btn btn-warning btn-xs" type="submit" <?php echo $kannAbsagen ? '' : 'disabled'; ?>>Absagen</button>
|
|
</form>
|
|
<form method="post" style="display:inline-block;" onsubmit="return confirm('Termin wirklich löschen?');">
|
|
<input type="hidden" name="aktion" value="delete_event_participant">
|
|
<input type="hidden" name="terminid" value="<?php echo $terminId; ?>">
|
|
<button class="btn btn-danger btn-xs" type="submit" <?php echo $kannLoeschen ? '' : 'disabled'; ?>>Löschen</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<script>
|
|
(function () {
|
|
function bindPlanFilter(impfstoffId, planId) {
|
|
var impfstoff = document.getElementById(impfstoffId);
|
|
var plan = document.getElementById(planId);
|
|
if (!impfstoff || !plan) {
|
|
return;
|
|
}
|
|
function filterPlans() {
|
|
var val = impfstoff.value;
|
|
var needsFilter = (val !== "" && val !== "0");
|
|
var selectedValid = false;
|
|
for (var i = 0; i < plan.options.length; i++) {
|
|
var opt = plan.options[i];
|
|
var optionImpfstoffe = opt.getAttribute('data-impfstoffe');
|
|
if (!optionImpfstoffe) {
|
|
opt.hidden = false;
|
|
if (opt.value === plan.value) {
|
|
selectedValid = true;
|
|
}
|
|
continue;
|
|
}
|
|
var ids = optionImpfstoffe.split(',');
|
|
var visible = !needsFilter;
|
|
if (needsFilter) {
|
|
for (var j = 0; j < ids.length; j++) {
|
|
if (ids[j] === val) {
|
|
visible = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
opt.hidden = !visible;
|
|
if (visible && opt.value === plan.value) {
|
|
selectedValid = true;
|
|
}
|
|
}
|
|
if (!selectedValid) {
|
|
plan.value = '';
|
|
}
|
|
}
|
|
impfstoff.addEventListener('change', filterPlans);
|
|
filterPlans();
|
|
}
|
|
|
|
bindPlanFilter('event_impfstoff', 'event_plan');
|
|
bindPlanFilter('existing_impfstoff', 'existing_plan');
|
|
bindPlanFilter('new_impfstoff', 'new_plan');
|
|
})();
|
|
</script>
|
|
</div>
|
|
|
|
<?php include __DIR__ . "/templates/footer.inc.php"; ?>
|
|
|
|
|