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

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


sharixopen:knowledge:scenarios:access_request_declined

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
sharixopen:knowledge:scenarios:access_request_declined [2026/10/28 19:48] – [sharixknowledge] approved package sx_knowledge_api_opensharixopen:knowledge:scenarios:access_request_declined [2026/10/31 11:25] (текущий) – [sharixknowledge] approved package sx_knowledge_api_open
Строка 21: Строка 21:
             "domain": "business_processes",             "domain": "business_processes",
             "lifecycle": "implemented",             "lifecycle": "implemented",
-            "component": "handlers",+            "component": "handlers_examples, handlers_backend, dbsynce",
             "parents": [             "parents": [
                 "ShariXKnowledgeScenarios"                 "ShariXKnowledgeScenarios"
             ],             ],
             "terms": [             "terms": [
-                "ACCESS_REQUEST", +                "audience_developer", 
-                "DECLINED", +                "audience_administrator", 
-                "Permissions", +                "audience_support", 
-                "grace", +                "audience_reviewer", 
-                "BPMN"+                "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"
             ]             ]
         },         },
Строка 170: Строка 182:
                 "cleanup": "cdb124ed06615977193c991fb2d68a6ab6889da9746a973becd436ea00e05c69"                 "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": "42680c92f0f7ade9f97d5581c4ce831dd5a113a148df648c44a0a16d684d033c",+    "content_sha256": "5b48697fc7f4f539e205ee8b690a47c4557bfc715688a0dfe7d5f0d70a0919ed",
     "schema": 1     "schema": 1
 } }
Строка 179: Строка 251:
 ~~NOCACHE~~ ~~NOCACHE~~
  
-**Область:** ShariX Open. **Обработчик:** ''open_access_request_declined'', тип ''ACCESS_REQUEST'' (3), рабочий статус ''DECLINED'' (359). Опубликованный Python на 28.10.2026 побайтово совпадает с канонической генерацией из Blockly workspace. Фактически выбранная версия на сервере проверяется отдельно.+**Назначение:** [[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'' в этом handler не используется.+Обработчик сопровождает уже отклонённую заявку: 
 + 
 +  * не принимает новое решение об отказе; 
 +  * не отзывает active permission; 
 +  * не удаляет строку Permissions физически; 
 +  * после контрольного срока может пометить неактивное право status=2 (deleted); 
 +  * отдельно переводит Ticket в CLOSED. 
 + 
 +ACCREQ_AUTOACCEPT здесь не используется. 
 + 
 +Для расчёта срока важно: 
 + 
 +  * начало отсчёта — **Ticket.updated_at**; 
 +  * дата создания и отдельная дата решения не используются вместо него; 
 +  * новая сохранённая ревизия Ticket может сдвинуть срок; 
 +  * на каждом проходе заново проверяются статус Ticket и permission.
  
-Срок отсчитывается от **Ticket.updated_at**, а не даты создания заявки и не отдельно сохранённой даты решения. Новая сохранённая ревизия Ticket может сдвинуть контрольный срок. Одно лишь наступление таймера не гарантирует очистку: на каждом проходе снова проверяются текущий статус и состояние permission.+Наступление таймера само по себе не гарантирует очистку.
  
 Схемы имеют ''isExecutable=false'' и не запускают код. Runtime исполняет выбранный проверенный Python из Blockly. End event — завершение показанной операции, а не физическое удаление права или пользователя. Схемы имеют ''isExecutable=false'' и не запускают код. Runtime исполняет выбранный проверенный Python из Blockly. End event — завершение показанной операции, а не физическое удаление права или пользователя.
Строка 191: Строка 286:
 <sharix-bpmn> <sharix-bpmn>
 <?xml version="1.0" encoding="UTF-8"?> <?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_access_declined_logic" targetNamespace="urn:sharix:knowledge:handlers">+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:ns2="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:ns3="http://www.omg.org/spec/DD/20100524/DC" xmlns:ns4="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_access_declined_logic" targetNamespace="urn:sharix:knowledge:handlers">
   <bpmn:process id="declined_Process_declined" name="open_access_request_declined: проверка active, контрольный срок и очистка" isExecutable="false">   <bpmn:process id="declined_Process_declined" name="open_access_request_declined: проверка active, контрольный срок и очистка" isExecutable="false">
     <bpmn:documentation>{"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"}]}</bpmn:documentation>     <bpmn:documentation>{"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"}]}</bpmn:documentation>
Строка 365: Строка 460:
     <bpmn:messageFlow id="Message_access_declined_logic_0" sourceRef="declined_notify" targetRef="admins_Participant" name="ALERT: это уведомление, а не автоматический отзыв права" />     <bpmn:messageFlow id="Message_access_declined_logic_0" sourceRef="declined_notify" targetRef="admins_Participant" name="ALERT: это уведомление, а не автоматический отзыв права" />
   </bpmn:collaboration>   </bpmn:collaboration>
-  <bpmndi:BPMNDiagram id="Diagram_access_declined_logic"> +  <ns2:BPMNDiagram id="Diagram_access_declined_logic"> 
-    <bpmndi:BPMNPlane id="Plane_access_declined_logic" bpmnElement="Collaboration_access_declined_logic"> +    <ns2:BPMNPlane id="Plane_access_declined_logic" bpmnElement="Collaboration_access_declined_logic"> 
-      <bpmndi:BPMNShape id="declined_DI_Pool_declined" bpmnElement="declined_Pool_declined" isHorizontal="true"> +      <ns2:BPMNShape id="declined_DI_Pool_declined" bpmnElement="declined_Pool_declined" isHorizontal="true"> 
-        <dc:Bounds x="0.0" y="0.0" width="2270" height="1000" /> +        <ns3:Bounds x="0.0" y="0.0" width="2390.0" height="1000.0" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_Lane_worker" bpmnElement="declined_Lane_worker" isHorizontal="true"> +      <ns2:BPMNShape id="declined_DI_Lane_worker" bpmnElement="declined_Lane_worker" isHorizontal="true"> 
-        <dc:Bounds x="30.0" y="0.0" width="2240" height="605.0" /> +        <ns3:Bounds x="30.0" y="0.0" width="2360.0" height="605.0" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_Lane_queue" bpmnElement="declined_Lane_queue" isHorizontal="true"> +      <ns2:BPMNShape id="declined_DI_Lane_queue" bpmnElement="declined_Lane_queue" isHorizontal="true"> 
-        <dc:Bounds x="30.0" y="605.0" width="2240" height="395.0" /> +        <ns3:Bounds x="30.0" y="605.0" width="2360.0" height="395.0" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_start" bpmnElement="declined_start"> +      <ns2:BPMNShape id="declined_DI_start" bpmnElement="declined_start"> 
-        <dc:Bounds x="132.0" y="92.0" width="36" height="36" /> +        <ns3:Bounds x="132.0" y="92.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_status" bpmnElement="declined_status"> +      <ns2:BPMNShape id="declined_DI_status" bpmnElement="declined_status"> 
-        <dc:Bounds x="325.0" y="85.0" width="50" height="50" /> +        <ns3:Bounds x="325.0" y="85.0" width="50" height="50" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_lookup" bpmnElement="declined_lookup"> +      <ns2:BPMNShape id="declined_DI_lookup" bpmnElement="declined_lookup"> 
-        <dc:Bounds x="515.0" y="75.0" width="150" height="70" /> +        <ns3:Bounds x="515.0" y="75.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_active" bpmnElement="declined_active"> +      <ns2:BPMNShape id="declined_DI_active" bpmnElement="declined_active"> 
-        <dc:Bounds x="815.0" y="85.0" width="50" height="50" /> +        <ns3:Bounds x="815.0" y="85.0" width="50" height="50" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_notify" bpmnElement="declined_notify"> +      <ns2:BPMNShape id="declined_DI_notify" bpmnElement="declined_notify"> 
-        <dc:Bounds x="1025.0" y="75.0" width="150" height="70" /> +        <ns3:Bounds x="1025.0" y="75.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_active_wait" bpmnElement="declined_active_wait"> +      <ns2:BPMNShape id="declined_DI_active_wait" bpmnElement="declined_active_wait"> 
-        <dc:Bounds x="1285.0" y="75.0" width="150" height="70" /> +        <ns3:Bounds x="1285.0" y="75.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_stale" bpmnElement="declined_stale"> +      <ns2:BPMNShape id="declined_DI_stale" bpmnElement="declined_stale"> 
-        <dc:Bounds x="275.0" y="275.0" width="150" height="70" /> +        <ns3:Bounds x="275.0" y="275.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_stale_end" bpmnElement="declined_stale_end"> +      <ns2:BPMNShape id="declined_DI_stale_end" bpmnElement="declined_stale_end"> 
-        <dc:Bounds x="572.0" y="292.0" width="36" height="36" /> +        <ns3:Bounds x="572.0" y="292.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_age" bpmnElement="declined_age"> +      <ns2:BPMNShape id="declined_DI_age" bpmnElement="declined_age"> 
-        <dc:Bounds x="815.0" y="285.0" width="50" height="50" /> +        <ns3:Bounds x="815.0" y="285.0" width="50" height="50" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_delete" bpmnElement="declined_delete"> +      <ns2:BPMNShape id="declined_DI_delete" bpmnElement="declined_delete"> 
-        <dc:Bounds x="1025.0" y="275.0" width="150" height="70" /> +        <ns3:Bounds x="1025.0" y="275.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_close" bpmnElement="declined_close"> +      <ns2:BPMNShape id="declined_DI_close" bpmnElement="declined_close"> 
-        <dc:Bounds x="1285.0" y="275.0" width="150" height="70" /> +        <ns3:Bounds x="1285.0" y="275.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_confirmed" bpmnElement="declined_confirmed"> +      <ns2:BPMNShape id="declined_DI_confirmed" bpmnElement="declined_confirmed"> 
-        <dc:Bounds x="1595.0" y="285.0" width="50" height="50" /> +        <ns3:Bounds x="1595.0" y="285.0" width="50" height="50" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_remove" bpmnElement="declined_remove"> +      <ns2:BPMNShape id="declined_DI_remove" bpmnElement="declined_remove"> 
-        <dc:Bounds x="1805.0" y="275.0" width="150" height="70" /> +        <ns3:Bounds x="1805.0" y="275.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_end" bpmnElement="declined_end"> +      <ns2:BPMNShape id="declined_DI_end" bpmnElement="declined_end"> 
-        <dc:Bounds x="2092.0" y="292.0" width="36" height="36" /> +        <ns3:Bounds x="2092.0" y="292.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_not_found" bpmnElement="declined_not_found"> +      <ns2:BPMNShape id="declined_DI_not_found" bpmnElement="declined_not_found"> 
-        <dc:Bounds x="1602.0" y="472.0" width="36" height="36" /> +        <ns3:Bounds x="1602.0" y="472.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_grace" bpmnElement="declined_grace"> +      <ns2:BPMNShape id="declined_DI_grace" bpmnElement="declined_grace"> 
-        <dc:Bounds x="765.0" y="475.0" width="150" height="70" /> +        <ns3:Bounds x="765.0" y="475.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_lookup_error" bpmnElement="declined_lookup_error"> +      <ns2:BPMNShape id="declined_DI_lookup_error" bpmnElement="declined_lookup_error"> 
-        <dc:Bounds x="622.0" y="127.0" width="36" height="36" /> +        <ns3:Bounds x="622.0" y="127.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_delete_error" bpmnElement="declined_delete_error"> +      <ns2:BPMNShape id="declined_DI_delete_error" bpmnElement="declined_delete_error"> 
-        <dc:Bounds x="1132.0" y="327.0" width="36" height="36" /> +        <ns3:Bounds x="1132.0" y="327.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_close_error" bpmnElement="declined_close_error"> +      <ns2:BPMNShape id="declined_DI_close_error" bpmnElement="declined_close_error"> 
-        <dc:Bounds x="1392.0" y="327.0" width="36" height="36" /> +        <ns3:Bounds x="1392.0" y="327.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_retry" bpmnElement="declined_retry"> +      <ns2:BPMNShape id="declined_DI_retry" bpmnElement="declined_retry"> 
-        <dc:Bounds x="1805.0" y="475.0" width="150" height="70" /> +        <ns3:Bounds x="1805.0" y="475.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_wait" bpmnElement="declined_wait"> +      <ns2:BPMNShape id="declined_DI_wait" bpmnElement="declined_wait"> 
-        <dc:Bounds x="1075.0" y="745.0" width="50" height="50" /> +        <ns3:Bounds x="1075.0" y="745.0" width="50" height="50" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_timer" bpmnElement="declined_timer"> +      <ns2:BPMNShape id="declined_DI_timer" bpmnElement="declined_timer"> 
-        <dc:Bounds x="1342.0" y="682.0" width="36" height="36" /> +        <ns3:Bounds x="1342.0" y="682.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_revision" bpmnElement="declined_revision"> +      <ns2:BPMNShape id="declined_DI_revision" bpmnElement="declined_revision"> 
-        <dc:Bounds x="1342.0" y="882.0" width="36" height="36" /> +        <ns3:Bounds x="1342.0" y="882.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="declined_DI_ready" bpmnElement="declined_ready"> +      <ns2:BPMNShape id="declined_DI_ready" bpmnElement="declined_ready"> 
-        <dc:Bounds x="1545.0" y="735.0" width="150" height="70" /> +        <ns3:Bounds x="1545.0" y="735.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_0" bpmnElement="declined_Flow_0"> +      <ns2:BPMNEdge id="declined_DI_Flow_0" bpmnElement="declined_Flow_0"> 
-        <di:waypoint x="168.0" y="110.0" /> +        <ns4:waypoint x="168.0" y="110.0" /> 
-        <di:waypoint x="325.0" y="110.0" /> +        <ns4:waypoint x="325.0" y="110.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_1" bpmnElement="declined_Flow_1"> +      <ns2:BPMNEdge id="declined_DI_Flow_1" bpmnElement="declined_Flow_1"> 
-        <di:waypoint x="375.0" y="110.0" /> +        <ns4:waypoint x="375.0" y="110.0" /> 
-        <di:waypoint x="515.0" y="110.0" /> +        <ns4:waypoint x="515.0" y="110.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_2" bpmnElement="declined_Flow_2"> +      <ns2:BPMNEdge id="declined_DI_Flow_2" bpmnElement="declined_Flow_2"> 
-        <di:waypoint x="350.0" y="135.0" /> +        <ns4:waypoint x="350.0" y="135.0" /> 
-        <di:waypoint x="350.0" y="275.0" /> +        <ns4:waypoint x="350.0" y="275.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_3" bpmnElement="declined_Flow_3"> +      <ns2:BPMNEdge id="declined_DI_Flow_3" bpmnElement="declined_Flow_3"> 
-        <di:waypoint x="425.0" y="310.0" /> +        <ns4:waypoint x="425.0" y="310.0" /> 
-        <di:waypoint x="572.0" y="310.0" /> +        <ns4:waypoint x="572.0" y="310.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_4" bpmnElement="declined_Flow_4"> +      <ns2:BPMNEdge id="declined_DI_Flow_4" bpmnElement="declined_Flow_4"> 
-        <di:waypoint x="665.0" y="110.0" /> +        <ns4:waypoint x="665.0" y="110.0" /> 
-        <di:waypoint x="815.0" y="110.0" /> +        <ns4:waypoint x="815.0" y="110.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_5" bpmnElement="declined_Flow_5"> +      <ns2:BPMNEdge id="declined_DI_Flow_5" bpmnElement="declined_Flow_5"> 
-        <di:waypoint x="865.0" y="110.0" /> +        <ns4:waypoint x="865.0" y="110.0" /> 
-        <di:waypoint x="1025.0" y="110.0" /> +        <ns4:waypoint x="1025.0" y="110.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_6" bpmnElement="declined_Flow_6"> +      <ns2:BPMNEdge id="declined_DI_Flow_6" bpmnElement="declined_Flow_6"> 
-        <di:waypoint x="1175.0" y="110.0" /> +        <ns4:waypoint x="1175.0" y="110.0" /> 
-        <di:waypoint x="1285.0" y="110.0" /> +        <ns4:waypoint x="1285.0" y="110.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_7" bpmnElement="declined_Flow_7"> +      <ns2:BPMNEdge id="declined_DI_Flow_7" bpmnElement="declined_Flow_7"> 
-        <di:waypoint x="840.0" y="135.0" /> +        <ns4:waypoint x="840.0" y="135.0" /> 
-        <di:waypoint x="840.0" y="285.0" /> +        <ns4:waypoint x="840.0" y="285.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_8" bpmnElement="declined_Flow_8"> +      <ns2:BPMNEdge id="declined_DI_Flow_8" bpmnElement="declined_Flow_8"> 
-        <di:waypoint x="865.0" y="310.0" /> +        <ns4:waypoint x="865.0" y="310.0" /> 
-        <di:waypoint x="1025.0" y="310.0" /> +        <ns4:waypoint x="1025.0" y="310.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_9" bpmnElement="declined_Flow_9"> +      <ns2:BPMNEdge id="declined_DI_Flow_9" bpmnElement="declined_Flow_9"> 
-        <di:waypoint x="840.0" y="335.0" /> +        <ns4:waypoint x="840.0" y="335.0" /> 
-        <di:waypoint x="840.0" y="475.0" /> +        <ns4:waypoint x="840.0" y="475.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_10" bpmnElement="declined_Flow_10"> +      <ns2:BPMNEdge id="declined_DI_Flow_10" bpmnElement="declined_Flow_10"> 
-        <di:waypoint x="1175.0" y="310.0" /> +        <ns4:waypoint x="1175.0" y="310.0" /> 
-        <di:waypoint x="1285.0" y="310.0" /> +        <ns4:waypoint x="1285.0" y="310.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_11" bpmnElement="declined_Flow_11"> +      <ns2:BPMNEdge id="declined_DI_Flow_11" bpmnElement="declined_Flow_11"> 
-        <di:waypoint x="1435.0" y="310.0" /> +        <ns4:waypoint x="1435.0" y="310.0" /> 
-        <di:waypoint x="1595.0" y="310.0" /> +        <ns4:waypoint x="1595.0" y="310.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_12" bpmnElement="declined_Flow_12"> +      <ns2:BPMNEdge id="declined_DI_Flow_12" bpmnElement="declined_Flow_12"> 
-        <di:waypoint x="1645.0" y="310.0" /> +        <ns4:waypoint x="1645.0" y="310.0" /> 
-        <di:waypoint x="1805.0" y="310.0" /> +        <ns4:waypoint x="1805.0" y="310.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_13" bpmnElement="declined_Flow_13"> +      <ns2:BPMNEdge id="declined_DI_Flow_13" bpmnElement="declined_Flow_13"> 
-        <di:waypoint x="1955.0" y="310.0" /> +        <ns4:waypoint x="1955.0" y="310.0" /> 
-        <di:waypoint x="2092.0" y="310.0" /> +        <ns4:waypoint x="2092.0" y="310.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_14" bpmnElement="declined_Flow_14"> +      <ns2:BPMNEdge id="declined_DI_Flow_14" bpmnElement="declined_Flow_14"> 
-        <di:waypoint x="1620.0" y="335.0" /> +        <ns4:waypoint x="1620.0" y="335.0" /> 
-        <di:waypoint x="1620.0" y="472.0" /> +        <ns4:waypoint x="1620.0" y="472.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_15" bpmnElement="declined_Flow_15"> +      <ns2:BPMNEdge id="declined_DI_Flow_15" bpmnElement="declined_Flow_15"> 
-        <di:waypoint x="1435.0" y="110.0" /> +        <ns4:waypoint x="1435.0" y="110.0" /> 
-        <di:waypoint x="1490.0" y="110.0" /> +        <ns4:waypoint x="1490.0" y="110.0" /> 
-        <di:waypoint x="1490.0" y="620.0" /> +        <ns4:waypoint x="1490.0" y="620.0" /> 
-        <di:waypoint x="1100.0" y="620.0" /> +        <ns4:waypoint x="1100.0" y="620.0" /> 
-        <di:waypoint x="1100.0" y="745.0" /> +        <ns4:waypoint x="1100.0" y="745.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_16" bpmnElement="declined_Flow_16"> +      <ns2:BPMNEdge id="declined_DI_Flow_16" bpmnElement="declined_Flow_16"> 
-        <di:waypoint x="915.0" y="510.0" /> +        <ns4:waypoint x="915.0" y="510.0" /> 
-        <di:waypoint x="995.0" y="510.0" /> +        <ns4:waypoint x="995.0" y="510.0" /> 
-        <di:waypoint x="995.0" y="770.0" /> +        <ns4:waypoint x="995.0" y="770.0" /> 
-        <di:waypoint x="1075.0" y="770.0" /> +        <ns4:waypoint x="1075.0" y="770.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_17" bpmnElement="declined_Flow_17"> +      <ns2:BPMNEdge id="declined_DI_Flow_17" bpmnElement="declined_Flow_17"> 
-        <di:waypoint x="658.0" y="145.0" /> +        <ns4:waypoint x="658.0" y="145.0" /> 
-        <di:waypoint x="700.0" y="145.0" /> +        <ns4:waypoint x="700.0" y="145.0" /> 
-        <di:waypoint x="700.0" y="590.0" /> +        <ns4:waypoint x="700.0" y="590.0" /> 
-        <di:waypoint x="1880.0" y="590.0" /> +        <ns4:waypoint x="1880.0" y="590.0" /> 
-        <di:waypoint x="1880.0" y="475.0" /> +        <ns4:waypoint x="1880.0" y="475.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_18" bpmnElement="declined_Flow_18"> +      <ns2:BPMNEdge id="declined_DI_Flow_18" bpmnElement="declined_Flow_18"> 
-        <di:waypoint x="1168.0" y="345.0" /> +        <ns4:waypoint x="1168.0" y="345.0" /> 
-        <di:waypoint x="1210.0" y="345.0" /> +        <ns4:waypoint x="1210.0" y="345.0" /> 
-        <di:waypoint x="1210.0" y="580.0" /> +        <ns4:waypoint x="1210.0" y="580.0" /> 
-        <di:waypoint x="1880.0" y="580.0" /> +        <ns4:waypoint x="1880.0" y="580.0" /> 
-        <di:waypoint x="1880.0" y="475.0" /> +        <ns4:waypoint x="1880.0" y="475.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_19" bpmnElement="declined_Flow_19"> +      <ns2:BPMNEdge id="declined_DI_Flow_19" bpmnElement="declined_Flow_19"> 
-        <di:waypoint x="1428.0" y="345.0" /> +        <ns4:waypoint x="1428.0" y="345.0" /> 
-        <di:waypoint x="1470.0" y="345.0" /> +        <ns4:waypoint x="1470.0" y="345.0" /> 
-        <di:waypoint x="1880.0" y="345.0" /> +        <ns4:waypoint x="1880.0" y="345.0" /> 
-        <di:waypoint x="1880.0" y="475.0" /> +        <ns4:waypoint x="1880.0" y="475.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_20" bpmnElement="declined_Flow_20"> +      <ns2:BPMNEdge id="declined_DI_Flow_20" bpmnElement="declined_Flow_20"> 
-        <di:waypoint x="1955.0" y="510.0" /> +        <ns4:waypoint x="1955.0" y="510.0" /> 
-        <di:waypoint x="2010.0" y="510.0" /> +        <ns4:waypoint x="2010.0" y="510.0" /> 
-        <di:waypoint x="2010.0" y="640.0" /> +        <ns4:waypoint x="2010.0" y="640.0" /> 
-        <di:waypoint x="1100.0" y="640.0" /> +        <ns4:waypoint x="1100.0" y="640.0" /> 
-        <di:waypoint x="1100.0" y="745.0" /> +        <ns4:waypoint x="1100.0" y="745.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_21" bpmnElement="declined_Flow_21"> +      <ns2:BPMNEdge id="declined_DI_Flow_21" bpmnElement="declined_Flow_21"> 
-        <di:waypoint x="1125.0" y="770.0" /> +        <ns4:waypoint x="1125.0" y="770.0" /> 
-        <di:waypoint x="1233.5" y="770.0" /> +        <ns4:waypoint x="1233.5" y="770.0" /> 
-        <di:waypoint x="1233.5" y="700.0" /> +        <ns4:waypoint x="1233.5" y="700.0" /> 
-        <di:waypoint x="1342.0" y="700.0" /> +        <ns4:waypoint x="1342.0" y="700.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_22" bpmnElement="declined_Flow_22"> +      <ns2:BPMNEdge id="declined_DI_Flow_22" bpmnElement="declined_Flow_22"> 
-        <di:waypoint x="1125.0" y="770.0" /> +        <ns4:waypoint x="1125.0" y="770.0" /> 
-        <di:waypoint x="1233.5" y="770.0" /> +        <ns4:waypoint x="1233.5" y="770.0" /> 
-        <di:waypoint x="1233.5" y="900.0" /> +        <ns4:waypoint x="1233.5" y="900.0" /> 
-        <di:waypoint x="1342.0" y="900.0" /> +        <ns4:waypoint x="1342.0" y="900.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_23" bpmnElement="declined_Flow_23"> +      <ns2:BPMNEdge id="declined_DI_Flow_23" bpmnElement="declined_Flow_23"> 
-        <di:waypoint x="1378.0" y="700.0" /> +        <ns4:waypoint x="1378.0" y="700.0" /> 
-        <di:waypoint x="1461.5" y="700.0" /> +        <ns4:waypoint x="1461.5" y="700.0" /> 
-        <di:waypoint x="1461.5" y="770.0" /> +        <ns4:waypoint x="1461.5" y="770.0" /> 
-        <di:waypoint x="1545.0" y="770.0" /> +        <ns4:waypoint x="1545.0" y="770.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_24" bpmnElement="declined_Flow_24"> +      <ns2:BPMNEdge id="declined_DI_Flow_24" bpmnElement="declined_Flow_24"> 
-        <di:waypoint x="1378.0" y="900.0" /> +        <ns4:waypoint x="1378.0" y="900.0" /> 
-        <di:waypoint x="1461.5" y="900.0" /> +        <ns4:waypoint x="1461.5" y="900.0" /> 
-        <di:waypoint x="1461.5" y="770.0" /> +        <ns4:waypoint x="1461.5" y="770.0" /> 
-        <di:waypoint x="1545.0" y="770.0" /> +        <ns4:waypoint x="1545.0" y="770.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="declined_DI_Flow_25" bpmnElement="declined_Flow_25"> +      <ns2:BPMNEdge id="declined_DI_Flow_25" bpmnElement="declined_Flow_25"> 
-        <di:waypoint x="1695.0" y="770.0" /> +        <ns4:waypoint x="1695.0" y="770.0" /> 
-        <di:waypoint x="2260.0" y="770.0" /> +        <ns4:waypoint x="2260.0" y="770.0" /> 
-        <di:waypoint x="2260.0" y="25.0" /> +        <ns4:waypoint x="2260.0" y="25.0" /> 
-        <di:waypoint x="350.0" y="25.0" /> +        <ns4:waypoint x="350.0" y="25.0" /> 
-        <di:waypoint x="350.0" y="85.0" /> +        <ns4:waypoint x="350.0" y="85.0" /> 
-        <bpmndi:BPMNLabel> +        <ns2:BPMNLabel> 
-          <dc:Bounds x="1950.0" y="5.0" width="180" height="26" /> +          <ns3:Bounds x="1950.0" y="5.0" width="180" height="26" /> 
-        </bpmndi:BPMNLabel> +        </ns2:BPMNLabel> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNShape id="DI_admins_Participant" bpmnElement="admins_Participant" isHorizontal="true"> +      <ns2:BPMNShape id="DI_admins_Participant" bpmnElement="admins_Participant" isHorizontal="true"> 
-        <dc:Bounds x="0" y="1120" width="2300" height="100" /> +        <ns3:Bounds x="0" y="1120" width="2300" height="100" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNEdge id="DI_Message_access_declined_logic_0" bpmnElement="Message_access_declined_logic_0"> +      <ns2:BPMNEdge id="DI_Message_access_declined_logic_0" bpmnElement="Message_access_declined_logic_0"> 
-        <di:waypoint x="1100" y="145" /> +        <ns4:waypoint x="1100" y="145" /> 
-        <di:waypoint x="1100" y="210" /> +        <ns4:waypoint x="1100" y="210" /> 
-        <di:waypoint x="2350" y="210" /> +        <ns4:waypoint x="2350" y="210" /> 
-        <di:waypoint x="2350" y="1050" /> +        <ns4:waypoint x="2350" y="1050" /> 
-        <di:waypoint x="1150" y="1050" /> +        <ns4:waypoint x="1150" y="1050" /> 
-        <di:waypoint x="1150" y="1120" /> +        <ns4:waypoint x="1150" y="1120" /> 
-        <bpmndi:BPMNLabel> +        <ns2:BPMNLabel> 
-          <dc:Bounds x="1520" y="1020" width="260" height="42" /> +          <ns3:Bounds x="1520" y="1020" width="260" height="42" /> 
-        </bpmndi:BPMNLabel> +        </ns2:BPMNLabel> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-    </bpmndi:BPMNPlane> +    </ns2:BPMNPlane> 
-  </bpmndi:BPMNDiagram>+  </ns2:BPMNDiagram>
 </bpmn:definitions> </bpmn:definitions>
 </sharix-bpmn> </sharix-bpmn>
Строка 831: Строка 926:
 </sharix-bpmn> </sharix-bpmn>
  
-Runtime перед очисткой ещё раз читает permission. Если её не удалось найти, ''soft_delete_related_permission'' заканчивается без удаления, после чего handler всё равно переходит к запросу ''CLOSED''. Если повторное чтение уже показывает active, возникает ошибка, и Ticket автоматически не закрывается этой ветвью.+Повторное чтение 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 право по устаревшему снимку. Для существующей неактивной 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, не удаление пользователя и не отзыв произвольных других прав. Затем runtime отдельным scoped Ticket API запрашивает ''CLOSED''. Право уже могло получить deleted, а Ticket ещё оставаться DECLINED из-за ошибки второго запроса: общего commit этих двух операций нет.+Успехи двух операций подтверждают отдельно: 
 + 
 +  * **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 перед попыткой закрытия; он описан отдельно выше. Техническая стрелка между двумя API-пулами показывает последовательность запросов handler после ответа первой операции, а не прямой серверный вызов одного API другим. Случай отсутствующей permission является no-op на стороне runtime и не требует успешного POST soft_delete перед попыткой закрытия; он описан отдельно выше.
Строка 856: Строка 960:
 Defer хранится в памяти и освобождает worker; новая authoritative revision может его снять, повтор того же снимка — нет. При рестарте состояние заново читается из backend. Ошибку API-списка нельзя считать пустой очередью. Defer хранится в памяти и освобождает worker; новая authoritative revision может его снять, повтор того же снимка — нет. При рестарте состояние заново читается из backend. Ошибку API-списка нельзя считать пустой очередью.
  
-При диагностике различайте Ticket.status, его актуальный updated_at, рассчитанный deadline, фактический permission.status, связь с Ticket, Event soft delete и отдельный Event CLOSED. После неопределённого ответа сначала проверьте фактические состояния; не снимайте защиту active ради повторного запуска очистки. Долгое ожидание active permission является предусмотренной остановкой для разбора несогласованности.+При диагностике записать: 
 + 
 +  * Ticket.status и актуальный updated_at; 
 +  * рассчитанный deadline; 
 +  * permission.status и связь с Ticket; 
 +  * Event soft delete; 
 +  * отдельный Event CLOSED. 
 + 
 +После неопределённого ответа сначала сверяют фактическое состояние. Защиту active не снимают ради повторной очистки. Ожидание при active permission — предусмотренная остановка для разбора несогласованности.
  
 ===== Проверенные источники ===== ===== Проверенные источники =====
sharixopen/knowledge/scenarios/access_request_declined.1793216925.txt.gz · Последнее изменение: — sx_knowledge_api_open

© 2022 ShariX