SpravkaCRM.ru 19 Posted May 28, 2018 Report Share Posted May 28, 2018 Всем привет! Хочу поделиться одной доработкой, которая, на мой взгляд, немного полнее позволит понять роль модуля "Процессы" в работе с CRM-системой, и что не обязательно все на свете дописывать: можно еще и активно пользоваться встроенными средствами. Итак! Задача: в Обращениях выводить время последнего сообщения от Клиента. При этом выводить не только в карточке, но и в списках, отчетах и вообще везде, где заблагорассудится. Вот если задача была вывести только в карточке обращения, я наверное бы особо не заморачивался, и добавил расчётное поле source="non-db", в котором "на лету" определял последнее сообщение и подставлял его дату. Но тут задача получить универсальное поле. По этому решено было добавить полноценное поле в модуль "Обращения" (с хранением значения в базе данных) и заполнять его соответствующим значением. Добавляем поле (создаем файл custom/Extension/modules/Cases/Ext/Vardefs/last_reply_date.php): <?php $dictionary['Case']['fields']['last_reply_date'] = array ( 'name' => 'last_reply_date', 'vname' => 'LBL_LAST_REPLY_DATE', 'type' => 'datetimecombo', 'massupdate' => 0, 'no_default' => false, 'comments' => '', 'help' => '', 'importable' => 'true', 'duplicate_merge' => 'disabled', 'duplicate_merge_dom_value' => '0', 'audited' => false, 'inline_edit' => true, 'reportable' => true, 'unified_search' => false, 'merge_filter' => 'disabled', 'size' => '20', 'enable_range_search' => false, 'dbType' => 'datetime', ); Добавляем локализацию для поля (custom/Extension/modules/Cases/Ext/Language/ru_RU.last_reply_date.php): <?php $mod_strings['LBL_LAST_REPLY_DATE'] = 'Последний ответ'; После выполнения быстрого восстановления в админке это поле появляется в списке полей модуля Обращения, и вы можете его использовать при формировании макетов. Далее наша задача это поле корректно заполнить. По задаче нам надо туда добавлять дату последного ответа клиента. Модуль с перепиской по Обращениям называется AOP_Case_Updates и в моей локализации по русски он звучит как "Обновления обращения". Чтобы выполнить нашу задачу нам надо при создании новой записи в этом модуле обновлять поле last_reply_date в записи родительского Обращения. Но так как в модуль "Обновления обращения" добавляются ответы как Клиента, так и сотрудника, ведущего переписку по Обращению, то нам надо определять дату только тогда, когда ответил клиент. Лично я определяю записи от клиентов отсутствием значения в поле `assigned_user_id` (если вы определяете это как то по другому, то пишите в комментариях, интересно будет узнать). Таким образом нам достаточно создать Бизнес-процесс, который будет привязан к модулю "Обновления обращения". В момент, когда будет создаваться новая запись, и в ней будет пусто поле `assigned_user_id` - это будет как раз наш случай, и мы должны будем обновить поле в родительском Обращении. Вот скрин этого Бизнес-процесса: Испытания показали, что данный механизм успешно работает. И небольшой бонус: То, что мы выше создали, будет исправно фиксировать дату последнего ответа для всех обращений, по которым клиенты только ответят с момента привнесения этого функционала. Далее я приведу листинг скрипта, который можно единоразово запустить в CRM-системе, и он найдет все Обращения, найдет все последние ответы клиентов по ним, и запишет дату: <?php if(!defined('sugarEntry'))define('sugarEntry', true); /** * Created by PhpStorm. * User: crmhosting * Date: 25.04.2018 * Time: 9:32 */ require_once('include/entryPoint.php'); global $db; // Получаем список Обращений $sql = " SELECT `cases`.`id` FROM `cases` WHERE `cases`.`deleted` = 0 "; $result = $db->query($sql, true); $counter = 0; while ($row = $db->fetchByAssoc($result)) { $counter++; // Получаем последнее сообщение, полученное от клиента $sql = " SELECT `date_entered` FROM `aop_case_updates` WHERE `deleted` = 0 AND `case_id` = '".$row['id']."' AND (`assigned_user_id` IS NULL OR `assigned_user_id` = '') ORDER BY `date_entered` DESC LIMIT 1 "; $date = $db->getOne($sql, true); if(!empty($date)) { // Если есть дата $sql = "UPDATE `cases` SET `last_reply_date` = '".$date."' WHERE `id` = '".$row['id']."'"; $db->query($sql, true); } } print_array("Всего записей звонков: " . $counter); Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.