@startuml
scale 1500x1500
mainframe Автооформление заказов
actor user as user
participant SITE
queue kafka
participant Gateway
participant workflow
participant wtis
participant CRM

user -> SITE: Оформляет заказ
SITE -> SITE: Сохраняет заказ в БД
SITE --> kafka: Пишет заказ в kafka
Gateway --> kafka: Забирает заказ

Gateway -> workflow: CreateB2CAO
workflow -> workflow: Проверяет условия АО
workflow -> workflow: Проверяет тип доставки
workflow -> wtis: синк заказа во втис через kafka
alt Тип доставки "Курьером"
workflow -> workflow: Устанавливает таймер на N минут
    alt Поступила оплата в заказ до истечения срока таймера
    workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа
    workflow -> wtis: Синхронизирует заказ со WTIS
    else Не поступила оплата в заказ до истечения срока таймера
    workflow -> CRM: Ставится задача с типом 21 в CRM
    end
else Тип доставки "Самовывоз"
workflow -> workflow: Проверяет наличие\nкрупногабаритных товаров\nв заказе
    alt Крупногабаритных товаров в заказе нет
    workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа
    workflow -> wtis: Синхронизирует заказ со WTIS
    else Крупногабаритные товары в заказе есть
    workflow -> workflow: Устанавливает таймер на N минут
        alt Поступила оплата в заказ до истечения срока таймера
        workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа
        workflow -> wtis: Синхронизирует заказ со WTIS
        else Не поступила оплата в заказ до истечения срока таймера
        workflow -> CRM: Ставится задача с типом 21 в CRM
        end
    end
end
@enduml



@startuml Редактирование заказа процесс
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: ExecuteWorkflow(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: Определение редактируемых полей\n(editorder.FieldsDispatcher)
W -> W: Activity: GetEditableFieldsFromWTIS(orderID)
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: ExecuteWorkflow(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 -> W: Activity: IsTransactionExist(orderID)
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 -> W: Activity: EndTransaction(orderID, userID, true)
    W -> H: gRPC: EndTransaction(orderID, userID, true)
    activate H
    H -> H: Transaction Service\nEndTransaction()
    H -> H: Закрытие транзакции\n(статус: Rejected)
    H -> DB: Обновление транзакции
    DB --> H: Подтверждение
    H --> W: Результат
    deactivate H
    W -> W: Unlock ресурса
    W --> G: Успешная отмена
else typeEndCorrection = "success"
    W -> W: ManualActionWorkflow.ExecuteAsChild()\n(синхронизация с WTIS)
    W -> W: Activity: GetOrderByID(orderID)\n(обновленные данные)
    W -> OS: gRPC: GetOrder(orderID)
    activate OS
    OS -> DB: Поиск заказа
    DB --> OS: Обновленные данные заказа
    OS --> W: Order entity
    deactivate OS
    W -> W: Activity: EndTransaction(orderID, userID, false)
    W -> H: gRPC: EndTransaction(orderID, userID, false)
    activate H
    H -> H: Transaction Service\nEndTransaction()
    H -> H: Закрытие транзакции\n(статус: Finished)
    H -> DB: Обновление транзакции
    H -> H: publishEvents()\n(публикация событий)
    H --> W: Результат
    deactivate H
    W -> W: SaveOrderWithShipment()\n(сохранение изменений)
    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: Успешное сохранение
end

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

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


@enduml