Самостійна реєстрація користувачів з ручною модерацією
- 1. Загальний опис
- 2. Передумови
- 3. Референтний приклад процесу
- 3.1. Створення пулів для учасників процесу
- 3.2. Початок процесу
- 3.3. Надсилання даних з токена для підтвердження реєстрації
- 3.4. Отримання даних з токена модератором для підтвердження реєстрації
- 3.5. Скрипт для підготовки даних до відображення на UI-формі
- 3.6. Визначення бізнес-ключа процесу
- 3.7. Перегляд даних для реєстрації модератором на UI-формі
- 3.8. Таймер для прийняття рішення модератором щодо реєстрації
- 3.9. Надсилання повідомлення про те, що рішення про автореєстрацію не прийнято (альтернативний потік)
- 3.10. Отримання повідомлення про те, що рішення про автореєстрацію не прийнято (альтернативний потік)
- 3.11. Виведення інформації про завершення процесу на форму (альтернативний потік)
- 3.12. Підписання даних КЕП
- 3.13. Підписання даних системним ключем
- 3.14. Створення запису у базі даних реєстру
- 3.15. Визначення статусу виконання процесу
- 3.16. Відправлення рішення назад до процесу заявника реєстрації
- 3.17. Отримання повідомлення про те, що рішення про автореєстрацію прийнято та записано до Фабрики даних
- 3.18. Моделювання XOR-шлюзу та додавання логіки через вирази умови
- 3.19. Виведення інформації на форму про відсутність дозволу на реєстрацію (альтернативний потік)
- 3.20. Видалення ролі unregistered-officer та призначення ролі officer посадовій особі
- 3.21. Виведення на форму інформації по успішне завершення процесу реєстрації
- 3.22. Встановлення результату виконання та завершення процесу
🌐 Цей документ доступний українською та англійською мовами. Використовуйте перемикач у правому верхньому куті, щоб змінити версію. |
1. Загальний опис
Розглянемо опис бізнес-процесу автоматичної реєстрації посадових осіб (надавачів послуг) із ручним підтвердженням даних модератором.
Бізнес-процес складається з двох пулів, що представляють двох учасників: посадову особу-заявника, яка самореєструється, та модератора, який перевіряє дані. Обмін інформацією між учасниками здійснюється через події повідомлень (Message events).
Заявник вводить особисті дані на формі, які надсилаються модератору для перевірки. Модератор має певний час (тут — 2 хвилини) на прийняття рішення, контрольоване таймером (Timer boundary event). Якщо рішення не прийнято вчасно, процес іде за альтернативним потоком та завершується, а користувач не реєструється і бачить сторінку з інформацією, що час на погодження вийшов.
У разі позитивного рішення, дані підписуються КЕП і системним ключем, після чого зберігаються до системної таблиці (тут — officer
) бази даних реєстру, відповідно до створеної попередньо моделі даних. Інформація про рішення надсилається заявнику через подію повідомлення. Якщо рішення негативне, процес іде за альтернативним потоком, і користувача не реєструють.
При позитивному рішенні, інформація передається на сервісну задачу із делегатом Save user roles, який змінює роль користувача з unregistered-officer
на officer
. Таким чином, користувач реєструється в системі.
Заявник переходить на форму із повідомленням про успішну самореєстрацію та статусом “Самореєстрацію пройдено”. Після цього заявник перенаправляється на форму для повторного входу в систему.
Після повторної автентифікації з роллю officer
, посадова особа отримує доступ до усіх послуг, доступних йому у реєстрі. Зареєстрований користувач з роллю officer
зможе ініціювати, переглядати, редагувати та надавати послуги відповідно до своїх повноважень та обов’язків у системі.
Таким чином, бізнес-процес автоматичної реєстрації посадових осіб (надавачів послуг) із ручним підтвердженням даних модератором спрощує процес реєстрації, забезпечуючи ефективний контроль з боку модератора та зменшуючи час, потрібний для реєстрації користувачів.
2. Передумови
Для того, щоб бізнес-процес самореєстрації запрацював, необхідно виконати передумови, описані нижче.
2.1. Увімкнення опції самореєстрації посадових осіб
Активуйте опцію самореєстрації надавачів послуг в адміністративній панелі Control Plane.
Детальніше про це — див. на сторінці Налаштування самостійної реєстрації для надавачів послуг. |
2.2. Моделювання структур даних
Створіть модель даних реєстру за прикладом нижче.
Приклад .xml-схеми ви можете знайти у регламенті демо-реєстру consent-data за посиланням: https://admin-tools-consent-data.apps.envone.dev.registry.eua.gov.ua/gerrit. Схема буде доступна за назвою tablesOfficers.xml. |
Референтний приклад моделі даних. Таблиці для збереження самореєстрованих користувачів
<changeSet author="registry owner" id="table officers">
<createTable tableName="officers" ext:historyFlag="true" remarks="Перелік посадових осіб">
<column name="officers_id" type="UUID" defaultValueComputed="uuid_generate_v4()">
<constraints nullable="false" primaryKey="true" primaryKeyName="pk_officers_id"/>
</column>
<column name="user_name" type="TEXT" remarks="username користувача в Keycloak">
<constraints nullable="false"/>
</column>
<column name="full_name" type="TEXT" remarks="ПІБ користувача">
<constraints nullable="false"/>
</column>
<column name="drfo" type="TEXT" remarks="РНОКПП користувача">
<constraints nullable="false"/>
</column>
<column name="edrpou" type="TEXT" remarks="ЄДРПОУ користувача">
<constraints nullable="false"/>
</column>
<column name="realm_roles" type="TEXT" remarks="Перелік регламентних ролей користувача"/>
<column name="work_start_date" type="DATE" remarks="Дата прийняття на роботу"/>
<column name="unit_name" type="TEXT" remarks="Назва підрозділу згідно ієрархії"/>
<column name="hierarchy_code" type="TEXT" remarks="Сурогатний ключ, складений на основі structure_code"/>
<column name="structure_code" type="TEXT" remarks="Унікальний код ієрархії для відповідного підрозділу"/>
<column name="selfregistration_decision" type="BOOLEAN" remarks="Рішення модератора щодо самореєстрації"/>
</createTable>
</changeSet>
Ця модель даних створює таблицю officers
у базі даних, яка зберігає інформацію про зареєстрованих користувачів (посадових осіб), які самореєструвалися в системі.
Опис стовпців таблиці
-
officers_id
— це первинний ключ таблиці з унікальним ідентифікатором кожного посадовця, типом UUID, який автоматично генерується за допомогою функціїuuid_generate_v4()
. -
user_name
— імена користувача з системи Keycloak (система управління ідентифікацією та доступом користувачі). -
full_name
— ПІБ користувача. -
drfo
— РНОКПП користувача (Реєстраційний номер облікової картки платника податків). -
edrpou
— ЄДРПОУ користувача (Єдиний державний реєстр підприємств та організацій України). -
realm_roles
— перелік регламентних ролей користувача. -
work_start_date
— дата прийняття користувача на роботу. -
unit_name
— назва підрозділу відповідно до ієрархії організації. -
hierarchy_code
— сурогатний ключ, складений на основіstructure_code
. -
structure_code
— унікальний код ієрархії для відповідного підрозділу. -
selfregistration_decision
— булеве значення, що відображає рішення модератора щодо самореєстрації користувача.
3. Референтний приклад процесу
Приклад .bpmn-моделі процесу, а також користувацькі .json-форми до нього ви можете знайти у регламенті демо-реєстру consent-data за посиланням: https://admin-tools-consent-data.apps.envone.dev.registry.eua.gov.ua/gerrit. Процес буде доступний за назвою officer-selfregistration-handmoderation.bpmn. Назви форм ви можете знайти всередині відповідних користувацьких задач бізнес-процесу у полі |
3.1. Створення пулів для учасників процесу
Створіть два пули (Participant) для учасників процесу — посадової особи-заявника, яка самореєструється, та модератора, який перевіряє дані.
![officer self register manual mod 1](../_images/best-practices/officer-auto-register/manual-moderation/officer-self-register-manual-mod-1.png)
![officer self register manual mod 2](../_images/best-practices/officer-auto-register/manual-moderation/officer-self-register-manual-mod-2.png)
Вкажіть для кожного наступне:
-
Participant Name
— назва пулу для процесу. -
Process ID
— ідентифікатор процесу в регламенті реєстру. -
Process name
— бізнес-назва процесу. -
Активуйте чекбокс
Executable
.
3.2. Початок процесу
Змоделюйте стартову подію. Ця подія ініціює автоматичний старт процесу після автентифікації з роллю unregistered-officer
.
-
Вкажіть назву задачі.
-
Вкажіть ініціатора процесу як
initiator
.Що таке ініціатор?
"Start initiator = initiator"
вказує на те, що значення ініціатора (тобто особи чи системи, яка розпочала процес) буде встановлено якinitiator
.У контексті бізнес-процесів, ініціатор — це той, хто починає процес або відповідає за його запуск. Зазвичай, ініціатор — це користувач, який викликає дію, або система, яка автоматично розпочинає процес.
У цьому випадку,
initiator
може бути використаний для ідентифікації особи чи системи, що стартували процес, у подальших етапах бізнес-процесу або для контролю доступу до ресурсів.
3.3. Надсилання даних з токена для підтвердження реєстрації
Змоделюйте проміжну подію відправлення повідомлення — Message Intermediate Throw Event.
Детальніше про Message Intermediate Throw Event ви можете переглянути на сторінці Моделювання та налаштування проміжної події відправки повідомлення. |
Ця подія повідомлення являє собою елемент у бізнес-процесі, який відправляє повідомлення з даними (ПІБ
, РНОКПП
та ЄДРПОУ
з токена) про користувача до іншого учасника процесу або іншого процесу. У цьому випадку, вона описує відправлення даних заявника-ініціатора (особи, яка намагається зареєструватися) до модератора для ручного підтвердження даних.
- Виконайте налаштування події наступним чином:
-
-
У розділі Implementation вкажіть:
-
Тип —
Delegate expression
. -
Вираз —
${startProcessByMessageDelegate}
. Змінна є імплементацією делегата.
-
-
У розділі Global message reference:
-
Оберіть
startModerationBpMessage
зі списку доступних. -
У полі
Name
продублюйте значенняstartModerationBpMessage
для зручності.
-
-
У розділі Inputs вкажіть вхідні дані для передачі до іншого процесу:
-
Створіть локальну змінну
messagePayload
. -
Визначте для неї тип
Map
, тобто ключі-значення. -
Передайте набір ключів-значень як
Map entries
у поляхKey
та Value. Зробити це можна наступним чином за допомогою функціїinitiator()
:-
ДРФО/РНОКПП
-
Key: drfo
-
Value: ${initiator().drfo}
-
-
ДРФО/РНОКПП
-
Key: edrpou
-
Value: ${initiator().edrpou}
-
-
ПІБ
-
Key: fullName
-
Value: ${initiator().fullName}
-
-
Ім’я користувача в системі
-
Key: userName
-
Value: ${initiator().userName}
-
-
-
-
3.4. Отримання даних з токена модератором для підтвердження реєстрації
Змоделюйте стартову подію повідомлення — Message Start Event.
Детальніше про Message Start Event ви можете переглянути на сторінці Моделювання та налаштування стартової події повідомлення. |
Ця подія повідомлення являє собою елемент у бізнес-процесі, який отримує повідомлення з даними (ПІБ
, РНОКПП
та ЄДРПОУ
з токена) про користувача до іншого учасника процесу або іншого процесу. У цьому випадку, вона описує отримання даних від заявника-ініціатора (особи, яка намагається зареєструватися) модератором для ручного підтвердження даних.
- Виконайте налаштування події наступним чином:
-
-
Визначте ідентифікатор події як
start_message_event
. Він буде використаний у наступній скрипт-задачі. -
У розділі Global message reference:
-
Оберіть
startModerationBpMessage
зі списку доступних. -
У полі
Name
продублюйте значенняstartModerationBpMessage
для зручності.
-
-
3.5. Скрипт для підготовки даних до відображення на UI-формі
Створіть скрипт-задачу (Script Task) та додайте Groovy-скрипт, який підготує дані для відображення на UI-формі процесу.
Відкрийте редактор скриптів та додайте наступний скрипт:
Скрипт для підготовки даних до відображення на UI-формі
set_transient_variable('payload', S(message_payload('start_message_event').data, 'application/json'))
Цей скрипт виконує наступні дії:
-
Витягує дані з повідомлення
start_message_event
та конвертує їх у формат JSON. Для цього використовується функціяmessage_payload('start_message_event').data
. Функція S забезпечує обробку JSON-формату. -
Після того, як дані перетворено на JSON, скрипт створює тимчасову змінну
payload
та присвоює їй значення цих даних. Функціяset_transient_variable()
використовується для створення тимчасової змінної процесу, яка зберігатиме зміннуpayload
.
3.6. Визначення бізнес-ключа процесу
Ця задача — сервісна задача (Service Task), яка використовує делегат Define process business key, що виконує певний код або логіку під час виконання цієї задачі.
Що таке бізнес-ключ?Бізнес-ключ або Ключ бізнес-процесу (Business Key) — це специфічний для домену ідентифікатор екземпляра бізнес-процесу у Camunda BPM. Він є додатковим атрибутом, що застосовується при моделюванні бізнес-процесів для їх однозначної ідентифікації, а також ідентифікації користувацьких задач процесу. |
За допомогою розширення БП задається вхідний параметр businessKey
. Цей параметр отримує значення з тимчасової змінної payload
, яка була створена раніше, та зокрема з атрибута fullName
.
Після виконання цієї задачі, бізнес-ключ процесу буде встановлено як значення fullName
із тимчасової змінної payload
.
У цьому контексті, сервісна задача отримує повне ім’я особи-заявника із JSON-даних, що були передані у повідомленні, та встановлює його як бізнес-ключ для поточного екземпляра процесу:
${payload.value.prop('fullName').value()}
Детальніше про бізнес-ключі ви можете дізнатися на сторінці Налаштування бізнес-ключів у бізнес-процесах. |
3.7. Перегляд даних для реєстрації модератором на UI-формі
Ця задача — користувацька задача (User Task) з ідентифікатором makeDecisionActivity
, яка призначена для виконання посадовою особою-модератором (candidateGroups="officer-moderator"
).
В задачі використовується параметр formKey
зі значенням selfregistration-decision
, який вказує на UI-форму, що має бути показана модератору для перегляду даних посадової особи-заявника та прийняття рішення про самореєстрацію.
За допомогою розширення-делегата User Form задається вхідний параметр Form data pre-population
, який отримує значення з тимчасової змінної "payload", визначеної у скрипті раніше. Цей параметр передає дані заявника до форми, який відображається модератору.
Після того, як модератор перегляне дані та прийме рішення, процес продовжується далі відповідно до вибору модератора (підтвердження або відхилення самореєстрації).
- Виконайте налаштування наступним чином:
-
-
У полі
Name
введіть назву користувацької задачі. -
Застосуйте шаблон делегата —
User Form
. -
У полі
ID
введіть ідентифікатор задачі —makeDecisionActivity
. -
У полі
Form key
визначте ключ для поєднання із відповідною змодельованою формою бізнес-процесу —selfregistration-decision
. -
У полі
Candidate roles
введіть роль посадової особи-модератора процесу, визначену у регламенті, —officer-moderator
. -
У полі
Form data pre-population
передайте дані на UI-форму як змінну ${payload}.
-
3.8. Таймер для прийняття рішення модератором щодо реєстрації
Це гранична подія (Timer Boundary Event), яка прикріплена до користувацької задачі makeDecisionActivity
. Ця подія містить визначення події таймера (timerEventDefinition
), яке встановлює таймер із тривалістю 2 хвилини (PT2M
).
Коли користувацька задача makeDecisionActivity
активується, таймер починає відлік 2 хвилин. Якщо модератор не приймає рішення протягом цього часу, таймер спрацьовує, і процес переходить до наступного кроку відповідно до альтернативного потоку (це означає, що користувач не буде зареєстрований).
- Виконайте налаштування наступним чином:
-
-
У полі Name вкажіть назву для події.
-
У розділі Timer:
-
У полі
Type
(Timer Definition Type
) вкажіть тип таймера —Duration
(тривалість).Детальніше про таймери — дивіться на сторінках: -
У полі
Value
вкажіть значення для таймера у певному форматі. Наприклад,PT2M
, тобто 2 хвилини.Ви можете налаштувати таймер, використовуючи стандартний формат ISO 8601
абоcron
-вираз.
-
-
3.9. Надсилання повідомлення про те, що рішення про автореєстрацію не прийнято (альтернативний потік)
Це кінцева подія (Message End Event), яка має визначення події повідомлення (messageEventDefinition
) і використовує делегат ${sendMessageDelegate}
, що відповідає за надсилання повідомлення.
Детальніше про Message End Event ви можете переглянути на сторінці Моделювання та налаштування кінцевої події повідомлення. |
Якщо процес доходить до цієї події, отже рішення про автореєстрацію не було прийнято (наприклад, через те, що спрацював таймер). У цьому випадку, подія надсилає повідомлення з інформацією про те, що рішення не було прийнято, до іншого процесу або учасника, використовуючи делегат sendMessageDelegate
. Інформація про ідентифікатор процесу, з якого було викликано цей процес (correlationProcessInstanceId
), передається як вхідний параметр.
Функція process_caller()
використовується для отримання інформації про той процес, який викликав поточний процес.
У нашому випадку функція отримує ідентифікатор (id
) процесу, який викликав поточний процес. Цей ідентифікатор передається як вхідний параметр correlationProcessInstanceId
для делегата sendMessageDelegate
, який надсилає повідомлення.
- Виконайте налаштування наступним чином:
-
-
У розділі Implementation вкажіть:
-
Тип —
Delegate expression
. -
Вираз —
${sendMessageDelegate}
. Змінна є імплементацією делегата.
-
-
У розділі Global message reference:
-
Оберіть
decisionOverdueMessage
зі списку доступних. -
У полі
Name
продублюйте значенняdecisionOverdueMessage
для зручності.
-
-
У розділі Inputs вкажіть вхідні дані для передачі до іншого процесу:
-
Створіть локальну змінну
correlationProcessInstanceId
. -
Визначте для неї тип
String or Expression
, тобто рядок або вираз. -
У полі
Value
передайте ідентифікатор процесу, який викликав поточний процес. Зробити це можна наступним чином за допомогою функціїprocess_caller()
:${process_caller().id}
-
-
3.10. Отримання повідомлення про те, що рішення про автореєстрацію не прийнято (альтернативний потік)
Ця подія є проміжною подією отримання повідомлення (Intermediate Message Catch Event) у процесі BPMN. Вона служить для очікування та перехоплення вхідного повідомлення, яке відправлено іншим процесом або учасником. Зазвичай такі події використовуються для синхронізації або координації між різними процесами чи учасниками у бізнес-процесі.
Детальніше про Intermediate Message Catch Event ви можете переглянути на сторінці Моделювання та налаштування проміжної події отримання повідомлення. |
- Виконайте налаштування події наступним чином:
-
У розділі Global message reference:
-
Оберіть
decisionOverdueMessage
зі списку доступних. -
У полі
Name
продублюйте значенняdecisionOverdueMessage
для зручності.
-
3.11. Виведення інформації про завершення процесу на форму (альтернативний потік)
Ця задача є користувацькою задачею (User Task) і призначена для надання інформації користувачеві про те, що процес реєстрації завершився через вичерпання часу, відведеного на прийняття рішення.
Ця задача призначена для ініціатора процесу (camunda:assignee="${initiator}"
), який є заявником. Форма, пов’язана з цією задачею, має ключ selfregistration-decision-overdue
(camunda:formKey="selfregistration-decision-overdue"
), який відображає форму з інформацією про завершення процесу по вичерпанню часу.
- Виконайте налаштування наступним чином:
-
-
У полі
Name
введіть назву користувацької задачі. -
Застосуйте шаблон делегата для цієї задачі — User Form.
-
Поєднайте користувацьку задачу із UI-формою за допомогою параметра
Form key
. Введіть значенняselfregistration-decision-overdue
. -
У полі
Assignee
вкажіть змінну для особи, якій призначається поточна задача, —${initiator}
.
-
Далі відбувається завершення процесу відповідно до кінцевої події в альтернативному потоці.
3.12. Підписання даних КЕП
Ця задача є користувацькою задачею (User Task) у бізнес-процесі BPMN і призначена для підпису рішення заявника за допомогою кваліфікованого електронного підпису (КЕП).
Ця задача призначається для користувача, який виконав задачу makeDecisionActivity
. Форма, пов’язана із цією задачею, має ключ selfregistration-sign-decision
, який відображає форму для підпису рішення КЕП. Вхідні дані для форми передаються із результатів форми задачі makeDecisionActivity
.
Після того, як користувач підпише рішення, процес продовжиться за основним потоком.
- Виконайте налаштування наступним чином:
-
-
У полі
Name
введіть назву користувацької задачі. -
Застосуйте шаблон делегата —
Officer Sign Task
. -
У полі
ID
введіть ідентифікатор задачі —signDecisionActivity
. -
У полі
Form key
визначте ключ для поєднання із відповідною змодельованою формою бізнес-процесу —selfregistration-sign-decision
. -
У полі
Assignee
вкажіть, кому призначається задача для виконання. Використайте для цього функціюcompleter()
:${completer('makeDecisionActivity').userName}
-
У полі
Form data pre-population
передайте дані на UI-форму через функціюsubmission()
:${submission('makeDecisionActivity').formData}.
-
3.13. Підписання даних системним ключем
Ця задача є сервісною задачею (Service Task) у бізнес-процесі BPMN і призначена для підпису даних системним ключем, тобто автоматичним підписом з боку системи.
Ця задача використовує делегат digitalSystemSignatureDelegate
, який відповідає за логіку підпису системним ключем.
Вхідні параметри для цього завдання включають x_access_token
та payload
. x_access_token
отримується від користувача, який завершив задачу signDecisionActivity
, а payload
містить дані форми з результатів цього завдання.
Задача генерує вихідний параметр subject_system_signature_ceph_key
, який містить згенерований ключ зберігання системного підпису.
- Виконайте налаштування наступним чином:
-
-
Змоделюйте сервісну задачу (Service Task) для підпису даних системним ключем.
-
Використовуйте делегат System signature by DSO service із каталогу шаблонів для накладання системного підпису.
-
Вхідні дані передайте функцію submission у відповідному полі:
${submission('signDecisionActivity').formData}
-
Передайте токен виконавця останньої користувацької задачі у бізнес-процесі:
${completer('signDecisionActivity').accessToken}
. -
Відповідь запишіть у змінну
subject_system_signature_ceph_key
.
-
3.14. Створення запису у базі даних реєстру
Ця задача створює користувача в системній таблиці бази даних реєстру. Вона використовує шаблон делегата dataFactoryConnectorCreateDelegate
для виконання дій. Задача отримує вхідні параметри з попередніх задач, такі як ключі та дані форми, та передає їх для створення користувача.
- Вхідні параметри включають:
-
-
x_digital_signature_derived_ceph_key
— ключ, що походить від підписаного документа. -
resource
— ресурс, що буде створений (у цьому випадку,officers
). -
x_access_token
— токен доступу виконавця задачіsignDecisionActivity
. -
x_digital_signature_ceph_key
— системний ключ документа із підписом від задачіsignDecisionActivity
. -
payload
— дані форми з завданняsignDecisionActivity
.
-
- Виконайте налаштування наступним чином:
-
-
Створіть сервісну задачу (Service Task).
-
Використовуйте делегат Create entity in data factory, щоб створити сутність у базі даних.
-
Вкажіть ресурс/API-ендпоінт
officers
, що відповідає назві таблиці із даними, яку ви визначили при створенні моделі даних реєстру —officers
. -
Вхідні дані передайте через функцію
submission()
у відповідному полі:${submission('signDecisionActivity').formData}
-
Передайте токен виконавця останньої користувацької задачі у бізнес-процесі:
${completer('signDecisionActivity').accessToken}
. -
Вкажіть джерело системного підпису. Для цього використовуйте функцію
sign_submission()
:
${sign_submission('signDecisionActivity').signatureDocumentId}
. -
Вкажіть як змінну
${subject_system_signature_ceph_key}
ключ Ceph-документа, який містить інформацію про підписані дані. -
Запишіть відповідь до результівної змінної, наприклад,
response
.
-
3.15. Визначення статусу виконання процесу
Ця задача встановлює результат виконання процесу "Самореєстрацію пройдено" за допомогою шаблону делегата defineBusinessProcessStatusDelegate
. Задача приймає вхідні дані з попередньої задачі та передає результат до наступного етапу процесу.
- Встановіть результат виконання:
-
-
Оберіть шаблон делегата Define business process status у списку доступних.
-
У полі Status введіть статус —
Самореєстрацію пройдено
.
-
3.16. Відправлення рішення назад до процесу заявника реєстрації
Ця задача є завершальною подією (Message End Event) у процесі підтвердження самореєстрації модератором. Вона виконує наступні функції:
-
Встановлює зв’язок з процесом реєстранта через параметр
correlationProcessInstanceId
, що отримує значення з ID процесу-викликача (${process_caller().id}
). -
Передає дані про рішення відносно самореєстрації через параметр
messageData
. Цей параметр містить відомості про позитивне чи негативне рішення (${submission('signDecisionActivity').formData.prop('selfregistrationDecision').value()}
). -
Використовує делегат
${sendMessageDelegate}
для відправки повідомлення з вищезазначеними даними.
Детальніше про Message End Event ви можете переглянути на сторінці Моделювання та налаштування кінцевої події повідомлення. |
- Виконайте наступні налаштування:
-
-
У розділі Implementation вкажіть:
-
Тип —
Delegate expression
. -
Вираз —
${sendMessageDelegate}
. Змінна є імплементацією делегата.
-
-
У розділі Global message reference:
-
Оберіть
decisionMessage
зі списку доступних. -
У полі
Name
продублюйте значенняdecisionMessage
для зручності.
-
-
У розділі Inputs вкажіть вхідні дані для передачі до іншого процесу:
-
Створіть локальну змінну
correlationProcessInstanceId
.-
Визначте для неї тип
String or Expression
, тобто рядок або вираз. -
У полі
Value
передайте ідентифікатор процесу, який викликав поточний процес. Зробити це можна наступним чином за допомогою функціїprocess_caller()
:${process_caller().id}
-
-
Створіть локальну змінну
messageData
.-
Визначте для неї тип
Map
, тобто ключі-значення. -
Передайте набір ключів-значень як
Map entries
у поляхKey
та Value. Зробити це можна наступним чином за допомогою функціїsubmission()
:-
Key: isDecisionPositive
(вказує на ключ до позитивного результату, який підтверджує реєстрацію посадової особи) -
Value: ${submission('signDecisionActivity').formData.prop('selfregistrationDecision').value()}
-
-
-
-
3.17. Отримання повідомлення про те, що рішення про автореєстрацію прийнято та записано до Фабрики даних
Ця подія є проміжною подією отримання повідомлення (Intermediate Message Catch Event) у процесі BPMN. Вона служить для очікування та перехоплення вхідного повідомлення, яке відправлено іншим процесом або учасником. Зазвичай такі події використовуються для синхронізації або координації між різними процесами чи учасниками у бізнес-процесі.
Детальніше про Intermediate Message Catch Event ви можете переглянути на сторінці Моделювання та налаштування проміжної події отримання повідомлення. |
- Виконайте налаштування події наступним чином:
-
У розділі Global message reference:
-
Оберіть
decisionMessage
зі списку доступних. -
У полі
Name
продублюйте значенняdecisionMessage
для зручності.
-
3.18. Моделювання XOR-шлюзу та додавання логіки через вирази умови
Змоделюйте XOR-шлюз, який на основі певної умови визначатиме, за яким потоком далі піде бізнес-процес.
Якщо рішення про реєстрацію негативне і передається повідомленням від процесу модератора як ключ ${!isDecisionPositive}
, тоді процес піде за альтернативним потоком, а користувач не пройде реєстрацію. Роль такого користувача не зміниться й залишиться unregistered-officer
.
Якщо рішення про реєстрацію позитивне і передається повідомленням від процесу модератора як ключ ${isDecisionPositive}
, тоді процес піде за основним потоком, а користувач пройде реєстрацію. Роль такого користувача зміниться у наступній сервісній задачі з unregistered-officer
на officer
.
3.19. Виведення інформації на форму про відсутність дозволу на реєстрацію (альтернативний потік)
Ця задача є користувацькою задачею (User Task) і призначена для надання інформації користувачеві про відсутність дозволу на реєстрацію.
Ця задача призначена для ініціатора процесу (camunda:assignee="${initiator}"
), який є заявником. Форма, пов’язана з цією задачею, має ключ selfregistration-denied-handmoderation
(camunda:formKey="selfregistration-denied-handmoderation"
), який відображає форму з інформацією про відсутність дозволу на реєстрацію.
- Виконайте налаштування наступним чином:
-
-
У полі
Name
введіть назву користувацької задачі. -
Застосуйте шаблон делегата для цієї задачі — User Form.
-
Поєднайте користувацьку задачу із UI-формою за допомогою параметра
Form key
. Введіть значенняselfregistration-denied-handmoderation
. -
У полі
Assignee
вкажіть змінну для особи, якій призначається поточна задача, —${initiator}
.
-
Далі встановлюється результат виконання, що реєстрацію не пройдено й відбувається завершення процесу відповідно до кінцевої події в альтернативному потоці.
3.20. Видалення ролі unregistered-officer та призначення ролі officer посадовій особі
Після підтвердження реєстрації, дані передаються до сервісної задачі, яка використовує делегат Save user roles
для перепризначення ролей користувачам та збереження їх до БД Keycloak.
Ця задача виконує наступні дії:
-
Видаляє роль
unregistered-officer
у користувача, який проходить самореєстрацію. -
Додає роль officer до користувача після успішної самореєстрації.
Задача використовує делегат ${keycloakSaveUserRoleConnectorDelegate}
, який взаємодіє з Keycloak для зміни ролей користувача. Інформація про ролі та інші параметри передаються через input-параметри:
-
realm
встановлюється якOFFICER
. -
roles
містить список ролей, які будуть додані користувачу (у цьому випадку —officer
). -
username
отримує значення імені користувача, який проходить самореєстрацію (${initiator().userName}
). -
roleType
встановлюється наALL ROLES
, що вказує на те, що зміни будуть застосовані до всіх ролей користувача.
Детальніше про делегат ви можете переглянути на сторінці Збереження ролей користувачів до Keycloak (Save user roles). |
3.21. Виведення на форму інформації по успішне завершення процесу реєстрації
Ця задача (User Task) відображає інформаційне повідомлення для користувача після успішної самореєстрації. Користувач повинен переглянути інформацію та підтвердити її перегляд. Задача використовує шаблон форми User form
та ключ форми selfregistration-success
для відображення відповідного інтерфейсу користувача. Задача призначена для виконання ініціатором процесу самореєстрації (${initiator}
).
- Виконайте наступні налаштування:
-
-
У полі
Name
введіть назву користувацької задачі. -
Застосуйте шаблон делегата для цієї задачі — User Form.
-
Поєднайте користувацьку задачу із UI-формою за допомогою параметра
Form key
. Введіть значенняselfregistration-success
. -
У полі
Assignee
вкажіть змінну для особи, якій призначається поточна задача, —${initiator}
.
-
На формі Однак, якщо час на погодження значно перевищує встановлений у таймері часовий поріг (наприклад, понад 30 хвилин), користувач автоматично вважатиметься таким, що "увійшов повторно" при наступному вході на форму, і інформація на ній вже не буде актуальною. У таких випадках ми рекомендуємо не використовувати User Form для повторного входу. Натомість краще змоделювати відправлення нотифікації до inbox Кабінету користувача із результатами погодження реєстрації. Для отримання додаткової інформації та деталей з цього приводу, будь ласка, зверніться до розділу Налаштування відправлення in-app повідомлень користувачам. |
3.22. Встановлення результату виконання та завершення процесу
У наступних задачах встановіть результат виконання процесу, використавши для цього сервісну задачу та делегат Define business process status, та закінчіть процес подією завершення (End event).