Domanda

Dato un ordine che è stata fatturata (in contrassegno per le prove) ed è in stato "elaborazione", come posso generare una nota di credito per un dato SKU e la quantità (in codice esterno di Magento instradamento; es /test.php)?

Di 'il mio ordine ha un elemento di sku "100-0055-BRO-S" e quantità 2, e voglio rimborsare 1 di questi. I miei sguardi di codice attuali come questo:

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 risultato è una nota di credito viene creato l'ordine e mostrando nel pannello di amministrazione. Tuttavia, gli sguardi voce in questo modo:

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

Non capisco il motivo per cui il totale parziale è 0. Forse ha qualcosa a che fare con non utilizzando la fattura? Ma io non sono sicuro di come fare anche di questo. Sembra che sta prendendo l'importo di sconto e sottraendo dalla somma delle imposte + subtotale. Anche tutti i totali di note di credito (totale parziale, rimborso regolazione, tassa di regolazione, fiscali, gran totale) sono $ 0,00.

La matematica che sto facendo per impostare manualmente i valori per $mcmi (Mage Credit Memo Voce) sembra impreciso. Vorrei pensare che Magento sarebbe impostare questi per me dato il qty ho impostato a, ma sembra come se non lo fa, quindi devo farlo io stesso. Se c'è un modo migliore per impostare questi valori, avrei apprezzato l'aiuto anche lì.

È stato utile?

Soluzione

Invece di usare direttamente il convertitore, sarebbe meglio utilizzare il modello di servizio ordine invece:

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

Almeno che ha funzionato bene per me finora.

Altri suggerimenti

Se avete bisogno di rimborsare in linea si dovrebbe utilizzare come in questo modo:

$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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top