Неправильное обновление остатков при использовании Складов

Приветсвую.
Прошу обратить внимание команду Карта и общественность.

Т.к. скорее всего такая проблема могла возникнуть у многих ваших клиентов и она может сделать большую беду.

\www\app\addons\warehouses\Tygh\Addons\Warehouses\Manager.php

в saveTotalAmounts

были небольшие изменения
в последних обновах
и некоторые товары на ОДНОВИТРИННОМ магазине стали иметь неправильные остатки в выгрузках
оказалось при импорте
количество в cscart_warehouses_sum_products_amount
amount в storefront_id 0 обновляется при импорте
а в storefront_id 1 НЕТ

И собственно поэтому остатки были кривые на ооочень много товаров.
На витрине этого незаметно, а вот в выгрузки в Гугл и т.п. остаток был 0!!!

К сожалению я все еще не програмист, но заметив новую строку $data = ;
Удалил ее проблема ушла
Немного помучав Клавдию, она подсказала ответ.


Проблема в том, что таблица должна обновлять сумму по всем складам для каждого storefront_id, но обновляется только для storefront_id 0, а storefront_id 1 игнорируется.

Основная причина проблемы заключается в расположении строки $data = [];. Инициализация пустого массива происходит внутри цикла по складам, из-за чего:

  1. Для каждого нового склада массив $data перезаписывается заново
  2. Это приводит к тому, что накопленные данные о количестве товаров для каждой витрины (storefront) в предыдущих итерациях теряются
  3. В итоговый массив $warehouses_sum_amounts попадают только данные с последней итерации или неполные данные

Для решения проблемы нужно вынести инициализацию массива $data за пределы цикла по складам:

php

// Инициализируем $data один раз для всех складов
$data = [];
foreach ($product_stocks as $product_stock) {
    foreach ($product_stock->getWarehouses() as $warehouse) {
        if ($warehouse->isMarkedToRemove()) {
            continue;
        }
        if (!$warehouse->isActive()) {
            continue;
        }
        // Убираем инициализацию $data = [] отсюда
        
        foreach ($warehouses_storefront_ids[$warehouse->getWarehouseId()] as $storefront_id) {
            // Код остается прежним
            if (isset($data[$storefront_id])) {
                $data[$storefront_id]['amount'] += $warehouse->getAmount();
            } else {
                $data[$storefront_id] = [
                    'product_id' => $product_stock->getProductId(),
                    'amount' => $warehouse->getAmount(),
                    'storefront_id' => $storefront_id
                ];
            }
        }
    }
}

// Перенести этот код за пределы всех циклов
foreach ($data as $storefront_data) {
    $warehouses_sum_amounts[] = $storefront_data;
}

Таким образом, $data будет накапливать суммы по всем складам для каждого storefront_id, включая и storefront_id 0, и storefront_id 1, а затем все эти данные будут добавлены в $warehouses_sum_amounts.

Прошу специалистов прокоментировать и возможно подсказать более грамотное решение.
Спасибо.

п.с. проверил на двухвитринном магазине и тоже фикс срабатывает.
Даже если товар привязан к 3м складам
И 1 из этих складов привязан только к 1й витрине.
Количества на каждой витрине оказались правильными.

3 лайка

Таки вспомнил, что что-то такое уже было полгода назад.

Вот дифф.

123.zip (1006 байтов)

Странно конечно, что решение до сих пор не добавлено в новую сборку, т.к. один сайт обновлял неделю назад.

Команда Карта, это ппц какое проблемное место.
Про такое надо рассылки в почту делать и SP выпускать!
Т.к. выгрузки во всякие сервисы напрямую влияют на продажи!!!

2 лайка