| Следующая версия | Предыдущая версия |
| sharixopen:knowledge:scenarios:order_create [2026/10/29 08:30] – [sharixknowledge] approved package sx_knowledge_api_open | sharixopen:knowledge:scenarios:order_create [2026/10/31 11:24] (текущий) – [sharixknowledge] approved package sx_knowledge_api_open |
|---|
| "ShariXKnowledgeOpenKnowledgeArchitectureApicontracts", | "ShariXKnowledgeOpenKnowledgeArchitectureApicontracts", |
| "ShariXKnowledgeOpenKnowledgeDomainOrderticket" | "ShariXKnowledgeOpenKnowledgeDomainOrderticket" |
| | ], |
| | "depends_on": [ |
| | "ShariXKnowledgeOpenKnowledgeArchitectureApicontracts", |
| | "ShariXKnowledgeOpenKnowledgeDomainOrderticket" |
| | ], |
| | "verified_by": [ |
| | "ShariXKnowledgeOpenKnowledgeDevelopmentAcceptance" |
| ] | ] |
| }, | }, |
| "extensions": { | "extensions": { |
| "taxonomy": { | "taxonomy": { |
| "domain": "business_processes", | "domain": "use_cases", |
| "lifecycle": "documented", | "lifecycle": "implemented", |
| "parents": [ | "parents": [ |
| "ShariXKnowledgeScenarios" | "ShariXKnowledgeScenarios" |
| ], | ], |
| "terms": [] | "terms": [ |
| | "audience_developer", |
| | "audience_integrator", |
| | "audience_reviewer", |
| | "audience_ai", |
| | "product_sharix_open", |
| | "material_scenario", |
| | "topic_orders_creation", |
| | "topic_orders_lifecycle", |
| | "topic_api_contracts", |
| | "order", |
| | "ticket" |
| | ], |
| | "component": "dbsynce, tickets, webapp-base" |
| }, | }, |
| "source_evidence": [ | "source_evidence": [ |
| "format": "bpmn", | "format": "bpmn", |
| "executable": false | "executable": false |
| | }, |
| | "editorial_review": { |
| | "date": "2026-10-31", |
| | "scope": "rewrite", |
| | "batch": 3, |
| | "public_boundary": "Открытый код ShariX Open; детали закрытых компонентов и внутренние операции Platform — intrawiki." |
| | }, |
| | "source_review_20261031": { |
| | "kind": "source_analysis_not_runtime_acceptance", |
| | "sources": [ |
| | { |
| | "repository": "sharix-open-backend", |
| | "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", |
| | "path": "lib/open_order_api.py", |
| | "sha256": "8950a4169a352db3d250c9e08f6de7a4fa2a31985a247541411e20bd224ca2b6" |
| | }, |
| | { |
| | "repository": "sharix-open-backend", |
| | "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", |
| | "path": "lib/integration_ports.py", |
| | "sha256": "d079ec56e6709b29d7755e47d2a88d423235fe8eb1bf7a92851ae25d74bf1066" |
| | }, |
| | { |
| | "repository": "sharix-open-backend", |
| | "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", |
| | "path": "lib/ticket_gen.py", |
| | "sha256": "7bdf92007916aec7e968a45f142e5f98fffb5dfe9b61ee7fcae3c65c826dfbde" |
| | }, |
| | { |
| | "repository": "sharix-open-backend", |
| | "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", |
| | "path": "lib/mobile_order_events.py", |
| | "sha256": "818b21d471b629dcae3d96ee089e0f83406a41d03ad36a6c4ddabdf8857f2e68" |
| | }, |
| | { |
| | "repository": "sharix-open-backend", |
| | "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", |
| | "path": "apiviews/open_api.py", |
| | "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3" |
| | }, |
| | { |
| | "repository": "sharix-open-backend", |
| | "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", |
| | "path": "urls.py", |
| | "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158" |
| | }, |
| | { |
| | "repository": "sharix-open-tickets", |
| | "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", |
| | "path": "signals.py", |
| | "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e" |
| | }, |
| | { |
| | "repository": "sharix-open-webapp-base", |
| | "commit": "3e05f96d8fbae165c7b7f91d58048ff81c866be4", |
| | "path": "core/urls.py", |
| | "sha256": "5997b9600b4ef8be878201d83923edc961e881cac2c0245c7486f64d4e35e7e1" |
| | }, |
| | { |
| | "repository": "sharix-open-webapp-base", |
| | "commit": "3e05f96d8fbae165c7b7f91d58048ff81c866be4", |
| | "path": "sharix_admin/views/order.py", |
| | "sha256": "fbcea84695251502a6f44e92966d59840db1c43f50a15e33a5adecc5deb420df" |
| | } |
| | ] |
| | }, |
| | "list_format_review": { |
| | "date": "2026-10-31", |
| | "scope": "Перечисления полей, результатов и проверок оформлены списками; исходники, команды, таблицы, схемы и лицензионные границы сохранены." |
| | }, |
| | "classification": { |
| | "schema": "sharix.knowledge.classification.v1", |
| | "products": [ |
| | "sharix_open" |
| | ], |
| | "audiences": [ |
| | "developer", |
| | "integrator", |
| | "reviewer", |
| | "ai" |
| | ], |
| | "material": "scenario", |
| | "topics": [ |
| | "orders/creation", |
| | "orders/lifecycle", |
| | "api/contracts" |
| | ], |
| | "tag_terms": [ |
| | "audience_developer", |
| | "audience_integrator", |
| | "audience_reviewer", |
| | "audience_ai", |
| | "product_sharix_open", |
| | "material_scenario", |
| | "topic_orders_creation", |
| | "topic_orders_lifecycle", |
| | "topic_api_contracts", |
| | "order", |
| | "ticket" |
| | ], |
| | "registry_document": "ShariXKnowledgeClassification", |
| | "state_meaning": "lifecycle относится к описываемому коду, а status к редакции документа; implemented не означает успешный runtime тест" |
| | }, |
| | "classification_review": { |
| | "date": "2026-10-31", |
| | "source": "Содержание текущей страницы и проверенный словарь классификации", |
| | "body_scope": "classification_and_navigation_only" |
| } | } |
| }, | }, |
| "content_sha256": "31bc5b1d953afd6c5e934d5d69748cda34b92214aafa788f88f76122d4de20e2", | "content_sha256": "d2e3d6cdb8c4b1d761756ae13e67c51bbb8c0556241ca1fd91293abb7df6deb4", |
| "schema": 1 | "schema": 1 |
| } | } |
| ~~NOCACHE~~ | ~~NOCACHE~~ |
| |
| **Область:** ShariX Open, проверенный API-путь. **Основание:** опубликованные backend/tickets/webapp исходники от 29.10.2026. Фактический серверный сценарий этим source-анализом не выполнен. | **Назначение:** [[sharixopen:knowledge:classification:materials#scenarij_processa|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]]. |
| | |
| | **Для кого:** [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#integrator|Интегратор]] · [[sharixopen:knowledge:classification:audiences#recenzent_i_prijomschik|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]]. |
| | |
| | **Темы:** [[sharixopen:knowledge:classification:topics#sozdanie_i_chernovik|Заказы → Создание и черновик]] · [[sharixopen:knowledge:classification:topics#zhiznennyj_cikl|Заказы → Жизненный цикл]] · [[sharixopen:knowledge:classification:topics#kontrakty|API → Контракты]]. |
| | |
| | |
| | |
| | Сценарий описывает POST /dbsynce/api/v1/orders/ в ShariX Open: от получения запроса до сохранённого заказа, HTTP-ответа и событий после commit. Это описание проверенного исходного кода, а не отчёт о выполнении запроса на рабочем сервере. |
| | |
| | ===== Где находится операция ===== |
| | Корневой core/urls.py подключает dbsynce.urls по префиксу dbsynce/. При включённом DBSYNCE_OPEN_API_ENABLED регистрируются маршруты apiviews/open_api.py. POST принимает OpenOrderListCreateAPIView, создание выполняет lib/open_order_api.py:create_order_from_payload. |
| | |
| | OpenAPIBaseView использует IsAuthenticated | HasAPIKey. Но предметная операция получает request.user и проверяет участников и доступные объекты. Пропуск по API key не означает, что вместо actor можно передать произвольного пользователя или создать заказ от любой организации. Для интеграции сначала определяют поддержанный контекст пользователя и предметные права. |
| | |
| | Для проверки нужен предназначенный тестовый контекст: доступный тариф, компания/предложение, пользователь с подходящим основанием и допустимые данные получателя. Не подбирать чужие ID ради прохождения валидации. |
| | |
| | ===== Что выбрать до отправки ===== |
| | ^ Условие ^ Поведение текущей операции ^ |
| | | creation_mode=draft | Создать черновик с начальным Ticket TEMPLATE. | |
| | | creation_mode=place | Разместить заказ с начальным Ticket BOOKED; затем возможно действие назначения. | |
| | | Режим отсутствует | normalize_order_creation_mode выбирает place. Не считать отсутствующее поле командой сохранения черновика. | |
| | | Категория subscription | Операция принудительно выбирает place. | |
| | | self_order=true | Проверяются доступность self-order и предложение исполнителя текущего пользователя. Одновременный корпоративный заказ отклоняется. | |
| |
| ===== Участники и предусловия ===== | Получатель услуги может отличаться от создателя. Операция отдельно получает receiver и его снимок receiver_name/receiver_phone. Состав обязательных полей зависит от выбранного предложения и его правил; произвольный универсальный payload не заменяет доступные клиенту options. |
| Интегратор или клиент вызывает POST ''/dbsynce/api/v1/orders/'' установленной сборки ShariX Open. Маршрут создаётся в root ''core/urls.py'' → ''dbsynce.urls'' → ''apiviews/open_api.py'' при включённом ''DBSYNCE_OPEN_API_ENABLED''. Не переносить этот endpoint автоматически на Platform. | |
| |
| ''OpenAPIBaseView'' допускает authenticated user либо ''HasAPIKey''. Но создание использует ''request.user'' и предметные проверки заказчика/объектов: API key не является универсальной заменой actor. Инициатор должен иметь разрешённые основание заказа, тариф и связанные сущности. Self-order и корпоративный заказ имеют разные проверки; self-order нельзя одновременно оформить от организации. | ===== Сохранение в одной транзакции ===== |
| | - Нормализуются режим и self-order, выбираются доступные связанные объекты. Проверяются корпоративный контекст, получатель, время, длительность, количество и маршрут. |
| | - Создаётся Orders. pk назначает БД; приложение не вычисляет его как максимальный ID плюс один. |
| | - create_ticket_order создаёт SERVICE_REQUEST Ticket. Заказ сохраняет ссылку ticket_status и связанные вычисленные значения. |
| | - Вызывается initialize_order_execution через backend-порт. Если runtime или политика не настроены, этапов может не быть; вызов сам по себе не доказывает создания плана. |
| | - Если режим place и указан provider, выполняется ACTION_ASSIGN_CREATED. Неуспешный результат добавляется в warnings. Созданный заказ при этом может остаться сохранённым. |
| | - Планируется мобильное событие order.created или order.placed. Сетевые callbacks, запланированные через on_commit, относятся к следующей границе. |
| |
| ===== Последовательность операции ===== | create_order_from_payload помечена transaction.atomic. Исключение внутри неё до commit отменяет её записи. Неуспешный результат назначения, обработанный как warning, не равен такому исключению. |
| - ''create_order_from_payload'' внутри ''transaction.atomic'' нормализует режим ''draft/place'', self-order и доступные сущности. Проверяет заказчика, получателя/его снимок, время, количество, длительность и маршрут. Отсутствующий тариф или недоступное сочетание не обходят подбором произвольного ID. | |
| - Создаётся Orders. Сохранённый ''order.pk'' назначает БД; чтение последней строки для вычисления нового ID не используется. | |
| - Создаётся SERVICE_REQUEST Ticket: ''draft → TEMPLATE'', ''place → BOOKED''. Subscription-category принудительно создаётся как ''place''; её entitlement нельзя отложить до произвольного будущего размещения. | |
| - Ticket связывается с заказом; вызывается ''initialize_order_execution'' через зарегистрированный integration port. Наличие этого вызова не доказывает одинаковый набор Stage у всех сервисов. | |
| - При ''place'' и заданном исполнителе вызывается ''ACTION_ASSIGN_CREATED''. Отказ назначения добавляет предупреждение, а не обязательно отменяет созданный заказ. В частности, конфликт занятого исполнителя или незавершённые требования отличают запись заказа от успешного назначения. | |
| - Внутри операции планируются события; после commit выполняются callbacks. Ticket wakeup — ''ticket.changed'', а при каноническом переходе прежний owner получает ''ticket.moved''. ''schedule_order_mobile_event'' перечитывает сохранённый заказ и предпринимает доставку мобильного события; транспортный отказ не равен откату уже committed заказа. | |
| - HTTP view получает snapshot по ''order.pk'' и возвращает ''201'', ''success'', ''message'', ''warnings'' и ''order''. Проверяется содержимое warnings и фактическое состояние, а не один код ответа. | |
| |
| ===== BPMN: границы транзакции и ответа ===== | ===== BPMN: границы транзакции и ответа ===== |
| Описательная схема ''isExecutable=false''. Свёрнутый task создания раскрыт шагами выше; схема не является runtime-кодом и не заменяет Blockly алгоритмы последующих обработчиков. | Описательная схема isExecutable=false. Она показывает проверенный API-путь и отдельно события после commit. Схема не исполняет заказ и не заменяет Blockly последующих обработчиков. |
| <sharix-bpmn> | <sharix-bpmn> |
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> |
| </sharix-bpmn> | </sharix-bpmn> |
| |
| ===== Отказы и повтор ===== | ===== Что означает ответ ===== |
| Django ''ValidationError'' преобразуется view в ''400'', ''PermissionDenied'' — в ''403''. Исключение внутри atomic до commit отменяет её записи. Но callback после commit — другая граница: данные уже сохранены. Не объявлять атомарность БД гарантией exactly-once доставки сети или rollback внешних систем. | После возврата из операции view получает snapshot по созданному order.pk и формирует ответ: |
| | |
| | * HTTP-код ''201''; |
| | * поле ''success''; |
| | * поле ''message''; |
| | * поле ''warnings''; |
| | * поле ''order''. |
| | |
| | Нужно сохранить ID возвращённого заказа и прочитать warnings: success=true означает успех создания, а не безусловный успех назначения и всех внешних доставок. |
| | |
| | **Пример трактовки:** если заказ создан, но предложение исполнителя не удалось назначить, клиент показывает созданный заказ и причину из warnings. Он не должен отправлять ещё один POST только ради повторной попытки назначения: это уже другое действие над существующим заказом. |
| | |
| | Получение snapshot и сериализация ответа выполняются после возврата из функции создания. Поэтому ошибка подготовки HTTP-ответа также не доказывает, что заказ не был сохранён. Эту границу учитывают при восстановлении после таймаута/ошибки. |
| | |
| | ===== События после commit ===== |
| | Ticket-сигналы планируют ticket.changed; при каноническом переходе предыдущему обработчику также передаётся ticket.moved. Обработчик получает сигнал и сверяет сохранённое состояние. schedule_order_mobile_event предпринимает доставку мобильного события после commit. |
| | |
| | Атомарность БД не гарантирует однократную доставку сети. Если данные уже committed, транспортная ошибка не откатывает их автоматически. Отдельно подтверждают: |
| | |
| | * создание заказа; |
| | * доставку XMPP; |
| | * получение уведомления мобильным клиентом. |
| | |
| | Это три отдельных свидетельства. |
| | |
| | ===== Отказы и неизвестный результат ===== |
| | ^ Ситуация ^ Что зафиксировано в коде / что делать ^ |
| | | PermissionDenied из создания | View возвращает 403 с success=false и message. | |
| | | Django ValidationError из создания | View возвращает 400 с success=false и errors. | |
| | | Неизвестный creation_mode | Нормализация бросает ValueError; эта view явно его не перехватывает. Нельзя обещать готовый ответ 400 — это известное ограничение. | |
| | | Таймаут, обрыв или ошибка после сохранения | Сначала установить, создан ли заказ. Повтор POST может создать ещё один. | |
| | |
| | В изученном клиентском POST не найден отдельный контракт idempotency key. Сначала проверить доступный пользователю список/историю и контекст операции; если исход нельзя установить однозначно — передать его на разбор. Последний ID в общей таблице не является доказательством результата именно этого запроса. |
| |
| Неизвестный ''creation_mode'' вызывает ''ValueError'', который эта view явно не ловит. Это зафиксированное ограничение, а не готовый исправленный ответ 400. Серверные ошибки также не следует описывать как обязательный отказ валидации. | ===== HTML-форма проверяется отдельно ===== |
| | sharix_admin.views.order.OrderCreateView.form_valid собирает заказ через OrderForm и собственный atomic-блок. Она использует общие ticket/action/execution primitives, но не вызывает целиком create_order_from_payload; у неё есть дополнительные шаги подписки и расширений. |
| |
| Если клиент не получил ответ на POST, повторная отправка может создать второй заказ: в изученной операции не найден отдельный контракт client idempotency key. Сначала установить результат по доступным записям/истории и контексту запроса. Нельзя вычислить успех по максимальному ID или отправить создание ещё раз только из-за таймаута. | Форма отдельно перехватывает неизвестный способ сохранения и возвращает ошибку формы. Это не исправляет API-ветку ValueError. При изменении общего правила нужно проверить оба входа, а не считать успешный API доказательством правильности формы. |
| |
| ===== HTML-форма — отдельный путь ===== | ===== Как принять изменение этой операции ===== |
| ''sharix_admin.views.order.OrderCreateView.form_valid'' не вызывает целиком ''create_order_from_payload'': она собирает модель через OrderForm и выполняет собственный atomic блок, используя общие ticket/action/execution primitives. У неё есть дополнительные subscription/extension шаги. Поэтому изменение только API не доказывает исправление формы, и наоборот. Согласованность этих путей проверяют отдельными сценариями; не переписывают документацию так, будто общей orchestration уже достаточно. | На предназначенной установке проверить: |
| |
| ===== Проверка при изменении ===== | * режимы draft и place; |
| На предназначенной тестовой установке проверить допустимое создание и доступность snapshot; ''draft'' и ''place''; запрет чужих объектов/корпоративного контекста; self-order; отказ назначения с сохранением заказа и предупреждением; rollback при ошибке execution; событие только после commit. HTTP-ошибки проверить отдельно, включая неизвестный mode. Для HTML повторить затронутый form-сценарий. Чтение чужого заказа и запись зеркальных полей через local endpoint не должны становиться обходным путём; известное расхождение ''OrdersLocal/order_synced'' описано отдельно. | * сохранённые Orders и Ticket; |
| | * доступность заказа создавшему пользователю; |
| | * отказ для недоступных объектов или организации; |
| | * self-order; |
| | * предупреждение при отказе назначения; |
| | * отсутствие частичных записей при исключении до commit; |
| | * доставку события после commit; |
| | * неизвестный mode; |
| | * затронутый HTML-путь. |
| |
| Эта матрица — порядок приёмки изменения, не отчёт о якобы выполненных здесь runtime-тестах. | Не повторять создание на рабочих данных для проверки потери ответа. Такой случай воспроизводят в изолированном тестовом контексте. Общие критерии — [[sharixopen:knowledge:development:acceptance|приёмка изменений]], структура данных — [[sharixopen:knowledge:domain:order_ticket|заказ и Ticket]], локальное API-расхождение — [[sharixopen:knowledge:modules:webservice_running|Webservice Running]]. |
| |
| ===== Связанные контракты ===== | Сценарий касается открытого API ShariX Open. Внутренние операции Platform и закрытых компонентов описываются в intrawiki; проверку shared-изменения другим продуктом передают его ответственному. |
| * [[sharixopen:knowledge:architecture:api_contracts|API и межмодульные контракты]]. | |
| * [[sharixopen:knowledge:domain:order_ticket|Order и Ticket: владельцы и идентификаторы]]. | |
| * [[sharixopen:knowledge:modules:webservice_running|Локальные расширения и известное расхождение API]]. | |
| * [[sharixopen:knowledge:development:human_ai_handoff|Передача изменения человеку]]. | |
| |
| ===== Проверенная исходная база: 29.10.2026 ===== | ===== Исходники, сверенные 31.10.2026 ===== |
| Проверены опубликованные исходники указанных ревизий. Это source-анализ; он не подтверждает применённую версию, конфигурацию или успешный сценарий конкретного сервера. | Проверены опубликованные исходники указанных commits. Это анализ кода, а не подтверждение версии, данных или выполненного запроса на сервере. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/models/orders.py|sharix-open-backend: models/orders.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/open_order_api.py|sharix-open-backend: lib/open_order_api.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/open_order_api.py|sharix-open-backend: lib/open_order_api.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/integration_ports.py|sharix-open-backend: lib/integration_ports.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/ticket_gen.py|sharix-open-backend: lib/ticket_gen.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/ticket_gen.py|sharix-open-backend: lib/ticket_gen.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_actions.py|sharix-open-backend: lib/order_actions.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/mobile_order_events.py|sharix-open-backend: lib/mobile_order_events.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_permissions.py|sharix-open-backend: lib/order_permissions.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/apiviews/open_api.py|sharix-open-backend: apiviews/open_api.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/mobile_order_events.py|sharix-open-backend: lib/mobile_order_events.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/urls.py|sharix-open-backend: urls.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/integration_ports.py|sharix-open-backend: lib/integration_ports.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/signals.py|sharix-open-tickets: signals.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/apiviews/open_api.py|sharix-open-backend: apiviews/open_api.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/3e05f96d8fbae165c7b7f91d58048ff81c866be4/core/urls.py|sharix-open-webapp-base: core/urls.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/urls.py|sharix-open-backend: urls.py]] — 778a3280cee1. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/3e05f96d8fbae165c7b7f91d58048ff81c866be4/sharix_admin/views/order.py|sharix-open-webapp-base: sharix_admin/views/order.py]]. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/f65376cdb5a3ac68a55d04f4c19493137e5a290b/sharix_admin/views/order.py|sharix-open-webapp-base: sharix_admin/views/order.py]] — f65376cdb5a3. | |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/f65376cdb5a3ac68a55d04f4c19493137e5a290b/core/urls.py|sharix-open-webapp-base: core/urls.py]] — f65376cdb5a3. | |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/signals.py|sharix-open-tickets: signals.py]] — fd64704d7d9f. | |
| |
| ~~SHARIX_KNOWLEDGE_RELATED~~ | ~~SHARIX_KNOWLEDGE_RELATED~~ |
| |