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