Drei zusammenhaengende Punkte aus der Analyse des Login-Problems. 1. PHP-Fehler wurden an Besucher ausgegeben display_errors war in impfwarteliste.php (oeffentlich), intern/ impfwarteliste.php, intern/neueanfrage.php, den beiden neueanfrage-old Sicherungen und zeiterfassung/api/vacations.php fest eingeschaltet. Die oeffentliche Impfwarteliste zeigte Patienten bei einem Fatal Error sogar Meldung, Dateipfad und Zeilennummer. Ueberall auf log_errors umgestellt: E_ALL wird weiterhin vollstaendig erfasst, landet aber im Server-Log statt auf der Seite. Der Shutdown-Handler der Impfwarteliste protokolliert die Details und zeigt nur noch einen neutralen Hinweis. Auch register.php gab die rohe Exception-Meldung aus. 2. SendMailMessageSilent() verschluckte jeden Fehler Der catch-Block war leer. Ein SMTP-Ausfall war dadurch von aussen nicht von einem falschen Code zu unterscheiden - der Benutzer landete auf verify_2fa.php und wartete auf eine Mail, die nie kam. Die Funktion protokolliert jetzt und liefert einen bool zurueck. login.php wertet das aus, nimmt bei Fehlschlag den 2FA-Datensatz und die Session-Vormerkung zurueck und sagt es auf der Login-Seite, statt weiterzuleiten. Nebenbei entfernt: ein uebrig gebliebenes echo, das den Mailserver-Namen mitten in die Seite schrieb, sowie ein zweites mysqli_fetch_assoc() auf demselben Result, das nur NULL liefern konnte. 3. register.php verschickte keine Bestaetigungsmail mailreg blieb 0, jeder neue Benutzer landete nach dem Login auf der Aufforderung, die Authentifizierung selbst anzustossen. Die Mail geht jetzt direkt nach der Registrierung raus. Erzeugung und Text liegen in der neuen Funktion sendeAuthentifizierungsMail(), die authmeldung.php ebenfalls benutzt - dort wurde der Rueckgabewert des Versands bisher einer Variablen zugewiesen und nie ausgewertet, die Seite meldete Erfolg auch bei fehlgeschlagenem Versand. Der Versand laeuft nach dem commit(), deshalb prueft der catch-Block in register.php jetzt inTransaction(), bevor er rollBack() aufruft. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3042 lines
98 KiB
PHP
3042 lines
98 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,
|
|
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'> </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'> </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() {
|
|
// '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;
|
|
}
|
|
|
|
}
|