Приветсвую.
Прошу обратить внимание команду Карта и общественность.
Т.к. скорее всего такая проблема могла возникнуть у многих ваших клиентов и она может сделать большую беду.
\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 = [];
. Инициализация пустого массива происходит внутри цикла по складам, из-за чего:
- Для каждого нового склада массив
$data
перезаписывается заново - Это приводит к тому, что накопленные данные о количестве товаров для каждой витрины (storefront) в предыдущих итерациях теряются
- В итоговый массив
$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й витрине.
Количества на каждой витрине оказались правильными.