app/Plugin/ProductReserve4/Event.php line 382

Open in your IDE?
  1. <?php
  2. namespace Plugin\ProductReserve4;
  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\ProductReserve4\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\ProductReserve4\Repository\ConfigRepository;
  27. use Plugin\ProductReserve4\Repository\ProductExtraRepository;
  28. use Plugin\ProductReserve4\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/detail_slug.twig' => 'onProductDetailView',
  95.             'Shopping/confirm.twig' => 'onShoppingConfirm',
  96.             '@admin/Product/product.twig' => 'onAdminProductEditView',
  97.             '@admin/Product/product_class.twig' => 'onAdminProductClassEditView',
  98.             EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'onAdminProductEditComplete',
  99.             EccubeEvents::FRONT_PRODUCT_CART_ADD_COMPLETE => 'onFrontProductCarTAddComplete',
  100.             EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE => ['onFrontShoppingCompleteInitialize'$priority],
  101.             EccubeEvents::MAIL_ORDER => 'onMailOrder',
  102. //            KernelEvents::CONTROLLER => ['onController', 1],
  103.         ];
  104.     }
  105.     /**
  106.      * @param TemplateEvent $event
  107.      */
  108.     public function onProductDetailView(TemplateEvent $event) {
  109.         $twig '@ProductReserve4/default/Product/product_detail.twig';
  110.         $event->addSnippet($twig);
  111.         $parameters $event->getParameters();
  112.         $product_id $parameters['Product']->getId();
  113.         $extra $this->productExtraRepository->get($product_id);
  114.         $product_reserve_status $this->reserveService->getProductReserveStatus($extra);
  115.         $parameters['productreserve4_reserve_status'] = $product_reserve_status;
  116.         $parameters['productreserve4_has_class_detail'] = false;
  117.         if( $product_reserve_status != ProductReserveService::STATUS_NORMAL ) {
  118.             $shippingDate $extra->getShippingDate()? $extra->getShippingDate()->format('Y年n月j日 H:i'):trans('plugin_reserve4.admin.no_shipping_date');
  119.             $startDate $extra->getStartDate()? $extra->getStartDate()->format('Y年n月j日 H:i'):false;
  120.             $endDate $extra->getEndDate()? $extra->getEndDate()->format('Y年n月j日 H:i'):false;
  121.             $product_reserve = [
  122.                 'product_id' => $extra->getProductId(),
  123.                 'product_reserve_status' => $product_reserve_status,
  124.                 'shipping_date' => $shippingDate,
  125.                 'start_date' => $startDate,
  126.                 'end_date' => $endDate,
  127.             ];
  128.             $parameters['productreserve4_detail'] = $product_reserve;
  129.         } else {
  130.             $productClassExtras $this->productClassExtraRepository->findBy(['Product' => $product_id]);
  131.             $classList = [];
  132.             foreach ($productClassExtras as $classExtra) {
  133.                 $product_reserve_status $this->reserveService->getProductClassReserveStatus($classExtra);
  134.                 if ($product_reserve_status != ProductReserveService::STATUS_NORMAL) {
  135.                     $shippingDate $classExtra->getShippingDate() ? $classExtra->getShippingDate()->format('Y年n月j日 H:i') : trans('plugin_reserve4.admin.no_shipping_date');
  136.                     $startDate $classExtra->getStartDate() ? $classExtra->getStartDate()->format('Y年n月j日 H:i') : false;
  137.                     $endDate $classExtra->getEndDate() ? $classExtra->getEndDate()->format('Y年n月j日 H:i') : false;
  138.                     $classList[] = [
  139.                         'product_id' => $classExtra->getProduct()->getId(),
  140.                         'product_class_id' => $classExtra->getProductClass()->getId(),
  141.                         'product_class_category_id1' => $classExtra->getClassCategory1()->getId(),
  142.                         'product_class_category_id2' => $classExtra->getClassCategory2()?$classExtra->getClassCategory2()->getId():0,
  143.                         'product_reserve_status' => $product_reserve_status,
  144.                         'shipping_date' => $shippingDate,
  145.                         'start_date' => $startDate,
  146.                         'end_date' => $endDate,
  147.                     ];
  148.                 }
  149.             }
  150.             if($classList !== []){
  151.                 $parameters['product_id'] = $product_id;
  152.                 $parameters['productreserve4_class_detail'] = $classList;
  153.                 $parameters['productreserve4_has_class_detail'] = true;
  154.             }
  155.         }
  156.         $event->setParameters($parameters);
  157.     }
  158.     /**
  159.      * @param TemplateEvent $event
  160.      */
  161.     public function onProductListView(TemplateEvent $event) {
  162.         $twig '@ProductReserve4/default/Product/product_list.twig';
  163.         $event->addSnippet($twig);
  164.         $parameters $event->getParameters();
  165.         $pagination $parameters['pagination'];
  166.         $product_ids = [];
  167.         foreach($pagination as $product) {
  168.             $product_ids[] = $product->getId();
  169.         }
  170.         $results $this->reserveService->getProductExtrList($product_ids);
  171.         $list = [];
  172.         $classList = [];
  173.         foreach($results['ProductExtras'] as $extra) {
  174.             $product_reserve_status $this->reserveService->getProductReserveStatus($extra);
  175.             if( $product_reserve_status != ProductReserveService::STATUS_NORMAL ) {
  176.                 $shippingDate $extra->getShippingDate()? $extra->getShippingDate()->format('Y年n月j日 H:i'):trans('plugin_reserve4.admin.no_shipping_date');
  177.                 $startDate $extra->getStartDate()? $extra->getStartDate()->format('Y年n月j日 H:i'):false;
  178.                 $endDate $extra->getEndDate()? $extra->getEndDate()->format('Y年n月j日 H:i'):false;
  179.                 $list[] = [
  180.                     'product_id' => $extra->getProductId(),
  181.                     'product_reserve_status' => $product_reserve_status,
  182.                     'shipping_date' => $shippingDate,
  183.                     'start_date' => $startDate,
  184.                     'end_date' => $endDate,
  185.                     ];
  186.             } else {
  187.                 foreach ($results['ProductClassExtras'] as $classExtra){
  188.                     if($classExtra->getProduct()->getId() == $extra->getProductId()){
  189.                         $product_reserve_status $this->reserveService->getProductClassReserveStatus($classExtra);
  190.                         if( $product_reserve_status != ProductReserveService::STATUS_NORMAL ) {
  191.                             $shippingDate $classExtra->getShippingDate() ? $classExtra->getShippingDate()->format('Y年n月j日 H:i') : trans('plugin_reserve4.admin.no_shipping_date');
  192.                             $startDate $classExtra->getStartDate() ? $classExtra->getStartDate()->format('Y年n月j日 H:i') : false;
  193.                             $endDate $classExtra->getEndDate() ? $classExtra->getEndDate()->format('Y年n月j日 H:i') : false;
  194.                             $classList[] = [
  195.                                 'product_id' => $classExtra->getProduct()->getId(),
  196.                                 'product_class_id' => $classExtra->getProductClass()->getId(),
  197.                                 'product_class_category_id1' => $classExtra->getClassCategory1()->getId(),
  198.                                 'product_class_category_id2' => $classExtra->getClassCategory2()?$classExtra->getClassCategory2()->getId():0,
  199.                                 'product_reserve_status' => $product_reserve_status,
  200.                                 'shipping_date' => $shippingDate,
  201.                                 'start_date' => $startDate,
  202.                                 'end_date' => $endDate,
  203.                             ];
  204.                         }
  205.                     }
  206.                 }
  207.             }
  208.         }
  209.         $parameters['productreserve4_list'] = $list;
  210.         $parameters['productreserve4_class_list'] = $classList;
  211.         $event->setParameters($parameters);
  212.     }
  213.     protected function procShipping($event)
  214.     {
  215.         $parameters $event->getParameters();
  216.         $Order $parameters['Order'];
  217.         $result $this->reserveService->canReserveOrder($Order);
  218.         $is_reserve_order $result == ProductReserveService::ERROR_SUCCESS_RESERVE;
  219.         $is_can_order = ($result == ProductReserveService::ERROR_SUCCESS_NORMAL) || ($result == ProductReserveService::ERROR_SUCCESS_RESERVE);
  220.         $is_normal_order $is_can_order && !$is_reserve_order;
  221.         $parameters['productreserve4_is_normal_order'] = $is_normal_order;
  222.         $parameters['productreserve4_reserve_status'] = $result;
  223.         if ($is_normal_order) {
  224.             $event->setParameters($parameters);
  225.             return;
  226.         }
  227.         $items $Order->getItems();
  228.         $list = [];
  229.         foreach($items as $OrderItem) {
  230.             if( !$OrderItem->isProduct() )  {
  231.                 continue;
  232.             }
  233.             $Product $OrderItem->getProduct();
  234.             $ProductClass $OrderItem->getProductClass();
  235.             if( !$Product ) {
  236.                 continue;
  237.             }
  238.             $product_id $Product->getId();
  239.             $product_reserve_status $this->reserveService->getProductReserveStatus($product_id);
  240.             if($product_reserve_status == ProductReserveService::STATUS_NORMAL){
  241.                 $product_class_reserve_status $this->reserveService->getProductClassReserveStatus($ProductClass->getId());
  242.                 $product_reserve_status $product_class_reserve_status;
  243.                 if($product_class_reserve_status == ProductReserveService::STATUS_RESERVE) {
  244.                     $reserve $this->productClassExtraRepository->getByProductClassId($ProductClass->getId());
  245.                 } else {
  246.                     $reserve null;
  247.                 }
  248.             } else {
  249.                 $reserve $this->productExtraRepository->get($product_id);
  250.             }
  251.             if($reserve) {
  252.                 $shippingDate $reserve->getShippingDate()? $reserve->getShippingDate()->format('Y年n月j日 H:i'):trans('plugin_reserve4.admin.no_shipping_date');
  253.             } else {
  254.                 $shippingDate '';
  255.             }
  256.             $list[] = [
  257.                 'reserve_status' => $product_reserve_status,
  258.                 'shipping_date' => $shippingDate,
  259.             ];
  260.         }
  261.         $parameters['productreserve4_list'] = $list;
  262.         $event->setParameters($parameters);
  263.     }
  264.     public function onShopping(TemplateEvent $event) {
  265.         $twig '@ProductReserve4/default/Shopping/shopping.twig';
  266.         $event->addSnippet($twig);
  267.         $this->procShipping($event);
  268.     }
  269.     public function onShoppingConfirm(TemplateEvent $event) {
  270.         $twig '@ProductReserve4/default/Shopping/shopping_confirm.twig';
  271.         $event->addSnippet($twig);
  272.         $this->procShipping($event);
  273.     }
  274.     /**
  275.      * @param TemplateEvent $event
  276.      */
  277.     public function onAdminProductEditView(TemplateEvent $event) {
  278.         $twig '@ProductReserve4/admin/Product/reservation_field.twig';
  279.         $event->addSnippet($twig);
  280.         $parameters $event->getParameters();
  281.         $parameters['reserve_start_date_default'] = Carbon::now()->format('Y/m/d');
  282.         $event->setParameters($parameters);
  283.     }
  284.     public function onAdminProductClassEditView(TemplateEvent $event){
  285.         $twig '@ProductReserve4/admin/Product/class_reservation_field.twig';
  286.         $event->addSnippet($twig);
  287.         $parameters $event->getParameters();
  288.         $parameters['reserve_start_date_default'] = Carbon::now()->format('Y/m/d');
  289.         $event->setParameters($parameters);
  290.     }
  291.     public function onAdminProductEditComplete(EventArgs $event) {
  292.         $form $event->getArgument('form');
  293.         $Product $event->getArgument('Product');
  294.         $product_id $Product->getId();
  295.         $productExtra $this->productExtraRepository->get($product_id);
  296.         $isPrevNormal true;
  297.         if( $productExtra == null || !$productExtra->isAllowed() ) {
  298.             $old_shippingDate false;
  299.         } else {
  300.             $isPrevNormal false;
  301.             $old_shippingDate $productExtra->getShippingDate();
  302.             if( $old_shippingDate ) {
  303.                 $old_shippingDate $productExtra->getShippingDate()? $productExtra->getShippingDate()->format("Y年n月j日 H:i"):false;
  304.             } else {
  305.                 $old_shippingDate false;
  306.             }
  307.         }
  308.         $this->productExtraRepository->set($product_id$form);
  309.         $isAllowed $form->get('reservation_isAllowed')->getData();
  310.         if( $isPrevNormal || !$isAllowed ) {
  311.             return;
  312.         }
  313.         $shippingDate $form->get('reservation_shippingDate')->getData();
  314.         $isNoUseShippingDateTime $form->get('reservation_isNoUseShippingDateTime')->getData();
  315.         if( $isNoUseShippingDateTime ) {
  316.             $shippingDate false;
  317.             $new_shippingDate false;
  318.         } else {
  319.             $shippingDate->setTimeZone(new \DateTimeZone(date_default_timezone_get()));
  320.             $new_shippingDate $shippingDate->format("Y年n月j日 H:i");
  321.         }
  322.         if( $old_shippingDate != $new_shippingDate ) {
  323.             $this->reserveService->procShippingChanged($product_id$shippingDate);
  324.         }
  325.     }
  326.     public function onFrontProductCarTAddComplete(EventArgs $event) {
  327.         $form $event->getArgument('form');
  328.         $Product $event->getArgument('Product');
  329.         $addCartData $form->getData();
  330.         $product_class_id $addCartData['product_class_id'];
  331.         $error_code $this->reserveService->validateCart($product_class_id$Product);
  332.         if( $error_code ) {
  333.             if( $error_code == ProductReserveService::STATUS_NORMAL ) {
  334.                 $event->setResponse(new JsonResponse(['done' => false'messages' => [trans('plugin_reserve4.front.cart_exist_reserve')]], 200, []));
  335.             } else if( $error_code == ProductReserveService::STATUS_RESERVE ) {
  336.                 $event->setResponse(new JsonResponse(['done' => false'messages' => [trans('plugin_reserve4.front.cart_exist_normal')]], 200, []));
  337.             } else {
  338.                 $event->setResponse(new JsonResponse(['done' => false'messages' => [trans('plugin_reserve4.front.cart_invalid_request')]], 200, []));
  339.             }
  340.         }
  341.         return ;
  342.     }
  343.     public function onFrontShoppingCompleteInitialize(EventArgs $event) {
  344.         $Order $event->getArgument('Order');
  345.         $this->reserveService->setOrderStatusByConfig($Order);
  346.     }
  347.     public function onMailOrder(EventArgs $event) {
  348.         $Order $event->getArgument('Order');
  349.         $message $event->getArgument('message');
  350.         $this->reserveService->setOrderReserveMail($Order$message);
  351.     }
  352. }