Логиката, открита в 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
pay()
, защотоregister()
прави това, когато е подходящо. Освен това не е необходимо да се обаждате на$invoice->save()
, защото той вече е запазен от транзакцията, но се съмнявам, че това е вашият проблем. Може би типът плащане забранява частично улавяне - това е функция и обикновено също е зададено на false. - person clockworkgeek   schedule 30.12.2012