@startuml Order Edit Process
skinparam backgroundColor #FFFFFF
skinparam componentStyle rectangle

title Бизнес-процесс редактирования заказа

actor User as U
participant "Frontend ARM" as F
participant "Gateway" as G
participant "Workflow" as W
participant "Order" as OS
participant "History" as H
participant "WTIS" as WTIS
participant "MongoDB" as DB

== Инициация редактирования ==

U -> F: Клик на кнопку "Редактирование заказа"
activate F

F -> G: GET /orders/v1/{orderID}/start-correction
activate G

G -> W: Запускает workflow B2CGetEditableFieldsWorkflow
activate W

== Workflow: Получение редактируемых полей ==

W -> OS: gRPC: GetOrder(orderID)
activate OS
OS -> DB: Поиск заказа
DB --> OS: Данные заказа
OS --> W: Order entity
deactivate OS

W -> H: gRPC: IsTransactionExist(orderID)
activate H
H -> H: Transaction Service\nIsTransactionExist()
H -> DB: Поиск открытой транзакции
DB --> H: TransactionID или null
H --> W: TransactionID или uuid.Nil
deactivate H

alt Транзакция не существует
    W -> H: gRPC: StartTransaction(orderID, userID)
    activate H
    H -> H: Transaction Service\nStartTransaction()
    H -> H: Создание новой транзакции\n(статус: Opened)
    H -> DB: Сохранение транзакции
    DB --> H: Подтверждение
    H --> W: TransactionID
    deactivate H
end

W -> W: Определение редактируемых полей
W -> WTIS: API GET GetEditableFieldsFromWTIS(orderID)
activate WTIS
WTIS --> W: Права на редактирование атрибутов
deactivate WTIS

W -> W: Проверка прав пользователя\n(permissions)
W -> W: Формирование ответа\n(CorrectionAnswer)
W --> G: Результат workflow
deactivate W

G --> F: CorrectionAnswer\n(редактируемые поля)
deactivate G

F -> F: Показать уведомление\n"У вас есть 5 минут на редактирование"
F --> U: Интерфейс редактирования активирован
deactivate F

== Мониторинг транзакции ==

loop Каждые 30 секунд
    F -> F: checkOrderHasTransaction()
    F -> G: GET /orders/v1/{orderID}
    G --> F: hasTransaction: boolean
    alt hasTransaction = false
        F -> F: Показать ошибку\n"Время на редактирование вышло"
        F -> F: Перезагрузить страницу
    end
end
== Завершение редактирования ==

U -> F: Клик "Сохранить" или "Отменить"
activate F

F -> G: GET /orders/v1/{orderID}/end-correction\n?typeCorrection=...&typeEndCorrection=...
activate G

G -> W: запускает workflow B2CEndCorrectionsWorkflow
activate W

== Workflow: Завершение редактирования ==

W -> W: Lock ресурса (mutex)\n(10 минут блокировка)

W -> OS: gRPC: GetOrder(orderID)
activate OS
OS -> DB: Поиск заказа
DB --> OS: Данные заказа
OS --> W: Order entity
deactivate OS

W -> H: gRPC: IsTransactionExist(orderID)
activate H
H -> H: Transaction Service\nIsTransactionExist()
H -> DB: Поиск транзакции
DB --> H: TransactionID
H --> W: TransactionID
deactivate H

alt typeEndCorrection = "reject"
    W -> H: gRPC: EndTransaction(orderID, userID, true)
    activate H
    H -> H: Закрытие транзакции\n(статус: Rejected)
    H -> DB: Обновление транзакции
    DB --> H: Подтверждение
    H --> W: Результат
    deactivate H
    W -> W: Unlock ресурса
    W --> G: Успешная отмена
    G --> F: Результат завершения транзакции
    F -> F: Обновление интерфейса
    F --> U: Редактирование завершено
    deactivate F
else typeEndCorrection = "success"
    W -> W: Старт ручного действия коррекции
    W -> W: Подготовка заказа и шипментов\nконвертация в OrderToWtis

    W -> WTIS: API POST /api/v1/oms_sync\nСинхронизация заказа с WTIS
    activate WTIS
    WTIS -> WTIS: Обработка изменений\n(валидация, расчёты, статусы и т.п.)
    WTIS --> W: OrderSyncResponse\n(подтверждение или бизнес‑ошибки)
    deactivate WTIS
    W -> W: Проверка ответа (бизнес-ошибки или модель заказа)

    alt бизнес-ошибка от WTIS
        W --> G: Ошибка сохранения


        G --> F: Отображение ошибки\nЗавершения транзакции
        deactivate G

        F -> F: Обновление интерфейса с ошибкой
        F --> U: Редактирование не завершено
        deactivate F
    end
    W -> W: Преобразование ответа WTIS в модель заказа OMS

    W -> H: gRPC: EndTransaction(orderID, userID, false)
    activate H
    H -> H: Transaction Service\nEndTransaction()
    H -> H: Закрытие транзакции\n(статус: Finished)
    H -> DB: Обновление транзакции
    DB --> H: answer
    H -> H: publishEvents()\n(публикация событий)
    H --> W: Результат
    deactivate H

    W -> W: Сохранение изменений
    W -> OS: gRPC: UpsertOrderWithShipment(orderID)
    activate OS
        OS -> H: Transaction Service\nIsTransactionExist()
        activate H
        H -> DB: Поиск транзакции
        DB --> H: TransactionID
        H --> OS: TransactionID
        deactivate H
    OS -> DB: Сохранение заказа
    DB --> OS: Подтверждение
    OS --> W: Order entity
    deactivate OS

    W -> W: Unlock ресурса
    W --> G: Успешное сохранение
    deactivate W

    G --> F: Результат завершения транзакции
    deactivate G

    F -> F: Обновление интерфейса
    F --> U: Редактирование завершено
    deactivate F
end


@enduml




@startuml EditOrder
skinparam backgroundColor #FFFFFF
skinparam componentStyle rectangle

title Бизнес-процесс редактирования заказа

actor User as U
participant "Frontend ARM" as F
participant "Gateway" as G
participant "Workflow" as W
participant "Order" as OS
participant "History" as H
participant "WTIS" as WTIS
participant "MongoDB" as DB

== Инициация редактирования ==

U -> F: Клик на кнопку "Редактирование заказа"
activate F

F -> G: GET /orders/v1/{orderID}/start-correction
activate G

G -> W: Запускает workflow B2CGetEditableFieldsWorkflow
activate W

'==============================================================================
== Workflow: Получение редактируемых полей ==
'==============================================================================

W -> OS: gRPC: GetOrder(orderID)
activate OS
OS -> DB: Поиск заказа
DB --> OS: Данные заказа
OS --> W: Order entity
deactivate OS

W -> H: gRPC: IsTransactionExist(orderID)
activate H
H -> H: Transaction Service\nIsTransactionExist()
H -> DB: Поиск открытой транзакции
DB --> H: TransactionID или null
H --> W: TransactionID или uuid.Nil
deactivate H

alt Транзакция не существует
    W -> H: gRPC: StartTransaction(orderID, userID)
    activate H
    H -> H: Transaction Service\nStartTransaction()
    H -> H: Создание новой транзакции\n(статус: Opened)
    H -> DB: Сохранение транзакции
    DB --> H: Подтверждение
    H --> W: TransactionID
    deactivate H
end

W -> W: Определение редактируемых полей
W -> WTIS: API GET GetEditableFieldsFromWTIS(orderID)
activate WTIS
WTIS --> W: Права на редактирование атрибутов
deactivate WTIS

W -> W: Проверка прав пользователя\n(permissions)
W -> W: Формирование ответа\n(CorrectionAnswer)
W --> G: Результат workflow
deactivate W

G --> F: CorrectionAnswer\n(редактируемые поля)
deactivate G

F -> F: Показать уведомление\n"У вас есть 5 минут на редактирование"
F --> U: Интерфейс редактирования активирован
deactivate F

'==============================================================================
== Мониторинг транзакции ==
'==============================================================================

loop Каждые 30 секунд
    F -> F: checkOrderHasTransaction()
    F -> G: GET /orders/v1/{orderID}
    G --> F: hasTransaction: boolean
    alt hasTransaction = false
        F -> F: Показать ошибку\n"Время на редактирование вышло"
        F -> F: Перезагрузить страницу
    end
end

'==============================================================================
== Завершение редактирования ==
'==============================================================================

U -> F: Клик "Сохранить" или "Отменить"
activate F

F -> G: GET /orders/v1/{orderID}/end-correction\n?typeCorrection=...&typeEndCorrection=...
activate G

G -> W: запускает workflow B2CEndCorrectionsWorkflow
activate W

'==============================================================================
== Workflow: Завершение редактирования ==
'==============================================================================

W -> W: Lock ресурса (mutex)\n(10 минут блокировка)

W -> OS: gRPC: GetOrder(orderID)
activate OS
OS -> DB: Поиск заказа
DB --> OS: Данные заказа
OS --> W: Order entity
deactivate OS

W -> H: gRPC: GetTransactionByOrder(orderID)\n(получение транзакции)
activate H
H -> DB: Поиск транзакции
DB --> H: answer
H --> W: answer
deactivate H

alt typeEndCorrection = "reject"
    W -> H: gRPC: EndTransaction(orderID, userID, true)
    activate H
    H -> DB: Обновление статуса транзакции\n(статус: Rejected)
    DB --> H: Подтверждение
    H --> W: answer
    deactivate H

    W -> W: Unlock ресурса
    W --> G: Успешная отмена
    G --> F: Результат завершения транзакции
    F -> F: Обновление интерфейса
    F --> U: Редактирование завершено
    deactivate F
else typeEndCorrection = "success"
    W -> W: Старт workflow ManualActionWorkflow

    W -> WTIS: API POST /api/order/oms_sync\n(через ActionsB2CManualWorkflow)
    activate WTIS
    WTIS -> WTIS: Обработка изменений
    WTIS --> W: OrderSyncResponse\n(подтверждение или бизнес‑ошибки)
    deactivate WTIS

    alt бизнес-ошибка / ошибка синхронизации
        W -> W: Формирование ManualActionRes.BusinessError
        W -> W: Unlock ресурса
        W --> G: Ошибка завершения коррекции\n(B2CEndCorrectionsWorkflow возвращает res.Error)

        G --> F: Отображение ошибки\nзавершения транзакции
        deactivate G

        F -> F: Обновление интерфейса с ошибкой
        F --> U: Отображение в интерфейсе ошибки\n"Редактирование не завершено"
        deactivate F
    else успешный ответ WTIS
        W -> W: Преобразование ответа WTIS\nв модель заказа OMS
        W -> OS: Запись (orderFromWTIS) в БД, шипменты, события
        activate OS
        OS --> W: asnwer
        deactivate OS

        W -> OS: gRPC: GetOrder(orderID)\n(повторное чтение обновлённого заказа)
        activate OS
        OS -> DB: Поиск заказа (включая shipment)
        activate DB
        DB --> OS: Обновлённые данные заказа
        deactivate DB
        OS --> W: Order entity
        deactivate OS

        alt B2B Заказ
            W -> H: gRPC: GetEventsByDraft(draft)
            activate H
            H -> DB: Поиск событий по транзакции
            DB --> H: Events
            H --> W: Events
            deactivate H

            W -> H: gRPC: IsNeedInvoiceGenerate(events)
            activate H
            H -> H: Анализ событий\nнужна ли перегенерация счёта
            H --> W: IsNeedInvoiceGenerate
            deactivate H

            W -> W: Определение менялась ли закупочная цена

            alt IsNeedInvoiceGenerate == true
                W -> W: Вызов дочернего WF перегенерации счета\n(InvoiceGenerateWorkflow)
                W <- W: Результат генерации счёта\n(ошибка или успех).\nПри ошибке - возврат ошибки пользователю
            end
        end

        W -> H: gRPC: EndTransaction(orderID, userID, false)
        activate H
        H -> H: Transaction Service\nEndTransaction()
        H -> DB: Обновление транзакции\n(статус: Finished)
        DB --> H: Подтверждение
        H -> Kafka: публикация в топик oms.order.before_publish.<stage>
        activate Kafka
        Kafka --> H: Подтверждение публикации
        deactivate Kafka
        H --> W: Результат
        deactivate H

        W -> W: Unlock ресурса
        W --> G: Успешное завершение коррекции
        deactivate W

        G --> F: Результат завершения транзакции
        deactivate G

        F -> F: Обновление интерфейса
        F --> U: Редактирование завершено
        deactivate F
    end
end

@enduml