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