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.

Était-ce utile?

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top