app/Customize/Controller/Admin/Order/OrderController.php line 291

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 Eccube\Common\Constant;
  14. use Eccube\Controller\AbstractController;
  15. use Eccube\Entity\ExportCsvRow;
  16. use Eccube\Entity\Master\CsvType;
  17. use Eccube\Entity\Master\OrderStatus;
  18. use Eccube\Entity\OrderPdf;
  19. use Eccube\Entity\Shipping;
  20. use Eccube\Event\EccubeEvents;
  21. use Eccube\Event\EventArgs;
  22. use Eccube\Form\Type\Admin\OrderPdfType;
  23. use Eccube\Form\Type\Admin\SearchOrderType;
  24. use Eccube\Repository\CustomerRepository;
  25. use Eccube\Repository\Master\OrderStatusRepository;
  26. use Eccube\Repository\Master\PageMaxRepository;
  27. use Eccube\Repository\Master\ProductStatusRepository;
  28. use Eccube\Repository\Master\SexRepository;
  29. use Eccube\Repository\OrderPdfRepository;
  30. use Eccube\Repository\OrderRepository;
  31. use Eccube\Repository\ShippingRepository;
  32. use Eccube\Repository\PaymentRepository;
  33. use Eccube\Repository\ProductStockRepository;
  34. use Eccube\Service\CsvExportService;
  35. use Customize\Service\MailService;
  36. use Eccube\Service\OrderPdfService;
  37. use Eccube\Service\OrderStateMachine;
  38. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  39. use Eccube\Util\FormUtil;
  40. use Knp\Component\Pager\PaginatorInterface;
  41. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  42. use Symfony\Component\Form\FormBuilder;
  43. use Symfony\Component\HttpFoundation\RedirectResponse;
  44. use Symfony\Component\HttpFoundation\Request;
  45. use Symfony\Component\HttpFoundation\Response;
  46. use Symfony\Component\HttpFoundation\StreamedResponse;
  47. use Symfony\Component\Routing\Annotation\Route;
  48. use Symfony\Component\Validator\Constraints as Assert;
  49. use Symfony\Component\Validator\Validator\ValidatorInterface;
  50. use Customize\Repository\SetProductRepository;
  51. use Eccube\Repository\ProductClassRepository;
  52. use Eccube\Entity\OrderItem;
  53. use Customize\Form\Type\Admin\CustomOrderMailType;
  54. use Eccube\Repository\MailTemplateRepository;
  55. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  56. use Customize\Repository\Master\CsvTypeCustomRepository;
  57. use Customize\Repository\CsvCustomRepository;
  58. use Eccube\Repository\Master\CsvTypeRepository;
  59. use Eccube\Repository\CsvRepository;
  60. use Customize\Entity\CsvCustom;
  61. class OrderController extends AbstractController
  62. {
  63.     /**
  64.      * @var PurchaseFlow
  65.      */
  66.     protected $purchaseFlow;
  67.     /**
  68.      * @var CsvExportService
  69.      */
  70.     protected $csvExportService;
  71.     /**
  72.      * @var CustomerRepository
  73.      */
  74.     protected $customerRepository;
  75.     /**
  76.      * @var PaymentRepository
  77.      */
  78.     protected $paymentRepository;
  79.     /**
  80.      * @var SexRepository
  81.      */
  82.     protected $sexRepository;
  83.     /**
  84.      * @var OrderStatusRepository
  85.      */
  86.     protected $orderStatusRepository;
  87.     /**
  88.      * @var PageMaxRepository
  89.      */
  90.     protected $pageMaxRepository;
  91.     /**
  92.      * @var ProductStatusRepository
  93.      */
  94.     protected $productStatusRepository;
  95.     /**
  96.      * @var OrderRepository
  97.      */
  98.     protected $orderRepository;
  99.     /** @var OrderPdfRepository */
  100.     protected $orderPdfRepository;
  101.     /**
  102.      * @var ProductStockRepository
  103.      */
  104.     protected $productStockRepository;
  105.     /** @var OrderPdfService */
  106.     protected $orderPdfService;
  107.     /**
  108.      * @var ValidatorInterface
  109.      */
  110.     protected $validator;
  111.     /**
  112.      * @var OrderStateMachine
  113.      */
  114.     protected $orderStateMachine;
  115.     /**
  116.      * @var MailService
  117.      */
  118.     protected $mailService;
  119.     /**
  120.      * @var SetProductRepository
  121.      */
  122.     protected $setProductRepository;
  123.     /**
  124.      * @var ProductClassRepository
  125.      */
  126.     protected $productClassRepository;
  127.     /**
  128.      * @var MailTemplateRepository
  129.      */
  130.     protected $mailTemplateRepository;
  131.     /**
  132.      * @var ShippingRepository
  133.      */
  134.     protected $shippingRepository;
  135.     /**
  136.      * @var CsvTypeCustomRepository
  137.      */
  138.     protected $csvTypeCustomRepository;
  139.     /**
  140.      * @var CsvCustomRepository
  141.      */
  142.     protected $csvCustomRepository;
  143.     /**
  144.      * @var CsvTypeRepository
  145.      */
  146.     protected $csvTypeRepository;
  147.     /**
  148.      * @var CsvRepository
  149.      */
  150.     protected $csvRepository;
  151.     /**
  152.      * OrderController constructor.
  153.      *
  154.      * @param PurchaseFlow $orderPurchaseFlow
  155.      * @param CsvExportService $csvExportService
  156.      * @param CustomerRepository $customerRepository
  157.      * @param PaymentRepository $paymentRepository
  158.      * @param SexRepository $sexRepository
  159.      * @param OrderStatusRepository $orderStatusRepository
  160.      * @param PageMaxRepository $pageMaxRepository
  161.      * @param ProductStatusRepository $productStatusRepository
  162.      * @param ProductStockRepository $productStockRepository
  163.      * @param OrderRepository $orderRepository
  164.      * @param OrderPdfRepository $orderPdfRepository
  165.      * @param ValidatorInterface $validator
  166.      * @param OrderStateMachine $orderStateMachine
  167.      * @param SetProductRepository $setProductRepository
  168.      * @param ProductClassRepository $productClassRepository
  169.      * @param MailTemplateRepository $mailTemplateRepository
  170.      */
  171.     public function __construct(
  172.         PurchaseFlow $orderPurchaseFlow,
  173.         CsvExportService $csvExportService,
  174.         CustomerRepository $customerRepository,
  175.         PaymentRepository $paymentRepository,
  176.         SexRepository $sexRepository,
  177.         OrderStatusRepository $orderStatusRepository,
  178.         PageMaxRepository $pageMaxRepository,
  179.         ProductStatusRepository $productStatusRepository,
  180.         ProductStockRepository $productStockRepository,
  181.         OrderRepository $orderRepository,
  182.         OrderPdfRepository $orderPdfRepository,
  183.         ValidatorInterface $validator,
  184.         OrderStateMachine $orderStateMachine,
  185.         MailService $mailService,
  186.         SetProductRepository $setProductRepository,
  187.         ProductClassRepository $productClassRepository,
  188.         OrderPdfService $orderPdfService,
  189.         MailTemplateRepository $mailTemplateRepository,
  190.         ShippingRepository $shippingRepository,
  191.         CsvTypeCustomRepository $csvTypeCustomRepository,
  192.         CsvCustomRepository $csvCustomRepository,
  193.         CsvTypeRepository $csvTypeRepository,
  194.         CsvRepository $csvRepository
  195.     ) {
  196.         $this->purchaseFlow $orderPurchaseFlow;
  197.         $this->csvExportService $csvExportService;
  198.         $this->customerRepository $customerRepository;
  199.         $this->paymentRepository $paymentRepository;
  200.         $this->sexRepository $sexRepository;
  201.         $this->orderStatusRepository $orderStatusRepository;
  202.         $this->pageMaxRepository $pageMaxRepository;
  203.         $this->productStatusRepository $productStatusRepository;
  204.         $this->productStockRepository $productStockRepository;
  205.         $this->orderRepository $orderRepository;
  206.         $this->orderPdfRepository $orderPdfRepository;
  207.         $this->validator $validator;
  208.         $this->orderStateMachine $orderStateMachine;
  209.         $this->mailService $mailService;
  210.         $this->setProductRepository $setProductRepository;
  211.         $this->productClassRepository $productClassRepository;
  212.         $this->orderPdfService $orderPdfService;
  213.         $this->mailTemplateRepository $mailTemplateRepository;
  214.         $this->shippingRepository $shippingRepository;
  215.         $this->csvTypeCustomRepository $csvTypeCustomRepository;
  216.         $this->csvCustomRepository $csvCustomRepository;
  217.         $this->csvTypeRepository $csvTypeRepository;
  218.         $this->csvRepository $csvRepository;
  219.     }
  220.     /**
  221.      * 受注一覧画面.
  222.      *
  223.      * - 検索条件, ページ番号, 表示件数はセッションに保持されます.
  224.      * - クエリパラメータでresume=1が指定された場合、検索条件, ページ番号, 表示件数をセッションから復旧します.
  225.      * - 各データの, セッションに保持するアクションは以下の通りです.
  226.      *   - 検索ボタン押下時
  227.      *      - 検索条件をセッションに保存します
  228.      *      - ページ番号は1で初期化し、セッションに保存します。
  229.      *   - 表示件数変更時
  230.      *      - クエリパラメータpage_countをセッションに保存します。
  231.      *      - ただし, mtb_page_maxと一致しない場合, eccube_default_page_countが保存されます.
  232.      *   - ページング時
  233.      *      - URLパラメータpage_noをセッションに保存します.
  234.      *   - 初期表示
  235.      *      - 検索条件は空配列, ページ番号は1で初期化し, セッションに保存します.
  236.      *
  237.      * @Route("/%eccube_admin_route%/order", name="admin_order", methods={"GET", "POST"})
  238.      * @Route("/%eccube_admin_route%/order/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_order_page", methods={"GET", "POST"})
  239.      * @Template("@admin/Order/index.twig")
  240.      */
  241.     public function index(Request $requestPaginatorInterface $paginator$page_no null)
  242.     {
  243.         $builder $this->formFactory
  244.             ->createBuilder(SearchOrderType::class);
  245.         $event = new EventArgs(
  246.             [
  247.                 'builder' => $builder,
  248.             ],
  249.             $request
  250.         );
  251.         $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_INDEX_INITIALIZE);
  252.         $searchForm $builder->getForm();
  253.         /**
  254.          * ページの表示件数は, 以下の順に優先される.
  255.          * - リクエストパラメータ
  256.          * - セッション
  257.          * - デフォルト値
  258.          * また, セッションに保存する際は mtb_page_maxと照合し, 一致した場合のみ保存する.
  259.          **/
  260.         $page_count $this->session->get(
  261.             'eccube.admin.order.search.page_count',
  262.             $this->eccubeConfig->get('eccube_default_page_count')
  263.         );
  264.         $page_count_param = (int) $request->get('page_count');
  265.         $pageMaxis $this->pageMaxRepository->findAll();
  266.         if ($page_count_param) {
  267.             foreach ($pageMaxis as $pageMax) {
  268.                 if ($page_count_param == $pageMax->getName()) {
  269.                     $page_count $pageMax->getName();
  270.                     $this->session->set('eccube.admin.order.search.page_count'$page_count);
  271.                     break;
  272.                 }
  273.             }
  274.         }
  275.         if ('POST' === $request->getMethod()) {
  276.             $searchForm->handleRequest($request);
  277.             if ($searchForm->isValid()) {
  278.                 /**
  279.                  * 検索が実行された場合は, セッションに検索条件を保存する.
  280.                  * ページ番号は最初のページ番号に初期化する.
  281.                  */
  282.                 $page_no 1;
  283.                 $searchData $searchForm->getData();
  284.                 // 検索条件, ページ番号をセッションに保持.
  285.                 $this->session->set('eccube.admin.order.search'FormUtil::getViewData($searchForm));
  286.                 $this->session->set('eccube.admin.order.search.page_no'$page_no);
  287.             } else {
  288.                 // 検索エラーの際は, 詳細検索枠を開いてエラー表示する.
  289.                 return [
  290.                     'searchForm' => $searchForm->createView(),
  291.                     'pagination' => [],
  292.                     'pageMaxis' => $pageMaxis,
  293.                     'page_no' => $page_no,
  294.                     'page_count' => $page_count,
  295.                     'has_errors' => true,
  296.                 ];
  297.             }
  298.         } else {
  299.             if (null !== $page_no || $request->get('resume')) {
  300.                 /*
  301.                  * ページ送りの場合または、他画面から戻ってきた場合は, セッションから検索条件を復旧する.
  302.                  */
  303.                 if ($page_no) {
  304.                     // ページ送りで遷移した場合.
  305.                     $this->session->set('eccube.admin.order.search.page_no', (int) $page_no);
  306.                 } else {
  307.                     // 他画面から遷移した場合.
  308.                     $page_no $this->session->get('eccube.admin.order.search.page_no'1);
  309.                 }
  310.                 $viewData $this->session->get('eccube.admin.order.search', []);
  311.                 $searchData FormUtil::submitAndGetData($searchForm$viewData);
  312.             } else {
  313.                 /**
  314.                  * 初期表示の場合.
  315.                  */
  316.                 $page_no 1;
  317.                 $viewData = [];
  318.                 if ($statusId = (int) $request->get('order_status_id')) {
  319.                     $viewData = ['status' => [$statusId]];
  320.                 }
  321.                 $searchData FormUtil::submitAndGetData($searchForm$viewData);
  322.                 // セッション中の検索条件, ページ番号を初期化.
  323.                 $this->session->set('eccube.admin.order.search'$viewData);
  324.                 $this->session->set('eccube.admin.order.search.page_no'$page_no);
  325.             }
  326.         }
  327.         if (!empty($searchData['temp_order_date_start']) && $searchData['temp_order_date_start'] || !empty($searchData['temp_order_date_end']) && $searchData['temp_order_date_end']) {
  328.             $searchData['status'][] = $this->eccubeConfig['order_temporary'];
  329.         }
  330.         $qb $this->orderRepository->getQueryBuilderBySearchDataForAdmin($searchData);
  331.         $event = new EventArgs(
  332.             [
  333.                 'qb' => $qb,
  334.                 'searchData' => $searchData,
  335.             ],
  336.             $request
  337.         );
  338.         $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_INDEX_SEARCH);
  339.         $sortKey $searchData['sortkey'];
  340.         if (empty($this->orderRepository::COLUMNS[$sortKey]) || $sortKey == 'order_status') {
  341.             $pagination $paginator->paginate(
  342.                 $qb,
  343.                 $page_no,
  344.                 $page_count
  345.             );
  346.         } else {
  347.             $pagination $paginator->paginate(
  348.                 $qb,
  349.                 $page_no,
  350.                 $page_count,
  351.                 ['wrap-queries' => true]
  352.             );
  353.         }
  354.         $mailFormBuilder $this->formFactory->createBuilder(CustomOrderMailType::class);
  355.         // $this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_ORDER_MAIL_INDEX_INITIALIZE);
  356.         $mailForm $mailFormBuilder->getForm();
  357.         $csvTypeCustoms $this->csvTypeCustomRepository->findAll();
  358.         return [
  359.             'searchForm' => $searchForm->createView(),
  360.             'pagination' => $pagination,
  361.             'pageMaxis' => $pageMaxis,
  362.             'page_no' => $page_no,
  363.             'page_count' => $page_count,
  364.             'has_errors' => false,
  365.             'OrderStatuses' => $this->orderStatusRepository->findBy([], ['sort_no' => 'ASC']),
  366.             'mailForm' => $mailForm->createView(),
  367.             'csvTypeCustoms' => $csvTypeCustoms
  368.         ];
  369.     }
  370.     /**
  371.      * @Route("/%eccube_admin_route%/order/bulk_delete", name="admin_order_bulk_delete", methods={"POST"})
  372.      */
  373.     public function bulkDelete(Request $request)
  374.     {
  375.         $this->isTokenValid();
  376.         $ids $request->get('ids');
  377.         foreach ($ids as $order_id) {
  378.             $Order $this->orderRepository
  379.                 ->find($order_id);
  380.             if ($Order) {
  381.                 $this->entityManager->remove($Order);
  382.                 log_info('受注削除', [$Order->getId()]);
  383.             }
  384.         }
  385.         $this->entityManager->flush();
  386.         $this->addSuccess('admin.common.delete_complete''admin');
  387.         return $this->redirect($this->generateUrl('admin_order', ['resume' => Constant::ENABLED]));
  388.     }
  389.     /**
  390.      * 受注CSVの出力.
  391.      *
  392.      * @Route("/%eccube_admin_route%/order/export/order", name="admin_order_export_order", methods={"GET"})
  393.      *
  394.      * @param Request $request
  395.      *
  396.      * @return StreamedResponse
  397.      */
  398.     public function exportOrder(Request $request)
  399.     {
  400.         $filename 'order_' . (new \DateTime())->format('YmdHis') . '.csv';
  401.         $response $this->exportCsv($requestCsvType::CSV_TYPE_ORDER$filename);
  402.         log_info('受注CSV出力ファイル名', [$filename]);
  403.         return $response;
  404.     }
  405.     /**
  406.      * 配送CSVの出力.
  407.      *
  408.      * @Route("/%eccube_admin_route%/order/export/shipping", name="admin_order_export_shipping", methods={"GET"})
  409.      *
  410.      * @param Request $request
  411.      *
  412.      * @return StreamedResponse
  413.      */
  414.     public function exportShipping(Request $request)
  415.     {
  416.         $filename 'shipping_' . (new \DateTime())->format('YmdHis') . '.csv';
  417.         $response $this->exportCsv($requestCsvType::CSV_TYPE_SHIPPING$filename);
  418.         log_info('配送CSV出力ファイル名', [$filename]);
  419.         return $response;
  420.     }
  421.     protected function prepareOrderItem(Request $request$OrderItem$Order$Csvs$Customer$csvService$ExportCsvRow$SetProductOrderItem null)
  422.     {
  423.         // CSV出力項目と合致するデータを取得.
  424.         foreach ($Csvs as $Csv) {
  425.             // 受注データを検索.
  426.             $ExportCsvRow->setData($csvService->getData($Csv$Order));
  427.             $this->processCsvData($OrderItem$Csv$Customer$csvService$ExportCsvRow$SetProductOrderItem);
  428.             $event = new EventArgs(
  429.                 [
  430.                     'csvService' => $csvService,
  431.                     'Csv' => $Csv,
  432.                     'OrderItem' => $OrderItem,
  433.                     'ExportCsvRow' => $ExportCsvRow,
  434.                 ],
  435.                 $request
  436.             );
  437.             $this->eventDispatcher->dispatch($eventEccubeEvents::ADMIN_ORDER_CSV_EXPORT_ORDER);
  438.             $ExportCsvRow->pushData();
  439.         }
  440.     }
  441.     /**
  442.      * @param Request $request
  443.      * @param $csvTypeId
  444.      * @param string $fileName
  445.      *
  446.      * @return StreamedResponse
  447.      */
  448.     protected function exportCsv(Request $request$csvTypeId$fileName)
  449.     {
  450.         // タイムアウトを無効にする.
  451.         set_time_limit(0);
  452.         // sql loggerを無効にする.
  453.         $em $this->entityManager;
  454.         $em->getConfiguration()->setSQLLogger(null);
  455.         $response = new StreamedResponse();
  456.         $response->setCallback(function () use ($request$csvTypeId) {
  457.             // CSV種別を元に初期化.
  458.             $this->csvExportService->initCsvType($csvTypeId);
  459.             // 受注データ検索用のクエリビルダを取得.
  460.             $qb $this->csvExportService
  461.                 ->getOrderQueryBuilder($request);
  462.             // ヘッダ行の出力.
  463.             $this->csvExportService->exportHeader();
  464.             // データ行の出力.
  465.             $this->csvExportService->setExportQueryBuilder($qb);
  466.             $this->csvExportService->exportData(function ($entity$csvService) use ($request) {
  467.                 $Csvs $csvService->getCsvs();
  468.                 $Order $entity;
  469.                 $OrderItems $Order->getOrderItems();
  470.                 $Customer $Order->getCustomer();
  471.                 foreach ($OrderItems as $OrderItem) {
  472.                     if ($OrderItem->isProduct()) {
  473.                         if ($OrderItem->getProduct()->getProductType() == 'set') {
  474.                             $set_product $this->setProductRepository->find($OrderItem->getProduct()->getSetProductId());
  475.                             //Prepare OrderItem
  476.                             $inset_products $set_product->getSetProductProduct();
  477.                             $inset_product_class_ids $OrderItem->getSetProductClass();
  478.                             $inset_product_classes = array();
  479.                             foreach ($inset_product_class_ids as $ipci) {
  480.                                 if (!empty($ipci)) {
  481.                                     $ipc $this->productClassRepository->find($ipci);
  482.                                     if ($ipc)
  483.                                         $inset_product_classes[$ipc->getProduct()->getId()] = $ipc;
  484.                                 }
  485.                             }
  486.                             $set_price $OrderItem->getSetProductPrice();
  487.                             foreach ($inset_products as $isp) {
  488.                                 $isp_product $isp->getProduct();
  489.                                 $InSetProductOrderItem = new OrderItem;
  490.                                 $InSetProductOrderItem->setOrder($Order)
  491.                                     ->setProduct($isp_product);
  492.                                 if (isset($inset_product_classes[$isp_product->getId()])) {
  493.                                     $inset_product_class $inset_product_classes[$isp_product->getId()];
  494.                                     $InSetProductOrderItem->setProductClass($inset_product_class)
  495.                                         ->setProductCode($inset_product_class->getCode())
  496.                                         ->setPrice($set_price && isset($set_price[$isp_product->getId()]) ? $set_price[$isp_product->getId()] : $isp->getSetProductPrice());
  497.                                     $ClassCategory1 $inset_product_class->getClassCategory1();
  498.                                     if (!is_null($ClassCategory1)) {
  499.                                         $InSetProductOrderItem->setClasscategoryName1($ClassCategory1->getName());
  500.                                         $InSetProductOrderItem->setClassName1($ClassCategory1->getClassName()->getName());
  501.                                     }
  502.                                     $ClassCategory2 $inset_product_class->getClassCategory2();
  503.                                     if (!is_null($ClassCategory2)) {
  504.                                         $InSetProductOrderItem->setClasscategoryName2($ClassCategory2->getName());
  505.                                         $InSetProductOrderItem->setClassName2($ClassCategory2->getClassName()->getName());
  506.                                     }
  507.                                 }
  508.                                 $InSetProductOrderItem->setProductName($isp_product->getName())
  509.                                     ->setQuantity($OrderItem->getQuantity())
  510.                                     ->setOrderItemType($OrderItem->getOrderItemType())
  511.                                     ->setDeliveryPeriod($OrderItem->getDeliveryPeriod())
  512.                                     ->setSetProductClass($OrderItem->getSetProductClass());
  513.                                 $Shipping $OrderItem->getShipping();
  514.                                 $InSetProductOrderItem->setShipping($Shipping);
  515.                                 $Brother $OrderItem->getBrother();
  516.                                 $InSetProductOrderItem->setBrother($Brother);
  517.                                 $ExportCsvRow = new ExportCsvRow();
  518.                                 $this->prepareOrderItem($request$InSetProductOrderItem$Order$Csvs$Customer$csvService$ExportCsvRow$OrderItem);
  519.                                 //$row[] = number_format(memory_get_usage(true));
  520.                                 // 出力.
  521.                                 $csvService->fputcsv($ExportCsvRow->getRow());
  522.                             }
  523.                         } else {
  524.                             $ExportCsvRow = new ExportCsvRow();
  525.                             $this->prepareOrderItem($request$OrderItem$Order$Csvs$Customer$csvService$ExportCsvRow);
  526.                             //$row[] = number_format(memory_get_usage(true));
  527.                             // 出力.
  528.                             $csvService->fputcsv($ExportCsvRow->getRow());
  529.                         }
  530.                     }
  531.                 }
  532.             });
  533.         });
  534.         $response->headers->set('Content-Type''application/octet-stream');
  535.         $response->headers->set('Content-Disposition''attachment; filename=' $fileName);
  536.         return $response;
  537.     }
  538.     /**
  539.      * Update to order status
  540.      *
  541.      * @Route("/%eccube_admin_route%/shipping/{id}/order_status", requirements={"id" = "\d+"}, name="admin_shipping_update_order_status", methods={"PUT"})
  542.      *
  543.      * @param Request $request
  544.      * @param Shipping $Shipping
  545.      *
  546.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  547.      */
  548.     public function updateOrderStatus(Request $requestShipping $Shipping)
  549.     {
  550.         if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
  551.             return $this->json(['status' => 'NG'], 400);
  552.         }
  553.         $Order $Shipping->getOrder();
  554.         $OrderStatus $this->entityManager->find(OrderStatus::class, $request->get('order_status'));
  555.         if (!$OrderStatus) {
  556.             return $this->json(['status' => 'NG'], 400);
  557.         }
  558.         $result = [];
  559.         try {
  560.             if ($Order->getOrderStatus()->getId() == $OrderStatus->getId()) {
  561.                 log_info('対応状況一括変更スキップ');
  562.                 $result = ['message' => trans('admin.order.skip_change_status', ['%name%' => $Shipping->getId()])];
  563.             } else {
  564.                 if ($this->orderStateMachine->can($Order$OrderStatus)) {
  565.                     if ($OrderStatus->getId() == OrderStatus::DELIVERED) {
  566.                         if (!$Shipping->isShipped()) {
  567.                             $Shipping->setShippingDate(new \DateTime());
  568.                         }
  569.                         $allShipped true;
  570.                         foreach ($Order->getShippings() as $Ship) {
  571.                             if (!$Ship->isShipped()) {
  572.                                 $allShipped false;
  573.                                 break;
  574.                             }
  575.                         }
  576.                         if ($allShipped) {
  577.                             $this->orderStateMachine->apply($Order$OrderStatus);
  578.                         }
  579.                     } else {
  580.                         $this->orderStateMachine->apply($Order$OrderStatus);
  581.                     }
  582.                     $pdfPath null;
  583.                     if ($request->get('deliveryNote'false)) {
  584.                         $pdfPath $this->createPdf($Shipping->getId());
  585.                     }
  586.                     if ($request->get('notificationMail')) { // for SimpleStatusUpdate
  587.                         $this->mailService->sendShippingNotifyMail($Shipping$request->get('deliveryNote'false), $pdfPath);
  588.                         $Shipping->setMailSendDate(new \DateTime());
  589.                         $result['mail'] = true;
  590.                     } else {
  591.                         $result['mail'] = false;
  592.                     }
  593.                     // 対応中・キャンセルの更新時は商品在庫を増減させているので商品情報を更新
  594.                     if ($OrderStatus->getId() == OrderStatus::IN_PROGRESS || $OrderStatus->getId() == OrderStatus::CANCEL) {
  595.                         foreach ($Order->getOrderItems() as $OrderItem) {
  596.                             $ProductClass $OrderItem->getProductClass();
  597.                             if ($OrderItem->isProduct() && !$ProductClass->isStockUnlimited()) {
  598.                                 $this->entityManager->persist($ProductClass);
  599.                                 $this->entityManager->flush();
  600.                                 $ProductStock $this->productStockRepository->findOneBy(['ProductClass' => $ProductClass]);
  601.                                 $this->entityManager->persist($ProductStock);
  602.                                 $this->entityManager->flush();
  603.                             }
  604.                         }
  605.                     }
  606.                     $this->entityManager->persist($Order);
  607.                     $this->entityManager->persist($Shipping);
  608.                     $this->entityManager->flush();
  609.                     // 会員の場合、購入回数、購入金額などを更新
  610.                     if ($Customer $Order->getCustomer()) {
  611.                         $this->orderRepository->updateOrderSummary($Customer);
  612.                         $this->entityManager->persist($Customer);
  613.                         $this->entityManager->flush();
  614.                     }
  615.                 } else {
  616.                     $from $Order->getOrderStatus()->getName();
  617.                     $to $OrderStatus->getName();
  618.                     $result = ['message' => trans('admin.order.failed_to_change_status', [
  619.                         '%name%' => $Shipping->getId(),
  620.                         '%from%' => $from,
  621.                         '%to%' => $to,
  622.                     ])];
  623.                 }
  624.                 log_info('対応状況一括変更処理完了', [$Order->getId()]);
  625.             }
  626.         } catch (\Exception $e) {
  627.             log_error('予期しないエラーです', [$e->getMessage()]);
  628.             return $this->json(['status' => 'NG'], 500);
  629.         }
  630.         return $this->json(array_merge(['status' => 'OK'], $result));
  631.     }
  632.     /**
  633.      * Update to Tracking number.
  634.      *
  635.      * @Route("/%eccube_admin_route%/shipping/{id}/tracking_number", requirements={"id" = "\d+"}, name="admin_shipping_update_tracking_number", methods={"PUT"})
  636.      *
  637.      * @param Request $request
  638.      * @param Shipping $shipping
  639.      *
  640.      * @return Response
  641.      */
  642.     public function updateTrackingNumber(Request $requestShipping $shipping)
  643.     {
  644.         if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
  645.             return $this->json(['status' => 'NG'], 400);
  646.         }
  647.         $trackingNumber mb_convert_kana($request->get('tracking_number'), 'a''utf-8');
  648.         /** @var \Symfony\Component\Validator\ConstraintViolationListInterface $errors */
  649.         $errors $this->validator->validate(
  650.             $trackingNumber,
  651.             [
  652.                 new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
  653.                 new Assert\Regex(
  654.                     ['pattern' => '/^[0-9a-zA-Z-]+$/u''message' => trans('admin.order.tracking_number_error')]
  655.                 ),
  656.             ]
  657.         );
  658.         if ($errors->count() != 0) {
  659.             log_info('送り状番号入力チェックエラー');
  660.             $messages = [];
  661.             /** @var \Symfony\Component\Validator\ConstraintViolationInterface $error */
  662.             foreach ($errors as $error) {
  663.                 $messages[] = $error->getMessage();
  664.             }
  665.             return $this->json(['status' => 'NG''messages' => $messages], 400);
  666.         }
  667.         try {
  668.             $shipping->setTrackingNumber($trackingNumber);
  669.             $this->entityManager->persist($shipping);
  670.             $this->entityManager->flush();
  671.             log_info('送り状番号変更処理完了', [$shipping->getId()]);
  672.             $message = ['status' => 'OK''shipping_id' => $shipping->getId(), 'tracking_number' => $trackingNumber];
  673.             return $this->json($message);
  674.         } catch (\Exception $e) {
  675.             log_error('予期しないエラー', [$e->getMessage()]);
  676.             return $this->json(['status' => 'NG'], 500);
  677.         }
  678.     }
  679.     /**
  680.      * @Route("/%eccube_admin_route%/order/export/pdf", name="admin_order_export_pdf", methods={"GET", "POST"})
  681.      * @Template("@admin/Order/order_pdf.twig")
  682.      *
  683.      * @param Request $request
  684.      *
  685.      * @return array|RedirectResponse
  686.      */
  687.     public function exportPdf(Request $request)
  688.     {
  689.         // requestから出荷番号IDの一覧を取得する.
  690.         $ids $request->get('ids', []);
  691.         if (count($ids) == 0) {
  692.             $this->addError('admin.order.delivery_note_parameter_error''admin');
  693.             log_info('The Order cannot found!');
  694.             return $this->redirectToRoute('admin_order');
  695.         }
  696.         /** @var OrderPdf $OrderPdf */
  697.         $OrderPdf $this->orderPdfRepository->find($this->getUser());
  698.         if (!$OrderPdf) {
  699.             $OrderPdf = new OrderPdf();
  700.             $OrderPdf
  701.                 ->setTitle(trans('admin.order.delivery_note_title__default'))
  702.                 ->setMessage1(trans('admin.order.delivery_note_message__default1'))
  703.                 ->setMessage2(trans('admin.order.delivery_note_message__default2'))
  704.                 ->setMessage3(trans('admin.order.delivery_note_message__default3'));
  705.         }
  706.         /**
  707.          * @var FormBuilder
  708.          */
  709.         $builder $this->formFactory->createBuilder(OrderPdfType::class, $OrderPdf);
  710.         /* @var \Symfony\Component\Form\Form $form */
  711.         $form $builder->getForm();
  712.         // Formへの設定
  713.         $form->get('ids')->setData(implode(','$ids));
  714.         return [
  715.             'form' => $form->createView(),
  716.         ];
  717.     }
  718.     /**
  719.      * @Route("/%eccube_admin_route%/order/export/pdf/download", name="admin_order_pdf_download", methods={"POST"})
  720.      * @Template("@admin/Order/order_pdf.twig")
  721.      *
  722.      * @param Request $request
  723.      *
  724.      * @return Response
  725.      */
  726.     public function exportPdfDownload(Request $requestOrderPdfService $orderPdfService)
  727.     {
  728.         /**
  729.          * @var FormBuilder
  730.          */
  731.         $builder $this->formFactory->createBuilder(OrderPdfType::class);
  732.         /* @var \Symfony\Component\Form\Form $form */
  733.         $form $builder->getForm();
  734.         $form->handleRequest($request);
  735.         // Validation
  736.         if (!$form->isValid()) {
  737.             log_info('The parameter is invalid!');
  738.             return $this->render('@admin/Order/order_pdf.twig', [
  739.                 'form' => $form->createView(),
  740.             ]);
  741.         }
  742.         $arrData $form->getData();
  743.         // 購入情報からPDFを作成する
  744.         $status $orderPdfService->makePdf($arrData);
  745.         // 異常終了した場合の処理
  746.         if (!$status) {
  747.             $this->addError('admin.order.export.pdf.download.failure''admin');
  748.             log_info('Unable to create pdf files! Process have problems!');
  749.             return $this->render('@admin/Order/order_pdf.twig', [
  750.                 'form' => $form->createView(),
  751.             ]);
  752.         }
  753.         // TCPDF::Outputを実行するとプロパティが初期化されるため、ファイル名を事前に取得しておく
  754.         $pdfFileName $orderPdfService->getPdfFileName();
  755.         // ダウンロードする
  756.         $response = new Response(
  757.             $orderPdfService->outputPdf(),
  758.             200,
  759.             ['content-type' => 'application/pdf']
  760.         );
  761.         $downloadKind $form->get('download_kind')->getData();
  762.         // レスポンスヘッダーにContent-Dispositionをセットし、ファイル名を指定
  763.         if ($downloadKind == 1) {
  764.             $response->headers->set('Content-Disposition''attachment; filename="' $pdfFileName '"');
  765.         } else {
  766.             $response->headers->set('Content-Disposition''inline; filename="' $pdfFileName '"');
  767.         }
  768.         log_info('OrderPdf download success!', ['Order ID' => implode(','$request->get('ids', []))]);
  769.         $isDefault = isset($arrData['default']) ? $arrData['default'] : false;
  770.         if ($isDefault) {
  771.             // Save input to DB
  772.             $arrData['admin'] = $this->getUser();
  773.             $this->orderPdfRepository->save($arrData);
  774.         }
  775.         return $response;
  776.     }
  777.     private function createPdf($id)
  778.     {
  779.         /** @var OrderPdf $OrderPdf */
  780.         $OrderPdf $this->orderPdfRepository->find($this->getUser());
  781.         if (!$OrderPdf) {
  782.             $OrderPdf = new OrderPdf();
  783.             $OrderPdf
  784.                 ->setTitle(trans('admin.order.delivery_note_title__default'))
  785.                 ->setMessage1(trans('admin.order.delivery_note_message__default1'))
  786.                 ->setMessage2(trans('admin.order.delivery_note_message__default2'))
  787.                 ->setMessage3(trans('admin.order.delivery_note_message__default3'));
  788.         }
  789.         $arrData = array();
  790.         $arrData['ids'] = $id;
  791.         $arrData['issue_date'] = new \DateTime();
  792.         $arrData['title'] = trans('admin.order.delivery_note_title__default');
  793.         $arrData['message1'] = trans('admin.order.delivery_note_message__default1');
  794.         $arrData['message2'] = trans('admin.order.delivery_note_message__default2');
  795.         $arrData['message3'] = trans('admin.order.delivery_note_message__default3');
  796.         $arrData['note1'] = '';
  797.         $arrData['note2'] = '';
  798.         $arrData['note3'] = '';
  799.         // 購入情報からPDFを作成する
  800.         $status $this->orderPdfService->makePdf($arrData);
  801.         // 異常終了した場合の処理
  802.         if (!$status) {
  803.             $this->addError('admin.order.export.pdf.download.failure''admin');
  804.             log_info('Unable to create pdf files! Process have problems!');
  805.             return;
  806.         }
  807.         // TCPDF::Outputを実行するとプロパティが初期化されるため、ファイル名を事前に取得しておく
  808.         $pdfFileName $this->orderPdfService->getPdfFileName();
  809.         $pdfPath $this->eccubeConfig['eccube_theme_user_data_dir'] . '/order_pdf/' $pdfFileName;
  810.         $this->orderPdfService->Output($pdfPath'F');
  811.         return $pdfPath;
  812.     }
  813.     /**
  814.      * @Route("/%eccube_admin_route%/order/mail/template/", name="admin_order_mail_templete", methods={"POST"})
  815.      */
  816.     public function getMailTemplate(Request $request)
  817.     {
  818.         if ($request->isXmlHttpRequest()) {
  819.             $template_id $request->get('template_id'null);
  820.             $order_id $request->get('order_id'null);
  821.             $shipping_id $request->get('shipping_id'null);
  822.             if ($template_id) {
  823.                 $MailTemplate $this->mailTemplateRepository->find($template_id);
  824.                 if ($MailTemplate) {
  825.                     $twig $MailTemplate->getFileName();
  826.                     if (!$twig) {
  827.                         $twig 'Mail/order.twig';
  828.                     }
  829.                     $Order $this->orderRepository->find($order_id);
  830.                     $Shipping $this->shippingRepository->find($shipping_id);
  831.                     $historyUrl is_null($Order->getCustomer())
  832.                         ? null
  833.                         $this->container->get('router')->generate('mypage_history', ['order_no' => $Order->getOrderNo()], UrlGeneratorInterface::ABSOLUTE_URL);
  834.                     $body $this->renderView($twig, [
  835.                         'Order' => $Order,
  836.                         'Shipping' => $Shipping,
  837.                         'isCvsPay' => false,
  838.                         'historyUrl' => $historyUrl
  839.                     ]);
  840.                     // if(file_exists($this->getParameter('eccube_theme_front_dir') . '/' . $twig)) {
  841.                     //     $body = file_get_contents($this->getParameter('eccube_theme_front_dir') . '/' . $twig);
  842.                     // }
  843.                     // else {
  844.                     //     $body = file_get_contents($this->getParameter('eccube_theme_front_default_dir') . '/' . $twig);
  845.                     // }
  846.                     $subject $MailTemplate->getMailSubject();
  847.                     // 本文確認用
  848.                     return $this->json([
  849.                         'done' => true,
  850.                         'body' => $body,
  851.                         'subject' => $subject
  852.                     ]);
  853.                 }
  854.             }
  855.         }
  856.         return $this->json([
  857.             'done' => false,
  858.             'body' => null
  859.         ]);
  860.     }
  861.     protected function processCsvData($OrderItem$Csv$Customer$csvService$ExportCsvRow$SetProductOrderItem null)
  862.     {
  863.         if ($ExportCsvRow->isDataNull()) {
  864.             // 受注データにない場合は, 受注明細を検索.
  865.             switch ($Csv->getFieldName()) {
  866.                 case 'School':
  867.                     $brother $OrderItem->getBrother();
  868.                     if ($brother) {
  869.                         $brother_school $brother->getSchool();
  870.                         if ($Csv->getReferenceFieldName() == 'school_id') {
  871.                             $ExportCsvRow->setData($brother_school $brother_school->getSchoolId() : '');
  872.                         } else if ($Csv->getReferenceFieldName() == 'school_name') {
  873.                             $ExportCsvRow->setData($brother_school $brother_school->getSchoolName() : '');
  874.                         } else {
  875.                             $ExportCsvRow->setData($csvService->getData($Csv$OrderItem));
  876.                         }
  877.                     } else {
  878.                         $ExportCsvRow->setData($csvService->getData($Csv$OrderItem));
  879.                     }
  880.                     break;
  881.                 case 'class_category_internal_name1':
  882.                     if ($OrderItem->isProduct()) {
  883.                         $productClass $OrderItem->getProductClass();
  884.                         $ClassCategory1 $productClass->getClassCategory1();
  885.                         if ($ClassCategory1) {
  886.                             $ExportCsvRow->setData($ClassCategory1->getInternalName());
  887.                         }
  888.                     }
  889.                     break;
  890.                 case 'class_category_internal_name2':
  891.                     if ($OrderItem->isProduct()) {
  892.                         $productClass $OrderItem->getProductClass();
  893.                         $ClassCategory2 $productClass->getClassCategory2();
  894.                         if ($ClassCategory2) {
  895.                             $ExportCsvRow->setData($ClassCategory2->getInternalName());
  896.                         }
  897.                     }
  898.                     break;
  899.                 default:
  900.                     if (
  901.                         $Csv->getEntityName() == 'Eccube\\\\Entity\\\\OrderItem'
  902.                         && $Csv->getFieldName() == 'id'
  903.                         && $SetProductOrderItem
  904.                     ) {
  905.                         $ExportCsvRow->setData($SetProductOrderItem->getId());
  906.                     } else {
  907.                         $ExportCsvRow->setData($csvService->getData($Csv$OrderItem));
  908.                     }
  909.                     break;
  910.             }
  911.         }
  912.         if ($ExportCsvRow->isDataNull() && $Shipping $OrderItem->getShipping()) {
  913.             // 受注明細データにない場合は, 出荷を検索.
  914.             $ExportCsvRow->setData($csvService->getData($Csv$Shipping));
  915.         }
  916.         if ($ExportCsvRow->isDataNull() && $Customer) {
  917.             // 会員情報を検索.
  918.             switch ($Csv->getFieldName()) {
  919.                 case 'prev_school_year':
  920.                     $ExportCsvRow->setData($csvService->getData($Csv$Customer) . '年 ' $Customer->getPrevSchoolClass() . '組');
  921.                     break;
  922.                 case 'contractor_name01':
  923.                     $ExportCsvRow->setData($csvService->getData($Csv$Customer) . ' ' $Customer->getContractorName02());
  924.                     break;
  925.                 case 'contractor_birth':
  926.                     $ExportCsvRow->setData(date("Y-m-d"strtotime($csvService->getData($Csv$Customer))));
  927.                     break;
  928.                 case 'school_year':
  929.                     $ExportCsvRow->setData($csvService->getData($Csv$Customer) . '年 ' $Customer->getSchoolClass() . '組');
  930.                     break;
  931.                 case 'Apparel':
  932.                     $apprel $OrderItem->isProduct() ? $OrderItem->getProduct()->getApparel() : null;
  933.                     if ($apprel) {
  934.                         if ($Csv->getReferenceFieldName() == 'apparel_id') {
  935.                             $ExportCsvRow->setData($apprel->getApparelId());
  936.                         } else if ($Csv->getReferenceFieldName() == 'apparel_name') {
  937.                             $ExportCsvRow->setData($apprel->getApparelName());
  938.                         }
  939.                     }
  940.                     break;
  941.                 default:
  942.                     $ExportCsvRow->setData($csvService->getData($Csv$Customer));
  943.                     break;
  944.             }
  945.         }
  946.     }
  947.     protected function prepareOrderItemCustom($OrderItem$Order$CsvCustom$Customer$csvService$ExportCsvRow$SetProductOrderItem null)
  948.     {
  949.         $itemFound false;
  950.         $CsvDefault $CsvCustom->getCsvDefault();
  951.         if ($SetProductOrderItem) {
  952.             $ExportCsvRow->setData($csvService->getData($CsvDefault$Order));
  953.             $this->processCsvData($OrderItem$CsvDefault$Customer$csvService$ExportCsvRow$SetProductOrderItem);
  954.             $ExportCsvRow->pushData();
  955.             $itemFound true;
  956.         } else {
  957.             $ExportCsvRow->setData($csvService->getData($CsvDefault$Order));
  958.             $this->processCsvData($OrderItem$CsvDefault$Customer$csvService$ExportCsvRow$SetProductOrderItem);
  959.             $ExportCsvRow->pushData();
  960.             $itemFound true;
  961.         }
  962.         return $itemFound;
  963.     }
  964.     protected function prepareOrderCustom($Order$CsvCustoms$Customer$ExportCsvRow)
  965.     {
  966.         $OrderItems $Order->getOrderItems();
  967.         $processed_items = [];
  968.         // CSV出力項目と合致するデータを取得.
  969.         foreach ($CsvCustoms as $index => $CsvCustom) {
  970.             $CsvDefault $CsvCustom->getCsvDefault();
  971.             switch ($CsvCustom->getFieldType()) {
  972.                 case 0:
  973.                     if ($CsvCustom->getProduct()->isSetProduct()) {
  974.                         continue;
  975.                     }
  976.                     $itemFound false;
  977.                     foreach ($OrderItems as $OrderItem) {
  978.                         if ($OrderItem->isProduct()) {
  979.                             if ($OrderItem->getProduct()->isSetProduct()) {
  980.                                 $set_product $this->setProductRepository->find($OrderItem->getProduct()->getSetProductId());
  981.                                 $inset_products $set_product->getSetProductProduct();
  982.                                 $inset_product_class_ids $OrderItem->getSetProductClass();
  983.                                 $inset_product_classes = array();
  984.                                 foreach ($inset_product_class_ids as $ipci) {
  985.                                     if (!empty($ipci)) {
  986.                                         $ipc $this->productClassRepository->find($ipci);
  987.                                         if ($ipc)
  988.                                             $inset_product_classes[$ipc->getProduct()->getId()] = $ipc;
  989.                                     }
  990.                                 }
  991.                                 $itemFoundInSet false;
  992.                                 if ($CsvCustom->getSetProduct() && $OrderItem->getProduct()->getSetProductId() == $CsvCustom->getSetProduct()->getId()) {
  993.                                     $set_price $OrderItem->getSetProductPrice();
  994.                                     foreach ($inset_products as $inset_index => $isp) {
  995.                                         $isp_product $isp->getProduct();
  996.                                         if ($isp_product == $CsvCustom->getProduct())
  997.                                             $InSetProductOrderItem = new OrderItem;
  998.                                         $InSetProductOrderItem->setOrder($Order)
  999.                                             ->setProduct($isp_product);
  1000.                                         if (isset($inset_product_classes[$isp_product->getId()])) {
  1001.                                             $inset_product_class $inset_product_classes[$isp_product->getId()];
  1002.                                             $InSetProductOrderItem->setProductClass($inset_product_class)
  1003.                                                 ->setProductCode($inset_product_class->getCode())
  1004.                                                 ->setPrice($set_price && isset($set_price[$isp_product->getId()]) ? $set_price[$isp_product->getId()] : $isp->getSetProductPrice());
  1005.                                             $ClassCategory1 $inset_product_class->getClassCategory1();
  1006.                                             if (!is_null($ClassCategory1)) {
  1007.                                                 $InSetProductOrderItem->setClasscategoryName1($ClassCategory1->getName());
  1008.                                                 $InSetProductOrderItem->setClassName1($ClassCategory1->getClassName()->getName());
  1009.                                             }
  1010.                                             $ClassCategory2 $inset_product_class->getClassCategory2();
  1011.                                             if (!is_null($ClassCategory2)) {
  1012.                                                 $InSetProductOrderItem->setClasscategoryName2($ClassCategory2->getName());
  1013.                                                 $InSetProductOrderItem->setClassName2($ClassCategory2->getClassName()->getName());
  1014.                                             }
  1015.                                         }
  1016.                                         $InSetProductOrderItem->setProductName($isp_product->getName())
  1017.                                             ->setQuantity($OrderItem->getQuantity())
  1018.                                             ->setOrderItemType($OrderItem->getOrderItemType())
  1019.                                             ->setDeliveryPeriod($OrderItem->getDeliveryPeriod())
  1020.                                             ->setSetProductClass($OrderItem->getSetProductClass());
  1021.                                         $Shipping $OrderItem->getShipping();
  1022.                                         $InSetProductOrderItem->setShipping($Shipping);
  1023.                                         $Brother $OrderItem->getBrother();
  1024.                                         $InSetProductOrderItem->setBrother($Brother);
  1025.                                         $processed implode('_', [$CsvCustom->getDispName(), $OrderItem->getId(), $isp_product->getId(), $inset_index]);
  1026.                                         if (!in_array($processed$processed_items)) {
  1027.                                             if ($isp_product == $CsvCustom->getProduct()) {
  1028.                                                 $this->prepareOrderItemCustom($InSetProductOrderItem$Order$CsvCustom$Customer$this->csvExportService$ExportCsvRow$OrderItem);
  1029.                                                 $itemFoundInSet true;
  1030.                                             }
  1031.                                             $processed_items[] = $processed;
  1032.                                         }
  1033.                                         if ($itemFoundInSet) {
  1034.                                             break;
  1035.                                         }
  1036.                                     }
  1037.                                 }
  1038.                                 if ($itemFoundInSet) {
  1039.                                     $itemFound true;
  1040.                                     break;
  1041.                                 }
  1042.                             } else {
  1043.                                 $processed implode('_', [$CsvCustom->getDispName(), $OrderItem->getId(), $OrderItem->getProduct()->getId()]);
  1044.                                 if (!in_array($processed$processed_items)) {
  1045.                                     if ($CsvCustom->getProduct() == $OrderItem->getProduct()) {
  1046.                                         $this->prepareOrderItemCustom($OrderItem$Order$CsvCustom$Customer$this->csvExportService$ExportCsvRownull);
  1047.                                         $itemFound true;
  1048.                                     }
  1049.                                     $processed_items[] = $processed;
  1050.                                 }
  1051.                                 if ($itemFound) {
  1052.                                     break;
  1053.                                 }
  1054.                             }
  1055.                         }
  1056.                     }
  1057.                     if (!$itemFound) {
  1058.                         $ExportCsvRow->setData('');
  1059.                         $ExportCsvRow->pushData();
  1060.                     }
  1061.                     break;
  1062.                 case 1:
  1063.                     $ExportCsvRow->setData($CsvCustom->getFieldData());
  1064.                     $ExportCsvRow->pushData();
  1065.                     break;
  1066.                 case 2:
  1067.                     foreach ($OrderItems as $OrderItem) {
  1068.                         $ExportCsvRow->setData($this->csvExportService->getData($CsvDefault$Order));
  1069.                         $this->processCsvData($OrderItem$CsvDefault$Customer$this->csvExportService$ExportCsvRownull);
  1070.                     }
  1071.                     $ExportCsvRow->pushData();
  1072.                     break;
  1073.                 default:
  1074.                     break;
  1075.             }
  1076.         }
  1077.     }
  1078.     /**
  1079.      * @Route("/%eccube_admin_route%/order/export/csv_custom/{csvTypeId}", name="admin_order_export_csv_custom", methods={"GET"}, requirements={"id" = "\d+"})
  1080.      */
  1081.     public function exportCsvCustom(Request $request$csvTypeId)
  1082.     {
  1083.         // タイムアウトを無効にする.
  1084.         set_time_limit(0);
  1085.         // sql loggerを無効にする.
  1086.         $em $this->entityManager;
  1087.         $em->getConfiguration()->setSQLLogger(null);
  1088.         $response = new StreamedResponse();
  1089.         $csvTypeCustom $this->csvTypeCustomRepository->find($csvTypeId);
  1090.         $csvCustoms $this->csvCustomRepository->findBy(['CsvTypeCustom' => $csvTypeCustom]);
  1091.         $fileName 'order_custom_' . (new \DateTime())->format('YmdHis') . '.csv';
  1092.         $response->setCallback(function () use ($request$csvCustoms$csvTypeCustom) {
  1093.             $handle fopen('php://output''w');
  1094.             $qb $this->csvExportService
  1095.                 ->getOrderQueryBuilder($request);
  1096.             $Orders $qb
  1097.                 ->getQuery()
  1098.                 ->useResultCache(true$this->eccubeConfig['eccube_result_cache_lifetime_short'])
  1099.                 ->getResult();
  1100.             $max_counts = [];
  1101.             foreach ($Orders as $Order) {
  1102.                 $OrderItems $Order->getOrderItems();
  1103.                 $repeatCounts = [];
  1104.                 for ($idx 0$idx count($OrderItems); $idx++) {
  1105.                     $OrderItem $OrderItems[$idx];
  1106.                     if ($OrderItem->isProduct()) {
  1107.                         $Product $OrderItem->getProduct();
  1108.                         $product_id $Product->getId();
  1109.                         $repeatCounts = [];
  1110.                         $repeatCounts[$product_id] = 1;
  1111.                         $j $idx 1;
  1112.                         while (isset($OrderItems[$j]) && $OrderItems[$j]->getProduct() == $Product) {
  1113.                             $repeatCounts[$product_id] = $repeatCounts[$product_id] + 1;
  1114.                             $j++;
  1115.                         }
  1116.                         $idx $j 1;
  1117.                     }
  1118.                 }
  1119.                 foreach ($repeatCounts as $product_id => $r_count) {
  1120.                     if (!isset($max_counts[$product_id]) || isset($max_counts[$product_id]) && $max_counts[$product_id] < $r_count) {
  1121.                         $max_counts[$product_id] = $r_count;
  1122.                     }
  1123.                 }
  1124.             }
  1125.             $headerRow = [];
  1126.             $headerCsvs = [];
  1127.             for ($idx 0$idx count($csvCustoms); $idx++) {
  1128.                 $csvCustom $csvCustoms[$idx];
  1129.                 $Product $csvCustom->getProduct();
  1130.                 if ($csvCustom->getFieldType() == 0) {
  1131.                     $repeatCount = isset($max_counts[$Product->getId()]) ? $max_counts[$Product->getId()] : 1;
  1132.                     for ($k 0$k $repeatCount$k++) {
  1133.                         $j $idx;
  1134.                         do {
  1135.                             $csvCustoms[$j]->setDispName($csvCustoms[$j]->getDispName() . '@' . ($k 1));
  1136.                             $headerCsvs[] = $csvCustoms[$j];
  1137.                             $j++;
  1138.                         } while (isset($csvCustoms[$j]) && $csvCustoms[$j]->getFieldType() == && $csvCustom->getProduct() == $csvCustoms[$j]->getProduct());
  1139.                     }
  1140.                     $idx $j 1;
  1141.                 } else {
  1142.                     $headerCsvs[] = $csvCustom;
  1143.                 }
  1144.             }
  1145.             foreach ($headerCsvs as $hcsv) {
  1146.                 if ($hcsv->getFieldType() != || $hcsv->getProduct() && !$hcsv->getProduct()->isSetProduct()) {
  1147.                     $headerRow[] = mb_convert_encoding(explode('@'$hcsv->getDispName())[0], 'SJIS-win');
  1148.                 }
  1149.             }
  1150.             $column_count 0;
  1151.             $exportData = [];
  1152.             foreach ($Orders as $Order) {
  1153.                 $Customer $Order->getCustomer();
  1154.                 $ExportCsvRow = new ExportCsvRow();
  1155.                 $this->prepareOrderCustom($Order$headerCsvs$Customer$ExportCsvRow);
  1156.                 $dataRow $ExportCsvRow->getRow();
  1157.                 if (count($dataRow) > $column_count) {
  1158.                     $column_count count($dataRow);
  1159.                 }
  1160.                 $exportData[] = $ExportCsvRow;
  1161.             }
  1162.             for ($i 0$i $column_count$i++) {
  1163.                 $empty_fields[$i] = true;
  1164.             }
  1165.             foreach ($exportData as $ExportCsvRow) {
  1166.                 $dataRow $ExportCsvRow->getRow();
  1167.                 foreach ($dataRow as $index => $csvData) {
  1168.                     if (!empty($csvData)) {
  1169.                         $empty_fields[$index] = false;
  1170.                     }
  1171.                 }
  1172.             }
  1173.             if ($csvTypeCustom->getSkipEmptyField()) {
  1174.                 $headerRowNew = [];
  1175.                 foreach ($headerRow as $index => $header) {
  1176.                     if (!$empty_fields[$index]) {
  1177.                         $headerRowNew[] = $headerRow[$index];
  1178.                     }
  1179.                 }
  1180.                 fputcsv($handle$headerRowNew);
  1181.                 foreach ($exportData as $ExportCsvRow) {
  1182.                     $ExportCsvRowNew = new ExportCsvRow();
  1183.                     foreach ($ExportCsvRow->getRow() as $index => $csvData) {
  1184.                         if (!$empty_fields[$index]) {
  1185.                             $ExportCsvRowNew->setData($csvData);
  1186.                             $ExportCsvRowNew->pushData();
  1187.                         }
  1188.                     }
  1189.                     fputcsv($handlearray_map($this->csvExportService->getConvertEncodingCallback(), $ExportCsvRowNew->getRow()), $this->eccubeConfig['eccube_csv_export_separator']);
  1190.                 }
  1191.             } else {
  1192.                 fputcsv($handle$headerRow);
  1193.                 foreach ($exportData as $ExportCsvRow) {
  1194.                     fputcsv($handlearray_map($this->csvExportService->getConvertEncodingCallback(), $ExportCsvRow->getRow()), $this->eccubeConfig['eccube_csv_export_separator']);
  1195.                 }
  1196.             }
  1197.             fclose($handle);
  1198.         });
  1199.         $response->headers->set('Content-Type''application/octet-stream');
  1200.         $response->headers->set('Content-Disposition''attachment; filename=' $fileName);
  1201.         return $response;
  1202.     }
  1203. }