Уловете частична сума, след като поръчката е направена

Създадох връзка в администратора на Magento, за да създам фактурата за отделен продукт, но докато извиквам функцията $order->prepareInvoice($qtys), тя ще добави целия продукт във фактурата, дори че предавам само един артикул.

Използвам кода по-долу.

$order = Mage::getModel('sales/order')->load($this->getRequest()->getParam('order_id'));

$count = $order->getTotalItemCount();

$qtys = Array
    (
        [370] => 1
    );

$invoice = $order->prepareInvoice($qtys);
if (!$invoice->getTotalQty()) {
    Mage::throwException(Mage::helper('core')->__('Cannot create an invoice without products.'));
}

$amount = $invoice->getGrandTotal();
$invoice->register()->pay();
$invoice->getOrder()->setIsInProcess(true);
$history = $invoice->getOrder()->addStatusHistoryComment('Partial amount of $'. $amount .' captured automatically.', false);
$history->setIsCustomerNotified(true);
$order->save();
Mage::getModel('core/resource_transaction')
            ->addObject($invoice)
            ->addObject($invoice->getOrder())
            ->save();
$invoice->save();

въведете описание на изображението тук

Някакво предложение?


person MagentoDiary    schedule 27.12.2012    source източник
comment
Без коментари и без предложения?   -  person MagentoDiary    schedule 28.12.2012
comment
Правил съм частични фактури няколко пъти преди и когато сравня стария код, той е много подобен. Не се обаждам на pay(), защото register() прави това, когато е подходящо. Освен това не е необходимо да се обаждате на $invoice->save(), защото той вече е запазен от транзакцията, но се съмнявам, че това е вашият проблем. Може би типът плащане забранява частично улавяне - това е функция и обикновено също е зададено на false.   -  person clockworkgeek    schedule 30.12.2012
comment
Благодаря, че ми предложихте, всъщност мога да уловя частична сума след оторизация, докато правя поръчка в същата поръчка (Същият горен код), но докато опитвам същото от администратора, след това създавам фактура за всички останали продукти.   -  person MagentoDiary    schedule 30.12.2012


Отговори (1)


Логиката, открита в Mage_Sales_Model_Service_Order::prepareInvoice, методът, който в крайна сметка извиквате, за да подготвите фактурата, разкрива какво се играе тук. Използва се следният цикъл и вътрешният блок else-if е мястото, където се задава qty, когато се предава масив от qtys:

foreach ($this->_order->getAllItems() as $orderItem) {
    if (!$this->_canInvoiceItem($orderItem, array())) {
        continue;
    }
    $item = $this->_convertor->itemToInvoiceItem($orderItem);
    if ($orderItem->isDummy()) {
        $qty = $orderItem->getQtyOrdered() ? $orderItem->getQtyOrdered() : 1;
    } else if (!empty($qtys)) {
        if (isset($qtys[$orderItem->getId()])) {
            $qty = (float) $qtys[$orderItem->getId()];
        }
    } else {
        $qty = $orderItem->getQtyToInvoice();
    }
    $totalQty += $qty;
    $item->setQty($qty);
    $invoice->addItem($item);
}

Променливата $qtys е масивът, който предавате на извикването на pripraveInvoice. Във вашия случай вие предавате само индекс за артикула, който искате да добавите към фактурата. Според документацията (и горния цикъл), това трябва да работи, с изключение на един малък проблем: горният цикъл не нулира стойността на $qty в началото на цикъла на 0. Това не представляват проблем при извикване от основния код, който обработва инициализация на фактурата, когато е създадена от администратора чрез предварително съществуващия формуляр, тъй като формулярът, който се изпраща, винаги ще съдържа стойност за всеки артикул от поръчката и в случай от само 1 артикул, който се фактурира, всички останали ще държат стойност 0 qty, като по този начин се заобикаля неуспехът да се нулира стойността на $qty.

За да разрешите проблема си, опитайте да зададете вашата променлива $qtys така (предполагам, че 370 и 371 са двата идентификатора на обекта на артикула за поръчка):

$qtys = array(
    370 => 1,
    371 => 0,
);

Алтернатива, която бих могъл да предложа, е просто връзката ви „Създаване на фактура“ да зададе подходящите стойности във формуляра за фактуриране на отделния артикул и след това да изпрати формуляра директно. По този начин ще разчитате на работещия основен контролер за вдигане на тежко. Това, разбира се, ще работи само ако не правите нищо доста персонализирано освен фактурирането на единичния артикул. :)

person davidalger    schedule 04.01.2013