/** * @param OrderDetail $order_detail * @param int $qty_cancel_product * @param bool $delete */ protected function reinjectQuantity($order_detail, $qty_cancel_product, $delete = false) { // Reinject product $reinjectable_quantity = (int) $order_detail->product_quantity - (int) $order_detail->product_quantity_reinjected; $quantity_to_reinject = $qty_cancel_product > $reinjectable_quantity ? $reinjectable_quantity : $qty_cancel_product; // @since 1.5.0 : Advanced Stock Management $product_to_inject = new Product($order_detail->product_id, false, (int) $this->context->language->id, (int) $order_detail->id_shop); $product = new Product($order_detail->product_id, false, (int) $this->context->language->id, (int) $order_detail->id_shop); if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') && $product->advanced_stock_management && $order_detail->id_warehouse != 0) { $manager = StockManagerFactory::getManager(); $movements = StockMvt::getNegativeStockMvts($order_detail->id_order, $order_detail->product_id, $order_detail->product_attribute_id, $quantity_to_reinject); $left_to_reinject = $quantity_to_reinject; foreach ($movements as $movement) { if ($left_to_reinject > $movement['physical_quantity']) { $quantity_to_reinject = $movement['physical_quantity']; } $left_to_reinject -= $quantity_to_reinject; if (Pack::isPack((int) $product->id)) { // Gets items if ($product->pack_stock_type == 1 || $product->pack_stock_type == 2 || $product->pack_stock_type == 3 && Configuration::get('PS_PACK_STOCK_TYPE') > 0) { $products_pack = Pack::getItems((int) $product->id, (int) Configuration::get('PS_LANG_DEFAULT')); // Foreach item foreach ($products_pack as $product_pack) { if ($product_pack->advanced_stock_management == 1) { $manager->addProduct($product_pack->id, $product_pack->id_pack_product_attribute, new Warehouse($movement['id_warehouse']), $product_pack->pack_quantity * $quantity_to_reinject, null, $movement['price_te'], true); } } } if ($product->pack_stock_type == 0 || $product->pack_stock_type == 2 || $product->pack_stock_type == 3 && (Configuration::get('PS_PACK_STOCK_TYPE') == 0 || Configuration::get('PS_PACK_STOCK_TYPE') == 2)) { $manager->addProduct($order_detail->product_id, $order_detail->product_attribute_id, new Warehouse($movement['id_warehouse']), $quantity_to_reinject, null, $movement['price_te'], true); } } else { $manager->addProduct($order_detail->product_id, $order_detail->product_attribute_id, new Warehouse($movement['id_warehouse']), $quantity_to_reinject, null, $movement['price_te'], true); } } $id_product = $order_detail->product_id; if ($delete) { $order_detail->delete(); } StockAvailable::synchronize($id_product); } elseif ($order_detail->id_warehouse == 0) { StockAvailable::updateQuantity($order_detail->product_id, $order_detail->product_attribute_id, $quantity_to_reinject, $order_detail->id_shop); if ($delete) { $order_detail->delete(); } } else { $this->errors[] = Tools::displayError('This product cannot be re-stocked.'); } }
/** * DOES delete the product * * @param OrderDetail $order_detail * @param int $quantity * @return bool * @throws PrestaShopException */ protected function _deleteProduct($order_detail, $quantity) { $product_price_tax_excl = $order_detail->unit_price_tax_excl * $quantity; $product_price_tax_incl = $order_detail->unit_price_tax_incl * $quantity; /* Update cart */ $cart = new Cart($this->id_cart); $cart->updateQty($quantity, $order_detail->product_id, $order_detail->product_attribute_id, false, 'down'); // customization are deleted in deleteCustomization $cart->update(); /* Update order */ $shipping_diff_tax_incl = $this->total_shipping_tax_incl - $cart->getPackageShippingCost($this->id_carrier, true, null, $this->getCartProducts()); $shipping_diff_tax_excl = $this->total_shipping_tax_excl - $cart->getPackageShippingCost($this->id_carrier, false, null, $this->getCartProducts()); $this->total_shipping -= $shipping_diff_tax_incl; $this->total_shipping_tax_excl -= $shipping_diff_tax_excl; $this->total_shipping_tax_incl -= $shipping_diff_tax_incl; $this->total_products -= $product_price_tax_excl; $this->total_products_wt -= $product_price_tax_incl; $this->total_paid -= $product_price_tax_incl + $shipping_diff_tax_incl; $this->total_paid_tax_incl -= $product_price_tax_incl + $shipping_diff_tax_incl; $this->total_paid_tax_excl -= $product_price_tax_excl + $shipping_diff_tax_excl; $this->total_paid_real -= $product_price_tax_incl + $shipping_diff_tax_incl; $fields = array('total_shipping', 'total_shipping_tax_excl', 'total_shipping_tax_incl', 'total_products', 'total_products_wt', 'total_paid', 'total_paid_tax_incl', 'total_paid_tax_excl', 'total_paid_real'); /* Prevent from floating precision issues */ foreach ($fields as $field) { if ($this->{$field} < 0) { $this->{$field} = 0; } } /* Prevent from floating precision issues */ foreach ($fields as $field) { $this->{$field} = number_format($this->{$field}, _PS_PRICE_COMPUTE_PRECISION_, '.', ''); } /* Update order detail */ $order_detail->product_quantity -= (int) $quantity; if ($order_detail->product_quantity == 0) { if (!$order_detail->delete()) { return false; } if (count($this->getProductsDetail()) == 0) { $history = new OrderHistory(); $history->id_order = (int) $this->id; $history->changeIdOrderState(Configuration::get('PS_OS_CANCELED'), $this); if (!$history->addWithemail()) { return false; } } return $this->update(); } else { $order_detail->total_price_tax_incl -= $product_price_tax_incl; $order_detail->total_price_tax_excl -= $product_price_tax_excl; $order_detail->total_shipping_price_tax_incl -= $shipping_diff_tax_incl; $order_detail->total_shipping_price_tax_excl -= $shipping_diff_tax_excl; } return $order_detail->update() && $this->update(); }