";
ZuruckzumAnfrageOverView();
?>
prepare("
SELECT acc.email, a.sicherenachricht
FROM anfragen a
LEFT JOIN persons acc ON acc.person_id = a.requester_person_id
WHERE a.anfrageid = :anfrageid
LIMIT 1
");
$stmt->execute([':anfrageid' => $anfrageid]);
$rowuser = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowuser) {
die("Anfrage nicht gefunden.");
}
$empfaenger = (string)$rowuser["email"];
$sicherenachricht = (int)$rowuser["sicherenachricht"];
// 2) Betreff + Body aus POST
// Du speicherst in der DB offenbar CP1252 (weil du später iconv auf CP1252 machst)
$betreff_cp1252 = $_POST["betreff"] ?? "";
$body_cp1252 = $_POST["body"] ?? "";
// 3) Anfrage updaten (mit prepared statement!)
$stmt = $pdo->prepare("
UPDATE anfragen
SET
beantwortet = 1,
checked = 10,
workerid = :workerid,
antwortid = :antwortid,
antworttext = :antworttext,
mailtime = :mailtime
WHERE anfrageid = :anfrageid
");
$ok = $stmt->execute([
':workerid' => (int)$user["id"],
':antwortid' => $templetid,
':antworttext' => $body_cp1252,
':mailtime' => date("Y-m-d H:i:s"),
':anfrageid' => $anfrageid,
]);
try {
// 1) Mail senden
$mailOk = false;
if ((int)$sicherenachricht === 1) {
SendMailMessageVorlage($pdo, "3", $anfrageid, "43"); // muss true/false liefern
$mailOk = true;
} else {
$mailOk = SendMailMessage($pdo, $empfaenger, $_POST["betreff"], $_POST["body"]); // true/false
}
if (!$mailOk) {
throw new RuntimeException("E-Mail konnte nicht versendet werden.");
}
// 2) DB erst jetzt updaten
$stmt = $pdo->prepare("
UPDATE anfragen
SET beantwortet = 1,
checked = 10,
workerid = :workerid,
antwortid = :antwortid,
antworttext = :antworttext,
mailtime = :mailtime
WHERE anfrageid = :anfrageid
");
$stmt->execute([
':workerid' => (int)$user["id"],
':antwortid' => (int)$templetid,
':antworttext' => $body_cp1252,
':mailtime' => date("Y-m-d H:i:s"),
':anfrageid' => (int)$anfrageid,
]);
echo "
Mail wurde versendet
";
} catch (Throwable $e) {
echo "
Fehler
";
echo "E-Mailversand fehlgeschlagen – es wurde nichts gespeichert. ";
}
}else if (($_POST["aktion"] ?? '') == "4") {
echo "
Urlaubsplanung
";
echo "Während des Urlaubs können keine Anfragen an das Praxis Team gestellt werden.
";
echo '
Wichtige Hinweise
Nur an Tagen, die hier aufgeführt werden, können keine Anfragen gestellt werden.
Telefonanlage
Die Telefonanlage wird auch über dieses Formular gesteuert.
Überprüfung
Bitte die Setzung für die Telefonanlage hier überprüfen: Terminüberprüfung
';
try {
$heute = date("Y-m-d");
$stmt = $pdo->prepare("
SELECT urlaubid, start, ende, vertretung, vertretertelefon, vertreteradresse, vertreterurl
FROM urlaub
WHERE ende >= :heute
ORDER BY start ASC
");
$stmt->execute([':heute' => $heute]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "
Aktuell gibt es folgende Urlaubseinträge
";
echo "Soll der Urlaub deaktiviert / gelöscht werden, dann das Anfangs- und Enddatum in die Vergangenheit legen und den Eintrag speichern.
";
echo "
Eintragungshinweis
";
echo "Bei der Einrichtung bedenken, dass freie Tage (Wochenende, Feiertage) nicht erkannt werden.
So sollten Sie bei Urlaub ab Montag hier den Starttermin auf Freitag oder Samstag stellen.
Gleiches gilt für ein Ende an einem Freitag. Tragen Sie dann hier als Ende Sonntag ein.
";
echo '";
}else if (($_POST["aktion"] ?? '') == "5") {
// Termine in DB speichern.
$i =0;
foreach ($_POST['Starttime'] as $Starttime) {
//echo $datum . " ";
if($_POST["Starttime"][$i] != "0000-00-00"){
//echo $_POST["urlaubid"][$i] . " ";
$stmt = $pdo->prepare("
INSERT INTO urlaub
(urlaubid, vertretung, start, ende, vertretertelefon, vertreteradresse, vertreterurl)
VALUES
(:urlaubid, :vertretung, :start, :ende, :telefon, :adresse, :url)
ON DUPLICATE KEY UPDATE
vertretung = VALUES(vertretung),
start = VALUES(start),
ende = VALUES(ende),
vertretertelefon = VALUES(vertretertelefon),
vertreteradresse = VALUES(vertreteradresse),
vertreterurl = VALUES(vertreterurl)
");
$ok = $stmt->execute([
':urlaubid' => (int)$_POST['urlaubid'][$i], // 0 = INSERT, >0 = UPDATE
':vertretung' => $_POST['vertretung'][$i],
':start' => $_POST['Starttime'][$i],
':ende' => $_POST['Endetime'][$i],
':telefon' => $_POST['vertretertelefon'][$i],
':adresse' => $_POST['vertreteradresse'][$i],
':url' => $_POST['vertreterurl'][$i],
]);
if (!$ok) {
throw new RuntimeException("Fehler beim Eintragen in der Datenbank.");
}
}
$i++;
}
echo "Einträge wurden in der Datenbank gespeichert!
";
echo "Während der Notfallsprechstunde gibt es einen Hinweisfeld auf der Hauptseite, aber es können noch Anfragen an das Praxis Team gestellt werden. ";
echo "Wird Urlaub aktiviert, dann gibt es keinen Hinweis auf die Notfallsprechstunde ";
// Check connection
try {
$heute = date("Y-m-d");
$stmt = $pdo->prepare("
SELECT *
FROM notfallsprechstunde
WHERE ende >= :heute
ORDER BY ende ASC
");
$stmt->execute([':heute' => $heute]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("Datenbankfehler: " . $e->getMessage());
}
echo "
Aktuell gibt es folgende Einträge für die Notfallsprechstunde
";
echo "Soll die Notfallsprechstunde deaktiviert / gelöscht werden, dann das Anfangs- und Enddatum in die Vergangenheit legen und den Eintrag speichern.
";
echo '";
}else if (($_POST["aktion"] ?? '') == "7") {
// Termine in DB speichern.
try {
$pdo->beginTransaction();
$insertStmt = $pdo->prepare("
INSERT INTO notfallsprechstunde (start, ende, hinweis)
VALUES (:start, :ende, :hinweis)
");
$updateStmt = $pdo->prepare("
UPDATE notfallsprechstunde
SET start = :start,
ende = :ende,
hinweis = :hinweis
WHERE notfallid = :notfallid
");
foreach (($_POST['Starttime'] ?? []) as $i => $start) {
$start = (string)$start;
$ende = (string)($_POST['Endetime'][$i] ?? '');
$hinweis = (string)($_POST['hinweis'][$i] ?? '');
$notfallid = (int)($_POST['notfallid'][$i] ?? 0);
// Skip leere / ungültige Datumseinträge
if ($start === '' || $start === '0000-00-00') {
continue;
}
if ($notfallid === 0) {
$insertStmt->execute([
':start' => $start,
':ende' => $ende,
':hinweis' => $hinweis,
]);
} else {
$updateStmt->execute([
':start' => $start,
':ende' => $ende,
':hinweis' => $hinweis,
':notfallid' => $notfallid,
]);
}
}
$pdo->commit();
echo "Einträge wurden in der Datenbank gespeichert!
";
} catch (PDOException $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
die("Fehler beim Eintragen in der Datenbank: " . $e->getMessage());
}
echo' ';
}
else if (($_POST["aktion"] ?? '') == "8") {
$anfrageid = (int)($_POST["anfrageid"] ?? 0);
$stmt = $pdo->prepare("
SELECT *
FROM anfragen a
INNER JOIN persons p ON p.person_id = a.requester_person_id
WHERE a.anfrageid = :anfrageid
LIMIT 1
");
$stmt->execute([
':anfrageid' => $anfrageid
]);
$rowtime = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowtime) {
die("Anfrage nicht gefunden");
}
$vorname = $rowtime["vorname"];
$nachname = $rowtime["nachname"];
$userausgabe = $vorname . " " . $nachname;
echo "Name: $userausgabe Anforderung: $impfstofftext ";
echo "Wollen Sie wirklich diesen Eintrag löschen? Dieses ist nicht rückgängig zu machen! Dann bestätigen Sie die Abmeldung: ";
echo "";
echo "
";
echo "
";
ZuruckzumAnfrageOverView();
// Benutzer absagen bestätigen?
}else if (($_POST["aktion"] ?? '') == "9") {
$anfrageid = (int)($_POST["anfrageid"] ?? 0);
if ($anfrageid <= 0) {
die("Ungültige Anfrage-ID");
}
try {
$pdo->beginTransaction();
// sicherstellen, dass Anfrage existiert
$stmt = $pdo->prepare("SELECT anfrageid FROM anfragen WHERE anfrageid = :anfrageid LIMIT 1");
$stmt->execute([':anfrageid' => $anfrageid]);
if (!$stmt->fetch(PDO::FETCH_ASSOC)) {
throw new RuntimeException("Anfrage nicht gefunden");
}
// Update vorbereiten/ausführen
$stmt = $pdo->prepare("
UPDATE anfragen
SET beantwortet = 1,
checked = 30,
workerid = :workerid,
antwortid = 0
WHERE anfrageid = :anfrageid
");
$stmt->execute([
':workerid' => (int)($user["id"] ?? 0),
':anfrageid' => $anfrageid,
]);
// Mail senden (muss true liefern oder Exception werfen)
$mailOk = SendMailMessageVorlage($pdo, "3", $anfrageid, "5");
$mailOk = true;
if ($mailOk !== true) {
throw new RuntimeException("E-Mailversand fehlgeschlagen");
}
$pdo->commit();
echo "
Die Anfrage wurde erfolgreich gelöscht!
";
echo "Der Kunde erhält gleich eine schriftliche Bestätigung per E-Mail ";
} catch (Throwable $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
echo "
";
if(is_null($_POST["userid_input"]) || $_POST["userid_input"] == "" ){
echo "Sie haben keinen Benutzer über die Autovervollständigung ausgewählt.
Deswegen wählen Sie aus diesem Drop-Down-Menü aus.
";
$term = trim(strip_tags($_POST["skill_input"]));
$like = "%" . $term . "%";
$sql = "
SELECT person_id, vorname, nachname, geburtstag, email, tele
FROM persons
WHERE vorname LIKE :term
OR nachname LIKE :term
OR email LIKE :term
OR tele LIKE :term
ORDER BY nachname, vorname
";
$stmt = $pdo->prepare($sql);
$stmt->execute([':term' => $like]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "";
}else{
?>
Hier finden Sie die letzten 20 Anfragen des Benutzers.
";
if ($count == 0) {
echo "Der Benutzer hat keine Impftermine.
";
} else {
// Wenn deine Funktion SQL-String erwartet:
// Achtung: dann müsste ShowImpfTerminTab intern selbst mit PDO arbeiten
// Besser: du gibst ihr $personId und lässt sie selber abfragen.
$sqlImpftermine = "
SELECT
it.*,
ts.*
FROM impftermin it
INNER JOIN timeslots ts ON it.timeid = ts.timeid
WHERE it.userid = $personId
ORDER BY ts.date DESC, ts.start
";
ShowImpfTerminTab($sqlImpftermine); // falls du es so erweitern kannst
// Alternativ (wenn ShowImpfTerminTab nur String kann): du musst die Funktion anpassen.
}
echo "
Warteliste
";
$sqlWarte = "
SELECT *
FROM warteliste
WHERE userid = :pid
";
$stmtW = $pdo->prepare($sqlWarte);
$stmtW->execute([':pid' => $personId]);
$countW = $stmtW->rowCount();
if ($countW == 0) {
echo "Der Benutzer hat keinen Wartelistenplatz.
";
} else {
ShowWartelisteTab($sqlWarte, [':pid' => $personId]); // falls du es so erweitern kannst
}
}
}else if (($_POST["aktion"] ?? '') == "12") {
// Auswertung von Anfragen
echo "Hier wird eine Auswertung über alle Tickets angezeigt:
";
$today = date('Y-m-d');
#$siebentagezurueck = date('Y-m-d 00:00:00', strtotime($today . ' -7 day'));
$currentDate = new DateTime();
//Use the subtract function to subtract a DateInterval
$yesterdayTime = $currentDate->sub(new DateInterval('P7D'));
//Get yesterday date
$siebentagezurueck = $yesterdayTime->format('Y-m-d 00:00:00');
$currentDate = new DateTime();
//Use the subtract function to subtract a DateInterval
$yesterdayTime = $currentDate->sub(new DateInterval('P1Y'));
//Get yesterday date
$letzterjahrstring = $yesterdayTime->format('Y-m-d 00:00:00');
$currentDate = new DateTime();
//Use the subtract function to subtract a DateInterval
$yesterdayTime = $currentDate->sub(new DateInterval('P1M'));
//Get yesterday date
$letztermonatstring = $yesterdayTime->format('Y-m-d 00:00:00');
#$letztermonatstring = date('Y-m-01 00:00:00', strtotime($today . ' - 1 month'));
#$letzterjahrstring = date('Y-01-01 00:00:00', strtotime($today . ' - 1 year'));
$diesesjahrzurueck = date('Y-01-01 00:00:00');
$diesesmonatstring = date('Y-m-01 00:00:00');
$sql = "
SELECT
u.vorname,
u.nachname,
a.workerid,
COUNT(*) AS alltimenum,
SUM(CASE WHEN a.create_time >= :diesesjahrzurueck THEN 1 ELSE 0 END) AS allyeartime,
SUM(CASE WHEN a.create_time >= :diesesmonatstring THEN 1 ELSE 0 END) AS thismonthtime,
SUM(CASE WHEN a.create_time >= :letzterjahrstring AND a.create_time <= :diesesjahrzurueck THEN 1 ELSE 0 END) AS lastyeartime,
SUM(CASE WHEN a.create_time >= :letztermonatstring AND a.create_time <= :diesesmonatstring THEN 1 ELSE 0 END) AS lastmonthtime,
SUM(CASE WHEN a.create_time >= :siebentagezurueck THEN 1 ELSE 0 END) AS lastweektime,
MIN(a.create_time) AS begintime
FROM anfragen a
INNER JOIN users_worker uw ON a.workerid = uw.workerid
INNER JOIN users u ON uw.userid = u.id
WHERE a.workerid != 0
GROUP BY a.workerid
ORDER BY u.nachname, u.vorname
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':diesesjahrzurueck' => $diesesjahrzurueck,
':diesesmonatstring' => $diesesmonatstring,
':letzterjahrstring' => $letzterjahrstring,
':letztermonatstring' => $letztermonatstring,
':siebentagezurueck' => $siebentagezurueck,
]);
echo "
";
$sql = "
SELECT
AVG(DATEDIFF(mailtime, create_time)) AS dauer,
COUNT(*) AS anzahl
FROM anfragen
WHERE create_time >= :siebentage
AND mailtime IS NOT NULL
";
$stmtAvg = $pdo->prepare($sql);
$stmtAvg->execute([
':siebentage' => $siebentagezurueck
]);
$row = $stmtAvg->fetch(PDO::FETCH_ASSOC);
$dauer = (float)($row["dauer"] ?? 0);
$anzahl = (int)($row["anzahl"] ?? 0);
$dauerstunden = ceil($dauer * 24);
echo "
Es wurden $anzahl Anfragen in den letzten sieben Tagen bearbeitet.
Die Bearbeitung erfolgt durchschnittlich nach $dauerstunden Stunden.
";
}else if (($_POST["aktion"] ?? '') == "13") {
//Infomail über Impfung versenden
$impfstoff = (int)($_POST["impfstoff"] ?? -1);
// Mapping: welche Kombination aus impfenangebot + impfstoff soll gezogen werden?
// (entspricht deiner alten Logik, nur korrekt geklammert)
switch ($impfstoff) {
case 0:
$impfenangebot = 1;
$zielImpfstoff = 1;
break;
case 1:
$impfenangebot = 1;
$zielImpfstoff = 2;
break;
case 2:
$impfenangebot = 2;
$zielImpfstoff = 1;
break;
case 3:
$impfenangebot = 2;
$zielImpfstoff = 2;
break;
default:
die("Ungültiger Impfstoff-Parameter");
}
// 1) Warteliste holen (max 30)
// Wichtig: Klammern, sonst falsche Treffer durch OR/AND
$sql = "
SELECT
w.warteid,
w.userid AS person_id,
w.timeid,
w.hash
FROM warteliste w
WHERE w.impfenangebot = :angebot
AND (w.impfstoff = 0 OR w.impfstoff = :zielImpfstoff)
LIMIT 30
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':angebot' => $impfenangebot,
':zielImpfstoff'=> $zielImpfstoff
]);
$wartelisteRows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($wartelisteRows as $row) {
$personId = (int)$row["person_id"];
$warteid = (int)$row["warteid"];
$timeid = $row["timeid"]; // falls vorhanden
$hash = $row["hash"]; // falls vorhanden
// Wenn du debuggen willst:
// echo htmlspecialchars((string)$timeid, ENT_QUOTES, 'UTF-8') . " ";
// 2) Person aus persons laden
$stmtPerson = $pdo->prepare("
SELECT vorname, nachname, email, tele
FROM persons
WHERE person_id = :pid
LIMIT 1
");
$stmtPerson->execute([':pid' => $personId]);
$person = $stmtPerson->fetch(PDO::FETCH_ASSOC);
if (!$person) {
// Wenn es Alt-Daten gibt, die noch keine Person haben:
// überspringen statt crashen
continue;
}
$vorname = $person["vorname"] ?? "";
$nachname = $person["nachname"] ?? "";
$mail = $person["email"] ?? "";
$tel = $person["tele"] ?? "";
$userausgabe = trim($vorname . " " . $nachname);
// 3) Mail rausschicken (deine Funktion nutzt schon PDO)
// (Wenn die Vorlage die Persondaten selbst lädt: ok.)
SendMailMessageVorlage($pdo, "2", $warteid, "7");
}
//Bearbeitung der Mailvorlagen ermöglichen
}else if (($_POST["aktion"] ?? '') == "14") {
?>
prepare("
SELECT betreff, body, name
FROM mailtemplates
WHERE templetid = :tid
LIMIT 1
");
$stmt->execute([':tid' => $templetid]);
$rowconfig = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowconfig) {
die("Mailtemplate nicht gefunden.");
}
$body = $rowconfig["body"];
$betreff = $rowconfig["betreff"];
$name = $rowconfig["name"];
$betreff = iconv('CP1252//IGNORE', 'UTF-8' , $betreff);
//$body = iconv('CP1252//IGNORE', 'UTF-8' , $body);
$name = iconv('CP1252//IGNORE', 'UTF-8' , $name);
echo "
E-Mailvorlage bearbeiten
";
echo "Vorlage: $name ";
echo " Folgende Variablen können Sie nutzen:";
echo " %BENUTZERVORNAME% für Vorname des Patienten";
echo " %BENUTZERNACHNAME% für Nachname des Patienten";
echo " %BENUTZERGEBURTSTAG% für Geburtstag des Patienten";
echo " %BENUTZERADRESSE% für Adresse (Ort PLZ, Straße) des Patienten";
echo " %REZEPTART% für die Art der Anfrage";
echo " %MEDIKAMENTNUMMEREINS% für Medikament 1";
echo " %MEDIKAMENTNUMMERZWEI% für Medikament 2";
echo " %ANFRAGENACHRICHT% für die vom Patienten eingegebene Nachricht (max. 150 Zeichen)";
echo " %ANFRAGENLOGIN% für den Bestätigungslink/ Überprüfungslink der Anfrage. Achtung: Muss mindestens ein Mal an den Patienten versendet werden.";
echo "