EmailSender.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model\Order\Invoice\Sender;
  7. use Magento\Sales\Model\Order\Email\Sender;
  8. use Magento\Sales\Model\Order\Invoice\SenderInterface;
  9. use Magento\Framework\DataObject;
  10. /**
  11. * Email notification sender for Invoice.
  12. *
  13. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  14. */
  15. class EmailSender extends Sender implements SenderInterface
  16. {
  17. /**
  18. * @var \Magento\Payment\Helper\Data
  19. */
  20. private $paymentHelper;
  21. /**
  22. * @var \Magento\Sales\Model\ResourceModel\Order\Invoice
  23. */
  24. private $invoiceResource;
  25. /**
  26. * @var \Magento\Framework\App\Config\ScopeConfigInterface
  27. */
  28. private $globalConfig;
  29. /**
  30. * @var \Magento\Framework\Event\ManagerInterface
  31. */
  32. private $eventManager;
  33. /**
  34. * @param \Magento\Sales\Model\Order\Email\Container\Template $templateContainer
  35. * @param \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity $identityContainer
  36. * @param \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory
  37. * @param \Psr\Log\LoggerInterface $logger
  38. * @param \Magento\Sales\Model\Order\Address\Renderer $addressRenderer
  39. * @param \Magento\Payment\Helper\Data $paymentHelper
  40. * @param \Magento\Sales\Model\ResourceModel\Order\Invoice $invoiceResource
  41. * @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
  42. * @param \Magento\Framework\Event\ManagerInterface $eventManager
  43. */
  44. public function __construct(
  45. \Magento\Sales\Model\Order\Email\Container\Template $templateContainer,
  46. \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity $identityContainer,
  47. \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory,
  48. \Psr\Log\LoggerInterface $logger,
  49. \Magento\Sales\Model\Order\Address\Renderer $addressRenderer,
  50. \Magento\Payment\Helper\Data $paymentHelper,
  51. \Magento\Sales\Model\ResourceModel\Order\Invoice $invoiceResource,
  52. \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig,
  53. \Magento\Framework\Event\ManagerInterface $eventManager
  54. ) {
  55. parent::__construct(
  56. $templateContainer,
  57. $identityContainer,
  58. $senderBuilderFactory,
  59. $logger,
  60. $addressRenderer
  61. );
  62. $this->paymentHelper = $paymentHelper;
  63. $this->invoiceResource = $invoiceResource;
  64. $this->globalConfig = $globalConfig;
  65. $this->eventManager = $eventManager;
  66. }
  67. /**
  68. * Sends order invoice email to the customer.
  69. *
  70. * Email will be sent immediately in two cases:
  71. *
  72. * - if asynchronous email sending is disabled in global settings
  73. * - if $forceSyncMode parameter is set to TRUE
  74. *
  75. * Otherwise, email will be sent later during running of
  76. * corresponding cron job.
  77. *
  78. * @param \Magento\Sales\Api\Data\OrderInterface $order
  79. * @param \Magento\Sales\Api\Data\InvoiceInterface $invoice
  80. * @param \Magento\Sales\Api\Data\InvoiceCommentCreationInterface|null $comment
  81. * @param bool $forceSyncMode
  82. *
  83. * @return bool
  84. */
  85. public function send(
  86. \Magento\Sales\Api\Data\OrderInterface $order,
  87. \Magento\Sales\Api\Data\InvoiceInterface $invoice,
  88. \Magento\Sales\Api\Data\InvoiceCommentCreationInterface $comment = null,
  89. $forceSyncMode = false
  90. ) {
  91. $invoice->setSendEmail(true);
  92. if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
  93. $transport = [
  94. 'order' => $order,
  95. 'invoice' => $invoice,
  96. 'comment' => $comment ? $comment->getComment() : '',
  97. 'billing' => $order->getBillingAddress(),
  98. 'payment_html' => $this->getPaymentHtml($order),
  99. 'store' => $order->getStore(),
  100. 'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
  101. 'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
  102. ];
  103. $transportObject = new DataObject($transport);
  104. /**
  105. * Event argument `transport` is @deprecated. Use `transportObject` instead.
  106. */
  107. $this->eventManager->dispatch(
  108. 'email_invoice_set_template_vars_before',
  109. ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
  110. );
  111. $this->templateContainer->setTemplateVars($transportObject->getData());
  112. if ($this->checkAndSend($order)) {
  113. $invoice->setEmailSent(true);
  114. $this->invoiceResource->saveAttribute($invoice, ['send_email', 'email_sent']);
  115. return true;
  116. }
  117. } else {
  118. $invoice->setEmailSent(null);
  119. $this->invoiceResource->saveAttribute($invoice, 'email_sent');
  120. }
  121. $this->invoiceResource->saveAttribute($invoice, 'send_email');
  122. return false;
  123. }
  124. /**
  125. * Returns payment info block as HTML.
  126. *
  127. * @param \Magento\Sales\Api\Data\OrderInterface $order
  128. *
  129. * @return string
  130. */
  131. private function getPaymentHtml(\Magento\Sales\Api\Data\OrderInterface $order)
  132. {
  133. return $this->paymentHelper->getInfoBlockHtml(
  134. $order->getPayment(),
  135. $this->identityContainer->getStore()->getStoreId()
  136. );
  137. }
  138. }