Инструменты пользователя

Инструменты сайта


sharixopen:knowledge:scenarios:service_request_accepted

Это старая версия документа!


SERVICE_REQUEST в ACCEPTED: подготовка, подтверждение и платёжное ожидание

Область: ShariX Open. Обработчик: open_service_request_accepted, тип SERVICE_REQUEST (2), статус ACCEPTED. Опубликованный Python на 28.10.2026 побайтово совпадает с результатом канонической генерации Blockly workspace. Фактически выбранную server version и настройки проверяют отдельно.

Назначение и границы

Исполнитель уже назначен и принял заказ. Handler сопровождает переход ACCEPTED→PRE_START: ждёт доступности подготовки, предлагает её подтвердить либо делает обязательную попытку по контрольной дате. Любая ветка использует канонический prepare-accepted и сохраняет backend-ограничения исполнителя, одновременных заказов и оплаты.

Отдельно обрабатывается необходимость привязки карты клиентом сервиса. Ожидание клиентского платёжного действия не приравнивается к отказу исполнителя. BPMN описательные, isExecutable=false; runtime исполняет выбранный проверенный Python из Blockly, а не схему Wiki.

Приоритет ветвей (BPMN)

Схема BPMN

Загрузка схемы…

Исходник схемы
<?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_accepted_logic" targetNamespace="urn:sharix:knowledge:handlers">
  <bpmn:process id="accepted_Process_accepted" name="ACCEPTED: платежное ожидание, обязательный срок и раннее подтверждение" isExecutable="false">
    <bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется Python из канонического Blockly.", "bind_card — особая ветка: повтор подготовки без отказа по failure counter.", "pre_start_at — обязательная попытка, не безусловный переход и не обход payment/concurrency gates."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "75e50239792030dbbd4a29b1734865a6b44f5080a5cfa967636f486e64e950c8"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "33fe29b0dc7c103c133ae6244bf8909136a996deb35c50682422dedc16e4b61e"}, {"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/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}]}</bpmn:documentation>
    <bpmn:laneSet id="accepted_Lanes_accepted">
      <bpmn:lane id="accepted_Lane_worker" name="Один проход после загрузки order context; reason provider_preparation">
        <bpmn:flowNodeRef>accepted_start</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_card</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_card_action</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_card_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_due</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_auto</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_available</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_round</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_result</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_prepare</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_success</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_failures</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_decline</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_defer</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>accepted_interval</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="accepted_start" name="ACCEPTED, context получен">
      <bpmn:outgoing>accepted_Flow_0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:exclusiveGateway id="accepted_card" name="Нужна привязка карты клиентом?">
      <bpmn:incoming>accepted_Flow_0</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_1</bpmn:outgoing>
      <bpmn:outgoing>accepted_Flow_3</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="accepted_card_action" name="prepare-accepted; при неуспехе только RECHECK">
      <bpmn:incoming>accepted_Flow_1</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_2</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="accepted_card_end" name="Успех/stale: освободить; иначе ожидание">
      <bpmn:incoming>accepted_Flow_2</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:exclusiveGateway id="accepted_due" name="pre_start_at наступил?">
      <bpmn:incoming>accepted_Flow_3</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_4</bpmn:outgoing>
      <bpmn:outgoing>accepted_Flow_5</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:exclusiveGateway id="accepted_auto" name="AUTO_PRE_START включён?">
      <bpmn:incoming>accepted_Flow_5</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_6</bpmn:outgoing>
      <bpmn:outgoing>accepted_Flow_7</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:exclusiveGateway id="accepted_available" name="prepare_available_at наступил?">
      <bpmn:incoming>accepted_Flow_7</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_8</bpmn:outgoing>
      <bpmn:outgoing>accepted_Flow_9</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="accepted_round" name="Проверить исход/лимит, отправить попытку и снова проверить исход">
      <bpmn:incoming>accepted_Flow_8</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_10</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="accepted_result" name="Решение ручного раунда?">
      <bpmn:incoming>accepted_Flow_10</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_11</bpmn:outgoing>
      <bpmn:outgoing>accepted_Flow_12</bpmn:outgoing>
      <bpmn:outgoing>accepted_Flow_13</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="accepted_prepare" name="prepare-accepted">
      <bpmn:incoming>accepted_Flow_4</bpmn:incoming>
      <bpmn:incoming>accepted_Flow_11</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_14</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="accepted_success" name="Успех / stale?">
      <bpmn:incoming>accepted_Flow_14</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_15</bpmn:outgoing>
      <bpmn:outgoing>accepted_Flow_16</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:endEvent id="accepted_end" name="Освободить текущую очередь">
      <bpmn:incoming>accepted_Flow_15</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:exclusiveGateway id="accepted_failures" name="Доменные неуспехи достигли лимита?">
      <bpmn:incoming>accepted_Flow_16</bpmn:incoming>
      <bpmn:outgoing>accepted_Flow_17</bpmn:outgoing>
      <bpmn:outgoing>accepted_Flow_18</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="accepted_decline" name="decline-provider; неуспех → обычный повтор">
      <bpmn:incoming>accepted_Flow_12</bpmn:incoming>
      <bpmn:incoming>accepted_Flow_17</bpmn:incoming>
    </bpmn:serviceTask>
    <bpmn:endEvent id="accepted_defer" name="RECHECK до доступности / при auto / после неуспеха">
      <bpmn:incoming>accepted_Flow_6</bpmn:incoming>
      <bpmn:incoming>accepted_Flow_9</bpmn:incoming>
      <bpmn:incoming>accepted_Flow_18</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:endEvent id="accepted_interval" name="Иной исход раунда: NOTIFICATION_INTERVAL">
      <bpmn:incoming>accepted_Flow_13</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="accepted_Flow_0" sourceRef="accepted_start" targetRef="accepted_card" name="" />
    <bpmn:sequenceFlow id="accepted_Flow_1" sourceRef="accepted_card" targetRef="accepted_card_action" name="Да" />
    <bpmn:sequenceFlow id="accepted_Flow_2" sourceRef="accepted_card_action" targetRef="accepted_card_end" name="" />
    <bpmn:sequenceFlow id="accepted_Flow_3" sourceRef="accepted_card" targetRef="accepted_due" name="Нет" />
    <bpmn:sequenceFlow id="accepted_Flow_4" sourceRef="accepted_due" targetRef="accepted_prepare" name="Да" />
    <bpmn:sequenceFlow id="accepted_Flow_5" sourceRef="accepted_due" targetRef="accepted_auto" name="Нет" />
    <bpmn:sequenceFlow id="accepted_Flow_6" sourceRef="accepted_auto" targetRef="accepted_defer" name="Да" />
    <bpmn:sequenceFlow id="accepted_Flow_7" sourceRef="accepted_auto" targetRef="accepted_available" name="Нет" />
    <bpmn:sequenceFlow id="accepted_Flow_8" sourceRef="accepted_available" targetRef="accepted_round" name="Да" />
    <bpmn:sequenceFlow id="accepted_Flow_9" sourceRef="accepted_available" targetRef="accepted_defer" name="Нет" />
    <bpmn:sequenceFlow id="accepted_Flow_10" sourceRef="accepted_round" targetRef="accepted_result" name="" />
    <bpmn:sequenceFlow id="accepted_Flow_11" sourceRef="accepted_result" targetRef="accepted_prepare" name="winner" />
    <bpmn:sequenceFlow id="accepted_Flow_12" sourceRef="accepted_result" targetRef="accepted_decline" name="no_winner / лимит попыток" />
    <bpmn:sequenceFlow id="accepted_Flow_13" sourceRef="accepted_result" targetRef="accepted_interval" name="Иное" />
    <bpmn:sequenceFlow id="accepted_Flow_14" sourceRef="accepted_prepare" targetRef="accepted_success" name="" />
    <bpmn:sequenceFlow id="accepted_Flow_15" sourceRef="accepted_success" targetRef="accepted_end" name="Да" />
    <bpmn:sequenceFlow id="accepted_Flow_16" sourceRef="accepted_success" targetRef="accepted_failures" name="Нет" />
    <bpmn:sequenceFlow id="accepted_Flow_17" sourceRef="accepted_failures" targetRef="accepted_decline" name="Да" />
    <bpmn:sequenceFlow id="accepted_Flow_18" sourceRef="accepted_failures" targetRef="accepted_defer" name="Нет" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_service_accepted_logic">
    <bpmn:participant id="accepted_Pool_accepted" name="ACCEPTED: платежное ожидание, обязательный срок и раннее подтверждение" processRef="accepted_Process_accepted" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_service_accepted_logic">
    <bpmndi:BPMNPlane id="Plane_service_accepted_logic" bpmnElement="Collaboration_service_accepted_logic">
      <bpmndi:BPMNShape id="accepted_DI_Pool_accepted" bpmnElement="accepted_Pool_accepted" isHorizontal="true">
        <dc:Bounds x="0.0" y="0.0" width="2150" height="1150" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_Lane_worker" bpmnElement="accepted_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="0.0" width="2120" height="1150" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_start" bpmnElement="accepted_start">
        <dc:Bounds x="132.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_card" bpmnElement="accepted_card">
        <dc:Bounds x="415.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_card_action" bpmnElement="accepted_card_action">
        <dc:Bounds x="675.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_card_end" bpmnElement="accepted_card_end">
        <dc:Bounds x="1042.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_due" bpmnElement="accepted_due">
        <dc:Bounds x="415.0" y="315.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_auto" bpmnElement="accepted_auto">
        <dc:Bounds x="415.0" y="555.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_available" bpmnElement="accepted_available">
        <dc:Bounds x="725.0" y="555.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_round" bpmnElement="accepted_round">
        <dc:Bounds x="985.0" y="545.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_result" bpmnElement="accepted_result">
        <dc:Bounds x="1345.0" y="555.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_prepare" bpmnElement="accepted_prepare">
        <dc:Bounds x="1295.0" y="305.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_success" bpmnElement="accepted_success">
        <dc:Bounds x="1655.0" y="315.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_end" bpmnElement="accepted_end">
        <dc:Bounds x="1972.0" y="322.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_failures" bpmnElement="accepted_failures">
        <dc:Bounds x="1655.0" y="555.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_decline" bpmnElement="accepted_decline">
        <dc:Bounds x="1915.0" y="775.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_defer" bpmnElement="accepted_defer">
        <dc:Bounds x="732.0" y="1032.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="accepted_DI_interval" bpmnElement="accepted_interval">
        <dc:Bounds x="1352.0" y="1032.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_0" bpmnElement="accepted_Flow_0">
        <di:waypoint x="168.0" y="100.0" />
        <di:waypoint x="415.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_1" bpmnElement="accepted_Flow_1">
        <di:waypoint x="465.0" y="100.0" />
        <di:waypoint x="675.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_2" bpmnElement="accepted_Flow_2">
        <di:waypoint x="825.0" y="100.0" />
        <di:waypoint x="1042.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_3" bpmnElement="accepted_Flow_3">
        <di:waypoint x="440.0" y="125.0" />
        <di:waypoint x="440.0" y="315.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_4" bpmnElement="accepted_Flow_4">
        <di:waypoint x="465.0" y="340.0" />
        <di:waypoint x="1295.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_5" bpmnElement="accepted_Flow_5">
        <di:waypoint x="440.0" y="365.0" />
        <di:waypoint x="440.0" y="555.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_6" bpmnElement="accepted_Flow_6">
        <di:waypoint x="465.0" y="580.0" />
        <di:waypoint x="560.0" y="580.0" />
        <di:waypoint x="600.0" y="580.0" />
        <di:waypoint x="600.0" y="980.0" />
        <di:waypoint x="750.0" y="980.0" />
        <di:waypoint x="750.0" y="1032.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_7" bpmnElement="accepted_Flow_7">
        <di:waypoint x="465.0" y="580.0" />
        <di:waypoint x="725.0" y="580.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_8" bpmnElement="accepted_Flow_8">
        <di:waypoint x="775.0" y="580.0" />
        <di:waypoint x="985.0" y="580.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_9" bpmnElement="accepted_Flow_9">
        <di:waypoint x="750.0" y="605.0" />
        <di:waypoint x="750.0" y="1032.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_10" bpmnElement="accepted_Flow_10">
        <di:waypoint x="1135.0" y="580.0" />
        <di:waypoint x="1345.0" y="580.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_11" bpmnElement="accepted_Flow_11">
        <di:waypoint x="1395.0" y="580.0" />
        <di:waypoint x="1490.0" y="580.0" />
        <di:waypoint x="1540.0" y="580.0" />
        <di:waypoint x="1540.0" y="260.0" />
        <di:waypoint x="1370.0" y="260.0" />
        <di:waypoint x="1370.0" y="305.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_12" bpmnElement="accepted_Flow_12">
        <di:waypoint x="1395.0" y="580.0" />
        <di:waypoint x="1490.0" y="580.0" />
        <di:waypoint x="1540.0" y="580.0" />
        <di:waypoint x="1540.0" y="740.0" />
        <di:waypoint x="1990.0" y="740.0" />
        <di:waypoint x="1990.0" y="775.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_13" bpmnElement="accepted_Flow_13">
        <di:waypoint x="1370.0" y="605.0" />
        <di:waypoint x="1370.0" y="1032.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_14" bpmnElement="accepted_Flow_14">
        <di:waypoint x="1445.0" y="340.0" />
        <di:waypoint x="1655.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_15" bpmnElement="accepted_Flow_15">
        <di:waypoint x="1705.0" y="340.0" />
        <di:waypoint x="1972.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_16" bpmnElement="accepted_Flow_16">
        <di:waypoint x="1680.0" y="365.0" />
        <di:waypoint x="1680.0" y="555.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_17" bpmnElement="accepted_Flow_17">
        <di:waypoint x="1705.0" y="580.0" />
        <di:waypoint x="1810.0" y="580.0" />
        <di:waypoint x="1810.0" y="810.0" />
        <di:waypoint x="1915.0" y="810.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="accepted_DI_Flow_18" bpmnElement="accepted_Flow_18">
        <di:waypoint x="1705.0" y="580.0" />
        <di:waypoint x="1800.0" y="580.0" />
        <di:waypoint x="1840.0" y="580.0" />
        <di:waypoint x="1840.0" y="980.0" />
        <di:waypoint x="750.0" y="980.0" />
        <di:waypoint x="750.0" y="1032.0" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

После проверки своего статуса handler каждый проход загружает context и записывает локальную причину provider_preparation. Чужой статус запрашивает очистку Ticket/комнаты. 404 текущего scope очищает устаревшее локальное состояние; неоднозначность/отсутствие связанного Orders — ошибка API.

1. Привязка карты имеет приоритет

Флаг payment_requires_card_binding формируется из платёжного customer_action: required=true, code=bind_card, target=client. При нём handler сразу, до проверок времени и auto-режима, вызывает prepare-accepted. Успех/stale освобождает очередь, неуспех ведёт к ACCEPTED_RECHECK.

В этой ветке нет проверки порога неуспехов и автоматического decline-provider, хотя wrapper prepare учитывает доменные неуспехи в общем счётчике. Нельзя описывать ожидание карты как «после нескольких попыток исполнитель автоматически откажется». Вызов проходит реальный payment hook: сам диагностический флаг не является отдельным запретом перехода или разрешением его обойти. Если hook уже допускает подготовку, вызов может завершиться раньше обычной временной ветки.

Платёжная диагностика context ловит исключение и возвращает пустое состояние; отсутствие флага ещё не доказывает отсутствие платёжного ограничения. Решающий hook вызывается при prepare заново.

2. Обязательная попытка по pre_start_at

Если особой card-ветки нет и pre_start_at наступил, handler пробует prepare независимо от AUTO_PRE_START и наличия ответа. Успех/stale освобождает очередь. Доменный неуспех проверяет собственный счётчик prepare; при достижении порога предпринимается decline-provider, иначе/при его неуспехе — RECHECK.

«Обязательная» означает обязательную попытку, а не гарантированный PRE_START: конфликт активных заказов или платёжное условие могут оставить ACCEPTED. Если дата отсутствует/некорректна, timing helper не считает её наступившей; это повод проверить исходные даты, а не ждать гарантированного автоматического перехода.

3. Необязательное раннее подтверждение

До pre_start_at включённый SERVICE_REQUEST_ACCEPTED_AUTO_PRE_START пропускает приглашение исполнителю и ждёт RECHECK. Выключенный auto-режим начинает ручной раунд после prepare_available_at. Раньше этого окна тоже только RECHECK.

В ручном раунде winner/no_winner проверяются до отправки; затем — исчерпание попыток. Если терминального решения нет, отправляется попытка, разбираются queued web intents и winner/no_winner проверяются ещё раз. Winner вызывает prepare, no_winner/предусмотренное исчерпание — decline. Иной исход ждёт NOTIFICATION_INTERVAL.

Исполнитель, сообщение и срок ответа (BPMN)

Схема BPMN

Загрузка схемы…

Исходник схемы
<?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_accepted_round" targetNamespace="urn:sharix:knowledge:handlers">
  <bpmn:process id="round_Process_round" name="ACCEPTED: необязательное раннее подтверждение подготовки" isExecutable="false">
    <bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется Python из канонического Blockly.", "bind_card — особая ветка: повтор подготовки без отказа по failure counter.", "pre_start_at — обязательная попытка, не безусловный переход и не обход payment/concurrency gates.", "Ранний раунд доступен только с prepare_available_at при AUTO_PRE_START=false.", "single_confirmation timeout=no_winner; first_accept timeout=timed_out."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "75e50239792030dbbd4a29b1734865a6b44f5080a5cfa967636f486e64e950c8"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "33fe29b0dc7c103c133ae6244bf8909136a996deb35c50682422dedc16e4b61e"}, {"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/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}]}</bpmn:documentation>
    <bpmn:laneSet id="round_Lanes_round">
      <bpmn:lane id="round_Lane_worker" name="Подготовка / проверка внешнего ответа">
        <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_response</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_validate</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_valid</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_decision</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_ready</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_reject</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_timer</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_timeout</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_timeout_end</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="round_start" name="Есть provider JID и наступило prepare_available_at">
      <bpmn:outgoing>round_Flow_0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:serviceTask id="round_create" name="Получить provider JID, выбрать strategy/delivery/лимиты">
      <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: prepare / decline; online_only">
      <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_9</bpmn:outgoing>
    </bpmn:eventBasedGateway>
    <bpmn:intermediateCatchEvent id="round_response" name="Получен прямой XMPP ответ либо доверенный web intent">
      <bpmn:incoming>round_Flow_3</bpmn:incoming>
      <bpmn:outgoing>round_Flow_4</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:intermediateCatchEvent>
    <bpmn:serviceTask id="round_validate" name="Проверить round/order/status/JID/action/offer и повтор">
      <bpmn:incoming>round_Flow_4</bpmn:incoming>
      <bpmn:outgoing>round_Flow_5</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="round_valid" name="Ответ учтён?">
      <bpmn:incoming>round_Flow_5</bpmn:incoming>
      <bpmn:outgoing>round_Flow_6</bpmn:outgoing>
      <bpmn:outgoing>round_Flow_8</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="round_decision" name="Сохранить решение стратегии">
      <bpmn:incoming>round_Flow_6</bpmn:incoming>
      <bpmn:outgoing>round_Flow_7</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="round_ready" name="Сделать Ticket ready; заново проверить время и оплату">
      <bpmn:incoming>round_Flow_7</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:endEvent id="round_reject" name="Отклонить ответ, не менять заказ">
      <bpmn:incoming>round_Flow_8</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:intermediateCatchEvent id="round_timer" name="Наступил round.expires_at">
      <bpmn:incoming>round_Flow_9</bpmn:incoming>
      <bpmn:outgoing>round_Flow_10</bpmn:outgoing>
      <bpmn:timerEventDefinition>
        <bpmn:timeDate xsi:type="bpmn:tFormalExpression">round_expires_at</bpmn:timeDate>
      </bpmn:timerEventDefinition>
    </bpmn:intermediateCatchEvent>
    <bpmn:serviceTask id="round_timeout" name="Вычислить on_timeout выбранной strategy">
      <bpmn:incoming>round_Flow_10</bpmn:incoming>
      <bpmn:outgoing>round_Flow_11</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="round_timeout_end" name="Новый проход учитывает этот исход">
      <bpmn:incoming>round_Flow_11</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_response" name="" />
    <bpmn:sequenceFlow id="round_Flow_4" sourceRef="round_response" targetRef="round_validate" name="" />
    <bpmn:sequenceFlow id="round_Flow_5" sourceRef="round_validate" targetRef="round_valid" name="" />
    <bpmn:sequenceFlow id="round_Flow_6" sourceRef="round_valid" targetRef="round_decision" name="Да" />
    <bpmn:sequenceFlow id="round_Flow_7" sourceRef="round_decision" targetRef="round_ready" name="" />
    <bpmn:sequenceFlow id="round_Flow_8" sourceRef="round_valid" targetRef="round_reject" name="Нет" />
    <bpmn:sequenceFlow id="round_Flow_9" sourceRef="round_wait" targetRef="round_timer" name="" />
    <bpmn:sequenceFlow id="round_Flow_10" sourceRef="round_timer" targetRef="round_timeout" name="" />
    <bpmn:sequenceFlow id="round_Flow_11" sourceRef="round_timeout" targetRef="round_timeout_end" name="" />
  </bpmn:process>
  <bpmn:process id="provider_Process_provider" name="Назначенный исполнитель: подтверждение подготовки" isExecutable="false">
    <bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется Python из канонического Blockly.", "bind_card — особая ветка: повтор подготовки без отказа по failure counter.", "pre_start_at — обязательная попытка, не безусловный переход и не обход payment/concurrency gates.", "Ранний раунд доступен только с prepare_available_at при AUTO_PRE_START=false.", "single_confirmation timeout=no_winner; first_accept timeout=timed_out."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "75e50239792030dbbd4a29b1734865a6b44f5080a5cfa967636f486e64e950c8"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "33fe29b0dc7c103c133ae6244bf8909136a996deb35c50682422dedc16e4b61e"}, {"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/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}]}</bpmn:documentation>
    <bpmn:laneSet id="provider_Lanes_provider">
      <bpmn:lane id="provider_Lane_person" name="Действие человека">
        <bpmn:flowNodeRef>provider_notice</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>provider_decision</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>provider_reply</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>provider_end</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="provider_notice" name="Получено актуальное предложение">
      <bpmn:outgoing>provider_Flow_0</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:startEvent>
    <bpmn:userTask id="provider_decision" name="Подтвердить prepare или decline">
      <bpmn:incoming>provider_Flow_0</bpmn:incoming>
      <bpmn:outgoing>provider_Flow_1</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:sendTask id="provider_reply" name="Ответ с round id / action">
      <bpmn:incoming>provider_Flow_1</bpmn:incoming>
      <bpmn:outgoing>provider_Flow_2</bpmn:outgoing>
    </bpmn:sendTask>
    <bpmn:endEvent id="provider_end" name="Ответ отправлен, бизнес-результат ещё проверяется">
      <bpmn:incoming>provider_Flow_2</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="provider_Flow_0" sourceRef="provider_notice" targetRef="provider_decision" name="" />
    <bpmn:sequenceFlow id="provider_Flow_1" sourceRef="provider_decision" targetRef="provider_reply" name="" />
    <bpmn:sequenceFlow id="provider_Flow_2" sourceRef="provider_reply" targetRef="provider_end" name="" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_service_accepted_round">
    <bpmn:participant id="round_Pool_round" name="ACCEPTED: необязательное раннее подтверждение подготовки" processRef="round_Process_round" />
    <bpmn:participant id="provider_Pool_provider" name="Назначенный исполнитель: подтверждение подготовки" processRef="provider_Process_provider" />
    <bpmn:messageFlow id="Message_service_accepted_round_0" sourceRef="round_send" targetRef="provider_notice" name="XMPP send не доказывает получение приложением" />
    <bpmn:messageFlow id="Message_service_accepted_round_1" sourceRef="provider_reply" targetRef="round_response" name="Прямой ответ либо web relay с actor identity" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_service_accepted_round">
    <bpmndi:BPMNPlane id="Plane_service_accepted_round" bpmnElement="Collaboration_service_accepted_round">
      <bpmndi:BPMNShape id="round_DI_Pool_round" bpmnElement="round_Pool_round" isHorizontal="true">
        <dc:Bounds x="0.0" y="0.0" width="2600" height="580" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_Lane_worker" bpmnElement="round_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="0.0" width="2570" height="580" />
      </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="355.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_send" bpmnElement="round_send">
        <dc:Bounds x="655.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_wait" bpmnElement="round_wait">
        <dc:Bounds x="1005.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_response" bpmnElement="round_response">
        <dc:Bounds x="1292.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_validate" bpmnElement="round_validate">
        <dc:Bounds x="1525.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_valid" bpmnElement="round_valid">
        <dc:Bounds x="1855.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_decision" bpmnElement="round_decision">
        <dc:Bounds x="2085.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_ready" bpmnElement="round_ready">
        <dc:Bounds x="2422.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_reject" bpmnElement="round_reject">
        <dc:Bounds x="1862.0" y="292.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_timer" bpmnElement="round_timer">
        <dc:Bounds x="1292.0" y="462.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_timeout" bpmnElement="round_timeout">
        <dc:Bounds x="1525.0" y="445.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_timeout_end" bpmnElement="round_timeout_end">
        <dc:Bounds x="1862.0" y="462.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="355.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_1" bpmnElement="round_Flow_1">
        <di:waypoint x="505.0" y="100.0" />
        <di:waypoint x="655.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_2" bpmnElement="round_Flow_2">
        <di:waypoint x="805.0" y="100.0" />
        <di:waypoint x="1005.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_3" bpmnElement="round_Flow_3">
        <di:waypoint x="1055.0" y="100.0" />
        <di:waypoint x="1292.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_4" bpmnElement="round_Flow_4">
        <di:waypoint x="1328.0" y="100.0" />
        <di:waypoint x="1525.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_5" bpmnElement="round_Flow_5">
        <di:waypoint x="1675.0" y="100.0" />
        <di:waypoint x="1855.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_6" bpmnElement="round_Flow_6">
        <di:waypoint x="1905.0" y="100.0" />
        <di:waypoint x="2085.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_7" bpmnElement="round_Flow_7">
        <di:waypoint x="2235.0" y="100.0" />
        <di:waypoint x="2422.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_8" bpmnElement="round_Flow_8">
        <di:waypoint x="1880.0" y="125.0" />
        <di:waypoint x="1880.0" y="292.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_9" bpmnElement="round_Flow_9">
        <di:waypoint x="1055.0" y="100.0" />
        <di:waypoint x="1173.5" y="100.0" />
        <di:waypoint x="1173.5" y="480.0" />
        <di:waypoint x="1292.0" y="480.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_10" bpmnElement="round_Flow_10">
        <di:waypoint x="1328.0" y="480.0" />
        <di:waypoint x="1525.0" y="480.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_11" bpmnElement="round_Flow_11">
        <di:waypoint x="1675.0" y="480.0" />
        <di:waypoint x="1862.0" y="480.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="provider_DI_Pool_provider" bpmnElement="provider_Pool_provider" isHorizontal="true">
        <dc:Bounds x="0.0" y="780.0" width="1190" height="200" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="provider_DI_Lane_person" bpmnElement="provider_Lane_person" isHorizontal="true">
        <dc:Bounds x="30.0" y="780.0" width="1160" height="200" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="provider_DI_notice" bpmnElement="provider_notice">
        <dc:Bounds x="132.0" y="862.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="provider_DI_decision" bpmnElement="provider_decision">
        <dc:Bounds x="355.0" y="845.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="provider_DI_reply" bpmnElement="provider_reply">
        <dc:Bounds x="655.0" y="845.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="provider_DI_end" bpmnElement="provider_end">
        <dc:Bounds x="1012.0" y="862.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="provider_DI_Flow_0" bpmnElement="provider_Flow_0">
        <di:waypoint x="168.0" y="880.0" />
        <di:waypoint x="355.0" y="880.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="provider_DI_Flow_1" bpmnElement="provider_Flow_1">
        <di:waypoint x="505.0" y="880.0" />
        <di:waypoint x="655.0" y="880.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="provider_DI_Flow_2" bpmnElement="provider_Flow_2">
        <di:waypoint x="805.0" y="880.0" />
        <di:waypoint x="1012.0" y="880.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Message_service_accepted_round_0" bpmnElement="Message_service_accepted_round_0">
        <di:waypoint x="730" y="135" />
        <di:waypoint x="730" y="650" />
        <di:waypoint x="150" y="650" />
        <di:waypoint x="150" y="862" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="180" y="615" width="260" height="42" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Message_service_accepted_round_1" bpmnElement="Message_service_accepted_round_1">
        <di:waypoint x="730" y="915" />
        <di:waypoint x="2530" y="915" />
        <di:waypoint x="2530" y="30" />
        <di:waypoint x="1310" y="30" />
        <di:waypoint x="1310" y="82" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="2000" y="700" width="260" height="42" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

Получатель — текущий provider с JID из context. Сообщение order.action.required предлагает prepare/decline, передаёт available_from=prepare_available_at, due_at=pre_start_at, popup_policy=online_only. Это описание предлагаемого действия; показ интерфейса и прочтение человеком не гарантируются успешным XMPP-send.

Используются SERVICE_REQUEST_ACCEPTED_ROUND_STRATEGY, …DELIVERY_POLICY, число попыток, интервал и окно ответа. Общий срок раунда от создания: (attempts−1) × notification_interval + response_window. Пустой JID/список получателей не даёт успешного раунда; handler остаётся на повторе. Попытка учитывается до I/O, неуспешный send также может расходовать лимит.

У single_confirmation accept/prepare даёт winner, decline — no_winner, timeout — no_winner. У first_accept положительный ответ даёт winner, все отрицательные — no_winner, timeout — timed_out. Этот Python не равняет timed_out и no_winner; закрытый раунд не считается активным для проверки исчерпания, и последующий send может создать новый. При этом проверка обязательной pre_start_at-ветки предшествует любому ручному раунду.

Прямой XMPP-ответ связывается с JID отправителя; web intent принимается через доверенный relay с сохранением actor. Валидатор проверяет актуальные round/order/ticket/status, участника, действие, offer при наличии, срок и повтор. Подтверждение приёма ответа не равно сохранённому PRE_START. Маршруты handler-intents и прямой пользовательский actions API различаются; HTTP 202 relay подтверждает транспорт, не переход заказа.

Backend и внешнее платёжное действие (BPMN)

Схема BPMN

Загрузка схемы…

Исходник схемы
<?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_accepted_backend" targetNamespace="urn:sharix:knowledge:handlers">
  <bpmn:process id="backend_Process_backend" name="Канонический prepare-accepted: backend не заменяется ответом человека" isExecutable="false">
    <bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется Python из канонического Blockly.", "bind_card — особая ветка: повтор подготовки без отказа по failure counter.", "pre_start_at — обязательная попытка, не безусловный переход и не обход payment/concurrency gates.", "Платёжный backend выбирается facade; состав условий зависит от установки.", "Ожидаемый доменный отказ оставляет ACCEPTED. Исключение API — общий retry."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "75e50239792030dbbd4a29b1734865a6b44f5080a5cfa967636f486e64e950c8"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "33fe29b0dc7c103c133ae6244bf8909136a996deb35c50682422dedc16e4b61e"}, {"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/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}]}</bpmn:documentation>
    <bpmn:laneSet id="backend_Lanes_backend">
      <bpmn:lane id="backend_Lane_worker" name="Текущий scope + capability; expected provider под блокировкой">
        <bpmn:flowNodeRef>backend_start</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>backend_check</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>backend_conflict</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>backend_payment</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>backend_gate</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>backend_save</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>backend_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>backend_blocked</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="backend_start" name="prepare-accepted">
      <bpmn:outgoing>backend_Flow_0</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:startEvent>
    <bpmn:serviceTask id="backend_check" name="ACCEPTED, provider/user, eligibility, expected provider">
      <bpmn:incoming>backend_Flow_0</bpmn:incoming>
      <bpmn:outgoing>backend_Flow_1</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="backend_conflict" name="Проверить и заблокировать concurrency policy">
      <bpmn:incoming>backend_Flow_1</bpmn:incoming>
      <bpmn:outgoing>backend_Flow_2</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="backend_payment" name="handle_before_order_pre_start">
      <bpmn:incoming>backend_Flow_2</bpmn:incoming>
      <bpmn:outgoing>backend_Flow_3</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="backend_gate" name="Все условия допускают переход?">
      <bpmn:incoming>backend_Flow_3</bpmn:incoming>
      <bpmn:outgoing>backend_Flow_4</bpmn:outgoing>
      <bpmn:outgoing>backend_Flow_6</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="backend_save" name="Сохранить PRE_START; offline по настройке, prediction hook">
      <bpmn:incoming>backend_Flow_4</bpmn:incoming>
      <bpmn:outgoing>backend_Flow_5</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="backend_end" name="Успех/stale: текущий handler освобождается">
      <bpmn:incoming>backend_Flow_5</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:endEvent id="backend_blocked" name="Неуспех: ACCEPTED, retry; причина не равна отказу человека">
      <bpmn:incoming>backend_Flow_6</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="backend_Flow_0" sourceRef="backend_start" targetRef="backend_check" name="" />
    <bpmn:sequenceFlow id="backend_Flow_1" sourceRef="backend_check" targetRef="backend_conflict" name="" />
    <bpmn:sequenceFlow id="backend_Flow_2" sourceRef="backend_conflict" targetRef="backend_payment" name="" />
    <bpmn:sequenceFlow id="backend_Flow_3" sourceRef="backend_payment" targetRef="backend_gate" name="" />
    <bpmn:sequenceFlow id="backend_Flow_4" sourceRef="backend_gate" targetRef="backend_save" name="Да" />
    <bpmn:sequenceFlow id="backend_Flow_5" sourceRef="backend_save" targetRef="backend_end" name="" />
    <bpmn:sequenceFlow id="backend_Flow_6" sourceRef="backend_gate" targetRef="backend_blocked" name="Нет" />
  </bpmn:process>
  <bpmn:process id="client_Process_client" name="Клиент и платёжная система: действие вне handler" isExecutable="false">
    <bpmn:documentation>{"notes": ["Описательная BPMN, isExecutable=false; исполняется Python из канонического Blockly.", "bind_card — особая ветка: повтор подготовки без отказа по failure counter.", "pre_start_at — обязательная попытка, не безусловный переход и не обход payment/concurrency gates.", "Платёжный backend выбирается facade; состав условий зависит от установки.", "Ожидаемый доменный отказ оставляет ACCEPTED. Исключение API — общий retry."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "75e50239792030dbbd4a29b1734865a6b44f5080a5cfa967636f486e64e950c8"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "33fe29b0dc7c103c133ae6244bf8909136a996deb35c50682422dedc16e4b61e"}, {"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/payments/facade.py", "repository": "sharix-open-backend", "sha256": "57d0d71939f5bcd391090ca473008f2283e8d7fdb369486ff044e1fcf9cd3876"}]}</bpmn:documentation>
    <bpmn:laneSet id="client_Lanes_client">
      <bpmn:lane id="client_Lane_worker" name="Зависимость, если customer_action=bind_card">
        <bpmn:flowNodeRef>client_start</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>client_bind</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>client_refresh</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>client_end</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="client_start" name="Клиенту требуется привязать карту">
      <bpmn:outgoing>client_Flow_0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:userTask id="client_bind" name="Выполнить привязку через платёжный интерфейс">
      <bpmn:incoming>client_Flow_0</bpmn:incoming>
      <bpmn:outgoing>client_Flow_1</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:serviceTask id="client_refresh" name="Платёжный backend обновляет своё состояние">
      <bpmn:incoming>client_Flow_1</bpmn:incoming>
      <bpmn:outgoing>client_Flow_2</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="client_end" name="Следующий context/hook проверяет результат">
      <bpmn:incoming>client_Flow_2</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="client_Flow_0" sourceRef="client_start" targetRef="client_bind" name="" />
    <bpmn:sequenceFlow id="client_Flow_1" sourceRef="client_bind" targetRef="client_refresh" name="" />
    <bpmn:sequenceFlow id="client_Flow_2" sourceRef="client_refresh" targetRef="client_end" name="" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_service_accepted_backend">
    <bpmn:participant id="backend_Pool_backend" name="Канонический prepare-accepted: backend не заменяется ответом человека" processRef="backend_Process_backend" />
    <bpmn:participant id="client_Pool_client" name="Клиент и платёжная система: действие вне handler" processRef="client_Process_client" />
    <bpmn:messageFlow id="Message_service_accepted_backend_0" sourceRef="client_refresh" targetRef="backend_payment" name="Состояние заново читает facade; это не прямой обход gate" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_service_accepted_backend">
    <bpmndi:BPMNPlane id="Plane_service_accepted_backend" bpmnElement="Collaboration_service_accepted_backend">
      <bpmndi:BPMNShape id="backend_DI_Pool_backend" bpmnElement="backend_Pool_backend" isHorizontal="true">
        <dc:Bounds x="0.0" y="0.0" width="2150" height="440" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_Lane_worker" bpmnElement="backend_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="0.0" width="2120" height="440" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_start" bpmnElement="backend_start">
        <dc:Bounds x="132.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_check" bpmnElement="backend_check">
        <dc:Bounds x="365.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_conflict" bpmnElement="backend_conflict">
        <dc:Bounds x="675.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_payment" bpmnElement="backend_payment">
        <dc:Bounds x="985.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_gate" bpmnElement="backend_gate">
        <dc:Bounds x="1345.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_save" bpmnElement="backend_save">
        <dc:Bounds x="1605.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_end" bpmnElement="backend_end">
        <dc:Bounds x="1972.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="backend_DI_blocked" bpmnElement="backend_blocked">
        <dc:Bounds x="1352.0" y="322.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="backend_DI_Flow_0" bpmnElement="backend_Flow_0">
        <di:waypoint x="168.0" y="100.0" />
        <di:waypoint x="365.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="backend_DI_Flow_1" bpmnElement="backend_Flow_1">
        <di:waypoint x="515.0" y="100.0" />
        <di:waypoint x="675.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="backend_DI_Flow_2" bpmnElement="backend_Flow_2">
        <di:waypoint x="825.0" y="100.0" />
        <di:waypoint x="985.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="backend_DI_Flow_3" bpmnElement="backend_Flow_3">
        <di:waypoint x="1135.0" y="100.0" />
        <di:waypoint x="1345.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="backend_DI_Flow_4" bpmnElement="backend_Flow_4">
        <di:waypoint x="1395.0" y="100.0" />
        <di:waypoint x="1605.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="backend_DI_Flow_5" bpmnElement="backend_Flow_5">
        <di:waypoint x="1755.0" y="100.0" />
        <di:waypoint x="1972.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="backend_DI_Flow_6" bpmnElement="backend_Flow_6">
        <di:waypoint x="1370.0" y="125.0" />
        <di:waypoint x="1370.0" y="322.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="client_DI_Pool_client" bpmnElement="client_Pool_client" isHorizontal="true">
        <dc:Bounds x="0.0" y="650.0" width="1220" height="200" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="client_DI_Lane_worker" bpmnElement="client_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="650.0" width="1190" height="200" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="client_DI_start" bpmnElement="client_start">
        <dc:Bounds x="132.0" y="732.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="client_DI_bind" bpmnElement="client_bind">
        <dc:Bounds x="365.0" y="715.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="client_DI_refresh" bpmnElement="client_refresh">
        <dc:Bounds x="675.0" y="715.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="client_DI_end" bpmnElement="client_end">
        <dc:Bounds x="1042.0" y="732.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="client_DI_Flow_0" bpmnElement="client_Flow_0">
        <di:waypoint x="168.0" y="750.0" />
        <di:waypoint x="365.0" y="750.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="client_DI_Flow_1" bpmnElement="client_Flow_1">
        <di:waypoint x="515.0" y="750.0" />
        <di:waypoint x="675.0" y="750.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="client_DI_Flow_2" bpmnElement="client_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_accepted_backend_0" bpmnElement="Message_service_accepted_backend_0">
        <di:waypoint x="750" y="715" />
        <di:waypoint x="2080" y="715" />
        <di:waypoint x="2080" y="30" />
        <di:waypoint x="1060" y="30" />
        <di:waypoint x="1060" y="65" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1550" y="540" width="260" height="42" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

Scoped prepare-accepted требует capability order.prepare_accepted. Runtime передаёт expected provider id, SERVICE_REQUEST_SINGLE_ACTIVE_ORDER, SERVICE_REQUEST_OFFLINE_ON_PRE_START и допустимые location-поля из ответа победителя, если они есть. Backend под lock сверяет текущее назначение и ACCEPTED, корректного provider/user и hard eligibility; затем применяет concurrency policy и handle_before_order_pre_start выбранного платёжного backend через facade.

При допуске сохраняется PRE_START. По настройке предложения исполнителя переводятся offline, запускается предусмотренный prediction hook. Доменный отказ возвращает неуспех без обещания перехода. Даты prepare_available_at/pre_start_at этот narrow action отдельно не проверяет: время определяет текущий Python flow, а backend защищает бизнес-ограничения.

Клиент выполняет требуемую привязку в платёжном интерфейсе вне handler. Конкретный backend, gateway и набор условий зависят от установки; из одной facade нельзя вывести обязательный внешний платёжный сервис. После обновления состояния очередной context/hook заново оценивает готовность. Схема показывает эту зависимость, а не прямую команду от клиента перевести Ticket.

decline-provider — отдельный scoped action с собственным capability и expected provider. Он фиксирует DECLINED и очищает provider при успешном переходе, не возвращает заказ напрямую в BOOKED.

Настройки и диагностика

Назначение Настройка / источник
Начало подготовки pre_start_at = planned_start − SERVICE_REQUEST_PRE_START_DURATION_SECONDS
Начало раннего приглашения prepare_available_at = pre_start_at − SERVICE_REQUEST_ACCEPTED_REACTION_LEAD_SECONDS
Пропуск приглашения до обязательного срока SERVICE_REQUEST_ACCEPTED_AUTO_PRE_START
Обычный повтор SERVICE_REQUEST_ACCEPTED_RECHECK_SECONDS
Стратегия и доставка SERVICE_REQUEST_ACCEPTED_ROUND_STRATEGY, SERVICE_REQUEST_ACCEPTED_DELIVERY_POLICY
Число попыток / порог доменных неуспехов prepare SERVICE_REQUEST_ACCEPTED_NOTIFICATION_ATTEMPTS
Интервал и окно ответа SERVICE_REQUEST_ACCEPTED_NOTIFICATION_INTERVAL_SECONDS, SERVICE_REQUEST_ACCEPTED_RESPONSE_WINDOW_SECONDS
Дополнительные backend-параметры SERVICE_REQUEST_SINGLE_ACTIVE_ORDER, SERVICE_REQUEST_OFFLINE_ON_PRE_START

Счётчик доменных неуспехов prepare отличается от счётчика send-попыток, хотя использует тот же порог NOTIFICATION_ATTEMPTS. Исключение транспорта/401/403/5xx не является автоматически зарегистрированным отрицательным ответом исполнителя: оно идёт в processing_error и общий DEFERRED_TICKET_RECHECK_SECONDS.

Проверяйте последовательно текущий статус/provider, card-флаг и реальное payment state, обе даты, auto-настройку, outcome раунда, результат narrow action и сохранённый Ticket. Доменный отказ, send failure, молчание человека и ожидание карты — разные причины. Локальный provider_preparation сам по себе не доказывает отправки приглашения.

Round registry, ответы, send- и action-счётчики живут в памяти процесса и не восстанавливают старый round id после рестарта. Defer освобождает worker; backend event может сделать Ticket ready раньше. После commit перехода ticket.changed будит следующего владельца, ticket.moved очищает прежнего; periodic reconciliation по INTERVAL_TIME_BD_REQ восстанавливает состав при потере событий.

Проверенные источники

Git SHA/SHA-256 и модели закреплены в metadata/BPMN. Handler и бизнес-API при анализе не исполнялись. Сборщик повторно сверяет закреплённые источники; общий автоматический hook Wiki ещё не завершён.

Связанные материалы

sharixopen/knowledge/scenarios/service_request_accepted.1793221282.txt.gz · Последнее изменение: — sx_knowledge_api_open

© 2022 ShariX