Шаблоны уведомлений

1. Общие сведения

1.1 Описание сущности “Шаблон уведомления“

Id:

Уникальный идентификатор шаблона уведомления.

Name:

Имя шаблона уведомления.

Tags:

Теги.

Notification title:

Заголовок уведомления, мульти-язычное поле – строка с поддержкой freemarker.

Notification body:

Многокомпонентное поле для описания тела уведомления с привязкой к указанной локали. В одном шаблоне уведомления предусмотрена поддержка разных локалей (языков).
Lang - Локаль сообщения, например en, ru.
Body - Исходное содержимое текста сообщения c использованием freemarker. При нажатии на кнопку «Редактировать как HTML» открывается richText редактор сообщения для более удобного редактирования html разметки

Model:

Модель, исходя из которой будет происходить шаблонизация текста – title или body для уведомлений.
Модель – это map ключ: значение, ключом в данном случае выступает имя переменной, которая будет доступна в шаблоне, а значение – ecos records выражение для вычисления значения переменной.
Базовым record является документ, по которому идет бизнес-процесс. То есть, если в модели указать значение .disp, то вычисляется заголовок по документу. Так же есть доступ к другим объектам через знак $, например, если уведомление отправляется в рамках бизнес процесса, - $process.webUrl (по умолчанию доступны дополнительные переменные $now, $user, $webUrl).
При использовании мульти шаблонов, модель из базового шаблона будет сливаться с моделью, найденной по типу, таким образом часть «базовой» модели может быть описана в базовом шаблоне, а более специфичные атрибуты могут быть вынесены в конкретный шаблон.

Multi templates:

Вычисляемые шаблоны, в зависимости от типа документа, по которому отсылается уведомление. Например, может быть «базовый» шаблон, который включает в себя несколько других шаблонов с разными типами документов.
При отправке уведомления, если у документа, по которому отправляется уведомление, тип не соответствует ни одному из мульти-шаблонов, то отправка осуществится по «базовому» шаблону, если тип документа соответствует мульти-шаблону, то отправка произойдет по соответствующему шаблону.

Predicate:

Позволяет задать дополнительные условия для связки шаблон - тип. Вычисление предикатов происходит на основе атрибутов модели.

1.2 Журнал “Шаблоны уведомлений“

Для перехода в журнал необходимо в боковом меню выбрать «Инструменты». Далее в правой части перейти в блок «Конфигурация уведомлений» - > журнал «Шаблоны уведомлений».

../../_images/notifications_template_menu_1.png

2. Операции

2.1 Создание шаблона уведомления

Для создания необходимо перейти в журнал «Шаблоны уведомлений», см. 1.2 Журнал “Шаблоны уведомлений“.

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

  • Создание нового объекта;

  • Импорт модуля (zip).

2.1.1 Создание нового объекта

Для создания нового объект необходимо нажать на «+» и выбрать «Создать новый шаблон уведомления»

../../_images/notifications_template_create_1.png

Описание полей см. 1.1 Описание сущности “Шаблон уведомления“.

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

Открываем форму создания и заполняем следующую информацию:

id - ssg-incident-base-new-incident-to-possible-responsible

name - Базовый шаблон. Новый документ

notification title - Новый инцидент: ${title}.
В данном случае ${title} означает, что из описанной модели будет взято значение, которое является заголовком для документа.
Данное поле является мульти язычным, переключение языков происходит по нажатию на значок флага.

../../_images/notifications_template_create_2.png

Notification body - lang = ru, body заполняем следующим текстом:

<#import "ssg-template-lib" as lib>

<@lib.its_test_message/>
<p>
    Сообщаем, что сформирован документ, за обработку которого Вы являетесь ответственным.<br>
    <@lib.document_link/><br>
    Пожалуйста, проверьте рабочий список задач Скиф.<br>
<p>

В данном шаблоне импортируется библиотечный шаблон:

<#macro its_test_message>
    <b>Это письмо было отправлено вам в рамках тестирования настроек новой системы.
        Вам не нужно отвечать или как-то реагировать на него.</b>
</#macro>

<#macro document_link>
<a href="${web_url}/v2/dashboard?recordRef=${doc_recordRef}"><u><i>${title}</i></u></a>
</#macro>

В шаблонах уведомления поддерживается import и include других шаблонов по их id.

В текущем примере:

<@lib.its_test_message/> - печать блока текста, информирующего о том, что это сообщение является тестовым.
<@lib.document_link/> - печатает ссылку на документ, по которому идет бизнес процесс, в данном случае – сам документ.

Подробнее о использовании макросов, импорте и включении других шаблонов см. документацию apache freemarker - https://freemarker.apache.org

Model - описываем модель, которая потребуется для шаблонизации текста:

Flowable:

  • web_url : $process.webUrl – используется для формирования ссылки на документ

  • doc_recordRef : .id – уникальный id документа, так же используется для формирования ссылки на документ

  • title : .disp – заголовок документа

Ecos BPMN:

См. описание компонента «Уведомление» в документации по Ecos BPMN.

2.1.2 Импорт модуля

Для импорта модуля в журнале «Шаблоны уведомлений» нажмите на «+» и выберите «Загрузить шаблон уведомления»

../../_images/notifications_template_import.png

В открывшейся форме загрузите zip архив с шаблоном уведомления. Подробнее про модуль «Шаблон уведомления» см. 2.4 Выгрузка шаблона уведомления.

2.2 Редактирование шаблона уведомления

Для редактирования шаблона уведомления перейдите в журнал (см. 1.2 Журнал “Шаблоны уведомлений“), найдите нужный шаблон и нажмите на действие «Редактировать».

../../_images/notifications_template_edit.png

2.3 Удаление шаблона уведомления

Для удаления шаблона уведомления перейдите в журнал (см. 1.2 Журнал “Шаблоны уведомлений“), найдите нужный шаблон и нажмите на действие «Удалить».

../../_images/notifications_template_delete.png

2.4 Выгрузка шаблона уведомления

Для выгрузки модуля шаблона уведомления перейдите в журнал (см. 1.2 Журнал “Шаблоны уведомлений“), найдите нужный шаблон и нажмите на действие «Скачать».

../../_images/notifications_template_download.png

Модуль представляет собой zip архив с мета-информаций по шаблону и самим контентом шаблона. Для примера, выгрузим модуль для шаблона, созданного на шаге 2.1.1 Создание нового объекта.

Файл ssg-incident-base-new-incident-to-possible-responsible.html.meta.yml является мета информацией, содержимое файла:

{
    "id" : "ssg-incident-base-new-incident-to-possible-responsible",
    "name" : "Базовый шаблон. Новый документ",
    "notificationTitle" : {
        "ru" : "Новый инцидент: ${title}"
    },
    "model" : {
        "web_url" : "$process.webUrl",
        "doc_recordRef" : ".id",
        "title" : ".disp"
    },
    "multiTemplateConfig" : []
}

Файл ssg-incident-base-new-incident-to-possible-responsible.html.ftl является самим контентом шаблона, его содержимое:

<#import "ssg-template-lib" as lib>

<@lib.its_test_message/>
<p>
    Сообщаем, что сформирован документ, за обработку которого Вы являетесь ответственным.<br>
    <@lib.document_link/><br>
    Пожалуйста, проверьте рабочий список задач Скиф.<br>
<p>

Обратите внимание, что модуль должен быть именно zip архивом, а файлы внутри него чувствительны к наименованию и расширению.
Файл с контентом должен иметь расширение «.html.ftl», а файл с мета информацией должен именоваться по правилу полное_имя_файла_контента_с_расширением.meta.yml

Примечание

Если тело шаблона предусматривает несколько локалей, то в имени файла контента указывается локаль по следующему правилу:
ssg-incident-base-new-incident-to-possible-responsible.html_en.ft для локали en
ssg-incident-base-new-incident-to-possible-responsible.html_ru.ft для локали ru
и т.д.

3. Использование переменных в шаблоне

В шаблонах уведомлений доступны переменные, определенные в модели, см 1.1 Описание сущности “Шаблон уведомления“ блок «Model», а также добавленные сервисы в freemarker.

3.1 Сервисы и константы

В шаблонах уведомлений доступны следующие сервисы, добавленные в freemarker:

  • link - формирование ссылок

    • getRecordLink(recordRef: String): String - возвращает полную ссылку на переданный recordRef вида http://<webUrl>/v2/dashboard?recordRef=<recordRef>

  • meta - сервис для получения различной мета информация

    • getWebUrl(): String- возвращает настроенный webUrl сервера

  • _notification - информация о текущем уведомлении

    • title - заголовок уведомления

    • from - отправитель уведомления

    • to - получатель уведомления

    • cc - копия уведомления

    • bcc - скрытая копия уведомления

  • image - работа с изображениями в шаблоне, см. пример - Вставка изображений в шаблон .

    • toBase64Data(fileName: String): String - возвращает base64 data image представление изображения по переданному имени файла изображения

    • toBase64(fileName: String): String - возвращает base64 представление изображения по переданному имени файла изображения

  • config - предоставляет доступ к Конфигурации Ecos по ключу в формате <область>$<идентификатор>.

    • get(key: String): DataValue - получение значения по ключу

    • getOrDefault(key: String, defaultValue: Any): DataValue - получение значения по ключу, если значение не найдено, то возвращается значение по умолчанию

    • getNotNull(key: String): DataValue - получение значения по ключу, если значение null, то выбрасывается исключение

    //получение значения конфигурации по ключу и приведение к типу String
    <#assign replyEmail = config.getNotNull("app/service-desk$sd-email-reply").asText()>
    

Для добавления константы можно использовать в модели шаблона контекстный атрибут str:

$str.CONSTANT

вернется:

CONSTANT

3.2 Множественные атрибуты

Предположим, что в источнике есть атрибут eventLines, который возвращает список «строк» с атрибутами.
Для получения данных по множественным атрибутам, как и для всех других, используется стандартные records выражения:

  • lines: eventLines[]{id:skifem:eventLineId,text:VIEW_0POSTXT} - получить список строк, с атрибутами id и VIEW_0POSTXT. Внутри {} можно указывать атрибуты, которые необходимо подгрузить в объект.

  • firstLine: eventLines{id:skifem:eventLineId,text:VIEW_0POSTXT} - аналогично примеру выше, с оговоркой, что будет загружен только первый объект.

../../_images/notifications_template_atts_list.png

В самом шаблоне уведомления выведем информацию по списку строк в виде html таблицы и отдельной строкой первый элемент:

<style>
    table, tr, td {
        border: 1px solid;
        border-collapse: collapse;
        overflow-wrap: break-word;
    }

    thead {
        font-weight: bold;
    }
</style>

<table>
    <caption>Пример - информация по строкам</caption>
    <tr>
        <th>id</th>
        <th>текст документа</th>
    </tr>
    <#if (lines?? && lines?size > 0)>
        <#list lines as line>
            <tr>
                <td>${line.id!""}</td>
                <td>${line.text!""}</td>
            </tr>
        </#list>
    </#if>
</table>
<br>
Пример - информация по первой строке: id: ${firstLine.id!""}, text: ${firstLine.text!""}
<p>

В результате получим емейл с следующим содержанием:

../../_images/notifications_template_atts_list_result.png

3.3 Вставка изображений в шаблон

В шаблонах уведомлений реализована возможность вставлять изображения в html разметку в виде base64 data.

Доступные для вставки изображения находятся в журнале «Файлы уведомлений» («Инструменты» - > «Конфигурация уведомлений» - > журнал «Шаблоны уведомлений»).

Для загрузки нового изображения необходимо нажать на «+» и загрузить изображение. Имя изображения является идентификатором и должно быть уникально.

../../_images/notifications_template_image_1.png ../../_images/notifications_template_image_2.png

Для примера, предположим, что в шаблон письма необходимо добавить кнопку с ссылкой на ресурс https://citeck.com. Для этого необходимо осуществить следующие действия:

  1. Загрузить файл изображения test-logo-citeck.png в журнал «Файлы уведомлений».

../../_images/notifications_template_image_logo.png
  1. В шаблоне добавим html разметку с кнопкой и src в виде base64 изображения, загруженного в пункте №1.

Привет! Это тестовый шаблон с кнопкой-изображение :)
<form action="https://citeck.com/">
    <input type="image" src="${image.toBase64Data("test-logo-citeck.png")}" style="max-height: 67px; max-width: 200px;">
</form>

Как видно из шаблона выше, для конвертации изображение в base64 data необходимо у сервиса image вызвать метод toBase64Data и передать ему идентификатор изображения.

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

../../_images/notifications_template_image_result.png

3.4 Прикрепление вложений (attachments) к email уведомлению

Для того чтобы прикрепить вложение необходимо в шаблоне уведомления в модель добавить атрибут _attachments. В него мы можем указать контент или список из контентов. Выглядеть это должно следующим образом:

../../_images/notifications_template_attachments_1.png ../../_images/notifications_template_attachments_2.png

В значении к полю _attachments необходимо указать Records API атрибут.

Для рекродов, которые хранятся в emodel - _content{bytes,meta:?json}

Примечание

Доступно с версии 2.15.0 микросервиса ecos-notification. Можно использовать любой атрибут, в котором хранится content рекорда. В примере используется _content, так как он является атрибутом для хранения контента по умолчанию.

Ожидаемая модель:

{
    "bytes": "SOj2",
    "meta": {
        "name": "test.txt",
        "ext": "txt",
        "mimeType": "text/plain"
    }
}

Для рекордов, которые хранятся в Alfresco - cm:content{bytes,previewInfo?json}

Примечание

Доступно с версии 2.5.0 микросервиса ecos-notification.

Ожидаемая модель:

{
    "bytes": "SOj2",
    "previewInfo": {
        "originalName": "test.txt",
        "originalExt": "txt",
        "mimeType": "text/plain"
    }
}

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

bytes:

Контент файла закодированный в формат Base64

mimetype:

Mimetype файла

ext:

Расширение файла

name:

Имя файла

Примечание

  1. Если в originalName будет находиться имя без расширения, то система сама допишет расширение файлу из originalExt.

  2. Если окажется, что cm:content будет отсутствовать у ноды (или лист контентов будет пустым), то отправится уведомление без прикрепления вложений.