@startuml
title Проверка лимитов заказа
autonumber
    actor User
    participant ARM as ARM
    participant Gateway as Gateway
    participant Workflow as Workflow
    participant Temporal as Temporal

    User -> ARM: Нажатие кнопки "Оформить заказ"
    ARM -> Gateway: Отправляет запрос на /orders/{orderID}/validate
    Gateway -> Temporal: Отправка данных на\nоформление заказа и его проверку
    Temporal --> Workflow: Получение сообщения
    Workflow -> Workflow: Проверка лимитов ПВЗ и размеров товаров
    Workflow -> Workflow: Завершает выполнение workflow
    Workflow -> Temporal: Отдает результат проверки в Temporal.
    Gateway --> Temporal: Слушает temporal и получает результат проверки
    Gateway --> ARM: Ответ в виде кодов ответа с /orders/{orderID}/validate

    alt Проверки пройдены
        ARM -> ARM: Проверки пройдены успешно
        ARM -> Gateway: Вызывает метод bf orders/{orderID}/ordering оформления заказа\nи отправляет идентификатор orderId для оформления заказа в Gateway
    else Проверки не пройдены
        ARM -> User: Показывает Пользователю модальное\nокно с лимитами ПВЗ и выбором\nдальнейших действий - продолжить\nоформление или отменить.
        alt Отмена оформления
            User -> ARM: Нажимает кнопку "Отменить оформление"
            ARM -> ARM: Закрывает модальное окно и ждет следующего действия от менеджера (Конец процесса)
        else Продолжение оформления
            User -> ARM: Нажимает кнопку "Продолжить оформление"
            ARM -> Gateway: Вызывает метод bf orders/{orderID}/ordering оформления заказа\nи отправляет идентификатор orderId для оформления заказа в Gateway
        end
    end
    note across: Продолжение описания алгоритма начинается с Workflow оформления заказа
@enduml


@startuml
title Оформление заказа
autonumber
participant User
participant ARM
participant Gateway
participant Temporal
participant Workflow
queue Kafka
participant Wtis
participant Order

ARM -> Gateway: Вызов метода bf orders/{orderID}/ordering
ARM -> User: Блокирует заказ на изменение\nи выводит оповещения: "Оформление заказа",
Gateway -> Temporal: Отправляет данные\nна оформление заказа
Workflow --> Temporal: Получает сообщения о заказе
Workflow -> Workflow: Создает WorkflowOrdering
Workflow -> Temporal: Отправляет workflowID и runID
Temporal -> Gateway: Получает workflowID и runID
Gateway -> ARM: Отправка workflowID и runID\nв ответ на метод bf orders/{orderID}/ordering
ARM -> ARM: Сохранение workflowID и runID в куки на 5 минут
loop Раз в 5 секунд
ARM -> Gateway: Периодическая проверка состояния workflow\nзапросом на orders/{orderID}/workflow/{workflowID}
Gateway -> Temporal: Отправляет запрос на\nпроверку состояния workflow
Workflow -> Temporal: Слушает и получает запрос\nна состояние workflow
Workflow -> Temporal: Уточнение состояния workflow\n(в работе или завершен успешно\nили завершен с ошибкой)\n WorkflowOrdering
Gateway -> Temporal: Слушает и получает состояния\nworkflow
Gateway -> ARM: Получает ответ
end
alt До тех пор пока workflow не завершен
    ARM -> User: ARM блокирует интерфейс пользователю
else workflow завершен успешно
    ARM -> User: АРМ снимает блокировку и показывает оповещение\n"Заказ оформлен". И обновляет все данные\nсодержащие статусы, подробнее описано ниже.
else workflow завершен с ошибкой "Втис не доступен"
    ARM -> User: АРМ снимает блокировку и показывает оповещение\n"Заказ не оформлен"
else workflow завершен с ошибкой "Не удалось взять в резерв товары"
    ARM -> User: АРМ снимает блокировку и показывает\nоповещение "Не удалось товары взять в резерв".\nИ обновляет все данных содержащие статусы,\nподробнее описано ниже.
end

Workflow -> Order: Забирает структуру заказа
Workflow -> Workflow: Конвертирует структуру заказа\nв нужную для Wtis
Workflow -> Workflow: Создает таймер ответа\nна запрос и ждет ответ от Wtis\nTBD: Сколько таймер?
Workflow -> Kafka: Записывает данные в топик\nKafka oms.orders.sync
alt Успешный сценарий
    Wtis -> Kafka: Читает данные по заказу
    Wtis -> Wtis: Создает заказ или сопоставляет\nс тем что уже есть и апдейтит\nего в БД
    Wtis -> Wtis: При необходимости резервирует\nтовары через "Умный резерв"
    Wtis -> Temporal: Отправляет сигнал что закончил свои флоу

else WTIS не доступен
    Wtis -> Kafka: Не забрал данные по заказу
    Temporal -> Temporal: по таймауту понимает что\nвтис не ответил\nTBD: Где таймер?\nНа воркфлоу или на темпорал?
    Workflow -> Temporal: Слушает Temporal и\nполучает информацию об ошибке
    Workflow -> Order: Ничего не обновляет в БД Order
else WTIS частично взял товары в резерв
    Wtis -> Kafka: Читает данные по заказу
    Wtis -> Wtis: Создает заказ или сопоставляет\nс тем что уже есть и апдейтит\nего в БД
    Wtis -> Wtis: При необходимости резервирует\nтовары через "Умный резерв"\n(частичный резерв)
    Wtis -> Temporal: Отправляет сигнал что закончил\nсвои флоу частично
    Workflow -> Temporal: Слушает Temporal и получает\nинформацию о проведенном резерв
    Workflow -> Order: Обновляет ту часть товаров что была зарезервирована
    Workflow -> Workflow: Меняет мастер систему\nв заказе на WTIS
    Workflow -> Gateway: Возвращает ответ
    Gateway -> ARM: Возвращает ответ
    ARM -> User: Пишет сообщение пользователю:\n"Заказ не оформлен товары не зарезервировались"
end
Wtis -> Kafka: Записывает обновленные\nданные заказа
Temporal -> Kafka: Слушает топик wtis.orders.sync и получает структуру даных
Workflow -> Order: Маппит структуру и сохранет ее в Order, обновляя статусы заказов и товаров
Workflow -> Workflow: Запускает дочерний\nworkflow SendSMSMessage
Workflow -> Workflow: Завершает wf WorkflowOrdering
Workflow -> Temporal: Сообщает о завершении workflow
Gateway -> Temporal: Слушает Temporal и\nполучает сигнал что wf завершен
Gateway --> ARM: Возвращает ответ на bf orders/{orderID}/ordering
ARM -> User: Разблокирует интерфейс, меняет управляющие кнопки заказа
ARM -> Gateway: Вызывает метод bf /orders/{orderID}/products\nтоварного блока обновляет статусы товаров.
Gateway -> ARM: answer
ARM -> Gateway: Вызывает метод bf /orders/{orderID}\nзаказа обновляет статус заказа.
Gateway -> ARM: answer
ARM -> Gateway: Вызывает метод bf /orders/{orderID}/deliveries\nобновляет статус доставки.
Gateway -> ARM: answer

@enduml