app/Plugin/EccubePaymentLite4/EventListener/EventSubscriber/Front/Shopping/AddRegularCycleFormEventSubscriber.php line 72

Open in your IDE?
  1. <?php
  2. namespace Plugin\EccubePaymentLite4\EventListener\EventSubscriber\Front\Shopping;
  3. use Eccube\Common\EccubeConfig;
  4. use Eccube\Entity\Master\SaleType;
  5. use Eccube\Entity\Order;
  6. use Eccube\Entity\Shipping;
  7. use Eccube\Event\TemplateEvent;
  8. use Eccube\Service\Payment\Method\Cash;
  9. use Plugin\EccubePaymentLite4\Entity\Config;
  10. use Plugin\EccubePaymentLite4\Entity\RegularCycle;
  11. use Plugin\EccubePaymentLite4\Repository\ConfigRepository;
  12. use Plugin\EccubePaymentLite4\Repository\RegularCycleRepository;
  13. use Plugin\EccubePaymentLite4\Service\CalculateNextDeliveryDateService;
  14. use Plugin\EccubePaymentLite4\Service\IsRegularPaymentService;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\Form\FormView;
  17. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  18. class AddRegularCycleFormEventSubscriber implements EventSubscriberInterface
  19. {
  20.     /**
  21.      * @var EccubeConfig
  22.      */
  23.     protected $eccubeConfig;
  24.     /**
  25.      * @var IsRegularPaymentService
  26.      */
  27.     private $isRegularPaymentService;
  28.     /**
  29.      * @var ConfigRepository
  30.      */
  31.     private $configRepository;
  32.     /**
  33.      * @var SessionInterface
  34.      */
  35.     private $session;
  36.     /**
  37.      * @var RegularCycleRepository
  38.      */
  39.     private $regularCycleRepository;
  40.     /**
  41.      * @var CalculateNextDeliveryDateService
  42.      */
  43.     private $calculateNextDeliveryDateService;
  44.     public function __construct(
  45.         EccubeConfig $eccubeConfig,
  46.         IsRegularPaymentService $isRegularPaymentService,
  47.         ConfigRepository $configRepository,
  48.         SessionInterface $session,
  49.         RegularCycleRepository $regularCycleRepository,
  50.         CalculateNextDeliveryDateService $calculateNextDeliveryDateService
  51.     ) {
  52.         $this->eccubeConfig $eccubeConfig;
  53.         $this->isRegularPaymentService $isRegularPaymentService;
  54.         $this->configRepository $configRepository;
  55.         $this->session $session;
  56.         $this->regularCycleRepository $regularCycleRepository;
  57.         $this->calculateNextDeliveryDateService $calculateNextDeliveryDateService;
  58.     }
  59.     public static function getSubscribedEvents()
  60.     {
  61.         return [
  62.             'Shopping/index.twig' => 'index',
  63.             'Shopping/confirm.twig' => 'confirm',
  64.         ];
  65.     }
  66.     public function index(TemplateEvent $event)
  67.     {
  68.         /** @var Order $Order */
  69.         $Order $event->getParameter('Order');
  70.         /** @var SaleType $SaleType */
  71.         $SaleType $Order->getShippings()->first()->getDelivery()->getSaleType();
  72.         if ($SaleType->getName() !== '定期商品') {
  73.             return;
  74.         }
  75.         if (!$this->isRegularPaymentService->isRegularPayment($Order)) {
  76.             return;
  77.         }
  78.         $event->addSnippet('@EccubePaymentLite4/default/Shopping/regular_cycle_form.twig');
  79.     }
  80.     public function confirm(TemplateEvent $event)
  81.     {
  82.         /** @var Order $Order */
  83.         $Order $event->getParameter('Order');
  84.         /** @var FormView $form */
  85.         $form $event->getParameter('form');
  86.         /** @var SaleType $SaleType */
  87.         $SaleType $Order->getShippings()->first()->getDelivery()->getSaleType();
  88.         if ($SaleType->getName() !== '定期商品') {
  89.             return;
  90.         }
  91.         if (!$this->isRegularPaymentService->isRegularPayment($Order)) {
  92.             return;
  93.         }
  94.         /** @var Config $Config */
  95.         $Config $this->configRepository->find(1);
  96.         /** @var Shipping $Shipping */
  97.         $Shipping $Order->getShippings()->first();
  98.         if (is_null($Shipping->getShippingDeliveryDate())) {
  99.             $addDay $Config->getFirstDeliveryDays();
  100.             $firstDeliveryDate = new \DateTime('+'.$Config->getFirstDeliveryDays().' day');
  101.         } else {
  102.             $firstDeliveryDate $Shipping->getShippingDeliveryDate();
  103.             $addDay $this->getDiffShippingDeliveryDate($firstDeliveryDate);
  104.         }
  105.         /** @var RegularCycle $RegularCycle */
  106.         $RegularCycle $this
  107.             ->regularCycleRepository
  108.             ->find($this->session->get('regular_cycle_id'));
  109.         $nextDeliveryDate $this
  110.             ->calculateNextDeliveryDateService
  111.             ->calc($RegularCycle$addDay);
  112.         $nextDate $nextDeliveryDate;
  113.         // get list delivery date
  114.         $nextOrderDate = [];
  115.         $nextOrderDate[0] = clone $firstDeliveryDate;
  116.         $nextOrderDate[1] = clone $nextDeliveryDate;
  117.         $limitCycle 4;
  118.         for ($i 2$i <= $limitCycle$i++) {
  119.             $nextDeliveryDate $this->calculateNextDeliveryDateService->calc_delivery($RegularCycle, clone $nextDeliveryDate);
  120.             $nextOrderDate[$i] = $nextDeliveryDate;
  121.         }
  122.         $firstDay $Config->getFirstDeliveryDays();
  123.         $deadlineDay $Config->getRegularOrderDeadline();
  124.         // payment is 代金引換
  125.         $isCashPayment false;
  126.         if (!is_null($Order->getPayment())
  127.             && $Order->getPayment()->getMethodClass() === Cash::class) {
  128.             $isCashPayment true;
  129.         }
  130.         // Get list product item
  131.         $ProductItems $Order->getProductOrderItems();
  132.         $event->setParameter('ProductItems'$ProductItems);
  133.         $event->setParameter('limitCycle'5);
  134.         $event->setParameter('isCashPayment'$isCashPayment);
  135.         $event->setParameter('firstDay'$firstDay);
  136.         $event->setParameter('deadlineDay'$deadlineDay);
  137.         $event->setParameter('nextOrderDate'$nextOrderDate);
  138.         $event->setParameter('label'$form->children['RegularCycles']->vars['data']);
  139.         $event->setParameter('firstDeliveryDate'$firstDeliveryDate);
  140.         $event->setParameter('nextDeliveryDate'$nextDate);
  141.         $event->addSnippet('@EccubePaymentLite4/default/Shopping/regular_cycle_confirm_form.twig');
  142.     }
  143.     private function getDiffShippingDeliveryDate(\DateTime $shippingDeliveryDate): int
  144.     {
  145.         $today = new \DateTime('today');
  146.         $interval $today->diff($shippingDeliveryDate);
  147.         return (int) $interval->format('%a');
  148.     }
  149. }