sms kpi

СМС книга жалоб и предложений

У директора появилась не плохая идя сделать электронную книгу жалоб и предложений. Не совсем электронную а смс. Т.е. пользователь отправляет смс на определенный номер и директор его видет.
И так разберем инструменты.
Уже имеется смс гейт для приема смс на мобильном телефоне (siemens c55 но не бойтесь пойдет и любой другой c com или его эмуляцией ну или новые usb модемы) ну и http://smstools3.kekekasvi.com настроенный на cygwin.
Почему cygwin? Так проще и надежней для одной программы чем на WMVare c Linux. Но и отличная возможность для работы с террасофт как оказалась после.

И так опустим настройку SMSTools так это не цель данной статьи да и про настройку можно найти на многих сайтах всё описано уже до меня правда в основном под линукс но под cygwin ни чем не отличается.
скажу лишь одно в cygwin вам понадобиться 2 вещи
если вы хотите принимать смс на русском языке
iconv
procmail
Эти два порта минимально необходимые для нас.

И так перейдем к настройке.
Все приходящие смс попадают в папку которую вы указали в настройках

incoming=\var\spool\sms\incoming

в виде файлов:
  • From: 79025148455
  • From_TOA: 91 international,ISDN/
  • telephone
  • From_SMSC: 79025110010
  • Sent: 10-11-17 01:21:02
  • Received: 10-11-17 01:21:23
  • Subject: GSM1
  • Modem: GSM1
  • IMSI: 250123004534481
  • Report: no
  • Alphabet: UCS2
  • Length: 13
  •  >7>2K5

И так из этого нам нужно
From:
Received:
Ну и сам текст смс.

Стоит обратить внимание на Alphabet: это кодировка текста. принятого смс у нас бывает 2 вида UCS и ISO в ISO в основном приходят сообщения на английском и в тексте данной статьи их рассматривать не будем.

И так информация есть теперь её нужно передать в террасофт....
Самым лучшим способом внести это в базу это просто сделать SQL Insert c данными значениями в качестве параметров но.

Клиентов для MSSql под линукс нет... Ну и под cygwin...
Работа с MYSQL Террасофтом не поддерживается....

Но ведь Cygwin работает под windows и все его расширения работают в среде win... По идее должны запускать win приложения из под cygroot'a
Проверяем копируем в папку темп sqlcmd.exe и пробуем из интерпретатора bash его запустить

$ ./SQLCMD.EXE
Failed to load resource file SQLCMD.rll. ?? ?????? ????????? ??????.

запускается но не работает не хватает файлов. Ищем не достающий файл и вспоминаем что cygwin ограничивает файловую систему папкой cygroot.
Копируем содиржимое папки c:\Program Files\Microsoft SQL Server\90\Tools\ в Cygroot\tmp
запускаем видим приглашение > к вводу команды, отлично!!!

И так переходим в Администратор Терасофт.
Создаем таблицу tbl_sms для примера по мимо стандартных добавляем поля
AccountID ContactID Text Number IN
Создаем связи по полям AccountID ContactID с соответствующими таблицами.

Пищем запрос на вставку

sqlcmd -U1cuser -Pxxxx -S192.168.1.165 -dTS_demo -Q"INSERT INTO tbl_sms (CreatedOn,Text,Number,IN) values (GETDATE(),'Должен быть текст','79025148455',1 )"

Запускаем в bash не работает. bash не правильно интерпретирует символы кавычек что двойных что и одинарных для sqlcmd
Переносим в cmd надо же работает но смотрим в базу и видим абракадабра вместо текста....Кодировка должна быть cp866

ну да ладно вспоминаем про опцию -i sqlcmd. Создаем файл с запросом sqtmp содержанием в кодировке 1251

INSERT INTO tbl_sms (CreatedOn,Text,Number,IN) VALUES (GETDATE(),'Должен быть текст','79025148455',1 )

sqlcmd -U1cuser -Pxxxx -S192.168.1.165 -dTS_demo -isqtmp

смотрим в базу отлично кодировка правильная.

Переходим ко второму шагу.

Необходимо связать записи сообщений с конкретным клиентом в терасофте как.
У клиента(контакта) может быть до 4 типов связи в карточке перебрать все 4 т.е. получается запрос на выборку с 4 объединениями, муторно и долго, для большой базы ещё и накладно. Но тут приминаются уроки Татьяны Адамчук и вкладка в менеджере деталей Средство связи Контакта(Контрагента). Смотрим в базу, отлично там все средства связи контакта в таблице tbl_ContactCommunication (контрагента tbl_AccountCommunication) там есть 2 нужных нам поля ContactID (AccountID) и Number.
Но и тут есть одна проблема но все номера у нас по шаблону и содержат +, ,(,),_ и прочею лишнею информацию, для избавления от онной используем REPLACE(REPLACE(Number,'+',''),' ','') ну и так далее сколько вам нужно ...
Пробуем что то типа

INSERT INTO tbl_sms (CreatedOn,ContactID,Text,Number,INii) SELECT  DISTINCT  GETDATE(),contactID,'должен быть текст3','79025148455',1 FROM  tbl_ContactCommunication WHERE REPLACE(REPLACE(Number,'+',''),' ','') = '79025148455'  

И ура эта смс связалась с моим контактом..

Для красоты пишем JOIN в таблицу tbl_ContactHistory и заходим в террасофт смотрим историю своего контакта... отлично...

Но не всё.

Это мы баловались с обычным запросом теперь как это заставить работать автоматически.

В SMSTools3 есть отличная штука как внешний обработчик событий Eventhandler как им пользоваться подробно описано в документации.

Мы лишь рассмотрим то что нужно нам.
Что должен выполнять скрипт:

  • разбирать заголовок файла и выбирать нужные поля,( о которых я писал в начале статьи).
  • Изменить кодировку сообщения из USS-2BE в CP1251
  • Сделать выборку по базе SQl и добавить к контакту(контрагенту) связь и текст, либо просто смс в базу от анонимных клиентов.

И так по порядку в качестве основы были взяты скрипты от SMSTools3. Благо у бесплатного софта есть куча добрых и хороших примеров.
Первое

FROM=`formail -zx From: $2 | sed 's/"//g'`
SUBJECT=`formail -zx Subject: $2`

Дату не извлекаю т.к. скрипт исполняться сразу после получения смс то это не имеет особого смысла с Getdate() будет расхождение не больше чем на 5 сек.

С текстом чуть по сложнее

FILE1251=`mktemp /tmp/smsd_XXXXXX`
echo "" >$FILE1251
cat $2 | formail -I "" >>$FILE1251
TEXT=`iconv -c -f UCS-2BE -t CP1251 $FILE1251`

Такая сложная структура связана с тем что признаком структуры Unicode начала(окончания) строки является 0x0a 0x0a а formail срезает этот символ...

кому что не понятно читаем

man formail, man iconv

переходим в каталог с sqlcmd
cd /tmp/Binn

Формируем запрос

echo "INSERT INTO tbl_sms (CreatedOn,ContactID,Text,Number,IN)" >sqtemp
echo "SELECT  DISTINCT  GETDATE(),contactID," >>sqtemp
echo "'$TEXT'," >>sqtemp
echo "'$FROM'" >>sqtemp
echo ",1 " >>sqtemp
echo "FROM  tbl_ContactCommunication" >>sqtemp
echo "Where REPLACE(REPLACE(Number,'+',''),' ','') = '$FROM'" >>sqtemp

ну и добавляем в базу

sqlcmd -U1cuser -Pxxxxxx -S192.168.1.173 -dTS -isqtemp

где ххххх ваш пароль на доступ к sql.

так же проверяем это по tbl_AccountCommunication и если клиента и там нет то вносим его как анонима.

И все для красоты просмотра можем создать либо новый WorkPlase с которого можно будет отправлять смс (ну это тема для второй статьи), либо добавить в менеджер деталей, либо ограничит выбором в истории, а для директора сделать запрос по новой таблице и добавить его общий отчет.
Пример скрипта:

Нравится

Поделиться

2 комментария

Спасибо очень интересное решение! +1

Здравствуйте!
Где инициируется отправка СМС?

Показать все комментарии