app/Plugin/NZMailSystem42/Event.php line 124

Open in your IDE?
  1. <?php
  2. namespace Plugin\NZMailSystem42;
  3. use Eccube\Service\MailService;
  4. use Eccube\Repository\OrderRepository;
  5. use Eccube\Repository\BaseInfoRepository;
  6. use Eccube\Repository\MailHistoryRepository;
  7. use Eccube\Repository\MailTemplateRepository;
  8. use Eccube\Repository\PaymentRepository;
  9. use Eccube\Entity\MailHistory;
  10. use Eccube\Event\TemplateEvent;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\EventDispatcher\GenericEvent;
  14. use Twig\Environment;
  15. use Eccube\Common\EccubeConfig;
  16. use Symfony\Component\Mailer\MailerInterface;
  17. use Symfony\Component\Mime\Email;
  18. use Symfony\Component\Mime\Address;
  19. class Event implements EventSubscriberInterface
  20. {
  21.     private $mailService;
  22.     private $orderRepository;
  23.     private $baseInfoRepository;
  24.     private $mailHistoryRepository;
  25.     private $mailTemplateRepository;
  26.     private $paymentRepository;
  27.     private $entityManager;
  28.     private $twig;
  29.     private $eccubeConfig;
  30.     private $mailer;
  31.     public function __construct(
  32.         MailService $mailService,
  33.         OrderRepository $orderRepository,
  34.         BaseInfoRepository $baseInfoRepository,
  35.         MailHistoryRepository $mailHistoryRepository,
  36.         MailTemplateRepository $mailTemplateRepository,
  37.         PaymentRepository $paymentRepository,
  38.         EntityManagerInterface $entityManager,
  39.         Environment $twig,
  40.         EccubeConfig $eccubeConfig,
  41.         MailerInterface $mailer
  42.     ) {
  43.         $this->mailService $mailService;
  44.         $this->orderRepository $orderRepository;
  45.         $this->baseInfoRepository $baseInfoRepository;
  46.         $this->mailHistoryRepository $mailHistoryRepository;
  47.         $this->mailTemplateRepository $mailTemplateRepository;
  48.         $this->paymentRepository $paymentRepository;
  49.         $this->entityManager $entityManager;
  50.         $this->twig $twig;
  51.         $this->eccubeConfig $eccubeConfig;
  52.         $this->mailer $mailer;
  53.     }
  54.     public static function getSubscribedEvents()
  55.     {
  56.         return [
  57.             'nz.mail.payment.confirm' => 'onPaymentConfirm',
  58.             'nz.mail.payment.received' => 'onPaymentReceived',
  59.             'nz.mail.order.cancel' => 'onOrderCancel',
  60.             'nz.mail.payment.complete' => 'onPaymentComplete',
  61.             'nz.mail.test' => 'onTestMail',
  62.             '@admin/Order/index.twig' => 'onAdminOrderIndexTwig',
  63.         ];
  64.     }
  65.     /**
  66.      * 受注一覧画面にJavaScriptを注入
  67.      */
  68.     public function onAdminOrderIndexTwig(TemplateEvent $event)
  69.     {
  70.         // 全注文のメール送信履歴を取得
  71.         $mailHistories $this->getMailHistoriesForOrders();
  72.         
  73.         $event->setParameter('nz_mail_histories'$mailHistories);
  74.         $event->addSnippet('@NZMailSystem42/admin/order_list_buttons.twig');
  75.     }
  76.     
  77.     /**
  78.      * 注文ごとのメール送信履歴を取得
  79.      */
  80.     private function getMailHistoriesForOrders()
  81.     {
  82.         $qb $this->entityManager->createQueryBuilder();
  83.         $qb->select('IDENTITY(mh.Order) as order_id''mh.mail_subject')
  84.            ->from('Eccube\Entity\MailHistory''mh')
  85.            ->where('mh.mail_subject LIKE :received OR mh.mail_subject LIKE :cancel')
  86.            ->setParameter('received''%ご入金確認完了%')
  87.            ->setParameter('cancel''%キャンセル%');
  88.         
  89.         $results $qb->getQuery()->getResult();
  90.         
  91.         $histories = [];
  92.         foreach ($results as $row) {
  93.             $orderId $row['order_id'];
  94.             if (!isset($histories[$orderId])) {
  95.                 $histories[$orderId] = [
  96.                     'received' => false,
  97.                     'cancel' => false
  98.                 ];
  99.             }
  100.             
  101.             if (strpos($row['mail_subject'], 'ご入金確認完了') !== false) {
  102.                 $histories[$orderId]['received'] = true;
  103.             }
  104.             if (strpos($row['mail_subject'], 'キャンセル') !== false) {
  105.                 $histories[$orderId]['cancel'] = true;
  106.             }
  107.         }
  108.         
  109.         return $histories;
  110.     }
  111.     public function onPaymentConfirm(GenericEvent $event)
  112.     {
  113.         $Order $event->getArgument('Order');
  114.         $this->sendMail($Order'NZ決済確認メール');
  115.     }
  116.     public function onPaymentReceived(GenericEvent $event)
  117.     {
  118.         $Order $event->getArgument('Order');
  119.         $this->sendMail($Order'NZ入金確認済みメール');
  120.     }
  121.     public function onOrderCancel(GenericEvent $event)
  122.     {
  123.         $Order $event->getArgument('Order');
  124.         $this->sendMail($Order'NZキャンセルメール');
  125.     }
  126.     public function onPaymentComplete(GenericEvent $event)
  127.     {
  128.         $Order $event->getArgument('Order');
  129.         $this->sendMail($Order'NZ決済完了メール');
  130.     }
  131.     public function onTestMail(GenericEvent $event)
  132.     {
  133.         $Order $event->getArgument('Order');
  134.         $mailType $event->getArgument('mail_type');
  135.         
  136.         $templateNames = [
  137.             'payment_complete' => 'NZ決済完了メール',
  138.             'payment_confirm' => 'NZ決済確認メール',
  139.             'payment_received' => 'NZ入金確認済みメール',
  140.             'order_cancel' => 'NZキャンセルメール',
  141.         ];
  142.         
  143.         $templateName $templateNames[$mailType] ?? 'NZ決済完了メール';
  144.         $this->sendMail($Order$templateName);
  145.     }
  146.     private function sendMail($Order$templateName)
  147.     {
  148.         try {
  149.             $BaseInfo $this->baseInfoRepository->get();
  150.             $Customer $Order->getCustomer();
  151.             
  152.             // メールアドレスの取得(CustomerまたはOrder)
  153.             $email $Customer $Customer->getEmail() : $Order->getEmail();
  154.             
  155.             if (!$email) {
  156.                 throw new \Exception('メールアドレスが見つかりません');
  157.             }
  158.             
  159.             $MailTemplate $this->mailTemplateRepository->findOneBy(['name' => $templateName]);
  160.             
  161.             if (!$MailTemplate) {
  162.                 throw new \Exception("メールテンプレート '{$templateName}' が見つかりません");
  163.             }
  164.             
  165.             // Customerがnullの場合、ダミーオブジェクトを作成
  166.             if (!$Customer) {
  167.                 $Customer = new \stdClass();
  168.                 $Customer->name01 $Order->getName01();
  169.                 $Customer->name02 $Order->getName02();
  170.                 $Customer->email $Order->getEmail();
  171.             }
  172.             
  173.             $subject $this->twig->createTemplate($MailTemplate->getMailSubject())->render([
  174.                 'Order' => $Order,
  175.                 'Customer' => $Customer,
  176.                 'BaseInfo' => $BaseInfo,
  177.             ]);
  178.             
  179.             $body $this->twig->render($MailTemplate->getFileName(), [
  180.                 'Order' => $Order,
  181.                 'Customer' => $Customer,
  182.                 'BaseInfo' => $BaseInfo,
  183.             ]);
  184.             
  185.             $message = (new Email())
  186.                 ->from(new Address($BaseInfo->getEmail01(), $BaseInfo->getShopName()))
  187.                 ->to($email)
  188.                 ->bcc($BaseInfo->getEmail01())
  189.                 ->replyTo($BaseInfo->getEmail03())
  190.                 ->subject($subject)
  191.                 ->text($body);
  192.             
  193.             $this->mailer->send($message);
  194.             
  195.             $this->saveMailHistory($Order$subject$body);
  196.             
  197.             log_info('NZMailSystem42: メール送信完了', [
  198.                 'template' => $templateName,
  199.                 'order_id' => $Order->getId(),
  200.                 'order_no' => $Order->getOrderNo(),
  201.                 'email' => $email
  202.             ]);
  203.             
  204.         } catch (\Exception $e) {
  205.             log_error('NZMailSystem42: メール送信エラー', [
  206.                 'template' => $templateName,
  207.                 'order_id' => $Order->getId(),
  208.                 'error' => $e->getMessage()
  209.             ]);
  210.             throw $e;
  211.         }
  212.     }
  213.     private function saveMailHistory($Order$mailSubject$mailBody)
  214.     {
  215.         try {
  216.             $MailHistory = new MailHistory();
  217.             $MailHistory->setOrder($Order);
  218.             $MailHistory->setSendDate(new \DateTime());
  219.             $MailHistory->setMailSubject($mailSubject);
  220.             $MailHistory->setMailBody($mailBody);
  221.             
  222.             $this->entityManager->persist($MailHistory);
  223.             $this->entityManager->flush();
  224.             
  225.         } catch (\Exception $e) {
  226.             log_error('NZMailSystem42: メール履歴保存エラー', [
  227.                 'order_id' => $Order->getId(),
  228.                 'error' => $e->getMessage()
  229.             ]);
  230.         }
  231.     }
  232. }