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

iwealth

Сотрудники
  • Content Count

    7
  • Joined

  • Last visited

Community Reputation

0 Neutral

About iwealth

  • Rank
    Newbie

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Если я правильно понял ваши действия, то вы в студии добавили в список звонков кастомное поле, но в модуле в списке это поле не появилось. Предполагаю, что это поле находится в скрытых полях списка. Вот скрин https://yadi.sk/i/q_KtzajD3SRdMh Если же этого поля нет и в скрытых, тогда вам надо смотреть файл custom/modules/Calls/metadata/listviewdefs.php, там искать это поле, если его нет, то добавлять аналогично существующим (и после добавления если не появится проверить в скрытых) Как из asteriskLogger.php попадет в БД CRM я написал в предыдущем сообщении. В этом файле есть функция $soapClient->call в ней происходит сохранение звонка с параметрами. Вам же надо посмотреть в этой функции наличие кастомного поля talk_time_c и посмотреть что именно передаётся в это поле.
  2. В хелпе модуля астериска для CRM описан этот момент. https://github.com/blak3r/yaai/wiki/User-Manual#Step_6_Optional_Call_Durations
  3. Да, забыл указать второе место - строка 758, но всё легко находится по названию переменной $callDurationRaw
  4. Здравствуйте. В файле 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 и преобразование её значения в часы-минуты.
  5. Иногда возникает ситуация когда необходимо отключить "сохранение" данных в полях фильтра (в полях поиска). Т.е., например, в модуле Leads отфильтровали по полю name и теперь возвращаясь этот модуль, поле name в фильтре будет заполнено значением, которое искали, иногда это бывает неудобно. Чтоб отключить данный функционал идём в файл: modules/MySettings/StoreQuery.php и в самом конце файла находим метод getStoredQueryForUser. public static function getStoredQueryForUser($module) { global $current_user; return $current_user->getPreference($module . 'Q'); } Меняем на: public static function getStoredQueryForUser($module) { global $current_user; // return $current_user->getPreference($module.'Q'); return array(); } В данном случае я закоментировал возврат получаемых данных из таблицы user_preferences, которые отвечают за то что отобразится в фильтре и вместо этого возвращаю пустой массив, т.к. исходные данные возвращаются в виде массива. При таких изменениях коде: Пока мы находимся на странице модуля, то фильтр будет хранить выбранные варианты, т.е. будет работать пагинация и не сбрасывать значения фильтров, так же обновление страницы по нажатию клавиши F5 не сбрасывает значения фильтров. При этом, если покинуть страницу с текущим модулем, перейдя на другую, а потом вернуться, то ранее введённые в фильтр данные сбросятся.
  6. В ходе разработки системы появилась не обходимость сделать логику, кторую не получится реализовать стандартным функционалом ролей. В данном случае было необходимо, чтоб контрагентов со статусом "архив" видели только администраторы системы. Для реализации данной логики нам понадобится файл modules/Accounts/Account.php Ищем в нём метод create_new_list_query, если не находим то создаём. В ней мы ограничиваем доступ к записям в listview модуля Контрагенты. Фактически дописываем допольнительное условие в запрос по которому строится список в listview. function create_new_list_query($order_by, $where,$filter=array(),$params=array(), $show_deleted = 0,$join_type='', $return_array = false,$parentbean=null, $singleSelect = false) { global $current_user; $ret_array = parent::create_new_list_query($order_by, $where, $filter, $params, $show_deleted, $join_type, $return_array, $parentbean, $singleSelect); //если текущий пользовательне админ, то запрещам просмотр записей со статусом "в архиве" if(!$current_user->is_admin){ $ret_array['where'] .= " AND accounts.contact_status <> 'archive'"; } if($return_array) { return $ret_array; } return $ret_array['select'] . $ret_array['from'] . $ret_array['where']. $ret_array['order_by']; } Далее нам необходимо ограничить доступ для просмотра и редактирования архивных контрагентов. Для этого воспользуемся методом ACLAccess (так же ищем и дописываем код или создаём) Здесь для редактирования, просмотра и удаления доступ запрещён. А сохранение закомментировано, для того чтоб обычный пользователь имел возможность поменять статус контрагента с какого-то значения на "архив" и сохранить. function ACLAccess($view, $is_owner='not_set', $in_group='not_set'){ global $current_user; $view = strtolower($view); switch($view){ case 'edit': case 'detail': // case 'save': case 'editview': case 'delete': if(!empty($this->contact_status) && $this->contact_status == "archive" && !$current_user->is_admin){ return false; } } return parent::ACLAccess($view,$is_owner,$in_group); }
  7. В процессе разработки столкнулся с проблемой: независимо от того какие значения стоят в полях "Дата начала" и "Дата выполнения" в модуле "Задачи", в календаре такая задача отображается размером в 2 часа. При этом звонки и встречи отображаются нормально. Путём сравнения модулей удалось выяснить, что в звонках и встречах есть поля duration_hours и duration_minutes по которым строится отображение данных в календаре. Я предположил, что необходимо найти место где формируются данные для календаря и высчитывать эти значения там. В файле modules/Calendar/Calendar.php ищем строки "Tasks" => array("showCompleted" => true,"start" => "date_due", "end" => "date_due"), заменяем на "Tasks" => array("showCompleted" => true,"start" => "date_start", "end" => "date_due"), В этом же файле ещё ищем: if (isset($act->sugar_bean->duration_hours)) { $item['duration_hours'] = $act->sugar_bean->duration_hours; $item['duration_minutes'] = $act->sugar_bean->duration_minutes; } и заменяем на $cstm_mod = array('Opportunities', 'Tasks'); //модули в которых необходимо высчитывать duration_hours и duration_minutes if ( in_array($act->sugar_bean->module_dir, $cstm_mod) ) { //для "особенных" модулей считаем if (isset($act->sugar_bean->date_start) && isset($act->sugar_bean->date_due)) { $datetime1 = new DateTime($act->sugar_bean->date_start); //дата начала $datetime2 = new DateTime($act->sugar_bean->date_due); //дата окончания $interval = $datetime1->diff($datetime2); $item['duration_hours'] = $interval->format('%H'); $item['duration_minutes'] = $interval->format('%I'); } } else { //для обычных модулей берём существующие значения if (isset($act->sugar_bean->duration_hours)) { $item['duration_hours'] = $act->sugar_bean->duration_hours; $item['duration_minutes'] = $act->sugar_bean->duration_minutes; } } А так же в файле modules/Calendar/CalendarUtils.php в методе get_time_data комментируем строки: if($bean->object_name == 'Task') $start_field = $end_field = "date_due"; В результате получаем, что задача отображется в календаре начиная со времени начала и длится до времени окончания.
×
×
  • Create New...