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.

double-beep
  • 5,031
  • 17
  • 33
  • 41
Nikhil_K_R
  • 2,383
  • 5
  • 27
  • 51

2 Answers2

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 .

Nikhil_K_R
  • 2,383
  • 5
  • 27
  • 51
  • could you capture using this same method? – Chris Jan 23 '14 at 02:14
  • @Chris : Capture in terms of ? You will be able to see the invoice in admin panel too . – Nikhil_K_R Jan 23 '14 at 10:55
  • 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. – saran Feb 16 '15 at 12:10
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

Hardik
  • 1,283
  • 14
  • 34