Jump to content

Дата и время последнего ответа клиента в Обращениях в 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);

 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...