2

I have used the code

if ($order->getInvoiceCollection()->count()) {
    $_invoices = $order->getInvoiceCollection();

    if ($_invoices) {
        foreach ($_invoices as $invoice) {
            $invoice->delete();
        }
    }
}

This is deleting invoice, but invoice button was not reappearing although invoice is deleted.

So, I have go through the database table and turns out order_items has item_invoiced column, I have used this code to set item invoiced value to 0

$items = $order->getAllItems();
foreach ($items as $k => $item) {
    echo $item->getId() . "\n";
    $item->setQtyInvoiced(0);
    $item->save();
}

After this code invoice button is appearing, but when I am creating invoice it is setting subtotal to negative like -1000

1 Answer 1

4

Looking at your code, I guess you miss the trick. You have to set order items fields to 0 which are effected by creating invoice. Replace your item foreach with this.

$items = $order->getAllItems();
    foreach ($items as $k => $item) {
        echo $item->getId() . "\n";
        $item->setBaseRowInvoiced(0);
        $item->setRowInvoiced(0);
        $item->setQtyInvoiced(0);
        $item->setDiscountInvoiced(0);
        $item->setBaseDiscountInvoiced(0);
        $item->save();
    }

You also have to add some order fields to 0 as well. for this you have to add following code in your script.

$order->setTotalPaid(0)
        ->setBaseTotalPaid(0)
        ->setBaseTotalInvoiced(0)
        ->setTotalInvoiced(0)
        ->setBaseSubtotalInvoiced(0)
        ->setSubtotalInvoiced(0)
        ->setBaseShippingInvoiced(0)
        ->setShippingInvoiced(0)
        ->setBaseDiscountInvoiced(0)
        ->setDiscountInvoiced(0);

I hope this will help, let me know once you tried my answer

1
  • Worked for me. Thanks :) Jun 20, 2019 at 7:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.