И все-таки нелогичное поведение статусов заказов

При отслеживании количества товара на складе и запрете на отрицательное количество, возникает коллизия со статусом Отложен. Такая ситуация:
количество товара - 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, но остатки каким-то образом постоянно сбиваются. Увеличение настроено только на статус “Заказ аннулирован”. Подозреваю, что глюк где-то в незавершенных заказах брошенных корзин таится.