3

I need to add a custom variable based on payment method to credit memo email.

I captured the event email_creditmemo_set_template_vars_before in my custom module, Which was dispatched on Magento\Sales\Model\Order\Creditmemo\Sender\EmailSender.php.

I need to add my custom variable showrefund to bellow set.

$transport = [ 'order' => $order, 'creditmemo' => $creditmemo, 'comment' => $comment ? $comment->getComment() : '', 'billing' => $order->getBillingAddress(), 'payment_html' => $this->getPaymentHtml($order), 'store' => $order->getStore(), 'formattedShippingAddress' => $this->getFormattedShippingAddress($order), 'formattedBillingAddress' => $this->getFormattedBillingAddress($order), 'order_data' => [ 'customer_name' => $order->getCustomerName(), 'is_not_virtual' => $order->getIsNotVirtual(), 'email_customer_note' => $order->getEmailCustomerNote(), 'frontend_status_label' => $order->getFrontendStatusLabel() ] ]; 

I added the following code in my observer file.

public function execute(\Magento\Framework\Event\Observer $observer) { $transport = $observer->getEvent()->getTransport(); $order = $transport['order']; $orderId = $order->getEntityId(); $orderStatus = $order->getState(); $payment = $order->getPayment(); $method = $payment->getMethodInstance(); $methodTitle = $method->getTitle(); if($methodTitle == "Cash On Delivery"){ $showRefundAmmount = "0"; }else{ $showRefundAmmount = "1"; } $transport['showrefund'] = $showRefundAmmount; return $transport; } 

This way the additional attribute is not working. I tried below way in the same file

$transportObject = new DataObject($transport); $this->templateContainer->setTemplateVars($transportObject->getData()); 

This part also not doing the trick.

How can i add this custom variable to the email template. Can anyone help me in this question.

1 Answer 1

1

I managed to fixed this issue. Actually the creditmemo email was sending using this file Magento\Sales\Model\Order\Email\Sender\CreditmemoSender.php

not by
Magento\Sales\Model\Order\Creditmemo\Sender\EmailSender.php.

If i tried to set the template var using event observer, its not working fine. So i decided to override the Magento\Sales\Model\Order\Email\Sender\CreditmemoSender.php.

For this i use a custom module. Added the preference in di.xml file.

<?xml version="1.0" ?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Sales\Model\Order\Email\Sender\CreditmemoSender" type="Vendor\Module\Model\Rewrite\Order\Email\Sender\CreditmemoSender" /> </config> 

and create the CreditmemoSender.php file under Vendor\Module\Model\Rewrite\Order\Email\Sender\ path.

<?php namespace Vendor\Module\Model\Rewrite\Order\Email\Sender; use Magento\Payment\Helper\Data as PaymentHelper; use Magento\Sales\Model\Order; use Magento\Sales\Model\Order\Creditmemo; use Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity; use Magento\Sales\Model\Order\Email\Container\Template; use Magento\Sales\Model\Order\Email\Sender; use Magento\Sales\Model\ResourceModel\Order\Creditmemo as CreditmemoResource; use Magento\Sales\Model\Order\Address\Renderer; use Magento\Framework\Event\ManagerInterface; use Magento\Framework\DataObject; class CreditmemoSender extends \Magento\Sales\Model\Order\Email\Sender\CreditmemoSender{ public function send(Creditmemo $creditmemo, $forceSyncMode = false) { $creditmemo->setSendEmail($this->identityContainer->isEnabled()); if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) { $order = $creditmemo->getOrder(); $orderId = $order->getEntityId(); $orderStatus = $order->getState(); $payment = $order->getPayment(); if($payment->getMethod() == "cashondelivery" && !$order->hasShipments()){ $showRefundAmmount = ""; }elseif($payment->getMethod() != "cashondelivery"){ $showRefundAmmount = "1"; }elseif($payment->getMethod() == "cashondelivery" && $order->hasShipments()){ $showRefundAmmount = "1"; } $transport['showrefund'] = $showRefundAmmount; $this->identityContainer->setStore($order->getStore()); $transport = [ 'order' => $order, 'order_id' => $order->getId(), 'creditmemo' => $creditmemo, 'creditmemo_id' => $creditmemo->getId(), 'comment' => $creditmemo->getCustomerNoteNotify() ? $creditmemo->getCustomerNote() : '', 'billing' => $order->getBillingAddress(), 'payment_html' => $this->getPaymentHtml($order), 'store' => $order->getStore(), 'formattedShippingAddress' => $this->getFormattedShippingAddress($order), 'formattedBillingAddress' => $this->getFormattedBillingAddress($order), 'order_data' => [ 'customer_name' => $order->getCustomerName(), 'is_not_virtual' => $order->getIsNotVirtual(), 'email_customer_note' => $order->getEmailCustomerNote(), 'frontend_status_label' => $order->getFrontendStatusLabel() ], 'showrefund' => $showRefundAmmount ]; $transportObject = new DataObject($transport); /** * Event argument `transport` is @deprecated. Use `transportObject` instead. */ $this->eventManager->dispatch( 'email_creditmemo_set_template_vars_before', ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject] ); $this->templateContainer->setTemplateVars($transportObject->getData()); if ($this->checkAndSend($order)) { $creditmemo->setEmailSent(true); $this->creditmemoResource->saveAttribute($creditmemo, ['send_email', 'email_sent']); return true; } } else { $creditmemo->setEmailSent(null); $this->creditmemoResource->saveAttribute($creditmemo, 'email_sent'); } $this->creditmemoResource->saveAttribute($creditmemo, 'send_email'); return false; } } 

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.