вторник, 9 сентября 2014 г.

howto как получить информацию о номере телефона из CRM (SugarCRM) при звонке на asterisk (Freepbx-Elastix) и отправить его на экран менеджеру

небольшое howto как выдрать номер из базы CRM (в моём случае sugarcrm) при звонке на asterisk (Freepbx-Elastix) и отправить его на экран менеджеру. По разным причинам ни один из способов найденных мною в интеренете не заработал :) искал я долго.

поехали

В Freepbx
в файле extensions_custom.conf
[custom-CallNotifcall]
exten => s,1,TrySystem(/bin/echo ${CALLERID(name)} | /usr/bin/nc SERVER_IP 3333 &)
exten => s,n(dest-ext),Goto(ext-group,600,1)


в Custom Destination admin-Freepbx сделать запись callnotif, которая обращалась к макросу custom-CallNotifcall,s,1
Далее в Incoming Route делаю custon destiation - callnotif

скрипты
notify запущен на SERVER_IP
#!/bin/bash

while true; do nc -l 3333 | while read message1; do
message1=`echo $message1|cut -c2-`
message2=`place_script/search_data.py $message1`
if [[ ! $message2 ]] ; then exit; fi
logger "обработанная инфа "$message2
i=1
while true; do
  text=`echo $message2 | cut -d "^" -f\`echo $i\` | cut -d "|" -f1`
  if [[ $text ]] ; then
    id=`echo $message2 | cut -d "^" -f\`echo $i\` | cut -d "|" -f2`
    id=${id// /}
    module=`echo $message2 | cut -d "^" -f\`echo $i\` | cut -d "|" -f3`
    url="http://webserver.sgm/index.php?module="$module"&action=DetailView&record="$id
    message=$message"*$text информация из CRM-"$module""
    i=$((i+1))
  else break
  fi;
done

echo "$message" | nc IP_manager1 3333 &
echo "$message" | nc
IP_manager2 3333 &
done ; done
 

 
search_data.py

#!/usr/bin/env python
# -- coding: utf-8 --
import MySQLdb as db
import sys
q="%"+sys.argv[1]+"%"
con=db.connect(host="
SUGARCRM_IP",
user="user",
passwd="pass",
db="sugarcrm",
charset="utf8" )
cur = con.cursor()

#Запрос в Контакты КОНтрагентов
querry="""SELECT `first_name`,`last_name`,`id`  FROM `sugarcrm`.`contacts` WHERE CONVERT(`phone_fax` USING utf8) LIKE '%(q)s' OR CONVERT(`phone_other` USING utf8) LIKE '%(q)s' OR $
cur.execute(querry)
for row in cur:
  print row[1].encode('utf-8'), " ", row[0].encode('utf-8'), "|",row[2].encode('utf-8'),"|Contacts|^",

#запрос в LEADS
querry="""SELECT `first_name`,`last_name`,`account_name`,`id` FROM `sugarcrm`.`leads` WHERE CONVERT(`phone_home` USING utf8) LIKE '%(q)s' OR CONVERT(`phone_mobile` USING utf8) LIK$
cur.execute(querry)
for row in cur:
  print row[1].encode('utf-8'), " ", row[0].encode('utf-8'), " ", row[2].encode('utf-8'), "|", row[3].encode('utf-8'), "|Leads|^"

#Запрос в Контрагенты
querry="""SELECT `name`,`id`  FROM `sugarcrm`.`accounts` WHERE CONVERT(`phone_fax` USING utf8) LIKE '%(q)s' OR CONVERT(`phone_office` USING utf8) LIKE '%(q)s' OR CONVERT(`phone_al$
cur.execute(querry)
for row in cur:
  print row[0].encode('utf-8'), "|",row[1].encode('utf-8'), "|Accounts|^"


cur.close()
con.close()


на клиентах постоянно запущен через rc.local скрипт вывода информации на экран

#!/bin/bash

while true; do
  nc -l 3333 | while read msg; do
    msg=${msg//\*/\\n};
    DISPLAY=:0 XAUTHORITY=`echo $HOME`/.Xauthority zenity --info --text "$msg";
  done ;
done


Скрипт теперь использует nc для передачи данных это значительно быстрее нежели ssh. Запуск на клиентах скрипта отработки передачи данных с nc позволяет запускать не только zenity, но и notify-send, но я от него отказался, так как у нас используется linphone + kde и сообщения от них показываются последовательно, что не даёт возможность одновременно ответить на звонок и посмореть кто звонит.
P.S.
В итоге отказался от netcat. Так как в произвольный момент ждущий сообщения nc при получении его уходил в 100% загрузку процессора и ничего не делал. Использую jabber, предварительно проверяя включён ли комп
message=$1
infor_for=`fping -aq -t100 192.168.1.xx 192.168.1.xx`
recepient=""
if [[ `echo $infor_for | grep "192.168.1.xx"` ]]; then recepient=$recepient"
recepient_jabber1" ; fi ;
if [[ `echo $infor_for | grep "192.168.1.xx"` ]]; then recepient=$recepient"
recepient_jabber2" ; fi ;  
if [[ $recepient ]]; then echo $message | /usr/bin/sendxmpp -j jabber_server -p password -u jabber_username `echo $recepient` ; fi ;