Выставление счета на частичный заказ;итоги не обновляются - PullRequest
3 голосов
/ 18 апреля 2011

В процессе обработки заказа можно отправить счет на частичный заказ. Поэтому, когда отправляется пара строк заказа, необходимо также отправить счет-фактуру.

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

 $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice($items);

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

        $invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE);
        $invoice->register();
        $transactionSave = Mage::getModel('core/resource_transaction')
                        ->addObject($invoice)
                        ->addObject($invoice->getOrder());

        $transactionSave->save();

        $invoice->sendEmail();
        $invoice->setEmailSent(true);
        $invoice->save();

Где переменная $items - это массив, содержащий идентификаторы заказа и количество продуктов, подлежащих выставлению счета.

Созданный счет-фактура показывает правильные продукты для выставления счета, но итоги каким-то образом не обновляются. Итоги по-прежнему являются итогами полного заказа, а не частичной накладной.

Я, вероятно, должен обновить или пересчитать итоги, но не могу найти правильный код для принудительного обновления.

Кто-нибудь вокруг, кто может направить меня в правильном направлении?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2011

Ну, похоже, я нашел проблему.Функциональность, как описано выше, работает вручную, выполняя ее в интерфейсе администратора.Приведенный выше код работал только после изменения основного файла Magento.

Если вы измените строку 103 в Mage_Sales_Model_Service_Order с continue; на $qty = 0;, функциональность будет работать.

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

Я отправил его как проблему в списке вопросов Magento.

0 голосов
/ 06 марта 2012

ОК - у меня ушло немного, но теперь я вижу, как правильно создать массив.

foreach ($items as $itemId => $item) {
    $itemQtyToShip = $item->getQtyToShip()*1;
    if ($itemQtyToShip>0) {
       $itemQtyOnHand = $stockItem->getQty()*1;
       if ($itemQtyOnHand>0) {
          //use the order item id as key 
          //set the amount to invoice for as the value
          $toShip[$item->getId()] = $itemQtyToShip;             
       } else {
          //if not shipping the item set the qty to 0
          $toShip[$item->getId()] = 0;
    }
}

$invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice($toShip);

Это создает правильный счет.

0 голосов
/ 25 мая 2011

Сегодня я столкнулся именно с этой проблемой, но нашел более элегантный способ ее решения без редактирования ядра.Решение состоит в том, чтобы передать продукты, на которые мы не хотим выставлять счета, с нулевым количеством.Таким образом, код, который вы изменили в ядре, будет действовать точно так же, как в вашем решении:)

Например, если у меня есть 2 продукта в моем заказе:

array(
    1234 => 1,
    1235 => 2
)

, передавая этот массив:

$qtys = array(
    1234 => 1,
    1235 => 0
)

заставит этот код:

            // Mage_Sales_Model_Service_Order: lines 97-103
            if (isset($qtys[$orderItem->getId()])) { // here's the magic
                $qty = (float) $qtys[$orderItem->getId()];
            } elseif (!count($qtys)) {
                $qty = $orderItem->getQtyToInvoice();
            } else {
                continue; // the line to edit according to previous solution
            }

действовать так же, как в вашем решении, поэтому вам не нужно редактировать основной код.

Надеюсьпомогает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...