Коммуникационная панель

Основы

Коммуникационная панель — инструмент ведения коммуникаций с клиентами и коллегами, а также получения уведомлений в Creatio. Отображается в правой части экрана.

Структура коммуникационной панели 

Вкладки коммуникационной панели:

  • [ Единое окно оператора ] ([ Operation single window ]) — проведение менеджером банка консультаций клиенту. Вкладка доступна в продукте Financial Services Creatio, customer journey edition. Позволяет воспользоваться различными критериями для поиска клиента банка, начать проведение консультации, отложить консультацию.
  • [ Звонки ] ([ CTI panel ]) — прием входящих и выполнение исходящих звонков непосредственно в приложении. Один из инструментов телефонии в Creatio. Подробнее о телефонии читайте в блоке статей Коннекторы к телефонии и статье Работа со звонками.
  • [ Email ] — отправка и получение email-сообщений. Позволяет связывать email-сообщения с другими объектами приложения. Подробнее об управлении почтой читайте в статье Работа с почтой.
  • [ Лента ] ([ Feed ]) — отображение сообщений раздела [ Лента ] ([ Лента ]). Позволяет просматривать сообщения тех каналов, на которые вы подписаны, а также добавлять новые сообщений и комментарии. Функциональность вкладки аналогична функциональности раздела [ Лента ] ([ Feed ]).
  • [ Центр уведомлений ] ([ Notification center ]) — отображает уведомления о различных событиях в приложении. Подробнее об управлении уведомлениями читайте в статье Работа с уведомлениями.
  • [ Задачи по бизнес-процессам ] ([ Business process tasks ]) — отображает невыполненные шаги по запущенным бизнес-процессам. Подробнее об управлении запущенными бизнес-процессами читайте в статье Работа с уведомлениями.

Контейнеры коммуникационной панели 

Элементы пользовательского интерфейса приложения, которые относятся к коммуникационной панели, размещены в соответствующих контейнерах. Контейнеры коммуникационной панели конфигурируются в базовой схеме CommunicationPanel пакета UIv2. Вкладка [ Звонки ] ([ CTI panel ]) конфигурируется в дочерней схеме CtiPanel пакета CTIBase.

На заметку. В приложении используются мета-имена html-контейнеров. На основании мета-имен приложение формирует фактические идентификаторы соответствующих html-элементов коммуникационной панели.

Основные контейнеры коммуникационной панели представлены на рисунке ниже.

  • Контейнер кнопок коммуникационной панели (CommunicationPanelContainer) — содержит кнопки, которые позволяют открыть вкладки коммуникационной панели.
  • Контейнер вкладок коммуникационной панели (rightPanel) — содержит контент текущей вкладки коммуникационной панели.

Создать пользовательское напоминание или уведомление 

Варианты отображения уведомлений, которые позволяет настроить Creatio:

  • Мгновенно.
  • В указанное время.

Чтобы создать пользовательское напоминание или уведомление:

  1. Реализуйте текст и окно для напоминания.

    Создайте схему типа [ Исходный код ] ([ Source code ]). Для этого воспользуйтесь инструкцией, которая приведена в статье Исходный код (C#).

    1. Создайте класс для формирования текста и окна напоминания.
    2. В классе реализуйте интерфейс IRemindingTextFormer схемы IRemindingTextFormer пакета Base.
  2. Реализуйте логику отправки напоминания.

    1. Создайте замещающий объект, по которому планируется отправлять напоминание. Для этого воспользуйтесь инструкцией, которая приведена в статье Объект.
    2. Создайте событие объекта. Для этого перейдите в узел [ События ] ([ Events ]) и в блоке [ Добавление ] ([ Adding ]) установите признак [ После добавления записи ] ([ After record added ]).

    3. В схеме объекта настройте параметр процесса, который генерирует напоминание.

      1. Добавьте параметр.

        1. На панели свойств перейдите на вкладку [ Параметры ] ([ Parameters ]) и нажмите [ Добавить параметр ] —> [ Логическое ] ([ Add parameter ] —> [ Boolean ]).

        2. В дизайнере объекта заполните свойства параметра.
      2. Переопределите методы.

        • Переопределите метод, который вызывается после сохранения объекта. Для этого на панели свойств перейдите на вкладку [ Методы ] ([ Methods ]) и добавьте исходный код переопределенного метода.

          Способы отображения напоминания:

          • Вкладка напоминаний центра уведомлений. В этом случае константе remindingConfig.NotificationTypeId присвойте значение RemindingConsts.NotificationTypeRemindingId.
          • Вкладка служебных сообщений центра уведомлений. В этом случае константе remindingConfig.NotificationTypeId присвойте значение RemindingConsts.NotificationTypeNotificationId.
        • Переопределите метод, который вызывается перед сохранением объекта. Для этого на панели свойств перейдите на вкладку [ Методы ] ([ Methods ]) и добавьте исходный код переопределенного метода.
  3. Реализуйте отображение напоминания.

    Создайте замещающую модель представления. Для этого воспользуйтесь инструкцией, которая приведена в статье Клиентский модуль. В качестве родительского объекта выберите ReminderNotificationsSchema.

Создать обращение по сообщению из внутренней ленты другого обращения
Сложный

Пример реализован для продуктов линейки Service Creatio.

Пример. На вкладку [ Обработка ] ([ Processing ]) страницы обращения добавить всплывающую кнопку. Кнопка отображается при выделении текста в сообщениях c почты и портала самообслуживания, отправленных с внутренней ленты обращения. При нажатии на кнопку создается новое обращение. Поля [ Тема ] ([ Subject ]) и [ Описание ] ([ Description ]) заполняются автоматически. Значения полей — выделенный текст.

Создать схему замещающей модели представления страницы обращения 

  1. Перейдите в раздел [ Конфигурация ] ([ Configuration ]) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите [ Добавить ] —> [ Замещающая модель представления ] ([ Add ] —> [ Replacing view model ]).

  3. Заполните свойства схемы.

    • [ Код ] ([ Code ]) — "SocialMessageHistoryItemPageV2".
    • [ Заголовок ] ([ Title ]) — "SocialMessageHistoryItemPageV2".
    • [ Родительский объект ] ([ Parent object ]) — выберите "SocialMessageHistoryItemPageV2".
  4. Реализуйте логику работы всплывающей кнопки.

    • В свойстве methods реализуйте методы:

      • onSelectedTextChanged() — передает значение выделенного текста в атрибут HighlightedHistoryMessage. Срабатывает при выделении текста.
      • onSelectedTextButtonClick() — создает обращение, тему которого получает из атрибута HighlightedHistoryMessage. Логика создания обращения определена в родительской схеме BaseMessageHistory. Срабатывает при нажатии на всплывающую кнопку.
      • getMessageFromHistory() — переопределенный метод родительской схемы, который получает тему выделенного сообщения.
    • В массив модификаций diff добавьте конфигурационный объект с настройками элемента SelectionHandlerMultiLineLabel пакета Message, который реализует логику создания нового обращения на основе выделенного текста.

    Исходный код схемы замещающей модели представления страницы обращения представлен ниже.

    SocialMessageHistoryItemPageV2
    Code copied
    define("SocialMessageHistoryItemPageV2", ["SocialMessageConstants", "css!SocialMessageHistoryItemStyle"], function(socialMessageConstants) {
        return {
            /* Название схемы объекта страницы записи. */
            entitySchemaName: "BaseMessageHistory",
            /* Детали модели представления страницы записи. */
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            /* Методы модели представления страницы записи. */
            methods: {
                /* Переопределение базового метода. Получает тему для выделенного сообщения. */
                getMessageFromHistory: function() {
                    var message = this.get("HighlightedHistoryMessage");
                    if (this.isHistoryMessageEmpty(message)) {
                        message = this.get("[Activity:Id:RecordId].Body");
                    }
                    return message;
                },
                /* Обработчик события выделения текста. */
                onSelectedTextChanged: function(text) {
                    this.set("HighlightedHistoryMessage", text);
                },
                /* Обработчик нажатия всплывающей кнопки. */
                onSelectedTextButtonClick: function() {
                    /* Подготовка данных по обращению из истории. */
                    this.prepareCaseDataFromHistory();
                }
            },
            /* Отображение кнопки на странице записи. */
            diff: /**SCHEMA_DIFF*/[
                /* Метаданные для добавления на страницу всплывающей кнопки. */
                {
                    /* Выполняется операция изменения существующего элемента. */
                    "operation": "merge",
                    /* Мета-имя изменяемого компонента. */
                    "name": "MessageText",
                    /* Свойства, передаваемые в конструктор элемента. */
                    "values": {
                        /* Свойства генератора представления. */
                        "generator": function() {
                            return {
                                /* Значение HTML-тега id. */
                                "id": "MessageText",
                                /* Значение маркера. */
                                "markerValue": "MessageText",
                                /* Название класса компонента. */
                                "className": "Terrasoft.SelectionHandlerMultilineLabel",
                                /* Настройка CSS-стилей. */
                                "classes": {
                                    "multilineLabelClass": ["messageText"]
                                },
                                /* Заголовок. */
                                "caption": {"bindTo": "Message"},
                                "showLinks": true,
                                /* Привязка события изменения выделенного текста к методу-обработчику. */
                                "selectedTextChanged": {"bindTo": "onSelectedTextChanged"},
                                /* Привязка события нажатия всплывающей кнопки выделенного текста к методу-обработчику. */
                                "selectedTextHandlerButtonClick": {"bindTo": "onSelectedTextButtonClick"},
                                /* Признак видимости всплывающей кнопки. */
                                "showFloatButton": true
                            };
                        }
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    });
  5. На панели инструментов дизайнера нажмите [ Сохранить ] ([ Save ]).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера:

  1. Обновите страницу раздела [ Обращения ] ([ Cases ]).
  2. Откройте страницу обращения.

В результате выполнения примера на вкладку [ Обработка ] ([ Processing ]) страницы обращения добавлена всплывающая кнопку. Кнопка отображается при выделении текста в сообщениях c почты и портала самообслуживания, отправленных с внутренней ленты обращения. При нажатии на кнопку создается новое обращение. Поля [ Тема ] ([ Subject ]) и [ Описание ] ([ Description ]) заполняются автоматически. Значения полей — выделенный текст.

Скрыть область ленты в едином окне
Средний

Пример реализован для рабочего места [ Контакт центр ] ([ Contact center ]).

Пример. В разделе [ Единое окно ] ([ Agent desktop ]) скрыть область ленты.

Создать схему замещающей модели представления раздела 

  1. Перейдите в раздел [ Конфигурация ] ([ Configuration ]) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите [ Добавить ] —> [ Замещающая модель представления ] ([ Add ] —> [ Replacing view model ]).

  3. Заполните свойства схемы.

    • [ Код ] ([ Code ]) — "OperatorSingleWindowPage".
    • [ Заголовок ] ([ Title ]) — "Страница единого окна оператора" ("Agent desktop page").
    • [ Родительский объект ] ([ Parent object ]) — выберите "OperatorSingleWindowPage".
  4. Реализуйте логику скрытия области ленты.

    • В свойстве methods реализуйте метод loadContent() — переопределенный базовый метод, который исключает из перечня загружаемых модулей модуль ленты ESNFeedModule.
    • В массив модификаций diff добавьте конфигурационный объект, который удаляет элемент со страницы.

    Исходный код схемы замещающей модели представления раздела представлен ниже.

    OperatorSingleWindowPage
    Code copied
    define("OperatorSingleWindowPage", [], function() {
        return {
            /* Методы модели представления раздела. */
            methods: {
                /* Замещает базовый метод для исключения из состава загружаемых модулей модуля ленты ESNFeedModule. */
                loadContent: function() {
                    /* Поскольку контейнер centerContainer удален, то модуль ESNFeedModule загружать не нужно.
                    this.loadModule("ESNFeedModule", "centerContainer"); */
                    /* Загрузка модулей. */ 
                    this.loadModule("SectionDashboardsModule", "rightContainer");
                    this.loadModule("OperatorQueuesModule", "leftContainer");
                }
            },
            /* Отображение контейнера в разделе. */
            diff: /**SCHEMA_DIFF*/[
                /* Метаданные для удаления контейнера из раздела. */
                {
                    /* Выполняется операция удаления существующего элемента. */
                    "operation": "remove",
                    /* Мета-имя удаляемого компонента. */
                    "name": "centerContainer"
                }
            ]/**SCHEMA_DIFF*/
        };
    });
  5. На панели инструментов дизайнера нажмите [ Сохранить ] ([ Save ]).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера, обновите страницу раздела [ Единое окно ] ([ Agent desktop ]).

В результате выполнения примера в разделе [ Единое окно ] ([ Agent desktop ]) скрыта область ленты.

Отобразить часовой пояс контакта на вкладку коммуникационной панели
Сложный

Пример. При поиске контакта на вкладке [ Звонки ] ([ CTI panel ]) коммуникационной панели отображать его часовой пояс. Использовать текущее время контакта.

1. Создать схему замещающей модели представления страницы найденного абонента 

  1. Перейдите в раздел [ Конфигурация ] ([ Configuration ]) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите [ Добавить ] —> [ Замещающая модель представления ] ([ Add ] —> [ Replacing view model ]).

  3. Заполните свойства схемы.

    • [ Код ] ([ Code ]) — "SubscriberSearchResultItem".
    • [ Заголовок ] ([ Title ]) — "Схема найденного абонента" ("Found subscriber schema").
    • [ Родительский объект ] ([ Parent object ]) — выберите "SubscriberSearchResultItem".
  4. В объявлении класса модели представления в качестве зависимостей добавьте модули TimezoneGenerator и TimezoneMixin. Модуль TimezoneGenerator формирует элемент отображения часового пояса контакта. Модуль TimezoneMixin выполняет поиск часового пояса контакта.
  5. Реализуйте логику отображения часового пояса.

    • В свойстве attributes добавьте атрибут IsShowTimeZone, который отвечает за состояние отображения элемента часового пояса.
    • В свойстве mixins добавьте миксин TimezoneMixin. Для запуска поиска часового пояса контакта в метод init() миксина TimezoneMixin передайте уникальный идентификатор контакта. Атрибуты, которые будут установлены в результате выполнения:

      • TimeZoneCaption — название часового пояса контакта и текущее время.
      • TimeZoneCity — название города, который находится в часовом поясе.
    • В свойстве methods реализуйте методы:

      • constructor() — конструктор класса.
      • isContactType() — возвращает признак, который указывает, что абонент является контактом.
    • В массив модификаций diff добавьте конфигурационный объект с настройками отображения часового пояса контакта.

      • Свойство index — настройка позиционирования элемента.

        Элементы контейнера SubscriberSearchResultItemContainer:

        • Индекс 0 — фотография абонента.
        • Индекс 1 — информация об абоненте.
        • Индекс 2 — телефоны абонента.

        Свойству index массива модификаций присвойте значение 2, чтобы отобразить часовой пояс контакта между данными абонента и списком телефонных номеров.

      • Свойство wrapClass — управление стилями. Свойство предоставляет генератор элемента. Стили текстовых элементов в схеме определяются CSS-классом subscriber-data.

    Исходный код схемы замещающей модели представления страницы найденного абонента представлен ниже.

    SubscriberSearchResultItem
    Code copied
    define("SubscriberSearchResultItem", ["TimezoneGenerator", "TimezoneMixin"], function() {
        return {
            /* Атрибуты модели представления страницы. */
            attributes: {
                /* Название атрибута, который отвечает за состояние отображения элемента часового пояса. */
                "IsShowTimeZone": {
                    /* Тип данных колонки модели представления. */
                    "dataValueType": Terrasoft.DataValueType.BOOLEAN,
                    /* Тип атрибута. */
                    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    /* Значение по умолчанию. */
                    "value": true
                }
            },
            /* Миксины модели представления страницы. */
            mixins: {
                /* Подключение миксина. */
                TimezoneMixin: "Terrasoft.TimezoneMixin"
            },
            /* Методы модели представления страницы. */
            methods: {
                /* Конструктор класса. */
                constructor: function() {
                    /* Вызов базового конструктора. */
                    this.callParent(arguments);
                    /* Признак того, что абонент является контактом. */
                    var isContact = this.isContactType();
                    /* Если абонент — контакт, то элемент отображается. */
                    this.set("IsShowTimeZone", isContact);
                    /* Если абонент — контакт. */
                    if (isContact) {
                        /* Идентификатор контакта. */
                        var contactId = this.get("Id");
                        /* Поиск часового пояса контакта. */
                        this.mixins.TimezoneMixin.init.call(this, contactId);
                    }
                },
                /* Возвращает признак того, что абонент — контакт. */
                isContactType: function() {
                    /* Тип абонента. */
                    var type = this.get("Type");
                    /* Возвращает результат сравнения. */
                    return type === "Contact";
                }
            },
            /* Массив модификаций модели представления страницы. */
            diff: [
                {
                    /* Выполняется операция добавления элемента на страницу. */
                    "operation": "insert",
                    /* Мета-имя родительского контейнера, в который добавляется элемент. */
                    "parentName": "SubscriberSearchResultItemContainer",
                    /* Элемент добавляется в коллекцию элементов родительского элемента. */
                    "propertyName": "items",
                    /* Мета-имя добавляемого элемента. */
                    "name": "TimezoneContact",
                    /* Свойства, передаваемые в конструктор элемента. */
                    "values": {
                        /* Тип элемента. */
                        "itemType": Terrasoft.ViewItemType.CONTAINER,
                        /* Для формирования конфигурации представления вызывается метод генератора. */
                        "generator": "TimezoneGenerator.generateTimeZone",
                        /* Видимость контейнера привязывается к атрибуту. */
                        "visible": {"bindTo": "IsShowTimeZone"},
                        /* Имя CSS класса. */
                        "wrapClass": ["subscriber-data", "timezone"],
                        /* Привязка заголовка к атрибуту. */
                        "timeZoneCaption": {"bindTo": "TimeZoneCaption"},
                        /* Привязка города к атрибуту. */
                        "timeZoneCity": {"bindTo": "TimeZoneCity"}
                    },
                    /* Позиция элемента в родительском контейнере. */
                    "index": 2
                }
            ]
        };
    });
  6. На панели инструментов дизайнера нажмите [ Сохранить ] ([ Save ]).

В результате в приложении отображается текущее время контакта и его город.

2. Добавить стили отображения часового пояса 

Поскольку в схеме модели представления страницы найденного абонента невозможно задать стили для отображения, необходимо:

  1. Создать схему модуля, в которой определить стили.
  2. Добавить модуль со стилями в зависимости страницы найденного абонента.

1. Создать схему модуля 

  1. Перейдите в раздел [ Конфигурация ] ([ Configuration ]) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите [ Добавить ] —> [ Модуль ] ([ Add ] —> [ Module ]).

  3. Заполните свойства схемы:

    • [ Код ] ([ Code ]) — "UsrSubscriberSearchResultItemCSS".
    • [ Заголовок ] ([ Title ]) — "SubscriberSearchResultItemCSS".

    Для применения заданных свойств нажмите [ Применить ] ([ Apply ]).

  4. Перейдите в узел [ LESS ] структуры объекта и задайте необходимые стили отображения часового пояса.

    Настройка стилей отображения часового пояса
    Code copied
    /* Настройка стилей для отображения добавляемого элемента. */
    .ctiPanelMain .search-result-items-list-container .timezone {
        /* Отступ сверху. */
        padding-top: 13px;
        /* Смещение снизу. */
        margin-bottom: -10px;
    }
    /* Настройка стилей для отображения времени контакта. */
    .ctiPanelMain .search-result-items-list-container .timezone-caption {
        /* Отступ слева. */
        padding-left: 10px;
        /* Цвет текста. */
        color: rgb(255, 174, 0);
        /* Шрифт текста — жирный. */
        font-weight: bold;
    }
    /* Настройка стилей для отображения города контакта. */
    .ctiPanelMain .search-result-items-list-container .timezone-city {
        /* Отступ слева. */
        padding-left: 10px;
    }
  5. Перейдите в узел [ JS ] структуры объекта и добавьте код модуля.

    UsrSubscriberSearchResultItemCSS
    Code copied
    define("UsrSubscriberSearchResultItemCSS", [], function() {
        return {};
    });
        
  6. На панели инструментов дизайнера нажмите [ Сохранить ] ([ Save ]).

2. Модифицировать схему модели представления страницы найденного абонента 

Чтобы использовать созданный модуль и его стили в схеме страницы найденного абонента:

  1. Откройте схему SubscriberSearchResultItem модели представления страницы найденного абонента.
  2. В зависимости схемы SubscriberSearchResultItem добавьте модуль UsrSubscriberSearchResultItemCSS.

    Исходный код модифицированной схемы страницы найденного абонента представлен ниже.

    SubscriberSearchResultItem
    Code copied
    define("SubscriberSearchResultItem", ["TimezoneGenerator", "TimezoneMixin", "css!UsrSubscriberSearchResultItemCSS"], function() {
        return {
            /* Атрибуты модели представления страницы. */
            attributes: {
                /* Название атрибута, который отвечает за состояние отображения элемента часового пояса. */
                "IsShowTimeZone": {
                    /* Тип данных колонки модели представления. */
                    "dataValueType": Terrasoft.DataValueType.BOOLEAN,
                    /* Тип атрибута. */
                    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    /* Значение по умолчанию. */
                    "value": true
                }
            },
            /* Миксины модели представления страницы. */
            mixins: {
                /* Подключение миксина. */
                TimezoneMixin: "Terrasoft.TimezoneMixin"
            },
            /* Методы модели представления страницы. */
            methods: {
                /* Конструктор класса. */
                constructor: function() {
                    /* Вызов базового конструктора. */
                    this.callParent(arguments);
                    /* Признак того, что абонент является контактом. */
                    var isContact = this.isContactType();
                    /* Если абонент — контакт, то элемент отображается. */
                    this.set("IsShowTimeZone", isContact);
                    /* Если абонент — контакт. */
                    if (isContact) {
                        /* Идентификатор контакта. */
                        var contactId = this.get("Id");
                        /* Поиск часового пояса контакта. */
                        this.mixins.TimezoneMixin.init.call(this, contactId);
                    }
                },
                /* Возвращает признак того, что абонент — контакт. */
                isContactType: function() {
                    /* Тип абонента. */
                    var type = this.get("Type");
                    /* Возвращает результат сравнения. */
                    return type === "Contact";
                }
            },
            /* Массив модификаций модели представления страницы. */
            diff: [
                {
                    /* Выполняется операция добавления элемента на страницу. */
                    "operation": "insert",
                    /* Мета-имя родительского контейнера, в который добавляется элемент. */
                    "parentName": "SubscriberSearchResultItemContainer",
                    /* Элемент добавляется в коллекцию элементов родительского элемента. */
                    "propertyName": "items",
                    /* Мета-имя добавляемого элемента. */
                    "name": "TimezoneContact",
                    /* Свойства, передаваемые в конструктор элемента. */
                    "values": {
                        /* Тип элемента. */
                        "itemType": Terrasoft.ViewItemType.CONTAINER,
                        /* Для формирования конфигурации представления вызывается метод генератора. */
                        "generator": "TimezoneGenerator.generateTimeZone",
                        /* Видимость контейнера привязывается к атрибуту. */
                        "visible": {"bindTo": "IsShowTimeZone"},
                        /* Имя CSS класса. */
                        "wrapClass": ["subscriber-data", "timezone"],
                        /* Привязка заголовка к атрибуту. */
                        "timeZoneCaption": {"bindTo": "TimeZoneCaption"},
                        /* Привязка города к атрибуту. */
                        "timeZoneCity": {"bindTo": "TimeZoneCity"}
                    },
                    /* Позиция элемента в родительском контейнере. */
                    "index": 2
                }
            ]
        };
    });
  3. На панели инструментов дизайнера нажмите [ Сохранить ] ([ Save ]).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера:

  1. Откройте вкладку [ Звонки ] ([ CTI panel ]) коммуникационной панели.
  2. Выполните поиск абонента.

В результате выполнения примера при поиске контакта на вкладке [ Звонки ] ([ CTI panel ]) коммуникационной панели отображается его часовой пояс. Используется текущее время контакта.

Создать пользовательское напоминание
Средний

Пример. Создать пользовательское напоминание о дате актуализации продажи в лиде. Дата указана на вкладке [ Информация о сделке ] ([ Opportunity info ]) в поле [ Дата следующей актуализации ] ([ Next actualization date ]). Напоминание отобразить на вкладке напоминаний центра уведомлений.

1. Реализовать текст и окно для напоминания 

  1. Перейдите в раздел [ Конфигурация ] ([ Configuration ]) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите [ Добавить ] —> [ Исходный код ] ([ Add ] —> [ Source code ]).

  3. В дизайнере исходного кода заполните свойства схемы:

    • [ Код ] ([ Code ]) — "UsrLeadRemindingText".
    • [ Заголовок ] ([ Title ]) — "Текст напоминания для лида" ("Lead reminding text").

    Для применения изменений свойств нажмите [ Применить ] ([ Apply ]).

  4. Добавьте локализуемую строку с заголовком окна напоминания.

    1. В контекстном меню узла [ Локализуемые строки ] ([ Localizable strings ]) нажмите кнопку scr_add_button.png.
    2. Заполните свойства локализуемой строки:

      • [ Код ] ([ Code ]) — "TitleTemplate".
      • [ Значение ] ([ Value ]) — "Необходимо актуализировать продажу" ("You need to update the sale").
    3. Для добавления локализуемой строки нажмите [ Добавить ] ([ Add ]).
  5. Аналогично добавьте локализуемую строку с текстом напоминания.

    Свойства локализуемой строки, которую необходимо добавить, приведены в таблице ниже.

    Значения свойств локализуемой строки
    [ Код ]
    ([ Code ])
    [ Значение ]
    ([ Value ])
    "BodyTemplate"
    "Лид {0} требует актуализации информации по продаже" ("Lead {0} requires update of sales information")
  6. Реализуйте текст и окно для напоминания.

    Исходный код схемы исходного кода представлен ниже.

    UsrLeadRemindingText
    Code copied
    namespace Terrasoft.Configuration
    {
        using System.Collections.Generic;
        using Terrasoft.Common;
        using Terrasoft.Core;
    
        public class UsrLeadRemindingText : IRemindingTextFormer
        {
            private const string ClassName = nameof(UsrLeadRemindingText);
            protected readonly UserConnection UserConnection;
    
            public UsrLeadRemindingText(UserConnection userConnection) {
                UserConnection = userConnection;
            }
            /* Формирует текст напоминания из коллекции входящих параметров и локализуемой строки BodyTemplate. */
            public string GetBody(IDictionary<string, object> formParameters) {
                formParameters.CheckArgumentNull("formParameters");
                var bodyTemplate = UserConnection.GetLocalizableString(ClassName, "BodyTemplate");
                var leadName = (string)formParameters["LeadName"];
                var body = string.Format(bodyTemplate, leadName);
                return body;
            }
            /* Формирует заголовок напоминания из имени класса и локализуемой строки TitleTemplate. */
            public string GetTitle(IDictionary<string, object> formParameters) {
                return UserConnection.GetLocalizableString(ClassName, "TitleTemplate");
            }
        }
    }
  7. На панели инструментов дизайнера исходного кода нажмите [ Сохранить ] ([ Save ]) для временного сохранения изменений в метаданных схемы.
  8. На панели инструментов дизайнера исходного кода нажмите [ Опубликовать ] ([ Publish ]) для выполнения изменений на уровне базы данных.

2. Реализовать логику отправки напоминания 

  1. Перейдите в раздел [ Конфигурация ] ([ Configuration ]) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите [ Добавить ] —> [ Замещающий объект ] ([ Add ] —> [ Replacing object ]).

  3. В дизайнере объекта заполните свойство схемы [ Родительский объект ] ([ Parent object ]) — выберите "Lead".

  4. Создайте событие объекта.

    1. Перейдите в узел [ События ] ([ Events ]).
    2. В блоке [ Добавление ] ([ Adding ]) установите признак [ После добавления записи ] ([ After record added ]).
  5. В схеме объекта настройте параметр процесса, который генерирует напоминание.

    1. На панели инструментов дизайнера объекта нажмите [ Сохранить ] ([ Save ]).
    2. На панели инструментов дизайнера объекта нажмите [ Открыть процесс ] ([ Open process ]).
    3. Добавьте параметр.

      1. На панели свойств перейдите на вкладку [ Параметры ] ([ Parameters ]) и нажмите [ Добавить параметр ] —> [ Логическое ] ([ Add parameter ] —> [ Boolean ]).

      2. В дизайнере объекта заполните свойства параметра:

        • [ Заголовок ] ([ Title ]) — "Сгенерировать напоминание" ("Generate reminding").
        • [ Код ] ([ Code ]) — "GenerateReminding".
      3. Нажмите [ Сохранить ] ([ Save ]).
    4. Переопределите методы.

      • Переопределите метод, который вызывается после сохранения объекта. Для этого на панели свойств перейдите на вкладку [ Методы ] ([ Methods ]) и добавьте исходный код переопределенного метода LeadSaved().

        LeadSaved()
        Code copied
        public override void LeadSaved() {
            base.LeadSaved();
            /* Проверки необходимость генерации напоминания. */
            if (!GenerateReminding) {
                return;
            }
            DateTime remindTime = Entity.NextActualizationDate;
            if (Entity.OwnerId.Equals(Guid.Empty) || remindTime.Equals(default(DateTime))) {
                return;
            }
            /* Создает экземпляр класса UsrLeadRemindingText. */
            IRemindingTextFormer textFormer = ClassFactory.Get<UsrLeadRemindingText>(new ConstructorArgument("userConnection", UserConnection));
            /* Получает название лида. */
            string leadName = Entity.LeadName;
            /* Получает текст напоминания. */
            string subjectCaption = textFormer.GetBody(new Dictionary<string, object> {
                {"LeadName", leadName}
            });
            /* Получает заголовок напоминания. */
            string popupTitle = textFormer.GetTitle(null);
            /* Конфигурирует напоминание. */
            var remindingConfig = new RemindingConfig(Entity);
            /* Автор сообщения — текущий контакт. */
            remindingConfig.AuthorId = UserConnection.CurrentUser.ContactId;
            /* Целевой получатель — ответственный лида. */
            remindingConfig.ContactId = Entity.OwnerId;
            /* Тип — напоминание. */
            remindingConfig.NotificationTypeId = RemindingConsts.NotificationTypeRemindingId;
            /* Дата отправки напоминания — дата актуализации продажи в лиде. */
            remindingConfig.RemindTime = remindTime;
            /* Текст напоминания. */
            remindingConfig.Description = subjectCaption;
            /* Заголовок напоминания. */
            remindingConfig.PopupTitle = popupTitle;
            /* Создает утилитный класс напоминания. */
            var remindingUtilities = ClassFactory.Get<RemindingUtilities>();
            /* Создает напоминание. */
            remindingUtilities.CreateReminding(UserConnection, remindingConfig);
        }

        Значение RemindingConsts.NotificationTypeRemindingId константы remindingConfig.NotificationTypeId позволяет отображать напоминание на вкладке напоминаний центра уведомлений. Если для константы указать значение RemindingConsts.NotificationTypeNotificationId, то напоминание будет отображено на вкладке служебных сообщений центра уведомлений.

      • Переопределите метод, который вызывается перед сохранением объекта. Для этого на панели свойств перейдите на вкладку [ Методы ] ([ Methods ]) и добавьте исходный код переопределенного метода LeadSavingMethod().

        LeadSavingMethod()
        Code copied
        public override void LeadSavingMethod() {
            /* Вызов базовой реализации метода. */
            base.LeadSavingMethod();
            /* Получает идентификатор ответственного. */
            var oldOwnerId = Entity.GetTypedOldColumnValue<Guid>("OwnerId");
            /* Получает дату следующей актуализации. */
            DateTime oldRemindDate = Entity.GetTypedOldColumnValue<DateTime>("NextActualizationDate");
            /* Сравнивает старое и новое значения идентификаторов ответственного. */
            bool ownerChanged = !Entity.OwnerId.Equals(oldOwnerId);
            /* Сравнивает старое и новое значения даты актуализации. */
            bool remindDateChanged = !Entity.NextActualizationDate.Equals(oldRemindDate);
            /* Параметру процесса GenerateReminding присваивает true, если были изменены ответственный или дата следующей актуализации. */
            GenerateReminding = ownerChanged || remindDateChanged;
        }
      Полный исходный код встроенного процесса объекта
    5. На панели инструментов дизайнера объекта нажмите [ Сохранить ] ([ Save ]), а затем [ Опубликовать ] ([ Publish ]).
    6. На панели инструментов дизайнера объекта нажмите [ Закрыть ] ([ Cancel ]).
  6. На панели инструментов дизайнера объекта нажмите [ Опубликовать ] ([ Publish ]) для создания соответствующей таблицы в базе данных.

3. Реализовать отображение напоминания 

  1. Перейдите в раздел [ Конфигурация ] ([ Configuration ]) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите [ Добавить ] —> [ Замещающая модель представления ] ([ Add ] —> [ Replacing view model ]).

  3. В дизайнере модуля заполните свойство схемы [ Родительский объект ] ([ Parent object ]) — выберите "ReminderNotificationsSchema".

    Для применения заданных свойств нажмите [ Применить ] ([ Apply ]).

  4. Реализуйте отображение напоминания.

    1. В свойстве methods реализуйте методы:

      • getIsLeadNotification() — метод, который определяет, относится ли напоминание к лиду.
      • getNotificationSubjectCaption() — метод, который возвращает заголовок напоминания.
    2. В массив модификаций diff добавьте конфигурационные объекты с настройками расположения:

      • Контейнера на странице.
      • Контейнера для заголовка.
      • Изображения.
      • Даты.
      • Текста напоминания.

    Исходный код схемы замещающей модели представления представлен ниже.

    ReminderNotificationsSchema
    Code copied
    define("ReminderNotificationsSchema", ["ReminderNotificationsSchemaResources"], function() {
        return {
            /* Название схемы объекта. */
            entitySchemaName: "Reminding",
            /* Методы модели представления. */
            methods: {
                /* Определяет, относится ли напоминание к лиду. */
                getIsLeadNotification: function() {
                    return this.get("SchemaName") === "Lead";
                },
                /* Возвращает заголовок напоминания. */
                getNotificationSubjectCaption: function() {
                    var caption = this.get("Description");
                    return caption;
                }
            },
            /* Отображение напоминания. */
            diff: [
                /* Метаданные для добавления контейнера. */
                {
                    /* Выполняется операция добавления элемента на страницу. */
                    "operation": "insert",
                    /* Мета-имя добавляемого контейнера. */
                    "name": "NotificationleadItemContainer",
                    /* Мета-имя родительского контейнера, в который добавляется текущий контейнер. */
                    "parentName": "Notification",
                    /* Контейнер добавляется в коллекцию элементов родительского элемента. */
                    "propertyName": "items",
                    /* Свойства, передаваемые в конструктор элемента. */
                    "values": {
                        "itemType": Terrasoft.ViewItemType.CONTAINER,
                        "wrapClass": [
                            "reminder-notification-item-container"
                        ],
                        /* Отображается только для лидов. */
                        "visible": {"bindTo": "getIsLeadNotification"},
                        "items": []
                    }
                },
                /* Метаданные для добавления контейнера для заголовка. */
                {
                    "operation": "insert",
                    "name": "NotificationItemleadTopContainer",
                    "parentName": "NotificationleadItemContainer",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.CONTAINER,
                        "wrapClass": ["reminder-notification-item-top-container"],
                        "items": []
                    }
                },
                /* Метаданные для добавления изображения. */
                {
                    "operation": "insert",
                    "name": "NotificationleadImage",
                    "parentName": "NotificationItemleadTopContainer",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.BUTTON,
                        "className": "Terrasoft.ImageView",
                        "imageSrc": {"bindTo": "getNotificationImage"},
                        "classes": {"wrapClass": ["reminder-notification-icon-class"]}
                    }
                },
                /* Метаданные для даты. */
                {
                    "operation": "insert",
                    "name": "NotificationDate",
                    "parentName": "NotificationItemleadTopContainer",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.LABEL,
                        "caption": {"bindTo": "getNotificationDate"},
                        "classes": {"labelClass": ["subject-text-labelClass"]}
                    }
                },
                /* Метаданные для текста напоминания. */
                {
                    "operation": "insert",
                    "name": "NotificationleadSubject",
                    "parentName": "NotificationItemleadTopContainer",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.LABEL,
                        "caption": {"bindTo": "getNotificationSubjectCaption"},
                        "click": {"bindTo": "onNotificationSubjectClick"},
                        "classes": {"labelClass": ["subject-text-labelClass", "label-link", "label-url"]}
                    }
                }
            ]
        };
    });
  5. На панели инструментов дизайнера модуля нажмите [ Сохранить ] ([ Save ]).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера:

  1. Обновите страницу раздела [ Лиды ] ([ Leads ]).
  2. Откройте страницу лида и перейдите на вкладку [ Информация о сделке ] ([ Opportunity info ]).
  3. В поле [ Дата следующей актуализации ] ([ Next actualization date ]) выберите необходимую дату и время актуализации продажи.
  4. В поле [ Ответственный ] ([ Owner ]) выберите контакт своего пользователя.

В результате выполнения примера на вкладке напоминаний центра уведомлений отображается напоминание о дате актуализации продажи в лиде.