src/Eccube/Controller/Admin/Order/CsvImportController.php line 55

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 Eccube\Controller\Admin\AbstractCsvImportController;
  14. use Eccube\Entity\Master\OrderStatus;
  15. use Eccube\Entity\Shipping;
  16. use Eccube\Form\Type\Admin\CsvImportType;
  17. use Eccube\Repository\ShippingRepository;
  18. use Eccube\Service\CsvImportService;
  19. use Eccube\Service\OrderStateMachine;
  20. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. class CsvImportController extends AbstractCsvImportController
  24. {
  25.     /**
  26.      * @var ShippingRepository
  27.      */
  28.     private $shippingRepository;
  29.     /**
  30.      * @var OrderStateMachine
  31.      */
  32.     protected $orderStateMachine;
  33.     public function __construct(
  34.         ShippingRepository $shippingRepository,
  35.         OrderStateMachine $orderStateMachine
  36.     ) {
  37.         $this->shippingRepository $shippingRepository;
  38.         $this->orderStateMachine $orderStateMachine;
  39.     }
  40.     /**
  41.      * 出荷CSVアップロード
  42.      *
  43.      * @Route("/%eccube_admin_route%/order/shipping_csv_upload", name="admin_shipping_csv_import", methods={"GET", "POST"})
  44.      * @Template("@admin/Order/csv_shipping.twig")
  45.      *
  46.      * @throws \Doctrine\DBAL\ConnectionException
  47.      */
  48.     public function csvShipping(Request $request)
  49.     {
  50.         $form $this->formFactory->createBuilder(CsvImportType::class)->getForm();
  51.         $columnConfig $this->getColumnConfig();
  52.         $errors = [];
  53.         if ($request->getMethod() === 'POST') {
  54.             $form->handleRequest($request);
  55.             if ($form->isValid()) {
  56.                 $formFile $form['import_file']->getData();
  57.                 if (!empty($formFile)) {
  58.                     $csv $this->getImportData($formFile);
  59.                     try {
  60.                         $this->entityManager->getConfiguration()->setSQLLogger(null);
  61.                         $this->entityManager->getConnection()->beginTransaction();
  62.                         $this->loadCsv($csv$errors);
  63.                         if ($errors) {
  64.                             $this->entityManager->getConnection()->rollBack();
  65.                         } else {
  66.                             $this->entityManager->flush();
  67.                             $this->entityManager->getConnection()->commit();
  68.                             $this->addInfo('admin.common.csv_upload_complete''admin');
  69.                         }
  70.                     } finally {
  71.                         $this->removeUploadedFile();
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.         return [
  77.             'form' => $form->createView(),
  78.             'headers' => $columnConfig,
  79.             'errors' => $errors,
  80.         ];
  81.     }
  82.     protected function loadCsv(CsvImportService $csv, &$errors)
  83.     {
  84. file_put_contents('/home/dober/testman.biz/public_html/yamaria-ec-demo/var/log/dev/debug.log'"load shipping csv\n"FILE_APPEND);
  85.         $columnConfig $this->getColumnConfig();
  86.         if ($csv === false) {
  87.             $errors[] = trans('admin.common.csv_invalid_format');
  88.         }
  89.         // 必須カラムの確認
  90.         $requiredColumns array_map(function ($value) {
  91.             return $value['name'];
  92.         }, array_filter($columnConfig, function ($value) {
  93.             return $value['required'];
  94.         }));
  95.         $csvColumns $csv->getColumnHeaders();
  96.         if (count(array_diff($requiredColumns$csvColumns)) > 0) {
  97.             $errors[] = trans('admin.common.csv_invalid_format');
  98.             return;
  99.         }
  100.         // 行数の確認
  101.         $size count($csv);
  102.         if ($size 1) {
  103.             $errors[] = trans('admin.common.csv_invalid_format');
  104.             return;
  105.         }
  106.         $columnNames array_combine(array_keys($columnConfig), array_column($columnConfig'name'));
  107.         foreach ($csv as $line => $row) {
  108.             // 出荷IDがなければエラー
  109.             if (!isset($row[$columnNames['id']])) {
  110.                 $errors[] = trans('admin.common.csv_invalid_required', ['%line%' => $line 1'%name%' => $columnNames['id']]);
  111.                 continue;
  112.             }
  113.             /* @var Shipping $Shipping */
  114.             $Shipping is_numeric($row[$columnNames['id']]) ? $this->shippingRepository->find($row[$columnNames['id']]) : null;
  115.             // 存在しない出荷IDはエラー
  116.             if (is_null($Shipping)) {
  117.                 $errors[] = trans('admin.common.csv_invalid_not_found', ['%line%' => $line 1'%name%' => $columnNames['id']]);
  118.                 continue;
  119.             }
  120.             if (isset($row[$columnNames['tracking_number']])) {
  121.                 // 半角英数字ハイフン以外エラー
  122.                 if (!preg_match('/^[0-9a-zA-Z-]*$/u'$row[$columnNames['tracking_number']])) {
  123.                     $errors[] = trans('admin.common.csv_invalid_format_line_name', ['%line%' => $line 1'%name%' => $columnNames['tracking_number']]);
  124.                     continue;
  125.                 }
  126.                 $Shipping->setTrackingNumber($row[$columnNames['tracking_number']]);
  127.             }
  128.             if (isset($row[$columnNames['shipping_date']])) {
  129.                 // 日付フォーマットが異なる場合はエラー
  130.                 $shippingDate \DateTime::createFromFormat('Y-m-d'$row[$columnNames['shipping_date']]);
  131.                 if ($shippingDate === false) {
  132.                     $errors[] = trans('admin.common.csv_invalid_date_format', ['%line%' => $line 1'%name%' => $columnNames['shipping_date']]);
  133.                     continue;
  134.                 }
  135.                 $shippingDate->setTime(000);
  136.                 $Shipping->setShippingDate($shippingDate);
  137.             }
  138.             $Order $Shipping->getOrder();
  139.             $RelateShippings $Order->getShippings();
  140.             $allShipped true;
  141.             foreach ($RelateShippings as $RelateShipping) {
  142.                 if (!$RelateShipping->getShippingDate()) {
  143.                     $allShipped false;
  144.                     break;
  145.                 }
  146.             }
  147.             $OrderStatus $this->entityManager->find(OrderStatus::class, OrderStatus::DELIVERED);
  148.             if ($allShipped) {
  149.                 if ($this->orderStateMachine->can($Order$OrderStatus)) {
  150.                     $this->orderStateMachine->apply($Order$OrderStatus);
  151.                 } else {
  152.                     $from $Order->getOrderStatus()->getName();
  153.                     $to $OrderStatus->getName();
  154.                     $errors[] = trans('admin.order.failed_to_change_status', [
  155.                         '%name%' => $Shipping->getId(),
  156.                         '%from%' => $from,
  157.                         '%to%' => $to,
  158.                     ]);
  159.                 }
  160.             }
  161.         }
  162.     }
  163.     /**
  164.      * アップロード用CSV雛形ファイルダウンロード
  165.      *
  166.      * @Route("/%eccube_admin_route%/order/csv_template", name="admin_shipping_csv_template", methods={"GET"})
  167.      */
  168.     public function csvTemplate(Request $request)
  169.     {
  170.         $columns array_column($this->getColumnConfig(), 'name');
  171.         return $this->sendTemplateResponse($request$columns'shipping.csv');
  172.     }
  173.     protected function getColumnConfig()
  174.     {
  175.         return [
  176.             'id' => [
  177.                 'name' => trans('admin.order.shipping_csv.shipping_id_col'),
  178.                 'description' => trans('admin.order.shipping_csv.shipping_id_description'),
  179.                 'required' => true,
  180.             ],
  181.             'tracking_number' => [
  182.                 'name' => trans('admin.order.shipping_csv.tracking_number_col'),
  183.                 'description' => trans('admin.order.shipping_csv.tracking_number_description'),
  184.                 'required' => false,
  185.             ],
  186.             'shipping_date' => [
  187.                 'name' => trans('admin.order.shipping_csv.shipping_date_col'),
  188.                 'description' => trans('admin.order.shipping_csv.shipping_date_description'),
  189.                 'required' => true,
  190.             ],
  191.         ];
  192.     }
  193. }