créer un programme note de crédit
-
16-10-2019 - |
Question
Étant donné un ordre qui a été facturé (en argent comptant à la livraison pour les tests) et est dans un état « traitement », comment puis-je créer une note de crédit pour une sku et la quantité (dans le code donné qui est en dehors de routage Magento; par exemple, /test.php
)?
Dis ma commande a un élément de sku "100-0055-BRO-S"
et 2
quantité, et je veux rembourser 1 de ces derniers. Mon apparence de code actuel comme celui-ci:
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();
Il en résulte une note de crédit en cours de création de l'ordre et apparaître dans le panneau d'administration. Cependant, l'apparence de l'objet comme celui-ci:
Price Qty Subtotal Tax Amount Discount Amount Row Total
$38.00 1 $0.00 $1.62 $19.00 -$17.39
Je ne comprends pas pourquoi le sous-total est 0. Peut-être qu'il a quelque chose à voir avec ne pas utiliser la facture? Mais je ne suis pas sûr de savoir comment aller encore à ce sujet. Il semble que cela prend le montant de la remise et en la soustrayant du montant de la taxe sous-total +. Aussi tous les totaux de note de crédit (sous-total, remboursement d'ajustement, les frais d'ajustement, impôts, grand total) sont 0,00 $.
Les mathématiques que je fais pour définir manuellement les valeurs $mcmi
(Memo Mage crédit article) semble peu précis. Je pense que Magento fixerait ces derniers pour me donner la qté je l'ai mis, mais il semble que cela ne fonctionne pas si je dois le faire moi-même. S'il y a une meilleure façon de définir ces valeurs, je vous serais reconnaissant de l'aide là-bas aussi.
La solution
Au lieu d'utiliser le convertisseur directement, il serait préférable d'utiliser le modèle de service de commande à la place:
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();
Au moins cela a bien fonctionné pour moi jusqu'à présent.
Autres conseils
Si vous avez besoin de rembourser, vous devriez utiliser en ligne comme ceci:
$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();