Программно создавать кредитную память
-
16-10-2019 - |
Вопрос
Учитывая приказ, который был выставлен в счет (с помощью наличных денег на доставку для тестирования) и находится в состоянии «обработки», как я могу создать кредитную память для данного SKU и количества (в коде, который находится за пределами маршрутизации Magento; например /test.php
)?
Скажи, что у моего заказа есть предмет Sku "100-0055-BRO-S"
и количество 2
, и я хочу вернуть 1 из них. Мой текущий код выглядит так:
require 'app/Mage.php';
umask(0);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
setlocale(LC_MONETARY, 'en_US');
$order = Mage::getModel('sales/order')->loadByIncrementId(1117575);
$convertor = Mage::getModel('sales/convert_order');
$refundSku = '100-0055-BRO-S';
$refundQty = 1;
$refundOi = null;
//$refundInvoice = null;
foreach($order->getAllItems() as $oi) {
if($oi->getSku() == $refundSku) {
$refundOi = Mage::getModel('sales/order_item')->load($oi->getId());
break;
}
}
$mcm = $convertor->toCreditmemo($order);
$mcmi = $convertor->itemToCreditmemoItem($refundOi);
$mcmi->setQty($refundQty);
$mcmi->setDiscountAmount($refundOi->getDiscountAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setBaseDiscountAmount($refundOi->getBaseDiscountAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setTaxAmount($refundOi->getTaxAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setBaseTaxAmount($refundOi->getBaseTaxAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setHiddenTaxAmount($refundOi->getHiddenTaxAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setBaseHiddenTaxAmount($refundOi->getBaseHiddenTaxAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcm->addItem($mcmi);
$mcm->register();
Mage::getModel('core/resource_transaction')
->addObject($mcm)
->addObject($mcm->getOrder())
->save();
Это приводит к тому, что кредитная памятка создается в заказе и отображается на панели администратора. Тем не менее, предмет выглядит так:
Price Qty Subtotal Tax Amount Discount Amount Row Total
$38.00 1 $0.00 $1.62 $19.00 -$17.39
Я не понимаю, почему подтолт 0. Может быть, это как -то связано с тем, чтобы не использовать счет? Но я не уверен, как пойти даже об этом. Похоже, что он берет сумму скидки и вычитает ее из подтотальной + налоговой суммы. Также все общее количество кредитных записок (подтотальная, корректировка, плата за корректировку, налог, общая сумма) составляет 0,00 долл. США.
Математика, которую я делаю, чтобы вручную установить значения для $mcmi
(Mage Credit Memo) кажется отрывочным. Я думаю, что Magento установит их для меня, учитывая Quty, на который я его установил, но, похоже, это не так, поэтому я должен сделать это сам. Если есть лучший способ установить эти значения, я бы тоже признателен за помощь.
Решение
Вместо того, чтобы использовать конвертер напрямую, вместо этого было бы лучше использовать модель службы заказа:
Mage::app('admin');
$order = Mage::getModel('sales/order')->loadByIncrementId('1117575');
$orderItem = $order->getItemsCollection()->getItemByColumnValue('sku', '100-0055-BRO-S');
$service = Mage::getModel('sales/service_order', $order);
$data = array(
'qtys' => array(
$orderItem->getId() => 1
)
);
$creditMemo = $service->prepareCreditmemo($data)->register()->save();
По крайней мере, это хорошо сработало для меня до сих пор.
Другие советы
Если вам нужно возместить онлайн, вы должны использовать так:
$order = Mage::getModel('sales/order')->loadByIncrementId('1117575');
$service = Mage::getModel('sales/service_order', $order);
$creditmemo = $service->prepareInvoiceCreditmemo($invoice);
$creditmemo->setRefundRequested(true)
->setOfflineRequested(false) // request to refund online
->register();
Mage::getModel('core/resource_transaction')
->addObject($creditmemo)
->addObject($creditmemo->getOrder())
->addObject($creditmemo->getInvoice())
->save();