0

Is there an API call or cart/quote setting I can use to turn off customer notifications just for the order confirmation?

I create order using this api
Method:PUT
url: http://localhost/testproject/rest/V1/carts/{cart_id or quote_id}/order

asked Aug 19, 2020 at 9:26

1 Answer 1

0

Disable the order confirmation email from the Magento Admin and send an email programmatically for website only:

Stores > Configuration > Sales > Sales Email > Order > Enabled = No

app/code/VendorName/ModuleName/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
 <module name="VendorName_ModuleName" setup_version="1.0.0">
 <sequence>
 <module name="Magento_Checkout" />
 </sequence>
 </module>
</config>

app/code/VendorName/ModuleName/etc/frontend/events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
 <event name="checkout_onepage_controller_success_action">
 <observer name="checkout_onepage_controller_success_action_sendmail" instance="VendorName\ModuleName\Observer\SendMailOnOrderSuccess" />
 </event>
</config>

app/code/VendorName/ModuleName/Observer/SendMailOnOrderSuccess.php

<?php
namespace VendorName\ModuleName\Observer;
use Magento\Framework\Event\ObserverInterface;
class SendMailOnOrderSuccess implements ObserverInterface
{
 /**
 * @var \Magento\Sales\Model\OrderFactory
 */
 protected $orderModel;
 /**
 * @var \Magento\Sales\Model\Order\Email\Sender\OrderSender
 */
 protected $orderSender;
 /**
 * @var \Magento\Checkout\Model\Session $checkoutSession
 */
 protected $checkoutSession;
 /**
 * @param \Magento\Sales\Model\OrderFactory $orderModel
 * @param \Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender
 * @param \Magento\Checkout\Model\Session $checkoutSession
 *
 * @codeCoverageIgnore
 */
 public function __construct(
 \Magento\Sales\Model\OrderFactory $orderModel,
 \Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender,
 \Magento\Checkout\Model\Session $checkoutSession
 )
 {
 $this->orderModel = $orderModel;
 $this->orderSender = $orderSender;
 $this->checkoutSession = $checkoutSession;
 }
 /**
 * @param \Magento\Framework\Event\Observer $observer
 * @return void
 */
 public function execute(\Magento\Framework\Event\Observer $observer)
 {
 $orderIds = $observer->getEvent()->getOrderIds();
 if (count($orderIds)) {
 $this->checkoutSession->setForceOrderMailSentOnSuccess(true);
 $order = $this->orderModel->create()->load($orderIds[0]);
 $this->orderSender->send($order, true);
 }
 return $this;
 }
}

app/code/VendorName/ModuleName/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
 <type name="Magento\Sales\Model\Order\Email\Container\OrderIdentity">
 <plugin name="enable_method" type="VendorName\ModuleName\Plugin\Sales\Order\Email\Container\OrderIdentityPlugin"/>
 </type>
</config>

app/code/VendorName/ModuleName/Plugin/Sales/Order/Order/Email/Container/OrderIdentityPlugin.php

<?php
namespace VendorName\ModuleName\Plugin\Sales\Order\Email\Container;
class OrderIdentityPlugin
{
 /**
 * @var \Magento\Checkout\Model\Session $checkoutSession
 */
 protected $checkoutSession;
 /**
 * @param \Magento\Checkout\Model\Session $checkoutSession
 *
 * @codeCoverageIgnore
 */
 public function __construct(
 \Magento\Checkout\Model\Session $checkoutSession
 ) {
 $this->checkoutSession = $checkoutSession;
 }
 /**
 * @param \Magento\Sales\Model\Order\Email\Container\OrderIdentity $subject
 * @param callable $proceed
 * @return bool
 */
 public function aroundIsEnabled(\Magento\Sales\Model\Order\Email\Container\OrderIdentity $subject, callable $proceed)
 {
 $returnValue = $proceed();
 $forceOrderMailSentOnSuccess = $this->checkoutSession->getForceOrderMailSentOnSuccess();
 if (isset($forceOrderMailSentOnSuccess) && $forceOrderMailSentOnSuccess) {
 if ($returnValue) {
 $returnValue = false;
 } else {
 $returnValue = true;
 }
 $this->checkoutSession->unsForceOrderMailSentOnSuccess();
 }
 return $returnValue;
 }
}
answered Aug 23, 2020 at 9:27
6
  • I want to disable order confirmation from api side not website side. Commented Aug 23, 2020 at 15:18
  • Please implement above code once and place order using API. Commented Aug 23, 2020 at 15:26
  • after follow this steps not sending emails of website orders.Please suggest how to send emails in website. Commented Aug 31, 2020 at 6:06
  • Try above updated code. Commented Aug 31, 2020 at 8:41
  • I try updated code but not getting any email. I recieved other emails like customer registration but not getting order confirmation email in website.Please check Commented Aug 31, 2020 at 10:39

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.