diff --git a/README.md b/README.md
index 79eeadd..592f0b8 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,7 @@
14. [Entity Relationship диаграммы и диаграммы классов](src/DynamicEntityRelationshipDiagrams)
15. [Динамическое изменение группировки компонент в представлении контекста](src/DynamicChangeOfContextGrouping)
16. [Репозиторий чатбота корпоративного ИИ](src/aichatbot)
+17. [BPMN нотация описания бизнес-процессов с использованием bpmnjs](src/bpmn)
## Разворачивание
diff --git a/src/bpmn/README.md b/src/bpmn/README.md
new file mode 100644
index 0000000..09d4c55
--- /dev/null
+++ b/src/bpmn/README.md
@@ -0,0 +1,76 @@
+## Пример использования возможностей плагина описания бизнес-процессов в BPMN нотации с использованием bpmnjs.
+
+### Цели примера
+- Создание модели бизнес-процессов в нотации BPMN (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.bpmn);
+- Автоматизированная обработка файлов XML, содержащих описание бизнес-процессов с целью:
+ - Формирования реестра бизнес-процессов;
+ - Формирования реестра функциональных дорожек и объектов бизнес-процессов;
+ - Контроля замкнутости бизнес-процессов с детализацией до объектов бизнес-процессов;
+- Использование множественных зависимостей источников данных (datasets) (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.datasets).
+- Использование механизма функций (functions) (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.functions).
+
+### Чего нет в примере
+- Архитектурных валидаторов (validators) (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.rules.validators), но реализован специализированный отчет для проверки замкнутости;
+- Специализированных сущностей (entities) (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.flex_metamodel.entities), расширяющих стандартную метамодель, например, "Функциональныве дорожки" и "Объекты данных" бизнес-процессов.
+
+### Файловая структура примера
+
+```
+|- examples - Каталог с файлами бизнес-процессов
+| |- test10_1.xml - Описание бизнес-процесса 10.1
+| |- test10_2.xml - Описание бизнес-процесса 10.2
+| |- test10_3.xml - Описание бизнес-процесса 10.3
+|- templates - Шаблоны контекстов
+| |- bpmn.md - Описание отчета "20. Контроль заполнения бизнес-процессов"
+| |- business_processes_card.md - Расширенная карточка бизнес-процесса со схемой, входящими и исхоящими процессами
+|- business_processes.yaml - Расширение атрибутного состава бизнес-процесса, чтобы была возможность использовать дополнительные свойства, которых нет в XML файлах
+|- business_processes_extended_card.yaml - Расширенная карточка бизнес-процесса, созданная через entities
+|- datasets.yaml - Используемые наборы данных
+|- docs.yaml - Используемые документы
+|- functions.yam - Используемые документы
+|- README.md - Описание репозитория
+```
+### Особенности реализации в текущей версии плагина
+- В качестве уникального идентификатора используется текстовое представление бизнес-процессов, функциональных дорожек и объектов бизнес-процессов, т.к. файлы с описанием бизнес-процессов между собой никак не связаны, соответственно отсутствует возможность использовать идентификаторы, генерируемые плагином (они гарантировано уникальные только в пределах одного файла);
+- Описание бизнес-процессов из XML файла напрямую не подключается к озеру данных, а предварительно преобразуется в источник данных (dataset) единого вида, используя универсальный подход (см. `datasets.yaml`):
+ - `business_processes.dataset.bp_10_1`
+ - `business_processes.dataset.bp_10_2`
+ - `business_processes.dataset.bp_10_3`
+- Источники данных (dataset) каждого бизнес-процесса объединяются в единый источник данных `business_processes.dataset.main_dataset` через механизм множественных зависимостей (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.datasets) и уже он используется во всех «запросах», в том числе подключатеся к озеру данных;
+- Для просмотра карточки бизнес-процесса создана отдельная сущность (entities);
+- Во всех отчетах реализованы гиперссылки на расширенную карточку бизнес-процесса.
+
+### Примеры
+
+#### Реестр бизнес-процессов
+
+
+
+#### Расширенная карчтока бизнес-процесса с возможностью редактирования
+
+
+
+#### Реестр объектов бизнес-процессов
+
+
+
+#### Отчет по ошибкам замкнуточти бизнес-процессов
+
+
+
+Описание ошибок "Замкнутость бизнес-процессов"
+
+| № строки | Ошибка | Способ устранения |
+|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|
+| 1 | В бизнес-процессе "УД.10.2" указан входящий бизнес-процесс "УД.10.два", который не определен | Добавить новый бизнес-процесс, в котором указать связь с 10.2 |
+| 2 | В бизнес-процессе "УД.10.1" указан исходящий бизнес-процесс "УД.10.2" с объектом "Рамочный договор депозита в статусе «Утвержден»", НО, в "УД.10.2" нет соответствующего входа | В бизнес-процесс "УД.10.2" добавить вход "УД.10.1" с объектом "Рамочный договор депозита в статусе «Утвержден»" |
+
+Описание ошибок "Входящие или исходящие процессы без объектов или связей с шагами основного процесса"
+
+| № строки | Ошибка | Способ устранения |
+|----------|-----------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------|
+| 1 | В бизнес-процессе "УД.10.3" есть входящий бизнес-процесс "БП без объектов" без указания объекта | Добавить объект входящего бизнес-процесса по аналогии с "УД.10.1" |
+| 2 | В бизнес-процессе "УД.10.3" есть входящий бизнес-процесс "БП без связей" без указания связи (зашисший) | Добавить объект входящего бизнес-процесса и указать шаг процесса, с которым связан |
+
+## Авторские права
+- Автор примера: https://t.me/SultanovStanislav
diff --git a/src/bpmn/business_processes.yaml b/src/bpmn/business_processes.yaml
new file mode 100644
index 0000000..e43c1ea
--- /dev/null
+++ b/src/bpmn/business_processes.yaml
@@ -0,0 +1,38 @@
+docs:
+
+ test1:
+ source: examples/test10_1.xml
+ type: bpmnjs
+ extension:
+ isgroup: false
+ code: УД.10.1
+ description: "Процесс «Регистрация рамочного договора депозита» представляет собой последовательность действий,
+ направленных на оформление и учёт договора о депозите между банком и клиентом"
+ state: Используется
+ state_update_date: 2024.03.01
+ division_owner: Финансовый департамент
+
+ test2:
+ source: examples/test10_2.xml
+ type: bpmnjs
+ extension:
+ isgroup: false
+ code: УД.10.2
+ description: "Процесс «Регистрация спецификации рамочного договора депозита» представляет собой последовательность действий,
+ направленных на оформление и учёт подчиненных рамочному договору договоров депозита банком и клиентом"
+ state: Используется
+ state_update_date: 2024.03.01
+ division_owner: Финансовый департамент
+
+ test3:
+ source: examples/test10_3.xml
+ type: bpmnjs
+ extension:
+ isgroup: false
+ code: УД.10.3
+ description: "Корректировка рамочного договора депозита — это процесс внесения изменений и дополнений в ранее
+ заключённый договор о депозите между банком и клиентом. Целью корректировки может быть изменение условий депозита,
+ срока его действия, процентной ставки, порядка начисления процентов и других параметров."
+ state: Используется
+ state_update_date: 2022.03.01
+ division_owner: Юридический департамент
\ No newline at end of file
diff --git a/src/bpmn/business_processes_extended_card.yaml b/src/bpmn/business_processes_extended_card.yaml
new file mode 100644
index 0000000..8ec3cfc
--- /dev/null
+++ b/src/bpmn/business_processes_extended_card.yaml
@@ -0,0 +1,32 @@
+entities:
+
+ extended_business_processes_card:
+ title: Расширенная карточка бизнес-процесса
+ description: "Расширенная карточка бизнес-процесса"
+ presentations:
+ blank:
+ title: Расширенная карточка бизнес-процесса
+ type: markdown
+ template: templates/business_processes_card.md
+ source: >
+ (
+ $id := $params.id;
+ $name := $params.name;
+
+ /* Документа с описанием бизнес-процесса выполянется по ключу, чтобы не использовать docs.$spread() + [отбор по ID], */
+ /* так как на большом объеме озера данных будут наблюдаться задржки обработки данных */
+
+ $business_processes_obj := $lookup(docs, $id).extension;
+
+ /* Итоговая выборака набора данных */
+
+ {
+ "doc_id": $id,
+ "title": $name,
+ "description": $business_processes_obj.description,
+ "state": $business_processes_obj.state,
+ "state_update_date": $business_processes_obj.state_update_date,
+ "division_owner": $business_processes_obj.division_owner
+ }
+
+ )
\ No newline at end of file
diff --git a/src/bpmn/datasets.yaml b/src/bpmn/datasets.yaml
new file mode 100644
index 0000000..379519c
--- /dev/null
+++ b/src/bpmn/datasets.yaml
@@ -0,0 +1,147 @@
+datasets:
+
+ # Получение описания бизнес-процесса 10.1 в виде объекта
+ business_processes.dataset.bp_10_1:
+ origin:
+ bpmnjs: examples/test10_1.xml
+ datalake: "($)"
+ origin1:
+ source: >
+ (
+ $GetBusinessProcessEntities(bpmnjs.$, $GetBusinessProcessLink(datalake, $self));
+ )
+
+ # Получение описания бизнес-процесса 10.2 в виде объекта
+ business_processes.dataset.bp_10_2:
+ origin:
+ bpmnjs: examples/test10_2.xml
+ datalake: "($)"
+ source: >
+ (
+ $GetBusinessProcessEntities(bpmnjs.$, $GetBusinessProcessLink(datalake, $self));
+ )
+
+ # Получение описания бизнес-процесса 10.3 в виде объекта
+ business_processes.dataset.bp_10_3:
+ origin:
+ bpmnjs: examples/test10_3.xml
+ datalake: "($)"
+ source: >
+ (
+ $GetBusinessProcessEntities(bpmnjs.$, $GetBusinessProcessLink(datalake, $self));
+ )
+
+ # Основной набор данных с бизнес-процессами, используемый во всх прочих наборах данных и документах. Внути origin
+ # определяются (перечисляются) наборы с описанием бизнес-процессов
+ business_processes.dataset.main_dataset:
+ origin:
+ bp_10_1: business_processes.dataset.bp_10_1
+ bp_10_2: business_processes.dataset.bp_10_2
+ bp_10_3: business_processes.dataset.bp_10_3
+ source: >
+ (
+ [bp_10_1, bp_10_2, bp_10_3];
+ )
+
+ # Ошибки замкнутости бизнес-процессов
+ business_processes.dataset.business_process_closure_errors:
+ origin:
+ datalake: business_processes.dataset.main_dataset
+ source: >
+ (
+ /* Бизнес-процессы */
+ $datalake := datalake;
+
+ $sub_process_data_objects := $datalake.subProcess.data_objects.(
+ {
+ "business_process_id": %.%.business_process_id, /* ID процесса */
+ "business_process_name": %.%.business_process_name, /* Имя процесса */
+ "business_process_link": %.%.business_process_link, /* Ссылка на документ (бизнес-процесс) */
+ "sub_process_id": %.id, /* ID связанного процесса (входящего или исходящего) */
+ "sub_process_name": %.name, /* Имя связанного процесса (входящего или исходящего) */
+ "sub_process_is_incoming": %.is_incoming, /* Признак, что связанных процесс входящий */
+ "data_object_id": data_object_id, /* ID объекта связанного процесса */
+ "data_object_name": data_object_name /* Имя объекта связанного процесса */
+ }
+ )^(business_process_id);
+
+ /* Поиск связанного процесса, при этом поиск выполняется по следущему принципу:
+ - Имя связанного процесса (sub_process_name) используется для поиска в имени основного (business_process_name) и наоборот
+ - Имя объекта данных (data_object_name) должно совпадать
+ - Если связанный процесса входящий, то выполняется поиск исходящего процесса (sub_process_is_incoming) */
+ $FindLinkedProcess := function($sub_process_name, $business_process_name, $data_object_name, $sub_process_is_incoming)
+ {(
+
+ $exists($sub_process_data_objects[business_process_name=$sub_process_name
+ and sub_process_is_incoming = $sub_process_is_incoming
+ and data_object_name = $data_object_name
+ and sub_process_name = $business_process_name])
+
+ )};
+
+ /* Итоговая выборака набора данных */
+ [$sub_process_data_objects.(
+ {
+ "business_process_id": business_process_id, /* ID процесса */
+ "business_process_name": business_process_name, /* Имя процесса */
+ "business_process_link": business_process_link, /* Ссылка на документ (бизнес-процесс) */
+ "sub_process_id": sub_process_id, /* ID связанного процесса (входящего или исходящего) */
+ "sub_process_name": sub_process_name, /* Имя связанного процесса (входящего или исходящего) */
+ "sub_process_is_incoming": sub_process_is_incoming, /* Признак, что связанных процесс входящий */
+ "data_object_id": data_object_id, /* ID объекта связанного процесса */
+ "data_object_name": data_object_name, /* Имя объекта связанного процесса */
+ "is_valid": $FindLinkedProcess(sub_process_name, business_process_name, data_object_name, (sub_process_is_incoming=true ? false : true))
+ }[is_valid=false]
+
+ )];
+
+ )
+
+ # Входящие или исходящие процессы без объектов или связей с шагами основного процесса
+ business_processes.dataset.business_processes_without_objects_or_links:
+ origin:
+ datalake: business_processes.dataset.main_dataset
+ source: >
+ (
+ /* Бизнес-процессы */
+ $datalake := datalake;
+
+ /* Итоговая выборака набора данных */
+ [$sub_process_data_objects := $datalake.subProcess.(
+ {
+ "business_process_id": %.business_process_id, /* ID процесса */
+ "business_process_name": %.business_process_name, /* Имя процесса */
+ "business_process_link": %.business_process_link, /* Ссылка на документ (бизнес-процесс) */
+ "sub_process_id": id, /* ID связанного процесса (входящего или исходящего) */
+ "sub_process_name": name, /* Имя связанного процесса (входящего или исходящего) */
+ "sub_process_is_incoming": is_incoming, /* Признак, что связанных процесс входящий */
+ "is_valid": $exists(data_objects)
+ }[is_valid=false]
+ )^(business_process_id)];
+
+ )
+
+ # Реестр (плоский список) бизнес-процессов
+ business_processes.dataset.business_processes_list:
+ origin:
+ datalake: business_processes.dataset.main_dataset
+ source: >
+ (
+ /* Бизнес-процессы */
+ $datalake := datalake;
+
+ /* Путь к расширенной карточке бизнес-процесса */
+ $path_of_extended_card := "/entities/extended_business_processes_card/blank?id=";
+
+ /* Итоговая выборака набора данных */
+ [$business_processes_list := $datalake.(
+ {
+ "business_process_id": business_process_id, /* ID процесса */
+ "business_process_name": business_process_name, /* Имя процесса */
+ "business_process_link": business_process_link, /* Ссылка на документ (бизнес-процесс) */
+ "business_process_card": $path_of_extended_card & $replace(business_process_link, "/docs/", "") /* Ссылка расширенную карточку (бизнес-процесс) */
+ & "&name=" & business_process_name
+ }
+ )^(business_process_name)];
+
+ )
\ No newline at end of file
diff --git a/src/bpmn/dochub.yaml b/src/bpmn/dochub.yaml
new file mode 100644
index 0000000..3019f50
--- /dev/null
+++ b/src/bpmn/dochub.yaml
@@ -0,0 +1,6 @@
+imports:
+ - docs.yaml
+ - datasets.yaml
+ - functions.yaml
+ - business_processes.yaml
+ - business_processes_extended_card.yaml
\ No newline at end of file
diff --git a/src/bpmn/docs.yaml b/src/bpmn/docs.yaml
new file mode 100644
index 0000000..e799aaf
--- /dev/null
+++ b/src/bpmn/docs.yaml
@@ -0,0 +1,117 @@
+docs:
+
+ # Реестр бизнес-процессов
+ business_processes_list:
+ source: business_processes.dataset.business_processes_list
+ location: "10. Реестр бизнес-процессов"
+ type: table
+ headers:
+ - value: business_process_name
+ text: Бизнес-процесс
+ link: business_process_card
+
+ # Контроль заполнения бизнес-процессов
+ business_process_main_card:
+ source: templates/business_processes_card.md
+ type: markdown
+
+ # Контроль заполнения бизнес-процессов
+ business_process_control_of_filling:
+ source: templates/bpmn.md
+ type: markdown
+ location: "20. Контроль заполнения бизнес-процессов"
+
+ # Ошибки замкнутости бизнес-процессов
+ business_process_closure_errors:
+ source: business_processes.dataset.business_process_closure_errors
+ type: table
+ headers:
+ - value: business_process_name
+ text: Исходный бизнес-процесс
+ link: business_process_link
+ - value: sub_process_name
+ text: Связанный бизнес-процесс
+ - value: data_object_name
+ text: Объект связанного бизнес-процесс
+ - value: sub_process_is_incoming
+ text: Это входящий
+
+ # Входящие или исходящие процессы без объектов или связей с шагами основного процесса
+ business_process_without_objects_or_links:
+ source: business_processes.dataset.business_processes_without_objects_or_links
+ type: table
+ headers:
+ - value: business_process_name
+ text: Исходный бизнес-процесс
+ link: business_process_link
+ - value: sub_process_name
+ text: Связанный бизнес-процесс
+ - value: sub_process_is_incoming
+ text: Это входящий
+
+ # Входящие или исходящие процессы без объектов или связей с шагами основного процесса
+ business_processes.doc.sub_process:
+ origin:
+ datalake: business_processes.dataset.main_dataset
+ type: table
+ headers:
+ - value: sub_process_name
+ text: Бизнес-процесс
+ link: sub_process_link
+ source: >
+ (
+ /* Входящие параметры */
+ $doc_id := $params.doc_id;
+ $incoming := $params.incoming = "true" ? true : false;
+
+ /* Бизнес-процессы */
+ $datalake := datalake;
+
+ /* Получение ссылки расширенную карточку (бизнес-процесс) */
+ $GetSubBusinessProcessLink := function($name) {(
+ $link := $datalake[business_process_name=$name].business_process_link;
+ $link := "/entities/extended_business_processes_card/blank?id=" & $replace($link, "/docs/", "") & "&name=" & $name
+ )};
+
+ /* Итоговая выборака набора данных */
+ [$distinct($datalake.subProcess.(
+ {
+ "doc_id": $replace(%.business_process_link, "/docs/", ""),
+ "sub_process_link": $GetSubBusinessProcessLink(name), /* Ссылка расширенную карточку (бизнес-процесс) */
+ "sub_process_name": name, /* Имя связанного процесса (входящего или исходящего) */
+ "sub_process_is_incoming": is_incoming /* Признак, что связанных процесс входящий */
+ }
+ )[doc_id=$doc_id and sub_process_is_incoming = $incoming])];
+
+ )
+
+ # Функциональные дорожки (роли)
+ business_processes.doc.lanes:
+ origin:
+ datalake: business_processes.dataset.main_dataset
+ type: table
+ location: "30. Функциональные дорожки (роли)"
+ headers:
+ - value: item_name
+ text: Функциональная дорожка
+ source: >
+ (
+ /* Итоговая выборака набора данных */
+ [$distinct(datalake.lanes.( {"item_name": item_name} ))];
+ )
+
+ # Функциональные дорожки (роли)
+ business_processes.doc.data_objects:
+ origin:
+ datalake: business_processes.dataset.main_dataset
+ type: table
+ location: "40. Объекты данных бизнес-процессов"
+ headers:
+ - value: item_name
+ text: Объекты данных
+ source: >
+ (
+ /* Итоговая выборака набора данных */
+ [$distinct(datalake.data_objects.( {"item_name": item_name} ))];
+
+ )
\ No newline at end of file
diff --git a/src/bpmn/examples/test10_1.xml b/src/bpmn/examples/test10_1.xml
new file mode 100644
index 0000000..0a73f9b
--- /dev/null
+++ b/src/bpmn/examples/test10_1.xml
@@ -0,0 +1,385 @@
+
+
+
+
+
+ Создан новый рамочный договор
+
+
+
+ При отправке на согласование выполнется:
+ - Контроль заполнения обязательных атрибутов:
+- Контроль лимитов финансовой ответственности;
+- Лимит суммы размещения.
+
+В случае не прохождения контролей версия договора отправляется на доработку инициатору договора.
+
+
+
+
+
+
+ Activity_0jid41e
+ Activity_1bagvz5
+ Gateway_1ots68n
+ Activity_0l7y9fe
+
+
+ Activity_0sy26oi
+ Gateway_0ltuexa
+ Activity_1vwxjm7
+
+
+ Activity_0aak9i9
+ Event_1m8d26s
+ Activity_006i7ta
+
+
+
+ Flow_159gfnp
+ Flow_0bezxko
+
+ DataObjectReference_1v62kk1
+
+
+
+ Flow_159gfnp
+
+
+
+
+
+
+
+
+
+ Flow_0bezxko
+ Flow_0aqejrl
+
+
+ DataObjectReference_1v62kk1
+ Property_1h1dlcu
+
+
+ DataObjectReference_0w0aoh3
+
+
+
+
+
+ Flow_0aqejrl
+ Flow_1vmdee8
+
+
+ DataObjectReference_0w0aoh3
+ Property_0xfl8dq
+
+
+ DataObjectReference_1u5vmk8
+
+
+ DataObjectReference_0dnesef
+
+
+
+
+
+ Flow_1vmdee8
+ Flow_0lj7izl
+ Flow_0t7b0pe
+
+
+
+
+
+ Flow_0lj7izl
+
+
+ DataObjectReference_1u5vmk8
+ Property_0scepk3
+
+
+
+ Flow_0t7b0pe
+ Flow_050n0nx
+
+
+ DataObjectReference_0dnesef
+ Property_13y8hp4
+
+
+ DataObjectReference_08hl2bj
+
+
+ DataObjectReference_07evml4
+
+
+
+ Flow_0y3wyl4
+
+
+ DataObjectReference_08hl2bj
+ Property_15tw7xn
+
+
+
+
+
+ Flow_050n0nx
+ Flow_0y3wyl4
+ Flow_0xuoejs
+
+
+
+
+ Flow_0xuoejs
+
+
+ DataObjectReference_07evml4
+ Property_0d30xbo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/bpmn/examples/test10_2.xml b/src/bpmn/examples/test10_2.xml
new file mode 100644
index 0000000..aa18670
--- /dev/null
+++ b/src/bpmn/examples/test10_2.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+ Event_0fze5kl
+ Activity_1r1hy24
+ Event_0ghl5gj
+ Activity_1a0oabv
+
+
+
+
+
+ Flow_0epoivd
+
+ DataObjectReference_0haxmco
+
+
+
+
+ Flow_0vtyd38
+
+
+ Flow_0vtyd38
+ Flow_0epoivd
+ Flow_1fio0n3
+
+
+ DataObjectReference_0haxmco
+ Property_1hbmsuc
+
+
+
+ Flow_1fio0n3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/bpmn/examples/test10_3.xml b/src/bpmn/examples/test10_3.xml
new file mode 100644
index 0000000..42b7199
--- /dev/null
+++ b/src/bpmn/examples/test10_3.xml
@@ -0,0 +1,486 @@
+
+
+
+
+
+
+
+
+ Activity_0aak9i9
+ Event_1m8d26s
+ Activity_006i7ta
+ Activity_1jw29gt
+ Activity_1oyje4z
+ Activity_1q0ohjp
+ Activity_1pcu61v
+
+
+ Activity_0sy26oi
+ Gateway_0ltuexa
+ Activity_1vwxjm7
+
+
+ Activity_0jid41e
+ Activity_1bagvz5
+ Gateway_1ots68n
+ Activity_0l7y9fe
+
+
+
+ Flow_159gfnp
+ Flow_0fsm8od
+ Flow_08yxbmz
+ Flow_0bezxko
+
+
+ DataObjectReference_1k2zjks
+ Property_0lrj6sk
+
+
+ DataObjectReference_0ta3q4c
+ Property_0lrj6sk
+
+
+ DataObjectReference_1v62kk1
+
+
+
+ Flow_159gfnp
+
+
+
+
+
+
+ Flow_0aqejrl
+ Flow_1vmdee8
+
+
+ DataObjectReference_0w0aoh3
+ Property_0xfl8dq
+
+
+ DataObjectReference_1u5vmk8
+
+
+ DataObjectReference_0dnesef
+
+
+
+
+
+ Flow_1vmdee8
+ Flow_0lj7izl
+ Flow_0t7b0pe
+
+
+
+
+ Flow_0bezxko
+ Flow_1ib7y07
+ Flow_0aqejrl
+
+
+ DataObjectReference_1v62kk1
+ Property_1h1dlcu
+
+
+ DataObjectReference_0w0aoh3
+
+
+
+
+
+
+
+
+
+ Flow_0lj7izl
+
+
+ DataObjectReference_1u5vmk8
+ Property_0scepk3
+
+
+
+ Flow_0t7b0pe
+ Flow_050n0nx
+
+
+ DataObjectReference_0dnesef
+ Property_13y8hp4
+
+
+ DataObjectReference_08hl2bj
+
+
+ DataObjectReference_07evml4
+
+
+
+ Flow_0y3wyl4
+
+
+ DataObjectReference_08hl2bj
+ Property_15tw7xn
+
+
+
+
+
+ Flow_050n0nx
+ Flow_0y3wyl4
+ Flow_0xuoejs
+
+
+
+
+ Flow_0xuoejs
+
+
+ DataObjectReference_07evml4
+ Property_0d30xbo
+
+
+
+
+
+
+ Flow_0fsm8od
+
+ DataObjectReference_1k2zjks
+
+
+
+
+
+
+
+ Flow_08yxbmz
+
+ DataObjectReference_0ta3q4c
+
+
+
+
+
+
+ Flow_1ib7y07
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/bpmn/functions.yaml b/src/bpmn/functions.yaml
new file mode 100644
index 0000000..181bedb
--- /dev/null
+++ b/src/bpmn/functions.yaml
@@ -0,0 +1,83 @@
+functions:
+
+ GetBusinessProcessLink:
+ title: Получение ссылки на документ с бизнес-процессом bpmnjs
+ params:
+ - alias: datalake
+ title: $
+ required: true
+ - alias: self
+ title: $self
+ required: true
+ result:
+ type: string
+ code: >
+ (
+ $doc_id := self.origin.bpmnjs;
+ $result := "/docs/" & datalake.docs.$spread().({"id": $keys()[0], "source": *.source})[source=$doc_id].id;
+ )
+
+ GetBusinessProcessEntities:
+ title: Получение описание бизнес-процесса как объекта
+ params:
+ - alias: business_processes
+ title: Бизнес-процесс
+ required: true
+ - alias: doc_link
+ title: Ссылка на бизнес-процесс как объект архитектурного репозитория, "/docs/[ключ]" для возможности отображение гиперссылки
+ required: true
+ result:
+ type: object
+ code: >
+ (
+ $doc_link := doc_link;
+ $definitions := business_processes."definitions".*;
+
+ /* Универсальный метед получения описания сущностей схемы, имеющий структуру id и name например,
+ -
+ - */
+ $GetEntities := function($data) {(
+ $data.({ "item_id": id, "item_name": $replace(name, "\n", " ") })
+ )};
+
+ /* Входящие и исходящие процессы только с ID объектов данных */
+ $sub_processes := $definitions."subProcess".(
+ {
+ "id": *.$.id,
+ "name": $replace(*.$.name, "\n", " "),
+ "is_incoming": $exists(outgoing),
+ "data_objects": $exists(outgoing) ? dataOutputAssociation.targetRef.({"data_object_id": $}) : dataInputAssociation.sourceRef.({"data_object_id": $})
+ });
+
+ /* Объекты данных входящих и исходящих процессов */
+ $sub_process_data_objects := $definitions.dataObjectReference.*.$.( {"id": id, "name": name, "ref": dataObjectRef });
+
+ /* Получение наименование объекта данных входящих и исходящих процессов */
+ $GetSubProcessDataObjectName := function($id) {( $sub_process_data_objects[id=$id].name )};
+
+ /* Входящие и исходящие процессы с ID и наименованием объектов данных */
+ $sub_processes_total := $sub_processes.(
+ {
+ "id": id,
+ "name": name,
+ "is_incoming": is_incoming,
+ "data_objects": data_objects.(
+ {
+ "data_object_id": data_object_id,
+ "data_object_name": $GetSubProcessDataObjectName(data_object_id)
+ })
+ });
+
+ /* Итоговая выборака набора данных */
+ $definitions."participant"."$".(
+ {
+ "business_process_id": id, /* Идентификатор процесса */
+ "business_process_name": name, /* Наименование процесса */
+ "business_process_link": $doc_link,
+ "lanes": $GetEntities($definitions."laneSet"."lane"."$"), /* Роли (функциональые дорожки) */
+ "tasks": $GetEntities($definitions."task"."$"), /* Шаги процесса */
+ "data_objects": $GetEntities($definitions."dataObjectReference"."$"), /* Объекты данных */
+ "subProcess": $sub_processes_total /* Входящие и исходящие процессы */
+ });
+
+ )
\ No newline at end of file
diff --git a/src/bpmn/images/business_processes_errors.png b/src/bpmn/images/business_processes_errors.png
new file mode 100644
index 0000000..8d827e8
Binary files /dev/null and b/src/bpmn/images/business_processes_errors.png differ
diff --git a/src/bpmn/images/business_processes_extended_card.png b/src/bpmn/images/business_processes_extended_card.png
new file mode 100644
index 0000000..e13bf31
Binary files /dev/null and b/src/bpmn/images/business_processes_extended_card.png differ
diff --git a/src/bpmn/images/business_processes_list.png b/src/bpmn/images/business_processes_list.png
new file mode 100644
index 0000000..9f5e30d
Binary files /dev/null and b/src/bpmn/images/business_processes_list.png differ
diff --git a/src/bpmn/images/business_processes_objects.png b/src/bpmn/images/business_processes_objects.png
new file mode 100644
index 0000000..449e44d
Binary files /dev/null and b/src/bpmn/images/business_processes_objects.png differ
diff --git a/src/bpmn/templates/bpmn.md b/src/bpmn/templates/bpmn.md
new file mode 100644
index 0000000..e929440
--- /dev/null
+++ b/src/bpmn/templates/bpmn.md
@@ -0,0 +1,7 @@
+Замкнутость бизнес-процессов
+
+
+
+Входящие или исходящие процессы без объектов или связей с шагами основного процесса
+
+
diff --git a/src/bpmn/templates/business_processes_card.md b/src/bpmn/templates/business_processes_card.md
new file mode 100644
index 0000000..38b6af2
--- /dev/null
+++ b/src/bpmn/templates/business_processes_card.md
@@ -0,0 +1,17 @@
+# Бизнес-процесс "{{title}}"
+- **ID**: {{doc_id}}
+- **Описание:** {{description}}
+
+# Характеристики
+- **Статус:** {{state}}
+- **Дата актуализации:** {{state_update_date}}
+- **Ответственный за ведение:** {{division_owner}}
+
+## Схема бизнес-процесса
+
+
+## Входящие бизнес-процессы
+
+
+## Исходящие бизнес-процессы
+