@startuml
participant "Топик сообщений" as Topic
participant "Сервис обработки" as Service
participant "База данных" as DB
participant "МСКБ API" as MSKB
participant "Bifrost API" as Bifrost
participant "CRM API" as CRM
participant "TOUCH API" as TOUCH

Topic -> Service: Сообщение с letter_guid,\ncontractor_guid,\ncontact_person_guid,\ncommodity_guid
activate Service

Service -> DB: Проверить заказ по autoBotLetterGuid=letter_guid
alt Заказ уже существует
    Service --> Topic: Пропустить сообщение
    deactivate Service
else Заказа нет
    Service -> Service: Валидация contractor_guid
    alt contractor_guid пустой
        Service -> DB: Найти контрагента по contact_person_guid\nв последних заказах
        alt Контрагент не найден
            Service --> Topic: Завершить обработку
            deactivate Service
        else Найден contractor_guid
        end
    else несколько contractor_guid
        Service -> DB: Найти последний завершенный заказ\nдля каждого contractor_guid
    end

    Service -> Service: Валидация contact_person_guid
    alt contact_person_guid пустой
        Service -> MSKB: /api/business/v2/physic/\nпоиск по letter_from
        alt Не найдено
            Service -> DB: Найти в последнем заказе\nпо contractor_guid
        end
    end

    Service -> Service: Валидация commodity_guid
    alt commodity_guid пустые
        Service --> Topic: Завершить обработку
        deactivate Service
    end

    Service -> DB: Найти последний завершенный заказ\nдля получения shipment данных
    Service -> MSKB: /api/business/v2/juristic/search\nполучить GUID менеджера
    Service -> Bifrost: bifrost.v1.ActiveDirectoryService/GetUserByID\nпроверить email менеджера
    alt email != letter_to
        Service --> Topic: Завершить обработку
        deactivate Service
    end

    Service -> Service: Создать заказ
    Service -> DB: createOrder
    Service -> Service: Автооформление заказа (flowId=6)
    Service -> DB: Обновить заказ\n(IsAutoBotOrder=true,\nautoBotLetterGuid=letter_guid)

    Service -> CRM: Создать задачу менеджеру\n"Заказ не прошел АО..."
    Service -> TOUCH: /api/v1/jsonapi/send-email-message\nОповестить менеджера

    Service --> Topic: Обработка завершена
    deactivate Service
end
@enduml