app/Plugin/ProductReserve42/Event.php line 326

Open in your IDE?
  1. <?php
  2. namespace Plugin\ProductReserve42;
  3. use Carbon\Carbon;
  4. use Eccube\Entity\Order;
  5. use Eccube\Entity\Product;
  6. use Eccube\Event\EccubeEvents;
  7. use Eccube\Event\EventArgs;
  8. use Eccube\Event\TemplateEvent;
  9. use Eccube\Repository\Master\OrderStatusRepository;
  10. use Eccube\Repository\OrderRepository;
  11. use Eccube\Repository\ProductRepository;
  12. use Eccube\Request\Context;
  13. use Eccube\Common\EccubeConfig;
  14. use Eccube\Controller\ProductController;
  15. use Plugin\ProductReserve42\Repository\ProductClassExtraRepository;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  18. use Symfony\Component\DomCrawler\Crawler;
  19. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  20. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  21. use Symfony\Component\HttpKernel\KernelEvents;
  22. use Symfony\Component\Form\Extension\Core\Type\TextType;
  23. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  24. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use Plugin\ProductReserve42\Repository\ConfigRepository;
  27. use Plugin\ProductReserve42\Repository\ProductExtraRepository;
  28. use Plugin\ProductReserve42\Service\ProductReserveService;
  29. class Event implements EventSubscriberInterface
  30. {
  31.     private $context;
  32.     /**
  33.      * @var ConfigRepository
  34.      */
  35.     private $configRepository;
  36.     /**
  37.      * @var ProductExtraRepository
  38.      */
  39.     private $productExtraRepository;
  40.     /**
  41.      * @var ProductClassExtraRepository
  42.      */
  43.     private $productClassExtraRepository;
  44.     /**
  45.      * @var ProductRepository
  46.      */
  47.     private $productRepository;
  48.     /**
  49.      * @var OrderRepository
  50.      */
  51.     private $orderRepository;
  52.     /**
  53.      * @var ProductReserveService
  54.      */
  55.     private $reserveService;
  56.     /**
  57.      * @var EccubeConfig
  58.      */
  59.     protected $eccubeConfig;
  60.     const PRIORITY_CONFIG __DIR__ "/Resource/priority.config";
  61.     public function __construct(
  62.         Context $context,
  63.         ConfigRepository $configRepository,
  64.         ProductExtraRepository $productExtraRepository,
  65.         ProductClassExtraRepository $productClassExtraRepository,
  66.         OrderRepository $orderRepository,
  67.         ProductRepository $productRepository,
  68.         ProductReserveService $reserveService,
  69.         EccubeConfig $eccubeConfig
  70.     )
  71.     {
  72.         $this->context $context;
  73.         $this->configRepository $configRepository;
  74.         $this->productExtraRepository $productExtraRepository;
  75.         $this->productClassExtraRepository $productClassExtraRepository;
  76.         $this->productRepository $productRepository;
  77.         $this->orderRepository $orderRepository;
  78.         $this->reserveService $reserveService;
  79.         $this->eccubeConfig $eccubeConfig;
  80.     }
  81.     /**
  82.      * @return array
  83.      */
  84.     public static function getSubscribedEvents()
  85.     {
  86.         if (\is_file(self::PRIORITY_CONFIG)) {
  87.             $content \file_get_contents(self::PRIORITY_CONFIG);
  88.             $priority = ($content == "on") ? -0;
  89.         } else {
  90.             $priority 0;
  91.         }
  92.         return [
  93.             'Product/detail.twig' => 'onProductDetailView',
  94.             'Product/list.twig' => 'onProductListView',
  95.             'Shopping/index.twig' => 'onShopping',
  96.             'Shopping/confirm.twig' => 'onShoppingConfirm',
  97.             '@admin/Product/product.twig' => 'onAdminProductEditView',
  98.             '@admin/Product/product_class.twig' => 'onAdminProductClassEditView',
  99.             EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'onAdminProductEditComplete',
  100.             EccubeEvents::FRONT_PRODUCT_CART_ADD_COMPLETE => 'onFrontProductCarTAddComplete',
  101.             EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE => ['onFrontShoppingCompleteInitialize'$priority],
  102.             EccubeEvents::MAIL_ORDER => 'onMailOrder',
  103. //            KernelEvents::CONTROLLER => ['onController', 1],
  104.         ];
  105.     }
  106.     /**
  107.      * @param TemplateEvent $event
  108.      */
  109.     public function onProductDetailView(TemplateEvent $event) {
  110.         $twig '@ProductReserve42/default/Product/product_detail.twig';
  111.         $event->addSnippet($twig);
  112.         $parameters $event->getParameters();
  113.         $product_id $parameters['Product']->getId();
  114.         $extra $this->productExtraRepository->get($product_id);
  115.         $product_reserve_status $this->reserveService->getProductReserveStatus($extra);
  116.         $parameters['productreserve4_reserve_status'] = $product_reserve_status;
  117.         $parameters['productreserve4_has_class_detail'] = false;
  118.         if( $product_reserve_status != ProductReserveService::STATUS_NORMAL ) {
  119.             $shippingDate $extra->getShippingDate()? $extra->getShippingDate()->format('Y年n月j日 H:i'):trans('plugin_reserve4.admin.no_shipping_date');
  120.             $startDate $extra->getStartDate()? $extra->getStartDate()->format('Y年n月j日 H:i'):false;
  121.             $endDate $extra->getEndDate()? $extra->getEndDate()->format('Y年n月j日 H:i'):false;
  122.             $product_reserve = [
  123.                 'product_id' => $extra->getProductId(),
  124.                 'product_reserve_status' => $product_reserve_status,
  125.                 'shipping_date' => $shippingDate,
  126.                 'start_date' => $startDate,
  127.                 'end_date' => $endDate,
  128.             ];
  129.             $parameters['productreserve4_detail'] = $product_reserve;
  130.         } else {
  131.             $productClassExtras $this->productClassExtraRepository->findBy(['Product' => $product_id]);
  132.             $classList = [];
  133.             foreach ($productClassExtras as $classExtra) {
  134.                 $product_reserve_status $this->reserveService->getProductClassReserveStatus($classExtra);
  135.                 if ($product_reserve_status != ProductReserveService::STATUS_NORMAL) {
  136.                     $shippingDate $classExtra->getShippingDate() ? $classExtra->getShippingDate()->format('Y年n月j日 H:i') : trans('plugin_reserve4.admin.no_shipping_date');
  137.                     $startDate $classExtra->getStartDate() ? $classExtra->getStartDate()->format('Y年n月j日 H:i') : false;
  138.                     $endDate $classExtra->getEndDate() ? $classExtra->getEndDate()->format('Y年n月j日 H:i') : false;
  139.                     $classList[] = [
  140.                         'product_id' => $classExtra->getProduct()->getId(),
  141.                         'product_class_id' => $classExtra->getProductClass()->getId(),
  142.                         'product_class_category_id1' => $classExtra->getClassCategory1()->getId(),
  143.                         'product_class_category_id2' => $classExtra->getClassCategory2()?$classExtra->getClassCategory2()->getId():0,
  144.                         'product_reserve_status' => $product_reserve_status,
  145.                         'shipping_date' => $shippingDate,
  146.                         'start_date' => $startDate,
  147.                         'end_date' => $endDate,
  148.                     ];
  149.                 }
  150.             }
  151.             if($classList !== []){
  152.                 $parameters['product_id'] = $product_id;
  153.                 $parameters['productreserve4_class_detail'] = $classList;
  154.                 $parameters['productreserve4_has_class_detail'] = true;
  155.             }
  156.         }
  157.         $event->setParameters($parameters);
  158.     }
  159.     /**
  160.      * @param TemplateEvent $event
  161.      */
  162.     public function onProductListView(TemplateEvent $event) {
  163.         $twig '@ProductReserve42/default/Product/product_list.twig';
  164.         $event->addSnippet($twig);
  165.         $parameters $event->getParameters();
  166.         $pagination $parameters['pagination'];
  167.         $product_ids = [];
  168.         foreach($pagination as $product) {
  169.             $product_ids[] = $product->getId();
  170.         }
  171.         $results $this->reserveService->getProductExtrList($product_ids);
  172.         $list = [];
  173.         $classList = [];
  174.         foreach($results['ProductExtras'] as $extra) {
  175.             $product_reserve_status $this->reserveService->getProductReserveStatus($extra);
  176.             if( $product_reserve_status != ProductReserveService::STATUS_NORMAL ) {
  177.                 $shippingDate $extra->getShippingDate()? $extra->getShippingDate()->format('Y年n月j日 H:i'):trans('plugin_reserve4.admin.no_shipping_date');
  178.                 $startDate $extra->getStartDate()? $extra->getStartDate()->format('Y年n月j日 H:i'):false;
  179.                 $endDate $extra->getEndDate()? $extra->getEndDate()->format('Y年n月j日 H:i'):false;
  180.                 $list[] = [
  181.                     'product_id' => $extra->getProductId(),
  182.                     'product_reserve_status' => $product_reserve_status,
  183.                     'shipping_date' => $shippingDate,
  184.                     'start_date' => $startDate,
  185.                     'end_date' => $endDate,
  186.                     ];
  187.             } else {
  188.                 foreach ($results['ProductClassExtras'] as $classExtra){
  189.                     if($classExtra->getProduct()->getId() == $extra->getProductId()){
  190.                         $product_reserve_status $this->reserveService->getProductClassReserveStatus($classExtra);
  191.                         if( $product_reserve_status != ProductReserveService::STATUS_NORMAL ) {
  192.                             $shippingDate $classExtra->getShippingDate() ? $classExtra->getShippingDate()->format('Y年n月j日 H:i') : trans('plugin_reserve4.admin.no_shipping_date');
  193.                             $startDate $classExtra->getStartDate() ? $classExtra->getStartDate()->format('Y年n月j日 H:i') : false;
  194.                             $endDate $classExtra->getEndDate() ? $classExtra->getEndDate()->format('Y年n月j日 H:i') : false;
  195.                             $classList[] = [
  196.                                 'product_id' => $classExtra->getProduct()->getId(),
  197.                                 'product_class_id' => $classExtra->getProductClass()->getId(),
  198.                                 'product_class_category_id1' => $classExtra->getClassCategory1()->getId(),
  199.                                 'product_class_category_id2' => $classExtra->getClassCategory2()?$classExtra->getClassCategory2()->getId():0,
  200.                                 'product_reserve_status' => $product_reserve_status,
  201.                                 'shipping_date' => $shippingDate,
  202.                                 'start_date' => $startDate,
  203.                                 'end_date' => $endDate,
  204.                             ];
  205.                         }
  206.                     }
  207.                 }
  208.             }
  209.         }
  210.         $parameters['productreserve4_list'] = $list;
  211.         $parameters['productreserve4_class_list'] = $classList;
  212.         $event->setParameters($parameters);
  213.     }
  214.     protected function procShipping($event)
  215.     {
  216.         $parameters $event->getParameters();
  217.         $Order $parameters['Order'];
  218.         $result $this->reserveService->canReserveOrder($Order);
  219.         $is_reserve_order $result == ProductReserveService::ERROR_SUCCESS_RESERVE;
  220.         $is_can_order = ($result == ProductReserveService::ERROR_SUCCESS_NORMAL) || ($result == ProductReserveService::ERROR_SUCCESS_RESERVE);
  221.         $is_normal_order $is_can_order && !$is_reserve_order;
  222.         $parameters['productreserve4_is_normal_order'] = $is_normal_order;
  223.         $parameters['productreserve4_reserve_status'] = $result;
  224.         if ($is_normal_order) {
  225.             $event->setParameters($parameters);
  226.             return;
  227.         }
  228.         $items $Order->getItems();
  229.         $list = [];
  230.         foreach($items as $OrderItem) {
  231.             if( !$OrderItem->isProduct() )  {
  232.                 continue;
  233.             }
  234.             $Product $OrderItem->getProduct();
  235.             $ProductClass $OrderItem->getProductClass();
  236.             if( !$Product ) {
  237.                 continue;
  238.             }
  239.             $product_id $Product->getId();
  240.             $product_reserve_status $this->reserveService->getProductReserveStatus($product_id);
  241.             if($product_reserve_status == ProductReserveService::STATUS_NORMAL){
  242.                 $product_class_reserve_status $this->reserveService->getProductClassReserveStatus($ProductClass->getId());
  243.                 $product_reserve_status $product_class_reserve_status;
  244.                 if($product_class_reserve_status == ProductReserveService::STATUS_RESERVE) {
  245.                     $reserve $this->productClassExtraRepository->getByProductClassId($ProductClass->getId());
  246.                 } else {
  247.                     $reserve null;
  248.                 }
  249.             } else {
  250.                 $reserve $this->productExtraRepository->get($product_id);
  251.             }
  252.             if($reserve) {
  253.                 $shippingDate $reserve->getShippingDate()? $reserve->getShippingDate()->format('Y年n月j日 H:i'):trans('plugin_reserve4.admin.no_shipping_date');
  254.             } else {
  255.                 $shippingDate '';
  256.             }
  257.             $list[] = [
  258.                 'reserve_status' => $product_reserve_status,
  259.                 'shipping_date' => $shippingDate,
  260.             ];
  261.         }
  262.         $parameters['productreserve4_list'] = $list;
  263.         $event->setParameters($parameters);
  264.     }
  265.     public function onShopping(TemplateEvent $event) {
  266.         $twig '@ProductReserve42/default/Shopping/shopping.twig';
  267.         $event->addSnippet($twig);
  268.         $this->procShipping($event);
  269.     }
  270.     public function onShoppingConfirm(TemplateEvent $event) {
  271.         $twig '@ProductReserve42/default/Shopping/shopping_confirm.twig';
  272.         $event->addSnippet($twig);
  273.         $this->procShipping($event);
  274.     }
  275.     /**
  276.      * @param TemplateEvent $event
  277.      */
  278.     public function onAdminProductEditView(TemplateEvent $event) {
  279.         $twig '@ProductReserve42/admin/Product/reservation_field.twig';
  280.         $event->addSnippet($twig);
  281.         $parameters $event->getParameters();
  282.         $parameters['reserve_start_date_default'] = Carbon::now()->format('Y/m/d');
  283.         $event->setParameters($parameters);
  284.     }
  285.     public function onAdminProductClassEditView(TemplateEvent $event){
  286.         $twig '@ProductReserve42/admin/Product/class_reservation_field.twig';
  287.         $event->addSnippet($twig);
  288.         $parameters $event->getParameters();
  289.         $parameters['reserve_start_date_default'] = Carbon::now()->format('Y/m/d');
  290.         $event->setParameters($parameters);
  291.     }
  292.     public function onAdminProductEditComplete(EventArgs $event) {
  293.         $form $event->getArgument('form');
  294.         $Product $event->getArgument('Product');
  295.         $product_id $Product->getId();
  296.         $productExtra $this->productExtraRepository->get($product_id);
  297.         $isPrevNormal true;
  298.         if( $productExtra == null || !$productExtra->isAllowed() ) {
  299.             $old_shippingDate false;
  300.         } else {
  301.             $isPrevNormal false;
  302.             $old_shippingDate $productExtra->getShippingDate();
  303.             if( $old_shippingDate ) {
  304.                 $old_shippingDate $productExtra->getShippingDate()? $productExtra->getShippingDate()->format("Y年n月j日 H:i"):false;
  305.             } else {
  306.                 $old_shippingDate false;
  307.             }
  308.         }
  309.         $this->productExtraRepository->set($product_id$form);
  310.         $isAllowed $form->get('reservation_isAllowed')->getData();
  311.         if( $isPrevNormal || !$isAllowed ) {
  312.             return;
  313.         }
  314.         $shippingDate $form->get('reservation_shippingDate')->getData();
  315.         $isNoUseShippingDateTime $form->get('reservation_isNoUseShippingDateTime')->getData();
  316.         if( $isNoUseShippingDateTime ) {
  317.             $shippingDate false;
  318.             $new_shippingDate false;
  319.         } else {
  320.             $shippingDate->setTimeZone(new \DateTimeZone(date_default_timezone_get()));
  321.             $new_shippingDate $shippingDate->format("Y年n月j日 H:i");
  322.         }
  323.         if( $old_shippingDate != $new_shippingDate ) {
  324.             $this->reserveService->procShippingChanged($product_id$shippingDate);
  325.         }
  326.     }
  327.     public function onFrontProductCarTAddComplete(EventArgs $event) {
  328.         $form $event->getArgument('form');
  329.         $Product $event->getArgument('Product');
  330.         $addCartData $form->getData();
  331.         $product_class_id $addCartData['product_class_id'];
  332.         $error_code $this->reserveService->validateCart($product_class_id$Product);
  333.         if( $error_code ) {
  334.             if( $error_code == ProductReserveService::STATUS_NORMAL ) {
  335.                 $event->setResponse(new JsonResponse(['done' => false'messages' => [trans('plugin_reserve4.front.cart_exist_reserve')]], 200, []));
  336.             } else if( $error_code == ProductReserveService::STATUS_RESERVE ) {
  337.                 $event->setResponse(new JsonResponse(['done' => false'messages' => [trans('plugin_reserve4.front.cart_exist_normal')]], 200, []));
  338.             } else {
  339.                 $event->setResponse(new JsonResponse(['done' => false'messages' => [trans('plugin_reserve4.front.cart_invalid_request')]], 200, []));
  340.             }
  341.         }
  342.         return ;
  343.     }
  344.     public function onFrontShoppingCompleteInitialize(EventArgs $event) {
  345.         $Order $event->getArgument('Order');
  346.         $this->reserveService->setOrderStatusByConfig($Order);
  347.     }
  348.     public function onMailOrder(EventArgs $event) {
  349.         $Order $event->getArgument('Order');
  350.         $message $event->getArgument('message');
  351.         $this->reserveService->setOrderReserveMail($Order$message);
  352.     }
  353. }