Files
praxis-creutzburg-web/inc/functions.inc.php
T
clemensandClaude Opus 5 e39c00105e Bei Telefonanfragen auf die Sprachnachricht in PraxisKI hinweisen
anfragen.nachricht enthaelt bei source='telefon' nur das automatisch
erzeugte Transkript der Sprachnachricht, das Erkennungsfehler enthalten
kann. Bisher war aus der Oberflaeche nicht ersichtlich, dass es die
Aufnahme selbst noch gibt und wo sie liegt.

Neue Funktion GetSprachnachrichtHinweis() gibt fuer source='telefon' einen
Hinweis mit Link auf https://ki-praxis.praxis.local/ aus, fuer jede andere
Herkunft einen leeren String. Der Link ist nur aus dem Praxisnetz
erreichbar, das steht im Hinweis dabei.

Eingesetzt an allen fuenf Stellen, an denen eine Telefonanfrage sichtbar
wird: Anfrageliste, Antwortformular, Hinweisseite fuer Anfragen ohne
zugeordneten Patienten, Antwort einsehen und Patientenhistorie. Die
Abfragen fuer die letzten beiden lasen source bisher nicht mit, die Spalte
ist dort ergaenzt.

Nachgeprueft gegen die Datenbank: alle vier Abfragen liefern source, und
der Hinweis erscheint ueber alle 12785 Anfragen hinweg genau dann, wenn
source='telefon' ist - je Zeile geprueft, keine Ausnahme. Beide Dateien
bleiben UTF-8 ohne BOM.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 13:07:29 +02:00

3115 lines
101 KiB
PHP

<?php
include_once("password.inc.php");
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
function SendMailMessage(PDO $pdo, string $empfaenger, string $betreff, string $body): bool
{
// 1) Mail-Config aus DB laden
$stmt = $pdo->prepare("SELECT * FROM config LIMIT 1");
$stmt->execute();
$rowconfig = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowconfig) {
// Keine Config gefunden
return false;
}
$mailserver = (string)$rowconfig["mailserver"];
$mailUsername = (string)$rowconfig["mailUsername"];
$mailPassword = (string)$rowconfig["mailPassword"];
$mailPort = (int)$rowconfig["mailPort"];
$mailFrom = (string)$rowconfig["mailFrom"];
$mailFromName = (string)$rowconfig["mailFromName"];
$mailSMTPSecure = (string)$rowconfig["mailSMTPSecure"]; // z.B. 'tls' oder 'ssl' oder leer
// 2) Mail senden (UTF-8)
$mail = new PHPMailer(true);
try {
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->Host = $mailserver;
$mail->SMTPAuth = true;
$mail->Username = $mailUsername;
$mail->Password = $mailPassword;
if (!empty($mailSMTPSecure)) {
$mail->SMTPSecure = $mailSMTPSecure; // 'tls' oder 'ssl'
}
$mail->Port = $mailPort;
// Charset sauber setzen
$mail->CharSet = 'UTF-8';
// Absender / Empfänger
$mail->setFrom($mailFrom, $mailFromName);
$mail->addAddress($empfaenger);
// Inhalt
$mail->isHTML(true);
$mail->Subject = $betreff;
$mail->Body = $body;
// AltBody sinnvoll: HTML -> Text grob runterbrechen
$mail->AltBody = trim(html_entity_decode(strip_tags(str_replace(["<br>", "<br/>", "<br />"], "\n", $body)), ENT_QUOTES, 'UTF-8'));
$mail->send();
return true;
} catch (Exception $e) {
// Optional: Logging statt echo
// error_log("Mail error: " . $mail->ErrorInfo);
return false;
}
}
function SendMailMessageVorlage(PDO $pdo, string $config, int $terminid, string $vorlage)
{
// -----------------------------------------
// 1) LOGIN CONFIG AUSLESEN
// -----------------------------------------
$stmt = $pdo->prepare("SELECT * FROM config LIMIT 1");
$stmt->execute();
$rowconfig = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowconfig) {
throw new RuntimeException("config Tabelle leer / nicht gefunden");
}
$mailserver = $rowconfig["mailserver"] ?? null;
$mailUsername = $rowconfig["mailUsername"] ?? null;
$mailPassword = $rowconfig["mailPassword"] ?? null;
$mailPort = $rowconfig["mailPort"] ?? null;
$mailFrom = $rowconfig["mailFrom"] ?? null;
$mailFromName = $rowconfig["mailFromName"] ?? null;
$mailSMTPSecure = $rowconfig["mailSMTPSecure"] ?? null;
$logintermin = $rowconfig["logintermin"] ?? null;
$loginwarteliste = $rowconfig["loginwarteliste"] ?? null;
$logingrippetermin = $rowconfig["logingrippetermin"] ?? null;
$logingrippewarteliste = $rowconfig["logingrippewarteliste"] ?? null;
$anfragebestaetigung = $rowconfig["anfragebestaetigung"] ?? null;
// -----------------------------------------
// 2) E-Mail Vorlage laden
// -----------------------------------------
$stmt = $pdo->prepare("SELECT betreff, body FROM mailtemplates WHERE templetid = ?");
$stmt->execute([$vorlage]);
$tpl = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$tpl) {
throw new RuntimeException("Mailtemplate nicht gefunden: templetid=" . $vorlage);
}
$body = $tpl["body"];
$betreff = $tpl["betreff"];
// -----------------------------------------
// 3) Daten je nach $config laden
// -----------------------------------------
$vorname = $nachname = $geburtstag = $tele = $plz = $ort = $strasse = null;
$adresse = $empfaenger = $hash = null;
// Optional-Felder
$Zeitanzeige = null;
$impfstofftext = null;
$impforttext = null;
$terminlogin = null;
$grippeterminlogin = null;
$wartelistelogin = null;
$grippewartelistelogin = null;
$anfragenlogin = null;
$nachricht = null;
$medikamenteins = null;
$medikamentzwei = null;
$anforderungart = null;
$rezeptart = null;
if ($config === "1") {
// impftermin + timeslots + user (ALT: nutzt noch user)
// Wenn du später auch das migrierst: hier JOIN persons statt user.
$stmt = $pdo->prepare("
SELECT it.*, ts.*, p.*
FROM impftermin it
INNER JOIN timeslots ts ON it.timeid = ts.timeid
INNER JOIN persons p ON it.userid = p.person_id
WHERE it.terminid = ?
LIMIT 1
");
$stmt->execute([$terminid]);
$rowtime = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowtime) {
throw new RuntimeException("Termin nicht gefunden: terminid=" . $terminid);
}
$vorname = $rowtime["vorname"];
$nachname = $rowtime["nachname"];
$geburtstag = $rowtime["geburtstag"];
$tele = $rowtime["tele"];
$plz = $rowtime["plz"];
$ort = $rowtime["ort"];
$strasse = $rowtime["strasse"];
$adresse = trim($ort . " " . $plz . ", " . $strasse);
$empfaenger = $rowtime["email"];
$hash = $rowtime["hash"];
$impfortid = $rowtime["impfortid"] ?? null;
$date = new DateTime($rowtime["date"]);
$datum = $date->format('d.m.Y');
$start = substr($rowtime["start"], 0, 5);
$ende = substr($rowtime["ende"], 0, 5);
$Zeitanzeige = $datum . " " . $start . "-" . $ende;
$impfstoff = $rowtime["impfstoff"] ?? null;
if (!empty($impfstoff)) {
$stmt = $pdo->prepare("SELECT impfname FROM impfstoff WHERE impfid = ? LIMIT 1");
$stmt->execute([$impfstoff]);
$impfstofftext = $stmt->fetchColumn() ?: null;
}
$terminlogin = $logintermin . "?id=" . $hash;
$grippeterminlogin = $logingrippetermin . "?id=" . $hash;
if (!empty($impfortid)) {
$stmt = $pdo->prepare("SELECT adresse FROM impfort WHERE ortid = ? LIMIT 1");
$stmt->execute([$impfortid]);
$impforttext = $stmt->fetchColumn() ?: null;
}
} elseif ($config === "2") {
// warteliste + user (ALT: nutzt noch user)
$stmt = $pdo->prepare("
SELECT w.*, p.*
FROM warteliste w
INNER JOIN persons p ON w.userid = p.person_id
WHERE w.warteid = ?
LIMIT 1
");
$stmt->execute([$terminid]);
$rowtime = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowtime) {
throw new RuntimeException("Wartelisteneintrag nicht gefunden: warteid=" . $terminid);
}
$vorname = $rowtime["vorname"];
$nachname = $rowtime["nachname"];
$geburtstag = $rowtime["geburtstag"];
$tele = $rowtime["tele"];
$plz = $rowtime["plz"];
$ort = $rowtime["ort"];
$strasse = $rowtime["strasse"];
$adresse = trim($ort . " " . $plz . ", " . $strasse);
$empfaenger = $rowtime["email"];
$hash = $rowtime["hash"];
$wartelistelogin = $loginwarteliste . "?id=" . $hash;
$grippewartelistelogin = $logingrippewarteliste . "?id=" . $hash;
$impfstoff = $rowtime["impfstoff"] ?? null;
$impfangebot = $rowtime["impfenangebot"] ?? null;
if (!empty($impfstoff)) {
$stmt = $pdo->prepare("SELECT impfname FROM impfstoff WHERE impfid = ? LIMIT 1");
$stmt->execute([$impfstoff]);
$impfstofftextwarte = $stmt->fetchColumn() ?: null;
}
// deine Funktion:
// $impfangebottext = GetimpfenangebotName($impfangebot);
} elseif ($config === "3") {
// NEU: anfragen + persons (statt user)
$stmt = $pdo->prepare("
SELECT a.*, p.vorname, p.nachname, p.geburtstag, p.tele, p.plz, p.ort, p.strasse, p.email
FROM anfragen a
INNER JOIN persons p ON a.requester_person_id = p.person_id
WHERE a.anfrageid = ?
LIMIT 1
");
$stmt->execute([$terminid]);
$rowtime = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowtime) {
throw new RuntimeException("Anfrage nicht gefunden: anfrageid=" . $terminid);
}
$vorname = $rowtime["vorname"];
$nachname = $rowtime["nachname"];
$geburtstag = $rowtime["geburtstag"];
$tele = $rowtime["tele"];
$plz = $rowtime["plz"];
$ort = $rowtime["ort"];
$strasse = $rowtime["strasse"];
$adresse = trim($ort . " " . $plz . ", " . $strasse);
$empfaenger = $rowtime["email"];
$hash = $rowtime["hash"];
$anfragenlogin = $anfragebestaetigung . "?id=" . $hash;
$nachricht = $rowtime["nachricht"];
$medikamenteins = $rowtime["medikament1"];
$medikamentzwei = $rowtime["medikament2"];
$anforderungart = $rowtime["anforderungart"];
$stmt = $pdo->prepare("SELECT artname FROM anfrageart WHERE artid = ? LIMIT 1");
$stmt->execute([$anforderungart]);
$rezeptart = $stmt->fetchColumn() ?: null;
} elseif ($config === "4") {
// NEU: anfragen + persons (statt user), aber wie bei dir mit utf8_decode
$stmt = $pdo->prepare("
SELECT a.*, p.vorname, p.nachname, p.geburtstag, p.tele, p.plz, p.ort, p.strasse, p.email
FROM anfragen a
INNER JOIN persons p ON a.requester_person_id = p.person_id
WHERE a.anfrageid = ?
LIMIT 1
");
$stmt->execute([$terminid]);
$rowtime = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$rowtime) {
throw new RuntimeException("Anfrage nicht gefunden: anfrageid=" . $terminid);
}
$vorname = utf8_decode($rowtime["vorname"]);
$nachname = utf8_decode($rowtime["nachname"]);
$geburtstag = $rowtime["geburtstag"];
$tele = $rowtime["tele"];
$plz = $rowtime["plz"];
$ort = $rowtime["ort"];
$strasse = $rowtime["strasse"];
$adresse = trim($ort . " " . $plz . ", " . $strasse);
$empfaenger = $rowtime["email"];
$hash = $rowtime["hash"];
$anfragenlogin = $anfragebestaetigung . "?id=" . $hash;
$nachricht = utf8_decode($rowtime["nachricht"]);
} else {
throw new InvalidArgumentException("Unbekannter config-Wert: " . $config);
}
$body = str_replace("%BENUTZERVORNAME%", $vorname, $body);
$body = str_replace("%BENUTZERNACHNAME%", $nachname, $body);
$body = str_replace("%BENUTZERGEBURTSTAG%", $geburtstag, $body);
$body = str_replace("%BENUTZERADRESSE%", $adresse, $body);
$body = str_replace("%TERMINZEITVORGABE%", $Zeitanzeige, $body);
$body = str_replace("%TERMINIMPFSTOFF%", $impfstofftext, $body);
$body = str_replace("%TERMINIMPFORT%", $impforttext, $body);
$body = str_replace("%TERMINLOGIN%", $terminlogin, $body);
$body = str_replace("%GRIPPETERMINLOGIN%", $grippeterminlogin, $body);
$body = str_replace("%WARTELISTELOGIN%", $wartelistelogin, $body);
$body = str_replace("%GRIPPEWARTELISTELOGIN%", $grippewartelistelogin, $body);
$body = str_replace("%WARTELISTEIMPFSTOFF%", $impfstofftextwarte ?? null, $body);
$body = str_replace("%WARTELISTEIMPFANGEBOT%", GetimpfenangebotName((int)$impfangebot), $body);
$body = str_replace("%REZEPTART%", $rezeptart, $body);
$body = str_replace("%MEDIKAMENTNUMMEREINS%", $medikamenteins, $body);
$body = str_replace("%MEDIKAMENTNUMMERZWEI%", $medikamentzwei, $body);
$body = str_replace("%ANFRAGENACHRICHT%", $nachricht, $body);
$body = str_replace("%ANFRAGENLOGIN%", $anfragenlogin, $body);
//echo $body;
$mail = new PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = 0; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = $mailserver;
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = $mailUsername;
$mail->Password = $mailPassword;
$mail->SMTPSecure = $mailSMTPSecure; // Enable TLS encryption, `ssl` also accepted
//$mail->Port = 587; // TCP port to connect to
$mail->Port = $mailPort;
//Recipients
$mail->setFrom($mailFrom , $mailFromName);
$mail->addAddress($empfaenger); // Name is optional
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = $betreff;
$mail->Body = $body;
$mail->AltBody = $body;
$mail->send();
echo '<b>Ihre Nachricht wurde erfolgreich versendet!</b><br>Bitte prüfen Sie Ihren Posteingang sowie Ihren Spam-Ordner!<br>';
} catch (Exception $e) {
echo 'Leider gab es einen Fehler bei E-Mailversand. Fehler: ', $mail->ErrorInfo;
}
}
function SendMailMessageHash($empfaenger, $betreff, $body, $hash){
$body = iconv('UTF-8', 'CP1252//IGNORE', $body);
$betreff = iconv('UTF-8', 'CP1252//IGNORE', $betreff);
$mail = new PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = 0; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
//$mail->Host = 'vwp0583.webpack.hosteurope.de'; // Specify main and backup SMTP servers
$mail->Host = 'mx2f5c.netcup.net';
$mail->SMTPAuth = true; // Enable SMTP authentication
//$mail->Username = 'wp1085322-creutzburg'; // SMTP username
//$mail->Password = 'praxis.cr'; // SMTP password
$mail->Username = 'praxis-creutzburg@ctb-it.de';
$mail->Password = 'Coppenbruegge123';
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
//$mail->Port = 587; // TCP port to connect to
$mail->Port = 587;
//Recipients
$mail->setFrom('praxis-creutzburg@ctb-it.de', 'Praxis Creutzburg');
#$mail->addAddress('ccreutzburg@live.de', 'Joe User'); // Add a recipient
$mail->addAddress($empfaenger); // Name is optional
$mail->addReplyTo('kontakt@praxis-creutzburg.de', 'Praxis Creutzburg');
//$mail->addBCC('Arzt@praxis-creutzburg.de');
//$mail->addBCC("praxis@balanceacademie.de");
//Attachments
#$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments
#$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = $betreff;
$mail->Body = $body;
$mail->AltBody = $body;
//$mail->charSet = "UTF-8";
//$mail->Encoding = 'base64';
$mail->send();
echo '<b>Ihre Nachricht wurde erfolgreich versendet!</b><br><br>Überprüfen Sie auch Ihren Spam-Filter.<br>';
} catch (Exception $e) {
echo 'Leider gab es einen Fehler bei E-Mailversand. Nutzen Sie diesen Link: '.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']. '?id=' . $hash. '<br>Mit diesem können Sie den Termin bestätigen und stornieren.<br>'; #Fehler: ', $mail->ErrorInfo;
}
}
function GetStatus($checked){
if($checked == "0"){
$farbe ="#F0E68C";
$checkausgabe = "nicht bestätigt";
}else if($checked == "1"){
$farbe = "#98FB98";
$checkausgabe = "zugesagt";
}else if($checked == "2"){
$farbe = "#32CD32";
$checkausgabe = "abgemeldet";
}else if($checked == "3"){
$farbe = "#32CD32";
$checkausgabe = "vom Praxisteam abgesagt";
}else if($checked == "4"){
$farbe = "#32CD32";
$checkausgabe = "vom System abgesagt";
}else if($checked == "5"){
$farbe = "#32CD32";
$checkausgabe = "vom System abgesagt";
}else if($checked == "10"){
$farbe = "#ace7ac";
$checkausgabe = "beantwortet";
}else if($checked == "29"){
$farbe = "#97ff97";
$checkausgabe = "telefonisch beantwortet";
}else if($checked == "30"){
$farbe = "#32CD32";
$checkausgabe = "gelöscht mit Info";
}else if($checked == "31"){
$farbe = "#32CD32";
$checkausgabe = "gelöscht ohne Info";
}else{
$checkausgabe = "unbekannt";
$farbe = "";
}
return $checkausgabe;
}
function GetStatusFarbe($checked){
if($checked == "0"){
$farbe ="#F0E68C";
$checkausgabe = "nicht bestätigt";
}else if($checked == "1"){
$farbe = "#98FB98";
$checkausgabe = "zugesagt";
}else if($checked == "2"){
$farbe = "#32CD32";
$checkausgabe = "abgemeldet";
}else if($checked == "3"){
$farbe = "#32CD32";
$checkausgabe = "vom Praxisteam abgesagt";
}else if($checked == "4"){
$farbe = "#32CD32";
$checkausgabe = "vom System abgesagt";
}else if($checked == "5"){
$farbe = "#32CD32";
$checkausgabe = "vom System abgesagt";
}else if($checked == "10"){
$farbe = "#ace7ac";
$checkausgabe = "beantwortet";
}else if($checked == "29"){
$farbe = "#97ff97";
$checkausgabe = "telefonisch beantwortet";
}else if($checked == "30"){
$farbe = "#32CD32";
$checkausgabe = "gelöscht mit Info";
}else if($checked == "31"){
$farbe = "#32CD32";
$checkausgabe = "gelöscht ohne Info";
}else{
$checkausgabe = "unbekannt";
$farbe = "";
}
return $farbe;
}
function GetImpfstoffId($impfstoff){
if($impfstoff == "Egal/Arzt entscheidet"){
$impfstofftext = "0";
}else if($impfstoff == "AstraZeneca"){
$impfstofftext = "1" ;
}else if($impfstoff == "Biontech"){
$impfstofftext = "2";
}else if($impfstoff == "Johnson"){
$impfstofftext = "3";
}else{
$impfstofftext = "noch nicht geklärt";
}
return $impfstofftext;
}
function GetImpfstoffName($impfstoff){
if($impfstoff == 0){
$impfstofftext = "Egal/Arzt entscheidet";
}else if($impfstoff == 1){
$impfstofftext = "AstraZeneca";
}else if($impfstoff == 2){
$impfstofftext = "Biontech";
}else if($impfstoff == 3){
$impfstofftext = "Johnson";
}else{
$impfstofftext = "noch nicht geklärt";
}
return $impfstofftext;
}
function GetImpfstoffTermin($impfstoff){
if($impfstoff == 0){
$impfstofftext = "AstraZeneca";
}else if($impfstoff == 1){
$impfstofftext = "Biontech";
}else if($impfstoff == 2){
$impfstofftext = "Arzt entscheidet";
}else{
$impfstofftext = "noch nicht geklärt";
}
return $impfstofftext;
}
function GetImpfArt($wert){
if($wert == "1"){
$text = "Erstimpfung";
}else if($wert == 2){
$text = "Zweitimpfung";
}else if($wert == 3){
$text = "Drittimpfung/Booster";
}else if($wert == 4){
$text = "Vierimpfung";
}else if($wert == 5){
$text = "Zweitimpfung (nur Erstimpfung)";
}else if($wert == 6){
$text = "Erstimpfung (einzeln)";
}else{
$text = "";
}
return $text;
}
function GetBehandelt($wert){
if($wert == 0){
$text = "nicht behandelt";
}else if($wert == 1){
$text = "behandelt";
}else{
$text = "";
}
return $text;
}
function GetVersicherungArt($wert){
if($wert == 0){
$text = "Kassenpatient";
}else if($wert == 1){
$text = "Privatpatient";
}else{
$text = "";
}
return $text;
}
function GetOrdnungsid($wert){
if($wert == 0){
$text = "unklar";
}else if($wert == 1){
$text = "Rezept";
}else if($wert == 2){
$text = "Anfrage";
}else if($wert == 3){
$text = "Terminabsage";
}else if($wert == 5){
$text = "Bewerbung";
}else{
$text = "";
}
return $text;
}
/**
* Herkunft einer Anfrage als Text.
*
* Nur der Fall "telefon" kommt aus anfragen.source. Die Unterscheidung
* intern/Mail bleibt bewusst an sicherenachricht haengen: source="portal"
* ist dafuer unbrauchbar, weil insertAnfrage() kein source setzt und interne
* Anfragen deshalb als source="mail" in der Tabelle stehen.
* Seit 02.09.2026 legt die Telefonanlage Anfragen mit source="telefon" an;
* diese haben oft keine requester_person_id, weil der Anrufer nicht
* zugeordnet werden konnte.
*/
function GetAnfrageHerkunft($source, $sicherenachricht){
if($source == "telefon"){
$text = "Telefonanfrage";
}else if($sicherenachricht == "1"){
$text = "Interne Anfrage";
}else{
$text = "Mailanfrage";
}
return $text;
}
/**
* Hinweis auf die Sprachnachricht einer Telefonanfrage.
*
* Die Telefonanlage legt in anfragen.nachricht nur das automatisch erzeugte
* Transkript ab, das Erkennungsfehler enthalten kann. Die Aufnahme selbst
* liegt in PraxisKI und ist nur aus dem Praxisnetz erreichbar.
* Fuer alle anderen Herkuenfte leer.
*/
function GetSprachnachrichtHinweis($source){
if($source != "telefon"){
return "";
}
return "Transkript der Sprachnachricht - Aufnahme anhören: "
. "<a href=\"https://ki-praxis.praxis.local/\" target=\"_blank\" rel=\"noopener\">ki-praxis.praxis.local</a>"
. " (nur im Praxisnetz)<br>";
}
function GetPatientenartName($Patientenart){
if($Patientenart == "0"){
$impfenangebot = "Neupatient";
}else if($Patientenart == "1"){
$impfenangebot = "Patient";
}else{
$impfenangebot = "unklar";
}
return $impfenangebot;
}
function GetimpfenangebotName($Patientenart){
if($Patientenart == "1"){
$impfenangebot = "normal";
}else if($Patientenart == "2"){
$impfenangebot = "Springer";
}else{
$impfenangebot = "unklar";
}
return $impfenangebot;
}
function GetImpfstoffNameTermin($impfstoff){
if($impfstoff == 0){
$impfstofftext = "AstraZeneca";
}else if($impfstoff == 1){
$impfstofftext = "Biontech";
}else{
$impfstofftext = "noch nicht geklärt";
}
return $impfstofftext;
}
### Togo Termine anlegen
function gototerminanlegung() {
global $pdo;
$statementtermin = $pdo->prepare("SELECT * FROM togo_terminvorgaben");
$statementtermin->execute();
foreach ($statementtermin as $row) {
$togovorgabenid = $row["vorgabenid"];
$togodate = $row["date"];
$togostart = $row["start"];
$togoende = $row["ende"];
$standort = $row["standort"];
$error = $row["error"];
$warning = $row["warning"];
$date = new DateTime();
if($togodate == "Mo"){
$date->modify('next monday');
}elseif($togodate == "Di"){
$$date->modify('next tuesday');
#$nextday = date('Y-m-d', $nextTuesday);
}elseif($togodate == "Mi"){
$date->modify('next wednesday');
#$nextday = date('Y-m-d', $nextTuesday);
}elseif($togodate == "Do"){
$date->modify('next thursday');
#$nextday = date('Y-m-d', $nextTuesday);
}elseif($togodate == "Fr"){
$date->modify('next friday');
#$nextday = date('Y-m-d', $nextTuesday);
}elseif($togodate == "Sa"){
$date->modify('next saturday');
#$nextday = date('Y-m-d', $nextTuesday);
}elseif($togodate == "so"){
$date->modify('next sunday');
#$nextday = date('Y-m-d', $nextTuesday);
}else{
$ausgabedate = "error";
}
$nextday = $date->format('Y-m-d');
$i=0;
while($i < 4){
if($i!=0){
#$nextday = date('Y-m-d', strtotime($nextday .' +7 day'));
// Create a new DateTime object
$currentDate = new DateTime($nextday);
$datetempz = $currentDate->add(new DateInterval('P7D'));
//Get yesterday date
$nextday = $datetempz->format('Y-m-d');
}
$statementuser = $pdo->prepare("SELECT terminid FROM togo_termin WHERE date=:date AND start=:start AND end=:end AND standort=:standort");
$statementuser->execute(array('date' => $nextday , 'start' => $togostart, 'end' => $togoende , 'standort' => $standort ));
$count = $statementuser->rowCount();
if($count == 0){
$insert = $pdo->prepare("INSERT INTO togo_termin (date, start, end,standort,error,warning) VALUES (:date, :start, :end,:standort, :error, :warning)");
$insert->execute(array('date' => $nextday , 'start' => $togostart, 'end' => $togoende , 'standort' => $standort, 'error' => $error , 'warning' => $warning ));
$userid = $pdo->lastInsertId();
}
$i++;
}
}
}
function show_header($titeltext){
echo '
<!DOCTYPE HTML>
<!--
Alpha by HTML5 UP
html5up.net | @n33co
Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
-->
<html>
<head>
<title>'. $titeltext .'</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="description" content="" />
<meta name="keywords" content="" />
';
include('meta.inc');
echo '
<!--[if lte IE 8]><script src="css/ie/html5shiv.js"></script><![endif]-->
<script src="js/jquery.min.js"></script>
<script src="js/jquery.dropotron.min.js"></script>
<script src="js/jquery.scrollgress.min.js"></script>
<script src="js/skel.min.js"></script>
<script src="js/skel-layers.min.js"></script>
<script src="js/init.js"></script>
<noscript>
<link rel="stylesheet" href="css/skel.css" />
<link rel="stylesheet" href="css/style.css" />
<link rel="stylesheet" href="css/style-wide.css" />
</noscript>
<!--[if lte IE 8]><link rel="stylesheet" href="css/ie/v8.css" /><![endif]-->
</head>
<body>
<!-- Header -->
<header id="header" class="skel-layers-fixed">
';
}
function GetWorkerName($workerid) {
global $pdo;
$statement = $pdo->prepare("SELECT vorname,nachname FROM users WHERE id = :id");
$statement->execute(array('id' => $workerid));
$user = $statement->fetch();
$count = $statement->rowCount();
if($count == 1){
return $user["vorname"] . " " . $user["nachname"];
}else{
return "";
}
}
function ShowWartelisteTab(string $sql, array $params = []): void
{
global $pdo;
echo "<table width='100%'>";
echo "<tr>
<th style='width:10%;'>Person</th>
<th>Kontakt</th>
<th>Impfstoff</th>
<th>Art</th>
<th>Impfen mit</th>
<th>Status</th>
<th>Aktion</th>
</tr>";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
//echo "TEST1111";
$impfstoff = $row["impfstoff"];
$impfenangebot = $row["impfenangebot"];
$Patientenart = $row["Patientenart"];
$impfenmit = $row["impfenmit"];
$impfenzeitraum = $row["impfenzeitraum"];
$impfart = $row["impfart"];
$impfenartstring = GetImpfArt($impfart);
$impfenangebotstring = GetimpfenangebotName($impfenangebot);
$patientenartstring = GetPatientenartName($Patientenart);
// Impfstoff
//$impfstofftext = GetImpfstoffName($impfstoff);
// Impfstoff
$sqlimpfstoffstring = "SELECT impfname FROM impfstoff WHERE impfid ='" . $impfstoff . "'";
foreach ($pdo->query($sqlimpfstoffstring) as $rowimpf) {
$impfstofftext = $rowimpf["impfname"];
}
$warteid = $row["warteid"];
$Zeitanzeige = $datum . " " . $start . "-" . $ende ;
$userid = $row["userid"];
$checked = $row["checked"];
$date_created = $row["date_created"];
//echo $userid ;
$queryuser = "Select * FROM persons WHERE person_id='" . $userid . "'";
foreach ($pdo->query($queryuser) as $rowuser) {
$vorname = $rowuser["vorname"];
$nachname = $rowuser["nachname"];
$mail = $rowuser["mail"];
$tel = $rowuser["tele"];
$geburtstag = $rowuser["geburtstag"];
$ort = $rowuser["ort"];
$plz = $rowuser["plz"];
$strasse = $rowuser["strasse"];
}
$ausgabegeburstag = $geburtstag;
#$datumausgabe= date("d.m.Y H:i", strtotime($date_created ));
$currentDate = new DateTime($date_created);
$datumausgabe = $currentDate->format('d.m.Y H:i');
$farbe = GetStatusFarbe($checked);
$checkausgabe = GetStatus($checked);
$userausgabe = $vorname . " " . $nachname . "<br>" . $ausgabegeburstag;
$adresse = $plz . " " . $ort . ", " . $strasse ;
$kontaktdaten = $mail . "<br>" . $tel . "<br>" . $adresse;
echo "<tr style='background-color:". $farbe. ";line-height:100%;'><td>$userausgabe</td><td>$kontaktdaten</td><td>$impfstofftext</td><td>$impfenangebotstring $patientenartstring <br>$impfenzeitraum<br>$impfenartstring</td><td>$impfenmit</td><td>$checkausgabe<br>$datumausgabe</td><td>
<div style='float: left;margin:5px; height: 20px;'>
<form action='". $_SERVER["PHP_SELF"] ."' method=POST>
<input type=hidden name=aktion value=8>
<input type=hidden name=warteid value=$warteid>
<input type=submit class='btn btn-primary btn-sm' value='absagen/Löschen'>
</form>
</div>
<div style='float: left;margin:5px; height: 20px;'>
<form action='". $_SERVER["PHP_SELF"] ."' method=POST>
<input type=hidden name=aktion value=10>
<input type=hidden name=warteid value=$warteid>
<input type=submit class='btn btn-primary btn-sm' value='Termin zuordnen'>
</form>
</div>
</td></tr>
";
}
echo "</table>";
}
function ShowImpfTerminTab($sql){
global $pdo;
echo "<table width= 100% style='padding:0;'>";
echo "<tr><th>Termin</th><th>Person</th><th>Impfstoff</th><th>Status</th><th style='width:25%;'>Aktion</th><tr>";
foreach ($pdo->query($sql) as $row) {
//echo "Test";
#$datum = date("d.m.Y", strtotime($row["date"]));
$currentDate = new DateTime($row["date"]);
$datum = $currentDate->format('d.m.Y');
$start = substr($row["start"],0, 5);
$ende = substr($row["ende"],0, 5);
$dosenanzahl = $row["impfdosen"];
$impfstoff = $row["impfstoff"];
$terminid = $row["terminid"];
$last_updated = $row["last_updated"];
$behandelt = $row["behandelt"];
$impfart = $row["impfart"];
$behandeltstring = GetBehandelt($behandelt);
// Impfstoff
$sqlimpfstoffstring = "SELECT * FROM impfstoff WHERE impfid ='" . $impfstoff . "'";
$queryimpfstoff = $pdo->query($sqlimpfstoffstring);
$rowimpf = $queryimpfstoff->fetch(PDO::FETCH_ASSOC);
$impfstofftext = "<b>". $rowimpf["impfname"] . "</b>";
$timeid = $row["timeid"];
$Zeitanzeige = $datum . " " . $start . "-" . $ende ;
$userid = $row["userid"];
$checked = $row["checked"];
$sqluser = "Select * FROM persons WHERE person_id='" . $userid . "'";
$queryuser = $pdo->query($sqluser);
$rowuser = $queryuser->fetch(PDO::FETCH_ASSOC);
$vorname = $rowuser["vorname"];
$nachname = $rowuser["nachname"];
$mail = $rowuser["mail"];
$tel = $rowuser["tele"];
$geburtstag = $rowuser["geburtstag"];
if($geburtstag == "0000-00-00"){
$ausgabegeburstag = $jahrgang;
}else{
$ausgabegeburstag = $geburtstag;
}
if($behandelt == 0){
$farbe = GetStatusFarbe($checked);
}else{
$farbe = "#04B404";
}
$checkausgabe = GetStatus($checked);
$impfartausgabe = GetImpfArt($impfart);
$userausgabe = $nachname . ", " . $vorname. " - ". $ausgabegeburstag . "<br>" . $tel . " - " . $mail ;
echo "<tr style='background-color:". $farbe. ";' id=$terminid><td>$Zeitanzeige</td><td>$userausgabe</td><td>$impfstofftext $behandeltstring<br>$impfartausgabe</td><td>$checkausgabe<br>$last_updated<br></td><td><form action='". $_SERVER["PHP_SELF"] ."' method=POST>
<form action='". $_SERVER["PHP_SELF"] ."' method=POST> ";
echo '<div style="float:left; padding: 5px;">';
if($behandelt == 0){
echo "<input type=button class='btn btn-danger ' name=$terminid value='behandelt' onclick='behandelt(this.attributes[\"name\"].value)'>";
}else{
echo "<input type=button class='btn btn-primary btn-sm' name=$terminid value='unbehandelt' onclick='behandelt(this.attributes[\"name\"].value)'>";
}
echo "
</form>
</div>
<div style='float:left; padding: 5px;'>
<form action='". $_SERVER["PHP_SELF"] ."' method=POST>
<input type=hidden name=aktion value=5>
<input type=hidden name=terminid value=$terminid>
<input type=submit class='btn btn-primary btn-sm' value='Absagen'>
</form>
</div><div style='float:left; padding: 5px;'>
<form action='". $_SERVER["PHP_SELF"] ."' method=POST>
<input type=hidden name=aktion value=umbuchen>
<input type=hidden name=terminid value=$terminid>
<input type=hidden name=userid value=$userid>
<input type=submit class='btn btn-primary btn-sm' value='Bearbeiten'>
</form>
</div>
</td></tr>";
}
echo "</table>";
}
function ImpfTerminForm($userid, $terminid, $alleTermine){
global $pdo;
echo "<form action='". $_SERVER['PHP_SELF'] . "' method=POST>";
echo "<input type=hidden name=aktion value=terminspeichern>";
echo '<input type="hidden" name="terminid" value="'. $terminid .'" />';
if($userid != 0 ){
echo '<input type="hidden" name="userid" value="'. $userid .'" required />';
$statementuser = $pdo->prepare("SELECT * FROM persons WHERE person_id = :id");
$statementuser->execute(array('id' => $userid));
$rowuser = $statementuser->fetch(PDO::FETCH_ASSOC);
$nachname = $rowuser["nachname"];
$vorname = $rowuser["vorname"];
$mail = $rowuser["mail"];
$geburtstag = $rowuser["geburtstag"];
$tele = $rowuser["tele"];
$plz = $rowuser["plz"];
$ort = $rowuser["ort"];
$strasse = $rowuser["strasse"];
$Patientenart = $rowuser["Patientenart"];
$kassenart = $rowuser["kassenart"];
echo "<h3>Kundeninfo</h3>";
/*
echo $vorname . " " . $nachname . "<br>";
echo $geburtstag . "<br>";
echo $mail . "<br>";
*/
}
if($terminid){
$statementtermin = $pdo->prepare("SELECT date,start,ende,impfstoff,timeslots.timeid,impfart FROM timeslots INNER JOIN impftermin ON impftermin.timeid = timeslots.timeid WHERE terminid = :id");
$statementtermin->execute(array('id' => $terminid));
$rowtermin = $statementtermin->fetch();
#$datum = date("d.m.Y", strtotime($rowtermin["date"]));
$currentDate = new DateTime($rowtermin["date"]);
$datum = $currentDate->format('d.m.Y');
$start = substr($rowtermin["start"],0, 5);
$ende = substr($rowtermin["ende"],0, 5);
$timeidtermin = $rowtermin["timeid"];
echo '<input type="hidden" name="oldtimeid" value="'. $timeidtermin .'" />';
$impfstoff = $rowtermin["impfstoff"];
$impfart = $rowtermin["impfart"];
// Impfstoff
$sqlimpfstoffstring = "SELECT * FROM impfstoff WHERE impfid ='" . $impfstoff . "'";
$queryimpfstoff = $pdo->query($sqlimpfstoffstring);
$rowimpf = $queryimpfstoff->fetch(PDO::FETCH_ASSOC);
$impfstofftext = $rowimpf["impfname"];
/*
$anzeige = "$datum - $start-$ende - $impfstofftext <br>";
echo "<h3>Aktueller Termin</h3> $anzeige <br>";
echo "Dieser Termin wird storniert.<br>";
*/
}
?>
<label for="impfart">Nachname (Pflichtfeld)</label>
<input type="text" class="form-control" name="Name" placeholder="Name" <?php if($nachname){ echo "value='". $nachname . "'";}?> required />
<label for="impfart">Vorname (Pflichtfeld)</label>
<input type="text" class="form-control" name="Vorname" placeholder="Vorname" <?php if($vorname){ echo "value='". $vorname . "'";}?> required />
<label for="impfart">E-Mail</label>
<input type="email" class="form-control" name="Email" placeholder="Email" <?php if($mail){ echo "value='". $mail . "'";}?> />
<label for="impfart">Geburtstag</label>
<input type="date" class="form-control" name="Geburtsjahr" placeholder="Geburtsjahr" <?php if($geburtstag){ echo "value='". $geburtstag . "'";}?> />
<label for="impfart">Telefon</label>
<input type="text" class="form-control" name="Tel" placeholder="Telefon" <?php if($tele){ echo "value='". $tele . "'";}?> />
<label for="impfart">Ort</label>
<input type="text" class="form-control" name="ort" placeholder="Ort" <?php if($ort){ echo "value='". $ort . "'";}?> />
<label for="impfart">PLZ</label>
<input type="text" class="form-control" name="plz" placeholder="PLZ" <?php if($plz){ echo "value='". $plz . "'";}?> />
<label for="impfart">Straße</label>
<input type="text" class="form-control" name="strasse" placeholder="Strasse" <?php if($strasse){ echo "value='". $strasse . "'";}?> />
<label for="versicherung">Versicherungsart (Pflichtfeld)</label>
<select name="versicherung" class="form-control" required />
<option value="0" <?php if($kassenart == 0){ echo "selected";}?> >Kassenpatient</option>
<option value="1" <?php if($kassenart == 1){ echo "selected";}?> >Privat versichert</option>
</select>
<label for="Patientenart">Patientenart (Pflichtfeld)</label>
<select name="Patientenart" class="form-control" required />
<option value="0" <?php if($Patientenart == 0){ echo "selected";}?> >Neupatient</option>
<option value="1" <?php if($Patientenart == 1){ echo "selected";}?> >Bestandspatient</option>
</select>
<?php
$heute = date("Y-m-d");
$aktuellezeit = date("h:i");
if($alleTermine){
$statement = $pdo->prepare("SELECT * FROM timeslots WHERE date > :heute OR (date = :heute AND start > :aktuellezeit) OR timeid = :timeid ORDER BY date, start");
}else{
$statement = $pdo->prepare("SELECT * FROM timeslots WHERE date > :heute OR (date = :heute AND start > :aktuellezeit AND impfdosen > 0) OR timeid = :timeid ORDER BY date, start");
}
$statement->execute(array('heute' => $heute , 'aktuellezeit' => $aktuellezeit, 'timeid' => $timeid, 'timeid' => $timeidtermin));
//$timesloteauswertung = $statement->fetch();
$timecount = $statement->rowCount();
//$timecount =1;
if($timecount > 0){
?>
<br><br>
<label for="Terminzeitraum">Termin: (Pflichtfeld)</label>
<div class="select-wrapper">
<select name="Terminzeitraum" id="Terminzeitraum" required class="form-control" onchange="checkTerminzeitraum()">
<?php
//echo '<form action="'. $_SERVER['PHP_SELF'] .'" method=POST>';
echo '<option value="">- Terminzeitraum </option>';
//$rows = mysqli_fetch_row($query);
//echo $row['userid'];
foreach ($statement as $row) {
#$datum = date("d.m.Y", strtotime($row["date"]));
$currentDate = new DateTime($row["date"]);
$datum = $currentDate->format('d.m.Y');
$start = substr($row["start"],0, 5);
$ende = substr($row["ende"],0, 5);
$dosenanzahl = $row["impfdosen"];
$timeid = $row["timeid"];
$impfstoff = $row["impfstoff"];
// Impfstoff
$sqlimpfstoffstring = "SELECT * FROM impfstoff WHERE impfid ='" . $impfstoff . "'";
$queryimpfstoff = $pdo->query($sqlimpfstoffstring);
$rowimpf = $queryimpfstoff->fetch(PDO::FETCH_ASSOC);
$impfstofftext = $rowimpf["impfname"];
$value = "$timeid";
$anzeige = "$datum - $start-$ende - $dosenanzahl Plätze frei - $impfstofftext";
if($value == $timeidtermin){
echo '<option value="' . $value . '" selected>' . $anzeige . '</option>';
}else{
echo '<option value="' . $value . '">' . $anzeige . '</option>';
}
}
?>
</select>
<div id="Terminzeitrauminfo"></div>
<br>
<label for="impfart">Handelt es sich bei der Impfung um eine Erst- oder Zweitimpfung? (Pflichtfeld)</label>
<div class="select-wrapper">
<select name="impfart" id="impfart" required class="form-control" onchange="zweitterminpruefen()" >
<option value="">Erst- oder Zweitimpfung? (Bitte auswählen)!</option>
<option value="2" <?php if($impfart == 2 || $impfart == 1){ echo "selected";}?>>Erstimpfung</option>
<option value="3" <?php if($impfart == 3){ echo "selected";}?>>Zweitimpfung</option>
</select>
<div id="Zweittermin"></div>
</div>
<br><br>
<input type="submit" id="submitbox" class="btn btn-primary" value="Eintrag speichern" />
</form>
<?php
}
?>
<script>
function zweitterminpruefen() {
var e = document.getElementById("Terminzeitraum");
var timeidjs = e.value;
var e = document.getElementById("impfart");
var impfart = e.value;
if(timeidjs == 0){
document.getElementById("Zweittermin").innerHTML = "<h3>Bitte wählen Sie vorher einen Termin aus!<h3><br>";
document.getElementById("impfart").value = "";
}else if(impfart == 2){
result = $.ajax({
type: 'POST',
async: false,
url: '../inc/zweittermin.php',
data: ({
timeid: timeidjs
})
}).responseText;
document.getElementById("Zweittermin").innerHTML = result;
}else{
document.getElementById("Zweittermin").innerHTML = "";
}
}
</script>
<?php
}
function Terminspeichern($userid, $timeid, $hash, $impfart){
global $pdo;
// Termin eintragen
$statement = $pdo->prepare("INSERT INTO impftermin (userid, timeid, hash, coronafragen, astraok, impfart, checked) VALUES (:userid, :timeid, :hash, '0', '1',:impfart,1)");
$statement->execute(array('userid' => $userid , 'timeid' => $timeid, 'hash' => $hash , 'impfart' => $impfart));
$terminid = $pdo->lastInsertId();
return $terminid;
}
function Terminansagen($terminid, $checked){
global $pdo;
// Termin eintragen
$insert = $pdo->prepare("UPDATE impftermin SET checked = :checked WHERE terminid = :terminid");
$insert->execute(array('checked' => $checked, 'terminid' => $terminid));
}
function Userspeichern($vorname, $nachname, $geburtstag, $mail, $tele, $ort, $plz, $strasse, $versicherung, $Patientenart, $userid ){
global $pdo;
$userid = (int)$userid;
$mail = trim((string)$mail);
$params = [
'vorname' => $vorname,
'nachname' => $nachname,
'geburtstag' => $geburtstag,
'email' => $mail,
'tele' => $tele,
'ort' => $ort,
'plz' => $plz,
'strasse' => $strasse,
'versicherung' => $versicherung,
'patientenart' => $Patientenart,
];
if ($userid > 0) {
$st = $pdo->prepare("
UPDATE persons
SET vorname=:vorname,
nachname=:nachname,
geburtstag=:geburtstag,
email=:email,
tele=:tele,
ort=:ort,
plz=:plz,
strasse=:strasse,
kassenart=:versicherung,
patientenart=:patientenart
WHERE person_id=:userid
");
$st->execute($params + ['userid' => $userid]);
return $userid;
}
$find = $pdo->prepare("
SELECT person_id
FROM persons
WHERE LOWER(email)=LOWER(:email)
AND geburtstag=:geburtstag
LIMIT 1
");
$find->execute([
'email' => $mail,
'geburtstag' => $geburtstag,
]);
$existing = $find->fetch(PDO::FETCH_ASSOC);
if ($existing) {
$userid = (int)$existing['person_id'];
$st = $pdo->prepare("
UPDATE persons
SET vorname=:vorname,
nachname=:nachname,
geburtstag=:geburtstag,
email=:email,
tele=:tele,
ort=:ort,
plz=:plz,
strasse=:strasse,
kassenart=:versicherung,
patientenart=:patientenart
WHERE person_id=:userid
");
$st->execute($params + ['userid' => $userid]);
return $userid;
}
$insert = $pdo->prepare("
INSERT INTO persons
(vorname, nachname, geburtstag, email, tele, ort, plz, strasse, kassenart, patientenart)
VALUES
(:vorname, :nachname, :geburtstag, :email, :tele, :ort, :plz, :strasse, :versicherung, :patientenart)
");
$insert->execute($params);
return (int)$pdo->lastInsertId();
}
function GetImpfMailBenachrichtigung(){
global $pdo;
// Impfstoff
$sqlimpfstoffstring = "SELECT * FROM impfstoff WHERE aktivtermin ='1'";
foreach ($pdo->query($sqlimpfstoffstring) as $row) {
$impfname = $row["impfname"];
$impfid = $row["impfid"];
echo "<h3>$impfname</h3>";
echo "Sie können die nächsten 30 Personen auf der 'normalen' Warteliste infomieren:<br>";
echo "<form action='". $_SERVER['PHP_SELF'] . "' method=POST>";
echo '<input type="hidden" name="aktion" id="aktion" value="13" />';
echo '<input type="hidden" name="impfstoff" id="impfstoff" value="'. $impfid .'" />';
echo '<input type="hidden" name="impfenangebot" id="impfenangebot" value="1" />';
echo '<input type="submit" class="btn btn-primary" id="submitbox" value="Warteliste '. $impfname .' informieren" />';
echo "</form>";
echo "Sie können die nächsten 30 Personen auf der 'Springer' Warteliste infomieren:<br>";
echo "<form action='". $_SERVER['PHP_SELF'] . "' method=POST>";
echo '<input type="hidden" name="aktion" id="aktion" value="13" />';
echo '<input type="hidden" name="impfstoff" id="impfstoff" value="'. $impfid .'" />';
echo '<input type="hidden" name="impfenangebot" id="impfenangebot" value="2" />';
echo '<input type="submit" class="btn btn-primary" id="submitbox" value="Warteliste Springer '. $impfname .' informieren" />';
echo "</form>";
}
}
function AuswertungImpfungdaily($datum){
global $pdo;
#$datumstring = date("d.m.Y", strtotime($datum) );
$currentDate = new DateTime($datum);
$datumstring = $currentDate->format('d.m.Y');
$statementuser = $pdo->prepare("SELECT COUNT(CASE WHEN checked = '1' THEN 1 ELSE NULL END) AS gesamt, COUNT(CASE WHEN impfstoff = '3' AND behandelt = '1' AND impfart='3' THEN 1 ELSE NULL END) AS behandeltbiontechzweit , COUNT(CASE WHEN impfstoff = '3' AND behandelt = '1' AND (impfart='0' OR impfart='2') THEN 1 ELSE NULL END) AS behandeltbiontecheins , COUNT(CASE WHEN impfstoff = '3' AND checked = '1' THEN 1 ELSE NULL END) AS terminbiontech , COUNT(CASE WHEN impfstoff = '2' AND behandelt = '1' AND impfart='3' THEN 1 ELSE NULL END) AS behandeltastrazweit, COUNT(CASE WHEN impfstoff = '2' AND behandelt = '1' AND (impfart='0' OR impfart='2') THEN 1 ELSE NULL END) AS behandeltastraeins, COUNT(CASE WHEN impfstoff = '2' AND checked = '1' THEN 1 ELSE NULL END) AS terminastra, COUNT(CASE WHEN impfstoff = '4' AND checked = '1' THEN 1 ELSE NULL END) AS terminjohson, COUNT(CASE WHEN impfstoff = '3' AND behandelt = '1' THEN 1 ELSE NULL END) AS behandeltbiontech , COUNT(CASE WHEN impfstoff = '2' AND behandelt = '1' THEN 1 ELSE NULL END) AS behandeltastra, COUNT(CASE WHEN impfstoff = '4' AND behandelt = '1' THEN 1 ELSE NULL END) AS behandeltjohn FROM impftermin INNER JOIN timeslots ON impftermin.timeid = timeslots.timeid WHERE date=:date");
$statementuser->execute(array('date' => $datum));
$rowuser = $statementuser->fetch(PDO::FETCH_ASSOC);
$terminbiontech = $rowuser["terminbiontech"];
$terminastra = $rowuser["terminastra"];
$terminjohson = $rowuser["terminjohson"];
$behandeltbiontech = $rowuser["behandeltbiontech"];
$behandeltastra = $rowuser["behandeltastra"];
$behandeltbiontechzweit = $rowuser["behandeltbiontechzweit"];
$behandeltastrazweit = $rowuser["behandeltastrazweit"];
$behandeltbiontecheins = $rowuser["behandeltbiontecheins"];
$behandeltastraeins = $rowuser["behandeltastraeins"];
$behandeltjohn = $rowuser["behandeltjohn"];
$gesamt = $rowuser["gesamt"];
echo '<div style="align:left;float: left;margin:5px;"><b>Daten für den Tag: '. $datumstring .'</b><br>Einträge gesamt: ' .$gesamt . '</div><div style="align:right;float: right;margin:5px;"><table><tr><td>Biontech</td><td>Impfung: ' .$terminbiontech . '</td><td>behandelt: ' .$behandeltbiontech . '</td><td>nötige Impfdosen: ' . ($terminbiontech - $behandeltbiontech) . '</td><td>Erst: ' . $behandeltbiontecheins. ' Zweit: ' . $behandeltbiontechzweit. '</td></tr><tr><td>AstraZeneca</td><td>Impfung: ' .$terminastra . '</td><td>behandelt: ' .$behandeltastra . '</td><td>nötige Impfdosen: ' . ($terminastra - $behandeltastra) . '</td><td>Erst: ' . $behandeltastraeins. ' Zweit: ' . $behandeltastrazweit. '</td></tr><tr><td>Johnson</td><td>Impfung: ' .$terminjohson . '</td><td>behandelt: ' .$behandeltjohn . '</td><td>nötige Impfdosen: ' . ($terminjohson - $behandeltjohn) . '</td><td></td></tr></table> </div><br>';
}
function AuswertungImpfungdailycalendar($datum){
global $pdo;
#$datumstring = date("Y-m-d", strtotime($datum) );
$currentDate = new DateTime($datum);
$datumstring = $currentDate->format('Y-m-d');
$statementuser = $pdo->prepare("SELECT Count(checked), COUNT(CASE WHEN checked = '1' THEN 1 ELSE NULL END) AS gebucht, impfstoff FROM impftermin INNER JOIN timeslots ON impftermin.timeid = timeslots.timeid WHERE date=:date GROUP BY impfstoff");
$statementuser->execute(array('date' => $datumstring));
$rueckgabe = "<div><br>";
$gesamt = 0;
$gebuchtge = 0;
foreach ($statementuser as $rowimpf) {
$count = $rowimpf["Count(checked)"];
$gebucht = $rowimpf["gebucht"];
$impfid = $rowimpf["impfstoff"];
$statementimpfstoff = $pdo->prepare("SELECT impfname FROM impfstoff WHERE impfid=:impfid");
$statementimpfstoff->execute(array('impfid' => $impfid));
$rowuser = $statementimpfstoff->fetch(PDO::FETCH_ASSOC);
$impfname = $rowuser["impfname"];
#return $impfname;
$rueckgabe .= "" . $impfname . ": " . $gebucht . " / " . $count . "<br>";
$gesamt = $gesamt + $count;
$gebuchtge = $gebuchtge + $gebucht;
}
if($gesamt > 0){
$rueckgabe .= "<b>zugesagt: " . $gebuchtge . " von " . $gesamt . "</b><br></div>";
#return '<div ><br>Einträge gesamt: ' .$gesamt . '<br>Biontech ' .$terminbiontech . '<br>AstraZeneca ' .$terminastra . '<br>Johnson ' .$terminjohson . '<br> </div>';
return $rueckgabe;
}else{
return "";
}
}
function AuswertungTerminedailycalendar($datum){
global $pdo;
#$datumstring = date("Y-m-d", strtotime($datum) );
$currentDate = new DateTime($datum);
$datumstring = $currentDate->format('d.m.Y');
$statementuser = $pdo->prepare("SELECT SUM(impfdosen),impfstoff FROM timeslots WHERE date=:date GROUP BY impfstoff");
$statementuser->execute(array('date' => $datumstring));
$rueckgabe = "<div><br>";
$gesamt = 0;
$i=0;
foreach ($statementuser as $rowimpf) {
$count = $rowimpf["SUM(impfdosen)"];
$impfid = $rowimpf["impfstoff"];
$statementimpfstoff = $pdo->prepare("SELECT impfname FROM impfstoff WHERE impfid=:impfid");
$statementimpfstoff->execute(array('impfid' => $impfid));
$rowuser = $statementimpfstoff->fetch(PDO::FETCH_ASSOC);
$impfname = $rowuser["impfname"];
#return $impfname;
$rueckgabe .= "" . $impfname . ": " . $count . "<br>";
$gesamt = $gesamt + $count;
$i++;
}
if($i != 0){
$rueckgabe .= "<b>Frei Termine gesamt: " . $gesamt . "</b><br></div>";
#return '<div ><br>Einträge gesamt: ' .$gesamt . '<br>Biontech ' .$terminbiontech . '<br>AstraZeneca ' .$terminastra . '<br>Johnson ' .$terminjohson . '<br> </div>';
return $rueckgabe;
}else{
return "";
}
}
function ImpfstoffFormAuswahl($impfstoff){
global $pdo;
$sqlimpfstoffstring = "SELECT * FROM impfstoff WHERE aktivtermin ='1' OR aktivgrippe ='1'";
foreach ($pdo->query($sqlimpfstoffstring) as $rowimpf) {
$impfstofftext = $rowimpf["impfname"];
$impfid = $rowimpf["impfid"];
?>
<option value='<?php echo $impfid; ?>' <?php if($impfstoff == $impfid){ echo "selected"; } ?> ><?php echo $impfstofftext; ?></option>
<?php
}
}
function ImpfortFormAuswahl($impfortidcheck){
global $pdo;
$sqlimpfstoffstring = "SELECT * FROM impfort WHERE aktiv ='1' ";
foreach ($pdo->query($sqlimpfstoffstring) as $rowimpf) {
$impfortid = $rowimpf["ortid"];
$anzeigename = $rowimpf["anzeigename"];
$adresse = $rowimpf["adresse"];
$adresse = iconv('CP1252//IGNORE', 'UTF-8' , $adresse);
$art = $rowimpf["art"];
if($art){
$ausgabe = $art . " - " . $anzeigename . " - " . $adresse;
}else{
$ausgabe = $anzeigename . " - " . $adresse;
}
?>
<option value='<?php echo $impfortid; ?>' <?php if($impfortidcheck == $impfortid){ echo "selected"; } ?> ><?php echo $ausgabe; ?></option>
<?php
}
}
function ImpfortFormAuswahlReturn(){
global $pdo;
$sqlimpfstoffstring = "SELECT * FROM impfort WHERE aktiv ='1' ";
$ausgabetext = "";
foreach ($pdo->query($sqlimpfstoffstring) as $rowimpf) {
$impfortid = $rowimpf["ortid"];
$anzeigename = $rowimpf["anzeigename"];
$adresse = $rowimpf["adresse"];
$adresse = iconv('CP1252//IGNORE', 'UTF-8' , $adresse);
$art = $rowimpf["art"];
if($art){
$ausgabe = $art . " - " . $anzeigename . " - " . $adresse;
}else{
$ausgabe = $anzeigename . " - " . $adresse;
}
$ausgabetext .= "<option value='" . $impfortid . "'";
if($impfortidcheck == $impfortid){
$ausgabetext .= "selected";
}
$ausgabetext .= " >". $ausgabe . "</option>";
}
return $ausgabetext;
}
function TerminArtFormAuswahl($impfart){
for($i=1; $i <= 5; $i++){
echo "<option value='" . $i . "' ";
if($impfart == $i){
echo "selected";
}
echo ">" . GetImpfArt($i) . "</option>";
}
}
function TerminArtFormAuswahlReturn(){
$ausgabe = "";
for($i=1; $i <= 5; $i++){
$ausgabe = $ausgabe . "<option value='" . $i . "' >" . GetImpfArt($i) . "</option>";
}
return $ausgabe;
}
function TerminfestlegenAusgabe($sql){
global $pdo;
echo '<form action="'. $_SERVER['PHP_SELF'] .'" method=POST>';
foreach ($pdo->query($sql) as $row) {
$datum = $row["date"];
$start = $row["start"];
$ende = $row["ende"];
$dosenanzahl = $row["impfdosen"];
$timeid = $row["timeid"];
$impfstoff = $row["impfstoff"];
$terminart = $row["terminart"];
$impfortid = $row["impfortid"];
echo "Datum: <input type=date value=$datum disabled><input name=datum[] type=hidden value=$datum > Start: <input name=Starttime[] type=time value=$start> Ende: <input name=Endetime[] type=time value='" . $ende . "'> Impfdosen: <input name=Impfdosen[] type=number min=-100 max=800 value='" . $dosenanzahl . "'>
Impfstoff: <select name='impfstoff[]' id='impfstoff' required >";
ImpfstoffFormAuswahl($impfstoff);
echo "</select>";
echo " Impfort: <select name='impfort[]' required >";
ImpfortFormAuswahl($impfortid);
echo "</select>";
echo " <input name=timeid[] type=hidden value='" . $timeid . "'> <br><br>";
}
echo '<div id=neueTermine></div>';
echo "<br><br>";
echo '<a class="btn btn-primary" href"javascript:void(0);" onclick="AddneueTermine()" value="">Neuer Zeitslot</a><br><br>';
echo "<div id=divfolgetermine style='border:1px solid black;padding:5px;width: 500px;' >";
echo "<h3>Folge von Terminen anlegen</h3><br>";
echo "Datum: <input name=folgedate type=date id=folgedate><br>";
echo "Startzeit: <input name=folgestartzeit type=time id=folgestartzeit><br>";
echo "Länge eines Termins (Min): <input name=folgelaenge type=number id=folgelaenge><br>";
echo "Anzahl der Termine: <input name=folgeanzahl type=number id=folgeanzahl><br><br>";
echo "Impfstoff: <select name='folgeimpfstoff' id='folgeimpfstoff' required >";
ImpfstoffFormAuswahl($impfstoff);
echo "</select><br><br>";
echo "impfort: <select name='impfort[]' id='impfort' required >";
ImpfortFormAuswahl($impfortid);
echo "</select><br><br>";
echo '<a class="btn btn-primary" href"javascript:void(0);" onclick="AddneueTermineFolge()" value="">Neue Zeitslots anlegen</a><br><br></div>';
//echo "Datum: <input name=datum[] type=date > Start: <input name=Starttime[] type=time > Ende: <input name=Endetime[] type=time > Impfdosen: <input name=Impfdosen[] type=number min=0 max=800 value='0'> <input name=timeid[] type=hidden value='0'> <br>";
echo "<br><br><input type=submit name=eintragspeichern class='btn btn-primary' value='Einträge speichern'></form><br><br>";
}
function checkzweitTerminImpfung($date){
//SELECT SUM(CASE WHEN impfdosen > '0' THEN impfdosen ELSE NULL END) AS gesamt FROM timeslots WHERE date = '2021-07-16'
global $pdo;
//echo "SELECT date, ZIaktiv,ZIminimal, ZImaximal,ZIbiontech,ZIastra,ZImoderna FROM timeslots INNER JOIN impfstoff ON timeslots.impfstoff = impfstoff.impfid WHERE date = :date GROUP BY impfstoff";
$statementtermin = $pdo->prepare("SELECT impfname, date,terminart, ZIaktiv,ZIminimal,impfstoff, ZImaximal,ZIbiontech,ZIastra,ZImoderna,SUM(CASE WHEN impfdosen > '0' THEN impfdosen ELSE NULL END) AS gesamtdosen FROM timeslots INNER JOIN impfstoff ON timeslots.impfstoff = impfstoff.impfid WHERE date = :date GROUP BY impfstoff");
$statementtermin->execute(array('date' => $date));
foreach ($statementtermin as $rowtermin) {
//$date = $rowtermin["date"];
//echo "$date";
$ZIaktiv = $rowtermin["ZIaktiv"];
$ZIminimal = $rowtermin["ZIminimal"];
$ZImaximal = $rowtermin["ZImaximal"];
$ZIbiontech = $rowtermin["ZIbiontech"];
$ZIastra = $rowtermin["ZIastra"];
$ZImoderna = $rowtermin["ZImoderna"];
$impfname = $rowtermin["impfname"];
$terminart = $rowtermin["terminart"];
$gesamtdosen = $rowtermin["gesamtdosen"];
$ministring= "+ $ZIminimal days";
$maxistring = "+ $ZImaximal days";
$minimaldate = date_create($rowtermin["date"]);
date_add($minimaldate, date_interval_create_from_date_string($ZIminimal . ' days'));
$minimaldate = date_format($minimaldate, 'Y-m-d');
$maximaldate = date_create($rowtermin["date"]);
date_add($maximaldate, date_interval_create_from_date_string($ZImaximal . ' days'));
$maximaldate = date_format($maximaldate, 'Y-m-d');
$impfstoffstring = "";
$terminartstring = "";
if($ZIaktiv && $gesamtdosen > 0 && ($terminart == 1 || $terminart == 0) ){
if($ZIbiontech){
if($impfstoffstring == ""){
$impfstoffstring = $impfstoffstring . "(impfstoff='3'";
}else{
$impfstoffstring = $impfstoffstring . " OR impfstoff='3'";
}
}
if($ZIastra){
if($impfstoffstring == ""){
$impfstoffstring = $impfstoffstring . "(impfstoff='2'";
}else{
$impfstoffstring = $impfstoffstring . " OR impfstoff='2'";
}
}
if($ZImoderna){
if($impfstoffstring == ""){
$impfstoffstring = $impfstoffstring . "(impfstoff='5'";
}else{
$impfstoffstring = $impfstoffstring . " OR impfstoff='5'";
}
}
$impfstoffstring = $impfstoffstring . ")";
$terminartstring = " AND (terminart='1' OR terminart='3' OR terminart='5')";
$statement = $pdo->prepare("SELECT timeid FROM timeslots WHERE date>= '$minimaldate' AND date<='$maximaldate' AND $impfstoffstring $terminartstring AND impfdosen > 0");
$statement->execute();
$count = $statement->rowCount();
if($count == 0){
echo"<b>Für den Impfstoff $impfname gibt es zwischen dem $minimaldate und $maximaldate keine Impfdosen für die Zweitimpfung!!</b><br><br>";
}
}
}
}
function ListenAnsichtTerminproTag($datum){
global $pdo;
//$sqlstring = "SELECT * FROM impftermin INNER JOIN timeslots ON impftermin.timeid = timeslots.timeid WHERE date =:date ORDER by date DESC, start";
$statementtermin = $pdo->prepare("SELECT * FROM impftermin INNER JOIN timeslots ON impftermin.timeid = timeslots.timeid INNER JOIN persons ON persons.person_id = impftermin.userid WHERE date =:date ORDER by start, nachname");
$statementtermin->execute(array('date' => $datum));
$ausgabe = "";
$ausgabe .= "<table>";
$ausgabe .= "<tr ><td>Zeit</td><td>Name</td><td>Geburtstag</td><td>Terminart</td><td>Impfstoff</td><td >Versicherung</td></tr>";
foreach ($statementtermin as $row) {
//while ($row = $query->fetch_assoc()) {
#$datum = date("d.m.Y", strtotime($row["date"]));
$currentDate = new DateTime($row["date"]);
$datum = $currentDate->format('d.m.Y');
$start = substr($row["start"],0, 5);
$ende = substr($row["ende"],0, 5);
$dosenanzahl = $row["impfdosen"];
$timeid = $row["timeid"];
$impfstoff = $row["impfstoff"];
$terminart = $row["terminart"];
$userid = $row["userid"];
$terminartstring = GetImpfArt($terminart);
// Impfstoff
$statementimpf = $pdo->prepare("SELECT impfname FROM impfstoff WHERE impfid =:impfid");
$statementimpf->execute(array('impfid' => $impfstoff));
$rowimpf = $statementimpf->fetch(PDO::FETCH_ASSOC);
$impfstofftext = $rowimpf["impfname"];
$Zeitanzeige = $datum . " " . $start . "-" . $ende ;
//echo $Zeitanzeige;
//while ($rowtime = $querytime->fetch_assoc()) {
$statementuser = $pdo->prepare("SELECT * FROM persons WHERE person_id=:userid");
$statementuser->execute(array('userid' => $userid));
$rowuser = $statementuser->fetch(PDO::FETCH_ASSOC);
$vorname = $rowuser["vorname"];
$nachname = $rowuser["nachname"];
$mail = $rowuser["email"];
$kassenart = $rowuser["kassenart"];
#$jahrgang = $rowuser["jahrgang"];
$geburtstag = $rowuser["geburtstag"];
$Patientenart = $rowuser["patientenart"];
$ausgabegeburstag = $geburtstag;
$i++;
$patientenartstring = GetPatientenartName($Patientenart);
$kassenartstring = GetVersicherungArt($kassenart);
//$checkausgabe = GetPatientenartName($checked);
$userausgabe = $vorname . " " . $nachname;
$ausgabe .= "<tr ><td>$Zeitanzeige</td><td>$userausgabe</td><td>$ausgabegeburstag / $patientenartstring</td><td>$terminartstring</td><td>$impfstofftext</td><td >$kassenartstring</td></tr>";
}
$ausgabe .= "</table>";
return $ausgabe;
}
function TableAnsichtTermineproMonat($datum){
global $pdo;
#$monat = date("m", strtotime($datum));
#$jahr = date("Y", strtotime($datum));
$currentDate = new DateTime($datum);
$monat = $currentDate->format('m');
$jahr = $currentDate->format('Y');
$statementtermin = $pdo->prepare("SELECT date, COUNT(CASE WHEN checked = '1' THEN 1 ELSE NULL END) AS gesamttermine, COUNT(terminid) as gesamtterminid, SUM(CASE WHEN impfdosen > '0' THEN impfdosen ELSE NULL END) AS gesamtdosen FROM impftermin INNER JOIN timeslots ON impftermin.timeid = timeslots.timeid WHERE month(date) =:month AND year(date) =:year ORDER by date DESC, start");
$statementtermin->execute(array('date' => $datum));
foreach ($statementtermin as $row) {
}
}
function build_calendar_termin($month, $year, $aktion, $aktionday) {
$daysOfWeek = array('Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag');
$firstDayOfMonth = mktime(0,0,0,$month,1,$year);
$numberDays = date('t',$firstDayOfMonth);
$dateComponents = getdate($firstDayOfMonth);
$monthName = $dateComponents['month'];
$dayOfWeek = $dateComponents['wday'] -1;
if($month == 1){
$monthbefor = "" . ($year -1) . "-12-01";
}else{
$monthbefor = "$year-". ($month -1) . "-01";
}
if($month == 12){
$monthafter = "" . ($year +1) . "-01-01";
}else{
$monthafter = "$year-". ($month +1) . "-01";
}
$calendar = "";
$calendar .= "<table class='calendar table table-condensed table-bordered' >";
$calendar .= "<div align=center><h3><a href='". $_SERVER['PHP_SELF'] . "?a=". $aktion . "&sdate=". $monthbefor . "'><<</a> $monthName $year <a href='". $_SERVER['PHP_SELF'] . "?a=". $aktion . "&sdate=". $monthafter . "'>>></a></h3></div>";
$calendar .= "<tr>";
foreach($daysOfWeek as $day) {
$calendar .= "<th class='header' style='width:14%;' >$day</th>";
}
$currentDay = 1;
$calendar .= "</tr><tr >";
if ($dayOfWeek > 0) {
$calendar .= "<td colspan='$dayOfWeek'>&nbsp;</td>";
}
$month = str_pad($month, 2, "0", STR_PAD_LEFT);
while($currentDay <= $numberDays){
if($dayOfWeek == 7){
$dayOfWeek = 0;
$calendar .= "</tr><tr >";
}
$currentDayRel = str_pad($currentDay, 2, "0", STR_PAD_LEFT);
$date = "$year-$month-$currentDayRel";
// Is this today?
if(date('Y-m-d') == $date) {
$calendar .= "<td class='day success' style='height:150px;'><a href='". $_SERVER['PHP_SELF'] . "?a=". $aktionday . "&sdate=". $date . "'><div style='height:100%;width:100%'><b>$currentDay</b>";
} else {
$calendar .= "<td class='day' style='height:150px;'><a href='". $_SERVER['PHP_SELF'] . "?a=". $aktionday . "&sdate=". $date . "'><div style='height:100%;width:100%'> $currentDay";
}
$calendar .= "<form action='". $_SERVER['PHP_SELF'] . "' name='".$date ."' method=POST><input type=hidden name=searchdate value='". $date. "'><input type=hidden name=aktion value='4'></form>";
if($aktionday == "shday"){
$calendar .= AuswertungImpfungdailycalendar($date);
}else if($aktionday == "shterday"){
$calendar .= AuswertungTerminedailycalendar($date);
}
$calendar .= "</div></a></td>";
$currentDay++;
$dayOfWeek++;
}
if($dayOfWeek != 7){
$remainingDays = 7 - $dayOfWeek;
$calendar .= "<td colspan='$remainingDays'>&nbsp;</td>";
}
$calendar .= "</tr>";
$calendar .= "</table>";
return $calendar;
}
function ZuruckzumKalenderTermine($datum){
echo "<a href='impfadmin.php?a=termonth&sdate=". $datum ."' class='btn btn-primary btn-lg' >Zurück zum Kalender</a>";
}
function ZuruckzumKalenderTerminefestlegen($datum){
echo "<a href='impfadmin.php?a=terimpfmonth&sdate=". $datum ."' class='btn btn-primary btn-lg' >Zurück zum Kalender</a>";
}
function ZuruckzumAnfrageOverView(){
echo' <form action="'. $_SERVER["PHP_SELF"] .'" method=POST>
<input type=hidden name=aktion value=1>
<input type=submit class="btn btn-primary" value="Zurück zur Anfragen-Übersicht">
</form>';
}
function ZuruckzurWartelisteOverView(){
echo'
<form action="wartelisteadmin.php" method=POST>
<input type=hidden name=aktion value=7>
<input type=submit class="btn btn-primary btn-lg" value="Zurück zur Warteliste">
</form>';
}
/**
* Checks that the user is logged in.
* @return Returns the row of the logged in user
*/
function check_user() {
global $pdo;
if(!isset($_SESSION['userid']) && isset($_COOKIE['identifier']) && isset($_COOKIE['securitytoken'])) {
$identifier = $_COOKIE['identifier'];
$securitytoken = $_COOKIE['securitytoken'];
$statement = $pdo->prepare("SELECT * FROM securitytokens WHERE identifier = ? AND user_type = 'intern' LIMIT 1");
$result = $statement->execute(array($identifier));
$securitytoken_row = $statement->fetch();
if(sha1($securitytoken) !== $securitytoken_row['securitytoken']) {
//Vermutlich wurde der Security Token gestohlen
//Hier ggf. eine Warnung o.ä. anzeigen
} else { //Token war korrekt
//Setze neuen Token
$neuer_securitytoken = random_string();
$insert = $pdo->prepare("UPDATE securitytokens SET securitytoken = :securitytoken WHERE identifier = :identifier AND user_type = 'intern' LIMIT 1");
$insert->execute(array('securitytoken' => sha1($neuer_securitytoken), 'identifier' => $identifier));
setcookie('identifier', $identifier, [
'expires' => time() + 365*24*3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
#$_COOKIE['identifier'] = $identifier;
setcookie("securitytoken",$securitytoken,time()+(3600*24*365)); //Valid for 1 year
#$_COOKIE['securitytoken'] = $securitytoken;
session_regenerate_id(true); // wichtig gegen Session Fixation
$_SESSION['auth'] = [
'type' => 'intern',
'id' => $securitytoken_row['id']
];
//Logge den Benutzer ein
$_SESSION['userid'] = $securitytoken_row['user_id'];
}
}
if(!isset($_SESSION['userid'])) {
die('Bitte zuerst <a href="login.php">einloggen</a>');
}
$statement = $pdo->prepare("SELECT * FROM persons WHERE person_id = :id");
$result = $statement->execute(array('id' => $_SESSION['userid']));
$user = $statement->fetch();
return $user;
}
function check_intern_user(): array
{
global $pdo;
// Bereits eingeloggt & 2FA bestätigt
if (!empty($_SESSION['userid']) && !empty($_SESSION['2fa_verified'])) {
return loadInternUser($_SESSION['userid']);
}
// Kein Remember-Device möglich
if (empty($_COOKIE['remember_device']) || empty($_COOKIE['remember_device_token'])) {
redirectToLogin();
}
$identifier = $_COOKIE['remember_device'];
$token = $_COOKIE['remember_device_token'];
// Token laden
$stmt = $pdo->prepare("
SELECT id, user_id, securitytoken, expires_at
FROM intern_securitytokens
WHERE identifier = :identifier
LIMIT 1
");
$stmt->execute(['identifier' => $identifier]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// Ungültig / abgelaufen
if (
!$row ||
!hash_equals($row['securitytoken'], hash('sha256', $token)) ||
($row['expires_at'] !== null && strtotime($row['expires_at']) < time())
) {
invalidateRememberDevice($identifier);
redirectToLogin();
}
// Token rotieren
$newToken = bin2hex(random_bytes(32));
$pdo->prepare("
UPDATE intern_securitytokens
SET securitytoken = :token
WHERE id = :id
")->execute([
'token' => hash('sha256', $newToken),
'id' => $row['id']
]);
setRememberDeviceCookies($identifier, $newToken);
session_regenerate_id(true);
$_SESSION['userid'] = (int)$row['user_id'];
$_SESSION['2fa_verified'] = true;
return loadInternUser($_SESSION['userid']);
}
/* ---------- Helper ---------- */
function loadInternUser(int $id): array
{
global $pdo;
$stmt = $pdo->prepare("SELECT * FROM intern_users WHERE id = :id LIMIT 1");
$stmt->execute(['id' => $id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
session_destroy();
redirectToLogin();
}
return $user;
}
function setRememberDeviceCookies(string $identifier, string $token): void
{
$opts = [
'expires' => time() + 365 * 24 * 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
];
setcookie('remember_device', $identifier, $opts);
setcookie('remember_device_token', $token, $opts);
}
function invalidateRememberDevice(string $identifier): void
{
global $pdo;
$pdo->prepare("
DELETE FROM intern_securitytokens WHERE identifier = :identifier
")->execute(['identifier' => $identifier]);
}
function redirectToLogin(): void
{
header('Location: login.php');
exit;
}
/**
* Prueft einmal je Request, ob securitytokens eine Spalte expires_at hat.
*
* Die Spalte wird per Migration nachgeruestet (admin/sql/2026-09-02_securitytokens_expires_at.sql).
* Solange sie fehlt, verhaelt sich check_admin_user() wie bisher; sobald sie da
* ist, greift der Ablauf - ohne dass der Code noch einmal angefasst werden muss.
*/
function securitytokensHatAblaufspalte(PDO $pdo): bool
{
static $vorhanden = null;
if ($vorhanden !== null) {
return $vorhanden;
}
try {
$stmt = $pdo->prepare("
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'securitytokens'
AND COLUMN_NAME = 'expires_at'
");
$stmt->execute();
$vorhanden = ((int)$stmt->fetchColumn() > 0);
} catch (Throwable $e) {
error_log('securitytokensHatAblaufspalte: ' . $e->getMessage());
$vorhanden = false;
}
return $vorhanden;
}
function check_admin_user() {
global $pdo;
// 1) Session
if (!empty($_SESSION['auth']) && ($_SESSION['auth']['type'] ?? '') === 'admin') {
$uid = (int)($_SESSION['auth']['id'] ?? 0);
if ($uid > 0) {
$_SESSION['userid'] = $uid; // legacy kompatibel
$st = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$st->execute(['id' => $uid]);
return $st->fetch(PDO::FETCH_ASSOC) ?: null;
}
}
// 2) Cookie
if (!empty($_COOKIE['identifier']) && !empty($_COOKIE['securitytoken'])) {
$identifier = (string)$_COOKIE['identifier'];
$securitytoken = (string)$_COOKIE['securitytoken'];
// Abgelaufene Tokens gar nicht erst laden. Ohne die Spalte gilt das
// alte Verhalten - siehe securitytokensHatAblaufspalte().
$ablauf = securitytokensHatAblaufspalte($pdo)
? " AND (expires_at IS NULL OR expires_at > NOW())"
: "";
$st = $pdo->prepare("SELECT user_id, securitytoken FROM securitytokens WHERE identifier = ? AND user_type = 'admin'" . $ablauf . " LIMIT 1");
$st->execute([$identifier]);
$row = $st->fetch(PDO::FETCH_ASSOC);
if (!$row) {
return null;
}
// SHA256 konsistent zum Login
if (!hash_equals((string)$row['securitytoken'], hash('sha256', $securitytoken))) {
// NICHT sofort Cookies löschen -> sonst Race-Logout
return null;
}
// Cookie-Login erfolgreich -> Session setzen
session_regenerate_id(true);
$_SESSION['auth'] = [
'type' => 'admin',
'id' => (int)$row['user_id'],
];
$_SESSION['userid'] = (int)$row['user_id'];
$st = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$st->execute(['id' => (int)$row['user_id']]);
return $st->fetch(PDO::FETCH_ASSOC) ?: null;
}
return null;
}
/**
* Returns true when the user is checked in, else false
*/
function is_checked_in() {
return isset($_SESSION['userid']);
}
/**
* Returns a random string
*/
function random_string() {
if(function_exists('openssl_random_pseudo_bytes')) {
$bytes = openssl_random_pseudo_bytes(16);
$str = bin2hex($bytes);
} else if(function_exists('mcrypt_create_iv')) {
$bytes = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$str = bin2hex($bytes);
} else {
//Replace your_secret_string with a string of your choice (>12 characters)
$str = md5(uniqid('your_secret_string', true));
}
return $str;
}
/**
* Returns the URL to the site without the script name
*/
function getSiteURL() {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
return $protocol.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/';
}
/**
* Outputs an error message and stops the further exectution of the script.
*/
function error($error_msg) {
include("templates/header.inc.php");
include("templates/error.inc.php");
include("templates/footer.inc.php");
exit();
}
function checkurlaub() {
global $pdo;
$datum = date("Y-m-d");
//$query = mysqli_query($con, "SELECT urlaubid FROM urlaub WHERE start<='" . date("Y-m-d") ."' AND ende>='" . date("Y-m-d") ."'");
$statement = $pdo->prepare("SELECT urlaubid FROM urlaub WHERE start<=:date AND ende>=:date");
$statement->execute(array('date' => $datum));
$count = $statement->rowCount();
$ausgabe = "";
if($count != 0){
$ausgabe .= '<div id=urlaub class="container" style="background-color: firebrick;padding:5px;"><br>';
$ausgabe .= "<h2>Praxis im Urlaub</h2>";
$ausgabe .= "Wir befinden uns aktuell im Urlaub.<br>Wenden Sie sich an unsere Vertretung oder warten Sie bis nach unserem Urlaub mit Ihrer Anfrage.<br><br>";
$statement = $pdo->prepare("SELECT ende,vertretung,vertretertelefon,vertreteradresse,vertreterurl FROM urlaub WHERE start<=:date AND ende>=:date");
$result = $statement->execute(array('date' => $datum));
$row = $statement->fetch(PDO::FETCH_ASSOC);
//$query = mysqli_query($con, "SELECT ende,vertreter,vertretertelefon,vertreteradresse,vertreterurl FROM urlaub WHERE start<='" . date("Y-m-d") ."' AND ende>='" . date("Y-m-d") ."' ORDER BY ende DESC");
//$row = mysqli_fetch_assoc($query);
$vertreter = $row["vertretung"];
$vertretertelefon = $row["vertretertelefon"];
$vertreteradresse = $row["vertreteradresse"];
$vertreterurl = $row["vertreterurl"];
$ende = $row["ende"];
#$endeausgabe= date("d.m.Y", strtotime("+1 day", strtotime($ende )));
$date = new DateTime($ende);
$date->modify('+1 day');
$endeausgabe = $date->format('d.m.Y');
if($vertreter){
$ausgabe .= "Unsere Vertretung: $vertreter <br>";
}
if($vertreterurl ){
$ausgabe .= "Webseite Vertretung: <a href=$vertreterurl >$vertreterurl</a> <br>";
}
if($vertretertelefon){
$ausgabe .= "Telefonischer Kontakt Vertretung: $vertretertelefon <br>";
}
if($vertreteradresse){
$ausgabe .= "Adresse Vertretung: $vertreteradresse <br>";
}
$ausgabe .= "<br>Wir stehen Ihnen ab dem ". $endeausgabe . " wieder zur Verfügung.<br><br></div><br><br>";
}else{
$datum = date("Y-m-d");
//$query = mysqli_query($con, "SELECT urlaubid FROM urlaub WHERE start<='" . date("Y-m-d") ."' AND ende>='" . date("Y-m-d") ."'");
$statement = $pdo->prepare("SELECT notfallid FROM notfallsprechstunde WHERE start<=:date AND ende>=:date");
$statement->execute(array('date' => $datum));
$count = $statement->rowCount();
$ausgabe = "";
if($count != 0){
$ausgabe .= '<div id=urlaub class="container" style="background-color: firebrick;padding:5px;"><br>';
$ausgabe .= "<h2>Wichtiger Hinweis</h2>";
$ausgabe .= "<br>";
$statement = $pdo->prepare("SELECT ende,hinweis FROM notfallsprechstunde WHERE start<=:date AND ende>=:date");
$result = $statement->execute(array('date' => $datum));
$row = $statement->fetch(PDO::FETCH_ASSOC);
//$query = mysqli_query($con, "SELECT ende,vertreter,vertretertelefon,vertreteradresse,vertreterurl FROM urlaub WHERE start<='" . date("Y-m-d") ."' AND ende>='" . date("Y-m-d") ."' ORDER BY ende DESC");
//$row = mysqli_fetch_assoc($query);
$vertreter = $row["vertretung"];
$hinweis = $row["hinweis"];
$ende = $row["ende"];
#$endeausgabe= date("d.m.Y", strtotime("+1 day", strtotime($ende )));
$date = new DateTime($ende);
$date->modify('+1 day');
$endeausgabe = $date->format('d.m.Y');
$ausgabe .= $hinweis ;
$ausgabe .= "<br></div><br><br>";
}else{
$ausgabe = "";
}
}
return $ausgabe ;
}
function geplantenUrlaubanzeigen() {
global $pdo;
$datum = date("Y-m-d");
$statement = $pdo->prepare("SELECT urlaubid FROM urlaub WHERE start>=:date ");
$statement->execute(array('date' => $datum));
$count = $statement->rowCount();
$ausgabe = "";
if($count != 0){
$ausgabe .= '<div><br>';
$ausgabe .= "<h2>Geplanter Urlaub der Praxis</h2>";
$ausgabe .= "Die Praxis befindet sich in den folgenden Zeiten im Urlaub:<br><br>";
$statement = $pdo->prepare("SELECT start,ende,vertretung,vertretertelefon,vertreteradresse,vertreterurl FROM urlaub WHERE start>=:date");
$result = $statement->execute(array('date' => $datum));
while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
$vertreter = $row["vertretung"];
$vertretertelefon = $row["vertretertelefon"];
$vertreteradresse = $row["vertreteradresse"];
$vertreterurl = $row["vertreterurl"];
$ende = $row["ende"];
$start = $row["start"];
#$startausgabe= date("d.m.Y", strtotime($start ));
#$endeausgabe= date("d.m.Y", strtotime($ende ));
$date = new DateTime($start);
$startausgabe = $date->format('d.m.Y');
$date = new DateTime($ende);
$endeausgabe = $date->format('d.m.Y');
$ausgabe .= "<h4>Zeitraum: $startausgabe bis $endeausgabe </h4>";
if($vertreter){
$ausgabe .= "Unsere Vertretung: $vertreter <br>";
}
if($vertreterurl ){
$ausgabe .= "Webseite Vertretung: <a href=$vertreterurl >$vertreterurl</a> <br>";
}
if($vertretertelefon){
$ausgabe .= "Telefonischer Kontakt Vertretung: <a href='tel:$vertretertelefon' >$vertretertelefon</a> <br>";
}
if($vertreteradresse){
$ausgabe .= "Adresse Vertretung: <a href='http://maps.google.com/?q=$vertreteradresse' target=_blank>$vertreteradresse </a><br>";
}
$ausgabe .= "<br>";
}
$ausgabe .= "</div>";
}else{
$ausgabe = "";
}
return $ausgabe ;
}
function showHeaderpraxis() {
return '
<header>
<img src="images/logo-arzt-creutzburg-coppen.gif" align="left" alt="Praxis Logo Creutzburg" width="40%" />
<br>
<h2>Praxis Heiner Creutzburg</h2>
<br>
</header>
';
}
/**
* Prüft, ob der Benutzer administrator ist
*/
function check_admin() {
global $pdo;
if(isset($_SESSION['userid'])) {
$statement = $pdo->prepare("SELECT userid FROM users_admin WHERE userid = :id");
$statement->execute(array('id' => $_SESSION['userid']));
$count = $statement->rowCount();
if($count == 1){
return true;
}else{
return false;
}
}else{
return false;
}
}
/**
* Prüft, ob der Benutzer Bearbeiter ist
*/
function check_worker() {
global $pdo;
if(isset($_SESSION['userid'])) {
$statement = $pdo->prepare("SELECT userid FROM users_worker WHERE userid = :id");
$statement->execute(array('id' => $_SESSION['userid']));
$count = $statement->rowCount();
if($count == 1){
return true;
}else{
return false;
}
}else{
return false;
}
}
/**
* Rendert eine Mailvorlage für eine Anfrage.
*
* Erwartet neues Schema:
* - anfragen.requester_person_id -> persons.person_id
* - persons.email (statt user.mail)
*
* Rückgabe:
* [
* 'empfaenger' => string,
* 'betreff' => string,
* 'body' => string,
* 'name' => string, // Template-Name
* 'context' => array // optional: alle Daten für Debug/Logging
* ]
*
* $extraReplacements: zusätzliche Platzhalter => Werte (z.B. %TERMINZEITVORGABE% etc.)
* $convertCp1252: nur true setzen, wenn Inhalte wirklich CP1252 in der DB sind
*/
function renderTemplateForAnfrage(PDO $pdo, int $anfrageid, string $templetid, string $anfragebestaetigung, array $extraReplacements = [], bool $convertCp1252 = false): array
{
if ($anfrageid <= 0) {
throw new InvalidArgumentException("Ungültige anfrageid");
}
$templetid = trim($templetid);
if ($templetid === "") {
throw new InvalidArgumentException("templetid fehlt");
}
// 1) Template laden
$stmt = $pdo->prepare("
SELECT betreff, body, name
FROM mailtemplates
WHERE templetid = ?
LIMIT 1
");
$stmt->execute([$templetid]);
$tpl = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$tpl) {
throw new RuntimeException("Mailvorlage nicht gefunden: templetid=" . $templetid);
}
$betreff = (string)($tpl['betreff'] ?? '');
$body = (string)($tpl['body'] ?? '');
$tplName = (string)($tpl['name'] ?? '');
// 2) Anfrage + Person laden
$stmt = $pdo->prepare("
SELECT
a.*,
p.vorname, p.nachname, p.geburtstag,
p.tele, p.plz, p.ort, p.strasse,
p.email
FROM anfragen a
INNER JOIN persons p ON a.requester_person_id = p.person_id
WHERE a.anfrageid = ?
LIMIT 1
");
$stmt->execute([$anfrageid]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$row) {
throw new RuntimeException("Anfrage nicht gefunden: anfrageid=" . $anfrageid);
}
$vorname = (string)($row['vorname'] ?? '');
$nachname = (string)($row['nachname'] ?? '');
$geburtstag = (string)($row['geburtstag'] ?? '');
$tele = (string)($row['tele'] ?? '');
$plz = (string)($row['plz'] ?? '');
$ort = (string)($row['ort'] ?? '');
$strasse = (string)($row['strasse'] ?? '');
$empfaenger = (string)($row['email'] ?? '');
$adresse = trim($ort . " " . $plz . ", " . $strasse);
$hash = (string)($row['hash'] ?? '');
$anfragenlogin = rtrim($anfragebestaetigung) . "?id=" . $hash;
$nachricht = (string)($row['nachricht'] ?? '');
$medikament1 = (string)($row['medikament1'] ?? '');
$medikament2 = (string)($row['medikament2'] ?? '');
$anforderungart = $row['anforderungart'] ?? null;
// 3) Rezeptart holen
$rezeptart = '';
if (!empty($anforderungart)) {
$stmt = $pdo->prepare("SELECT artname FROM anfrageart WHERE artid = ? LIMIT 1");
$stmt->execute([$anforderungart]);
$rezeptart = (string)($stmt->fetchColumn() ?: '');
}
// 4) Standard-Platzhalter
$replacements = [
"%BENUTZERVORNAME%" => $vorname,
"%BENUTZERNACHNAME%" => $nachname,
"%BENUTZERGEBURTSTAG%" => $geburtstag,
"%BENUTZERADRESSE%" => $adresse,
"%REZEPTART%" => $rezeptart,
"%MEDIKAMENTNUMMEREINS%" => $medikament1,
"%MEDIKAMENTNUMMERZWEI%" => $medikament2,
"%ANFRAGENACHRICHT%" => $nachricht,
"%ANFRAGENLOGIN%" => $anfragenlogin,
];
// Extra-Platzhalter (z.B. Termin / Warteliste)
// Beispiel: ['%TERMINZEITVORGABE%' => $Zeitanzeige]
foreach ($extraReplacements as $k => $v) {
if (!is_string($k)) continue;
$replacements[$k] = (string)$v;
}
$body = str_replace(array_keys($replacements), array_values($replacements), $body);
// 5) Encoding nur falls wirklich nötig
if ($convertCp1252) {
$betreff = iconv('CP1252//IGNORE', 'UTF-8', $betreff);
$body = iconv('CP1252//IGNORE', 'UTF-8', $body);
$tplName = iconv('CP1252//IGNORE', 'UTF-8', $tplName);
}
return [
'empfaenger' => $empfaenger,
'betreff' => $betreff,
'body' => $body,
'name' => $tplName,
'context' => [
'anfrageid' => $anfrageid,
'templetid' => $templetid,
'vorname' => $vorname,
'nachname' => $nachname,
'geburtstag' => $geburtstag,
'telefon' => $tele,
'adresse' => $adresse,
'rezeptart' => $rezeptart,
'anfragenlogin' => $anfragenlogin,
],
];
}
function ShowFormularFragenBenutzer(){
#$mintimegeburtstag = strtotime("-5 year", time());
$currentDate = new DateTime();
//Use the subtract function to subtract a DateInterval
$yesterdayTime = $currentDate->sub(new DateInterval('P5Y'));
//Get yesterday date
$mintimegeburtstag = $yesterdayTime->format('Y-m-d');
#$mindategeburtstag = date("Y-m-d", $mintimegeburtstag);
$ausgabe = '
<div class="6u 12u(3)">
<label for="vorname">Vorname:</label>
<input type="text" name="Vorname" id="Vorname" size=12 maxlength="50" placeholder="Vorname" required />
</div>
<div class="6u 12u(3)">
<label for="Name">Nachname:</label>
<input type="text"name="Name" size=12 maxlength="50" minlength="3" placeholder="Name" required />
</div>
<div class="6u 12u(3)">
<label for="Email">E-Mail:</label>
<input type="email" name="Email" id="Email" value="" placeholder="Email" required />
</div>
<div class="6u 12u(3)">
<label for="Tel">Telefon (mit Vorwahl/ nur Zahlen):</label>
<input type="number" name="Tel" size=4 maxlength="30" id="Tel" pattern="^[0-9]{6-30}$" placeholder="Telefon" required />
</div>
<div class="6u 12u(3)">
<label for="plz">PLZ:</label>
<input type="number" name="plz" size=4 maxlength="5" id="" placeholder="PLZ" required />
</div>
<div class="6u 12u(3)">
<label for="ort">Ort:</label>
<input type="text" name="ort" size=4 maxlength="50" id="" placeholder="Ort" required />
</div>
<div class="6u 12u(3)">
<label for="strasse">Straße:</label>
<input type="text" name="strasse" size=4 maxlength="50" id="" value="" placeholder="Straße" required />
</div>
<div class="6u 12u(3)">
<label for="Geburtsjahr">Geburtstag:</label>
<input type="date" class="input" name="Geburtsjahr" id="" value="" max="' . $mindategeburtstag . '" placeholder="Geburtsjahr" required />
</div>';
return $ausgabe ;
}
function deleteOldFiles() {
$directory = __DIR__ . "/upload/nexChRvmgyJWCgvWjceFugXpGFQzBBaMtuZlySuFdYkFzYoxNe";
// Stelle sicher, dass das Verzeichnis existiert
if (!is_dir($directory)) {
echo "Das Verzeichnis existiert nicht.";
return;
}
// Aktueller Zeitstempel
$now = time();
// Verzeichnis öffnen
$files = scandir($directory);
foreach ($files as $file) {
$filePath = $directory . DIRECTORY_SEPARATOR . $file;
// Überspringe '.' und '..'
if ($file === '.' || $file === '..') {
continue;
}
// Prüfe, ob es sich um eine Datei handelt
if (is_file($filePath)) {
// Datei-Änderungszeitstempel abrufen
$fileModTime = filemtime($filePath);
// Prüfen, ob die Datei älter als 24 Stunden ist
if (($now - $fileModTime) > 86400) { // 86400 Sekunden = 24 Stunden
// Datei löschen
unlink($filePath);
echo "Gelöscht: $filePath\n";
}
}
}
}
/**
* Prüft, ob der Benutzer eine Authentfizierung per E-Mail gemacht hat
*/
function check_mailreg() {
global $pdo;
if(isset($_SESSION['userid'])) {
$statement = $pdo->prepare("SELECT id FROM intern_users WHERE id = :id AND mailreg = '1'");
$statement->execute(array('id' => $_SESSION['userid']));
$count = $statement->rowCount();
if($count == 1){
return true;
}else{
return false;
}
}else{
return false;
}
}
/**
* Prüft, ob der Benutzer eine Authentfizierung per E-Mail gemacht hat
*/
function check_userdatenvorhanden() {
global $pdo;
if(isset($_SESSION['userid'])) {
$statement = $pdo->prepare("SELECT id FROM intern_users WHERE id = :id AND tele <> '' AND strasse <> '' AND ort <> '' AND plz <> '' ");
$statement->execute(array('id' => $_SESSION['userid']));
$count = $statement->rowCount();
if($count == 1){
return true;
}else{
return false;
}
}else{
return false;
}
}
function is_checked_in_index() {
// 'identifier' ist das Cookie des Admin-Bereichs - fuer den internen Bereich zaehlt 'remember_device'.
if( isset($_SESSION['userid']) || !empty($_COOKIE['remember_device'])){
return true;
}else{
return false;
}
}
function InfoAusgeloggtePerson(){
$ausgabe = '
<h1>Interner Bereich</h1>
<p>Nach der Anmeldung können Sie Ihre Anfragen an <?php echo $organisationsname; ?> einsehen.<br>Bevor Sie sich anmelden können, müssen Sie sich registieren.<br><br></p>
<p><a class="btn btn-primary btn-lg" href="login.php" role="button">Login</a></p><br><br>
<p><a class="btn btn-primary btn-lg" href="register.php" role="button">Jetzt registrieren</a></p>
';
return $ausgabe;
}
/**
* Holt intern_users Datensatz per E-Mail, stellt sicher dass er in user existiert
* und gibt user.userid zurück.
*
* Matching: user.mail = intern_users.email (case-insensitive)
* Verhalten:
* - wenn user nicht existiert: INSERT
* - wenn user existiert: UPDATE (hier: überschreibt Felder mit intern_users Werten, wenn intern_users nicht leer ist)
*/
function ensureUserFromInternUsersByEmail(PDO $pdo, string $email): int
{
$email = trim($email);
if ($email === '') {
throw new RuntimeException("E-Mail ist leer.");
}
// 1) intern_users laden
$stmt = $pdo->prepare("
SELECT vorname, nachname, email, geburtstag, tele, ort, plz, strasse
FROM intern_users
WHERE LOWER(email) = LOWER(:email)
LIMIT 1
");
$stmt->execute([':email' => $email]);
$intern = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$intern) {
throw new RuntimeException("Kein Eintrag in intern_users für E-Mail: " . $email);
}
$vorname = trim((string)($intern['vorname'] ?? ''));
$nachname = trim((string)($intern['nachname'] ?? ''));
$mail = trim((string)($intern['email'] ?? ''));
$geburtstag = trim((string)($intern['geburtstag'] ?? ''));
$tele = trim((string)($intern['tele'] ?? ''));
$ort = trim((string)($intern['ort'] ?? ''));
$plz = trim((string)($intern['plz'] ?? ''));
$strasse = trim((string)($intern['strasse'] ?? ''));
// 2) existiert user bereits mit dieser Mail?
$stmt = $pdo->prepare("
SELECT person_id, vorname, nachname, geburtstag, email, tele, ort, plz, strasse
FROM persons
WHERE LOWER(email) = LOWER(:mail) AND geburtstag = :geburtstag
LIMIT 1
");
$stmt->execute([':mail' => $mail, ':geburtstag' => $geburtstag]);
$existing = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$existing) {
// 3) INSERT
$ins = $pdo->prepare("
INSERT INTO persons (vorname, nachname, geburtstag, email, tele, ort, plz, strasse)
VALUES (:vorname, :nachname, :geburtstag, :mail, :tele, :ort, :plz, :strasse)
");
$ins->execute([
':vorname' => $vorname,
':nachname' => $nachname,
':geburtstag' => $geburtstag,
':mail' => $mail,
':tele' => $tele,
':ort' => $ort,
':plz' => $plz,
':strasse' => $strasse,
]);
return (int)$pdo->lastInsertId();
}
// 4) UPDATE (nur wenn intern_users Wert nicht leer ist)
// -> du kannst das Verhalten ändern: "immer überschreiben" oder "nur leere Felder füllen".
$userid = (int)$existing['person_id'];
$upd = $pdo->prepare("
UPDATE persons
SET
vorname = COALESCE(NULLIF(:vorname, ''), vorname),
nachname = COALESCE(NULLIF(:nachname, ''), nachname),
geburtstag = COALESCE(NULLIF(:geburtstag, ''), geburtstag),
email = COALESCE(NULLIF(:mail, ''), email),
tele = COALESCE(NULLIF(:tele, ''), tele),
ort = COALESCE(NULLIF(:ort, ''), ort),
plz = COALESCE(NULLIF(:plz, ''), plz),
strasse = COALESCE(NULLIF(:strasse, ''), strasse)
WHERE person_id = :userid
");
$upd->execute([
':vorname' => $vorname,
':nachname' => $nachname,
':geburtstag' => $geburtstag,
':mail' => $mail,
':tele' => $tele,
':ort' => $ort,
':plz' => $plz,
':strasse' => $strasse,
':userid' => $userid,
]);
return $userid;
}
/**
* Small helper for safe HTML output.
*/
function e(string $s): string {
return htmlspecialchars($s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
/**
* Ensure a person exists in `persons` based on an intern user email.
* Returns persons.person_id.
*
* Assumptions:
* - `intern_users` has: vorname, nachname, email, geburtstag, tele, ort, plz, strasse
* - `persons` has: person_id, vorname, nachname, email, geburtstag, tele, ort, plz, strasse
*
* If your schema differs, adjust column names inside INSERT/UPDATE.
*/
function ensurePersonFromInternUsersByEmail(PDO $pdo, string $email, ?int $internUserId = null): int
{
$email = trim(mb_strtolower($email));
if ($email === '') {
throw new RuntimeException("E-Mail fehlt.");
}
// 1) load intern user data (prefer id, fallback email)
if ($internUserId !== null && $internUserId > 0) {
$stmtIU = $pdo->prepare("SELECT * FROM intern_users WHERE id = :id LIMIT 1");
$stmtIU->execute([':id' => $internUserId]);
} else {
$stmtIU = $pdo->prepare("SELECT * FROM intern_users WHERE LOWER(email) = :email LIMIT 1");
$stmtIU->execute([':email' => $email]);
}
$iu = $stmtIU->fetch(PDO::FETCH_ASSOC);
if (!$iu) {
throw new RuntimeException("Intern-User nicht gefunden (email/id).");
}
// normalize fields
$vorname = (string)($iu['vorname'] ?? '');
$nachname = (string)($iu['nachname'] ?? '');
$geburtstag = (string)($iu['geburtstag'] ?? '');
$tele = (string)($iu['tele'] ?? '');
$ort = (string)($iu['ort'] ?? '');
$plz = (string)($iu['plz'] ?? '');
$strasse = (string)($iu['strasse'] ?? '');
$emailRaw = (string)($iu['email'] ?? $email);
$emailNorm = trim(mb_strtolower($emailRaw));
$pdo->beginTransaction();
try {
// 2) try find person by email
$stmtP = $pdo->prepare("SELECT person_id FROM persons WHERE LOWER(email) = :email LIMIT 1");
$stmtP->execute([':email' => $emailNorm]);
$personId = $stmtP->fetchColumn();
if ($personId) {
// optional: keep persons in sync (only fill missing fields)
$stmtU = $pdo->prepare("
UPDATE persons
SET
vorname = COALESCE(NULLIF(vorname,''), :vorname),
nachname = COALESCE(NULLIF(nachname,''), :nachname),
geburtstag = :geburtstag,
tele = COALESCE(NULLIF(tele,''), :tele),
ort = COALESCE(NULLIF(ort,''), :ort),
plz = COALESCE(NULLIF(plz,''), :plz),
strasse = COALESCE(NULLIF(strasse,''), :strasse)
WHERE person_id = :pid
");
$stmtU->execute([
':vorname' => $vorname,
':nachname' => $nachname,
':geburtstag' => $geburtstag,
':tele' => $tele,
':ort' => $ort,
':plz' => $plz,
':strasse' => $strasse,
':pid' => (int)$personId,
]);
$pdo->commit();
return (int)$personId;
}
// 3) insert new person
$stmtI = $pdo->prepare("
INSERT INTO persons (vorname, nachname, email, geburtstag, tele, ort, plz, strasse)
VALUES (:vorname, :nachname, :email, :geburtstag, :tele, :ort, :plz, :strasse)
");
$stmtI->execute([
':vorname' => $vorname,
':nachname' => $nachname,
':email' => $emailNorm,
':geburtstag' => $geburtstag,
':tele' => $tele,
':ort' => $ort,
':plz' => $plz,
':strasse' => $strasse,
]);
$newId = (int)$pdo->lastInsertId();
$pdo->commit();
return $newId;
} catch (Throwable $t) {
$pdo->rollBack();
throw $t;
}
}
/**
* Load selectable request topics.
* $mode can be: rezept | allgemein | terminabsage
*/
function loadAnfragearten(PDO $pdo, string $mode): array
{
$col = match ($mode) {
'rezept' => 'rezept',
'allgemein' => 'allgemeinanforderung',
'terminabsage' => 'terminabsagen',
default => throw new RuntimeException('Unbekannter Modus'),
};
$sql = "SELECT artid, artname FROM anfrageart WHERE {$col} = 1 ORDER BY artname";
$stmt = $pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Load Anfrageart label by id
*/
function loadAnfrageartName(PDO $pdo, int $artid): string
{
$stmt = $pdo->prepare("SELECT artname FROM anfrageart WHERE artid = :id LIMIT 1");
$stmt->execute([':id' => $artid]);
return (string)($stmt->fetchColumn() ?: '');
}
/**
* Insert anfrage in a single place.
* Returns new anfrageid.
*
* IMPORTANT: Adjust column names if your table differs:
* - requester_person_id (preferred) OR personid (legacy)
*/
function insertAnfrage(PDO $pdo, array $data): int
{
// Prefer new schema field name
$hasRequester = true;
try {
$pdo->query("SELECT requester_person_id FROM anfragen LIMIT 0");
} catch (Throwable $t) {
$hasRequester = false;
}
$personField = $hasRequester ? 'requester_person_id' : 'personid';
$sql = "
INSERT INTO anfragen (
{$personField},
anforderungart,
medikament1, medikament2, medikament3, medikament4, medikament5, medikament6,
nachricht,
hash,
create_time,
ordnungsid,
abholort,
sicherenachricht,
checked
) VALUES (
:pid,
:art,
:m1, :m2, :m3, :m4, :m5, :m6,
:nachricht,
:hash,
NOW(),
:ordnungsid,
:abholort,
:sicherenachricht,
:checked
)
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':pid' => (int)$data['person_id'],
':art' => (int)$data['anforderungart'],
':m1' => (string)($data['med1'] ?? ''),
':m2' => (string)($data['med2'] ?? ''),
':m3' => (string)($data['med3'] ?? ''),
':m4' => (string)($data['med4'] ?? ''),
':m5' => (string)($data['med5'] ?? ''),
':m6' => (string)($data['med6'] ?? ''),
':nachricht' => (string)$data['nachricht'],
':hash' => (string)$data['hash'],
':ordnungsid' => (int)$data['ordnungsid'],
':abholort' => (int)$data['abholort'],
':sicherenachricht' => (int)$data['sicherenachricht'],
':checked' => (int)$data['checked'],
]);
return (int)$pdo->lastInsertId();
}
/**
* Check vacation / break.
*/
function isPraxisImUrlaub(PDO $pdo): bool
{
$stmt = $pdo->prepare("SELECT 1 FROM urlaub WHERE start <= CURDATE() AND ende >= CURDATE() LIMIT 1");
$stmt->execute();
return (bool)$stmt->fetchColumn();
}
function loadAktuelleUrlaubsInfo(PDO $pdo): ?array
{
$stmt = $pdo->prepare("
SELECT ende, vertretung, vertretertelefon, vertreteradresse, vertreterurl
FROM urlaub
WHERE start <= CURDATE() AND ende >= CURDATE()
ORDER BY ende DESC
LIMIT 1
");
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row ?: null;
}
/**
* Erzeugt einen Authentifizierungscode fuer ein intern_users-Konto und schickt
* dem Benutzer den Bestaetigungslink.
*
* Wird von register.php (direkt nach der Anmeldung) und von authmeldung.php
* (manuelle Anforderung) benutzt, damit beide denselben Text und dieselbe
* Code-Erzeugung verwenden.
*
* passwortcode_time wird mit NOW() gesetzt, also mit der Uhr des DB-Servers -
* authentifizierung.php prueft die Gueltigkeit ebenfalls dort.
*
* @return bool true, wenn die Mail uebergeben werden konnte
*/
function sendeAuthentifizierungsMail(PDO $pdo, array $user, string $organisationsname): bool
{
$passwortcode = random_string();
$stmt = $pdo->prepare("
UPDATE intern_users
SET passwortcode = :passwortcode, passwortcode_time = NOW()
WHERE id = :userid
");
$stmt->execute([
'passwortcode' => sha1($passwortcode),
'userid' => $user['id']
]);
$url = getSiteURL() . 'authentifizierung.php?userid=' . urlencode((string)$user['id'])
. '&code=' . urlencode($passwortcode);
$betreff = 'Authentifizierung für Ihren Account bei ' . $organisationsname;
$text = 'Hallo ' . htmlentities((string)$user['vorname']) . ',<br><br>
für die Nutzung des Kontos müssen Sie das Konto per E-Mail authentifizieren. Dazu klicken Sie auf den folgenden Link:<br>
' . $url . '
<br><br>
Nach der Authentifizierung können Sie das Konto vollumfänglich nutzen.<br><br>
Haben Sie kein Konto bei uns angelegt, ignorieren Sie diese E-Mail.<br><br>
Viele Grüße,<br>
Ihr ' . $organisationsname . ' Team';
return SendMailMessage($pdo, (string)$user['email'], $betreff, $text);
}
/**
* Verschickt eine Mail, ohne die aufrufende Seite abzubrechen.
* "Silent" heisst: keine Ausgabe und keine Exception nach aussen - der Fehler
* landet aber im Server-Log, und der Rueckgabewert sagt, ob es geklappt hat.
* Frueher wurde jeder Fehler ersatzlos verschluckt; ein stiller SMTP-Ausfall
* war dadurch von aussen nicht von einem falschen Code zu unterscheiden.
*
* @return bool true, wenn die Mail uebergeben werden konnte
*/
function SendMailMessageSilent($con, $empfaenger, $betreff, $body){
// LOGIN CONFIG AUSLESEN
$queryconfig = mysqli_query($con, "Select * FROM config");
if($queryconfig === false){
error_log("SendMailMessageSilent: config-Tabelle nicht lesbar: " . mysqli_error($con));
return false;
}
$rowconfig = mysqli_fetch_assoc($queryconfig);
if($rowconfig === null){
error_log("SendMailMessageSilent: kein Datensatz in der Tabelle config");
return false;
}
$mailserver = $rowconfig["mailserver"];
$mailUsername = $rowconfig["mailUsername"];
$mailPassword = $rowconfig["mailPassword"];
$mailPort = $rowconfig["mailPort"];
$mailFrom = $rowconfig["mailFrom"];
$mailFromName = $rowconfig["mailFromName"];
$mailSMTPSecure = $rowconfig["mailSMTPSecure"];
$body = iconv('UTF-8', 'CP1252//IGNORE', $body);
$betreff = iconv('UTF-8', 'CP1252//IGNORE', $betreff);
//$mail = new PHPMailer(true);
$mail = new PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = 0; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = $mailserver;
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = $mailUsername;
$mail->Password = $mailPassword;
$mail->SMTPSecure = $mailSMTPSecure; // Enable TLS encryption, `ssl` also accepted
// TCP port to connect to
$mail->Port = $mailPort;
//Recipients
$mail->setFrom($mailFrom , $mailFromName);
$mail->addAddress($empfaenger); // Name is optional
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = $betreff;
$mail->Body = $body;
$mail->AltBody = $body;
//$mail->charSet = "UTF-8";
//$mail->Encoding = 'base64';
$mail->send();
return true;
} catch (Exception $e) {
// Nicht nach aussen werfen, aber auch nicht verschweigen.
error_log(sprintf(
'SendMailMessageSilent: Versand an %s fehlgeschlagen: %s',
(string)$empfaenger,
$mail->ErrorInfo !== '' ? $mail->ErrorInfo : $e->getMessage()
));
return false;
}
}