Вопрос

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.

Это было полезно?

Решение

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.

Другие советы

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top