Избегайте уменьшения количества продукта, когда статус заказа по-прежнему "Обрабатывается"

Как избежать уменьшения количества товара, когда оно все еще находится в "Обработке", и обновления, когда заказ был отправлен или доставлен?

Я редактировал эту часть кода в orderdetail.php и добавь это $id_order_state != Configuration::get('PS_OS_PREPARATION') в заявлении if. Да, количество не уменьшается при обработке, но при отправке оно также не уменьшается. Пожалуйста, помогите, я застрял здесь.

protected function checkProductStock($product, $id_order_state)
{
    if ($id_order_state != Configuration::get('PS_OS_CANCELED') && $id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_PREPARATION')) {
        $update_quantity = true;
        if (!StockAvailable::dependsOnStock($product['id_product'])) {
            $update_quantity = StockAvailable::updateQuantity($product['id_product'], $product['id_product_attribute'], -(int)$product['cart_quantity']);
        }

        if ($update_quantity) {
            $product['stock_quantity'] -= $product['cart_quantity'];
        }

        if ($product['stock_quantity'] < 0 && Configuration::get('PS_STOCK_MANAGEMENT')) {
            $this->outOfStock = true;
        }
        Product::updateDefaultAttribute($product['id_product']);
    }
}

1 ответ

Объект OrderDetail создается только один раз для каждого Заказа и не будет обновляться после этого даже при изменении состояния Заказа. Поэтому, когда ваш объект OrderDetail создан, с вашей модификацией он не будет обновлять запас, потому что у него нет нужного состояния. И когда вы позже измените состояние заказа метод checkProductStock больше никогда не будет звонить

Вы можете создать собственный модуль, подключенный actionOrderStatusPostUpdate (ведьма срабатывает внутри changeIdOrderState() метод класса OrderHistory(), В вашем модуле вы скопируете checkProductStock() метод и вызовите его из ловушки, если состояние "отправлено".


РЕДАКТИРОВАТЬ

Если вы хотите добавить его непосредственно в ядро:

редактировать classes/order/OrderHistory.php

В методе changeIdOrderState() изменить последние строки:

    // executes hook
    Hook::exec('actionOrderStatusPostUpdate', array('newOrderStatus' => $new_os, 'id_order' => (int)$order->id, ), null, false, true, false, $order->id_shop);

    // Here change 4 to the desired id_order_state
    if ($new_order_state == 4)
    {
        $virtual_products = $order->getVirtualProducts();
        foreach ($virtual_products as $virtual_product)
        {
            $this->checkProductStock($virtual_product['product_id'], $new_order_state);
        }
    }

    ShopUrl::resetMainDomainCache();
}

После этого добавьте новый метод в этот класс:

protected function checkProductStock($product, $id_order_state)
{
    $update_quantity = true;
    if (!StockAvailable::dependsOnStock($product['product_id']))
    {
        StockAvailable::updateQuantity($product['product_id'], $product['product_attribute_id'], -(int)$product['product_quantity']);
    }

    Product::updateDefaultAttribute($product['product_id']);
}

Этот код не был проверен.


Я советую вам сделать это в переопределении:

Создать новый файл в /overrides/classes/order/OrderHistory.php Ведьма содержит эти два метода и изменить определение класса на class OrderHistory extends OrderHistoryCore {, вам придется удалить /cache/class_index.php после добавления этого файла.

Другие вопросы по тегам