app/Plugin/PointExpired42/Event/OrderStateEvent.php line 49

Open in your IDE?
  1. <?php
  2. /*
  3. * Plugin Name : PointExpired
  4. *
  5. * Copyright (C) BraTech Co., Ltd. All Rights Reserved.
  6. * http://www.bratech.co.jp/
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Plugin\PointExpired42\Event;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Eccube\Entity\Master\OrderStatus;
  14. use Plugin\PointExpired42\Service\PointExpiredService;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\Workflow\Event\Event;
  17. class OrderStateEvent implements EventSubscriberInterface
  18. {
  19.     private $entityManager;
  20.     private $pointexpiredService;
  21.     public function __construct(
  22.             EntityManagerInterface $entityManager,
  23.             PointExpiredService $pointExpiredService
  24.             )
  25.     {
  26.         $this->entityManager $entityManager;
  27.         $this->pointexpiredService $pointExpiredService;
  28.     }
  29.     /**
  30.      * @return array
  31.      */
  32.     public static function getSubscribedEvents()
  33.     {
  34.         return [
  35.             'workflow.order.transition.cancel' => 'rollbackPeriod',
  36.             'workflow.order.transition.back_to_in_progress' => 'extendPeriod',
  37.             'workflow.order.transition.return' => 'rollbackPeriod',
  38.             'workflow.order.transition.cancel_return' => 'extendPeriod',
  39.             'workflow.order.transition.ship' => 'extendPeriod',
  40.                 ];
  41.     }
  42.     public function extendPeriod(Event $event)
  43.     {
  44.         $Order $event->getSubject()->getOrder();
  45.         $Customer $Order->getCustomer();
  46.         if ($Customer) {
  47.             $prevPeriod $Order->getExtensionPeriod();
  48.             if(is_null($prevPeriod)){
  49.                 $period $this->pointexpiredService->getExpiredPeriod($Customer);
  50.             }else{
  51.                 $period $prevPeriod;
  52.             }
  53.             if(!is_null($period)){
  54.                 $orderDate $Order->getOrderDate();
  55.                 if(is_null($orderDate))return;
  56.                 $date = clone($orderDate);
  57.                 $date->modify('+ '$period .' days');
  58.                 $expiredDate $Customer->getPointExpiredDate();
  59.                 if(is_null($prevPeriod)){
  60.                     $Order->setExtensionPeriod($period);
  61.                 }
  62.                 $this->entityManager->persist($Order);
  63.                 $this->entityManager->flush($Order);
  64.                 if($expiredDate instanceof \DateTime){
  65.                     if($date $expiredDate){
  66.                         $Order->setPrevPointExpiredDate($expiredDate)
  67.                               ->setExtensionFlag(true);
  68.                         $Customer->setPointExpiredDate($date);
  69.                     }
  70.                 }else{
  71.                     $Order->setPrevPointExpiredDate(null)
  72.                           ->setExtensionFlag(true);
  73.                     $Customer->setPointExpiredDate($date);
  74.                 }
  75.             }
  76.         }
  77.     }
  78.     public function rollbackPeriod(Event $event)
  79.     {
  80.         $Order $event->getSubject()->getOrder();
  81.         $Customer $Order->getCustomer();
  82.         $flag $Order->getExtensionFlag();
  83.         if ($Customer && $flag) {
  84.             $expiredDate $Order->getPrevPointExpiredDate();
  85.             $LatestOrder $this->getLatestOrder($Customer);
  86.             if(is_null($LatestOrder))return;
  87.             if($LatestOrder->getId() != $Order->getId() && $LatestOrder->getOrderDate() > $Order->getOrderDate())return;
  88.             if($expiredDate instanceof \DateTime || is_null($expiredDate)){
  89.                 $Customer->setPointExpiredDate($expiredDate);
  90.             }
  91.             $Order->setExtensionFlag(false);
  92.         }
  93.     }
  94.     private function getLatestOrder($Customer)
  95.     {
  96.         $excludes = [
  97.             OrderStatus::CANCEL,
  98.             OrderStatus::RETURNED,
  99.             OrderStatus::PENDING,
  100.             OrderStatus::PROCESSING
  101.         ];
  102.         $qb $this->entityManager->createQueryBuilder();
  103.         $qb
  104.             ->select('o')
  105.             ->from('Eccube\Entity\Order','o')
  106.             ->andWhere('o.order_date IS NOT NULL')
  107.             ->andwhere('o.Customer = :Customer')
  108.             ->andWhere('o.OrderStatus NOT IN (:excludes)')
  109.             ->setParameter(':Customer',$Customer)
  110.             ->setParameter(':excludes',$excludes)
  111.             ->orderBy('o.order_date''DESC')
  112.             ->setMaxResults(1);
  113.         $result $qb->getQuery()->getResult();
  114.         if($result){
  115.             return $result[0];
  116.         }
  117.         return null;
  118.     }
  119. }