<?php
namespace Plugin\NZMailSystem42;
use Eccube\Service\MailService;
use Eccube\Repository\OrderRepository;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\MailHistoryRepository;
use Eccube\Repository\MailTemplateRepository;
use Eccube\Repository\PaymentRepository;
use Eccube\Entity\MailHistory;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use Twig\Environment;
use Eccube\Common\EccubeConfig;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
class Event implements EventSubscriberInterface
{
private $mailService;
private $orderRepository;
private $baseInfoRepository;
private $mailHistoryRepository;
private $mailTemplateRepository;
private $paymentRepository;
private $entityManager;
private $twig;
private $eccubeConfig;
private $mailer;
public function __construct(
MailService $mailService,
OrderRepository $orderRepository,
BaseInfoRepository $baseInfoRepository,
MailHistoryRepository $mailHistoryRepository,
MailTemplateRepository $mailTemplateRepository,
PaymentRepository $paymentRepository,
EntityManagerInterface $entityManager,
Environment $twig,
EccubeConfig $eccubeConfig,
MailerInterface $mailer
) {
$this->mailService = $mailService;
$this->orderRepository = $orderRepository;
$this->baseInfoRepository = $baseInfoRepository;
$this->mailHistoryRepository = $mailHistoryRepository;
$this->mailTemplateRepository = $mailTemplateRepository;
$this->paymentRepository = $paymentRepository;
$this->entityManager = $entityManager;
$this->twig = $twig;
$this->eccubeConfig = $eccubeConfig;
$this->mailer = $mailer;
}
public static function getSubscribedEvents()
{
return [
'nz.mail.payment.confirm' => 'onPaymentConfirm',
'nz.mail.payment.received' => 'onPaymentReceived',
'nz.mail.order.cancel' => 'onOrderCancel',
'nz.mail.payment.complete' => 'onPaymentComplete',
'nz.mail.test' => 'onTestMail',
];
}
public function onPaymentConfirm(GenericEvent $event)
{
$Order = $event->getArgument('Order');
$this->sendMail($Order, 'NZ決済確認メール');
}
public function onPaymentReceived(GenericEvent $event)
{
$Order = $event->getArgument('Order');
$this->sendMail($Order, 'NZ入金確認済みメール');
}
public function onOrderCancel(GenericEvent $event)
{
$Order = $event->getArgument('Order');
$this->sendMail($Order, 'NZキャンセルメール');
}
public function onPaymentComplete(GenericEvent $event)
{
$Order = $event->getArgument('Order');
$this->sendMail($Order, 'NZ決済完了メール');
}
public function onTestMail(GenericEvent $event)
{
$Order = $event->getArgument('Order');
$mailType = $event->getArgument('mail_type');
$templateNames = [
'payment_complete' => 'NZ決済完了メール',
'payment_confirm' => 'NZ決済確認メール',
'payment_received' => 'NZ入金確認済みメール',
'order_cancel' => 'NZキャンセルメール',
];
$templateName = $templateNames[$mailType] ?? 'NZ決済完了メール';
$this->sendMail($Order, $templateName);
}
private function sendMail($Order, $templateName)
{
try {
$BaseInfo = $this->baseInfoRepository->get();
$Customer = $Order->getCustomer();
$MailTemplate = $this->mailTemplateRepository->findOneBy(['name' => $templateName]);
if (!$MailTemplate) {
throw new \Exception("メールテンプレート '{$templateName}' が見つかりません");
}
$subject = $this->twig->createTemplate($MailTemplate->getMailSubject())->render([
'Order' => $Order,
'Customer' => $Customer,
'BaseInfo' => $BaseInfo,
]);
$body = $this->twig->render($MailTemplate->getFileName(), [
'Order' => $Order,
'Customer' => $Customer,
'BaseInfo' => $BaseInfo,
]);
$message = (new Email())
->from(new Address($BaseInfo->getEmail01(), $BaseInfo->getShopName()))
->to($Customer->getEmail())
->bcc($BaseInfo->getEmail01())
->replyTo($BaseInfo->getEmail03())
->subject($subject)
->text($body);
$this->mailer->send($message);
$this->saveMailHistory($Order, $subject, $body);
log_info('NZMailSystem42: メール送信完了', [
'template' => $templateName,
'order_id' => $Order->getId(),
'order_no' => $Order->getOrderNo(),
'customer_email' => $Customer->getEmail()
]);
} catch (\Exception $e) {
log_error('NZMailSystem42: メール送信エラー', [
'template' => $templateName,
'order_id' => $Order->getId(),
'error' => $e->getMessage()
]);
throw $e;
}
}
private function saveMailHistory($Order, $mailSubject, $mailBody)
{
try {
$MailHistory = new MailHistory();
$MailHistory->setOrder($Order);
$MailHistory->setSendDate(new \DateTime());
$MailHistory->setMailSubject($mailSubject);
$MailHistory->setMailBody($mailBody);
$this->entityManager->persist($MailHistory);
$this->entityManager->flush();
} catch (\Exception $e) {
log_error('NZMailSystem42: メール履歴保存エラー', [
'order_id' => $Order->getId(),
'error' => $e->getMessage()
]);
}
}
}