{ "id": "ShariXKnowledgeAccessRequestDeclinedBPMN", "page": "sharixopen:knowledge:scenarios:access_request_declined", "area": "open", "type": "procedure", "title": "ACCESS_REQUEST в DECLINED: контрольный срок и безопасная очистка", "status": "review", "schema_version": 1, "relations": { "related_to": [ "ShariXKnowledgeAccessRequestPendingBPMN", "ShariXKnowledgeAccessRequestAcceptedBPMN", "ShariXKnowledgeOpenKnowledgeModulesHandlers", "ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth", "ShariXKnowledgeScenarios" ] }, "extensions": { "taxonomy": { "domain": "business_processes", "lifecycle": "implemented", "component": "handlers_examples, handlers_backend, dbsynce", "parents": [ "ShariXKnowledgeScenarios" ], "terms": [ "audience_developer", "audience_administrator", "audience_support", "audience_reviewer", "audience_ai", "product_sharix_open", "material_scenario", "topic_handlers_permissions", "topic_security_permissions", "access_request", "ticket_declined", "permissions", "grace_period", "bpmn", "ticket", "blockly", "generated_python" ] }, "diagram": { "format": "bpmn", "executable": false }, "source_evidence": [ { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_access_request_declined.py", "sha256": "3725a0a556c1cec48f66333b62b553a77095334dac1e77d1b06b95a0414dd0bc" }, { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_access_request_declined.json", "sha256": "8911b2a9d65d51a258b434e1e9fa4d4431a965aa3f195f62ac0d3c781d15a95e" }, { "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/handler_operations.py", "sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/data_parsers.py", "sha256": "d7f26f172f68e4b390f675de88fbfb3c37a58fb29d4bf3d6687b31bd7953f9e4" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/ejabberd_muc.py", "sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "classes/AccessRequestTicket.py", "sha256": "3f3a498ae76b3d878b19a8f32170fc2a71c6c6c182bf34a6ecc50edf7b0f5eff" }, { "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": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/handler_workflow.py", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_workflow.py", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/dicts.py", "sha256": "d92ddaa0964324e337303f8de110acf6ff21e15d7b40a6e523ce78ed48b7d8c5" } ], "handler_process": { "handler_id": "open_access_request_declined", "source_kind": "git_builtin", "canonical_python_verified": true, "reviewed_on": "2026-10-28", "generator": "tools/generate_handler_bpmn.py", "generator_sha256": "ca837a7b9e55bf58184bdf408a8035d25667ed9c5d3068ca52380b2ff5682f95", "models": { "logic": "0dfdcc4e6707f881984720da1673ec26849694308396c32fc356462df2b43a0b", "cleanup": "cdb124ed06615977193c991fb2d68a6ab6889da9746a973becd436ea00e05c69" } }, "diagram_view_bounds": { "reviewed_on": "2026-10-29", "models": [ "logic" ], "semantics_unchanged": true, "utility": "tools/expand_bpmn_view_bounds.py", "utility_sha256": "f878658b0115773e34f6c3eec72eba5984d873e60d8e2a4336b3dfb2a8026d87" }, "classification": { "schema": "sharix.knowledge.classification.v1", "products": [ "sharix_open" ], "audiences": [ "developer", "administrator", "support", "reviewer", "ai" ], "material": "scenario", "topics": [ "handlers/permissions", "security/permissions" ], "tag_terms": [ "audience_developer", "audience_administrator", "audience_support", "audience_reviewer", "audience_ai", "product_sharix_open", "material_scenario", "topic_handlers_permissions", "topic_security_permissions", "access_request", "ticket_declined", "permissions", "grace_period", "bpmn", "ticket", "blockly", "generated_python" ], "registry_document": "ShariXKnowledgeClassification", "state_meaning": "lifecycle относится к описываемому коду, а status к редакции документа; implemented не означает успешный runtime тест" }, "classification_review": { "date": "2026-10-31", "source": "Содержание текущей страницы и проверенный словарь классификации", "body_scope": "rewrite" }, "source_review_20261031": { "kind": "source_analysis_not_runtime_acceptance", "evidence_field": "extensions.source_evidence", "checked_on": "2026-10-31", "all_original_evidence_hashes_match_fresh_git": true, "canonical_generation": "Both runnable and generated copies match; no handler executed." } }, "content_sha256": "5b48697fc7f4f539e205ee8b690a47c4557bfc715688a0dfe7d5f0d70a0919ed", "schema": 1 } ====== ACCESS_REQUEST в DECLINED: контрольный срок и безопасная очистка ====== ~~NOCACHE~~ **Назначение:** [[sharixopen:knowledge:classification:materials#scenarij_processa|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]]. **Для кого:** [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#administrator|Администратор]] · [[sharixopen:knowledge:classification:audiences#podderzhka|Поддержка]] · [[sharixopen:knowledge:classification:audiences#recenzent_i_prijomschik|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]]. **Темы:** [[sharixopen:knowledge:classification:topics#access_request|Обработчики → ACCESS_REQUEST]] · [[sharixopen:knowledge:classification:topics#polnomochija|Доступ → Полномочия]]. **Область:** ShariX Open. **Обработчик:** ''open_access_request_declined'', тип ''ACCESS_REQUEST'' (3), рабочий статус ''DECLINED'' (359). 31.10.2026 опубликованные исходники повторно получены из Git. Обе Python-копии заново сопоставлены с результатом генерации Blockly; проверены 11 исходников генераторов. Сам handler не исполнялся. Выбранную версию, конфигурацию и внешние подключения сервера проверяют отдельно. ===== Назначение и границы ===== Обработчик сопровождает уже отклонённую заявку: * не принимает новое решение об отказе; * не отзывает active permission; * не удаляет строку Permissions физически; * после контрольного срока может пометить неактивное право status=2 (deleted); * отдельно переводит Ticket в CLOSED. ACCREQ_AUTOACCEPT здесь не используется. Для расчёта срока важно: * начало отсчёта — **Ticket.updated_at**; * дата создания и отдельная дата решения не используются вместо него; * новая сохранённая ревизия Ticket может сдвинуть срок; * на каждом проходе заново проверяются статус Ticket и permission. Наступление таймера само по себе не гарантирует очистку. Схемы имеют ''isExecutable=false'' и не запускают код. Runtime исполняет выбранный проверенный Python из Blockly. End event — завершение показанной операции, а не физическое удаление права или пользователя. ===== Один проход и контрольный срок (BPMN) ===== {"notes": ["BPMN isExecutable=false; генератор не выполняет handler.", "grace_deadline=Ticket.updated_at + ACCESS_REQUEST_DECLINED_CLEANUP_GRACE_DAYS.", "deferred_until=min(grace_deadline, now+DEFERRED_TICKET_RECHECK_SECONDS) при ожидании grace.", "Soft delete означает status=2; active permission не удаляется этим workflow."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_access_request_declined.py", "repository": "sharix-open-handlers-examples", "sha256": "3725a0a556c1cec48f66333b62b553a77095334dac1e77d1b06b95a0414dd0bc"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_access_request_declined.json", "repository": "sharix-open-handlers-examples", "sha256": "8911b2a9d65d51a258b434e1e9fa4d4431a965aa3f195f62ac0d3c781d15a95e"}, {"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/handler_operations.py", "repository": "sharix-open-handlers-backend", "sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/data_parsers.py", "repository": "sharix-open-handlers-backend", "sha256": "d7f26f172f68e4b390f675de88fbfb3c37a58fb29d4bf3d6687b31bd7953f9e4"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/ejabberd_muc.py", "repository": "sharix-open-handlers-backend", "sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "classes/AccessRequestTicket.py", "repository": "sharix-open-handlers-backend", "sha256": "3f3a498ae76b3d878b19a8f32170fc2a71c6c6c182bf34a6ecc50edf7b0f5eff"}, {"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/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"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_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/dicts.py", "repository": "sharix-open-backend", "sha256": "d92ddaa0964324e337303f8de110acf6ff21e15d7b40a6e523ce78ed48b7d8c5"}]} declined_start declined_status declined_lookup declined_active declined_notify declined_active_wait declined_stale declined_stale_end declined_age declined_delete declined_close declined_confirmed declined_remove declined_end declined_not_found declined_grace declined_lookup_error declined_delete_error declined_close_error declined_retry declined_wait declined_timer declined_revision declined_ready declined_Flow_0 declined_Flow_0 declined_Flow_25 declined_Flow_1 declined_Flow_2 declined_Flow_1 declined_Flow_4 declined_Flow_4 declined_Flow_5 declined_Flow_7 declined_Flow_5 declined_Flow_6 ACCESS_REQUEST_INCONSISTENCY_RECHECK_SECONDS declined_Flow_6 declined_Flow_15 declined_Flow_2 declined_Flow_3 declined_Flow_3 declined_Flow_7 declined_Flow_8 declined_Flow_9 declined_Flow_8 declined_Flow_10 declined_Flow_10 declined_Flow_11 declined_Flow_11 declined_Flow_12 declined_Flow_14 declined_Flow_12 declined_Flow_13 declined_Flow_13 declined_Flow_14 До min(grace_deadline, now+DEFERRED_TICKET_RECHECK_SECONDS); не один сон до конца всего grace. declined_Flow_9 declined_Flow_16 declined_Flow_17 declined_Flow_18 declined_Flow_19 declined_Flow_17 declined_Flow_18 declined_Flow_19 declined_Flow_20 declined_Flow_15 declined_Flow_16 declined_Flow_20 declined_Flow_21 declined_Flow_22 declined_Flow_21 declined_Flow_23 deferred_until declined_Flow_22 declined_Flow_24 declined_Flow_23 declined_Flow_24 declined_Flow_25 * Не свой статус — запросить удаление локального Ticket и комнаты. * Связанная permission active — отправить ALERT администраторам, записать ''related_permission_active'' и ждать по ''ACCESS_REQUEST_INCONSISTENCY_RECHECK_SECONDS''. До проверки grace и очистки эта ветвь не доходит. * Permission не active либо read не нашёл её — сравнить возраст ''Ticket.updated_at'' с ''ACCESS_REQUEST_DECLINED_CLEANUP_GRACE_DAYS''. * Срок ещё не наступил — записать локальную причину ''declined_permission_grace'' и назначить короткий повтор до ближайшего контрольного момента. * Срок наступил — повторно прочитать permission, выполнить разрешённый soft delete, затем отдельно запросить ''CLOSED'' и после подтверждения убрать Ticket/комнату. Read permission привязан к текущему типу/статусу Ticket и handler identity. 404 возвращается как отсутствие объекта, но может означать также устаревший scope. Несколько связанных permission дают 409 и общий retry, а не произвольный выбор записи. Поэтому диагностика «не найдена» включает актуальный статус и связь Ticket, а не только поиск строки Permissions. ===== Как рассчитывается ожидание ===== Условие готовности: возраст ''updated_at'' не меньше количества дней из ''ACCESS_REQUEST_DECLINED_CLEANUP_GRACE_DAYS''. В коде допускается 0 дней, то есть немедленная проверка очистки при соблюдении остальных условий. При ожидании конечная граница — ''updated_at + grace_days''. Следующий локальный срок — минимум этой границы и ''now + DEFERRED_TICKET_RECHECK_SECONDS''. Это короткие повторные проверки, а не занятый worker и не один длинный сон до конца всего grace. В журнал передаётся пояснение об ожидании контрольного срока; сохранённая локальная причина остаётся ''declined_permission_grace''. Если ''updated_at'' отсутствует или не разбирается, проверка возраста возвращает false, а helper расчёта defer не устанавливает срок. Это не подтверждённое ожидание по корректному grace: необходимо исправить/сверить данные Ticket. Страница не предполагает конкретного значения интервалов на сервере. ===== Backend повторяет защиту от удаления active (BPMN) ===== {"notes": ["BPMN isExecutable=false; генератор не выполняет handler.", "grace_deadline=Ticket.updated_at + ACCESS_REQUEST_DECLINED_CLEANUP_GRACE_DAYS.", "deferred_until=min(grace_deadline, now+DEFERRED_TICKET_RECHECK_SECONDS) при ожидании grace.", "Soft delete означает status=2; active permission не удаляется этим workflow.", "Показаны отдельные API-операции; общего commit soft-delete и CLOSED нет."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_access_request_declined.py", "repository": "sharix-open-handlers-examples", "sha256": "3725a0a556c1cec48f66333b62b553a77095334dac1e77d1b06b95a0414dd0bc"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_access_request_declined.json", "repository": "sharix-open-handlers-examples", "sha256": "8911b2a9d65d51a258b434e1e9fa4d4431a965aa3f195f62ac0d3c781d15a95e"}, {"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/handler_operations.py", "repository": "sharix-open-handlers-backend", "sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/data_parsers.py", "repository": "sharix-open-handlers-backend", "sha256": "d7f26f172f68e4b390f675de88fbfb3c37a58fb29d4bf3d6687b31bd7953f9e4"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/ejabberd_muc.py", "repository": "sharix-open-handlers-backend", "sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "classes/AccessRequestTicket.py", "repository": "sharix-open-handlers-backend", "sha256": "3f3a498ae76b3d878b19a8f32170fc2a71c6c6c182bf34a6ecc50edf7b0f5eff"}, {"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/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"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_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/dicts.py", "repository": "sharix-open-backend", "sha256": "d92ddaa0964324e337303f8de110acf6ff21e15d7b40a6e523ce78ed48b7d8c5"}]} permission_start permission_lock permission_find permission_active permission_save permission_ok permission_end permission_reject permission_missing permission_Flow_0 permission_Flow_0 permission_Flow_1 permission_Flow_1 permission_Flow_2 permission_Flow_2 permission_Flow_3 permission_Flow_4 permission_Flow_3 permission_Flow_5 permission_Flow_5 permission_Flow_6 permission_Flow_6 permission_Flow_4 {"notes": ["BPMN isExecutable=false; генератор не выполняет handler.", "grace_deadline=Ticket.updated_at + ACCESS_REQUEST_DECLINED_CLEANUP_GRACE_DAYS.", "deferred_until=min(grace_deadline, now+DEFERRED_TICKET_RECHECK_SECONDS) при ожидании grace.", "Soft delete означает status=2; active permission не удаляется этим workflow.", "Показаны отдельные API-операции; общего commit soft-delete и CLOSED нет."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_access_request_declined.py", "repository": "sharix-open-handlers-examples", "sha256": "3725a0a556c1cec48f66333b62b553a77095334dac1e77d1b06b95a0414dd0bc"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_access_request_declined.json", "repository": "sharix-open-handlers-examples", "sha256": "8911b2a9d65d51a258b434e1e9fa4d4431a965aa3f195f62ac0d3c781d15a95e"}, {"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/handler_operations.py", "repository": "sharix-open-handlers-backend", "sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/data_parsers.py", "repository": "sharix-open-handlers-backend", "sha256": "d7f26f172f68e4b390f675de88fbfb3c37a58fb29d4bf3d6687b31bd7953f9e4"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/ejabberd_muc.py", "repository": "sharix-open-handlers-backend", "sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "classes/AccessRequestTicket.py", "repository": "sharix-open-handlers-backend", "sha256": "3f3a498ae76b3d878b19a8f32170fc2a71c6c6c182bf34a6ecc50edf7b0f5eff"}, {"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/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"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_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/dicts.py", "repository": "sharix-open-backend", "sha256": "d92ddaa0964324e337303f8de110acf6ff21e15d7b40a6e523ce78ed48b7d8c5"}]} ticket_start ticket_scope ticket_change ticket_wake ticket_done ticket_Flow_0 ticket_Flow_0 ticket_Flow_1 ticket_Flow_1 ticket_Flow_2 ticket_Flow_2 ticket_Flow_3 ticket_Flow_3 Повторное чтение permission перед очисткой даёт разные пути: * **Permission не найдена:** soft_delete_related_permission возвращается без удаления; handler затем пробует CLOSED. * **Permission стала active:** возникает ошибка; эта ветвь автоматически Ticket не закрывает. * **Неактивная permission найдена:** выполняется scoped soft_delete, backend повторяет защиту. Для существующей неактивной permission запрос идёт на ''dbsynce/api/handler/ticket/{ticket_id}/permission/'' с действием ''soft_delete''. Backend требует capability ''related.permission.status'', текущий Ticket scope и единственную связь, блокирует Ticket/permission и повторно проверяет сохранённый статус. Если право стало active между чтениями и записью, операция отклоняется. Такая гонка не разрешает удалить active право по устаревшему снимку. Успехи двух операций подтверждают отдельно: * **Soft delete:** сохранены status=2 и Event; это не SQL DELETE, не удаление пользователя и не отзыв иных прав. * **Закрытие Ticket:** следующий scoped запрос перевёл его в CLOSED. Общего commit для этих двух запросов нет. Permission уже может быть deleted, а Ticket ещё DECLINED из-за ошибки второго запроса. Техническая стрелка между двумя API-пулами показывает последовательность запросов handler после ответа первой операции, а не прямой серверный вызов одного API другим. Случай отсутствующей permission является no-op на стороне runtime и не требует успешного POST soft_delete перед попыткой закрытия; он описан отдельно выше. ===== Внешнее решение и уведомление ===== ALERT при active permission направляется в MUC-комнату Ticket по правилам [[sharixopen:knowledge:scenarios:access_request_pending|PENDING]]. Администратор должен разобраться, согласованы ли решение Ticket и действующее право, используя штатные права и доменные операции. Handler не выбирает вместо него деактивацию и не считает текст ответа в комнате командой на удаление. В этих сообщениях нет durable verification ack; повторные проходы могут повторять ALERT. Сообщение не доказывает прочтение и не выдаёт право менять Ticket. В текущем lifecycle из DECLINED допускаются ''ACCEPTED'' или ''CLOSED'' при соответствующих правах; изменение одного Ticket-статуса само по себе не создаёт, не активирует и не отзывает право. После канонического перехода backend публикует события после commit. ''ticket.moved'' исключает снимок прежнего handler, в том числе через pending discard для занятого worker. Для ACCEPTED действует соответствующий handler; для CLOSED отдельного ''open_access_request_closed'' нет. Потерю XMPP-событий восстанавливает periodic reconciliation. ===== Ошибки и диагностика ===== ^ Состояние ^ Повтор / действие ^ | Active permission при DECLINED | ALERT, ''related_permission_active'', ''ACCESS_REQUEST_INCONSISTENCY_RECHECK_SECONDS'' | | Grace ещё не истёк | ''declined_permission_grace'', короткий defer до min контрольного срока и общего recheck | | Ошибка read/soft-delete/уведомления/перехода вне локальной обработки | ''processing_error'', ''DEFERRED_TICKET_RECHECK_SECONDS'' | | 404 при переходе CLOSED | Локальная очистка как при устаревшем scope | | Потеря события / восстановление состава | Scoped periodic список по ''INTERVAL_TIME_BD_REQ'' | Defer хранится в памяти и освобождает worker; новая authoritative revision может его снять, повтор того же снимка — нет. При рестарте состояние заново читается из backend. Ошибку API-списка нельзя считать пустой очередью. При диагностике записать: * Ticket.status и актуальный updated_at; * рассчитанный deadline; * permission.status и связь с Ticket; * Event soft delete; * отдельный Event CLOSED. После неопределённого ответа сначала сверяют фактическое состояние. Защиту active не снимают ради повторной очистки. Ожидание при active permission — предусмотренная остановка для разбора несогласованности. ===== Проверенные источники ===== Git SHA, SHA-256 и параметры моделей закреплены в metadata и documentation BPMN. Код handler при анализе не исполнялся. Изменение источников требует повторного сопоставления алгоритма и API/ACL, а не одной смены хешей. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_access_request_declined.py|sharix-open-handlers-examples / handlers/open_access_request_declined.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_access_request_declined.json|sharix-open-handlers-examples / generated_handler_blocks/open_access_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/handler_operations.py|sharix-open-handlers-backend / core/handler_operations.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/data_parsers.py|sharix-open-handlers-backend / core/data_parsers.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/ejabberd_muc.py|sharix-open-handlers-backend / core/ejabberd_muc.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/classes/AccessRequestTicket.py|sharix-open-handlers-backend / classes/AccessRequestTicket.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/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/lib/tickets.py|sharix-open-tickets / lib/tickets.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/api/views/handler_workflow.py|sharix-open-tickets / api/views/handler_workflow.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/api/handler_auth.py|sharix-open-tickets / api/handler_auth.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/utils.py|sharix-open-tickets / utils.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/views/ticket_detail.py|sharix-open-tickets / views/ticket_detail.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/signals.py|sharix-open-tickets / signals.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/services/handler_wakeup.py|sharix-open-tickets / services/handler_wakeup.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/apiviews/handler_workflow.py|sharix-open-backend / apiviews/handler_workflow.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/dicts.py|sharix-open-backend / lib/dicts.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093. ===== Связанные материалы ===== * [[sharixopen:knowledge:scenarios:access_request_pending|PENDING: решение по запросу]] * [[sharixopen:knowledge:scenarios:access_request_accepted|ACCEPTED: требования и активация]] * [[sharixopen:knowledge:modules:handlers|Обработчики и граница исполнения]] * [[sharixopen:knowledge:scenarios:start|Все сценарии]] ~~SHARIX_KNOWLEDGE_RELATED~~