How to create partial invoice?
Asked Answered
M

2

7

From a specific order I want to create an invoice for some selected items from that order.

I have successfully created an invoice for the whole order programmatically, but I want to create a partial invoice of that order.

Margaret answered 27/12, 2013 at 11:0 Comment(0)
M
12

Atlast I got it .
Had to dig magento to get this .

$orderid // order id
$order = Mage::getModel('sales/order')->load($orderid);

or for order increment id 
$orderincrmentid // order increment id

$order = Mage::getModel('sales/order')->loadByIncrementId($orderincrmentid);


if($order->canInvoice()) {          
    $invoiceId = Mage::getModel('sales/order_invoice_api')
            ->create($order->getIncrementId(), $itemsarray ,'your_comment' ,1,1);
}
echo $invoiceId; // Gives increment Invoice id

@parameters for above create function :

1st parameter : order increment id

2nd parameter : array

// array format . [Main point]

   foreach($order->getAllItems() as $item) {
$item_id = $item->getItemId(); //order_item_id
$qty = $item->getQtyOrdered();   //qty ordered for that item
}

array('56'=>'3','57'=>'1','58'=>'0');

array([order_item_id] => [qty]); // general array format

So here you will add order item id as key and its qty as its value .
If one do not want to create invoice id a particular item then simply pass value of its quantity as 0 // zero .

3rd parameter : comment

4th parameter : to send mail ----> 1 not send mail ----> 0

5th parameter : include comment in mail ----> 1 not include comment in mail ----> 0

It returns invoice increment id .

Hope it helps someone .

Margaret answered 27/12, 2013 at 11:3 Comment(3)
could you capture using this same method?Pontoon
@Pontoon : Capture in terms of ? You will be able to see the invoice in admin panel too .Margaret
We are running a multi store setup, the above code works for only one store. While running for the other stores, it throwing an error "Item not found". Can you please help me on this? I couldn't generate invoice in admin panel also.Schmitt
C
1

Try this one...

<?php
$orderID = "145000010"; //order increment id
$orderDetails = Mage::getModel('sales/order')->loadByIncrementId($orderID);

if($orderDetails->canInvoice() and $orderDetails->getIncrementId())
{
    //$order = Mage::getModel('sales/order')->loadByIncrementId($order_id);
    $orderItems = $orderDetails->getAllItems();
    $invoiceItems = array();

    foreach ($orderItems as $_eachItem) {
    $opid = $_eachItem->getId();
    $opdtId = $_eachItem->getProductId();
    $itemss = Mage::getModel('catalog/product')->load($opdtId);
    $psku = $itemss->getSku(); // get product attribute which is used your condition
    if($psku=='Test product1'){
        $qty = $_eachItem->getQtyOrdered();
    } else {
        $qty = 0;
    }

    $itemsarray[$opid] = $qty;
    }

    if($orderDetails->canInvoice()) { 
    echo $invoiceId = Mage::getModel('sales/order_invoice_api')
    ->create($orderDetails->getIncrementId(), $itemsarray ,'Partially create Invoice programatically' ,0,0);
    }
}
?>

For more info

Carpous answered 12/6, 2015 at 8:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.