@startuml
!theme plain
title Обработка товарных позиций при корректировке

start

:Получена корректировка заказа;

:Сравнить товары OMS и WTIS;

partition "Определить операции с товарами" {
    :Товары для добавления;
    note right: Есть в OMS, нет в WTIS
    
    :Товары для удаления;
    note right: Есть в WTIS, нет в OMS
    
    :Товары для изменения;
    note right: Есть в обоих, но с отличиями
}

partition "Обработать изменения товаров" {
    if (Есть товары для изменения?) then (да)
        :Для каждого товара проверить изменения;
        
        if (Изменилось количество?) then (да)
            if (Товар в резерве?) then (да)
                :Создать копию с новым количеством;
                :Удалить избыточную часть;
                note right: Сложная логика split
            else (нет)
                :Изменить количество напрямую;
            endif
        endif
        
        if (Изменилась цена?) then (да)
            :Обновить цену и скидку;
        endif
        
        if (Изменился резерв?) then (да)
            :Обновить дату резерва;
        endif
    endif
}

partition "Применить операции" {
    if (Есть товары для добавления?) then (да)
        :Создать новые товарные позиции;
    endif
    
    if (Есть товары для изменения?) then (да)
        :Обновить существующие позиции;
    endif
    
    if (Есть товары для удаления?) then (да)
        :Снять резерв с товаров;
        :Установить статус "Удален";
        :Удалить из заказа;
    endif
}

partition "Обработать резервирование" {
    if (Смена региона или ПВЗ?) then (да)
        :Снять резерв со всех товаров;
        note right: При смене региона/ПВЗ
    endif
    
    if (Есть товары для резервирования?) then (да)
        :Зарезервировать товары;
        note right: Из массива reserve
    endif
    
    if (Есть товары для снятия резерва?) then (да)
        :Снять резерв с товаров;
        note right: Из массива unreserve
    endif
}

:Завершить обработку;

stop

@enduml