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

Средний
PDF

Пример. Создать пользовательское напоминание о дате актуализации продажи в лиде. Дата указана на вкладке Информация о сделке (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
    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()
        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()
        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
    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) выберите контакт своего пользователя.

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