<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Eccube\Controller\Admin\Order;
use Eccube\Common\Constant;
use Eccube\Controller\AbstractController;
use Eccube\Entity\ExportCsvRow;
use Eccube\Entity\Master\CsvType;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Entity\OrderPdf;
use Eccube\Entity\Shipping;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Form\Type\Admin\OrderPdfType;
use Eccube\Form\Type\Admin\SearchOrderType;
use Eccube\Repository\CustomerRepository;
use Eccube\Repository\Master\OrderStatusRepository;
use Eccube\Repository\Master\PageMaxRepository;
use Eccube\Repository\Master\ProductStatusRepository;
use Eccube\Repository\Master\SexRepository;
use Eccube\Repository\OrderPdfRepository;
use Eccube\Repository\OrderRepository;
use Eccube\Repository\PaymentRepository;
use Eccube\Repository\ProductStockRepository;
use Eccube\Service\CsvExportService;
use Eccube\Service\MailService;
use Eccube\Service\OrderPdfService;
use Eccube\Service\OrderStateMachine;
use Eccube\Service\PurchaseFlow\PurchaseFlow;
use Eccube\Util\FormUtil;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Plugin\EccubePaymentLite42\Entity\PaymentStatus;
use Plugin\EccubePaymentLite42\Repository\RegularOrderRepository;
use Plugin\EccubePaymentLite42\Entity\RegularStatus;
//プラン移行メール送信サービス追加
use Plugin\EccubePaymentLite42\Service\Mail\MigrationPlanNoticeMailService;
//----------
//代理店名の取得はカスタムリポジトリを使用
//----------
use Customize\Repository\CustomizeCustomerRepository;
class OrderController extends AbstractController
{
/**
* @var PurchaseFlow
*/
protected $purchaseFlow;
/**
* @var CsvExportService
*/
protected $csvExportService;
/**
* @var CustomerRepository
*/
protected $customerRepository;
/**
* @var PaymentRepository
*/
protected $paymentRepository;
/**
* @var SexRepository
*/
protected $sexRepository;
/**
* @var OrderStatusRepository
*/
protected $orderStatusRepository;
/**
* @var PageMaxRepository
*/
protected $pageMaxRepository;
/**
* @var ProductStatusRepository
*/
protected $productStatusRepository;
/**
* @var OrderRepository
*/
protected $orderRepository;
/** @var OrderPdfRepository */
protected $orderPdfRepository;
/**
* @var ProductStockRepository
*/
protected $productStockRepository;
/** @var OrderPdfService */
protected $orderPdfService;
/**
* @var ValidatorInterface
*/
protected $validator;
/**
* @var OrderStateMachine
*/
protected $orderStateMachine;
/**
* @var MailService
*/
protected $mailService;
/**
* @var MigrationPlanNoticeMailService
*/
private $migrationPlanNoticeMailService;
//----代理店カスタマイズ------
//代理店名の取得はカスタムリポジトリを使用
//----------
private $customizeCustomerRepository;
/**
* @var RegularOrderRepository
*/
protected $regularOrderRepository;
/**
* OrderController constructor.
*
* @param PurchaseFlow $orderPurchaseFlow
* @param CsvExportService $csvExportService
* @param CustomerRepository $customerRepository
* @param PaymentRepository $paymentRepository
* @param SexRepository $sexRepository
* @param OrderStatusRepository $orderStatusRepository
* @param PageMaxRepository $pageMaxRepository
* @param ProductStatusRepository $productStatusRepository
* @param ProductStockRepository $productStockRepository
* @param OrderRepository $orderRepository
* @param OrderPdfRepository $orderPdfRepository
* @param ValidatorInterface $validator
* @param OrderStateMachine $orderStateMachine ;
*/
public function __construct(
PurchaseFlow $orderPurchaseFlow,
CsvExportService $csvExportService,
CustomerRepository $customerRepository,
PaymentRepository $paymentRepository,
SexRepository $sexRepository,
OrderStatusRepository $orderStatusRepository,
PageMaxRepository $pageMaxRepository,
ProductStatusRepository $productStatusRepository,
ProductStockRepository $productStockRepository,
OrderRepository $orderRepository,
OrderPdfRepository $orderPdfRepository,
ValidatorInterface $validator,
OrderStateMachine $orderStateMachine,
MailService $mailService,
MigrationPlanNoticeMailService $migrationPlanNoticeMailService,
CustomizeCustomerRepository $customizeCustomerRepository,
RegularOrderRepository $regularOrderRepository
) {
$this->purchaseFlow = $orderPurchaseFlow;
$this->csvExportService = $csvExportService;
$this->customerRepository = $customerRepository;
$this->paymentRepository = $paymentRepository;
$this->sexRepository = $sexRepository;
$this->orderStatusRepository = $orderStatusRepository;
$this->pageMaxRepository = $pageMaxRepository;
$this->productStatusRepository = $productStatusRepository;
$this->productStockRepository = $productStockRepository;
$this->orderRepository = $orderRepository;
$this->orderPdfRepository = $orderPdfRepository;
$this->validator = $validator;
$this->orderStateMachine = $orderStateMachine;
$this->mailService = $mailService;
$this->migrationPlanNoticeMailService = $migrationPlanNoticeMailService;
$this->customizeCustomerRepository = $customizeCustomerRepository;
$this->regularOrderRepository = $regularOrderRepository;
}
/**
* 受注一覧画面.
*
* - 検索条件, ページ番号, 表示件数はセッションに保持されます.
* - クエリパラメータでresume=1が指定された場合、検索条件, ページ番号, 表示件数をセッションから復旧します.
* - 各データの, セッションに保持するアクションは以下の通りです.
* - 検索ボタン押下時
* - 検索条件をセッションに保存します
* - ページ番号は1で初期化し、セッションに保存します。
* - 表示件数変更時
* - クエリパラメータpage_countをセッションに保存します。
* - ただし, mtb_page_maxと一致しない場合, eccube_default_page_countが保存されます.
* - ページング時
* - URLパラメータpage_noをセッションに保存します.
* - 初期表示
* - 検索条件は空配列, ページ番号は1で初期化し, セッションに保存します.
*
* @Route("/%eccube_admin_route%/order", name="admin_order", methods={"GET", "POST"})
* @Route("/%eccube_admin_route%/order/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_order_page", methods={"GET", "POST"})
* @Template("@admin/Order/index.twig")
*/
public function index(Request $request, PaginatorInterface $paginator, $page_no = null)
{
$builder = $this->formFactory
->createBuilder(SearchOrderType::class);
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_ORDER_INDEX_INITIALIZE);
$searchForm = $builder->getForm();
/**
* ページの表示件数は, 以下の順に優先される.
* - リクエストパラメータ
* - セッション
* - デフォルト値
* また, セッションに保存する際は mtb_page_maxと照合し, 一致した場合のみ保存する.
**/
$page_count = $this->session->get(
'eccube.admin.order.search.page_count',
$this->eccubeConfig->get('eccube_default_page_count')
);
$page_count_param = (int) $request->get('page_count');
$pageMaxis = $this->pageMaxRepository->findAll();
if ($page_count_param) {
foreach ($pageMaxis as $pageMax) {
if ($page_count_param == $pageMax->getName()) {
$page_count = $pageMax->getName();
$this->session->set('eccube.admin.order.search.page_count', $page_count);
break;
}
}
}
if ('POST' === $request->getMethod()) {
$searchForm->handleRequest($request);
if ($searchForm->isValid()) {
/**
* 検索が実行された場合は, セッションに検索条件を保存する.
* ページ番号は最初のページ番号に初期化する.
*/
$page_no = 1;
$searchData = $searchForm->getData();
// 検索条件, ページ番号をセッションに保持.
$this->session->set('eccube.admin.order.search', FormUtil::getViewData($searchForm));
$this->session->set('eccube.admin.order.search.page_no', $page_no);
} else {
// 検索エラーの際は, 詳細検索枠を開いてエラー表示する.
return [
'searchForm' => $searchForm->createView(),
'pagination' => [],
'pageMaxis' => $pageMaxis,
'page_no' => $page_no,
'page_count' => $page_count,
'has_errors' => true,
];
}
} else {
if (null !== $page_no || $request->get('resume')) {
/*
* ページ送りの場合または、他画面から戻ってきた場合は, セッションから検索条件を復旧する.
*/
if ($page_no) {
// ページ送りで遷移した場合.
$this->session->set('eccube.admin.order.search.page_no', (int) $page_no);
} else {
// 他画面から遷移した場合.
$page_no = $this->session->get('eccube.admin.order.search.page_no', 1);
}
$viewData = $this->session->get('eccube.admin.order.search', []);
$searchData = FormUtil::submitAndGetData($searchForm, $viewData);
} else {
/**
* 初期表示の場合.
*/
$page_no = 1;
$viewData = [];
if ($statusId = (int) $request->get('order_status_id')) {
$viewData = ['status' => [$statusId]];
}
$searchData = FormUtil::submitAndGetData($searchForm, $viewData);
// セッション中の検索条件, ページ番号を初期化.
$this->session->set('eccube.admin.order.search', $viewData);
$this->session->set('eccube.admin.order.search.page_no', $page_no);
}
}
$qb = $this->orderRepository->getQueryBuilderBySearchDataForAdmin($searchData);
$event = new EventArgs(
[
'qb' => $qb,
'searchData' => $searchData,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_ORDER_INDEX_SEARCH);
$sortKey = $searchData['sortkey'];
if (empty($this->orderRepository::COLUMNS[$sortKey]) || $sortKey == 'order_status') {
$pagination = $paginator->paginate(
$qb,
$page_no,
$page_count
);
} else {
$pagination = $paginator->paginate(
$qb,
$page_no,
$page_count,
['wrap-queries' => true]
);
}
// $paginationから顧客データを取得
$Orders = $pagination->getItems();
// 各顧客に代理店名を追加
foreach ($Orders as $Order) {
$customer = $Order->getCustomer();
if ($customer !== null) {
$agencyName = null;
$agencyName = $this->customizeCustomerRepository->findAgencyNameByCustomerId($customer->getId());
if ($agencyName) {
$Order->agencyName = $agencyName;
} else {
$Order->agencyName = "";
}
$agencyId = null;
$agencyId = $this->customizeCustomerRepository->findAgencyIdByCustomerId($customer->getId());
if ($agencyId) {
$Order->agencyId = $agencyId;
} else {
$Order->agencyId = "";
}
} else {
$Order->agencyName = "";
$Order->agencyId = null;
}
}
// 定期受注からの受注生成状態を取得
$regularOrderValidation = $this->validateRegularOrderGeneration();
return [
'searchForm' => $searchForm->createView(),
'pagination' => $pagination,
'pageMaxis' => $pageMaxis,
'page_no' => $page_no,
'page_count' => $page_count,
'has_errors' => false,
'OrderStatuses' => $this->orderStatusRepository->findBy([], ['sort_no' => 'ASC']),
'regularOrderValidation' => $regularOrderValidation, // 定期受注検証結果を追加
];
}
/**
* 定期受注から生成された受注の整合性を検証
*
* @return array [
* 'status' => 'not_executed' | 'success' | 'error',
* 'message' => string,
* 'executed_at' => \DateTime|null,
* 'error_count' => int,
* 'error_details' => array
* ]
*/
private function validateRegularOrderGeneration(): array
{
$today = new \DateTime('today');
$batchExecutionTime = new \DateTime('today 12:20:00');
$now = new \DateTime();
// Configテーブルから最終実行日時を取得
/** @var \Plugin\EccubePaymentLite42\Entity\Config $Config */
$Config = $this->entityManager
->getRepository(\Plugin\EccubePaymentLite42\Entity\Config::class)
->find(1);
if (!$Config) {
return [
'status' => 'error',
'message' => 'バッチ処理の設定情報が見つかりません',
'executed_at' => null,
'error_count' => 0,
'error_details' => [],
];
}
$lastExecutedAt = $Config->getCreatedAt();
//本日の受注一括作成対象を含めるかどうか
$todayInclude = false;
//12時20分を過ぎている場合、本日の受注一括作成対象を含める
if ($now >= $batchExecutionTime){
$todayInclude = true;
}
// ここで取得できる場合は、対象日付の定期便受注一括作成から漏れている定期便
$targetRegularOrders = $this->getTargetRegularOrders($todayInclude);
$totalCount = count($targetRegularOrders);
if ($totalCount === 0) {
return [
'status' => 'success',
'message' => '定期便受注一括作成は正常に完了しています。',
'executed_at' => $lastExecutedAt,
'error_count' => 0,
'error_details' => [],
];
}
// 各定期便の受注生成状態をチェック
$errorCount = 0;
$errorDetails = [];
foreach ($targetRegularOrders as $regularOrder) {
$validationResult = $this->validateSingleRegularOrder($regularOrder, $todayInclude);
if (!$validationResult['is_valid']) {
$errorCount++;
$errorDetails[] = $validationResult;
}
}
// 状態判定
if ($errorCount === 0) {
$status = 'success';
$message = '定期便受注一括作成は正常に完了しています。';
} else {
$status = 'error';
$message = sprintf(
'定期便受注一括作成が実施されていない定期便があります(件数: %d件)',
$errorCount
);
}
return [
'status' => $status,
'message' => $message,
'executed_at' => $lastExecutedAt,
'error_count' => $errorCount,
'error_details' => $errorDetails,
];
}
/**
* 個別の定期受注の検証
*
* @param \Plugin\EccubePaymentLite42\Entity\RegularOrder $regularOrder
* @param \DateTime $targetDate
* @return array
*/
private function validateSingleRegularOrder($regularOrder, $todayInclude): array
{
$regularOrderId = $regularOrder->getId();
$regularStatus = $regularOrder->getRegularStatus();
$regularStatusName = $regularStatus->getName();
$regularStopDate = $regularOrder->getRegularStopDate();
$RegularShipping = $regularOrder->getRegularShippings()->first();
$regularNextDeliveryDate = $RegularShipping->getNextDeliveryDate()
? $RegularShipping->getNextDeliveryDate()->format('Y年m月d日')
: '';
// エラー判定用の配列
$errors = [];
switch ($regularStatus->getId()) {
// 継続の場合
case RegularStatus::CONTINUE:
// 再開した場合、次回配送お届け日が8日後になるため、次回配送日が7日後のものは昨日に再開した定期便となる
$targetDaysLater = new \DateTime('today');
if($todayInclude){
$targetDaysLater->modify('+ 8 day');
}else{
$targetDaysLater->modify('+ 7 day');
}
// 再開判定(停止日あり)
if ($regularStopDate && $RegularShipping) {
// 再開かつ5日以内 → エラー
if ($RegularShipping->getNextDeliveryDate() < $targetDaysLater) {
$regularStatusName = "継続(再開)";
$errors[] = '再開後の受注一括作成処理が実施されていません。(継続[再開])';
}
// 正常
} else {
// 通常の継続の場合は、受注一括作成漏れの為エラー
$errors[] = '受注一括作成処理が実施されていません。(継続)';
}
break;
// 決済エラーの場合
case RegularStatus::PAYMENT_ERROR:
// 決済エラーの場合は、受注一括作成漏れの為エラー
$errors[] = '受注一括作成処理が実施されていません(決済エラー)。';
break;
// 再決済待ちの場合
case RegularStatus::WAITING_RE_PAYMENT:
// 再決済待ちの場合は、受注一括作成漏れのためエラー
$errors[] = '受注一括作成処理が実施されていません(再決済待ち)。';
break;
default:
// それ以外のステータスはクエリ上ありえないが、例外処理としてエラーを出力
$errors[] = sprintf(
'定期受注ID %d のステータスが想定外です(%s)',
$regularOrder->getId(),
$regularStatus->getName()
);
}
return [
'is_valid' => empty($errors),
'regular_order_id' => $regularOrderId,
'regular_order_no' => $regularOrder->getOrderNo(),
'customer_name' => $regularOrder->getName01() . ' ' . $regularOrder->getName02(),
'regular_status' => $regularStatusName,
'regular_next_delivery_date' => $regularNextDeliveryDate,
'generated_orders_count' => 0, // 受注一括作成漏れのため0
'errors' => $errors,
];
}
/**
* 対象の定期便を取得
*
* @return array
*/
private function getTargetRegularOrders($todayInclude): array
{
/** @var \Plugin\EccubePaymentLite42\Entity\Config $Config */
$Config = $this->entityManager
->getRepository(\Plugin\EccubePaymentLite42\Entity\Config::class)
->find(1);
if (!$Config) {
return [];
}
// 対象の定期便の日付を計算
$deadLineStartDate = new \DateTime('today');
$deadLineStartDate->modify('- 14 day'); //過去2週間分をチェック
//本日日付を含める場合(12:20分以降)
if($todayInclude){
$deadLineEndDate = new \DateTime('tomorrow');
$deadLineEndDate->modify('+' . $Config->getRegularOrderDeadline() . ' day');
}else{
//本日日付を含めない場合(12:20分より前)
$deadLineEndDate = new \DateTime('tomorrow');
$deadLineEndDate->modify('+' . $Config->getRegularOrderDeadline() - 1 . ' day');
}
// 定期便データの受け取り
/** @var RegularOrder[] $RegularOrders */
$RegularOrders = $this
->regularOrderRepository
->getRegularOrdersForCommand(clone $deadLineStartDate, clone $deadLineEndDate);
return $RegularOrders;
}
/**
* @Route("/%eccube_admin_route%/order/bulk_delete", name="admin_order_bulk_delete", methods={"POST"})
*/
public function bulkDelete(Request $request)
{
$this->isTokenValid();
$ids = $request->get('ids');
foreach ($ids as $order_id) {
$Order = $this->orderRepository
->find($order_id);
if ($Order) {
$this->entityManager->remove($Order);
log_info('受注削除', [$Order->getId()]);
}
}
$this->entityManager->flush();
$this->addSuccess('admin.common.delete_complete', 'admin');
return $this->redirect($this->generateUrl('admin_order', ['resume' => Constant::ENABLED]));
}
/**
* 受注CSVの出力.
*
* @Route("/%eccube_admin_route%/order/export/order", name="admin_order_export_order", methods={"GET"})
*
* @param Request $request
*
* @return StreamedResponse
*/
public function exportOrder(Request $request)
{
$filename = 'order_' . (new \DateTime())->format('YmdHis') . '.csv';
$response = $this->exportCsv($request, CsvType::CSV_TYPE_ORDER, $filename);
log_info('受注CSV出力ファイル名', [$filename]);
return $response;
}
/**
* 配送CSVの出力.
*
* @Route("/%eccube_admin_route%/order/export/shipping", name="admin_order_export_shipping", methods={"GET"})
*
* @param Request $request
*
* @return StreamedResponse
*/
public function exportShipping(Request $request)
{
$filename = 'shipping_' . (new \DateTime())->format('YmdHis') . '.csv';
$response = $this->exportCsv($request, CsvType::CSV_TYPE_SHIPPING, $filename);
log_info('配送CSV出力ファイル名', [$filename]);
return $response;
}
/**
* @param Request $request
* @param $csvTypeId
* @param string $fileName
*
* @return StreamedResponse
*/
protected function exportCsv(Request $request, $csvTypeId, $fileName)
{
// タイムアウトを無効にする.
set_time_limit(0);
// sql loggerを無効にする.
$em = $this->entityManager;
$em->getConfiguration()->setSQLLogger(null);
$response = new StreamedResponse();
$response->setCallback(function () use ($request, $csvTypeId) {
// CSV種別を元に初期化.
$this->csvExportService->initCsvType($csvTypeId);
// 受注データ検索用のクエリビルダを取得.
$qb = $this->csvExportService
->getOrderQueryBuilder($request);
// ヘッダ行の出力.
$this->csvExportService->exportHeader();
// データ行の出力.
$this->csvExportService->setExportQueryBuilder($qb);
$this->csvExportService->exportData(function ($entity, $csvService) use ($request) {
$Csvs = $csvService->getCsvs();
$Order = $entity;
$OrderItems = $Order->getOrderItems();
$Shippings = [];
foreach ($OrderItems as $OrderItem) {
if (!$OrderItem->isProduct()) {
continue;
}
$Shipping = $OrderItem->getShipping();
if ($Shipping) {
$Shippings[$Shipping->getId()] = $Shipping;
}
}
//=========================
//CSVカスタマイズ
//伝票毎に出力
//商品以外は除外
//伝票番号毎にも出力
//-------------------------
foreach ($Shippings as $Shipping) {
$ExportCsvRow = new ExportCsvRow();
foreach ($Csvs as $Csv) {
// 受注データを検索.
$ExportCsvRow->setData($csvService->getData($Csv, $Order));
$customer = $Order->getCustomer();
if ($customer == null) {
continue;
}
if ($ExportCsvRow->isDataNull()) {
// 受注データにない場合は, 受注明細を検索.
$OrderItems = $Shipping->getOrderItems();
$itemData = [];
$shippingFlg = false;
foreach ($OrderItems as $OrderItem) {
// 商品以外は除外
if (!$OrderItem->isProduct()) {
continue;
}
if ($OrderItem->getShipping()) {
if (str_replace('\\\\', '\\', $Csv->getEntityName()) == "Eccube\Entity\OrderItem") {
$itemData[] = $csvService->getData($Csv, $OrderItem);
} else if (str_replace('\\\\', '\\', $Csv->getEntityName()) == "Eccube\Entity\Shipping") {
if ($Csv->getFieldName() == "tracking_number") {
// 伝票番号が複数ある場合は、伝票番号を改行して出力
$shippingFlg = true;
$ShippingLists = [];
$trackingNumber = $Shipping->getTrackingNumber();
if (!empty($trackingNumber)) {
$ShippingLists[] = $trackingNumber;
}
$truckingNumbers = $Shipping->getTruckingNumbers() ?? [];
foreach ($truckingNumbers as $number) {
if (!empty($number)) {
$ShippingLists[] = $number;
}
}
$ExportCsvRow->setData(implode("\n", $ShippingLists));
} else if ($Csv->getFieldName() == "shipping_delivery_date") {
$shippingFlg = true;
$shippingData = $csvService->getData($Csv, $Shipping);
if (empty($shippingData)) {
$shippingData = "最短日";
} else {
// 日付の時間部分を削除し、年月日の形式に変換
$shippingData = date_format(new \DateTime($shippingData), 'Y/m/d');
}
$ExportCsvRow->setData($shippingData);
} else {
$shippingFlg = true;
$ExportCsvRow->setData($csvService->getData($Csv, $Shipping));
}
}
} else {
$itemData[] = $csvService->getData($Csv, $OrderItem);
}
}
if (!$shippingFlg) {
$ExportCsvRow->setData(implode("\n", $itemData));
}
}
//カスタマイズ代理店の追加
if (str_replace('\\\\', '\\', $Csv->getEntityName()) == "Customize\Entity\Agency") {
// 各顧客に代理店名を追加
$customer = $Order->getCustomer();
if ($customer !== null) {
$agencyName = $this->customizeCustomerRepository->findAgencyNameByCustomerId($customer->getId());
if ($agencyName) {
$agencyNameText = $agencyName;
} else {
$agencyNameText = "";
}
$ExportCsvRow->setData($agencyNameText);
} else {
$agencyNameText = "";
$ExportCsvRow->setData($agencyNameText);
}
}
// カスタマイズ工場出荷日の追加
if (str_replace('\\\\', '\\', $Csv->getEntityName()) == "Customize\Entity\CSV") {
// 本日の日付をセット
$today = new \DateTime();
$formattedDate = $today->format('Y/m/d');
$ExportCsvRow->setData($formattedDate);
}
$event = new EventArgs(
[
'csvService' => $csvService,
'Csv' => $Csv,
// 'OrderItem' => $OrderItem,
'ExportCsvRow' => $ExportCsvRow,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_ORDER_CSV_EXPORT_ORDER);
$ExportCsvRow->pushData();
}
// 伝票番号が複数ある場合は、伝票番号を改行して出力
// $ShippingLists = [];
// $trackingNumber = $Shipping->getTrackingNumber();
// if (!empty($trackingNumber)) {
// $ShippingLists[] = $trackingNumber;
// }
// $truckingNumbers = $Shipping->getTruckingNumbers() ?? [];
// foreach ($truckingNumbers as $number) {
// if (!empty($number)) {
// $ShippingLists[] = $number;
// }
// }
// CSV出力項目と合致するデータを取得.
// $row[] = number_format(memory_get_usage(true));
// 出力.
$csvService->fputcsv($ExportCsvRow->getRow());
}
});
});
$response->headers->set('Content-Type', 'application/octet-stream');
$response->headers->set('Content-Disposition', 'attachment; filename=' . $fileName);
return $response;
}
/**
* Update to order status
*
* @Route("/%eccube_admin_route%/shipping/{id}/order_status", requirements={"id" = "\d+"}, name="admin_shipping_update_order_status", methods={"PUT"})
*
* @param Request $request
* @param Shipping $Shipping
*
* @return \Symfony\Component\HttpFoundation\JsonResponse
*/
public function updateOrderStatus(Request $request, Shipping $Shipping)
{
if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
return $this->json(['status' => 'NG'], 400);
}
$Order = $Shipping->getOrder();
$OrderStatus = $this->entityManager->find(OrderStatus::class, $request->get('order_status'));
if (!$OrderStatus) {
return $this->json(['status' => 'NG'], 400);
}
$result = [];
// 発送済みステータスへの変更を許可する条件
if ($OrderStatus->getId() == OrderStatus::DELIVERED) {
// Null チェック
$orderStatusId = $Order->getOrderStatus() ? $Order->getOrderStatus()->getId() : null;
$paymentStatusId = $Order->getPaymentStatus() ? $Order->getPaymentStatus()->getId() : null;
$trackingNumber = $Shipping->getTrackingNumber();
$truckingNumbers = $Shipping->getTruckingNumbers() ? array_filter($Shipping->getTruckingNumbers()) : [];
$FactoryShipmentStatus = $Order->getFactoryShipmentStatus();
// Check if $trackingNumber is a 12-digit number
$isValidTrackingNumber = preg_match('/^\d{12}$/', $trackingNumber) === 1;
// Check if there is any 12-digit number in $truckingNumbers array
$isValidTruckingNumbers = array_filter($truckingNumbers, function ($num) {
return preg_match('/^\d{12}$/', $num) === 1;
});
if ($orderStatusId != OrderStatus::PAID) {
$from = $Order->getOrderStatus()->getName();
$to = $OrderStatus->getName();
$result = ['message' => trans('%name%:受注ステータスが入金済でないため %to% にステータス変更できません', [
'%name%' => $Shipping->getId(),
'%to%' => $to,
])];
return $this->json(array_merge(['status' => 'OK'], $result));
} else if ($paymentStatusId != PaymentStatus::CHARGED) {
$from = $Order->getOrderStatus()->getName();
$to = $OrderStatus->getName();
$result = ['message' => trans('%name%:決済ステータスが課金済でないため %to% にステータス変更できません', [
'%name%' => $Shipping->getId(),
'%to%' => $to,
])];
return $this->json(array_merge(['status' => 'OK'], $result));
} else if (!$isValidTrackingNumber && empty($isValidTruckingNumbers)) {
//有効な伝票があるかどうか
$from = $Order->getOrderStatus()->getName();
$to = $OrderStatus->getName();
$result = ['message' => trans('%name%:有効な伝票番号がないため %to% にステータス変更できません', [
'%name%' => $Shipping->getId(),
'%to%' => $to,
])];
return $this->json(array_merge(['status' => 'OK'], $result));
} else if ($FactoryShipmentStatus != 2) {
//工場出荷ステータスが登録済みではない場合
$from = $Order->getOrderStatus()->getName();
$to = $OrderStatus->getName();
$result = ['message' => trans('%name%:工場出荷未登録のため %to% にステータス変更できません', [
'%name%' => $Shipping->getId(),
'%to%' => $to,
])];
return $this->json(array_merge(['status' => 'OK'], $result));
}
}
try {
if ($Order->getOrderStatus()->getId() == $OrderStatus->getId()) {
log_info('対応状況一括変更スキップ');
$result = ['message' => trans('admin.order.skip_change_status', ['%name%' => $Shipping->getId()])];
} else {
if ($this->orderStateMachine->can($Order, $OrderStatus)) {
if ($OrderStatus->getId() == OrderStatus::DELIVERED) {
if (!$Shipping->isShipped()) {
$Shipping->setShippingDate(new \DateTime());
//=============
//プラン移行
//=============
$this->MigrationPlanAndSendMail($Order);
}
$allShipped = true;
foreach ($Order->getShippings() as $Ship) {
if (!$Ship->isShipped()) {
$allShipped = false;
break;
}
}
if ($allShipped) {
$this->orderStateMachine->apply($Order, $OrderStatus);
}
} else if ($OrderStatus->getId() == 10) {
$this->mailService->sendCancelExcessMail($Order);
} else {
$this->orderStateMachine->apply($Order, $OrderStatus);
}
/**カスタマイズ 出荷チェックボックスのメール送信はフラグを反転させる */
if ($request->get('notificationMail')) { // for SimpleStatusUpdate
if ($OrderStatus->getId() == OrderStatus::DELIVERED) {
$result['mail'] = false;
} else {
$result['mail'] = true;
$this->mailService->sendShippingNotifyMail($Shipping);
$Shipping->setMailSendDate(new \DateTime());
}
} else {
if ($OrderStatus->getId() == OrderStatus::DELIVERED) {
$result['mail'] = true;
$this->mailService->sendShippingNotifyMail($Shipping);
$Shipping->setMailSendDate(new \DateTime());
} else {
$result['mail'] = false;
}
}
// 対応中・キャンセルの更新時は商品在庫を増減させているので商品情報を更新
if ($OrderStatus->getId() == OrderStatus::IN_PROGRESS || $OrderStatus->getId() == OrderStatus::CANCEL) {
foreach ($Order->getOrderItems() as $OrderItem) {
$ProductClass = $OrderItem->getProductClass();
if ($OrderItem->isProduct() && !$ProductClass->isStockUnlimited()) {
$this->entityManager->persist($ProductClass);
$this->entityManager->flush();
$ProductStock = $this->productStockRepository->findOneBy(['ProductClass' => $ProductClass]);
$this->entityManager->persist($ProductStock);
$this->entityManager->flush();
}
}
}
$this->entityManager->persist($Order);
$this->entityManager->persist($Shipping);
$this->entityManager->flush();
// 会員の場合、購入回数、購入金額などを更新
if ($Customer = $Order->getCustomer()) {
$this->orderRepository->updateOrderSummary($Customer);
$this->entityManager->persist($Customer);
$this->entityManager->flush();
}
} else {
$from = $Order->getOrderStatus()->getName();
$to = $OrderStatus->getName();
$result = ['message' => trans('admin.order.failed_to_change_status', [
'%name%' => $Shipping->getId(),
'%from%' => $from,
'%to%' => $to,
])];
}
log_info('対応状況一括変更処理完了', [$Order->getId()]);
}
} catch (\Exception $e) {
log_error('予期しないエラーです', [$e->getMessage()]);
return $this->json(['status' => 'NG'], 500);
}
return $this->json(array_merge(['status' => 'OK'], $result));
}
/**
* カスタマイズ
* 導入プランの名称変更と通知メールの送信
* 初回フラグの除去
* @param $Order
*/
private function MigrationPlanAndSendMail($Order)
{
//導入プランの商品タグ
$introductionPlanProductTagId = 1;
//移行フラグ
$flgMigration = false;
// 定期受注データの取得
$RegularOrder = $Order->getRegularOrder();
//定期受注カウントが3回の場合
if ($RegularOrder && $RegularOrder->getRegularOrderCount() == 3) {
//定期受注の中に導入プランがあるか確認
foreach ($RegularOrder->getRegularProductOrderItems() as $RegularOrderItem) {
// 商品オブジェクトを取得
$Product = $RegularOrderItem->getProductClass()->getProduct();
// 商品に関連付けられたタグを取得
$ProductTags = $Product->getProductTag();
foreach ($ProductTags as $ProductTag) {
// Tag エンティティを取得
$Tag = $ProductTag->getTag();
// タグのIDが4であればフラグをセット
if ($Tag->getId() == $introductionPlanProductTagId) {
//フラグの有効化
$flgMigration = true;
if ($flgMigration) {
// 商品名を変更する
$RegularOrderItem->setProductName('【定期便】詰め替え用 BIB10L(100ppm)');
$this->entityManager->persist($RegularOrderItem);
//プラン移行通知メール送信
$this
->migrationPlanNoticeMailService
->sendMail($RegularOrder);
//フラグの無効化
$flgMigration = false;
}
}
}
}
} else if ($RegularOrder && $RegularOrder->getRegularOrderCount() == 1) {
//初回発送後は休止ができるようにフラグを変更
$RegularOrder->setRegularFirstFlag(1);
} else {
}
}
/**
* Update to Tracking number.
*
* @Route("/%eccube_admin_route%/shipping/{id}/tracking_number", requirements={"id" = "\d+"}, name="admin_shipping_update_tracking_number", methods={"PUT"})
*
* @param Request $request
* @param Shipping $shipping
*
* @return Response
*/
public function updateTrackingNumber(Request $request, Shipping $shipping)
{
if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
return $this->json(['status' => 'NG'], 400);
}
$trackingNumber = mb_convert_kana($request->get('tracking_number'), 'a', 'utf-8');
/** @var \Symfony\Component\Validator\ConstraintViolationListInterface $errors */
$errors = $this->validator->validate(
$trackingNumber,
[
new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
new Assert\Regex(
['pattern' => '/^[0-9a-zA-Z-]+$/u', 'message' => trans('admin.order.tracking_number_error')]
),
]
);
if ($errors->count() != 0) {
log_info('送り状番号入力チェックエラー');
$messages = [];
/** @var \Symfony\Component\Validator\ConstraintViolationInterface $error */
foreach ($errors as $error) {
$messages[] = $error->getMessage();
}
return $this->json(['status' => 'NG', 'messages' => $messages], 400);
}
try {
$shipping->setTrackingNumber($trackingNumber);
// 値が入っているかを確認
$filledCount = 0;
// 全てのトラッキング番号が12桁か確認するフラグ
$all12Digits = true;
// 現在のトラッキング番号が12桁か確認
if (strlen($trackingNumber) === 12) {
$filledCount++;
} else {
$all12Digits = false;
}
// 2個目以降のトラッキング番号が配列であることを前提とします
$trackingNumbers = $shipping->getTruckingNumbers();
if (is_array($trackingNumbers)) {
foreach ($trackingNumbers as $number) {
if (!empty($number)) {
if (strlen($number) === 12) {
$filledCount++;
} else {
$all12Digits = false;
}
}
}
}
$this->entityManager->persist($shipping);
$this->entityManager->flush();
log_info('送り状番号変更処理完了', [$shipping->getId()]);
$message = [
'status' => 'OK',
'shipping_id' => $shipping->getId(),
'tracking_number' => $trackingNumber,
'filled_count' => $filledCount, // 有効なトラッキング番号の数
'all12Digits' => $all12Digits // 全てが12桁であるかどうかをフラグとして返す
];
return $this->json($message);
} catch (\Exception $e) {
log_error('予期しないエラー', [$e->getMessage()]);
return $this->json(['status' => 'NG'], 500);
}
}
/**
* Update to Tracking number 2.
*
* @Route("/%eccube_admin_route%/shipping/{id}/tracking_number_2", requirements={"id" = "\d+"}, name="admin_shipping_update_tracking_number_2", methods={"PUT"})
*
* @param Request $request
* @param Shipping $shipping
*
* @return Response
*/
public function updateTrackingNumber2(Request $request, Shipping $shipping)
{
if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
return $this->json(['status' => 'NG'], 400);
}
$trackingNumber = mb_convert_kana($request->get('tracking_number'), 'a', 'utf-8');
/** @var \Symfony\Component\Validator\ConstraintViolationListInterface $errors */
$errors = $this->validator->validate(
$trackingNumber,
[
new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
new Assert\Regex(
['pattern' => '/^[0-9a-zA-Z-]+$/u', 'message' => trans('admin.order.tracking_number_error')]
),
]
);
if ($errors->count() != 0) {
log_info('送り状番号入力チェックエラー');
$messages = [];
/** @var \Symfony\Component\Validator\ConstraintViolationInterface $error */
foreach ($errors as $error) {
$messages[] = $error->getMessage();
}
return $this->json(['status' => 'NG', 'messages' => $messages], 400);
}
try {
$shipping->setTrackingNumber2($trackingNumber);
$this->entityManager->persist($shipping);
$this->entityManager->flush();
log_info('送り状番号変更処理完了', [$shipping->getId()]);
$message = ['status' => 'OK', 'shipping_id' => $shipping->getId(), 'tracking_number' => $trackingNumber];
return $this->json($message);
} catch (\Exception $e) {
log_error('予期しないエラー', [$e->getMessage()]);
return $this->json(['status' => 'NG'], 500);
}
}
/**
* Update to Tracking number 2.
*
* @Route("/%eccube_admin_route%/shipping/{id}/tracking_number_3", requirements={"id" = "\d+"}, name="admin_shipping_update_tracking_number_3", methods={"PUT"})
*
* @param Request $request
* @param Shipping $shipping
*
* @return Response
*/
public function updateTrackingNumber3(Request $request, Shipping $shipping)
{
if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
return $this->json(['status' => 'NG'], 400);
}
$trackingNumber = mb_convert_kana($request->get('tracking_number'), 'a', 'utf-8');
/** @var \Symfony\Component\Validator\ConstraintViolationListInterface $errors */
$errors = $this->validator->validate(
$trackingNumber,
[
new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
new Assert\Regex(
['pattern' => '/^[0-9a-zA-Z-]+$/u', 'message' => trans('admin.order.tracking_number_error')]
),
]
);
if ($errors->count() != 0) {
log_info('送り状番号入力チェックエラー');
$messages = [];
/** @var \Symfony\Component\Validator\ConstraintViolationInterface $error */
foreach ($errors as $error) {
$messages[] = $error->getMessage();
}
return $this->json(['status' => 'NG', 'messages' => $messages], 400);
}
try {
$shipping->setTrackingNumber3($trackingNumber);
$this->entityManager->persist($shipping);
$this->entityManager->flush();
log_info('送り状番号変更処理完了', [$shipping->getId()]);
$message = ['status' => 'OK', 'shipping_id' => $shipping->getId(), 'tracking_number' => $trackingNumber];
return $this->json($message);
} catch (\Exception $e) {
log_error('予期しないエラー', [$e->getMessage()]);
return $this->json(['status' => 'NG'], 500);
}
}
/**
* Update to Tracking number 4.
*
* @Route("/%eccube_admin_route%/shipping/{id}/tracking_number_4", requirements={"id" = "\d+"}, name="admin_shipping_update_tracking_number_4", methods={"PUT"})
*
* @param Request $request
* @param Shipping $shipping
*
* @return Response
*/
public function updateTrackingNumber4(Request $request, Shipping $shipping)
{
if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
return $this->json(['status' => 'NG'], 400);
}
$trackingNumber = mb_convert_kana($request->get('tracking_number'), 'a', 'utf-8');
/** @var \Symfony\Component\Validator\ConstraintViolationListInterface $errors */
$errors = $this->validator->validate(
$trackingNumber,
[
new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
new Assert\Regex(
['pattern' => '/^[0-9a-zA-Z-]+$/u', 'message' => trans('admin.order.tracking_number_error')]
),
]
);
if ($errors->count() != 0) {
log_info('送り状番号入力チェックエラー');
$messages = [];
/** @var \Symfony\Component\Validator\ConstraintViolationInterface $error */
foreach ($errors as $error) {
$messages[] = $error->getMessage();
}
return $this->json(['status' => 'NG', 'messages' => $messages], 400);
}
try {
$shipping->setTrackingNumber4($trackingNumber);
$this->entityManager->persist($shipping);
$this->entityManager->flush();
log_info('送り状番号変更処理完了', [$shipping->getId()]);
$message = ['status' => 'OK', 'shipping_id' => $shipping->getId(), 'tracking_number' => $trackingNumber];
return $this->json($message);
} catch (\Exception $e) {
log_error('予期しないエラー', [$e->getMessage()]);
return $this->json(['status' => 'NG'], 500);
}
}
/**
* Update to Tracking number 5.
*
* @Route("/%eccube_admin_route%/shipping/{id}/tracking_number_5", requirements={"id" = "\d+"}, name="admin_shipping_update_tracking_number_5", methods={"PUT"})
*
* @param Request $request
* @param Shipping $shipping
*
* @return Response
*/
public function updateTrackingNumber5(Request $request, Shipping $shipping)
{
if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
return $this->json(['status' => 'NG'], 400);
}
$trackingNumber = mb_convert_kana($request->get('tracking_number'), 'a', 'utf-8');
/** @var \Symfony\Component\Validator\ConstraintViolationListInterface $errors */
$errors = $this->validator->validate(
$trackingNumber,
[
new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
new Assert\Regex(
['pattern' => '/^[0-9a-zA-Z-]+$/u', 'message' => trans('admin.order.tracking_number_error')]
),
]
);
if ($errors->count() != 0) {
log_info('送り状番号入力チェックエラー');
$messages = [];
/** @var \Symfony\Component\Validator\ConstraintViolationInterface $error */
foreach ($errors as $error) {
$messages[] = $error->getMessage();
}
return $this->json(['status' => 'NG', 'messages' => $messages], 400);
}
try {
$shipping->setTrackingNumber5($trackingNumber);
$this->entityManager->persist($shipping);
$this->entityManager->flush();
log_info('送り状番号変更処理完了', [$shipping->getId()]);
$message = ['status' => 'OK', 'shipping_id' => $shipping->getId(), 'tracking_number' => $trackingNumber];
return $this->json($message);
} catch (\Exception $e) {
log_error('予期しないエラー', [$e->getMessage()]);
return $this->json(['status' => 'NG'], 500);
}
}
/**
* 複数のトラッキングナンバーを配列として保存
* Update to Tracking numbers.
*
* @Route("/%eccube_admin_route%/shipping/{id}/tracking_numbers", requirements={"id" = "\d+"}, name="admin_shipping_update_tracking_numbers", methods={"PUT"})
*
* @param Request $request
* @param Shipping $shipping
*
* @return Response
*/
public function updateTrackingNumbers(Request $request, Shipping $shipping)
{
if (!($request->isXmlHttpRequest() && $this->isTokenValid())) {
return $this->json(['status' => 'NG'], 400);
}
//2個目以降の複数
$trackingNumbers = $request->get('tracking_numbers');
//一個目
$trackingDefaultNumber = mb_convert_kana($request->get('trackingDefaultNumber'), 'a', 'utf-8');
//==============================
//1個目のトラッキング番号の更新
//------------------------------
// 1個目のトラッキング番号のバリデーション
$errors = $this->validator->validate(
$trackingDefaultNumber,
[
new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
new Assert\Regex(
['pattern' => '/^[0-9a-zA-Z-]+$/u', 'message' => trans('admin.order.tracking_number_error')]
),
]
);
if ($errors->count() != 0) {
log_info('送り状番号入力チェックエラー');
$messages = [];
foreach ($errors as $error) {
$messages[] = $error->getMessage();
}
return $this->json(['status' => 'NG', 'messages' => $messages], 400);
}
// 複数のトラッキング番号のバリデーション
foreach ($trackingNumbers as $trackingNumber) {
$trackingNumber = mb_convert_kana($trackingNumber, 'a', 'utf-8');
$errors = $this->validator->validate(
$trackingNumber,
[
new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
new Assert\Regex(
['pattern' => '/^[0-9a-zA-Z-]+$/u', 'message' => trans('admin.order.tracking_number_error')]
),
]
);
if ($errors->count() != 0) {
log_info('送り状番号入力チェックエラー');
$messages = [];
foreach ($errors as $error) {
$messages[] = $error->getMessage();
}
return $this->json(['status' => 'NG', 'messages' => $messages], 400);
}
}
try {
// 全てのトラッキング番号が12桁か確認するフラグ
$all12Digits = true;
// 1個目のトラッキング番号を個別に保存
$shipping->setTrackingNumber($trackingDefaultNumber);
// 2個目以降のトラッキング番号を配列として保存
$shipping->setTruckingNumbers($trackingNumbers);
$this->entityManager->persist($shipping);
$this->entityManager->flush();
// トラッキング番号のカウント
$filledCount = 0;
//1個目ののトラッキング番号
$updateTrackingDefaultNumber = $shipping->getTrackingNumber();
if (strlen($updateTrackingDefaultNumber) === 12) {
$filledCount++;
} else {
//12桁でない場合はfalse
$all12Digits = false;
}
// 2個目以降のトラッキング番号が配列であることを前提
$updateTrackingNumbers = $shipping->getTruckingNumbers();
if (is_array($updateTrackingNumbers)) {
foreach ($updateTrackingNumbers as $number) {
if (!empty($number)) {
if (strlen($number) === 12) {
$filledCount++;
} else {
//12桁でない場合はfalse
$all12Digits = false;
}
}
}
}
log_info('送り状番号変更処理完了', [$shipping->getId()]);
$message = [
'status' => 'OK',
'shipping_id' => $shipping->getId(),
'trackingDefaultNumber' => $trackingDefaultNumber,
'trackingNumbers' => $trackingNumbers,
'filledCount' => $filledCount, // 有効なトラッキング番号の数
'all12Digits' => $all12Digits // 全てが12桁であるかどうかをフラグとして返す
];
return $this->json($message);
} catch (\Exception $e) {
log_error('予期しないエラー', [$e->getMessage()]);
return $this->json(['status' => 'NG'], 500);
}
}
/**
* @Route("/%eccube_admin_route%/order/export/pdf", name="admin_order_export_pdf", methods={"GET", "POST"})
* @Template("@admin/Order/order_pdf.twig")
*
* @param Request $request
*
* @return array|RedirectResponse
*/
public function exportPdf(Request $request)
{
// requestから出荷番号IDの一覧を取得する.
$ids = $request->get('ids', []);
if (count($ids) == 0) {
$this->addError('admin.order.delivery_note_parameter_error', 'admin');
log_info('The Order cannot found!');
return $this->redirectToRoute('admin_order');
}
/** @var OrderPdf $OrderPdf */
$OrderPdf = $this->orderPdfRepository->find($this->getUser());
if (!$OrderPdf) {
$OrderPdf = new OrderPdf();
$OrderPdf
->setTitle(trans('admin.order.delivery_note_title__default'))
->setMessage1(trans('admin.order.delivery_note_message__default1'))
->setMessage2(trans('admin.order.delivery_note_message__default2'))
->setMessage3(trans('admin.order.delivery_note_message__default3'));
}
/**
* @var FormBuilder
*/
$builder = $this->formFactory->createBuilder(OrderPdfType::class, $OrderPdf);
/* @var \Symfony\Component\Form\Form $form */
$form = $builder->getForm();
// Formへの設定
$form->get('ids')->setData(implode(',', $ids));
return [
'form' => $form->createView(),
];
}
/**
* @Route("/%eccube_admin_route%/order/export/pdf/download", name="admin_order_pdf_download", methods={"POST"})
* @Template("@admin/Order/order_pdf.twig")
*
* @param Request $request
*
* @return Response
*/
public function exportPdfDownload(Request $request, OrderPdfService $orderPdfService)
{
/**
* @var FormBuilder
*/
$builder = $this->formFactory->createBuilder(OrderPdfType::class);
/* @var \Symfony\Component\Form\Form $form */
$form = $builder->getForm();
$form->handleRequest($request);
// Validation
if (!$form->isValid()) {
log_info('The parameter is invalid!');
return $this->render('@admin/Order/order_pdf.twig', [
'form' => $form->createView(),
]);
}
$arrData = $form->getData();
// 購入情報からPDFを作成する
$status = $orderPdfService->makePdf($arrData);
// 異常終了した場合の処理
if (!$status) {
$this->addError('admin.order.export.pdf.download.failure', 'admin');
log_info('Unable to create pdf files! Process have problems!');
return $this->render('@admin/Order/order_pdf.twig', [
'form' => $form->createView(),
]);
}
// TCPDF::Outputを実行するとプロパティが初期化されるため、ファイル名を事前に取得しておく
$pdfFileName = $orderPdfService->getPdfFileName();
// ダウンロードする
$response = new Response(
$orderPdfService->outputPdf(),
200,
['content-type' => 'application/pdf']
);
$downloadKind = $form->get('download_kind')->getData();
// レスポンスヘッダーにContent-Dispositionをセットし、ファイル名を指定
if ($downloadKind == 1) {
$response->headers->set('Content-Disposition', 'attachment; filename="' . $pdfFileName . '"');
} else {
$response->headers->set('Content-Disposition', 'inline; filename="' . $pdfFileName . '"');
}
log_info('OrderPdf download success!', ['Order ID' => implode(',', $request->get('ids', []))]);
$isDefault = isset($arrData['default']) ? $arrData['default'] : false;
if ($isDefault) {
// Save input to DB
$arrData['admin'] = $this->getUser();
$this->orderPdfRepository->save($arrData);
}
return $response;
}
}