Mittwoch, 10. Juli 2013

vTiger ist ja soooo toll!

Jetzt ist es wieder so weit, ich muss meinen Frust irgend jemanden erzählen! Die aktuelle Aufgabenstellung war ein CRM mit Asterisk anbindung auf zu setzen. Ein kurze Rücksprache mit Google ergab, dass es da diverse Lösung für gibt. Kostenpflichtige sind gleich mal alle ausgeschieden, weil eben kostenpflichtig ;) Nun gab eben noch die Klassiger, nach einem verzweifelten Versuch die Asterisk-Integration unter "sugarCRM" zum laufenzu bekommen bin ich dann doch zu "vTiger 5.4.0" umgestiegen, da hier ja angeblich schon alles "Out-Of-The-Box" dabei sein soll. Gutgläubig wie ich nun habe ich mich den Abenteuer gestellt und diesmal sollte es ein Erfolg werden! Leider habe ich da den Indern wohl zu viel zugemutet, wer es nicht weiß, vTiger ist ein Ableger von sugarCRM und wurde von einer indischen Firma entwickelt.
Die installation auf einem Ubuntu-Server über den binary-installer ging mal volle kanne nach hinten los, versucht es erst gar nicht, das klappt eh nicht! Also bin ich zur "Source"-Variante umgestiegen. Nachdem ich von PHP 5.4 ein Downgrade auf 5.3 gemacht habe, lief sogar der Web-Installer von vTiger. Alles sah echt gut aus und ich war echt guter Dinge jetzt einfach durchstarten zu können! Weit gefehlt, die nächste Hürde hat nicht lange auf sich warten lassen.
Die Asterisk-Integration ist wohl so gut wie unmöglich zu verallgemeinern. Im PBX-Modul habe ich schnell mal den Zugang zur Asterisk AMI eingerichtet und dachte nun wird alles gut, weit gefehlt! Ich habe ein Asterisk 1.8 im Einsatz und von vTiger wird derzeit nur Asterisk 1.6 unterstützt und das habe ich auch gemerkt. Ausgehende Anrufe gingen eigentlich recht problemlos, nur die Eingehenden, die haben sich nicht blicken lassen. Kein schönes Popup welches mir anzeigt wer da gerade schönes anruft. Die Leidensgenosen bei Google berichteten von einem "AsteriskClient.php" und dass dort irgendwas angepasst werden soll. Ja, irgendwas... Ich habe mir den Code angesehen und auch recht schnell verstanden was die da vorhaben. Darauf hin habe ich mir den Output von meinem Asterisk angesehen:

# php /var/www/vtigercrm/cron/modules/PBXManager/AsteriskClient.php
Schnell wurde mir klar, das was mein Asterisk da ausspuckt und das was der "AsteriskClient" erwartet passt nicht zusammen. Der Dreh und  Angelpunkt ist die Function "asterisk_handleResponse2", hier wird erkannt für welchen SIP-Account ein Anruf gerade rein kommt. Nachdem ich folgende Änderung vorgenommen habe und es so an meine Bedürfnisse angepasst habe wurden die Eingehenden Anrufe schonmal erkannt:

function asterisk_handleResponse2($mainresponse, $adb, $asterisk, $state) {
    //AppData: SIP/1000&SIP/2000,20,TtrM(auto-blkvm)
    $appdata = $mainresponse['AppData'];

    $uniqueid = $channel = $callerType = $extension = null;
    $parseSuccess = false;

    if (
//        $mainresponse['Event'] == 'Newexten' && (strstr($appdata, "__DIALED_NUMBER") || strstr($appdata, "EXTTOCALL"))
            $mainresponse['Event'] == 'Newexten' && (preg_match('!^(SIP/[0-9]+&?)+,!', $appdata) )
    ) {

        $uniqueid = $mainresponse['Uniqueid'];

        $channel = $mainresponse['Channel'];
        $splits = explode('/', $channel);
        $callerType = $splits[0];

        $appDataSplits = explode(',', $appdata);
        $sipSplits = explode('&', array_shift($appDataSplits));
        $extSplits = explode('/', array_shift($sipSplits));
        $extension = $extSplits[1];

        if (count($sipSplits) > 0) {
            $mainresponse['AppData'] = implode('&', $sipSplits) . ',' . implode(',', $appDataSplits);
            asterisk_handleResponse2($mainresponse, $adb, $asterisk, $state);
        }


        $parseSuccess = true;
    } else if ($mainresponse['Event'] == 'OriginateResponse') {
        //if the event is OriginateResponse then its an outgoing call and set the flag to 1, so that AsteriskClient does not pick up as incoming call
        $uniqueid = $mainresponse['Uniqueid'];
        $adb->pquery("UPDATE vtiger_asteriskincomingevents set flag = 1 WHERE uid = ?", array($uniqueid));
    }

....
 Zu sehen ist auch, dass in meiner Asterisk-Konfiguration für ein Nummer mehrer SIP-Client angesteuert werden, so habe ich für jeden dieser gemeldeten SIP-Client die Function entsprechend erneut aufgerufen. Nun dachte ich, alles wird erkannt und landet in der Datenbank, nun ist das Problem auch beseitigt. Leider ging es weiter... Nun ist zwar dieses schöne Popup aufgetaucht aber es zeigte mir jeden Anrufer so an, als wäre diese Nummer nicht als Firma oder Kunde in der Datenbank hinterlegt? Ich konnte mir dies gar nicht erklären, die Nummer wurde doch nun korrekt von Asterisk erkannt und auch in die DB geschrieben, doch da habe ich es gesehen. Im Popup fehlte die führende Null! Wie ist nun diese Null abhanden gekommen? Das Rätsels Lösung wasdie Datenbank, da laut vTiger für das entsprechende Feld ein "BigINT" mit 20 Stellen vorgesehen war. Und was passiert mit führenden Nullen bei einem INT? Richtig, die verschwinden einfach! Also habe ich das entsprechende Feld in der Datenbank angepasst:

ALTER TABLE `vtiger_asteriskincomingevents` CHANGE COLUMN `from_number` `from_number` VARCHAR(50) NULL DEFAULT NULL  ;
Nun wurde die Nummer in der Datenbank korrekt gespeichert. Zu erwähnen ist aber, dass bei einem eingehenden Anruf, diese Nummer 1zu1 verglichen wird um den entsprechenden Kunden zu finden. Somit sollte man vermeiden Vorwahl und Rufnummer durch irgend ein Zeichen zu trenne, sondern einfach am Stück zu hinterlegen, sonst findet das Popup-Modul den Kunden nicht! Ein weiteres Mysterium wurde bezwungen und läuft nun.
Nun sollte man von ausgehen, dass der Rest problemlos läuft? Leider nicht, weiter ging es bei mir mit der Einrichtung vom E-Mail-Server. Die systemweite SMTP-Server Einstellung befindet sich in den Einstellungen und erwartet entsprechende Zugangsdaten. Schnell habe ich extra dafür ein neues E-Mail-Konto eingerichtet und alle Daten hinterlegt. Beim Speichern werden diese Einstellungen überprüft. Ich konnte machen was ich wollte, vTiger hat meine Settings nicht gefressen, immer nur mit einer nichtssagenden Fehlermeldung, dass keine Test-Mail gesendet werden konnte. Nach etlichen Zeilen Code welche ich wieder gelesen habe und hardcodierte Debug Ausgabeschalter konnte ich nun herrausfinden, dass vTiger grundsätzlich davon ausgeht, dass der verwendete SMTP-Server mit der Domain von der E-Mail Adresse übereinstimmt. Mein verwendeter SMTP-Server ist bei Hosteurope und wird als Host über das Web-Paket angesprochen:

wpXXX.webpack.hosteurope.de
Nun, was tut vTiger an dieser stelle. Es nimmt als "Sender-E-Adresse" genau diese Domain, schnibbelt noch vorne den ersten Teil ab, also hier "wpXXX" und baut sich daraus dann eine E-Mail-Adresse: noreply@webpack.hosteurope.de. Diese E-Mail-Andresse hat mein SMTP-Server nicht zugelassen und entsprechend den Versand verweigert! Darauf hin musste ich mal wieder den Source etwas anpassen. In der Datei "/var/www/vitigercrm/modules/Emails/mail.php" in der Function "setMailerProperties" so um die Zeile 195 gibt es folgenden Code:

$mail->Sender= getReturnPath($mail->Host);
Diese Zeile führt zu oben genanntes Verhalten. Darauf hin habe ich diese Zeile geringfügig angepasst:

$mail->Sender = $from_email ? $from_email : getReturnPath($mail->Host);
Und schon läuft auch der eingetragene SMTP-Server mit einer anderen Domain. Ich habe an dieser Stelle nun erstmal ein "Break" gemacht und nicht weiter versucht die Features von vTiger zu nutzen. Ich denke da wird es noch die eine oder andere Situation geben wo Nachgebessert werden muss.
Vielleicht konnte ich mit meinen Erfahrungen an vTiger dem einen oder anderen etwas Helfen.

Bis die Tage,
  greez, Volker...

1 Kommentar: