210 lines
6.5 KiB
PHP
210 lines
6.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Stemcell\Sales\Model\Order\Email\Sender;
|
|
|
|
use Magento\Framework\Exception\FileSystemException;
|
|
use Magento\Framework\Exception\LocalizedException;
|
|
use Magento\Payment\Helper\Data as PaymentHelper;
|
|
use Magento\Sales\Model\Order;
|
|
use Magento\Sales\Model\Order\Email\Container\Template;
|
|
use Magento\Sales\Model\Order\Email\Sender;
|
|
use PhpOffice\PhpSpreadsheet\Exception;
|
|
use Stemcell\Customer\Api\Data\SalespersonInterface;
|
|
use Stemcell\Sales\Model\Order\Email\SenderBuilder;
|
|
use Stemcell\Sales\Model\Order\Email\SenderBuilderFactory;
|
|
use Magento\Sales\Model\ResourceModel\Order as OrderResource;
|
|
use Magento\Sales\Model\Order\Address\Renderer;
|
|
use Magento\Framework\Event\ManagerInterface;
|
|
use Magento\Framework\DataObject;
|
|
use Stemcell\Customer\Api\SalespersonRepositoryInterface;
|
|
use Stemcell\Sales\Model\Order\Email\Container\OrderIdentity;
|
|
|
|
/**
|
|
* Sends order email to the customer.
|
|
*
|
|
* @api
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class OrderSender extends Sender
|
|
{
|
|
|
|
/**
|
|
* @var Renderer
|
|
*/
|
|
protected $addressRenderer;
|
|
|
|
/**
|
|
* Application Event Dispatcher
|
|
*
|
|
* @var ManagerInterface
|
|
*/
|
|
protected ManagerInterface $eventManager;
|
|
private SalespersonRepositoryInterface $salespersonRepository;
|
|
private \Stemcell\Sales\Model\Order\Email\Attachment\Order $orderAttachment;
|
|
private string $file;
|
|
|
|
/**
|
|
* @var \Magento\Sales\Model\Order\Item[]
|
|
*/
|
|
protected array $orderItems = [];
|
|
|
|
protected SalespersonInterface $salesperson;
|
|
|
|
protected \Magento\Sales\Model\Order $order;
|
|
|
|
/**
|
|
* @param Template $templateContainer
|
|
* @param OrderIdentity $identityContainer
|
|
* @param SenderBuilderFactory $senderBuilderFactory
|
|
* @param \Psr\Log\LoggerInterface $logger
|
|
* @param Renderer $addressRenderer
|
|
* @param PaymentHelper $paymentHelper
|
|
* @param OrderResource $orderResource
|
|
* @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
|
|
* @param ManagerInterface $eventManager
|
|
*/
|
|
public function __construct(
|
|
Template $templateContainer,
|
|
OrderIdentity $identityContainer,
|
|
SenderBuilderFactory $senderBuilderFactory,
|
|
\Psr\Log\LoggerInterface $logger,
|
|
Renderer $addressRenderer,
|
|
SalespersonRepositoryInterface $salespersonRepository,
|
|
\Stemcell\Sales\Model\Order\Email\Attachment\Order $orderAttachment
|
|
) {
|
|
parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory, $logger, $addressRenderer);
|
|
$this->salespersonRepository = $salespersonRepository;
|
|
$this->orderAttachment = $orderAttachment;
|
|
}
|
|
|
|
/**
|
|
* inject $salesperson
|
|
* @param SalespersonInterface $salesperson
|
|
* @return $this
|
|
*/
|
|
public function setSalesperson(SalespersonInterface $salesperson): static
|
|
{
|
|
$this->salesperson = $salesperson;
|
|
return $this;
|
|
}
|
|
|
|
public function getSalesperson(): SalespersonInterface
|
|
{
|
|
return $this->salesperson;
|
|
}
|
|
/**
|
|
* inject $salesperson
|
|
* @param SalespersonInterface $salesperson
|
|
* @return $this
|
|
* @throws LocalizedException
|
|
*/
|
|
public function setOrderItems(array $orderItems): static
|
|
{
|
|
foreach ($orderItems as $item) {
|
|
if (!$item instanceof \Magento\Sales\Model\Order\Item) {
|
|
throw new LocalizedException(__('One of item in parameter orderItems array are not instance of \Magento\Sales\Model\Order\Item class'));
|
|
}
|
|
}
|
|
$this->orderItems = $orderItems;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return Order\Item[]
|
|
*/
|
|
public function getOrderItems(): array
|
|
{
|
|
return $this->orderItems;
|
|
}
|
|
/**
|
|
* @param Order $order
|
|
* @return bool
|
|
*/
|
|
protected function checkAndSend(Order $order): bool
|
|
{
|
|
$this->identityContainer->setStore($order->getStore());
|
|
|
|
// if (!$this->identityContainer->isEnabled()) {
|
|
// return false;
|
|
// }
|
|
|
|
$this->prepareTemplate($order);
|
|
|
|
/** @var SenderBuilder $sender */
|
|
$sender = $this->getSender();
|
|
try {
|
|
$sender->setAttachmentFile($this->orderAttachment->getFile($order, $this));
|
|
$sender->send();
|
|
} catch (\Exception $e) {
|
|
$this->logger->error($e->getMessage(), $e->getTrace());
|
|
return false;
|
|
}
|
|
// if ($this->identityContainer->getCopyMethod() == 'copy') {
|
|
// try {
|
|
// $sender->sendCopyTo();
|
|
// } catch (\Exception $e) {
|
|
// $this->logger->error($e->getMessage(), $e->getTrace());
|
|
// }
|
|
// }
|
|
return true;
|
|
}
|
|
|
|
public function send(Order $order)
|
|
{
|
|
$this->order = $order;
|
|
return $this->checkAndSend($order);
|
|
}
|
|
|
|
/**
|
|
* Prepare email template with variables
|
|
*
|
|
* @param Order $order
|
|
* @return void
|
|
*/
|
|
protected function prepareTemplate(Order $order)
|
|
{
|
|
try {
|
|
$transport = [
|
|
'order' => $order,
|
|
'orderItems' => $this->orderItems,
|
|
'salesperson' => $this->salesperson,
|
|
'order_id' => $order->getId(),
|
|
'file' => $this->file = $this->orderAttachment->getFile($order, $this),
|
|
'order_data' => [
|
|
'customer_name' => $order->getCustomerName(),
|
|
'is_not_virtual' => $order->getIsNotVirtual(),
|
|
'order_id' => $order->getId(),
|
|
'order_item' => $order->getAllVisibleItems(),
|
|
'frontend_status_label' => $order->getFrontendStatusLabel()
|
|
]
|
|
];
|
|
|
|
$this->identityContainer->setEmailCopyTo($this->getEmailCopyTo($order));
|
|
$this->templateContainer->setTemplateVars($transport);
|
|
|
|
parent::prepareTemplate($order);
|
|
} catch (FileSystemException | \PhpOffice\PhpSpreadsheet\Writer\Exception | Exception $e) {
|
|
$this->logger->critical($e->getMessage(), $e->getTrace());
|
|
}
|
|
|
|
}
|
|
|
|
protected function getEmailCopyTo(Order $order): array
|
|
{
|
|
$cc = [$order->getCustomerEmail()];
|
|
|
|
$fields = ['email', 'rsm_email', 'sisr_email', 'csr_email'];
|
|
foreach ($fields as $field) {
|
|
if ($email = $this->salesperson->getData($field)) {
|
|
$email = strval($email);
|
|
$email = trim($email, ',');
|
|
$temp = array_map('trim', explode(',', $email));
|
|
$cc = array_merge($cc, $temp);
|
|
}
|
|
}
|
|
return $cc;
|
|
}
|
|
}
|