Назначение: Сценарий процесса. Продукт: ShariX Open.
Для кого: Разработчик · Интегратор · Поддержка · Рецензент и приёмщик · Нейросеть.
Темы: Заказы → Исполнение · Заказы → Жизненный цикл · Заказы → Финализация оплаты.
Область: ShariX Open. Обработчик: open_service_request_process, тип SERVICE_REQUEST (2), статус PROCESS. 31.10.2026 исходники повторно получены из Git. Обе Python-копии совпали с новой канонической генерацией Blockly; проверены 11 исходников генераторов. Сам обработчик и его внешние действия не запускались. Выбранная версия и работающая установка проверяются отдельно.
Порядок обработки выполняемого заказа:
Обычная работа, подписка, блокирующий этап, платёжная финализация и CLOSED — разные части процесса.
BPMN описательные, isExecutable=false. Blockly фиксирует порядок вызовов и решений; исполняется сгенерированный Python. Модели Stage и их пользовательские действия принадлежат webservice_running, Orders и канонические переходы — dbsynce. Нейтральный integration port связывает их, не превращая Blockly в исполнитель внешних этапов.
Загрузка схемы…
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_service_process_logic" targetNamespace="urn:sharix:knowledge:handlers">
<bpmn:process id="process_Process_process" name="PROCESS: подписка, внешние действия, этапы и завершение" isExecutable="false">
<bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется канонический Python из Blockly.", "Сначала истечение подписки, затем queued intent, затем context и gate этапов.", "Обычный DONE ещё не означает CLOSED/оплату.", "PROCESS round без expires_at; интервал повторной отправки — не TTL ответа."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_process.py", "repository": "sharix-open-handlers-examples", "sha256": "f9d07ac1e8bad0c5a8dd55d81110777951e40a9a5fd370b7652386c016a6c1ce"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_process.json", "repository": "sharix-open-handlers-examples", "sha256": "1e6a24a5819d9ab3cc033516c134d97423def1ee8944352d8bea7dd8c966f99a"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/integration_ports.py", "repository": "sharix-open-backend", "sha256": "d079ec56e6709b29d7755e47d2a88d423235fe8eb1bf7a92851ae25d74bf1066"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/subscription_order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "c50ba934aa44e90125564caff8461788d8454747fe6b0196765c449ff48cd70f"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_pricing.py", "repository": "sharix-open-backend", "sha256": "c69ad3e6b34dc6b9b1aa3b554a9634a49a9ce7ecbb8bd6216e46832857995893"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "apps.py", "repository": "sharix-open-webservice-running", "sha256": "dde02f8eae3449c973b6c0ef66053daa7563116149ccd4da00511fdad50c8e46"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "services/order_execution.py", "repository": "sharix-open-webservice-running", "sha256": "748e6bc20a784347afa9396283e3086a03ccfde30bed86849d934f9588101a91"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/service_pricing_policy.py", "repository": "sharix-open-backend", "sha256": "d8dbaecea24161c385b40d32a7e8657f7a7ba8affc3cc22a89ce835c25a21aa6"}]}</bpmn:documentation>
<bpmn:laneSet id="process_Lanes_process">
<bpmn:lane id="process_Lane_worker" name="Порядок одного прохода Python">
<bpmn:flowNodeRef>process_start</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_expire</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_expired</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_subscription_end</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_intent</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_intent_ok</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_intent_end</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_context</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_gate</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_blocked</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_due</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_early</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_auto</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_planned</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_round</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_result</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_actual</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_wait</bpmn:flowNodeRef>
<bpmn:flowNodeRef>process_done</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="process_start" name="Свой PROCESS">
<bpmn:outgoing>process_Flow_0</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:serviceTask id="process_expire" name="expire-subscription">
<bpmn:incoming>process_Flow_0</bpmn:incoming>
<bpmn:outgoing>process_Flow_1</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:exclusiveGateway id="process_expired" name="details.expired=true?">
<bpmn:incoming>process_Flow_1</bpmn:incoming>
<bpmn:outgoing>process_Flow_2</bpmn:outgoing>
<bpmn:outgoing>process_Flow_3</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:endEvent id="process_subscription_end" name="Проход окончен">
<bpmn:incoming>process_Flow_2</bpmn:incoming>
</bpmn:endEvent>
<bpmn:serviceTask id="process_intent" name="Один queued finish / problem intent">
<bpmn:incoming>process_Flow_3</bpmn:incoming>
<bpmn:outgoing>process_Flow_4</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:exclusiveGateway id="process_intent_ok" name="Успех / stale?">
<bpmn:incoming>process_Flow_4</bpmn:incoming>
<bpmn:outgoing>process_Flow_5</bpmn:outgoing>
<bpmn:outgoing>process_Flow_6</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:endEvent id="process_intent_end" name="Текущая очередь освобождена">
<bpmn:incoming>process_Flow_5</bpmn:incoming>
</bpmn:endEvent>
<bpmn:serviceTask id="process_context" name="Загрузить order context">
<bpmn:incoming>process_Flow_6</bpmn:incoming>
<bpmn:outgoing>process_Flow_7</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:exclusiveGateway id="process_gate" name="Completion gate разрешает?">
<bpmn:incoming>process_Flow_7</bpmn:incoming>
<bpmn:outgoing>process_Flow_8</bpmn:outgoing>
<bpmn:outgoing>process_Flow_9</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:endEvent id="process_blocked" name="execution_stages + PROCESS_RECHECK">
<bpmn:incoming>process_Flow_8</bpmn:incoming>
</bpmn:endEvent>
<bpmn:exclusiveGateway id="process_due" name="planned_finish наступил?">
<bpmn:incoming>process_Flow_9</bpmn:incoming>
<bpmn:outgoing>process_Flow_10</bpmn:outgoing>
<bpmn:outgoing>process_Flow_11</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:endEvent id="process_early" name="provider_finish + RECHECK">
<bpmn:incoming>process_Flow_10</bpmn:incoming>
</bpmn:endEvent>
<bpmn:exclusiveGateway id="process_auto" name="AUTO_DONE включён?">
<bpmn:incoming>process_Flow_11</bpmn:incoming>
<bpmn:outgoing>process_Flow_12</bpmn:outgoing>
<bpmn:outgoing>process_Flow_14</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:serviceTask id="process_planned" name="finish-process planned; неуспех RECHECK">
<bpmn:incoming>process_Flow_12</bpmn:incoming>
<bpmn:outgoing>process_Flow_13</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:serviceTask id="process_round" name="Ручной round finish: проверить, send, снова проверить">
<bpmn:incoming>process_Flow_14</bpmn:incoming>
<bpmn:outgoing>process_Flow_15</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:exclusiveGateway id="process_result" name="winner?">
<bpmn:incoming>process_Flow_15</bpmn:incoming>
<bpmn:outgoing>process_Flow_16</bpmn:outgoing>
<bpmn:outgoing>process_Flow_18</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:serviceTask id="process_actual" name="finish-process actual; неуспех RECHECK, порог reset">
<bpmn:incoming>process_Flow_16</bpmn:incoming>
<bpmn:outgoing>process_Flow_17</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:endEvent id="process_wait" name="Иное: no_winner/лимит reset; повтор по настройке">
<bpmn:incoming>process_Flow_18</bpmn:incoming>
</bpmn:endEvent>
<bpmn:endEvent id="process_done" name="Успех/stale: handoff">
<bpmn:incoming>process_Flow_13</bpmn:incoming>
<bpmn:incoming>process_Flow_17</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="process_Flow_0" sourceRef="process_start" targetRef="process_expire" name="" />
<bpmn:sequenceFlow id="process_Flow_1" sourceRef="process_expire" targetRef="process_expired" name="" />
<bpmn:sequenceFlow id="process_Flow_2" sourceRef="process_expired" targetRef="process_subscription_end" name="Да" />
<bpmn:sequenceFlow id="process_Flow_3" sourceRef="process_expired" targetRef="process_intent" name="Нет" />
<bpmn:sequenceFlow id="process_Flow_4" sourceRef="process_intent" targetRef="process_intent_ok" name="" />
<bpmn:sequenceFlow id="process_Flow_5" sourceRef="process_intent_ok" targetRef="process_intent_end" name="Да" />
<bpmn:sequenceFlow id="process_Flow_6" sourceRef="process_intent_ok" targetRef="process_context" name="Нет" />
<bpmn:sequenceFlow id="process_Flow_7" sourceRef="process_context" targetRef="process_gate" name="" />
<bpmn:sequenceFlow id="process_Flow_8" sourceRef="process_gate" targetRef="process_blocked" name="Нет" />
<bpmn:sequenceFlow id="process_Flow_9" sourceRef="process_gate" targetRef="process_due" name="Да" />
<bpmn:sequenceFlow id="process_Flow_10" sourceRef="process_due" targetRef="process_early" name="Нет" />
<bpmn:sequenceFlow id="process_Flow_11" sourceRef="process_due" targetRef="process_auto" name="Да" />
<bpmn:sequenceFlow id="process_Flow_12" sourceRef="process_auto" targetRef="process_planned" name="Да" />
<bpmn:sequenceFlow id="process_Flow_13" sourceRef="process_planned" targetRef="process_done" name="" />
<bpmn:sequenceFlow id="process_Flow_14" sourceRef="process_auto" targetRef="process_round" name="Нет" />
<bpmn:sequenceFlow id="process_Flow_15" sourceRef="process_round" targetRef="process_result" name="" />
<bpmn:sequenceFlow id="process_Flow_16" sourceRef="process_result" targetRef="process_actual" name="Да" />
<bpmn:sequenceFlow id="process_Flow_17" sourceRef="process_actual" targetRef="process_done" name="" />
<bpmn:sequenceFlow id="process_Flow_18" sourceRef="process_result" targetRef="process_wait" name="Нет" />
</bpmn:process>
<bpmn:collaboration id="Collaboration_service_process_logic">
<bpmn:participant id="process_Pool_process" name="PROCESS: подписка, внешние действия, этапы и завершение" processRef="process_Process_process" />
</bpmn:collaboration>
<bpmndi:BPMNDiagram id="Diagram_service_process_logic">
<bpmndi:BPMNPlane id="Plane_service_process_logic" bpmnElement="Collaboration_service_process_logic">
<bpmndi:BPMNShape id="process_DI_Pool_process" bpmnElement="process_Pool_process" isHorizontal="true">
<dc:Bounds x="0.0" y="0.0" width="2770" height="1390" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_Lane_worker" bpmnElement="process_Lane_worker" isHorizontal="true">
<dc:Bounds x="30.0" y="0.0" width="2740" height="1390" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_start" bpmnElement="process_start">
<dc:Bounds x="132.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_expire" bpmnElement="process_expire">
<dc:Bounds x="365.0" y="65.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_expired" bpmnElement="process_expired">
<dc:Bounds x="725.0" y="75.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_subscription_end" bpmnElement="process_subscription_end">
<dc:Bounds x="1042.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_intent" bpmnElement="process_intent">
<dc:Bounds x="675.0" y="305.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_intent_ok" bpmnElement="process_intent_ok">
<dc:Bounds x="1035.0" y="315.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_intent_end" bpmnElement="process_intent_end">
<dc:Bounds x="1352.0" y="322.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_context" bpmnElement="process_context">
<dc:Bounds x="985.0" y="545.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_gate" bpmnElement="process_gate">
<dc:Bounds x="1345.0" y="555.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_blocked" bpmnElement="process_blocked">
<dc:Bounds x="1352.0" y="802.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_due" bpmnElement="process_due">
<dc:Bounds x="1655.0" y="555.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_early" bpmnElement="process_early">
<dc:Bounds x="1662.0" y="802.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_auto" bpmnElement="process_auto">
<dc:Bounds x="1965.0" y="555.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_planned" bpmnElement="process_planned">
<dc:Bounds x="2225.0" y="545.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_round" bpmnElement="process_round">
<dc:Bounds x="1915.0" y="1015.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_result" bpmnElement="process_result">
<dc:Bounds x="2275.0" y="1025.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_actual" bpmnElement="process_actual">
<dc:Bounds x="2535.0" y="1015.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_wait" bpmnElement="process_wait">
<dc:Bounds x="2282.0" y="1272.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="process_DI_done" bpmnElement="process_done">
<dc:Bounds x="2592.0" y="562.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="process_DI_Flow_0" bpmnElement="process_Flow_0">
<di:waypoint x="168.0" y="100.0" />
<di:waypoint x="365.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_1" bpmnElement="process_Flow_1">
<di:waypoint x="515.0" y="100.0" />
<di:waypoint x="725.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_2" bpmnElement="process_Flow_2">
<di:waypoint x="775.0" y="100.0" />
<di:waypoint x="1042.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_3" bpmnElement="process_Flow_3">
<di:waypoint x="750.0" y="125.0" />
<di:waypoint x="750.0" y="305.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_4" bpmnElement="process_Flow_4">
<di:waypoint x="825.0" y="340.0" />
<di:waypoint x="1035.0" y="340.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_5" bpmnElement="process_Flow_5">
<di:waypoint x="1085.0" y="340.0" />
<di:waypoint x="1352.0" y="340.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_6" bpmnElement="process_Flow_6">
<di:waypoint x="1060.0" y="365.0" />
<di:waypoint x="1060.0" y="545.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_7" bpmnElement="process_Flow_7">
<di:waypoint x="1135.0" y="580.0" />
<di:waypoint x="1345.0" y="580.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_8" bpmnElement="process_Flow_8">
<di:waypoint x="1370.0" y="605.0" />
<di:waypoint x="1370.0" y="802.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_9" bpmnElement="process_Flow_9">
<di:waypoint x="1395.0" y="580.0" />
<di:waypoint x="1655.0" y="580.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_10" bpmnElement="process_Flow_10">
<di:waypoint x="1680.0" y="605.0" />
<di:waypoint x="1680.0" y="802.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_11" bpmnElement="process_Flow_11">
<di:waypoint x="1705.0" y="580.0" />
<di:waypoint x="1965.0" y="580.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_12" bpmnElement="process_Flow_12">
<di:waypoint x="2015.0" y="580.0" />
<di:waypoint x="2225.0" y="580.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_13" bpmnElement="process_Flow_13">
<di:waypoint x="2375.0" y="580.0" />
<di:waypoint x="2592.0" y="580.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_14" bpmnElement="process_Flow_14">
<di:waypoint x="1990.0" y="605.0" />
<di:waypoint x="1990.0" y="1015.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_15" bpmnElement="process_Flow_15">
<di:waypoint x="2065.0" y="1050.0" />
<di:waypoint x="2275.0" y="1050.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_16" bpmnElement="process_Flow_16">
<di:waypoint x="2325.0" y="1050.0" />
<di:waypoint x="2535.0" y="1050.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_17" bpmnElement="process_Flow_17">
<di:waypoint x="2685.0" y="1050.0" />
<di:waypoint x="2730.0" y="1050.0" />
<di:waypoint x="2730.0" y="510.0" />
<di:waypoint x="2610.0" y="510.0" />
<di:waypoint x="2610.0" y="562.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="process_DI_Flow_18" bpmnElement="process_Flow_18">
<di:waypoint x="2300.0" y="1075.0" />
<di:waypoint x="2300.0" y="1272.0" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
При своём статусе handler сначала вызывает expire-subscription. Только details.expired=true завершает этот проход как истёкшую подписку; обычный success с expired=false не означает завершение заказа.
Далее обрабатывается один подходящий queued intent finish/force_majeure/decline/refuse. Успех/stale освобождает текущую очередь. Обработанный неуспех позволяет продолжить; исключение прерывает проход. Потом загружается order context и читается backend completion gate.
execution_stages, PROCESS_RECHECK.provider_finish, проверка planned_finish.В ручном пути winner/no_winner проверяются до отправки и после неё. no_winner забывается; исчерпанный раунд тоже сбрасывается, после чего используется RECHECK. Доменный неуспех finish увеличивает отдельный action counter; при достижении порога забывается раунд. Это не автоматический DECLINED или FORCEMAJEUER. Иной результат отправки/раунда ждёт NOTIFICATION_INTERVAL.
Загрузка схемы…
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_service_process_gate" targetNamespace="urn:sharix:knowledge:handlers">
<bpmn:process id="runtime_Process_runtime" name="Handler и backend: внешние этапы могут удерживать PROCESS" isExecutable="false">
<bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется канонический Python из Blockly.", "Сначала истечение подписки, затем queued intent, затем context и gate этапов.", "Обычный DONE ещё не означает CLOSED/оплату.", "PROCESS round без expires_at; интервал повторной отправки — не TTL ответа.", "Stage models принадлежат webservice_running; backend обращается через нейтральный порт.", "Gate повторяется внутри канонического finish, не только до приглашения."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_process.py", "repository": "sharix-open-handlers-examples", "sha256": "f9d07ac1e8bad0c5a8dd55d81110777951e40a9a5fd370b7652386c016a6c1ce"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_process.json", "repository": "sharix-open-handlers-examples", "sha256": "1e6a24a5819d9ab3cc033516c134d97423def1ee8944352d8bea7dd8c966f99a"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/integration_ports.py", "repository": "sharix-open-backend", "sha256": "d079ec56e6709b29d7755e47d2a88d423235fe8eb1bf7a92851ae25d74bf1066"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/subscription_order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "c50ba934aa44e90125564caff8461788d8454747fe6b0196765c449ff48cd70f"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_pricing.py", "repository": "sharix-open-backend", "sha256": "c69ad3e6b34dc6b9b1aa3b554a9634a49a9ce7ecbb8bd6216e46832857995893"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "apps.py", "repository": "sharix-open-webservice-running", "sha256": "dde02f8eae3449c973b6c0ef66053daa7563116149ccd4da00511fdad50c8e46"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "services/order_execution.py", "repository": "sharix-open-webservice-running", "sha256": "748e6bc20a784347afa9396283e3086a03ccfde30bed86849d934f9588101a91"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/service_pricing_policy.py", "repository": "sharix-open-backend", "sha256": "d8dbaecea24161c385b40d32a7e8657f7a7ba8affc3cc22a89ce835c25a21aa6"}]}</bpmn:documentation>
<bpmn:laneSet id="runtime_Lanes_runtime">
<bpmn:lane id="runtime_Lane_worker" name="Scope order.execution.completion_gate; затем order.finish_process">
<bpmn:flowNodeRef>runtime_start</bpmn:flowNodeRef>
<bpmn:flowNodeRef>runtime_gate</bpmn:flowNodeRef>
<bpmn:flowNodeRef>runtime_allowed</bpmn:flowNodeRef>
<bpmn:flowNodeRef>runtime_wait</bpmn:flowNodeRef>
<bpmn:flowNodeRef>runtime_timer</bpmn:flowNodeRef>
<bpmn:flowNodeRef>runtime_finish</bpmn:flowNodeRef>
<bpmn:flowNodeRef>runtime_result</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="runtime_start" name="Очередной проход после context">
<bpmn:outgoing>runtime_Flow_0</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:serviceTask id="runtime_gate" name="Прочитать completion gate через backend port">
<bpmn:incoming>runtime_Flow_0</bpmn:incoming>
<bpmn:incoming>runtime_Flow_4</bpmn:incoming>
<bpmn:outgoing>runtime_Flow_1</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:exclusiveGateway id="runtime_allowed" name="Нет blocking pending Stage?">
<bpmn:incoming>runtime_Flow_1</bpmn:incoming>
<bpmn:outgoing>runtime_Flow_2</bpmn:outgoing>
<bpmn:outgoing>runtime_Flow_5</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:serviceTask id="runtime_wait" name="execution_stages + RECHECK">
<bpmn:incoming>runtime_Flow_2</bpmn:incoming>
<bpmn:outgoing>runtime_Flow_3</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:intermediateCatchEvent id="runtime_timer" name="Повторная проверка / раннее событие">
<bpmn:incoming>runtime_Flow_3</bpmn:incoming>
<bpmn:outgoing>runtime_Flow_4</bpmn:outgoing>
<bpmn:timerEventDefinition>
<bpmn:timeDuration xsi:type="bpmn:tFormalExpression">process_recheck_interval</bpmn:timeDuration>
</bpmn:timerEventDefinition>
</bpmn:intermediateCatchEvent>
<bpmn:serviceTask id="runtime_finish" name="После даты/ответа: finish под lock, gate ещё раз">
<bpmn:incoming>runtime_Flow_5</bpmn:incoming>
<bpmn:outgoing>runtime_Flow_6</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:endEvent id="runtime_result" name="При успехе DONE, time/location/real_price и post-finish hooks">
<bpmn:incoming>runtime_Flow_6</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="runtime_Flow_0" sourceRef="runtime_start" targetRef="runtime_gate" name="" />
<bpmn:sequenceFlow id="runtime_Flow_1" sourceRef="runtime_gate" targetRef="runtime_allowed" name="" />
<bpmn:sequenceFlow id="runtime_Flow_2" sourceRef="runtime_allowed" targetRef="runtime_wait" name="Нет" />
<bpmn:sequenceFlow id="runtime_Flow_3" sourceRef="runtime_wait" targetRef="runtime_timer" name="" />
<bpmn:sequenceFlow id="runtime_Flow_4" sourceRef="runtime_timer" targetRef="runtime_gate" name="" />
<bpmn:sequenceFlow id="runtime_Flow_5" sourceRef="runtime_allowed" targetRef="runtime_finish" name="Да" />
<bpmn:sequenceFlow id="runtime_Flow_6" sourceRef="runtime_finish" targetRef="runtime_result" name="" />
</bpmn:process>
<bpmn:process id="stages_Process_stages" name="Модуль этапов и разрешённые участники вне handler" isExecutable="false">
<bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется канонический Python из Blockly.", "Сначала истечение подписки, затем queued intent, затем context и gate этапов.", "Обычный DONE ещё не означает CLOSED/оплату.", "PROCESS round без expires_at; интервал повторной отправки — не TTL ответа.", "Stage models принадлежат webservice_running; backend обращается через нейтральный порт.", "Gate повторяется внутри канонического finish, не только до приглашения."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_process.py", "repository": "sharix-open-handlers-examples", "sha256": "f9d07ac1e8bad0c5a8dd55d81110777951e40a9a5fd370b7652386c016a6c1ce"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_process.json", "repository": "sharix-open-handlers-examples", "sha256": "1e6a24a5819d9ab3cc033516c134d97423def1ee8944352d8bea7dd8c966f99a"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/integration_ports.py", "repository": "sharix-open-backend", "sha256": "d079ec56e6709b29d7755e47d2a88d423235fe8eb1bf7a92851ae25d74bf1066"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/subscription_order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "c50ba934aa44e90125564caff8461788d8454747fe6b0196765c449ff48cd70f"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_pricing.py", "repository": "sharix-open-backend", "sha256": "c69ad3e6b34dc6b9b1aa3b554a9634a49a9ce7ecbb8bd6216e46832857995893"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "apps.py", "repository": "sharix-open-webservice-running", "sha256": "dde02f8eae3449c973b6c0ef66053daa7563116149ccd4da00511fdad50c8e46"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "services/order_execution.py", "repository": "sharix-open-webservice-running", "sha256": "748e6bc20a784347afa9396283e3086a03ccfde30bed86849d934f9588101a91"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/service_pricing_policy.py", "repository": "sharix-open-backend", "sha256": "d8dbaecea24161c385b40d32a7e8657f7a7ba8affc3cc22a89ce835c25a21aa6"}]}</bpmn:documentation>
<bpmn:laneSet id="stages_Lanes_stages">
<bpmn:lane id="stages_Lane_worker" name="Не выполняются из Blockly">
<bpmn:flowNodeRef>stages_start</bpmn:flowNodeRef>
<bpmn:flowNodeRef>stages_checklist</bpmn:flowNodeRef>
<bpmn:flowNodeRef>stages_complete</bpmn:flowNodeRef>
<bpmn:flowNodeRef>stages_save</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="stages_start" name="Выполнить обязательную работу">
<bpmn:outgoing>stages_Flow_0</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="stages_checklist" name="Отметить обязательные checklist items">
<bpmn:incoming>stages_Flow_0</bpmn:incoming>
<bpmn:outgoing>stages_Flow_1</bpmn:outgoing>
</bpmn:userTask>
<bpmn:serviceTask id="stages_complete" name="Авторизованное complete_stage; проверить policy и checklist">
<bpmn:incoming>stages_Flow_1</bpmn:incoming>
<bpmn:outgoing>stages_Flow_2</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:endEvent id="stages_save" name="Stage completed; следующая проверка gate увидит изменение">
<bpmn:incoming>stages_Flow_2</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="stages_Flow_0" sourceRef="stages_start" targetRef="stages_checklist" name="" />
<bpmn:sequenceFlow id="stages_Flow_1" sourceRef="stages_checklist" targetRef="stages_complete" name="" />
<bpmn:sequenceFlow id="stages_Flow_2" sourceRef="stages_complete" targetRef="stages_save" name="" />
</bpmn:process>
<bpmn:collaboration id="Collaboration_service_process_gate">
<bpmn:participant id="runtime_Pool_runtime" name="Handler и backend: внешние этапы могут удерживать PROCESS" processRef="runtime_Process_runtime" />
<bpmn:participant id="stages_Pool_stages" name="Модуль этапов и разрешённые участники вне handler" processRef="stages_Process_stages" />
<bpmn:messageFlow id="Message_service_process_gate_0" sourceRef="stages_save" targetRef="runtime_gate" name="Обновлённое состояние Stage, не разрешение обойти backend gate" />
</bpmn:collaboration>
<bpmndi:BPMNDiagram id="Diagram_service_process_gate">
<bpmndi:BPMNPlane id="Plane_service_process_gate" bpmnElement="Collaboration_service_process_gate">
<bpmndi:BPMNShape id="runtime_DI_Pool_runtime" bpmnElement="runtime_Pool_runtime" isHorizontal="true">
<dc:Bounds x="0.0" y="0.0" width="1530" height="440" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="runtime_DI_Lane_worker" bpmnElement="runtime_Lane_worker" isHorizontal="true">
<dc:Bounds x="30.0" y="0.0" width="1500" height="440" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="runtime_DI_start" bpmnElement="runtime_start">
<dc:Bounds x="132.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="runtime_DI_gate" bpmnElement="runtime_gate">
<dc:Bounds x="365.0" y="65.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="runtime_DI_allowed" bpmnElement="runtime_allowed">
<dc:Bounds x="725.0" y="75.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="runtime_DI_wait" bpmnElement="runtime_wait">
<dc:Bounds x="675.0" y="305.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="runtime_DI_timer" bpmnElement="runtime_timer">
<dc:Bounds x="1042.0" y="322.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="runtime_DI_finish" bpmnElement="runtime_finish">
<dc:Bounds x="985.0" y="65.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="runtime_DI_result" bpmnElement="runtime_result">
<dc:Bounds x="1352.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="runtime_DI_Flow_0" bpmnElement="runtime_Flow_0">
<di:waypoint x="168.0" y="100.0" />
<di:waypoint x="365.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="runtime_DI_Flow_1" bpmnElement="runtime_Flow_1">
<di:waypoint x="515.0" y="100.0" />
<di:waypoint x="725.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="runtime_DI_Flow_2" bpmnElement="runtime_Flow_2">
<di:waypoint x="750.0" y="125.0" />
<di:waypoint x="750.0" y="305.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="runtime_DI_Flow_3" bpmnElement="runtime_Flow_3">
<di:waypoint x="825.0" y="340.0" />
<di:waypoint x="1042.0" y="340.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="runtime_DI_Flow_4" bpmnElement="runtime_Flow_4">
<di:waypoint x="1078.0" y="340.0" />
<di:waypoint x="1180.0" y="340.0" />
<di:waypoint x="1300.0" y="340.0" />
<di:waypoint x="1300.0" y="30.0" />
<di:waypoint x="440.0" y="30.0" />
<di:waypoint x="440.0" y="65.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="runtime_DI_Flow_5" bpmnElement="runtime_Flow_5">
<di:waypoint x="775.0" y="100.0" />
<di:waypoint x="985.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="runtime_DI_Flow_6" bpmnElement="runtime_Flow_6">
<di:waypoint x="1135.0" y="100.0" />
<di:waypoint x="1352.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="stages_DI_Pool_stages" bpmnElement="stages_Pool_stages" isHorizontal="true">
<dc:Bounds x="0.0" y="650.0" width="1220" height="200" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="stages_DI_Lane_worker" bpmnElement="stages_Lane_worker" isHorizontal="true">
<dc:Bounds x="30.0" y="650.0" width="1190" height="200" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="stages_DI_start" bpmnElement="stages_start">
<dc:Bounds x="132.0" y="732.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="stages_DI_checklist" bpmnElement="stages_checklist">
<dc:Bounds x="365.0" y="715.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="stages_DI_complete" bpmnElement="stages_complete">
<dc:Bounds x="675.0" y="715.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="stages_DI_save" bpmnElement="stages_save">
<dc:Bounds x="1042.0" y="732.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="stages_DI_Flow_0" bpmnElement="stages_Flow_0">
<di:waypoint x="168.0" y="750.0" />
<di:waypoint x="365.0" y="750.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="stages_DI_Flow_1" bpmnElement="stages_Flow_1">
<di:waypoint x="515.0" y="750.0" />
<di:waypoint x="675.0" y="750.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="stages_DI_Flow_2" bpmnElement="stages_Flow_2">
<di:waypoint x="825.0" y="750.0" />
<di:waypoint x="1042.0" y="750.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="DI_Message_service_process_gate_0" bpmnElement="Message_service_process_gate_0">
<di:waypoint x="1060" y="732" />
<di:waypoint x="1450" y="732" />
<di:waypoint x="1450" y="30" />
<di:waypoint x="440" y="30" />
<di:waypoint x="440" y="65" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1100" y="530" width="260" height="42" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>Проверка order.execution.completion_gate читает нейтральный порт. Адаптер webservice_running регистрируется в Apps.ready и ищет Stage:
Проверяются также записи вне обычного workspace. Backend и handler получают blocking_stages и причину запрета.
Уполномоченный участник выполняет работу и отмечает checklist/этап через модуль исполнения. complete_stage проверяет видимость, policy права завершать и отсутствие незавершённых обязательных checklist items; только потом сохраняет Stage COMPLETED. Handler сам не отмечает эти этапы выполненными. Снятие блокировки тоже отдельное разрешённое действие policy, не способ для handler обойти невыполненную работу.
Очередной проход перечитывает gate. Даже если до приглашения он разрешал завершение, канонический finish повторно проверяет gate под lock: промежуточный снимок не даёт права закрыть вновь заблокированный заказ.
Публичный порт возвращает default allowed=true, если:
Исключение вызванного метода само по себе не становится разрешением. Поэтому allowed=true без проверки регистрации не доказывает, что реальные Stage проверены.
Загрузка схемы…
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_service_process_round" targetNamespace="urn:sharix:knowledge:handlers">
<bpmn:process id="round_Process_round" name="PROCESS: приглашение завершить заказ после gate и планового срока" isExecutable="false">
<bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется канонический Python из Blockly.", "Сначала истечение подписки, затем queued intent, затем context и gate этапов.", "Обычный DONE ещё не означает CLOSED/оплату.", "PROCESS round без expires_at; интервал повторной отправки — не TTL ответа."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_process.py", "repository": "sharix-open-handlers-examples", "sha256": "f9d07ac1e8bad0c5a8dd55d81110777951e40a9a5fd370b7652386c016a6c1ce"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_process.json", "repository": "sharix-open-handlers-examples", "sha256": "1e6a24a5819d9ab3cc033516c134d97423def1ee8944352d8bea7dd8c966f99a"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/integration_ports.py", "repository": "sharix-open-backend", "sha256": "d079ec56e6709b29d7755e47d2a88d423235fe8eb1bf7a92851ae25d74bf1066"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/subscription_order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "c50ba934aa44e90125564caff8461788d8454747fe6b0196765c449ff48cd70f"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_pricing.py", "repository": "sharix-open-backend", "sha256": "c69ad3e6b34dc6b9b1aa3b554a9634a49a9ce7ecbb8bd6216e46832857995893"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "apps.py", "repository": "sharix-open-webservice-running", "sha256": "dde02f8eae3449c973b6c0ef66053daa7563116149ccd4da00511fdad50c8e46"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "services/order_execution.py", "repository": "sharix-open-webservice-running", "sha256": "748e6bc20a784347afa9396283e3086a03ccfde30bed86849d934f9588101a91"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/service_pricing_policy.py", "repository": "sharix-open-backend", "sha256": "d8dbaecea24161c385b40d32a7e8657f7a7ba8affc3cc22a89ce835c25a21aa6"}]}</bpmn:documentation>
<bpmn:laneSet id="round_Lanes_round">
<bpmn:lane id="round_Lane_worker" name="Stage PRE_START; один текущий provider JID">
<bpmn:flowNodeRef>round_start</bpmn:flowNodeRef>
<bpmn:flowNodeRef>round_create</bpmn:flowNodeRef>
<bpmn:flowNodeRef>round_send</bpmn:flowNodeRef>
<bpmn:flowNodeRef>round_wait</bpmn:flowNodeRef>
<bpmn:flowNodeRef>round_reply</bpmn:flowNodeRef>
<bpmn:flowNodeRef>round_validate</bpmn:flowNodeRef>
<bpmn:flowNodeRef>round_end</bpmn:flowNodeRef>
<bpmn:flowNodeRef>round_timer</bpmn:flowNodeRef>
<bpmn:flowNodeRef>round_retry</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="round_start" name="Gate разрешает, planned_finish наступил, auto выключен">
<bpmn:outgoing>round_Flow_0</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:serviceTask id="round_create" name="Создать раунд: strategy/delivery, attempts; без expires_at">
<bpmn:incoming>round_Flow_0</bpmn:incoming>
<bpmn:outgoing>round_Flow_1</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sendTask id="round_send" name="order.action.required finish, active_order">
<bpmn:incoming>round_Flow_1</bpmn:incoming>
<bpmn:outgoing>round_Flow_2</bpmn:outgoing>
</bpmn:sendTask>
<bpmn:eventBasedGateway id="round_wait" name="Ответ / интервал следующей попытки">
<bpmn:incoming>round_Flow_2</bpmn:incoming>
<bpmn:outgoing>round_Flow_3</bpmn:outgoing>
<bpmn:outgoing>round_Flow_6</bpmn:outgoing>
</bpmn:eventBasedGateway>
<bpmn:intermediateCatchEvent id="round_reply" name="Прямой XMPP / trusted relay">
<bpmn:incoming>round_Flow_3</bpmn:incoming>
<bpmn:outgoing>round_Flow_4</bpmn:outgoing>
<bpmn:messageEventDefinition />
</bpmn:intermediateCatchEvent>
<bpmn:serviceTask id="round_validate" name="Проверить actor/JID, round/order/status, действие, повтор">
<bpmn:incoming>round_Flow_4</bpmn:incoming>
<bpmn:outgoing>round_Flow_5</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:endEvent id="round_end" name="Учтённое решение → Ticket ready; действие ещё не сохранено">
<bpmn:incoming>round_Flow_5</bpmn:incoming>
</bpmn:endEvent>
<bpmn:intermediateCatchEvent id="round_timer" name="PROCESS_NOTIFICATION_INTERVAL">
<bpmn:incoming>round_Flow_6</bpmn:incoming>
<bpmn:outgoing>round_Flow_7</bpmn:outgoing>
<bpmn:timerEventDefinition>
<bpmn:timeDuration xsi:type="bpmn:tFormalExpression">process_notification_interval</bpmn:timeDuration>
</bpmn:timerEventDefinition>
</bpmn:intermediateCatchEvent>
<bpmn:endEvent id="round_retry" name="Следующий проход проверяет лимит; при необходимости новый round">
<bpmn:incoming>round_Flow_7</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="round_Flow_0" sourceRef="round_start" targetRef="round_create" name="" />
<bpmn:sequenceFlow id="round_Flow_1" sourceRef="round_create" targetRef="round_send" name="" />
<bpmn:sequenceFlow id="round_Flow_2" sourceRef="round_send" targetRef="round_wait" name="" />
<bpmn:sequenceFlow id="round_Flow_3" sourceRef="round_wait" targetRef="round_reply" name="" />
<bpmn:sequenceFlow id="round_Flow_4" sourceRef="round_reply" targetRef="round_validate" name="" />
<bpmn:sequenceFlow id="round_Flow_5" sourceRef="round_validate" targetRef="round_end" name="" />
<bpmn:sequenceFlow id="round_Flow_6" sourceRef="round_wait" targetRef="round_timer" name="" />
<bpmn:sequenceFlow id="round_Flow_7" sourceRef="round_timer" targetRef="round_retry" name="" />
</bpmn:process>
<bpmn:process id="person_Process_person" name="Назначенный исполнитель / разрешённый web actor" isExecutable="false">
<bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется канонический Python из Blockly.", "Сначала истечение подписки, затем queued intent, затем context и gate этапов.", "Обычный DONE ещё не означает CLOSED/оплату.", "PROCESS round без expires_at; интервал повторной отправки — не TTL ответа."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_process.py", "repository": "sharix-open-handlers-examples", "sha256": "f9d07ac1e8bad0c5a8dd55d81110777951e40a9a5fd370b7652386c016a6c1ce"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_process.json", "repository": "sharix-open-handlers-examples", "sha256": "1e6a24a5819d9ab3cc033516c134d97423def1ee8944352d8bea7dd8c966f99a"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/integration_ports.py", "repository": "sharix-open-backend", "sha256": "d079ec56e6709b29d7755e47d2a88d423235fe8eb1bf7a92851ae25d74bf1066"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/subscription_order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "c50ba934aa44e90125564caff8461788d8454747fe6b0196765c449ff48cd70f"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_pricing.py", "repository": "sharix-open-backend", "sha256": "c69ad3e6b34dc6b9b1aa3b554a9634a49a9ce7ecbb8bd6216e46832857995893"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "apps.py", "repository": "sharix-open-webservice-running", "sha256": "dde02f8eae3449c973b6c0ef66053daa7563116149ccd4da00511fdad50c8e46"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "services/order_execution.py", "repository": "sharix-open-webservice-running", "sha256": "748e6bc20a784347afa9396283e3086a03ccfde30bed86849d934f9588101a91"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/service_pricing_policy.py", "repository": "sharix-open-backend", "sha256": "d8dbaecea24161c385b40d32a7e8657f7a7ba8affc3cc22a89ce835c25a21aa6"}]}</bpmn:documentation>
<bpmn:laneSet id="person_Lanes_person">
<bpmn:lane id="person_Lane_worker" name="Действие вне handler">
<bpmn:flowNodeRef>person_notice</bpmn:flowNodeRef>
<bpmn:flowNodeRef>person_action</bpmn:flowNodeRef>
<bpmn:flowNodeRef>person_send</bpmn:flowNodeRef>
<bpmn:flowNodeRef>person_end</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="person_notice" name="Получить приглашение либо открыть заказ">
<bpmn:outgoing>person_Flow_0</bpmn:outgoing>
<bpmn:messageEventDefinition />
</bpmn:startEvent>
<bpmn:userTask id="person_action" name="Подтвердить finish; отдельно сообщить о проблеме">
<bpmn:incoming>person_Flow_0</bpmn:incoming>
<bpmn:outgoing>person_Flow_1</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sendTask id="person_send" name="XMPP response либо web intent">
<bpmn:incoming>person_Flow_1</bpmn:incoming>
<bpmn:outgoing>person_Flow_2</bpmn:outgoing>
</bpmn:sendTask>
<bpmn:endEvent id="person_end" name="HTTP 202 / response ack не равен PROCESS">
<bpmn:incoming>person_Flow_2</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="person_Flow_0" sourceRef="person_notice" targetRef="person_action" name="" />
<bpmn:sequenceFlow id="person_Flow_1" sourceRef="person_action" targetRef="person_send" name="" />
<bpmn:sequenceFlow id="person_Flow_2" sourceRef="person_send" targetRef="person_end" name="" />
</bpmn:process>
<bpmn:collaboration id="Collaboration_service_process_round">
<bpmn:participant id="round_Pool_round" name="PROCESS: приглашение завершить заказ после gate и планового срока" processRef="round_Process_round" />
<bpmn:participant id="person_Pool_person" name="Назначенный исполнитель / разрешённый web actor" processRef="person_Process_person" />
<bpmn:messageFlow id="Message_service_process_round_0" sourceRef="round_send" targetRef="person_notice" name="Send не доказывает показ окна" />
<bpmn:messageFlow id="Message_service_process_round_1" sourceRef="person_send" targetRef="round_reply" name="Web finish при активном раунде — ответ; без него — immediate intent" />
</bpmn:collaboration>
<bpmndi:BPMNDiagram id="Diagram_service_process_round">
<bpmndi:BPMNPlane id="Plane_service_process_round" bpmnElement="Collaboration_service_process_round">
<bpmndi:BPMNShape id="round_DI_Pool_round" bpmnElement="round_Pool_round" isHorizontal="true">
<dc:Bounds x="0.0" y="0.0" width="2150" height="440" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_Lane_worker" bpmnElement="round_Lane_worker" isHorizontal="true">
<dc:Bounds x="30.0" y="0.0" width="2120" height="440" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_start" bpmnElement="round_start">
<dc:Bounds x="132.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_create" bpmnElement="round_create">
<dc:Bounds x="365.0" y="65.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_send" bpmnElement="round_send">
<dc:Bounds x="675.0" y="65.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_wait" bpmnElement="round_wait">
<dc:Bounds x="1035.0" y="75.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_reply" bpmnElement="round_reply">
<dc:Bounds x="1352.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_validate" bpmnElement="round_validate">
<dc:Bounds x="1605.0" y="65.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_end" bpmnElement="round_end">
<dc:Bounds x="1972.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_timer" bpmnElement="round_timer">
<dc:Bounds x="1352.0" y="322.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="round_DI_retry" bpmnElement="round_retry">
<dc:Bounds x="1662.0" y="322.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="round_DI_Flow_0" bpmnElement="round_Flow_0">
<di:waypoint x="168.0" y="100.0" />
<di:waypoint x="365.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="round_DI_Flow_1" bpmnElement="round_Flow_1">
<di:waypoint x="515.0" y="100.0" />
<di:waypoint x="675.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="round_DI_Flow_2" bpmnElement="round_Flow_2">
<di:waypoint x="825.0" y="100.0" />
<di:waypoint x="1035.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="round_DI_Flow_3" bpmnElement="round_Flow_3">
<di:waypoint x="1085.0" y="100.0" />
<di:waypoint x="1352.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="round_DI_Flow_4" bpmnElement="round_Flow_4">
<di:waypoint x="1388.0" y="100.0" />
<di:waypoint x="1605.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="round_DI_Flow_5" bpmnElement="round_Flow_5">
<di:waypoint x="1755.0" y="100.0" />
<di:waypoint x="1972.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="round_DI_Flow_6" bpmnElement="round_Flow_6">
<di:waypoint x="1085.0" y="100.0" />
<di:waypoint x="1218.5" y="100.0" />
<di:waypoint x="1218.5" y="340.0" />
<di:waypoint x="1352.0" y="340.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="round_DI_Flow_7" bpmnElement="round_Flow_7">
<di:waypoint x="1388.0" y="340.0" />
<di:waypoint x="1662.0" y="340.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="person_DI_Pool_person" bpmnElement="person_Pool_person" isHorizontal="true">
<dc:Bounds x="0.0" y="650.0" width="1220" height="200" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="person_DI_Lane_worker" bpmnElement="person_Lane_worker" isHorizontal="true">
<dc:Bounds x="30.0" y="650.0" width="1190" height="200" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="person_DI_notice" bpmnElement="person_notice">
<dc:Bounds x="132.0" y="732.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="person_DI_action" bpmnElement="person_action">
<dc:Bounds x="365.0" y="715.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="person_DI_send" bpmnElement="person_send">
<dc:Bounds x="675.0" y="715.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="person_DI_end" bpmnElement="person_end">
<dc:Bounds x="1042.0" y="732.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="person_DI_Flow_0" bpmnElement="person_Flow_0">
<di:waypoint x="168.0" y="750.0" />
<di:waypoint x="365.0" y="750.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="person_DI_Flow_1" bpmnElement="person_Flow_1">
<di:waypoint x="515.0" y="750.0" />
<di:waypoint x="675.0" y="750.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="person_DI_Flow_2" bpmnElement="person_Flow_2">
<di:waypoint x="825.0" y="750.0" />
<di:waypoint x="1042.0" y="750.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="DI_Message_service_process_round_0" bpmnElement="Message_service_process_round_0">
<di:waypoint x="750" y="135" />
<di:waypoint x="750" y="550" />
<di:waypoint x="150" y="550" />
<di:waypoint x="150" y="732" />
<bpmndi:BPMNLabel>
<dc:Bounds x="180" y="515" width="260" height="42" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="DI_Message_service_process_round_1" bpmnElement="Message_service_process_round_1">
<di:waypoint x="750" y="785" />
<di:waypoint x="2080" y="785" />
<di:waypoint x="2080" y="30" />
<di:waypoint x="1370" y="30" />
<di:waypoint x="1370" y="82" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1550" y="530" width="260" height="42" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>Приглашение order.action.required адресуется текущему provider и содержит:
Expires_at для PROCESS-раунда не устанавливается. Плановая дата не является TTL ответа.
Используются SERVICE_REQUEST_PROCESS_ROUND_STRATEGY, …DELIVERY_POLICY, …NOTIFICATION_ATTEMPTS (минимум 1) и …NOTIFICATION_INTERVAL_SECONDS. Таймер BPMN обозначает следующий проход/отправку. Достигнутый лимит активного раунда приводит к reset и повтору, не к безусловному завершению заказа без исполнителя. Попытка учитывается до I/O; send failure не равен человеческому отказу.
Ответ валидируется по round/order/ticket/status, участнику/JID, действию, offer при наличии и повтору. Прямой actor определяется отправителем XMPP; web actor допускается только через доверенный relay. Квитанция ответа/HTTP 202 relay не равна DONE. Состояние раундов, intent queue и счётчики — память процесса, не постоянный журнал exactly-once.
При существующем раунде trusted web intent сначала направляется туда. Для активного finish-only раунда force_majeure может получить action_mismatch и не попасть в immediate queue. Без раунда queued problem intent может вызвать move-active-to-pre-forcemajeur. Это то же исходное ограничение маршрутизации, что у PRE_START, а не гарантированный рабочий обход при любом состоянии.
Web finish без раунда идёт через immediate apply-user-intent раньше плановой даты; backend заново проверяет active actor/JID, текущего исполнителя и PROCESS, а пользовательский lifecycle повторяет completion gate. С активным раундом finish становится ответом, затем обычная ветка handler снова проверяет gate и время. Наличие кнопки и подтверждённая передача intent ещё не определяют, какой путь был пройден.
Narrow finish-process требует order.finish_process, текущий scope, PROCESS и provider. Под lock он повторяет completion gate, разрешает time_mode planned/actual и делает канонический DONE. Planned берёт первое доступное time_finish_predicted, затем time_finish_placed; actual — backend now. Сам action не проверяет, наступила ли плановая дата: её проверяет Python.
После успешного finish:
Actual wrapper может передать допустимые location-поля победителя, planned wrapper их не передаёт. Текущий wrapper не отправляет expected_provider_id, хотя backend поддерживает проверку этого параметра.
После успешного DONE вызывается handle_after_order_done выбранного платёжного backend и предпринимается создание следующего повторного заказа. Платёжный hook может добавить сообщение «требуется внимание» без отмены success самого finish. Ошибка создания повторного заказа логируется и добавляет предупреждение, не объявляет предыдущую работу незавершённой. Неожиданное исключение и обработанный доменный результат различаются; после сетевой неопределённости сначала перечитывают фактический статус.
DONE не означает CLOSED, успешный платёж или гарантированно созданный повтор. Дальнейшая финализация относится к DONE handler.
Загрузка схемы…
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_service_process_subscription" targetNamespace="urn:sharix:knowledge:handlers">
<bpmn:process id="subscription_Process_subscription" name="expire-subscription: отдельная ветка, раньше обычного finish" isExecutable="false">
<bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется канонический Python из Blockly.", "Сначала истечение подписки, затем queued intent, затем context и gate этапов.", "Обычный DONE ещё не означает CLOSED/оплату.", "PROCESS round без expires_at; интервал повторной отправки — не TTL ответа.", "Системный тариф доступа подписки определяется сервисом, связанным category.subscription_service_id.", "Платёжное блокирование после DONE не означает, что вся операция была отменена."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_process.py", "repository": "sharix-open-handlers-examples", "sha256": "f9d07ac1e8bad0c5a8dd55d81110777951e40a9a5fd370b7652386c016a6c1ce"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_process.json", "repository": "sharix-open-handlers-examples", "sha256": "1e6a24a5819d9ab3cc033516c134d97423def1ee8944352d8bea7dd8c966f99a"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/integration_ports.py", "repository": "sharix-open-backend", "sha256": "d079ec56e6709b29d7755e47d2a88d423235fe8eb1bf7a92851ae25d74bf1066"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/subscription_order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "c50ba934aa44e90125564caff8461788d8454747fe6b0196765c449ff48cd70f"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_pricing.py", "repository": "sharix-open-backend", "sha256": "c69ad3e6b34dc6b9b1aa3b554a9634a49a9ce7ecbb8bd6216e46832857995893"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "apps.py", "repository": "sharix-open-webservice-running", "sha256": "dde02f8eae3449c973b6c0ef66053daa7563116149ccd4da00511fdad50c8e46"}, {"commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "services/order_execution.py", "repository": "sharix-open-webservice-running", "sha256": "748e6bc20a784347afa9396283e3086a03ccfde30bed86849d934f9588101a91"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/service_pricing_policy.py", "repository": "sharix-open-backend", "sha256": "d8dbaecea24161c385b40d32a7e8657f7a7ba8affc3cc22a89ce835c25a21aa6"}]}</bpmn:documentation>
<bpmn:laneSet id="subscription_Lanes_subscription">
<bpmn:lane id="subscription_Lane_worker" name="Backend lock + order.expire_subscription">
<bpmn:flowNodeRef>subscription_start</bpmn:flowNodeRef>
<bpmn:flowNodeRef>subscription_applicable</bpmn:flowNodeRef>
<bpmn:flowNodeRef>subscription_noop</bpmn:flowNodeRef>
<bpmn:flowNodeRef>subscription_save</bpmn:flowNodeRef>
<bpmn:flowNodeRef>subscription_payment</bpmn:flowNodeRef>
<bpmn:flowNodeRef>subscription_allowed</bpmn:flowNodeRef>
<bpmn:flowNodeRef>subscription_closed</bpmn:flowNodeRef>
<bpmn:flowNodeRef>subscription_blocked</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="subscription_start" name="expire-subscription">
<bpmn:outgoing>subscription_Flow_0</bpmn:outgoing>
<bpmn:messageEventDefinition />
</bpmn:startEvent>
<bpmn:exclusiveGateway id="subscription_applicable" name="Это заказ доступа подписки в PROCESS и срок наступил?">
<bpmn:incoming>subscription_Flow_0</bpmn:incoming>
<bpmn:outgoing>subscription_Flow_1</bpmn:outgoing>
<bpmn:outgoing>subscription_Flow_2</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:endEvent id="subscription_noop" name="Не применимо / рано: expired=false, обычный путь">
<bpmn:incoming>subscription_Flow_1</bpmn:incoming>
</bpmn:endEvent>
<bpmn:serviceTask id="subscription_save" name="real finish = time_finish_placed; real price = predicted; DONE">
<bpmn:incoming>subscription_Flow_2</bpmn:incoming>
<bpmn:outgoing>subscription_Flow_3</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:serviceTask id="subscription_payment" name="ensure_order_can_be_closed">
<bpmn:incoming>subscription_Flow_3</bpmn:incoming>
<bpmn:outgoing>subscription_Flow_4</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:exclusiveGateway id="subscription_allowed" name="Закрытие допускается?">
<bpmn:incoming>subscription_Flow_4</bpmn:incoming>
<bpmn:outgoing>subscription_Flow_5</bpmn:outgoing>
<bpmn:outgoing>subscription_Flow_6</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:endEvent id="subscription_closed" name="CLOSED; expired=true">
<bpmn:incoming>subscription_Flow_5</bpmn:incoming>
</bpmn:endEvent>
<bpmn:endEvent id="subscription_blocked" name="Неуспех закрытия; DONE может сохраниться">
<bpmn:incoming>subscription_Flow_6</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="subscription_Flow_0" sourceRef="subscription_start" targetRef="subscription_applicable" name="" />
<bpmn:sequenceFlow id="subscription_Flow_1" sourceRef="subscription_applicable" targetRef="subscription_noop" name="Нет" />
<bpmn:sequenceFlow id="subscription_Flow_2" sourceRef="subscription_applicable" targetRef="subscription_save" name="Да" />
<bpmn:sequenceFlow id="subscription_Flow_3" sourceRef="subscription_save" targetRef="subscription_payment" name="" />
<bpmn:sequenceFlow id="subscription_Flow_4" sourceRef="subscription_payment" targetRef="subscription_allowed" name="" />
<bpmn:sequenceFlow id="subscription_Flow_5" sourceRef="subscription_allowed" targetRef="subscription_closed" name="Да" />
<bpmn:sequenceFlow id="subscription_Flow_6" sourceRef="subscription_allowed" targetRef="subscription_blocked" name="Нет" />
</bpmn:process>
<bpmn:collaboration id="Collaboration_service_process_subscription">
<bpmn:participant id="subscription_Pool_subscription" name="expire-subscription: отдельная ветка, раньше обычного finish" processRef="subscription_Process_subscription" />
</bpmn:collaboration>
<bpmndi:BPMNDiagram id="Diagram_service_process_subscription">
<bpmndi:BPMNPlane id="Plane_service_process_subscription" bpmnElement="Collaboration_service_process_subscription">
<bpmndi:BPMNShape id="subscription_DI_Pool_subscription" bpmnElement="subscription_Pool_subscription" isHorizontal="true">
<dc:Bounds x="0.0" y="0.0" width="1840" height="440" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_Lane_worker" bpmnElement="subscription_Lane_worker" isHorizontal="true">
<dc:Bounds x="30.0" y="0.0" width="1810" height="440" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_start" bpmnElement="subscription_start">
<dc:Bounds x="132.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_applicable" bpmnElement="subscription_applicable">
<dc:Bounds x="415.0" y="75.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_noop" bpmnElement="subscription_noop">
<dc:Bounds x="422.0" y="322.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_save" bpmnElement="subscription_save">
<dc:Bounds x="675.0" y="65.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_payment" bpmnElement="subscription_payment">
<dc:Bounds x="985.0" y="65.0" width="150" height="70" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_allowed" bpmnElement="subscription_allowed">
<dc:Bounds x="1345.0" y="75.0" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_closed" bpmnElement="subscription_closed">
<dc:Bounds x="1662.0" y="82.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="subscription_DI_blocked" bpmnElement="subscription_blocked">
<dc:Bounds x="1352.0" y="322.0" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="subscription_DI_Flow_0" bpmnElement="subscription_Flow_0">
<di:waypoint x="168.0" y="100.0" />
<di:waypoint x="415.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="subscription_DI_Flow_1" bpmnElement="subscription_Flow_1">
<di:waypoint x="440.0" y="125.0" />
<di:waypoint x="440.0" y="322.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="subscription_DI_Flow_2" bpmnElement="subscription_Flow_2">
<di:waypoint x="465.0" y="100.0" />
<di:waypoint x="675.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="subscription_DI_Flow_3" bpmnElement="subscription_Flow_3">
<di:waypoint x="825.0" y="100.0" />
<di:waypoint x="985.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="subscription_DI_Flow_4" bpmnElement="subscription_Flow_4">
<di:waypoint x="1135.0" y="100.0" />
<di:waypoint x="1345.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="subscription_DI_Flow_5" bpmnElement="subscription_Flow_5">
<di:waypoint x="1395.0" y="100.0" />
<di:waypoint x="1662.0" y="100.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="subscription_DI_Flow_6" bpmnElement="subscription_Flow_6">
<di:waypoint x="1370.0" y="125.0" />
<di:waypoint x="1370.0" y="322.0" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
expire-subscription требует order.expire_subscription. Он применяется именно к системному тарифу доступа, связанному через category.subscription_service_id, а не ко всем заказам, оплачиваемым/покрытым подпиской. Для обычного заказа возвращается applicable=false, expired=false. Для ещё не наступившего срока или отсутствующего time_finish_placed — expired=false.
Истечение заказа доступа подписки:
Это отдельный путь без подтверждения provider и обычного finish-раунда. Если оплата блокирует закрытие, уже сохранённый DONE требует отдельной проверки.
Если payment gate блокирует уже после DONE, возвращается неуспех, но DONE может быть сохранён. expired=false/его отсутствие не доказывает, что все изменения отменены. PROCESS scope следующего запроса может стать stale, а DONE handler продолжит платёжную финализацию. Это отличается от гарантии одной неделимой операции «либо сразу CLOSED, либо PROCESS».
| Назначение | Настройка / источник |
|---|---|
| Auto-finish после плановой даты | SERVICE_REQUEST_PROCESS_AUTO_DONE |
| Повтор / ожидание этапов и даты | SERVICE_REQUEST_PROCESS_RECHECK_SECONDS |
| Стратегия / доставка | SERVICE_REQUEST_PROCESS_ROUND_STRATEGY, SERVICE_REQUEST_PROCESS_DELIVERY_POLICY |
| Порог рассылки и доменных неуспехов finish | SERVICE_REQUEST_PROCESS_NOTIFICATION_ATTEMPTS |
| Интервал приглашений | SERVICE_REQUEST_PROCESS_NOTIFICATION_INTERVAL_SECONDS |
| Общая ошибка / восстановление состава | DEFERRED_TICKET_RECHECK_SECONDS, INTERVAL_TIME_BD_REQ |
Defer освобождает worker; ответ/событие может сделать Ticket ready раньше. 404 scope очищает устаревшую локальную запись, auth/transport/5xx не считаются отказом исполнителя и идут в processing_error. После commit ticket.changed/ticket.moved передают владение, periodic reconciliation компенсирует потерю события.
Порядок диагностики:
Предупреждение об оплате не является основанием вслепую повторять finish; сначала перечитать Orders/Ticket.
Git SHA/SHA-256 и модели закреплены в metadata/BPMN, сборщик сверяет их перед упаковкой. Handler и бизнес-API не исполнялись. Общий автоматический hook Wiki пока не завершён.