Frage

Wie kann ich ein Kredit -Memo für eine bestimmte SKU und Menge erstellen (in Code, der außerhalb von Magento Routing liegt; z. /test.php)?

Sagen Sie, meine Bestellung hat einen SKU -Gegenstand "100-0055-BRO-S" und Menge 2, und ich möchte 1 davon erstatten. Mein aktueller Code sieht so aus:

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

Dies führt dazu, dass ein Kredit -Memo in der Bestellung erstellt und im Administratorbereich angezeigt wird. Der Artikel sieht jedoch so aus:

Price    Qty  Subtotal   Tax Amount   Discount Amount    Row Total
$38.00    1    $0.00       $1.62           $19.00         -$17.39

Ich verstehe nicht, warum der Subtotal 0 ist. Vielleicht hat es etwas damit zu tun, die Rechnung nicht zu verwenden? Aber ich bin mir nicht sicher, wie ich dazu gehen soll. Es scheint, als würde es den Rabattbetrag nehmen und ihn vom subtotalen + Steuerbetrag abziehen. Auch alle Kredit -Memo -Summen (subtotaler, Anpassungsrückerstattung, Anpassungsgebühr, Steuern, Gesamtsumme) betragen 0,00 USD.

Die Mathematik, die ich mache, um die Werte manuell festzulegen $mcmi (Magier -Kredit -Memo -Artikel) erscheint skizzenhaft. Ich würde denken, dass Magento diese für mich einstellen würde, da ich es den Qty einstellen würde, aber es scheint, als würde es nicht so tun, dass ich es selbst tun muss. Wenn es eine bessere Möglichkeit gibt, diese Werte festzulegen, würde ich mich auch über die Hilfe dort freuen.

War es hilfreich?

Lösung

Anstatt den Konverter direkt zu verwenden, wäre es besser, stattdessen das Auftragsdienstmodell zu verwenden:

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

Zumindest hat das bisher für mich gut funktioniert.

Andere Tipps

Wenn Sie online zurückerstatten müssen, sollten Sie dies als so verwenden:

$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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top