diff --git a/admin/anfragen.php b/admin/anfragen.php index f36d670..c2f2e3a 100644 --- a/admin/anfragen.php +++ b/admin/anfragen.php @@ -255,6 +255,9 @@ if(!check_worker()){ // Die Anlage haelt die Rufnummer des Anrufers getrennt von den // Stammdaten - sie kann von der hinterlegten abweichen. $anruferzeile = GetAnruferZeile($row["source"] ?? "mail", $row["anrufernummer"] ?? null); + // Wer koennte angerufen haben? Nur ein Vorschlag anhand der + // Rufnummer, die Auswahl trifft die Mitarbeiterin. + $anrufervorschlag = GetPatientZuRufnummerAusgabe($pdo, $row["source"] ?? "mail", $row["anrufernummer"] ?? null, $row["requester_person_id"] ?? null); if($hatPerson){ $userausgabe = $vorname . " " . $nachname . "
" . $ausgabegeburstag; $adresse = $plz . " " . $ort . "
" . $strasse ; @@ -266,6 +269,7 @@ if(!check_worker()){ $userausgabe = "Kein Patient zugeordnet"; $adresse = "-"; $kontakt = ($anruferzeile !== "") ? $anruferzeile : "Kontaktdaten siehe Nachricht"; + $kontakt .= $anrufervorschlag; } echo "$userausgabe
$kontakt$adresse$ordnungsstring - $anfrageart
$WeitereInfos$datumausgabe$update_time
$checkausgabe
$ausgabeworker"; // "Antworten" verschickt eine Mailvorlage. Ohne zugeordnete Person @@ -361,6 +365,7 @@ if(!check_worker()){ echo "ueber Telefonisch beantwortet abschliessen."; echo ""; echo GetAnruferZeile($row["source"] ?? "mail", $row["anrufernummer"] ?? null); + echo GetPatientZuRufnummerAusgabe($pdo, $row["source"] ?? "mail", $row["anrufernummer"] ?? null, $row["requester_person_id"] ?? null); echo GetSprachnachrichtHinweis($row["source"] ?? "mail"); echo "Nachricht:
" . nl2br(e((string)$row["nachricht"])) . "

"; ZuruckzumAnfrageOverView(); @@ -1151,6 +1156,7 @@ if(!check_worker()){ /* --- Anzeige-Strings --- */ $WeitereInfos = ""; $WeitereInfos .= GetAnruferZeile($row["source"] ?? "mail", $row["anrufernummer"] ?? null); + $WeitereInfos .= GetPatientZuRufnummerAusgabe($pdo, $row["source"] ?? "mail", $row["anrufernummer"] ?? null, $row["person_id"] ?? null); $WeitereInfos .= GetSprachnachrichtHinweis($row["source"] ?? "mail"); if (!empty($medikamenteins)) { $WeitereInfos .= "Medikament1: " . htmlspecialchars($medikamenteins, ENT_QUOTES, 'UTF-8') . "
"; diff --git a/inc/functions.inc.php b/inc/functions.inc.php index a0a6269..4962766 100644 --- a/inc/functions.inc.php +++ b/inc/functions.inc.php @@ -692,6 +692,122 @@ function GetAnruferZeile($source, $anrufernummer){ return "Anruf von: " . $link . "
"; } +/** + * 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. + * + * Liefert alle passenden Zeilen aus persons - bewusst alle, denn 521 der + * 2972 gepflegten Nummern gehoeren zu mehr als einer Person (Familien, zwei + * Nummern sogar zu 16 bzw. 18). Die Auswahl trifft die Mitarbeiterin, nicht + * der Code. + * + * Nummern mit weniger als 7 Ziffern werden nicht gesucht: in persons 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(); + $stmt = $pdo->query("SELECT person_id, vorname, nachname, geburtstag, email, tele + FROM persons WHERE tele IS NOT NULL AND tele <> ''"); + foreach($stmt as $p){ + $n = NormalisiereRufnummer($p["tele"]); + if(strlen($n) < 7){ + continue; + } + $index[$n][] = $p; + } + } + + 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(); + foreach($treffer as $p){ + $name = trim(((string)$p["vorname"]) . " " . ((string)$p["nachname"])); + $namen[] = htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); + } + + if(count($treffer) === 1){ + $p = $treffer[0]; + $text = "Rufnummer passt zu: " . $namen[0] . ""; + + $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 .= "
" . htmlspecialchars($mail, ENT_QUOTES, 'UTF-8'); + } + + return $text . "
nicht bestätigt - nur über die Rufnummer erkannt
"; + } + + $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"; + } + + return $text . "
nicht zugeordnet - bitte selbst prüfen
"; +} + function GetPatientenartName($Patientenart){ if($Patientenart == "0"){ $impfenangebot = "Neupatient";