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

Дата и время последнего ответа клиента в Обращениях в SuiteCRM

Recommended Posts

Всем привет!

Хочу поделиться одной доработкой, которая, на мой взгляд, немного полнее позволит понять роль модуля "Процессы" в работе с 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` - это будет как раз наш случай, и мы должны будем обновить поле в родительском Обращении.

Вот скрин этого Бизнес-процесса:

2018-05-28_12-56-03.thumb.png.c67234a2405b9bf5ea773ab66ead6775.png

Испытания показали, что данный механизм успешно работает.

И небольшой бонус: То, что мы выше создали, будет исправно фиксировать дату последнего ответа для всех обращений, по которым клиенты только ответят с момента привнесения этого функционала. Далее я приведу листинг скрипта, который можно единоразово запустить в 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);

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×