Тарас 0 Report post Posted February 14, 2018 Доброго времени суток. Только начал знакомиться с замечательным произведением программерского исскусства - SuiteCRM. Приходится работать с уже готовыми системами, опыта мало. Вопрос: Есть список звонков. Есть колонка - продолжительность разговора. У клиента в заголовке колонки указано время продолжительности в секундах. Но в строках эти значения уже в минутах. Список звонков - это стандартный модуль Calls. Есть менее стандартный модуль Asterisk, со своим скриптом asteriskLogger.php. В этом Логгере ведется вычисление продолжительности разговора. Далее совсем мне непонятным способом эти значения продолжительности попадают в журнал звонков и выводятся на экран монитора. Вопрос к опытным специалистам - какова цепочка передачи данных продолжительности звонка в список звонков? Чтобы отследить ошибку и установить верное значение продолжительности уже в секундах, как и положено. Спасибо. Quote Share this post Link to post Share on other sites
SpravkaCRM.ru 19 Report post Posted February 14, 2018 Добрый день! Буквально на той неделе был клиент с секундами в логах. Правда разговоры были тоже секундными. Даже добавляли поле с длительностью в секундах. Сейчас специалист по Астериску подойдет может ))) расскажет поточнее.... Quote Share this post Link to post Share on other sites
Тарас 0 Report post Posted February 14, 2018 В модуле Calls уже есть поле для секунд. Как из него вытащить данные на html - в этом паззл. Quote Share this post Link to post Share on other sites
iwealth 0 Report post Posted February 14, 2018 Здравствуйте. В файле asteriskLogger.php есть два места где происходит рассчёт времени разговора. В моей версии это переменная $callDurationRaw = 0; // call duration in seconds, only matters if timestampLink != NULL Строка 572. В этой переменной содержится время разговора в секундах. Т.е. из $callDurationRaw получили $callDurationHours и $callDurationMinutes и записываем в звонок. Далее по коду, как оно преобразуется в часы-минуты и записывается в звонок: // Recalculate call direction in minutes $callDuration = (int) ($callDurationRaw / 60); $callDurationHours = (int) ($callDuration / 60); //$callDurationMinutes = ceil($callDuration / 60); //voor afronden naar boven. $callDurationMinutes = ($callDuration % 60); $soapResult = $soapClient->call('set_entry', array( 'session' => $soapSessionId, 'module_name' => 'Calls', 'name_value_list' => array( array( 'name' => 'id', 'value' => $callRecord['sweet']['id'] ), array( 'name' => 'name', 'value' => $callName ), array( 'name' => 'duration_hours', 'value' => $callDurationHours ), array( 'name' => 'duration_minutes', 'value' => $callDurationMinutes ), Загвоздка в том что стандартное поле с продолжительностью звонка в модуле Звонки - это выпадающий список в интервалом в 15 минут. Необходимо найти этот список с интервалами и исправить его на список с интервалом в минуту, для более точного отображения. У меня он называется duration_intervals (у Вас скорее всего так же) Я это тсписок переписал в файле custom/include/language/ru_RU.lang.php $GLOBALS['app_list_strings']['duration_intervals']=array ( '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', Или как я делал: создавал новое поле в модуле Звонков и записывал время в секундах в него, дописав это поле в файле asteriskLogger.php в массив который я указал выше. Т.е. запись данных по продолжительности звонка происходит в asteriskLogger.php в 2-х местах, они практически идентичны. Если то что я перечислил выше у Вас уже реализовано тем или иным способом, то по крайней мере я описал место где этот процесс происходит, проверяйте переменную $callDurationRaw и преобразование её значения в часы-минуты. Quote Share this post Link to post Share on other sites
iwealth 0 Report post Posted February 14, 2018 Да, забыл указать второе место - строка 758, но всё легко находится по названию переменной $callDurationRaw Quote Share this post Link to post Share on other sites
SpravkaCRM.ru 19 Report post Posted February 14, 2018 13 минуты назад, iwealth сказал: Загвоздка в том что стандартное поле с продолжительностью звонка в модуле Звонки - это выпадающий список в интервалом в 15 минут. Необходимо найти этот список с интервалами и исправить его на список с интервалом в минуту, для более точного отображения. Интересно, тайм-линия в звонках от таких преобразований не ломается? там же заточено на 15 минут... Quote Share this post Link to post Share on other sites
iwealth 0 Report post Posted February 14, 2018 16 минут назад, SpravkaCRM.ru сказал: Интересно, тайм-линия в звонках от таких преобразований не ломается? там же заточено на 15 минут... В хелпе модуля астериска для CRM описан этот момент. http://github.com/blak3r/yaai/wiki/User-Manual#Step_6_Optional_Call_Durations Quote Share this post Link to post Share on other sites
Тарас 0 Report post Posted February 15, 2018 Копнул чуть глубжее : - в студии в модули Calls поле все-таки есть, зовется talk_time_c - некто до меня в "макете списка" модуля Calls разместил поле продолжительности в минутах, но назвал "в секундах", замена на правильное поле (talk_time_c) показала интересный результат - колонка продолжительности исчезла. Т.е. стандартное поле "продолжительность в минутах" на странице списка есть, кастомное уже не хочет. Становится понятно решение одного неизвестного предшественника просто переименовать рабочую колонку (поле) из минут в секунды и разместить её. Вопрос первый - как установить причину такого поведения? Далее. В asteriskLogger.php переменные длительности уже прописаны, аналогично примеру из ответа выше. // Recalculate call direction in minutes $callDuration = (int) ($callDurationRaw / 60); $callDurationHours = (int) ($callDuration / 60); //$callDurationMinutes = ceil($callDuration / 60); //voor afronden naar boven. $callDurationMinutes = ($callDuration % 60); Вопрос второй. Просьба от совсем новичка в SuiteCRM по буквам описать цепочку - как из asteriskLogger.php значения переменных "duration" оказываются в БазеДанных. Есть подозрение, что где-то по дороге есть ошибка. Поскольку значения в секундах в БД, talk_time_c модуля Calls, у многих записей ошибочные или просто пустые. Спасибо. Quote Share this post Link to post Share on other sites
iwealth 0 Report post Posted February 15, 2018 2 часа назад, Тарас сказал: Копнул чуть глубжее : - в студии в модули Calls поле все-таки есть, зовется talk_time_c - некто до меня в "макете списка" модуля Calls разместил поле продолжительности в минутах, но назвал "в секундах", замена на правильное поле (talk_time_c) показала интересный результат - колонка продолжительности исчезла. Т.е. стандартное поле "продолжительность в минутах" на странице списка есть, кастомное уже не хочет. Становится понятно решение одного неизвестного предшественника просто переименовать рабочую колонку (поле) из минут в секунды и разместить её. Вопрос первый - как установить причину такого поведения? Если я правильно понял ваши действия, то вы в студии добавили в список звонков кастомное поле, но в модуле в списке это поле не появилось. Предполагаю, что это поле находится в скрытых полях списка. Вот скрин http://yadi.sk/i/q_KtzajD3SRdMh Если же этого поля нет и в скрытых, тогда вам надо смотреть файл custom/modules/Calls/metadata/listviewdefs.php, там искать это поле, если его нет, то добавлять аналогично существующим (и после добавления если не появится проверить в скрытых) 2 часа назад, Тарас сказал: Далее. В asteriskLogger.php переменные длительности уже прописаны, аналогично примеру из ответа выше. // Recalculate call direction in minutes $callDuration = (int) ($callDurationRaw / 60); $callDurationHours = (int) ($callDuration / 60); //$callDurationMinutes = ceil($callDuration / 60); //voor afronden naar boven. $callDurationMinutes = ($callDuration % 60); Вопрос второй. Просьба от совсем новичка в SuiteCRM по буквам описать цепочку - как из asteriskLogger.php значения переменных "duration" оказываются в БазеДанных. Есть подозрение, что где-то по дороге есть ошибка. Поскольку значения в секундах в БД, talk_time_c модуля Calls, у многих записей ошибочные или просто пустые. Как из asteriskLogger.php попадет в БД CRM я написал в предыдущем сообщении. В этом файле есть функция $soapClient->call в ней происходит сохранение звонка с параметрами. Вам же надо посмотреть в этой функции наличие кастомного поля talk_time_c и посмотреть что именно передаётся в это поле. Quote Share this post Link to post Share on other sites
Тарас 0 Report post Posted February 15, 2018 Таки появилась колонка длительности разговора, в секундах, как и ожидал. Сама, спустя какое-то время. Кеш, наверное. Правда количество секунд отличается от длительности звуковых файлов. И теперь забавное: $soapResult = $soapClient->call('set_entry', array( Подобный текст в файле встречается несколько раз, в разных вариациях. И всегда в комментариях. Буду искать его в других файлах, может перенесли куда. Или есть другой способ передачи этих данных в БД? Quote Share this post Link to post Share on other sites
SpravkaCRM.ru 19 Report post Posted February 15, 2018 На сколько я помню там где то в конфиге можно определить способ обращения к БД SuiteCRM: напрямую, или через SOAP. В логгере. Там прям сверху где то было. Quote Share this post Link to post Share on other sites