diff --git a/inc/functions.inc.php b/inc/functions.inc.php
index 4962766..8f7467f 100644
--- a/inc/functions.inc.php
+++ b/inc/functions.inc.php
@@ -715,13 +715,23 @@ function NormalisiereRufnummer($nummer){
/**
* 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.
+ * 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.
*
- * Nummern mit weniger als 7 Ziffern werden nicht gesucht: in persons stehen
- * ein paar Platzhalter mit 1 bis 5 Ziffern, die sonst wahllos zusammenfallen.
+ * 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
@@ -737,14 +747,61 @@ function FindePatientenZuRufnummer($pdo, $nummer){
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){
- $n = NormalisiereRufnummer($p["tele"]);
- if(strlen($n) < 7){
- continue;
- }
- $index[$n][] = $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,
+ ));
}
}
@@ -773,9 +830,13 @@ function GetPatientZuRufnummerAusgabe($pdo, $source, $anrufernummer, $personId =
}
$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){
@@ -796,6 +857,12 @@ function GetPatientZuRufnummerAusgabe($pdo, $source, $anrufernummer, $personId =
$text .= "
" . htmlspecialchars($mail, ENT_QUOTES, 'UTF-8');
}
+ if(!empty($p["altbestand"])){
+ $text .= $p["person_id"] === null
+ ? "
nur im alten Bestand, kein aktueller Patientendatensatz"
+ : "
Rufnummer stammt aus dem alten Bestand";
+ }
+
return $text . "
nicht bestätigt - nur über die Rufnummer erkannt
";
}
@@ -804,6 +871,9 @@ function GetPatientZuRufnummerAusgabe($pdo, $source, $anrufernummer, $personId =
if(count($namen) > count($gezeigt)){
$text .= " und " . (count($namen) - count($gezeigt)) . " weiteren";
}
+ if($ausAltbestand){
+ $text .= "
teilweise über den alten Bestand gefunden";
+ }
return $text . "
nicht zugeordnet - bitte selbst prüfen
";
}