1

I am canceling credit memo using below code:

foreach ($collection as $creditmemo) {
    if($creditmemo->getState() != 3){
            $order = $creditmemo->getOrder();
            $creditmemo->setState(\Magento\Sales\Model\Order\Creditmemo::STATE_CANCELED);
            foreach ($creditmemo->getAllItems() as $item) {
                $item->cancel();
                $item->save();        
            }
            $creditmemo->save();
    }
}

The above code gives the following error:

We found an invalid quantity to refund item

The cancel() method checks the quantity available for a given item using isQtyAvailable() method which is returning 0.

I also tried the following solution:

foreach ($creditmemo->getAllItems() as $item) {
    // $getQtyReturned = $item->getOrderItem()->getQtyRefunded();
    // $creditmemoQty = $item->getQty();
    // $item->getOrderItem()->setQtyRefunded($getQtyReturned - $creditmemoQty);
    $qty = $item->getQty();
    $item->getOrderItem()->setQtyRefunded($item->getOrderItem()->getQtyRefunded() - $qty);
    $item->getOrderItem()->setTaxRefunded(
        $item->getOrderItem()->getTaxRefunded() -
        $item->getOrderItem()->getBaseTaxAmount() *
        $qty /
        $item->getOrderItem()->getQtyOrdered()
    );
    $item->getOrderItem()->setDiscountTaxCompensationRefunded(
        $item->getOrderItem()->getDiscountTaxCompensationRefunded() -
        $item->getOrderItem()->getDiscountTaxCompensationAmount() *
        $qty /
        $item->getOrderItem()->getQtyOrdered()
    );
    $item->save();        
}

The above solution works, but during the creation of a credit memo for the same order again, it gives the subtotal of credit memo as 0.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.