From 4dabad0b22b378c27e917504439373cb3b7b41d2 Mon Sep 17 00:00:00 2001 From: Clemens Creutzburg Date: Tue, 8 Sep 2026 17:41:36 +0200 Subject: [PATCH] Anrufernummer verlinken, PraxisKI-Link auf /anfragen/ Der Hinweis aus dem letzten Commit zeigte auf die Startseite von PraxisKI. Richtig ist https://ki-praxis.praxis.local/anfragen/. Neue Spalte anfragen.anrufernummer VARCHAR(255) NULL wird jetzt bei Telefonanfragen als anklickbarer tel:-Link ausgegeben. GetTelefonLink() baut das Ziel aus Ziffern und einem fuehrenden Plus, zeigt die Nummer aber unveraendert an - Leerzeichen, Klammern, Slashes und Durchwahl-Bindestriche stoeren den Link damit nicht. Nummern ganz ohne Ziffer, etwa bei unterdrueckter Rufnummer, bleiben Text ohne Link. Der Rohwert wird in der Funktion maskiert. GetAnruferZeile() liefert die beschriftete Zeile nur fuer source='telefon' und nur, wenn eine Nummer da ist. In der Liste steht sie in der Kontaktspalte, wo Telefonnummern hingehoeren; dort ersetzt sie bei Anfragen ohne zugeordneten Patienten den Platzhalter "Kontaktdaten siehe Nachricht". In Antwortformular, Hinweisseite, Antwort einsehen und Patientenhistorie steht sie bei den uebrigen Anfrageinformationen. Die Abfragen der letzten beiden lasen die Spalte nicht mit, sie ist dort ergaenzt. Die Spalte ist derzeit in allen 309 Telefonanfragen NULL - die Anlage schreibt sie noch nicht. Bis dahin aendert sich die Anzeige nicht, der bisherige Rueckfall greift. Geprueft: GetTelefonLink gegen internationale, geklammerte, mit Leerzeichen und Durchwahl geschriebene Nummern sowie gegen Leerwert, NULL, reinen Text und einen Injektionsversuch - das Script kommt maskiert heraus, nicht als Markup. Listenlogik ueber alle 12789 Anfragen mit simulierter Nummer durchgerechnet: der Link erscheint genau dann, wenn source='telefon' ist und eine Nummer vorliegt, und Nicht-Telefonzeilen bekommen kein zusaetzliches
in die Kontaktspalte. Co-Authored-By: Claude Opus 5 --- admin/anfragen.php | 14 +++++++++++++- inc/functions.inc.php | 44 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/admin/anfragen.php b/admin/anfragen.php index 2bc0b6c..f36d670 100644 --- a/admin/anfragen.php +++ b/admin/anfragen.php @@ -252,14 +252,20 @@ if(!check_worker()){ // werden konnte. Frueher fielen diese Zeilen durch den INNER // JOIN komplett aus der Liste. $hatPerson = ($row["vorname"] !== null || $row["nachname"] !== null); + // 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); if($hatPerson){ $userausgabe = $vorname . " " . $nachname . "
" . $ausgabegeburstag; $adresse = $plz . " " . $ort . "
" . $strasse ; $kontakt = "$mail
Tel:$tel"; + if($anruferzeile !== ""){ + $kontakt .= "
" . $anruferzeile; + } }else{ $userausgabe = "Kein Patient zugeordnet"; $adresse = "-"; - $kontakt = "Kontaktdaten siehe Nachricht"; + $kontakt = ($anruferzeile !== "") ? $anruferzeile : "Kontaktdaten siehe Nachricht"; } echo "$userausgabe
$kontakt$adresse$ordnungsstring - $anfrageart
$WeitereInfos$datumausgabe$update_time
$checkausgabe
$ausgabeworker"; // "Antworten" verschickt eine Mailvorlage. Ohne zugeordnete Person @@ -354,6 +360,7 @@ if(!check_worker()){ echo "Bitte telefonisch beantworten und die Anfrage anschliessend "; echo "ueber Telefonisch beantwortet abschliessen."; echo ""; + echo GetAnruferZeile($row["source"] ?? "mail", $row["anrufernummer"] ?? null); echo GetSprachnachrichtHinweis($row["source"] ?? "mail"); echo "Nachricht:
" . nl2br(e((string)$row["nachricht"])) . "

"; ZuruckzumAnfrageOverView(); @@ -402,6 +409,7 @@ if(!check_worker()){ $antworttext = $row["antworttext"] ?? null; $WeitereInfos = ""; + $WeitereInfos .= GetAnruferZeile($row["source"] ?? "mail", $row["anrufernummer"] ?? null); $WeitereInfos .= GetSprachnachrichtHinweis($row["source"] ?? "mail"); if ($medikamenteins) $WeitereInfos .= "Medikament1: $medikamenteins
"; if ($medikamentzwei) $WeitereInfos .= "Medikament2: $medikamentzwei
"; @@ -1085,6 +1093,7 @@ if(!check_worker()){ a.sicherenachricht, a.abholort, a.source, + a.anrufernummer, p.person_id, p.vorname, @@ -1141,6 +1150,7 @@ if(!check_worker()){ /* --- Anzeige-Strings --- */ $WeitereInfos = ""; + $WeitereInfos .= GetAnruferZeile($row["source"] ?? "mail", $row["anrufernummer"] ?? null); $WeitereInfos .= GetSprachnachrichtHinweis($row["source"] ?? "mail"); if (!empty($medikamenteins)) { $WeitereInfos .= "Medikament1: " . htmlspecialchars($medikamenteins, ENT_QUOTES, 'UTF-8') . "
"; @@ -1333,6 +1343,7 @@ if(!check_worker()){ a.medikament5, a.medikament6, a.source, + a.anrufernummer, aa.artname AS anfrageart_name, @@ -1393,6 +1404,7 @@ if(!check_worker()){ $ordnungsstring = GetOrdnungsid($ordnungsid); $WeitereInfos = ""; + $WeitereInfos .= GetAnruferZeile($row["source"] ?? "mail", $row["anrufernummer"] ?? null); $WeitereInfos .= GetSprachnachrichtHinweis($row["source"] ?? "mail"); if (!empty($med1)) $WeitereInfos .= "Medikament1: " . htmlspecialchars($med1, ENT_QUOTES, 'UTF-8') . "
"; if (!empty($med2)) $WeitereInfos .= "Medikament2: " . htmlspecialchars($med2, ENT_QUOTES, 'UTF-8') . "
"; diff --git a/inc/functions.inc.php b/inc/functions.inc.php index 98e024c..a0a6269 100644 --- a/inc/functions.inc.php +++ b/inc/functions.inc.php @@ -646,10 +646,52 @@ function GetSprachnachrichtHinweis($source){ return ""; } return "Transkript der Sprachnachricht - Aufnahme anhören: " - . "ki-praxis.praxis.local" + . "ki-praxis.praxis.local/anfragen" . " (nur im Praxisnetz)
"; } +/** + * 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 "" + . htmlspecialchars($nummer, ENT_QUOTES, 'UTF-8') . ""; +} + +/** + * 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 . "
"; +} + function GetPatientenartName($Patientenart){ if($Patientenart == "0"){ $impfenangebot = "Neupatient";