Исходник схемы
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:ns1="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:ns2="http://www.omg.org/spec/DD/20100524/DC" xmlns:ns3="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_service_booked_actions" targetNamespace="urn:sharix:knowledge:handlers">
<bpmn:process id="backend_Process_backend" name="Backend: окончательные права, блокировки и актуальное состояние" isExecutable="false">
<bpmn:documentation>{"notes": ["Git built-in, BPMN isExecutable=false; handler при генерации не исполняется.", "BOOKED не рассылает предложения кандидатам.", "pending_at=planned_start − SERVICE_REQUEST_PRE_START_DURATION_SECONDS − SERVICE_REQUEST_BOOKED_PENDING_LEAD_SECONDS.", "Часы проверки границы — runtime; backend move повторно проверяет статус и отсутствие provider.", "Общий transport/202/direct actions разобран в TEMPLATE. Здесь — отличающиеся канонические действия BOOKED."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_booked.py", "repository": "sharix-open-handlers-examples", "sha256": "44e066a3ccb7ee21abc8d252a343adf1ea3cbf5e177aebb62ed2059fe1c2f2d8"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_booked.json", "repository": "sharix-open-handlers-examples", "sha256": "7096cde8b581cc80b2f0f65dcc63e95adfdfdd8bf459e9a70ee229d329a7dcfc"}, {"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"}]}</bpmn:documentation>
<bpmn:laneSet id="backend_Lanes_backend">
<bpmn:lane id="backend_Lane_user" name="Пользовательское действие: relay→apply-user-intent либо прямой actions API">
<bpmn:flowNodeRef>backend_user</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_acl</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_choice</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_take</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_taken</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_cancel</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_cancelled</bpmn:flowNodeRef>
</bpmn:lane>
<bpmn:lane id="backend_Lane_worker" name="Scoped handler action move-booked-to-pending">
<bpmn:flowNodeRef>backend_move</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_scope</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_state</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_save</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_done</bpmn:flowNodeRef>
<bpmn:flowNodeRef>backend_reject</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="backend_user" name="take / cancel с actor">
<bpmn:outgoing>backend_Flow_0</bpmn:outgoing>
<bpmn:messageEventDefinition />
</bpmn:startEvent>
<bpmn:serviceTask id="backend_acl" name="Повторить права и проверить текущий заказ">
<bpmn:incoming>backend_Flow_0</bpmn:incoming>
<bpmn:outgoing>backend_Flow_1</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:exclusiveGateway id="backend_choice" name="Какое действие?">
<bpmn:incoming>backend_Flow_1</bpmn:incoming>
<bpmn:outgoing>backend_Flow_2</bpmn:outgoing>
<bpmn:outgoing>backend_Flow_4</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:serviceTask id="backend_take" name="Provider, eligibility/concurrency и requirements; ASSIGNED">
<bpmn:documentation>Назначить только допустимого Provider; недостающие check-действия могут быть подготовлены без успешного take.</bpmn:documentation>
<bpmn:incoming>backend_Flow_2</bpmn:incoming>
<bpmn:outgoing>backend_Flow_3</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:endEvent id="backend_taken" name="Ответ take: успех либо отказ">
<bpmn:incoming>backend_Flow_3</bpmn:incoming>
</bpmn:endEvent>
<bpmn:serviceTask id="backend_cancel" name="Разрешённая отмена BOOKED → CANCELLED">
<bpmn:incoming>backend_Flow_4</bpmn:incoming>
<bpmn:outgoing>backend_Flow_5</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:endEvent id="backend_cancelled" name="Ответ cancel: сверить фактический результат">
<bpmn:incoming>backend_Flow_5</bpmn:incoming>
</bpmn:endEvent>
<bpmn:startEvent id="backend_move" name="move-booked-to-pending">
<bpmn:outgoing>backend_Flow_6</bpmn:outgoing>
<bpmn:messageEventDefinition />
</bpmn:startEvent>
<bpmn:serviceTask id="backend_scope" name="Capability order.move_booked_to_pending; scope и lock">
<bpmn:incoming>backend_Flow_6</bpmn:incoming>
<bpmn:outgoing>backend_Flow_7</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:exclusiveGateway id="backend_state" name="BOOKED и provider отсутствует?">
<bpmn:incoming>backend_Flow_7</bpmn:incoming>
<bpmn:outgoing>backend_Flow_8</bpmn:outgoing>
<bpmn:outgoing>backend_Flow_10</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:serviceTask id="backend_save" name="Канонический PENDING; Event и commit-события">
<bpmn:incoming>backend_Flow_8</bpmn:incoming>
<bpmn:outgoing>backend_Flow_9</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:endEvent id="backend_done" name="Новый владелец получит PENDING">
<bpmn:incoming>backend_Flow_9</bpmn:incoming>
</bpmn:endEvent>
<bpmn:endEvent id="backend_reject" name="Доменный отказ: повторить по обычному recheck">
<bpmn:incoming>backend_Flow_10</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="backend_Flow_0" sourceRef="backend_user" targetRef="backend_acl" name="" />
<bpmn:sequenceFlow id="backend_Flow_1" sourceRef="backend_acl" targetRef="backend_choice" name="" />
<bpmn:sequenceFlow id="backend_Flow_2" sourceRef="backend_choice" targetRef="backend_take" name="take" />
<bpmn:sequenceFlow id="backend_Flow_3" sourceRef="backend_take" targetRef="backend_taken" name="" />
<bpmn:sequenceFlow id="backend_Flow_4" sourceRef="backend_choice" targetRef="backend_cancel" name="cancel" />
<bpmn:sequenceFlow id="backend_Flow_5" sourceRef="backend_cancel" targetRef="backend_cancelled" name="" />
<bpmn:sequenceFlow id="backend_Flow_6" sourceRef="backend_move" targetRef="backend_scope" name="" />
<bpmn:sequenceFlow id="backend_Flow_7" sourceRef="backend_scope" targetRef="backend_state" name="" />
<bpmn:sequenceFlow id="backend_Flow_8" sourceRef="backend_state" targetRef="backend_save" name="Да" />
<bpmn:sequenceFlow id="backend_Flow_9" sourceRef="backend_save" targetRef="backend_done" name="" />
<bpmn:sequenceFlow id="backend_Flow_10" sourceRef="backend_state" targetRef="backend_reject" name="Нет" />
</bpmn:process>
<bpmn:collaboration id="Collaboration_service_booked_actions">
<bpmn:participant id="person_Participant" name="Допустимый Provider: take; автор/личный клиент заказа: cancel" />
<bpmn:participant id="runtime_Participant" name="BOOKED handler: ASAP либо достигнут pending_at" />
<bpmn:participant id="backend_Pool_backend" name="Backend: окончательные права, блокировки и актуальное состояние" processRef="backend_Process_backend" />
<bpmn:messageFlow id="Message_service_booked_actions_0" sourceRef="person_Participant" targetRef="backend_user" name="Пользовательское действие с identity" />
<bpmn:messageFlow id="Message_service_booked_actions_1" sourceRef="runtime_Participant" targetRef="backend_move" name="Узкое действие handler, не generic ticket.transition" />
</bpmn:collaboration>
<ns1:BPMNDiagram id="Diagram_service_booked_actions">
<ns1:BPMNPlane id="Plane_service_booked_actions" bpmnElement="Collaboration_service_booked_actions">
<ns1:BPMNShape id="DI_person_Participant" bpmnElement="person_Participant" isHorizontal="true">
<ns2:Bounds x="0" y="0" width="2080.0" height="90" />
</ns1:BPMNShape>
<ns1:BPMNShape id="DI_runtime_Participant" bpmnElement="runtime_Participant" isHorizontal="true">
<ns2:Bounds x="0" y="220" width="1900" height="90" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_Pool_backend" bpmnElement="backend_Pool_backend" isHorizontal="true">
<ns2:Bounds x="0.0" y="450.0" width="1420" height="800" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_Lane_user" bpmnElement="backend_Lane_user" isHorizontal="true">
<ns2:Bounds x="30.0" y="450.0" width="1390" height="390.0" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_Lane_worker" bpmnElement="backend_Lane_worker" isHorizontal="true">
<ns2:Bounds x="30.0" y="840.0" width="1390" height="410.0" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_user" bpmnElement="backend_user">
<ns2:Bounds x="132.0" y="532.0" width="36" height="36" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_acl" bpmnElement="backend_acl">
<ns2:Bounds x="345.0" y="515.0" width="150" height="70" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_choice" bpmnElement="backend_choice">
<ns2:Bounds x="675.0" y="525.0" width="50" height="50" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_take" bpmnElement="backend_take">
<ns2:Bounds x="905.0" y="515.0" width="150" height="70" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_taken" bpmnElement="backend_taken">
<ns2:Bounds x="1242.0" y="532.0" width="36" height="36" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_cancel" bpmnElement="backend_cancel">
<ns2:Bounds x="905.0" y="695.0" width="150" height="70" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_cancelled" bpmnElement="backend_cancelled">
<ns2:Bounds x="1242.0" y="712.0" width="36" height="36" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_move" bpmnElement="backend_move">
<ns2:Bounds x="132.0" y="932.0" width="36" height="36" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_scope" bpmnElement="backend_scope">
<ns2:Bounds x="345.0" y="915.0" width="150" height="70" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_state" bpmnElement="backend_state">
<ns2:Bounds x="675.0" y="925.0" width="50" height="50" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_save" bpmnElement="backend_save">
<ns2:Bounds x="905.0" y="915.0" width="150" height="70" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_done" bpmnElement="backend_done">
<ns2:Bounds x="1242.0" y="932.0" width="36" height="36" />
</ns1:BPMNShape>
<ns1:BPMNShape id="backend_DI_reject" bpmnElement="backend_reject">
<ns2:Bounds x="682.0" y="1132.0" width="36" height="36" />
</ns1:BPMNShape>
<ns1:BPMNEdge id="backend_DI_Flow_0" bpmnElement="backend_Flow_0">
<ns3:waypoint x="168.0" y="550.0" />
<ns3:waypoint x="345.0" y="550.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_1" bpmnElement="backend_Flow_1">
<ns3:waypoint x="495.0" y="550.0" />
<ns3:waypoint x="675.0" y="550.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_2" bpmnElement="backend_Flow_2">
<ns3:waypoint x="725.0" y="550.0" />
<ns3:waypoint x="905.0" y="550.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_3" bpmnElement="backend_Flow_3">
<ns3:waypoint x="1055.0" y="550.0" />
<ns3:waypoint x="1242.0" y="550.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_4" bpmnElement="backend_Flow_4">
<ns3:waypoint x="725.0" y="550.0" />
<ns3:waypoint x="815.0" y="550.0" />
<ns3:waypoint x="815.0" y="730.0" />
<ns3:waypoint x="905.0" y="730.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_5" bpmnElement="backend_Flow_5">
<ns3:waypoint x="1055.0" y="730.0" />
<ns3:waypoint x="1242.0" y="730.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_6" bpmnElement="backend_Flow_6">
<ns3:waypoint x="168.0" y="950.0" />
<ns3:waypoint x="345.0" y="950.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_7" bpmnElement="backend_Flow_7">
<ns3:waypoint x="495.0" y="950.0" />
<ns3:waypoint x="675.0" y="950.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_8" bpmnElement="backend_Flow_8">
<ns3:waypoint x="725.0" y="950.0" />
<ns3:waypoint x="905.0" y="950.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_9" bpmnElement="backend_Flow_9">
<ns3:waypoint x="1055.0" y="950.0" />
<ns3:waypoint x="1242.0" y="950.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="backend_DI_Flow_10" bpmnElement="backend_Flow_10">
<ns3:waypoint x="700.0" y="975.0" />
<ns3:waypoint x="700.0" y="1132.0" />
</ns1:BPMNEdge>
<ns1:BPMNEdge id="DI_Message_service_booked_actions_0" bpmnElement="Message_service_booked_actions_0">
<ns3:waypoint x="150" y="90" />
<ns3:waypoint x="150" y="532" />
<ns1:BPMNLabel>
<ns2:Bounds x="170" y="360" width="260" height="42" />
</ns1:BPMNLabel>
</ns1:BPMNEdge>
<ns1:BPMNEdge id="DI_Message_service_booked_actions_1" bpmnElement="Message_service_booked_actions_1">
<ns3:waypoint x="1880" y="310" />
<ns3:waypoint x="2040" y="310" />
<ns3:waypoint x="2040" y="900" />
<ns3:waypoint x="150" y="900" />
<ns3:waypoint x="150" y="932" />
<ns1:BPMNLabel>
<ns2:Bounds x="1000" y="865" width="260" height="42" />
</ns1:BPMNLabel>
</ns1:BPMNEdge>
</ns1:BPMNPlane>
</ns1:BPMNDiagram>
</bpmn:definitions>