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";
|