<?php
namespace Plugin\NZOrderLink42\EventSubscriber;
use Eccube\Entity\Customer;
use Eccube\Entity\Order;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Repository\OrderRepository;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class OrderLinkSubscriber implements EventSubscriberInterface
{
/**
* @var OrderRepository
*/
private $orderRepository;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(
OrderRepository $orderRepository,
EntityManagerInterface $entityManager,
LoggerInterface $logger
) {
$this->orderRepository = $orderRepository;
$this->entityManager = $entityManager;
$this->logger = $logger;
}
public static function getSubscribedEvents()
{
return [
EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE => 'onEntryComplete',
];
}
/**
* 会員登録完了時に同じメールアドレスの非会員注文を紐付け
*/
public function onEntryComplete(EventArgs $event)
{
/** @var Customer $customer */
$customer = $event->getArgument('Customer');
if (!$customer || !$customer->getEmail()) {
return;
}
$email = $customer->getEmail();
// 同じメールアドレスの非会員注文を取得
$qb = $this->orderRepository->createQueryBuilder('o');
$orders = $qb
->where('o.email = :email')
->andWhere('o.Customer IS NULL')
->setParameter('email', $email)
->getQuery()
->getResult();
if (empty($orders)) {
$this->logger->info('[NZOrderLink42] 紐付け対象の注文なし', [
'customer_id' => $customer->getId(),
'email' => $email,
]);
return;
}
$linkedCount = 0;
/** @var Order $order */
foreach ($orders as $order) {
$order->setCustomer($customer);
$linkedCount++;
$this->logger->info('[NZOrderLink42] 注文を会員に紐付け', [
'order_id' => $order->getId(),
'order_no' => $order->getOrderNo(),
'customer_id' => $customer->getId(),
]);
}
$this->entityManager->flush();
$this->logger->info('[NZOrderLink42] 紐付け完了', [
'customer_id' => $customer->getId(),
'email' => $email,
'linked_count' => $linkedCount,
]);
}
}