Вопрос

Учитывая приказ, который был выставлен в счет (с помощью наличных денег на доставку для тестирования) и находится в состоянии «обработки», как я могу создать кредитную память для данного SKU и количества (в коде, который находится за пределами маршрутизации Magento; например /test.php)?

Скажи, что у моего заказа есть предмет Sku "100-0055-BRO-S" и количество 2, и я хочу вернуть 1 из них. Мой текущий код выглядит так:

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

Это приводит к тому, что кредитная памятка создается в заказе и отображается на панели администратора. Тем не менее, предмет выглядит так:

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

Я не понимаю, почему подтолт 0. Может быть, это как -то связано с тем, чтобы не использовать счет? Но я не уверен, как пойти даже об этом. Похоже, что он берет сумму скидки и вычитает ее из подтотальной + налоговой суммы. Также все общее количество кредитных записок (подтотальная, корректировка, плата за корректировку, налог, общая сумма) составляет 0,00 долл. США.

Математика, которую я делаю, чтобы вручную установить значения для $mcmi (Mage Credit Memo) кажется отрывочным. Я думаю, что Magento установит их для меня, учитывая Quty, на который я его установил, но, похоже, это не так, поэтому я должен сделать это сам. Если есть лучший способ установить эти значения, я бы тоже признателен за помощь.

Это было полезно?

Решение

Вместо того, чтобы использовать конвертер напрямую, вместо этого было бы лучше использовать модель службы заказа:

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

По крайней мере, это хорошо сработало для меня до сих пор.

Другие советы

Если вам нужно возместить онлайн, вы должны использовать так:

$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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top