Files
praxis-creutzburg-web/inc/functions.inc.php
T
2026-03-20 17:13:38 +01:00

2976 lines
96 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;
}
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,
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;
}
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'];
$st = $pdo->prepare("SELECT user_id, securitytoken FROM securitytokens WHERE identifier = ? AND user_type = 'admin' 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() {
if( isset($_SESSION['userid']) || isset($_COOKIE['identifier'])){
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;
}
function SendMailMessageSilent($con, $empfaenger, $betreff, $body){
// LOGIN CONFIG AUSLESEN
$queryconfig = mysqli_query($con, "Select * FROM config");
$rowconfig = mysqli_fetch_assoc($queryconfig);
if($queryconfig->num_rows == 1){
$row = mysqli_fetch_assoc($queryconfig);
$userid = $row["mailserver"];
echo $userid;
}
$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();
} catch (Exception $e) {
}
}