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.

¿Fue útil?

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top