{
"id": "ShariXKnowledgeServiceRequestDeclinedBPMN",
"page": "sharixopen:knowledge:scenarios:service_request_declined",
"area": "open",
"type": "procedure",
"title": "SERVICE_REQUEST в DECLINED: возврат в BOOKED и резервное закрытие",
"status": "review",
"schema_version": 1,
"relations": {
"related_to": [
"ShariXKnowledgeServiceRequestAcceptedBPMN",
"ShariXKnowledgeServiceRequestBookedBPMN",
"ShariXKnowledgeServiceRequestAssignedBPMN",
"ShariXKnowledgeOpenKnowledgeModulesHandlers",
"ShariXKnowledgeScenarios",
"ShariXKnowledgeClassification"
],
"verified_by": [
"ShariXKnowledgeVerification"
],
"depends_on": [
"ShariXKnowledgeOpenKnowledgeModulesHandlers",
"ShariXKnowledgeOpenKnowledgeModulesBackenddbsynce"
]
},
"extensions": {
"taxonomy": {
"domain": "business_processes",
"lifecycle": "implemented",
"component": "handlers_examples, handlers_backend, dbsynce, tickets",
"parents": [
"ShariXKnowledgeScenarios"
],
"terms": [
"audience_developer",
"audience_integrator",
"audience_support",
"audience_reviewer",
"audience_ai",
"product_sharix_open",
"material_scenario",
"topic_orders_lifecycle",
"topic_orders_assignment",
"topic_handlers_runtime"
]
},
"diagram": {
"format": "bpmn",
"executable": false
},
"source_evidence": [
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "handlers/open_service_request_declined.py",
"sha256": "94f135d86092ff98644b626724c4d50f48b9fcc61d23f733f9ee98f264a68657"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "generated_handler_blocks/open_service_request_declined.json",
"sha256": "d8f754511eefb8381512f28cf8fcd499a67218be67be51e91fe4448698a75859"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "catalog.py",
"sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "core/blockly_runtime.py",
"sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "core/requesters.py",
"sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "core/order_action_messages.py",
"sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "ticket_blockly_codegen.py",
"sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "ticket_codegen_contract.json",
"sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"
},
{
"repository": "sharix-open-tickets",
"commit": "edc0093b12ad3fd917f724985de8688b87f4ecd5",
"path": "lib/tickets.py",
"sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"
},
{
"repository": "sharix-open-tickets",
"commit": "edc0093b12ad3fd917f724985de8688b87f4ecd5",
"path": "api/handler_auth.py",
"sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"
},
{
"repository": "sharix-open-tickets",
"commit": "edc0093b12ad3fd917f724985de8688b87f4ecd5",
"path": "signals.py",
"sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"
},
{
"repository": "sharix-open-tickets",
"commit": "edc0093b12ad3fd917f724985de8688b87f4ecd5",
"path": "services/handler_wakeup.py",
"sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "apiviews/handler_order_workflow.py",
"sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "apiviews/open_api.py",
"sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "lib/order_handler_relay.py",
"sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "lib/handler_order_context.py",
"sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "lib/order_workflow_policy.py",
"sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "lib/order_actions.py",
"sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "lib/order_permissions.py",
"sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "urls.py",
"sha256": "c90fc2fbb75ef9aadbd6d7c110c0e19ef7ce0bec3aee7cddf3e0954c478d5dd8"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "lib/order_lifecycle.py",
"sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"
},
{
"repository": "sharix-open-backend",
"commit": "b70f6989f4c8616725b38f72fc15b8981a5dc47b",
"path": "lib/order_provider_requirements.py",
"sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "core/order_rounds.py",
"sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "settings_schema.py",
"sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"
}
],
"handler_process": {
"handler_id": "open_service_request_declined",
"source_kind": "git_builtin",
"canonical_python_verified": true,
"reviewed_on": "2026-10-29",
"generator": "tools/generate_handler_bpmn.py",
"generator_sha256": "488101a6be2f8f43d63ce966760be9f1c3664c88d88bed17ce0d6bfee9563cae",
"models": {
"logic": "cf5736b444d5720afb90f15061651f26b0a1081a6bd9345bc571adc37a12cd6c",
"handoff": "d3286b618e5ae241a1939e4c1cbde3ecef6d2f41c43fc8fd46e6b4a0394943a2"
}
},
"classification": {
"schema": "sharix.knowledge.classification.v1",
"products": [
"sharix_open"
],
"audiences": [
"developer",
"integrator",
"support",
"reviewer",
"ai"
],
"material": "scenario",
"topics": [
"orders/lifecycle",
"orders/assignment",
"handlers/runtime"
],
"tag_terms": [
"audience_developer",
"audience_integrator",
"audience_support",
"audience_reviewer",
"audience_ai",
"product_sharix_open",
"material_scenario",
"topic_orders_lifecycle",
"topic_orders_assignment",
"topic_handlers_runtime"
],
"registry_document": "ShariXKnowledgeClassification",
"state_meaning": "implemented — проверенная реализация исходников; not_applicable — указатель/правило; review — состояние редакции, не runtime"
},
"editorial_review": {
"date": "2026-10-31",
"scope": "Конкретные владельцы, действия, ограничения, диагностические шаги; списки и навигация",
"sources_verified": 24,
"handler_executed": false,
"runtime_checked": false,
"canonical_regeneration": {
"handler": "open_service_request_declined",
"kind": "ticket",
"compared_paths": [
"handlers/open_service_request_declined.py",
"generated_handlers/open_service_request_declined.py"
],
"sha256": "94f135d86092ff98644b626724c4d50f48b9fcc61d23f733f9ee98f264a68657"
},
"original_bpmn_preserved": true,
"source_changes": "Закреплённые tickets-файлы совпали; в backend urls.py только новые document download routes, handler routes сохранены; исходные BPMN refs оставлены как история"
}
},
"content_sha256": "f294a708ff9234b11748eac582f12fe9d18d3020aeff84f9d5f047ee74899bdb",
"schema": 1
}
====== SERVICE_REQUEST в DECLINED: возврат в BOOKED и резервное закрытие ======
~~NOCACHE~~
**Назначение:** [[sharixopen:knowledge:classification:materials|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products|ShariX Open]].
**Для кого:** [[sharixopen:knowledge:classification:audiences|Разработчик]] · [[sharixopen:knowledge:classification:audiences|Интегратор]] · [[sharixopen:knowledge:classification:audiences|Поддержка]] · [[sharixopen:knowledge:classification:audiences|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences|Нейросеть]].
**Темы:** [[sharixopen:knowledge:classification:topics|Заказы → Жизненный цикл]] · [[sharixopen:knowledge:classification:topics|Заказы → Назначение]] · [[sharixopen:knowledge:classification:topics|Обработчики → Runtime]].
**Область:** ShariX Open. **Обработчик:** ''open_service_request_declined'', тип ''SERVICE_REQUEST'' (2), статус ''DECLINED''. На 31.10.2026 обе опубликованные Python-копии побайтово совпали с генерацией Blockly workspace. Это проверка исходников, а не запуск операций над заказами.
===== Назначение и границы =====
Обработчик сопровождает заказ после зафиксированного отказа исполнителя. Его первое действие — попытка возврата в **BOOKED**, чтобы дальнейший процесс продолжил соответствующий handler. Он не выбирает новых кандидатов, не рассылает предложения и не повторяет раунд подтверждения самостоятельно.
Закрытие по сроку — резервная ветка после обработанного неуспеха возврата. Это принципиально отличается от схемы «подождать после отказа, затем всегда закрыть заказ». BPMN описательные, ''isExecutable=false''; исполняется выбранный проверенный Python, сгенерированный из Blockly.
===== Порядок решений (BPMN) =====
{"notes": ["BPMN описательная, isExecutable=false; канонический Python получен из Blockly.", "Возврат BOOKED имеет приоритет над проверкой срока закрытия.", "declined_close_at в runtime считается от Ticket.updated_at, не от создания заказа."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_declined.py", "repository": "sharix-open-handlers-examples", "sha256": "94f135d86092ff98644b626724c4d50f48b9fcc61d23f733f9ee98f264a68657"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_declined.json", "repository": "sharix-open-handlers-examples", "sha256": "d8f754511eefb8381512f28cf8fcd499a67218be67be51e91fe4448698a75859"}, {"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"}]}
declined_start
declined_return
declined_returned
declined_booked
declined_due
declined_close
declined_closed
declined_defer
declined_wait
declined_return_error
declined_close_error
declined_error
declined_Flow_0
declined_Flow_0
declined_Flow_1
declined_Flow_1
declined_Flow_2
declined_Flow_3
declined_Flow_2
declined_Flow_3
declined_Flow_4
declined_Flow_6
declined_Flow_4
declined_Flow_5
declined_Flow_5
declined_Flow_6
declined_Flow_7
declined_Flow_7
declined_Flow_8
declined_Flow_9
declined_Flow_8
declined_Flow_9
После проверки своего статуса загружается scoped order context, записывается локальная причина ''return_to_booked'', затем вызывается ''return-declined-to-booked''.
* Успех или stale освобождает текущую очередь и заканчивает проход. При успешном переходе далее работает BOOKED.
* Обработанный доменный неуспех позволяет проверить ''declined_close_at''.
* Только при наступившем сроке предпринимается ''close-declined''.
* Если срок ещё не наступил, назначается defer по ''SERVICE_REQUEST_DECLINED_RECHECK_SECONDS''.
Даже если срок закрытия уже прошёл, успешный возврат BOOKED имеет приоритет: проверка даты до него не выполняется. Исключение транспорта/API при возврате прерывает проход; fallback закрытия после исключения в том же проходе не вызывается.
Результаты API нужно различать:
* У wrapper возврата разрешён обработанный доменный неуспех: после него можно проверить срок закрытия.
* У ''close-declined'' результат строгий: отрицательный бизнес-ответ может перейти в общий ''processing_error''.
* Scoped 404 означает stale: локальное состояние очищается. Это не подтверждение перехода, выполненного именно данным вызовом.
* Исключение транспорта, авторизации или разбора ответа прерывает проход; резервное закрытие вслед за таким исключением не вызывается.
===== Backend и передача следующему обработчику (BPMN) =====
{"notes": ["BPMN описательная, isExecutable=false; канонический Python получен из Blockly.", "Возврат BOOKED имеет приоритет над проверкой срока закрытия.", "declined_close_at в runtime считается от Ticket.updated_at, не от создания заказа.", "Два narrow actions, не generic ticket.transition.", "Закрытие не выполняет платёжный gate DONE: это другая ветка жизненного цикла."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_declined.py", "repository": "sharix-open-handlers-examples", "sha256": "94f135d86092ff98644b626724c4d50f48b9fcc61d23f733f9ee98f264a68657"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_declined.json", "repository": "sharix-open-handlers-examples", "sha256": "d8f754511eefb8381512f28cf8fcd499a67218be67be51e91fe4448698a75859"}, {"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"}]}
backend_start
backend_check
backend_save
backend_notify
backend_end
backend_close
backend_scope
backend_closed
backend_Flow_0
backend_Flow_0
backend_Flow_1
backend_Flow_1
backend_Flow_2
backend_Flow_2
backend_Flow_6
backend_Flow_3
backend_Flow_3
backend_Flow_4
backend_Flow_4
backend_Flow_5
backend_Flow_5
backend_Flow_6
{"notes": ["BPMN описательная, isExecutable=false; канонический Python получен из Blockly.", "Возврат BOOKED имеет приоритет над проверкой срока закрытия.", "declined_close_at в runtime считается от Ticket.updated_at, не от создания заказа.", "Два narrow actions, не generic ticket.transition.", "Закрытие не выполняет платёжный gate DONE: это другая ветка жизненного цикла."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_declined.py", "repository": "sharix-open-handlers-examples", "sha256": "94f135d86092ff98644b626724c4d50f48b9fcc61d23f733f9ee98f264a68657"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_declined.json", "repository": "sharix-open-handlers-examples", "sha256": "d8f754511eefb8381512f28cf8fcd499a67218be67be51e91fe4448698a75859"}, {"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"}]}
queue_event
queue_sync
queue_end
queue_Flow_0
queue_Flow_0
queue_Flow_1
queue_Flow_1
Оба действия проходят HasHandlerAPIKey, отдельный capability и текущий Ticket scope. Они не используют произвольный generic ''ticket.transition''.
**Возврат в BOOKED** — ''return-declined-to-booked'':
* Требует capability ''order.return_declined_to_booked''.
* Блокирует актуальный Orders и проверяет ожидаемый DECLINED.
* Выполняет канонический переход в BOOKED; при успехе очищает прежний provider.
* Не ждёт grace, не проверяет дату резервного закрытия и не требует заранее пустого provider.
**Резервное закрытие** — ''close-declined'':
* Требует capability ''order.close_declined''.
* Под блокировкой проверяет DECLINED, затем выполняет канонический CLOSED.
* Сам action не проверяет возраст заявки: срок проверяет вызывающий Python.
* Платёжный gate закрытия DONE здесь не вызывается: это другая ветвь жизненного цикла.
После commit ''ticket.changed'' будит нового владельца, ''ticket.moved'' сообщает прежнему об уходе Ticket. Потерянная доставка не откатывает сохранённый статус; periodic reconciliation восстанавливает состав очередей. BOOKED далее самостоятельно решает вопрос входа в PENDING и пользовательских take/cancel. Этот handler не обещает мгновенного назначения нового исполнителя.
===== От какой даты считается fallback =====
Дата резервного закрытия рассчитывается так:
- Из order context берётся ''ticket.status_entered_at''.
- В текущем backend это **Ticket.updated_at**, а не отдельная неизменяемая дата входа в DECLINED.
- К ней прибавляется ''SERVICE_REQUEST_DECLINED_CLOSE_AFTER_SECONDS'' с минимумом 0.
- При отсутствующей или некорректной дате helper не считает срок наступившим.
Следовательно, обновление Ticket может сдвинуть расчётную дату. При отсутствии status_entered_at или некорректной дате helper не считает срок наступившим. Не следует обещать точное закрытие через заданный интервал после исторического отказа, если дата в Ticket менялась.
===== Ожидание, ошибки и диагностика =====
^ Назначение ^ Настройка ^
| Обычный повтор после неуспешного возврата без закрытия | ''SERVICE_REQUEST_DECLINED_RECHECK_SECONDS'' |
| Задержка резервного закрытия от context status_entered_at | ''SERVICE_REQUEST_DECLINED_CLOSE_AFTER_SECONDS'' |
| Общее исключение | ''DEFERRED_TICKET_RECHECK_SECONDS'', ''processing_error'' |
| Восстановление состава очереди | ''INTERVAL_TIME_BD_REQ'' |
Defer освобождает worker; внешнее событие может сделать Ticket ready раньше. Локальная причина ''return_to_booked'' не означает, что возврат уже сохранился. Здесь нет собственного пользовательского сообщения с требованием ответа: источником изменения служит канонический backend action либо другое разрешённое внешнее действие, после которого handler замечает смену статуса.
Порядок диагностики:
- Перечитайте фактические Orders, Ticket и provider; проверьте ответ ''return-declined-to-booked''.
- Если BOOKED уже сохранён, отсутствие последующего close ожидаемо: возврат имеет приоритет даже при прошедшем сроке.
- Если DECLINED сохранён, отдельно проверьте доменный ответ возврата, transport/auth error, расчёт даты и ответ close.
- Сопоставьте локальный reason/defer с каноническим статусом: ''return_to_booked'' обозначает намерение, а не сохранённый результат.
- Отсутствие XMPP-события само по себе не является основанием повторить прежнюю запись в API.
===== Проверенные источники =====
На 31.10.2026 повторно проверены закреплённые Git-файлы и каноническая генерация. В обновившихся репозиториях tickets исходные файлы не изменились; в backend изменился только ''urls.py'' — добавлены маршруты скачивания документов, маршруты этого сценария сохранены. BPMN сохранены вместе с историческими ссылками на исходники; актуальные commits приведены ниже. Общий автоматический hook обновления Wiki этой проверкой не подтверждается.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_service_request_declined.py|sharix-open-handlers-examples / handlers/open_service_request_declined.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_service_request_declined.json|sharix-open-handlers-examples / generated_handler_blocks/open_service_request_declined.json]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/catalog.py|sharix-open-handlers-examples / catalog.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/blockly_runtime.py|sharix-open-handlers-backend / core/blockly_runtime.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/requesters.py|sharix-open-handlers-backend / core/requesters.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/order_action_messages.py|sharix-open-handlers-backend / core/order_action_messages.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/ticket_blockly_codegen.py|sharix-open-handlers-backend / ticket_blockly_codegen.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/ticket_codegen_contract.json|sharix-open-handlers-backend / ticket_codegen_contract.json]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/edc0093b12ad3fd917f724985de8688b87f4ecd5/lib/tickets.py|sharix-open-tickets / lib/tickets.py]] — Git edc0093b12ad3fd917f724985de8688b87f4ecd5.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/edc0093b12ad3fd917f724985de8688b87f4ecd5/api/handler_auth.py|sharix-open-tickets / api/handler_auth.py]] — Git edc0093b12ad3fd917f724985de8688b87f4ecd5.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/edc0093b12ad3fd917f724985de8688b87f4ecd5/signals.py|sharix-open-tickets / signals.py]] — Git edc0093b12ad3fd917f724985de8688b87f4ecd5.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/edc0093b12ad3fd917f724985de8688b87f4ecd5/services/handler_wakeup.py|sharix-open-tickets / services/handler_wakeup.py]] — Git edc0093b12ad3fd917f724985de8688b87f4ecd5.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/apiviews/handler_order_workflow.py|sharix-open-backend / apiviews/handler_order_workflow.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/apiviews/open_api.py|sharix-open-backend / apiviews/open_api.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/lib/order_handler_relay.py|sharix-open-backend / lib/order_handler_relay.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/lib/handler_order_context.py|sharix-open-backend / lib/handler_order_context.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/lib/order_workflow_policy.py|sharix-open-backend / lib/order_workflow_policy.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/lib/order_actions.py|sharix-open-backend / lib/order_actions.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/lib/order_permissions.py|sharix-open-backend / lib/order_permissions.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/urls.py|sharix-open-backend / urls.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/lib/order_lifecycle.py|sharix-open-backend / lib/order_lifecycle.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/b70f6989f4c8616725b38f72fc15b8981a5dc47b/lib/order_provider_requirements.py|sharix-open-backend / lib/order_provider_requirements.py]] — Git b70f6989f4c8616725b38f72fc15b8981a5dc47b.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/order_rounds.py|sharix-open-handlers-backend / core/order_rounds.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/settings_schema.py|sharix-open-handlers-backend / settings_schema.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
===== Связанные материалы =====
* [[sharixopen:knowledge:scenarios:service_request_booked|BOOKED: дальнейший процесс]]
* [[sharixopen:knowledge:scenarios:service_request_accepted|ACCEPTED: условия decline-provider]]
* [[sharixopen:knowledge:scenarios:service_request_assigned|ASSIGNED: фиксация отказа]]
* [[sharixopen:knowledge:scenarios:start|Индекс сценариев]]
~~SHARIX_KNOWLEDGE_RELATED~~