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.
What is a partial invoice? A partial invoice is issued when you want to invoice a service that has already been completely performed. For example, if three out of ten production machines have already been delivered for an order, a partial invoice can be issued for the goods already delivered.
Once you click on Process Open Items → Go to Partial Payment tab and select the invoice for which partial payment is done and the amount. Click the Save button to post the document.
Select the Sales tab. In the Progress Invoicing section, select Edit ✎. Turn on the switch to Create multiple partial invoices from a single estimate. Select Save and then Done.
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 .
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With