Mediante programación crear un abono
-
16-10-2019 - |
Pregunta
Dado un orden que se ha facturado (en efectivo a la entrega para las pruebas) y está en estado "procesamiento", ¿cómo puedo crear una nota de crédito para una SKU y cantidad dada (en el código que se encuentra fuera de Magento encaminamiento; por ejemplo, /test.php
)?
Di mi pedido tiene un elemento de SKU "100-0055-BRO-S"
y 2
cantidad, y yo quiero a la devolución de éstos 1. Mis actuales miradas código como el siguiente:
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();
Esto resulta en una nota de crédito que se crea en el orden y aparecer en el panel de administración. Sin embargo, las miradas artículo como éste:
Price Qty Subtotal Tax Amount Discount Amount Row Total
$38.00 1 $0.00 $1.62 $19.00 -$17.39
No entiendo por qué el subtotal es 0. Tal vez tenga algo que ver con la no utilización de la factura? Pero no estoy seguro de cómo hacer incluso sobre eso. Parece que está tomando la cantidad de descuento y restarlo de la cantidad de impuestos + subtotal. También todos los totales de nota de crédito (subtotal, reembolso de ajuste, ajuste de tasas, impuestos, gran total) son de $ 0,00.
La matemática que estoy haciendo para ajustar manualmente los valores para $mcmi
(Mago de crédito opción Nota) parece dudoso. Me gustaría pensar que Magento fijaría éstos para mí dado el qty lo fijo a, pero parece que no lo hace así que tengo que hacerlo yo mismo. Si hay una mejor manera de establecer estos valores, apreciaría la ayuda allí también.
Solución
En lugar de utilizar directamente el convertidor, sería mejor utilizar el modelo de servicio de pedidos en su lugar:
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();
Al menos eso funcionó bien para mí hasta ahora.
Otros consejos
Si usted necesita consolidar en línea que puedes usar como esta manera:
$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();