magento 2 Programmatically create a credit memo by script [duplicate]
-
07-01-2021 - |
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.
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