Удалять продукты из заказа программно


Я использую 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(); 
Author: aceveve, 2014-09-10

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(); 
}

}
 2
Author: Namita sheth, 2014-09-10 13:44:55

Вам нужно вызвать сбор итогов по объекту котировки:

$quote->collectTotals()->save();
 0
Author: Paras Sood, 2014-09-10 07:11:55

Просто обновление ответа @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";
}
 0
Author: Suyash Kumar Bharti, 2016-07-15 07:35:08