У директора появилась не плохая идя сделать электронную книгу жалоб и предложений. Не совсем электронную а смс. Т.е. пользователь отправляет смс на определенный номер и директор его видет.
И так разберем инструменты.
Уже имеется смс гейт для приема смс на мобильном телефоне (siemens c55 но не бойтесь пойдет и любой другой c com или его эмуляцией ну или новые usb модемы) ну и http://smstools3.kekekasvi.com настроенный на cygwin.
Почему cygwin? Так проще и надежней для одной программы чем на WMVare c Linux. Но и отличная возможность для работы с террасофт как оказалась после.
И так опустим настройку SMSTools так это не цель данной статьи да и про настройку можно найти на многих сайтах всё описано уже до меня правда в основном под линукс но под cygwin ни чем не отличается.
скажу лишь одно в cygwin вам понадобиться 2 вещи
если вы хотите принимать смс на русском языке
iconv
procmail
Эти два порта минимально необходимые для нас.
И так перейдем к настройке.
Все приходящие смс попадают в папку которую вы указали в настройках
в виде файлов:
- 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 его запустить
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 с соответствующими таблицами.
Пищем запрос на вставку
Запускаем в bash не работает. bash не правильно интерпретирует символы кавычек что двойных что и одинарных для sqlcmd
Переносим в cmd надо же работает но смотрим в базу и видим абракадабра вместо текста....Кодировка должна быть cp866
ну да ладно вспоминаем про опцию -i sqlcmd. Создаем файл с запросом sqtmp содержанием в кодировке 1251
sqlcmd -U1cuser -Pxxxx -S192.168.1.165 -dTS_demo -isqtmp
смотрим в базу отлично кодировка правильная.
Переходим ко второму шагу.
Необходимо связать записи сообщений с конкретным клиентом в терасофте как.
У клиента(контакта) может быть до 4 типов связи в карточке перебрать все 4 т.е. получается запрос на выборку с 4 объединениями, муторно и долго, для большой базы ещё и накладно. Но тут приминаются уроки Татьяны Адамчук и вкладка в менеджере деталей Средство связи Контакта(Контрагента). Смотрим в базу, отлично там все средства связи контакта в таблице tbl_ContactCommunication (контрагента tbl_AccountCommunication) там есть 2 нужных нам поля ContactID (AccountID) и Number.
Но и тут есть одна проблема но все номера у нас по шаблону и содержат +, ,(,),_ и прочею лишнею информацию, для избавления от онной используем REPLACE(REPLACE(Number,'+',''),' ','') ну и так далее сколько вам нужно ...
Пробуем что то типа
И ура эта смс связалась с моим контактом..
Для красоты пишем JOIN в таблицу tbl_ContactHistory и заходим в террасофт смотрим историю своего контакта... отлично...
Но не всё.
Это мы баловались с обычным запросом теперь как это заставить работать автоматически.
В SMSTools3 есть отличная штука как внешний обработчик событий Eventhandler как им пользоваться подробно описано в документации.
Мы лишь рассмотрим то что нужно нам.
Что должен выполнять скрипт:
- разбирать заголовок файла и выбирать нужные поля,( о которых я писал в начале статьи).
- Изменить кодировку сообщения из USS-2BE в CP1251
- Сделать выборку по базе SQl и добавить к контакту(контрагенту) связь и текст, либо просто смс в базу от анонимных клиентов.
И так по порядку в качестве основы были взяты скрипты от SMSTools3. Благо у бесплатного софта есть куча добрых и хороших примеров.
Первое
SUBJECT=`formail -zx Subject: $2`
Дату не извлекаю т.к. скрипт исполняться сразу после получения смс то это не имеет особого смысла с Getdate() будет расхождение не больше чем на 5 сек.
С текстом чуть по сложнее
echo "" >$FILE1251
cat $2 | formail -I "" >>$FILE1251
TEXT=`iconv -c -f UCS-2BE -t CP1251 $FILE1251`
Такая сложная структура связана с тем что признаком структуры Unicode начала(окончания) строки является 0x0a 0x0a а formail срезает этот символ...
кому что не понятно читаем
переходим в каталог с sqlcmd
cd /tmp/Binn
Формируем запрос
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
ну и добавляем в базу
где ххххх ваш пароль на доступ к sql.
так же проверяем это по tbl_AccountCommunication и если клиента и там нет то вносим его как анонима.
И все для красоты просмотра можем создать либо новый WorkPlase с которого можно будет отправлять смс (ну это тема для второй статьи), либо добавить в менеджер деталей, либо ограничит выбором в истории, а для директора сделать запрос по новой таблице и добавить его общий отчет.
Пример скрипта: