Обработка для взаимодействия с телефонией (Asterisk IP-PBX) для 8.1, 8.2 (Тестировалось на конфигурации УТ)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

37 Comments

  1. prolancer

    Супер, рарус покуривает в сторонке

    Reply
  2. vabue

    Есть куда развивать 🙂

    Reply
  3. markers

    Ещё один повод перейти на Asterisk!

    Reply
  4. lustin

    (3) повод перейти на Asterisk — это сам Asterisk

    Reply
  5. markers

    (4) это понятно, просто для внедрения его у нас нужно выложить порядка 70 тысяч, что не по карману да и та АТС что стоит сейчас нас более-менее устраивает.. По этому чем больше будет подобных обработок (Спасибо автору) тем будет больше поводов вложить эти 70 тысяч….

    Reply
  6. lustin

    согласен, для популяризации такие обработки — это хорошо (поэтому плюс и поставил)

    😀

    другое дело что я после того как увидел первый раз Asterisk в реальной работе — стал настоящим «аппологетом» этого решения

    пример:

    1. от провайдера телефонии забирается номерная емкость по «оптоволокну»

    2. внутренняя номерная емкость компании почти не ограничена если делать все через SIP

    3. а уж Астериск занимается приземлением SIP на внешние каналы вызова и обратно

    ЗЫ это дело внедрял не я естественно, другое дело что я это видел в реальной работе.

    ЗЫЫ а вот когда стал вопрос внедрения показателей эффективности работы менеджеров и в целом CRM — тут я использовал http://asterisk-java.org/development/tutorial.html

    кстати а вот интересующимся еще ссылочка http://www.voip-info.org/wiki/view/Asterisk+FastAGI

    Reply
  7. markers

    (6) Спасибо за ссылки! Сгодится всё!

    Reply
  8. pbazeliuk

    Развивать есть куда, а обработка просто пример.

    Вот уже начальство хочет чтобы события создавались по входящему звонку, если менеджер ответил на звонок, а так же считать пропущенные звонки.

    Так же желают упрощения работы с огромной базой контрагентов, т.е. перейти с ручного ввода номера телефона — на выбор из данных контрагентаконтактного лицапрочее и совершения звонка в режиме соединения.

    Reply
  9. pbazeliuk

    Если дойдут руки постараюсь собрать такую же обработочку для работы почтой с помощью протокола imapi.

    Reply
  10. marsohod

    К ней бы еще als-файл … как в семерке … 😉

    Reply
  11. kroko

    Обработка заставила задуматься в этом направлении 😀

    Еще бы к dll немного расширения функционала и было бы в обще шикарно, а именно хотелось бы увидеть в Массиве с текущим значением хинтов не только 3 значения но и еще к примеру не плохо было б иметь такой пункт как «Display Name» к примеру.

    Reply
  12. sound

    Тогда бы уж и исходники dll-ки заиметь, да колбасить чо кому надо 🙂

    Reply
  13. markers

    (12)

    Тем-более беглый осмотр DLL показал что она написана на Delphi, а его я знаю на среднем уровне (хотя уже и подзабыл)

    Reply
  14. rahimov1965

    Есть ли возможность у компоненты определять номер входящего звонка?

    Reply
  15. pbazeliuk

    Вопрос не ко мне, а к разработчику компоненты, мы от нее отказались. Написали свой веб интерфейс с возможностью подщета стоимости звонков менеджеров, в зависимости времени суток и оператора с учетом бесплатных минутскидок.

    Reply
  16. sps786

    Выявлена проблема ❗ с asterisk.dll, при оригинации звонка в логах астериска пишется, что звонок произведен с некого другого экстеншена (наобум), что не позволяет построить правильные отчеты по исходящим вызовам 😥

    Reply
  17. Shum23str
    Baza пишет:

    Вот уже начальство хочет чтобы события создавались по входящему звонку, если менеджер ответил на звонок, а так же считать пропущенные звонки.

    Реализовали?

    Reply
  18. pbazeliuk

    (17)

    Проект телефонии на платформе 8.1 уже устарел и дорабатываться не будет, нюансов очень много да и сырой продукт внедрять не собираемся. В данный момент переходим на УТ 11, возможно некоторые проекты (для управляемого приложения) выпустим на продажу, такие как: работа с почтой(по протоколу IMAP), учет серийных номеров в разрезе номенклатуры, характеристик, складов, организаций с контролем логических цепочек движений, телефонию развивать начнем примерно только с лета.

    Reply
  19. pbazeliuk

    Да и планируем браться только за автоматизацию предприятий численностью от 50-100 человек.

    Reply
  20. Alex141516

    А подскажите — обработка запускается, коннектится. Но звонок сделать не получается. Пробовал разные контексты и каналы указывать — безрезультатно. Табличное поле на секунду «мигает» (появляются и исчезают несколько пустых строк) и все … В логах астерикса про попытку позвонить ничего нет. Куда копать?

    Reply
  21. vas5781
    Alex141516 пишет:

    А подскажите — обработка запускается, коннектится. Но звонок сделать не получается. Пробовал разные контексты и каналы указывать — безрезультатно. Табличное поле на секунду «мигает» (появляются и исчезают несколько пустых строк) и все … В логах астерикса про попытку позвонить ничего нет. Куда копать?

    Результат = Астериск.Открыть(«192.168.111.111», 5038, «user», «pass»); сюда копай, но и на самом сервере настройки смотри

    Reply
  22. vas5780

    Добрый день,

    хочется задать вопрос автору обработки, а есть ли в данной обработки и у данной .dll использование CallerID?

    Reply
  23. g00dtlt

    вопрос автору, есть ли шанс сделать ВК 77 совместимой ?

    очень интересно

    Reply
  24. vas5780

    Всё работает, проверено.

    Reply
  25. 1C82

    Не написано: что обновили ?

    Reply
  26. oleg.rizvanov
    g00dtlt пишет:

    вопрос автору, есть ли шанс сделать ВК 77 совместимой ?

    очень интересно

    Для 7.7 есть более простой способ, причем совершенно бесплатный. Думаю, вам стоит прочитать статью «1С+Asterisk. Пример интеграции». К статье приатачена конфигурация под 7.7 в качестве пример. ИМХО, как раз то, что вам нужно 🙂

    Reply
  27. pbazeliuk

    Добрый вечер, была добавлена ссылка: http://voip.rus.net/tiki-index.php?page=Asterisk+AGI, которая намного упрощает интеграцию с 1С.

    Reply
  28. jorikfon

    Коллеги, возможно вас заинтересует наше решение для интеграции 1С и Asterisk.

    Компонент сертифицирован на 1С:Совместимо, есть документация, реализованы все функции AMI интерфейса Asterisk.

    Reply
  29. zekrus

    Подскажите, а что делать если источник внешней библиотеки (ссылка) не отвечает?

    Reply
  30. oleg.rizvanov

    (29) zekrus,

    Рад помочь, но к сожалению, я не совсем понял вопрос, вернее совсем не понял.

    Не могли бы вы его переформулировать?

    Reply
  31. zekrus

    (30) oleg.rizvanov, http://www.buligin.com/ejauja.html Not Found

    The requested URL /ejauja.html was not found on this server.

    Reply
  32. oleg.rizvanov

    (31) zekrus,

    Попробуйте вот это: http://infostart.ru/public/125719/

    Reply
  33. zekrus

    (32) oleg.rizvanov, там используется AddIn.ROM-Asterisk-Lite, а не AddIn.asterisk!

    Reply
  34. oleg.rizvanov

    (33) zekrus,

    Перейдите на полнофункциональную версию, она тоже бесплатна.

    Reply
  35. zekrus

    (34) oleg.rizvanov, Хотелось бы увидеть более подробное описание текстовой команды по получению истории звонков (verbose).

    Reply
  36. Rustig

    (0) добрый день. где скачать внешнюю компоненту asterisk.dll?

    вот в этой статье не она ли случайно (под другим названием) http://infostart.ru/public/81261/ ?

    Reply
  37. pbazeliuk

    (36) Rustig, добрый день, возможно и она.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *