Удалять продукты из заказа программно
Я использую Magento CE 1.8.1.0 и разработал php-скрипт, который может удалять товар из заказа. После удаления товара стоимость заказа остается прежней. Как я могу уменьшить стоимость заказа на сумму удаленного продукта?
Мой сценарий:
$base_grand_total = $order->getBaseGrandTotal();
$base_subtotal = $order->getBaseSubtotal();
$base_tva = $order->getBaseTaxAmount();
$grand_total = $order->getGrandTotal();
$subtotal = $order->getSubtotal();
$tva = $order->getTaxAmount();
$base_subtotal_incl_tax = $order->getBaseSubtotalInclTax();
$subtotal_incl_tax = $order->getSubtotalInclTax();
$total_item_count = $order->getTotalItemCount();
$item_price = $sItem->getPrice();
$item_tva = $sItem->getTaxAmount();
$sItem->delete();
$order->setBaseGrandTotal($base_grand_total-$item_price-$item_tva);
$order->setBaseSubtotal($base_subtotal);
$order->setBaseTaxAmount($base_tva-$item_tva);
$order->setGrandTotal($grand_total-$item_price-$item_tva);
$order->setSubtotal($subtotal-$item_price);
$order->setTaxAmount($tva-$item_tva);
$order->setBaseSubtotalInclTax($base_subtotal_incl_tax-$item_price);
$order->setSubtotalInclTax($subtotal_incl_tax-$item_price);
$order->setTotalItemCount($total_item_count-1);
$order->save();
3 answers
Я надеюсь, что вам не нужно удалять все элементы. таким образом, должно быть какое-то условие для удаления элемента и порядка обновления внутри него.
Для меня работает следующее.
Только что выполнили условное обновление для заказа и удаление для товара. и также удалили цену товара из base_subtotal.
$_order = Mage::getModel('sales/order')->load(order_id);
$items = $_order->getAllItems();
foreach ($items as $item){
$base_grand_total = $_order->getBaseGrandTotal();
$base_subtotal = $_order->getBaseSubtotal();
$base_tva = $_order->getBaseTaxAmount();
$grand_total = $_order->getGrandTotal();
$subtotal = $_order->getSubtotal();
$tva = $_order->getTaxAmount();
$base_subtotal_incl_tax = $_order->getBaseSubtotalInclTax();
$subtotal_incl_tax = $_order->getSubtotalInclTax();
$total_item_count = $_order->getTotalItemCount();
if($item->getSku()=='test-default'){
$item_price = $item->getPrice();
$item_tva = $item->getTaxAmount();
$item->delete();
$_order->setBaseGrandTotal($base_grand_total-$item_price-$item_tva);
$_order->setBaseSubtotal($base_subtotal-$item_price);
$_order->setBaseTaxAmount($base_tva-$item_tva);
$_order->setGrandTotal($grand_total-$item_price-$item_tva);
$_order->setSubtotal($subtotal-$item_price);
$_order->setTaxAmount($tva-$item_tva);
$_order->setBaseSubtotalInclTax($base_subtotal_incl_tax-$item_price);
$_order->setSubtotalInclTax($subtotal_incl_tax-$item_price);
$_order->setTotalItemCount(count($items)-1);
$_order->save();
}
}
Вам нужно вызвать сбор итогов по объекту котировки:
$quote->collectTotals()->save();
Просто обновление ответа @Namita.
Попробуйте
$_order = Mage::getModel('sales/order')->loadByIncrementId('100000053');
$items = $_order->getAllItems();
В первой строке, если приведенное выше не работает для вас. Просто попробовал его из корня magento в качестве внешнего кода с этим обновлением. Это прекрасно работает!
Пожалуйста, дайте мне знать, требуются ли полные строки кода.
<?php
require_once('app/Mage.php'); //Path to Magento
umask(0);
Mage::app();
try{
// $_order = Mage::getModel('sales/order')->load(order_id);
$_order = Mage::getModel('sales/order')->loadByIncrementId('100000053');
$items = $_order->getAllItems();
.
.
.
echo "success";
} catch(Exception $e) {
echo "failed";
}