app/Customize/Controller/Admin/Order/CustomEditController.php line 545

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Customize\Controller\Admin\Order;
  13. use Doctrine\Common\Collections\ArrayCollection;
  14. use Eccube\Controller\AbstractController;
  15. use Eccube\Entity\Master\CustomerStatus;
  16. use Eccube\Entity\Master\OrderItemType;
  17. use Eccube\Entity\Master\OrderStatus;
  18. use Eccube\Entity\Master\TaxType;
  19. use Eccube\Entity\Order;
  20. use Eccube\Entity\Shipping;
  21. use Eccube\Event\EccubeEvents;
  22. use Eccube\Event\EventArgs;
  23. use Eccube\Exception\ShoppingException;
  24. use Eccube\Form\Type\AddCartType;
  25. use Eccube\Form\Type\Admin\OrderType;
  26. use Eccube\Form\Type\Admin\SearchCustomerType;
  27. use Eccube\Form\Type\Admin\SearchProductType;
  28. use Eccube\Repository\CategoryRepository;
  29. use Eccube\Repository\CustomerRepository;
  30. use Eccube\Repository\DeliveryRepository;
  31. use Eccube\Repository\Master\DeviceTypeRepository;
  32. use Eccube\Repository\Master\OrderItemTypeRepository;
  33. use Eccube\Repository\Master\OrderStatusRepository;
  34. use Eccube\Repository\OrderRepository;
  35. use Eccube\Repository\ProductRepository;
  36. use Eccube\Service\OrderHelper;
  37. use Eccube\Service\OrderStateMachine;
  38. use Eccube\Service\PurchaseFlow\Processor\OrderNoProcessor;
  39. use Eccube\Service\PurchaseFlow\PurchaseContext;
  40. use Eccube\Service\PurchaseFlow\PurchaseException;
  41. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  42. use Eccube\Service\TaxRuleService;
  43. use Knp\Component\Pager\PaginatorInterface;
  44. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  45. use Symfony\Component\HttpFoundation\Request;
  46. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  47. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  48. use Symfony\Component\Routing\Annotation\Route;
  49. use Symfony\Component\Routing\RouterInterface;
  50. use Symfony\Component\Serializer\Serializer;
  51. use Symfony\Component\Serializer\SerializerInterface;
  52. use Customize\Repository\OrderItemRepository;
  53. use Customize\Repository\OrderDeliveryPeriodRepository;
  54. use Eccube\Repository\ClassCategoryRepository;
  55. use Eccube\Repository\ProductClassRepository;
  56. use Customize\Repository\DeliveryPeriodRepository;
  57. use Customize\Entity\OrderDeliveryPeriod;
  58. use Customize\Repository\SetProductRepository;
  59. use Customize\Repository\ProductSchoolRepository;
  60. use Eccube\Repository\DeliveryFeeRepository;
  61. class CustomEditController extends AbstractController
  62. {
  63.     /**
  64.      * @var TaxRuleService
  65.      */
  66.     protected $taxRuleService;
  67.     /**
  68.      * @var DeviceTypeRepository
  69.      */
  70.     protected $deviceTypeRepository;
  71.     /**
  72.      * @var ProductRepository
  73.      */
  74.     protected $productRepository;
  75.     /**
  76.      * @var CategoryRepository
  77.      */
  78.     protected $categoryRepository;
  79.     /**
  80.      * @var CustomerRepository
  81.      */
  82.     protected $customerRepository;
  83.     /**
  84.      * @var Serializer
  85.      */
  86.     protected $serializer;
  87.     /**
  88.      * @var DeliveryRepository
  89.      */
  90.     protected $deliveryRepository;
  91.     /**
  92.      * @var PurchaseFlow
  93.      */
  94.     protected $purchaseFlow;
  95.     /**
  96.      * @var OrderRepository
  97.      */
  98.     protected $orderRepository;
  99.     /**
  100.      * @var OrderNoProcessor
  101.      */
  102.     protected $orderNoProcessor;
  103.     /**
  104.      * @var OrderItemTypeRepository
  105.      */
  106.     protected $orderItemTypeRepository;
  107.     /**
  108.      * @var OrderStateMachine
  109.      */
  110.     protected $orderStateMachine;
  111.     /**
  112.      * @var OrderStatusRepository
  113.      */
  114.     protected $orderStatusRepository;
  115.     /**
  116.      * @var OrderHelper
  117.      */
  118.     private $orderHelper;
  119.     /**
  120.      * @var OrderItemRepository
  121.      */
  122.     protected $orderItemRepository;
  123.     /**
  124.      * @var OrderDeliveryPeriodRepository
  125.      */
  126.     protected $orderDeliveryPeriodRepository;
  127.     /**
  128.      * @var ClassCategoryRepository
  129.      */
  130.     protected $classCategoryRepository;
  131.     /**
  132.      * @var ProductClassRepository
  133.      */
  134.     protected $productClassRepository;
  135.     /**
  136.      * @var DeliveryPeriodRepository
  137.      */
  138.     protected $deliveryPeriodRepository;
  139.     /**
  140.      * @var SetProductRepository
  141.      */
  142.     protected $setProductRepository;
  143.     /**
  144.      * @var ProductSchoolRepository
  145.      */
  146.     protected $productSchoolRepository;
  147.     /**
  148.      * @var DeliveryFeeRepository
  149.      */
  150.     protected $deliveryFeeRepository;
  151.     /**
  152.      * EditController constructor.
  153.      *
  154.      * @param TaxRuleService $taxRuleService
  155.      * @param DeviceTypeRepository $deviceTypeRepository
  156.      * @param ProductRepository $productRepository
  157.      * @param CategoryRepository $categoryRepository
  158.      * @param CustomerRepository $customerRepository
  159.      * @param SerializerInterface $serializer
  160.      * @param DeliveryRepository $deliveryRepository
  161.      * @param PurchaseFlow $orderPurchaseFlow
  162.      * @param OrderRepository $orderRepository
  163.      * @param OrderNoProcessor $orderNoProcessor
  164.      * @param OrderItemTypeRepository $orderItemTypeRepository
  165.      * @param OrderStatusRepository $orderStatusRepository
  166.      * @param OrderStateMachine $orderStateMachine
  167.      * @param OrderHelper $orderHelper
  168.      * @param OrderItemRepository $orderItemRepository
  169.      * @param OrderDeliveryPeriodRepository $orderDeliveryPeriodRepository
  170.      * @param ClassCategoryRepository $classCategoryRepository
  171.      * @param ProductClassRepository $productClassRepository
  172.      * @param DeliveryPeriodRepository $deliveryPeriodRepository
  173.      */
  174.     public function __construct(
  175.         TaxRuleService $taxRuleService,
  176.         DeviceTypeRepository $deviceTypeRepository,
  177.         ProductRepository $productRepository,
  178.         CategoryRepository $categoryRepository,
  179.         CustomerRepository $customerRepository,
  180.         SerializerInterface $serializer,
  181.         DeliveryRepository $deliveryRepository,
  182.         PurchaseFlow $orderPurchaseFlow,
  183.         OrderRepository $orderRepository,
  184.         OrderNoProcessor $orderNoProcessor,
  185.         OrderItemTypeRepository $orderItemTypeRepository,
  186.         OrderStatusRepository $orderStatusRepository,
  187.         OrderStateMachine $orderStateMachine,
  188.         OrderHelper $orderHelper,
  189.         OrderItemRepository $orderItemRepository,
  190.         OrderDeliveryPeriodRepository $orderDeliveryPeriodRepository,
  191.         ClassCategoryRepository $classCategoryRepository,
  192.         ProductClassRepository $productClassRepository,
  193.         DeliveryPeriodRepository $deliveryPeriodRepository,
  194.         SetProductRepository $setProductRepository,
  195.         DeliveryFeeRepository $deliveryFeeRepository,
  196.         ProductSchoolRepository $productSchoolRepository
  197.     ) {
  198.         $this->taxRuleService $taxRuleService;
  199.         $this->deviceTypeRepository $deviceTypeRepository;
  200.         $this->productRepository $productRepository;
  201.         $this->categoryRepository $categoryRepository;
  202.         $this->customerRepository $customerRepository;
  203.         $this->serializer $serializer;
  204.         $this->deliveryRepository $deliveryRepository;
  205.         $this->purchaseFlow $orderPurchaseFlow;
  206.         $this->orderRepository $orderRepository;
  207.         $this->orderNoProcessor $orderNoProcessor;
  208.         $this->orderItemTypeRepository $orderItemTypeRepository;
  209.         $this->orderStatusRepository $orderStatusRepository;
  210.         $this->orderStateMachine $orderStateMachine;
  211.         $this->orderHelper $orderHelper;
  212.         $this->orderItemRepository $orderItemRepository;
  213.         $this->orderDeliveryPeriodRepository $orderDeliveryPeriodRepository;
  214.         $this->classCategoryRepository $classCategoryRepository;
  215.         $this->productClassRepository $productClassRepository;
  216.         $this->deliveryPeriodRepository $deliveryPeriodRepository;
  217.         $this->setProductRepository $setProductRepository;
  218.         $this->productSchoolRepository  $productSchoolRepository;
  219.         $this->deliveryFeeRepository $deliveryFeeRepository;
  220.     }
  221.     /**
  222.      * 受注登録/編集画面.
  223.      *
  224.      * @Route("/%eccube_admin_route%/order/new", name="admin_order_new", methods={"GET", "POST"})
  225.      * @Route("/%eccube_admin_route%/order/{id}/edit", requirements={"id" = "\d+"}, name="admin_order_edit", methods={"GET", "POST"})
  226.      * @Template("@admin/Order/edit.twig")
  227.      */
  228.     public function index(Request $requestRouterInterface $router$id null)
  229.     {
  230.         $TargetOrder null;
  231.         $OriginOrder null;
  232.         if (null === $id) {
  233.             // 空のエンティティを作成.
  234.             $TargetOrder = new Order();
  235.             $TargetOrder->addShipping((new Shipping())->setOrder($TargetOrder));
  236.             $preOrderId $this->orderHelper->createPreOrderId();
  237.             $TargetOrder->setPreOrderId($preOrderId);
  238.         } else {
  239.             $TargetOrder $this->orderRepository->find($id);
  240.             if (null === $TargetOrder) {
  241.                 throw new NotFoundHttpException();
  242.             }
  243.         }
  244.         // 編集前の受注情報を保持
  245.         $OriginOrder = clone $TargetOrder;
  246.         $OriginItems = new ArrayCollection();
  247.         foreach ($TargetOrder->getOrderItems() as $Item) {
  248.             $OriginItems->add($Item);
  249.         }
  250.         $builder $this->formFactory->createBuilder(OrderType::class, $TargetOrder);
  251.         $event = new EventArgs(
  252.             [
  253.                 'builder' => $builder,
  254.                 'OriginOrder' => $OriginOrder,
  255.                 'TargetOrder' => $TargetOrder,
  256.             ],
  257.             $request
  258.         );
  259.         $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_INDEX_INITIALIZE);
  260.         $form $builder->getForm();
  261.         $form->handleRequest($request);
  262.         $purchaseContext = new PurchaseContext($OriginOrder$OriginOrder->getCustomer());
  263.         if ($form->isSubmitted() && $form['OrderItems']->isValid()) {
  264.             $event = new EventArgs(
  265.                 [
  266.                     'builder' => $builder,
  267.                     'OriginOrder' => $OriginOrder,
  268.                     'TargetOrder' => $TargetOrder,
  269.                     'PurchaseContext' => $purchaseContext,
  270.                 ],
  271.                 $request
  272.             );
  273.             $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_INDEX_PROGRESS);
  274.             $flowResult $this->purchaseFlow->validate($TargetOrder$purchaseContext);
  275.             if ($flowResult->hasWarning()) {
  276.                 foreach ($flowResult->getWarning() as $warning) {
  277.                     $this->addWarning($warning->getMessage(), 'admin');
  278.                 }
  279.             }
  280.             if ($flowResult->hasError()) {
  281.                 foreach ($flowResult->getErrors() as $error) {
  282.                     $this->addError($error->getMessage(), 'admin');
  283.                 }
  284.             }
  285.             // 登録ボタン押下
  286.             switch ($request->get('mode')) {
  287.                 case 'register':
  288.                     log_info('受注登録開始', [$TargetOrder->getId()]);
  289.                     if (!$flowResult->hasError() && $form->isValid()) {
  290.                         try {
  291.                             $this->purchaseFlow->prepare($TargetOrder$purchaseContext);
  292.                             $this->purchaseFlow->commit($TargetOrder$purchaseContext);
  293.                         } catch (PurchaseException $e) {
  294.                             $this->addError($e->getMessage(), 'admin');
  295.                             break;
  296.                         }
  297.                         $OldStatus $OriginOrder->getOrderStatus();
  298.                         $NewStatus $TargetOrder->getOrderStatus();
  299.                         // ステータスが変更されている場合はステートマシンを実行.
  300.                         if ($TargetOrder->getId() && $OldStatus->getId() != $NewStatus->getId()) {
  301.                             // 発送済に変更された場合は, 発送日をセットする.
  302.                             if ($NewStatus->getId() == OrderStatus::DELIVERED) {
  303.                                 $TargetOrder->getShippings()->map(function (Shipping $Shipping) {
  304.                                     if (!$Shipping->isShipped()) {
  305.                                         $Shipping->setShippingDate(new \DateTime());
  306.                                     }
  307.                                 });
  308.                             }
  309.                             // ステートマシンでステータスは更新されるので, 古いステータスに戻す.
  310.                             $TargetOrder->setOrderStatus($OldStatus);
  311.                             try {
  312.                                 // FormTypeでステータスの遷移チェックは行っているのでapplyのみ実行.
  313.                                 $this->orderStateMachine->apply($TargetOrder$NewStatus);
  314.                             } catch (ShoppingException $e) {
  315.                                 $this->addError($e->getMessage(), 'admin');
  316.                                 break;
  317.                             }
  318.                         }
  319.                         $this->entityManager->persist($TargetOrder);
  320.                         $this->entityManager->flush();
  321.                         foreach ($OriginItems as $Item) {
  322.                             if ($TargetOrder->getOrderItems()->contains($Item) === false) {
  323.                                 $this->entityManager->remove($Item);
  324.                             }
  325.                         }
  326.                         $this->entityManager->flush();
  327.                         // 新規登録時はMySQL対応のためflushしてから採番
  328.                         $this->orderNoProcessor->process($TargetOrder$purchaseContext);
  329.                         $this->entityManager->flush();
  330.                         // 会員の場合、購入回数、購入金額などを更新
  331.                         if ($Customer $TargetOrder->getCustomer()) {
  332.                             $studentNumber $form->get('student_number')->getData();
  333.                             $Customer->setStudentNumber($studentNumber);
  334.                             $this->orderRepository->updateOrderSummary($Customer);
  335.                             $this->entityManager->flush();
  336.                         }
  337.                         $set_product_clasess json_decode($request->get('set_product_classes'null));
  338.                         $newSetProductClass = [];
  339.                         foreach ($TargetOrder->getOrderItems() as $Item) {
  340.                             if ($Item->isProduct() && $Item->getProduct()->getProductType() == 'set') {
  341.                                 $ProductInSet = [];
  342.                                 $pis_all $this->setProductRepository->findOneBy(['set_product_id' => $Item->getProduct()->getSetProductId()])->getSetProductProduct();
  343.                                 foreach ($pis_all as $pis) {
  344.                                     if (!in_array($pis->getProduct(), $ProductInSet)) {
  345.                                         array_push($ProductInSet$pis->getProduct());
  346.                                     }
  347.                                 }
  348.                                 foreach ($ProductInSet as $pis) {
  349.                                     if ($pis->hasProductClass()) {
  350.                                         foreach ($set_product_clasess as $spc) {
  351.                                             if ($spc->set_product_id == $Item->getProduct()->getId() && $pis->getId() == $spc->product_id) {
  352.                                                 $insetProductId $spc->product_id;
  353.                                                 $insetCategoryId = isset($spc->categoryId) ? $spc->categoryId null;
  354.                                                 $insetCategoryId2 = isset($spc->categoryId2) ? $spc->categoryId2 null;
  355.                                                 $insetProductClass null;
  356.                                                 if ($insetCategoryId !== null) {
  357.                                                     $insetProductClass $this->productClassRepository->findOneBy(array('Product' => $insetProductId'ClassCategory1' => $insetCategoryId'visible' => 1));
  358.                                                 }
  359.                                                 if ($insetCategoryId2 !== null) {
  360.                                                     $insetProductClass $this->productClassRepository->findOneBy(array('Product' => $insetProductId'ClassCategory1' => $insetCategoryId'ClassCategory2' => $insetCategoryId2'visible' => 1));
  361.                                                 }
  362.                                                 if ($insetProductClass)
  363.                                                     $newSetProductClass[] = $insetProductClass->getId();
  364.                                             }
  365.                                         }
  366.                                     } else {
  367.                                         $newSetProductClass[] = $pis->getProductClasses()[0]->getId();
  368.                                     }
  369.                                 }
  370.                                 $Item->setSetProductClass($newSetProductClass);
  371.                             }
  372.                             foreach ($OriginItems as $originItem) {
  373.                                 if ($Item->getId() == $originItem->getId()) {
  374.                                     $Item->setDeliveryPeriod($originItem->getDeliveryPeriod());
  375.                                     $Item->setBrother($originItem->getBrother());
  376.                                 }
  377.                             }
  378.                             if ($Item->isProduct()) {
  379.                                 $productSchools $this->productSchoolRepository->findOneBy(array('Product' => $Item->getProduct(), 'School' => $TargetOrder->getSchool()));
  380.                                 $DeliveryPeriod = empty($productSchools) || empty($productSchools->getDeliveryPeriod()) ? $this->deliveryPeriodRepository->findOneBy(['School' => $TargetOrder->getSchool()]) :  $productSchools->getDeliveryPeriod();
  381.                                 $Item->setDeliveryPeriod($DeliveryPeriod);
  382.                             }
  383.                             $this->entityManager->persist($Item);
  384.                             $this->entityManager->flush();
  385.                         }
  386.                         $order_delivery_period_fee $request->get('order_delivery_period_fee'null);
  387.                         if ($order_delivery_period_fee) {
  388.                             foreach ($order_delivery_period_fee as $delivery_period_id => $fee) {
  389.                                 $delivery_period $this->deliveryPeriodRepository->find($delivery_period_id);
  390.                                 $order_delivery_period $this->orderDeliveryPeriodRepository->findOneBy(['Order' => $TargetOrder'DeliveryPeriod' => $delivery_period]);
  391.                                 if (!$order_delivery_period) {
  392.                                     $order_delivery_period = new OrderDeliveryPeriod();
  393.                                     $order_delivery_period->setOrder($TargetOrder);
  394.                                     $order_delivery_period->setDeliveryPeriod($delivery_period);
  395.                                 }
  396.                                 $order_delivery_period->setFee($fee);
  397.                                 $this->entityManager->persist($order_delivery_period);
  398.                                 $this->entityManager->flush();
  399.                             }
  400.                         }
  401.                         $event = new EventArgs(
  402.                             [
  403.                                 'form' => $form,
  404.                                 'OriginOrder' => $OriginOrder,
  405.                                 'TargetOrder' => $TargetOrder,
  406.                                 'Customer' => $Customer,
  407.                             ],
  408.                             $request
  409.                         );
  410.                         $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_INDEX_COMPLETE);
  411.                         $this->addSuccess('admin.common.save_complete''admin');
  412.                         log_info('受注登録完了', [$TargetOrder->getId()]);
  413.                         if ($returnLink $form->get('return_link')->getData()) {
  414.                             try {
  415.                                 // $returnLinkはpathの形式で渡される. pathが存在するかをルータでチェックする.
  416.                                 $pattern '/^' preg_quote($request->getBasePath(), '/') . '/';
  417.                                 $returnLink preg_replace($pattern''$returnLink);
  418.                                 $result $router->match($returnLink);
  419.                                 // パラメータのみ抽出
  420.                                 $params array_filter($result, function ($key) {
  421.                                     return !== \strpos($key'_');
  422.                                 }, ARRAY_FILTER_USE_KEY);
  423.                                 // pathからurlを再構築してリダイレクト.
  424.                                 return $this->redirectToRoute($result['_route'], $params);
  425.                             } catch (\Exception $e) {
  426.                                 // マッチしない場合はログ出力してスキップ.
  427.                                 log_warning('URLの形式が不正です。');
  428.                             }
  429.                         }
  430.                         return $this->redirectToRoute('admin_order_edit', ['id' => $TargetOrder->getId()]);
  431.                     }
  432.                     break;
  433.                 default:
  434.                     break;
  435.             }
  436.         }
  437.         // 会員検索フォーム
  438.         $builder $this->formFactory
  439.             ->createBuilder(SearchCustomerType::class);
  440.         $event = new EventArgs(
  441.             [
  442.                 'builder' => $builder,
  443.                 'OriginOrder' => $OriginOrder,
  444.                 'TargetOrder' => $TargetOrder,
  445.             ],
  446.             $request
  447.         );
  448.         $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_INITIALIZE);
  449.         $searchCustomerModalForm $builder->getForm();
  450.         // 商品検索フォーム
  451.         $builder $this->formFactory
  452.             ->createBuilder(SearchProductType::class);
  453.         $event = new EventArgs(
  454.             [
  455.                 'builder' => $builder,
  456.                 'OriginOrder' => $OriginOrder,
  457.                 'TargetOrder' => $TargetOrder,
  458.             ],
  459.             $request
  460.         );
  461.         $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_INITIALIZE);
  462.         $searchProductModalForm $builder->getForm();
  463.         // 配送業者のお届け時間
  464.         $times = [];
  465.         $deliveries $this->deliveryRepository->findAll();
  466.         foreach ($deliveries as $Delivery) {
  467.             $deliveryTimes $Delivery->getDeliveryTimes();
  468.             foreach ($deliveryTimes as $DeliveryTime) {
  469.                 $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime();
  470.             }
  471.         }
  472.         $charge $TargetOrder->getCharge();
  473.         $DeliveryPeriodArr = [];
  474.         $setProductClassArr = [];
  475.         foreach ($TargetOrder->getOrderItems() as $OrderItem) {
  476.             if ($OrderItem->isProduct()) {
  477.                 $productSchools $this->productSchoolRepository->findOneBy(array('Product' => $OrderItem->getProduct(), 'School' => $TargetOrder->getSchool()));
  478.                 $DeliveryPeriod = empty($productSchools) || empty($productSchools->getDeliveryPeriod()) ? $this->deliveryPeriodRepository->findOneBy(['School' => $TargetOrder->getSchool()]) :  $productSchools->getDeliveryPeriod();
  479.                 $OrderItem->setDeliveryPeriod($DeliveryPeriod);
  480.             }
  481.             if ($OrderItem->getDeliveryPeriod()) {
  482.                 $DeliveryPeriodArr[] = $OrderItem->getDeliveryPeriod()->getDeliveryPeriodId();
  483.             }
  484.             if (!empty($OrderItem->getSetProductClass())) {
  485.                 $setProductClassArr[$OrderItem->getId()] = $this->orderItemRepository->getSetProductClass($OrderItem);
  486.             }
  487.         }
  488.         $DeliveryPeriodArr array_unique($DeliveryPeriodArr);
  489.         $DeliveryPeriodTotalArr = array();
  490.         $delivery_fee_total $TargetOrder->getDeliveryFeeTotal();
  491.         $shipping count($DeliveryPeriodArr) ? $delivery_fee_total count($DeliveryPeriodArr) : $delivery_fee_total;
  492.         $orderDeliveryPeriods = [];
  493.         foreach ($TargetOrder->getOrderItems() as $OrderDetail) {
  494.             if ($OrderDetail->getDeliveryPeriod()) {
  495.                 $dp_id $OrderDetail->getDeliveryPeriod()->getDeliveryPeriodId();
  496.                 if (!isset($orderDeliveryPeriods[$dp_id])) {
  497.                     $orderDeliveryPeriods[$dp_id] = $OrderDetail->getDeliveryPeriod();
  498.                 }
  499.             }
  500.         }
  501.         $deliveryPriceTotal 0;
  502.         $deliveryAmountTotal 0;
  503.         $deliveryPriceTotalPer 0;
  504.         $deliveryAmountTotalPer 0;
  505.         $shippings $TargetOrder->getShippings();
  506.         $DeliveryFee $this->deliveryFeeRepository->findOneBy([
  507.             'Delivery' => $shippings[0]->getDelivery(),
  508.             'Pref' => $shippings[0]->getPref(),
  509.         ]);
  510.         $shipping is_object($DeliveryFee) ? $DeliveryFee->getFee() : 0;
  511.         $school $TargetOrder->getCustomer()->getSchool();
  512.         $perDeliveryPeriodPrice = [];
  513.         foreach ($orderDeliveryPeriods as $DeliveryPeriod) {
  514.             // 配送時期ごとに金額を計算
  515.             foreach ($TargetOrder->getOrderItems() as $OrderDetail) {
  516.                 if ($OrderDetail->getDeliveryPeriod() && $OrderDetail->getDeliveryPeriod()->getDeliveryPeriodId() ==  $DeliveryPeriod->getDeliveryPeriodId()) {
  517.                     // 合計金額
  518.                     $deliveryPriceTotal += $OrderDetail->getPriceIncTax() * $OrderDetail->getQuantity();
  519.                     // 総量
  520.                     $deliveryAmountTotal += $OrderDetail->getQuantity();
  521.                     // 合計金額
  522.                     $deliveryPriceTotalPer += $OrderDetail->getPriceIncTax() * $OrderDetail->getQuantity();
  523.                     // 総量
  524.                     $deliveryAmountTotalPer += $OrderDetail->getQuantity();
  525.                 }
  526.             }
  527.             if (!$shippings[0]->getDelivery()->getPostPayFlg() && $school['delivery_free_type'] === 2) {
  528.                 // 配送無料条件が配送ごと
  529.                 if ($DeliveryPeriod['delivery_free_amount'] <= $deliveryPriceTotalPer || $DeliveryPeriod['delivery_free_quantity'] <= $deliveryAmountTotalPer) {
  530.                     $deliveryFeeTotal 0;
  531.                 } else {
  532.                     $deliveryFeeTotal $shipping;
  533.                 }
  534.             } else if (!$shippings[0]->getDelivery()->getPostPayFlg() && $school['delivery_free_type'] === 1) {
  535.                 // 配送無料条件が決済ごと
  536.                 if ($school['delivery_free_amount'] <= $deliveryPriceTotal || $school['delivery_free_quantity'] <= $deliveryAmountTotal) {
  537.                     $deliveryFeeTotal 0;
  538.                 } else {
  539.                     $deliveryFeeTotal $shipping;
  540.                 }
  541.             } else {
  542.                 $deliveryFeeTotal $shipping;
  543.             }
  544.             $perDeliveryPeriodPrice[$DeliveryPeriod->getDeliveryPeriodId()] = $deliveryFeeTotal;
  545.             $deliveryPriceTotalPer 0;
  546.             $deliveryAmountTotalPer 0;
  547.         }
  548.         foreach ($DeliveryPeriodArr as $DeliveryPeriodId) {
  549.             $delivery_period_total['delivery_fee'] = $perDeliveryPeriodPrice[$DeliveryPeriodId];
  550.             $DeliveryPeriodTotalArr[$DeliveryPeriodId] = $delivery_period_total;
  551.         }
  552.         $OrderDeliveryPeriod $this->orderDeliveryPeriodRepository->findBy(['Order' => $TargetOrder]);
  553.         $arr_order_delivery_period = [];
  554.         foreach ($OrderDeliveryPeriod as $odp) {
  555.             $arr_order_delivery_period[$odp->getDeliveryPeriod()->getDeliveryPeriodId()] = $odp->getFee();
  556.         }
  557.         return [
  558.             'form' => $form->createView(),
  559.             'searchCustomerModalForm' => $searchCustomerModalForm->createView(),
  560.             'searchProductModalForm' => $searchProductModalForm->createView(),
  561.             'Order' => $TargetOrder,
  562.             'id' => $id,
  563.             'shippingDeliveryTimes' => $this->serializer->serialize($times'json'),
  564.             'delivery_period' => $deliveries,
  565.             'delivery_period_total' => $DeliveryPeriodTotalArr,
  566.             'OrderSetProductClass' => $setProductClassArr,
  567.             'OrderDeliveryPeriod' => $arr_order_delivery_period
  568.         ];
  569.     }
  570.     /**
  571.      * 顧客情報を検索する.
  572.      *
  573.      * @Route("/%eccube_admin_route%/order/search/customer/html", name="admin_order_search_customer_html", methods={"GET", "POST"})
  574.      * @Route("/%eccube_admin_route%/order/search/customer/html/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_order_search_customer_html_page", methods={"GET", "POST"})
  575.      * @Template("@admin/Order/search_customer.twig")
  576.      *
  577.      * @param Request $request
  578.      * @param integer $page_no
  579.      *
  580.      * @return array
  581.      */
  582.     public function searchCustomerHtml(Request $requestPaginatorInterface $paginator$page_no null)
  583.     {
  584.         if ($request->isXmlHttpRequest() && $this->isTokenValid()) {
  585.             log_debug('search customer start.');
  586.             $page_count $this->eccubeConfig['eccube_default_page_count'];
  587.             $session $this->session;
  588.             if ('POST' === $request->getMethod()) {
  589.                 $page_no 1;
  590.                 $searchData = [
  591.                     'multi' => $request->get('search_word'),
  592.                     'customer_status' => [
  593.                         CustomerStatus::REGULAR,
  594.                     ],
  595.                 ];
  596.                 $session->set('eccube.admin.order.customer.search'$searchData);
  597.                 $session->set('eccube.admin.order.customer.search.page_no'$page_no);
  598.             } else {
  599.                 $searchData = (array) $session->get('eccube.admin.order.customer.search');
  600.                 if (is_null($page_no)) {
  601.                     $page_no intval($session->get('eccube.admin.order.customer.search.page_no'));
  602.                 } else {
  603.                     $session->set('eccube.admin.order.customer.search.page_no'$page_no);
  604.                 }
  605.             }
  606.             $qb $this->customerRepository->getQueryBuilderBySearchData($searchData);
  607.             $event = new EventArgs(
  608.                 [
  609.                     'qb' => $qb,
  610.                     'data' => $searchData,
  611.                 ],
  612.                 $request
  613.             );
  614.             $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_SEARCH);
  615.             /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */
  616.             $pagination $paginator->paginate(
  617.                 $qb,
  618.                 $page_no,
  619.                 $page_count,
  620.                 ['wrap-queries' => true]
  621.             );
  622.             /** @var $Customers \Eccube\Entity\Customer[] */
  623.             $Customers $pagination->getItems();
  624.             if (empty($Customers)) {
  625.                 log_debug('search customer not found.');
  626.             }
  627.             $data = [];
  628.             $formatName '%s%s(%s%s)';
  629.             foreach ($Customers as $Customer) {
  630.                 $data[] = [
  631.                     'id' => $Customer->getId(),
  632.                     'name' => sprintf(
  633.                         $formatName,
  634.                         $Customer->getName01(),
  635.                         $Customer->getName02(),
  636.                         $Customer->getKana01(),
  637.                         $Customer->getKana02()
  638.                     ),
  639.                     'phone_number' => $Customer->getPhoneNumber(),
  640.                     'email' => $Customer->getEmail(),
  641.                 ];
  642.             }
  643.             $event = new EventArgs(
  644.                 [
  645.                     'data' => $data,
  646.                     'Customers' => $pagination,
  647.                 ],
  648.                 $request
  649.             );
  650.             $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_COMPLETE);
  651.             $data $event->getArgument('data');
  652.             return [
  653.                 'data' => $data,
  654.                 'pagination' => $pagination,
  655.             ];
  656.         }
  657.         throw new BadRequestHttpException();
  658.     }
  659.     /**
  660.      * 顧客情報を検索する.
  661.      *
  662.      * @Route("/%eccube_admin_route%/order/search/customer/id", name="admin_order_search_customer_by_id", methods={"POST"})
  663.      *
  664.      * @param Request $request
  665.      *
  666.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  667.      */
  668.     public function searchCustomerById(Request $request)
  669.     {
  670.         if ($request->isXmlHttpRequest() && $this->isTokenValid()) {
  671.             log_debug('search customer by id start.');
  672.             /** @var $Customer \Eccube\Entity\Customer */
  673.             $Customer $this->customerRepository
  674.                 ->find($request->get('id'));
  675.             $event = new EventArgs(
  676.                 [
  677.                     'Customer' => $Customer,
  678.                 ],
  679.                 $request
  680.             );
  681.             $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_INITIALIZE);
  682.             if (is_null($Customer)) {
  683.                 log_debug('search customer by id not found.');
  684.                 return $this->json([], 404);
  685.             }
  686.             log_debug('search customer by id found.');
  687.             $data = [
  688.                 'id' => $Customer->getId(),
  689.                 'name01' => $Customer->getName01(),
  690.                 'name02' => $Customer->getName02(),
  691.                 'kana01' => $Customer->getKana01(),
  692.                 'kana02' => $Customer->getKana02(),
  693.                 'postal_code' => $Customer->getPostalCode(),
  694.                 'pref' => is_null($Customer->getPref()) ? null $Customer->getPref()->getId(),
  695.                 'addr01' => $Customer->getAddr01(),
  696.                 'addr02' => $Customer->getAddr02(),
  697.                 'email' => $Customer->getEmail(),
  698.                 'phone_number' => $Customer->getPhoneNumber(),
  699.                 'company_name' => $Customer->getCompanyName(),
  700.                 'school' => $Customer->getSchool()->getSchoolId(),
  701.             ];
  702.             $event = new EventArgs(
  703.                 [
  704.                     'data' => $data,
  705.                     'Customer' => $Customer,
  706.                 ],
  707.                 $request
  708.             );
  709.             $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_COMPLETE);
  710.             $data $event->getArgument('data');
  711.             return $this->json($data);
  712.         }
  713.         throw new BadRequestHttpException();
  714.     }
  715.     /**
  716.      * @Route("/%eccube_admin_route%/order/search/product", name="admin_order_search_product", methods={"GET", "POST"})
  717.      * @Route("/%eccube_admin_route%/order/search/product/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_order_search_product_page", methods={"GET", "POST"})
  718.      * @Template("@admin/Order/search_product.twig")
  719.      */
  720.     public function searchProduct(Request $requestPaginatorInterface $paginator$page_no null)
  721.     {
  722.         if ($request->isXmlHttpRequest() && $this->isTokenValid()) {
  723.             log_debug('search product start.');
  724.             $page_count $this->eccubeConfig['eccube_default_page_count'];
  725.             $session $this->session;
  726.             $Order null;
  727.             if ('POST' === $request->getMethod()) {
  728.                 $page_no 1;
  729.                 $order_id $request->get('order_id');
  730.                 if ($order_id) {
  731.                     $Order $this->orderRepository->find($order_id);
  732.                 }
  733.                 if ($order_id == 0) {
  734.                     $customer_id 0;
  735.                     if ($this->session->get('customer_id')) {
  736.                         $customer_id $this->session->get('customer_id');
  737.                     } else {
  738.                         $customer_id $request->get('customer_id');
  739.                         $this->session->set('customer_id'$customer_id);
  740.                     }
  741.                     $Customer $this->customerRepository->find($customer_id);
  742.                     $Order = new Order();
  743.                     $Order->setCustomer($Customer);
  744.                 }
  745.                 $searchData = [
  746.                     'id' => $request->get('id'),
  747.                 ];
  748.                 if ($categoryId $request->get('category_id')) {
  749.                     $Category $this->categoryRepository->find($categoryId);
  750.                     $searchData['category_id'] = $Category;
  751.                 }
  752.                 $session->set('eccube.admin.order.product.search'$searchData);
  753.                 $session->set('eccube.admin.order.product.search.page_no'$page_no);
  754.             } else {
  755.                 $searchData = (array) $session->get('eccube.admin.order.product.search');
  756.                 if (is_null($page_no)) {
  757.                     $page_no intval($session->get('eccube.admin.order.product.search.page_no'));
  758.                 } else {
  759.                     $session->set('eccube.admin.order.product.search.page_no'$page_no);
  760.                 }
  761.             }
  762.             $qb $this->productRepository
  763.                 ->getQueryBuilderBySearchDataForAdmin($searchData);
  764.             $event = new EventArgs(
  765.                 [
  766.                     'qb' => $qb,
  767.                     'searchData' => $searchData,
  768.                 ],
  769.                 $request
  770.             );
  771.             $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_SEARCH);
  772.             /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */
  773.             $pagination $paginator->paginate(
  774.                 $qb,
  775.                 $page_no,
  776.                 $page_count,
  777.                 ['wrap-queries' => true]
  778.             );
  779.             /** @var $Products \Eccube\Entity\Product[] */
  780.             $Products $pagination->getItems();
  781.             if (empty($Products)) {
  782.                 log_debug('search product not found.');
  783.             }
  784.             $forms = [];
  785.             foreach ($Products as $Product) {
  786.                 /* @var $builder \Symfony\Component\Form\FormBuilderInterface */
  787.                 $builder $this->formFactory->createNamedBuilder(''AddCartType::class, null, [
  788.                     'product' => $Product,
  789.                     'order' => $Order
  790.                 ]);
  791.                 $addCartForm $builder->getForm();
  792.                 $forms[$Product->getId()] = $addCartForm->createView();
  793.             }
  794.             $event = new EventArgs(
  795.                 [
  796.                     'forms' => $forms,
  797.                     'Products' => $Products,
  798.                     'pagination' => $pagination,
  799.                 ],
  800.                 $request
  801.             );
  802.             $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_COMPLETE);
  803.             return [
  804.                 'forms' => $forms,
  805.                 'Products' => $Products,
  806.                 'pagination' => $pagination,
  807.                 'Order' => $Order
  808.             ];
  809.         }
  810.     }
  811.     /**
  812.      * その他明細情報を取得
  813.      *
  814.      * @Route("/%eccube_admin_route%/order/search/order_item_type", name="admin_order_search_order_item_type", methods={"POST"})
  815.      * @Template("@admin/Order/order_item_type.twig")
  816.      *
  817.      * @param Request $request
  818.      *
  819.      * @return array
  820.      */
  821.     public function searchOrderItemType(Request $request)
  822.     {
  823.         if ($request->isXmlHttpRequest() && $this->isTokenValid()) {
  824.             log_debug('search order item type start.');
  825.             $Charge $this->entityManager->find(OrderItemType::class, OrderItemType::CHARGE);
  826.             $DeliveryFee $this->entityManager->find(OrderItemType::class, OrderItemType::DELIVERY_FEE);
  827.             $Discount $this->entityManager->find(OrderItemType::class, OrderItemType::DISCOUNT);
  828.             $NonTaxable $this->entityManager->find(TaxType::class, TaxType::NON_TAXABLE);
  829.             $Taxation $this->entityManager->find(TaxType::class, TaxType::TAXATION);
  830.             $OrderItemTypes = [
  831.                 ['OrderItemType' => $Charge'TaxType' => $Taxation],
  832.                 ['OrderItemType' => $DeliveryFee'TaxType' => $Taxation],
  833.                 ['OrderItemType' => $Discount'TaxType' => $Taxation],
  834.                 ['OrderItemType' => $Discount'TaxType' => $NonTaxable],
  835.             ];
  836.             return [
  837.                 'OrderItemTypes' => $OrderItemTypes,
  838.             ];
  839.         }
  840.         throw new BadRequestHttpException();
  841.     }
  842.     /**
  843.      *
  844.      * @Route("/%eccube_admin_route%/order/update_stocking_date/{order_id}", name="admin_order_update_stocking_date", methods={"POST"})
  845.      *
  846.      * @param Request $request
  847.      *
  848.      * @return array
  849.      */
  850.     public function updateStockingDate(Request $request$order_id)
  851.     {
  852.         if ($request->isXmlHttpRequest()) {
  853.             $stocking_date $request->get('stocking_date'null);
  854.             $order $this->orderRepository->find($order_id);
  855.             if ($stocking_date) {
  856.                 $sdate = new \DateTime($stocking_date);
  857.                 $order->setStockingDate($sdate);
  858.                 $this->entityManager->persist($order);
  859.                 $this->entityManager->flush();
  860.             }
  861.             return $this->json(['done' => true]);
  862.         }
  863.         return $this->json(['done' => false]);
  864.     }
  865.     /**
  866.      *
  867.      * @Route("/%eccube_admin_route%/order/get_stocking_date/{order_id}", name="admin_order_get_stocking_date", methods={"GET"})
  868.      *
  869.      * @param Request $request
  870.      *
  871.      * @return array
  872.      */
  873.     public function getStockingDate(Request $request$order_id)
  874.     {
  875.         if ($request->isXmlHttpRequest()) {
  876.             $order $this->orderRepository->find($order_id);
  877.             return $this->json(['done' => true'stocking_date' => $order->getStockingDate()->format('Y-m-d')]);
  878.         }
  879.         return $this->json(['done' => false'stocking_date' => null]);
  880.     }
  881.     /**
  882.      *
  883.      * @Route("/%eccube_admin_route%/order/get_classcategory2", name="admin_order_get_classcategory2", methods={"POST"})
  884.      *
  885.      * @param Request $request
  886.      *
  887.      * @return array
  888.      */
  889.     public function getClassCategory2(Request $request)
  890.     {
  891.         if ($request->isXmlHttpRequest()) {
  892.             $product_id $request->get('product_id'null);
  893.             $classcategory1 $request->get('classcategory1'null);
  894.             if ($product_id && $classcategory1) {
  895.                 $Product $this->productRepository->find($product_id);
  896.                 return $this->json(['done' => true'classcategory2' => $Product->getClassCategories2($classcategory1)]);
  897.             }
  898.         }
  899.         return $this->json(['done' => false'classcategory2' => null]);
  900.     }
  901. }