magento 2 Programmatically create a credit memo by script [duplicate]
-
07-01-2021 - |
Question
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.
La solution
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.
Autres conseils
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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange