Files
2026-09-15 10:26:34 +08:00

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;
}
}