Pregunta

Given an order that has been invoiced (by cash on delivery for testing) and is in state "processing", how can I create a credit memo? in code that is outside of Magento routing

EDIT:

I have found many solutions for creating a credit memo. But I want to create a credit memo from the root of Magento.

¿Fue útil?

Solución

Here is the script for creating credit memo from Magento root

Create createcreditmemo.php at the root of magento

use \Magento\Framework\App\Bootstrap;

include('app/bootstrap.php');

$bootstrap = Bootstrap::create(BP, $_SERVER);

$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$orderInterface = $objectManager->get('\Magento\Sales\Api\Data\OrderInterface');

//Use this if you have orderId
//$orderId = "100"; //Order Id
//$order = $orderInterface->load($orderId);

$incrementId = "000000214"; //Increment Id
$order = $objectManager->create('Magento\Sales\Model\Order')
        ->loadByAttribute('increment_id', $incrementId);
$invoice = $objectManager->create('Magento\Sales\Model\Order\Invoice');
$creditMemoFacory = $objectManager->create('Magento\Sales\Model\Order\CreditmemoFactory');
$creditmemoService = $objectManager->create('Magento\Sales\Model\Service\CreditmemoService');

try {
    $invoices = $order->getInvoiceCollection();
    foreach ($invoices as $invoice) {
        $invoiceincrementid = $invoice->getIncrementId();
    }

    $invoiceobj = $invoice->loadByIncrementId($invoiceincrementid);
    $creditmemo = $creditMemoFacory->createByOrder($order);

    // Don't set invoice if you want to do offline refund
    $creditmemo->setInvoice($invoiceobj);

    $creditmemoService->refund($creditmemo); 

    echo "CreditMemo Succesfully Created For Order: ".$incrementId;
} catch (\Exception $e) {
   echo "Creditmemo Not Created". $e->getMessage();
}

Change order increment id or order id as per your requirement. And run this script at the root of Magento to create creditmemo.

Otros consejos

Your Can Creaditmemo Using Below code.

protected $refundOrder;

public function __construct(
     \Magento\Sales\Model\RefundOrder $refundOrder,
     \Magento\Sales\Model\Order\Creditmemo\ItemCreationFactory $itemCreationFactory
){
     $this->refundOrder = $refundOrder;
     $this->itemCreationFactory = $itemCreationFactory;
}

public function creaditMemo($itemId, $qty, $orderId) {

        try {
            $creditmemoItem = $this->itemCreationFactory->create();
            $creditmemoItem->setQty($qty)->setOrderItemId($itemId);
            $itemIdsToRefund[] = $creditmemoItem;
            $this->refundOrder->execute($orderId, $itemIdsToRefund);
        } catch (\Exception $ex) {
            throw $ex;
        }
    }

Pass Your Item Id, Qty of CreaditMemo for that item & OrderId.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top