@startuml
!theme plain
title Обработка корректировки заказа на WTIS

participant "Kafka" as Kafka
participant "Обработчик" as Handler
participant "Сервис синхронизации" as Service
participant "Сравнитель заказов" as Differ
participant "Создатель заказов" as Creator
participant "Резервирование" as Reserve
participant "База данных" as DB

== Получение корректировки ==
Kafka -> Handler: Сообщение корректировки
Handler -> Service: Обработать корректировку

== Поиск заказа ==
Service -> DB: Найти заказ по GUID
alt Заказ не найден
    Service -> Creator: Создать новый заказ
else Заказ существует
    Service -> Differ: Сравнить заказы OMS и WTIS
    
    == Анализ изменений ==
    Differ -> Differ: Сравнить поля заказа
    note right: регион, ПВЗ, способ доставки,\nконтрагент, адрес, дата доставки
    Differ -> Differ: Сравнить товарные позиции
    note right: количество, цены, резерв
    Differ --> Service: Список изменений
    
    == Специальная обработка смены региона/ПВЗ ==
    alt Смена региона или ПВЗ
        Service -> Reserve: Снять резерв со всех товаров
        note right: При смене региона/ПВЗ\nснимается весь резерв
    end
    
    == Применение изменений ==
    Service -> Differ: Применить изменения к заказу
    Service -> Creator: Сохранить заказ
    
    == Обработка товаров ==
    note over Service: **ДЕТАЛЬНАЯ СХЕМА:**\n"Обработка товарных позиций"
    Service -> Service: Определить операции с товарами
    note right: Товары для добавления,\nизменения, удаления
    
    alt Есть товары для добавления
        Service -> Creator: Добавить новые товары
    end
    
    alt Есть товары для изменения
        Service -> Service: Обновить существующие товары
        note right: **См. детальную схему:**\n- Изменение количества (split)\n- Изменение цен\n- Изменение резерва
    end
    
    alt Есть товары для удаления
        Service -> Reserve: Снять резерв
        Service -> Service: Удалить товары
        note right: **См. детальную схему:**\nУстановка статуса "Удален"
    end
end

== Резервирование товаров ==
note over Service: **ДЕТАЛЬНАЯ СХЕМА:**\n"Обработка товарных позиций"\n(блок "Резервирование")
alt Есть товары для резервирования
    Service -> Reserve: Зарезервировать товары
    note right: Из массива reserve
end

alt Есть товары для снятия резерва
    Service -> Reserve: Снять резерв
    note right: Из массива unreserve
end

== Завершение ==
Service -> Service: Обновить сайтовый заказ
Service -> Service: Отправить SMS клиенту
Service -> Service: Экспортировать в OMS
Service --> Handler: Результат обработки
Handler --> Kafka: Подтверждение

@enduml





@startuml
!theme plain
title Обработка корректировки заказа на WTIS

start
:Получение сообщения корректировки из Kafka oms.order.sync;

if (Заказ найден в БД?) then (нет)
  :Создать новый заказ;
else (да)
  :Сравнить заказы OMS и WTIS по атрибутам;
  
  if (Смена региона или ПВЗ И есть товары для резерва?) then (да)
    :Снять резерв с товаров из массива reserve;
  else (нет)
  endif
  
  :Применить изменения к заказу;
  :Сохранить заказ в БД;
  
  :Определить операции с товарами;
  
  if (Есть товары для добавления?) then (да)
    :Добавить новые товары в заказ;
  else (нет)
  endif
  
  if (Есть товары для изменения?) then (да)
    :Обновить существующие товары;
    if (Есть товары с уменьшением количества в резерве?) then (да)
      :Создать копию товара с новым количеством;
      :Удалить избыточную часть;
    else (нет)
    endif
  else (нет)
  endif
  
  if (Есть товары для удаления?) then (да)
    :Снять резерв с товаров;
    :Установить статус "Удален";
    :Удалить товары из заказа;
  else (нет)
  endif
  
  :Установить скидки, контакты, адреса;
  :Обновить дополнительные свойства заказа;
  
  if (Есть товары для резервирования И не сайтовый заказ?) then (да)
    :Зарезервировать товары из массива reserve;
  else (нет)
  endif
  
  if (Есть товары для снятия резерва И не отмена заказа?) then (да)
    :Снять резерв с товаров из массива unreserve;
  else (нет)
  endif
  
  :Обновить заказ во wtis_doc_zayavki;
  :Обновить заказ во wtis_doc_zayavki_site;
  
  if (Не сайтовый заказ И активный И подтвержденный?) then (да)
    :Отправить SMS клиенту с задержкой 10 минут;
  else (нет)
  endif
  
  :Экспортировать данные обратно в OMS;
endif

:Подтверждение обработки в Kafka;
stop

@enduml