股票PrestaShop

时间:2017-03-29 14:43:08

标签: prestashop prestashop-1.6

我是PrestaShop的全新人物。我遇到了一个问题,在PrestaShop从库存中减去物品的代码中找不到。

当客户创建订单并选择付款时,商品会从库存中扣除,但如果客户不付款并返回,则商品不会返回库存。所以我需要了解它在代码中发生的位置,以便编写自动执行它的函数。

1 个答案:

答案 0 :(得分:7)

PaymentModule::validateOrder中,OrderDetail->createList打电话给:

// Insert new Order detail list using cart for the current order
$order_detail = new OrderDetail(null, null, $this->context);
$order_detail->createList($order, $this->context->cart, $id_order_state, $order->product_list, 0, true, $package_list[$id_address][$id_package]['id_warehouse']);
$order_detail_list[] = $order_detail;

OrderDetail->createList中,我们会在列表中调用$this->create foreach产品。这是“计算”订单明细数据的位置,并且有$this->checkProductStock($product, $id_order_state);检查订单是否未被取消而不是错误,以及该产品是否依赖于库存:

protected function checkProductStock($product, $id_order_state)
{
    if ($id_order_state != Configuration::get('PS_OS_CANCELED') && $id_order_state != Configuration::get('PS_OS_ERROR')) {
        $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']);
    }
}

顺便说一句,如果您取消订单,则会使用该订单金额重置股票。

但是如果您只想在付款后减少库存,在您的情况下我会添加一个配置PS_WAITING_PAYMENT,其中包含订单所具有的价值(如果未确认),然后覆盖此最后一个功能以添加等待付款的状态

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_WAITING_PAYMENT')) {
        $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']);
    }
}

如果您将等待付款订单状态设置为不可记录,并且新状态可以记录,则当您将状态更改为已确认付款时,它应减少库存,因为在OrderHistory-&gt; changeIdOrderState中存在:

...
foreach ($order->getProductsDetail() as $product) {
    if (Validate::isLoadedObject($old_os)) {
        // if becoming logable => adds sale
        if ($new_os->logable && !$old_os->logable) {
            ProductSale::addProductSale($product['product_id'], $product['product_quantity']);
            // @since 1.5.0 - Stock Management
            if (!Pack::isPack($product['product_id']) &&
                in_array($old_os->id, $error_or_canceled_statuses) &&
                !StockAvailable::dependsOnStock($product['id_product'], (int)$order->id_shop)) {
                StockAvailable::updateQuantity($product['product_id'], $product['product_attribute_id'], -(int)$product['product_quantity'], $order->id_shop);
            }
        }
    ...