src/Eccube/Controller/Admin/Order/EditController.php line 184

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 Eccube\Controller\Admin\Order;
  13. use Doctrine\Common\Collections\ArrayCollection;
  14. use Doctrine\Common\Collections\Criteria;
  15. use Eccube\Controller\AbstractController;
  16. use Eccube\Entity\Master\CustomerStatus;
  17. use Eccube\Entity\Master\OrderItemType;
  18. use Eccube\Entity\Master\OrderStatus;
  19. use Eccube\Entity\Master\TaxType;
  20. use Eccube\Entity\Order;
  21. use Eccube\Entity\Shipping;
  22. use Eccube\Event\EccubeEvents;
  23. use Eccube\Event\EventArgs;
  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\Paginator;
  44. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  45. use Symfony\Component\HttpFoundation\Request;
  46. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  47. use Symfony\Component\Routing\Annotation\Route;
  48. use Symfony\Component\Routing\RouterInterface;
  49. use Symfony\Component\Serializer\Serializer;
  50. use Symfony\Component\Serializer\SerializerInterface;
  51. class EditController extends AbstractController
  52. {
  53.     /**
  54.      * @var TaxRuleService
  55.      */
  56.     protected $taxRuleService;
  57.     /**
  58.      * @var DeviceTypeRepository
  59.      */
  60.     protected $deviceTypeRepository;
  61.     /**
  62.      * @var ProductRepository
  63.      */
  64.     protected $productRepository;
  65.     /**
  66.      * @var CategoryRepository
  67.      */
  68.     protected $categoryRepository;
  69.     /**
  70.      * @var CustomerRepository
  71.      */
  72.     protected $customerRepository;
  73.     /**
  74.      * @var Serializer
  75.      */
  76.     protected $serializer;
  77.     /**
  78.      * @var DeliveryRepository
  79.      */
  80.     protected $deliveryRepository;
  81.     /**
  82.      * @var PurchaseFlow
  83.      */
  84.     protected $purchaseFlow;
  85.     /**
  86.      * @var OrderRepository
  87.      */
  88.     protected $orderRepository;
  89.     /**
  90.      * @var OrderNoProcessor
  91.      */
  92.     protected $orderNoProcessor;
  93.     /**
  94.      * @var OrderItemTypeRepository
  95.      */
  96.     protected $orderItemTypeRepository;
  97.     /**
  98.      * @var OrderStateMachine
  99.      */
  100.     protected $orderStateMachine;
  101.     /**
  102.      * @var OrderStatusRepository
  103.      */
  104.     protected $orderStatusRepository;
  105.     /**
  106.      * @var OrderHelper
  107.      */
  108.     private $orderHelper;
  109.     /**
  110.      * EditController constructor.
  111.      *
  112.      * @param TaxRuleService $taxRuleService
  113.      * @param DeviceTypeRepository $deviceTypeRepository
  114.      * @param ProductRepository $productRepository
  115.      * @param CategoryRepository $categoryRepository
  116.      * @param CustomerRepository $customerRepository
  117.      * @param SerializerInterface $serializer
  118.      * @param DeliveryRepository $deliveryRepository
  119.      * @param PurchaseFlow $orderPurchaseFlow
  120.      * @param OrderRepository $orderRepository
  121.      * @param OrderNoProcessor $orderNoProcessor
  122.      * @param OrderItemTypeRepository $orderItemTypeRepository
  123.      * @param OrderStatusRepository $orderStatusRepository
  124.      * @param OrderStateMachine $orderStateMachine
  125.      * @param OrderHelper $orderHelper
  126.      */
  127.     public function __construct(
  128.         TaxRuleService $taxRuleService,
  129.         DeviceTypeRepository $deviceTypeRepository,
  130.         ProductRepository $productRepository,
  131.         CategoryRepository $categoryRepository,
  132.         CustomerRepository $customerRepository,
  133.         SerializerInterface $serializer,
  134.         DeliveryRepository $deliveryRepository,
  135.         PurchaseFlow $orderPurchaseFlow,
  136.         OrderRepository $orderRepository,
  137.         OrderNoProcessor $orderNoProcessor,
  138.         OrderItemTypeRepository $orderItemTypeRepository,
  139.         OrderStatusRepository $orderStatusRepository,
  140.         OrderStateMachine $orderStateMachine,
  141.         OrderHelper $orderHelper
  142.     ) {
  143.         $this->taxRuleService $taxRuleService;
  144.         $this->deviceTypeRepository $deviceTypeRepository;
  145.         $this->productRepository $productRepository;
  146.         $this->categoryRepository $categoryRepository;
  147.         $this->customerRepository $customerRepository;
  148.         $this->serializer $serializer;
  149.         $this->deliveryRepository $deliveryRepository;
  150.         $this->purchaseFlow $orderPurchaseFlow;
  151.         $this->orderRepository $orderRepository;
  152.         $this->orderNoProcessor $orderNoProcessor;
  153.         $this->orderItemTypeRepository $orderItemTypeRepository;
  154.         $this->orderStatusRepository $orderStatusRepository;
  155.         $this->orderStateMachine $orderStateMachine;
  156.         $this->orderHelper $orderHelper;
  157.     }
  158.     /**
  159.      * 受注登録/編集画面.
  160.      *
  161.      * @Route("/%eccube_admin_route%/order/new", name="admin_order_new")
  162.      * @Route("/%eccube_admin_route%/order/{id}/edit", requirements={"id" = "\d+"}, name="admin_order_edit")
  163.      * @Template("@admin/Order/edit.twig")
  164.      */
  165.     public function index(Request $request$id nullRouterInterface $router)
  166.     {
  167.         $TargetOrder null;
  168.         $OriginOrder null;
  169.         if (null === $id) {
  170.             // 空のエンティティを作成.
  171.             $TargetOrder = new Order();
  172.             $TargetOrder->addShipping((new Shipping())->setOrder($TargetOrder));
  173.             $preOrderId $this->orderHelper->createPreOrderId();
  174.             $TargetOrder->setPreOrderId($preOrderId);
  175.         } else {
  176.             $TargetOrder $this->orderRepository->find($id);
  177.             if (null === $TargetOrder) {
  178.                 throw new NotFoundHttpException();
  179.             }
  180.         }
  181.         // 編集前の受注情報を保持
  182.         $OriginOrder = clone $TargetOrder;
  183.         $OriginItems = new ArrayCollection();
  184.         foreach ($TargetOrder->getOrderItems() as $Item) {
  185.             $OriginItems->add($Item);
  186.         }
  187.         $builder $this->formFactory->createBuilder(OrderType::class, $TargetOrder);
  188.         $event = new EventArgs(
  189.             [
  190.                 'builder' => $builder,
  191.                 'OriginOrder' => $OriginOrder,
  192.                 'TargetOrder' => $TargetOrder,
  193.             ],
  194.             $request
  195.         );
  196.         $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_INITIALIZE$event);
  197.         $form $builder->getForm();
  198.         $form->handleRequest($request);
  199.         $purchaseContext = new PurchaseContext($OriginOrder$OriginOrder->getCustomer());
  200.         if ($form->isSubmitted() && $form['OrderItems']->isValid()) {
  201.             $event = new EventArgs(
  202.                 [
  203.                     'builder' => $builder,
  204.                     'OriginOrder' => $OriginOrder,
  205.                     'TargetOrder' => $TargetOrder,
  206.                     'PurchaseContext' => $purchaseContext,
  207.                 ],
  208.                 $request
  209.             );
  210.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_PROGRESS$event);
  211.             $flowResult $this->purchaseFlow->validate($TargetOrder$purchaseContext);
  212.             if ($flowResult->hasWarning()) {
  213.                 foreach ($flowResult->getWarning() as $warning) {
  214.                     $this->addWarning($warning->getMessage(), 'admin');
  215.                 }
  216.             }
  217.             if ($flowResult->hasError()) {
  218.                 foreach ($flowResult->getErrors() as $error) {
  219.                     $this->addError($error->getMessage(), 'admin');
  220.                 }
  221.             }
  222.             // 登録ボタン押下
  223.             switch ($request->get('mode')) {
  224.                 case 'register':
  225.                     log_info('受注登録開始', [$TargetOrder->getId()]);
  226.                     if (!$flowResult->hasError() && $form->isValid()) {
  227.                         try {
  228.                             $this->purchaseFlow->prepare($TargetOrder$purchaseContext);
  229.                             $this->purchaseFlow->commit($TargetOrder$purchaseContext);
  230.                         } catch (PurchaseException $e) {
  231.                             $this->addError($e->getMessage(), 'admin');
  232.                             break;
  233.                         }
  234.                         $OldStatus $OriginOrder->getOrderStatus();
  235.                         $NewStatus $TargetOrder->getOrderStatus();
  236.                         // ステータスが変更されている場合はステートマシンを実行.
  237.                         if ($TargetOrder->getId() && $OldStatus->getId() != $NewStatus->getId()) {
  238.                             // 発送済に変更された場合は, 発送日をセットする.
  239.                             if ($NewStatus->getId() == OrderStatus::DELIVERED) {
  240.                                 $TargetOrder->getShippings()->map(function (Shipping $Shipping) {
  241.                                     if (!$Shipping->isShipped()) {
  242.                                         $Shipping->setShippingDate(new \DateTime());
  243.                                     }
  244.                                 });
  245.                             }
  246.                             // ステートマシンでステータスは更新されるので, 古いステータスに戻す.
  247.                             $TargetOrder->setOrderStatus($OldStatus);
  248.                             // FormTypeでステータスの遷移チェックは行っているのでapplyのみ実行.
  249.                             $this->orderStateMachine->apply($TargetOrder$NewStatus);
  250.                         }
  251.                         $this->entityManager->persist($TargetOrder);
  252.                         $this->entityManager->flush();
  253.                         foreach ($OriginItems as $Item) {
  254.                             if ($TargetOrder->getOrderItems()->contains($Item) === false) {
  255.                                 $this->entityManager->remove($Item);
  256.                             }
  257.                         }
  258.                         $this->entityManager->flush();
  259.                         // 新規登録時はMySQL対応のためflushしてから採番
  260.                         $this->orderNoProcessor->process($TargetOrder$purchaseContext);
  261.                         $this->entityManager->flush();
  262.                         // 会員の場合、購入回数、購入金額などを更新
  263.                         if ($Customer $TargetOrder->getCustomer()) {
  264.                             $this->orderRepository->updateOrderSummary($Customer);
  265.                             $this->entityManager->flush($Customer);
  266.                         }
  267.                         $event = new EventArgs(
  268.                             [
  269.                                 'form' => $form,
  270.                                 'OriginOrder' => $OriginOrder,
  271.                                 'TargetOrder' => $TargetOrder,
  272.                                 'Customer' => $Customer,
  273.                             ],
  274.                             $request
  275.                         );
  276.                         $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_COMPLETE$event);
  277.                         $this->addSuccess('admin.common.save_complete''admin');
  278.                         log_info('受注登録完了', [$TargetOrder->getId()]);
  279.                         if ($returnLink $form->get('return_link')->getData()) {
  280.                             try {
  281.                                 // $returnLinkはpathの形式で渡される. pathが存在するかをルータでチェックする.
  282.                                 $pattern '/^'.preg_quote($request->getBasePath(), '/').'/';
  283.                                 $returnLink preg_replace($pattern''$returnLink);
  284.                                 $result $router->match($returnLink);
  285.                                 // パラメータのみ抽出
  286.                                 $params array_filter($result, function ($key) {
  287.                                     return !== \strpos($key'_');
  288.                                 }, ARRAY_FILTER_USE_KEY);
  289.                                 // pathからurlを再構築してリダイレクト.
  290.                                 return $this->redirectToRoute($result['_route'], $params);
  291.                             } catch (\Exception $e) {
  292.                                 // マッチしない場合はログ出力してスキップ.
  293.                                 log_warning('URLの形式が不正です。');
  294.                             }
  295.                         }
  296.                         return $this->redirectToRoute('admin_order_edit', ['id' => $TargetOrder->getId()]);
  297.                     }
  298.                     break;
  299.                 default:
  300.                     break;
  301.             }
  302.         }
  303.         // 会員検索フォーム
  304.         $builder $this->formFactory
  305.             ->createBuilder(SearchCustomerType::class);
  306.         $event = new EventArgs(
  307.             [
  308.                 'builder' => $builder,
  309.                 'OriginOrder' => $OriginOrder,
  310.                 'TargetOrder' => $TargetOrder,
  311.             ],
  312.             $request
  313.         );
  314.         $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_INITIALIZE$event);
  315.         $searchCustomerModalForm $builder->getForm();
  316.         // 商品検索フォーム
  317.         $builder $this->formFactory
  318.             ->createBuilder(SearchProductType::class);
  319.         $event = new EventArgs(
  320.             [
  321.                 'builder' => $builder,
  322.                 'OriginOrder' => $OriginOrder,
  323.                 'TargetOrder' => $TargetOrder,
  324.             ],
  325.             $request
  326.         );
  327.         $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_INITIALIZE$event);
  328.         $searchProductModalForm $builder->getForm();
  329.         // 配送業者のお届け時間
  330.         $times = [];
  331.         $deliveries $this->deliveryRepository->findAll();
  332.         foreach ($deliveries as $Delivery) {
  333.             $deliveryTimes $Delivery->getDeliveryTimes();
  334.             foreach ($deliveryTimes as $DeliveryTime) {
  335.                 $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime();
  336.             }
  337.         }
  338.         return [
  339.             'form' => $form->createView(),
  340.             'searchCustomerModalForm' => $searchCustomerModalForm->createView(),
  341.             'searchProductModalForm' => $searchProductModalForm->createView(),
  342.             'Order' => $TargetOrder,
  343.             'id' => $id,
  344.             'shippingDeliveryTimes' => $this->serializer->serialize($times'json'),
  345.         ];
  346.     }
  347.     /**
  348.      * 顧客情報を検索する.
  349.      *
  350.      * @Route("/%eccube_admin_route%/order/search/customer/html", name="admin_order_search_customer_html")
  351.      * @Route("/%eccube_admin_route%/order/search/customer/html/page/{page_no}", requirements={"page_No" = "\d+"}, name="admin_order_search_customer_html_page")
  352.      * @Template("@admin/Order/search_customer.twig")
  353.      *
  354.      * @param Request $request
  355.      * @param integer $page_no
  356.      *
  357.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  358.      */
  359.     public function searchCustomerHtml(Request $request$page_no nullPaginator $paginator)
  360.     {
  361.         if ($request->isXmlHttpRequest() && $this->isTokenValid()) {
  362.             log_debug('search customer start.');
  363.             $page_count $this->eccubeConfig['eccube_default_page_count'];
  364.             $session $this->session;
  365.             if ('POST' === $request->getMethod()) {
  366.                 $page_no 1;
  367.                 $searchData = [
  368.                     'multi' => $request->get('search_word'),
  369.                     'customer_status' => [
  370.                         CustomerStatus::REGULAR,
  371.                     ],
  372.                 ];
  373.                 $session->set('eccube.admin.order.customer.search'$searchData);
  374.                 $session->set('eccube.admin.order.customer.search.page_no'$page_no);
  375.             } else {
  376.                 $searchData = (array) $session->get('eccube.admin.order.customer.search');
  377.                 if (is_null($page_no)) {
  378.                     $page_no intval($session->get('eccube.admin.order.customer.search.page_no'));
  379.                 } else {
  380.                     $session->set('eccube.admin.order.customer.search.page_no'$page_no);
  381.                 }
  382.             }
  383.             $qb $this->customerRepository->getQueryBuilderBySearchData($searchData);
  384.             $event = new EventArgs(
  385.                 [
  386.                     'qb' => $qb,
  387.                     'data' => $searchData,
  388.                 ],
  389.                 $request
  390.             );
  391.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_SEARCH$event);
  392.             /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */
  393.             $pagination $paginator->paginate(
  394.                 $qb,
  395.                 $page_no,
  396.                 $page_count,
  397.                 ['wrap-queries' => true]
  398.             );
  399.             /** @var $Customers \Eccube\Entity\Customer[] */
  400.             $Customers $pagination->getItems();
  401.             if (empty($Customers)) {
  402.                 log_debug('search customer not found.');
  403.             }
  404.             $data = [];
  405.             $formatName '%s%s(%s%s)';
  406.             foreach ($Customers as $Customer) {
  407.                 $data[] = [
  408.                     'id' => $Customer->getId(),
  409.                     'name' => sprintf($formatName$Customer->getName01(), $Customer->getName02(),
  410.                         $Customer->getKana01(),
  411.                         $Customer->getKana02()),
  412.                     'phone_number' => $Customer->getPhoneNumber(),
  413.                     'email' => $Customer->getEmail(),
  414.                 ];
  415.             }
  416.             $event = new EventArgs(
  417.                 [
  418.                     'data' => $data,
  419.                     'Customers' => $pagination,
  420.                 ],
  421.                 $request
  422.             );
  423.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_COMPLETE$event);
  424.             $data $event->getArgument('data');
  425.             return [
  426.                 'data' => $data,
  427.                 'pagination' => $pagination,
  428.             ];
  429.         }
  430.     }
  431.     /**
  432.      * 顧客情報を検索する.
  433.      *
  434.      * @Route("/%eccube_admin_route%/order/search/customer/id", name="admin_order_search_customer_by_id", methods={"POST"})
  435.      *
  436.      * @param Request $request
  437.      *
  438.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  439.      */
  440.     public function searchCustomerById(Request $request)
  441.     {
  442.         if ($request->isXmlHttpRequest() && $this->isTokenValid()) {
  443.             log_debug('search customer by id start.');
  444.             /** @var $Customer \Eccube\Entity\Customer */
  445.             $Customer $this->customerRepository
  446.                 ->find($request->get('id'));
  447.             $event = new EventArgs(
  448.                 [
  449.                     'Customer' => $Customer,
  450.                 ],
  451.                 $request
  452.             );
  453.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_INITIALIZE$event);
  454.             if (is_null($Customer)) {
  455.                 log_debug('search customer by id not found.');
  456.                 return $this->json([], 404);
  457.             }
  458.             log_debug('search customer by id found.');
  459.             $data = [
  460.                 'id' => $Customer->getId(),
  461.                 'name01' => $Customer->getName01(),
  462.                 'name02' => $Customer->getName02(),
  463.                 'kana01' => $Customer->getKana01(),
  464.                 'kana02' => $Customer->getKana02(),
  465.                 'postal_code' => $Customer->getPostalCode(),
  466.                 'pref' => is_null($Customer->getPref()) ? null $Customer->getPref()->getId(),
  467.                 'addr01' => $Customer->getAddr01(),
  468.                 'addr02' => $Customer->getAddr02(),
  469.                 'email' => $Customer->getEmail(),
  470.                 'phone_number' => $Customer->getPhoneNumber(),
  471.                 'company_name' => $Customer->getCompanyName(),
  472.             ];
  473.             $event = new EventArgs(
  474.                 [
  475.                     'data' => $data,
  476.                     'Customer' => $Customer,
  477.                 ],
  478.                 $request
  479.             );
  480.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_COMPLETE$event);
  481.             $data $event->getArgument('data');
  482.             return $this->json($data);
  483.         }
  484.     }
  485.     /**
  486.      * @Route("/%eccube_admin_route%/order/search/product", name="admin_order_search_product")
  487.      * @Route("/%eccube_admin_route%/order/search/product/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_order_search_product_page")
  488.      * @Template("@admin/Order/search_product.twig")
  489.      */
  490.     public function searchProduct(Request $request$page_no nullPaginator $paginator)
  491.     {
  492.         if ($request->isXmlHttpRequest() && $this->isTokenValid()) {
  493.             log_debug('search product start.');
  494.             $page_count $this->eccubeConfig['eccube_default_page_count'];
  495.             $session $this->session;
  496.             if ('POST' === $request->getMethod()) {
  497.                 $page_no 1;
  498.                 $searchData = [
  499.                     'id' => $request->get('id'),
  500.                 ];
  501.                 if ($categoryId $request->get('category_id')) {
  502.                     $Category $this->categoryRepository->find($categoryId);
  503.                     $searchData['category_id'] = $Category;
  504.                 }
  505.                 $session->set('eccube.admin.order.product.search'$searchData);
  506.                 $session->set('eccube.admin.order.product.search.page_no'$page_no);
  507.             } else {
  508.                 $searchData = (array) $session->get('eccube.admin.order.product.search');
  509.                 if (is_null($page_no)) {
  510.                     $page_no intval($session->get('eccube.admin.order.product.search.page_no'));
  511.                 } else {
  512.                     $session->set('eccube.admin.order.product.search.page_no'$page_no);
  513.                 }
  514.             }
  515.             $qb $this->productRepository
  516.                 ->getQueryBuilderBySearchDataForAdmin($searchData);
  517.             $event = new EventArgs(
  518.                 [
  519.                     'qb' => $qb,
  520.                     'searchData' => $searchData,
  521.                 ],
  522.                 $request
  523.             );
  524.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_SEARCH$event);
  525.             /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */
  526.             $pagination $paginator->paginate(
  527.                 $qb,
  528.                 $page_no,
  529.                 $page_count,
  530.                 ['wrap-queries' => true]
  531.             );
  532.             /** @var $Products \Eccube\Entity\Product[] */
  533.             $Products $pagination->getItems();
  534.             if (empty($Products)) {
  535.                 log_debug('search product not found.');
  536.             }
  537.             $forms = [];
  538.             foreach ($Products as $Product) {
  539.                 /* @var $builder \Symfony\Component\Form\FormBuilderInterface */
  540.                 $builder $this->formFactory->createNamedBuilder(''AddCartType::class, null, [
  541.                     'product' => $this->productRepository->findWithSortedClassCategories($Product->getId()),
  542.                 ]);
  543.                 $addCartForm $builder->getForm();
  544.                 $forms[$Product->getId()] = $addCartForm->createView();
  545.             }
  546.             $event = new EventArgs(
  547.                 [
  548.                     'forms' => $forms,
  549.                     'Products' => $Products,
  550.                     'pagination' => $pagination,
  551.                 ],
  552.                 $request
  553.             );
  554.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_COMPLETE$event);
  555.             return [
  556.                 'forms' => $forms,
  557.                 'Products' => $Products,
  558.                 'pagination' => $pagination,
  559.             ];
  560.         }
  561.     }
  562.     /**
  563.      * その他明細情報を取得
  564.      *
  565.      * @Route("/%eccube_admin_route%/order/search/order_item_type", name="admin_order_search_order_item_type")
  566.      * @Template("@admin/Order/order_item_type.twig")
  567.      *
  568.      * @param Request $request
  569.      *
  570.      * @return array
  571.      */
  572.     public function searchOrderItemType(Request $request)
  573.     {
  574.         if ($request->isXmlHttpRequest() && $this->isTokenValid()) {
  575.             log_debug('search order item type start.');
  576.             $Charge $this->entityManager->find(OrderItemType::class, OrderItemType::CHARGE);
  577.             $DeliveryFee $this->entityManager->find(OrderItemType::class, OrderItemType::DELIVERY_FEE);
  578.             $Discount $this->entityManager->find(OrderItemType::class, OrderItemType::DISCOUNT);
  579.             $NonTaxable $this->entityManager->find(TaxType::class, TaxType::NON_TAXABLE);
  580.             $Taxation $this->entityManager->find(TaxType::class, TaxType::TAXATION);
  581.             $OrderItemTypes = [
  582.                 ['OrderItemType' => $Charge'TaxType' => $Taxation],
  583.                 ['OrderItemType' => $DeliveryFee'TaxType' => $Taxation],
  584.                 ['OrderItemType' => $Discount'TaxType' => $Taxation],
  585.                 ['OrderItemType' => $Discount'TaxType' => $NonTaxable]
  586.             ];
  587.             return [
  588.                 'OrderItemTypes' => $OrderItemTypes,
  589.             ];
  590.         }
  591.     }
  592. }