Jump to content
SpravkaCRM.ru - Ваш справочник по CRM

All Activity

This stream auto-updates     

  1. Today
  2. Last week
  3. Spravka, спасибо большое. Будем пробовать и т.д. По оконачнии, постараюсь не забыть написать итог. Спасибо, еще раз.
  4. Earlier
  5. На сколько я помню там где то в конфиге можно определить способ обращения к БД SuiteCRM: напрямую, или через SOAP. В логгере. Там прям сверху где то было.
  6. Таки появилась колонка длительности разговора, в секундах, как и ожидал. Сама, спустя какое-то время. Кеш, наверное. Правда количество секунд отличается от длительности звуковых файлов. И теперь забавное: $soapResult = $soapClient->call('set_entry', array( Подобный текст в файле встречается несколько раз, в разных вариациях. И всегда в комментариях. Буду искать его в других файлах, может перенесли куда. Или есть другой способ передачи этих данных в БД?
  7. Если я правильно понял ваши действия, то вы в студии добавили в список звонков кастомное поле, но в модуле в списке это поле не появилось. Предполагаю, что это поле находится в скрытых полях списка. Вот скрин https://yadi.sk/i/q_KtzajD3SRdMh Если же этого поля нет и в скрытых, тогда вам надо смотреть файл custom/modules/Calls/metadata/listviewdefs.php, там искать это поле, если его нет, то добавлять аналогично существующим (и после добавления если не появится проверить в скрытых) Как из asteriskLogger.php попадет в БД CRM я написал в предыдущем сообщении. В этом файле есть функция $soapClient->call в ней происходит сохранение звонка с параметрами. Вам же надо посмотреть в этой функции наличие кастомного поля talk_time_c и посмотреть что именно передаётся в это поле.
  8. Копнул чуть глубжее : - в студии в модули 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, у многих записей ошибочные или просто пустые. Спасибо.
  9. Хочу разместить тут одну из вариаций решения задачи: При добавлении нового Контрагента, если заполнено поле "ИНН", надо определить, нет ли в базе уже существующего Контрагента с таким же ИНН. И если есть - не дать сохранить выведя соответствующую надпись о этом. Реализация сделана на странице добавления новой записи в модуле Accounts. Если в вкратце, то алгоритм следующий: Добавляем на страницу создания/редактирования карточки Accounts произвольный js-файл В этом js-файле для кнопки "Сохранить" прописываем свой обработчик. Когда пользователь нажимает кнопку "Сохранить" обработчик получает введенное значение из поля "ИНН", и отправляет AJAX-запрос на сервер с этим ИНН, чтобы проверить его в базе. Если ИНН в базе найден, то подсвечиваем красным поле с ИНН и пишем о том, что введенное значение не уникально Если ИНН не найден, то продолжаем стандартное сохранение карточки. Теперь давайте более предметно посмотрим, как это работает. В meta-файле, описывающем editview для Account custom/modules/Accounts/metadata/editviewdefs.php, добавляем блок, который подключит js-файл: <?php $viewdefs ['Accounts'] = array ( 'EditView' => array ( 'templateMeta' => array ( 'form' => array ( 'enctype' => 'multipart/form-data', 'buttons' => array ( 0 => 'SAVE', 1 => 'CANCEL', ), ), 'maxColumns' => '2', 'widths' => array ( 0 => array ( 'label' => '10', 'field' => '30', ), 1 => array ( 'label' => '10', 'field' => '30', ), ), 'includes' => array ( 1 => array ( 'file' => 'modules/Accounts/Account.js', ), 2 => array ( 'file' => 'modules/Accounts/edit.view.js', ), ), ), Это лишь кусок файла с мета-данными. Непосредственно наша вставка, это: 2 => array ( 'file' => 'modules/Accounts/edit.view.js', ), Таким образом нам надо добавить пустой файл modules/Accounts/edit.view.js, и заполнить его примерно так: $(document).ready(function(){ // Ставим для кнопки Сохранения свой обработчик $('#EditView').find('input[type=submit][id=saveButton]').click(function(){ // Ставим действие после срабатывания формы $('#EditView').find('input[type=hidden][name=action]').val('Save'); var checkForm = check_form('EditView'); if($('#inn').val() != '') { // Проверям на уникальность ИНН $.ajax({ url: "index.php", type: "POST", data: { module: 'Accounts', action: 'checkINN', record: $('#EditView').find('input[name=record]').val(), inn: $('#inn').val(), to_pdf: true } }).done(function(responce) { // Обработка полученных данных var accounts = jQuery.parseJSON(responce); if(accounts.length > 0) { // Найдены дубликаты var list = ''; for(var i = 0; i < accounts.length; i++) { list += '<li><A href="index.php?module=Accounts&action=DetailView&record='+accounts[i]['id']+'" style="color: red;" target="_blank">'+accounts[i]['name']+'</A></li>'; } list = '<B>Найдены дубликаты по ИНН</B>:<BR>' + list; if(isAccessDoubleINN) { list += '<BR>Если желаете все равно сохранить Контрагента с текущим ИНН нажмите кнопку: <button class="button" onclick="if(check_form(\'EditView\')){$(\'#EditView\').submit();}">Пропустить</button>'; } add_error_style('EditView','inn', list); } else { // Дубликатов по ИНН нет, можем прождолжать // Стандартная проверка остальных полей if(checkForm) { $('#EditView').submit(); } } }); } else { if(checkForm) { $('#EditView').submit(); } } return false; }); // Удаляем уже ранее установленный обработчик $('#EditView').find('input[type=submit][id=saveButton]').removeAttr("onclick"); }); Здесь в блоке $.ajax({ url: "index.php", type: "POST", data: { module: 'Accounts', action: 'checkINN', record: $('#EditView').find('input[name=record]').val(), inn: $('#inn').val(), to_pdf: true } }) как раз и происходит AJAX-запрос к серверу на проверку уникальности введенного значения. Запрос происходит к action=checkINN. Нам надо добавить php-файл с таким названием по адресу modules/Accounts/checkINN.php: <?php if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); /** * Created by JetBrains PhpStorm. * User: Evgen * Date: 22.08.13 * Time: 12:57 * To change this template use File | Settings | File Templates. */ global $db; $sql = " SELECT `id`, `name` FROM `accounts` WHERE `inn` = '".$_REQUEST["inn"]."' AND `deleted` = 0 "; if(isset($_REQUEST['record']) AND $_REQUEST['record'] != '') { $sql .= " AND `id` != '".$_REQUEST["record"]."' "; } $result = $db->query($sql, true); $return_array = array(); while($row = $db->fetchByAssoc($result)) { $return_array[] = $row; } $json = new JSON(); echo $json->encode($return_array); Вот и все! Проверка на уникальность готова.
  10. В хелпе модуля астериска для CRM описан этот момент. https://github.com/blak3r/yaai/wiki/User-Manual#Step_6_Optional_Call_Durations
  11. Интересно, тайм-линия в звонках от таких преобразований не ломается? там же заточено на 15 минут...
  12. Да, забыл указать второе место - строка 758, но всё легко находится по названию переменной $callDurationRaw
  13. Здравствуйте. В файле 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 и преобразование её значения в часы-минуты.
  14. В модуле Calls уже есть поле для секунд. Как из него вытащить данные на html - в этом паззл.
  15. Добрый день! Буквально на той неделе был клиент с секундами в логах. Правда разговоры были тоже секундными. Даже добавляли поле с длительностью в секундах. Сейчас специалист по Астериску подойдет может ))) расскажет поточнее....
  16. Доброго времени суток. Только начал знакомиться с замечательным произведением программерского исскусства - SuiteCRM. Приходится работать с уже готовыми системами, опыта мало. Вопрос: Есть список звонков. Есть колонка - продолжительность разговора. У клиента в заголовке колонки указано время продолжительности в секундах. Но в строках эти значения уже в минутах. Список звонков - это стандартный модуль Calls. Есть менее стандартный модуль Asterisk, со своим скриптом asteriskLogger.php. В этом Логгере ведется вычисление продолжительности разговора. Далее совсем мне непонятным способом эти значения продолжительности попадают в журнал звонков и выводятся на экран монитора. Вопрос к опытным специалистам - какова цепочка передачи данных продолжительности звонка в список звонков? Чтобы отследить ошибку и установить верное значение продолжительности уже в секундах, как и положено. Спасибо.
  17. Spravka, спасибо за внимание и быстрый ответ. Навыки программирования имеются, буду признателен если на досуге поищете доработки, которые мы сможем просмотреть и применить. Заранее благодарен.
  18. Добрый день! да, нечто похожее делали. если вкратце на пальцах, то: добавляем JavaScript-код в карточку редактирования, который задает новую функцию проверки формы с полями ввода для кнопки "Сохранить" При нажатии кнопки "Сохранить" запускается наша функция, которая получает значение из поля "Код" и аяксом отправляет запрос на сервер с просьбой проверить уникальность. Если поле уникально, то мы запускаем стандартную проверку полей ввода (которая в итоге проверит другие поля и сохранит введенные данные) Если поле не уникально, то мы поле "Код" кидаем в функцию подсветки красным и внизу надпись что типа не уникально (в CRM есть соответствующая функция) Кнопками вы такого эффекта не добьетесь. Если есть навыки программирования, то могу на досуге поискать образцы наработок. Если навыков нет, то могу сделать на коммерческой основе. Пишите в skype: evgenjekson
  19. Доброго дня. Заранее прошу меня извинить, если такая тема уже есть, если это так, буду благодарен за ссылку. Интересует следующий момент: При создании модуля и соответственно полей внутри модуля, необходима функция автоматической проверки данных по всему реестру модуля. Например, есть у меня в карточке "Договор" поле "Код", куда пользователь должен присвоить сам какой-либо текст. И при попытке сохранения карточки, должна сработать проверка которая проверит по всем записям договоров данное поле на уникальность. Если пользователь сгенерировал уникальные данные в поле, то - ОК, Карточка сохраняется. Если же, такой код есть в другом договоре, то система должна ругаться и карточку не сохранять. В доступном функционале "Студия" при создании полей, я не вижу никакой подобной доступной функции. Также, я не вижу доступной функции в построении процессов доступных администратору. Отсюда вопрос, кто-нибудь занимался подобным кейсом? Есть ли решение по такому вопросу (PHP код или Logic Hook)? Заранее благодарен за информацию. Я использую SuiteCRM Версия 7.7.4 С уважением, Sco
  20. Предложение позитивное. Я сейчас проектирую несложную структуру для своего бизнеса. Результатами поделюсь
  21. Да, нету. Видимо в SugarCRM Pro видел... старом... получается, что так, в ручную...
  22. Да, было бы не плохо такую получить. Если найдете, дайте знать плз. Ну либо можно обсудить формирование такой схемы совместными усилиями: в диалоге по скайпу я расскажу все, что знаю по этому поводу, а вы сформируете красивые картинки.
  23. Всем привет, Действительно только править modules/Leads/metadata/convertdefs.php или все же есть какие то варианты? В предварительных контактах такого функционала не нашел Спасибо
  24. Спасибо. Проблем нет никаких, но хотелось посмотреть на решения, чтобы не изобретать велосипед =)
  25. не. это схема базы данные. интересует бизнес логика построения взаимодействия с клиентами
  26. это было конечно в мае прошлого года... но лучше поздно, чем никода, да и вдруг кому пригодиться... Прям папки сделать тоже можно, но геморно. тут всеже система с своим запрограммированным видением по сегментации. В общем надо определиться как именно можно в договоре понять к какому филиалу он принадлежит. Выпадающий список с филиалами? Еще что то? Если вы можете в поиске договоров найти договора определенного филиала, то мой способ вам поможет: Тут на сайте есть модуль: суть в том, что вы ищете все договора определенного контрагента (или по любым другим условиям), потом создаете на основе этого поискового запроса пункт в меню. И так для всех филиалов. А если поиском по договорам у вас нельзя филиалы выбирать, значит добавьте это. Создаете комбобокс с филиалами в студии и поле в виде выпадающего списчка в модуле с договорами. и в режиме редактирования договора указываете из выпадающего списка к какому филиалу принадлежит договор.
  1. Load more activity
    • Требуется программист

      CRMHosting.ru: требуется программист с опытом
      ЗП 50 000 - 90 000 рублей/месяц за 6-ти часовой рабочий день. Удаленно. С опытом работы в SuiteCRM. На полный рабочий день или по совместительству. Подробности: https://crmhosting.ru/site/vacancy/
×