При отслеживании количества товара на складе и запрете на отрицательное количество, возникает коллизия со статусом Отложен. Такая ситуация:
количество товара - 0
Если попробовать поставить любой статус с уменьшением количества - заказ автоматом будет переведен в статус Отложен
потом количество появляется. Собираем заказ и отправляем, меняем статус на Доставляется или Выполнен - так как уменьшение после уменьшения - не уменьшает - количество не изменится, хотя должно было бы уменьшиться.
Если же для статуса Отложен поставить настройку расчета количества на Увеличение - сами понимаете, еще более странная ситуция возникает: так как товара 0, заказ переходит в Отложен, а так как расчет для этого статуса идет на увеличение, то товар тут же появляется в наличии.
PS переместил в баг трекер, так как это все-таки ошибка в расчете количества
8 лайков
поддержу,есть ли сдвиги ?
Здравствуйте.
Пожалуйста, уточните детали воспроизведения проблемы: каким образом был размещен заказ? Пожалуйста, предоставьте нам пошаговую инструкцию по воспроизведению данной ошибки.
Спасибо.
Значит, воспроизвел, случай не совсем типичный, но все же
Создание заказа идет следующим кодом:
Summary
fn_clear_cart($cart,true,true);
$shipping_ids = $data = array();
$shipping_ids = (array) SHIPPING_ID;
$customer_id = Registry::get('addons.avp_ozon.id_user_ozon');
$cart['user_data'] = fn_get_user_info($customer_id);
$cart['user_data']['phone'] = $cart['user_data']['b_phone'] = $cart['user_data']['s_phone'] = $v_order['order_number'];
fn_update_user_profile($customer_id, $cart['user_data']);
$cart['payment_id'] = PAYMENT_ID;
$customer_auth = fn_fill_auth($cart['user_data']);
$product_data = array();
foreach ($v_order['products'] as $v) {
$product_id = db_get_field("SELECT product_id FROM ?:products WHERE product_code = ?s", $v['offer_id']);
$product_data[$product_id] = ['amount' => $v['quantity'], 'stored_price' => 'Y', 'price' => floatval($v['price'])];
}
fn_add_product_to_cart($product_data, $cart, $customer_auth);
// group products - disable all calculations for speed
fn_calculate_cart_content($cart, $customer_auth, 'S', false, 'S', false);
if (!empty($cart['product_groups']) && !empty($shipping_ids)) {
if (count($shipping_ids) == 1) { //back capability
$shipping_ids = array_fill_keys(array_keys($cart['product_groups']), reset($shipping_ids));
}
foreach ($cart['product_groups'] as $key => $group) {
foreach ($group['shippings'] as $shipping_id => $shipping) {
if (isset($shipping_ids[$key]) && $shipping_id == $shipping_ids[$key]) {
$cart['chosen_shipping'][$key] = $shipping_id;
break;
}
}
}
}
$cart['calculate_shipping'] = false;
fn_calculate_cart_content($cart, $customer_auth);
fn_update_payment_surcharge($cart, $customer_auth);
Registry::set('runtime.company_id',$cart['user_data']['company_id']);
list($order_id, ) = fn_place_order($cart, $customer_auth, 'save', $user_id ? $user_id : null);
код дублирован из соответствующего контроллера, просто подставляются нужные значения.
используется для создания локального заказа при переносе заказа с другой площадки.
Так вот если количество локально 0 - заказ просто не создается. (то есть внутри fn_place_order есть проверка на наличие товара на складе)
Однако если локально было например 1 единица товара, а заказали - 3, заказ СОЗДАЕТСЯ, но со статустом ОТЛОЖЕН, при этом количество товара на складе не меняется. Далее - увеличиваем запас склада этого товара до 4 единиц. Меняем статус заказа с ОТЛОЖЕН на ОТКРЫТ. Смотрим: на складе так и осталось - 4 единицы товара, то есть уменьшения не произошло.
Наверное немного не в эту тему но то, что со статусами, что-то не так заметил давно. Приходится минимум 1 раз в неделю сверять остатки, синхронизации с 1С нет и поэтому количество товаров в наличии выставляю в cs-cart, но остатки каким-то образом постоянно сбиваются. Увеличение настроено только на статус “Заказ аннулирован”. Подозреваю, что глюк где-то в незавершенных заказах брошенных корзин таится.