How to create partial invoice?

后端 未结 2 700
南笙
南笙 2021-02-04 16:47

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, b

相关标签:
2条回答
  • 2021-02-04 17:41

    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

    0 讨论(0)
  • 2021-02-04 17:44

    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 .

    0 讨论(0)
提交回复
热议问题