Advokat mit MS SQL Server als CID-Quelle in FreePBX einbinden

By dose | September 11, 2023
Under: Uncategorized

Ich habe bereits in einem frühere Artikel dargelegt, wie man in die FreePBX Telefonanlage eine Called ID Suche für das in Österreich populäre Anwaltskanzleipaket Advokat einbindet.
Damals basierte das Paket noch auf einer MS-Access Datenbank, mitterweile ist überall der MS SQL Server vorgeschrieben.
Das bietet den großen Vorteil, dass man nun nicht mehr wie damals die Liste aller Adressen mühsam händisch durchparsen kann (aufgrund des sehr limitierten SQL-Syntax zur Abfrage von MDB-Datenbanken), sondern die DB direkt schnell inklusive Nummern-Normalisierung abfragen kann.
Dies hat den weiteren Vorteil, dass man Asterisk das Abfrageergebnis nicht mehr zwischenspeichern lassen muss (Caching auf Yes in den CID-Einstellungen der FreePBX), was zu dem unschönen Effekt geführt hat, dass die cidname Records in der astdb im Asterisk immer mit einem Leerwert gespeichert wurden, wenn kein Abfrageergebnis vorhanden war, was wiederum zur Folge hatte, dass ein spätere Eintrag der Nummer in der Advokat-Datenbank nicht mehr dazu führte, dass der Namen richtig aufgelöst wird, sondern dieser immer leer bleibt.

Hier also nun die aktualisierte Anleitung:

Zuerst müssen einmal, wenn noch nicht vorhanden, unixodb und die php-Module dafür installiert werden.
php-odbc wird hier als Meta-Paket angegeben, je nach Debian-Release kann es sein, dass man für die Preepbx ein eigenes Paket mit einer kompatiblen PHP-Version installiert hat, demnach wäre der Modulname dann z.B. php7.4-odbc.
Für die Installation der mssql-tools wird auf die jeweiligen Tutorials zur MS SQL Server Installation in diesem Blog verwiesen.

apt-get install unixodbc php-odbc mssql-tools

Die Advokat-Datenquelle dann dem UnixODBC mitteilen. Es wird davon ausgegangen, dass durch die Installation des MS SQL Servers oder zumindest dessen Client Tools schon ein entsprechender Eintrag in /etc/odbcinst.ini angelegt wurde.
Für den Treibernamen ist also ggf die odbcinst.ini zu konsultieren, sollte der hier angegebene nicht passen.
vi /etc/odbc.ini

[Advokat]
Description = Advokat
Driver = ODBC Driver 17 for SQL Server
Server = localhost
Port = 1433
Database = Advokat_DATEN

Nun benötigen wir noch ein kleines PHP-Script, welches die Nummern
normalisiert, damit diese mit der eingehenden Nummer auf der Telefonanlage
verglichen werden können.
Die Normalisierung der Nummer muss man sich entsprechend der Anlagenparameter
anpassen, da diese wohl je nach Provider in unterschiedlicher Form kommt.
Das Script z.B. in den root der FreePBX-Installation kopieren oder an einen
Ort, wo es das CIDLookup Script finden kann.
Zugangsdaten für den Server entsprechend im script anpassen:

tel.php:

define('DSN_ADVOKAT', 'Advokat');
 
function GetName($odbc, $NNr)
{
 
    if ($result = odbc_exec($odbc, 'select Titel, Vorname, Name1 from Namen Where NNr='.$NNr))
    {
        if (odbc_fetch_row($result))
        {
            $titel = odbc_result($result,1);
            $ret=($titel?$titel.' ':'').odbc_result($result,2).' '.odbc_result($result,3);
        }
        odbc_free_result($result);
    }
    return $ret;
}
 
$nr = $_REQUEST['nr'];
if (!is_numeric($nr)) exit;
$where = "WHERE phone='$nr'";
if ($nr[0]=='0' && $nr[1]=='0') $where.=" or phone='".substr($nr, 2)."' ";
else if ($nr[0]=='0' && $nr[1]!='0') $where.=" or phone='43".substr($nr, 1)."' ";
 
$found=false;
$odbc = odbc_connect(DSN_ADVOKAT, 'sa', 'superuserpassword');
if ($result = odbc_exec($odbc, "with t as (select NNr, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CONCAT(Vorwahl, Telefon),' ',''),'(',''),')',''),'-',''),'?',''),'+','') phone from Telefon Where Art='Telefon' or Art='Handy') select NNr, phone from t $where"))
{
    while (odbc_fetch_row($result))
    {
        echo GetName($odbc, odbc_result($result,1));
        $found=true;
        break;
    }
    odbc_free_result($result);
} else echo "fail odbc";
 
odbc_close($odbc);

Wenn man möchte, kann man auch noch einen Lookup in der lokalen SOGO-Installation anhängen, wenn man einen derartigen Server betreibt und die Views aus dem zugehörigen Artikel angelegt hat (DB User und Passwort enstprechend anpassen):

if (!$found)
{
    // Alternativ kann man noch im SOGO-Adressbuch nachschaun
    if ($conn=mysqli_connect("localhost","sogo","sogopasswd"))
    {
    if ($seldb=mysqli_select_db($conn, "sogo"))
    {
        if ($retrive=mysqli_query($conn, "select c_cn from phoneno_f $where"))
        {
            if($r=mysqli_fetch_row($retrive))
            {
                echo $r[0];
            }
        }
    }
    mysqli_close($conn);
    }
}

Danach müssen wir nur noch eine neue Quelle im CIDLookup definieren.

Source type: HTTP
Host: localhost
Port: 80 oder wo immer der Webserver läuft
Path: /tel.php
Query: nr=[NUMBER]

Cachen nicht aktivieren. Das sollte es gewesen sein.

Leave a Comment

Name:

E-Mail :

Subscribe :
Website :

Comments :