<?php
namespace Customize\Controller;
use Customize\Repository\CampaignRepository;
use Customize\Repository\CouponRepository;
use Eccube\Entity\Product;
use Eccube\Repository\OrderRepository;
use Eccube\Service\OrderHelper;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Repository\CustomerFavoriteProductRepository;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Eccube\Form\Type\Front\EntryType;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Service\MailService;
use Eccube\Entity\CustomerAddress;
use Eccube\Entity\Master\CustomerStatus;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Eccube\Form\Type\Front\CustomerAddressType;
use Eccube\Repository\CustomerAddressRepository;
use Eccube\Repository\PageRepository;
use Eccube\Service\CartService;
use Eccube\Repository\Master\CustomerStatusRepository;
use Eccube\Util\StringUtil;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Customize\Repository\CustomPluginCouponRepository;
use DateTime;
use Eccube\Form\Type\Admin\OrderPdfType;
use Eccube\Service\OrderPdfService;
use Plugin\CouponPro42\Repository\CouponRepository as RepositoryCouponRepository;
use Plugin\ReportPdf2Ft\Service\ReportPdf2FtService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Eccube\Entity\Customer;
use Customize\Repository\WorkingTimeRepository;
class MyPageController extends BaseController
{
protected $orderHelper;
protected $couponRepository;
/**
* @var OrderRepository
*/
protected $orderRepository;
protected $customerFavoriteProductRepository;
/**
* @var CustomerRepository
*/
protected $customerRepository;
/**
* @var EncoderFactoryInterface
*/
protected $encoderFactory;
/**
* @var baseInfoRepository
*/
/**
* @var MailService
*/
protected $mailService;
protected $baseInfoRepository;
private const SESSION_KEY_PRE_EMAIL = 'eccube.front.mypage.change.preEmail';
/**
* @var BaseInfo
*/
protected $BaseInfo;
/**
* @var CustomerAddressRepository
*/
protected $customerAddressRepository;
/**
* @var PageRepository
*/
private $pageRepository;
/**
* @var CustomerStatusRepository
*/
protected $customerStatusRepository;
/**
* @var CartService
*/
private $cartService;
/**
* @var TokenStorage
*/
protected $tokenStorage;
protected $customPluginCouponRepository;
protected $couponOrderProRepository;
protected $workingTimeRepository;
public function __construct(
OrderRepository $orderRepository,
OrderHelper $orderHelper,
CouponRepository $couponRepository,
CustomerFavoriteProductRepository $customerFavoriteProductRepository,
CustomerAddressRepository $customerAddressRepository,
BaseInfoRepository $baseInfoRepository,
MailService $mailService,
PageRepository $pageRepository,
CustomerStatusRepository $customerStatusRepository,
CartService $cartService,
CustomPluginCouponRepository $customPluginCouponRepository,
TokenStorageInterface $tokenStorage,
RepositoryCouponRepository $couponOrderProRepository,
WorkingTimeRepository $workingTimeRepository
) {
$this->BaseInfo = $baseInfoRepository->get();
$this->orderHelper = $orderHelper;
$this->couponRepository = $couponRepository;
$this->orderRepository = $orderRepository;
$this->customerFavoriteProductRepository = $customerFavoriteProductRepository;
$this->customerAddressRepository = $customerAddressRepository;
$this->baseInfoRepository = $baseInfoRepository;
$this->mailService = $mailService;
$this->pageRepository = $pageRepository;
$this->customerStatusRepository = $customerStatusRepository;
$this->cartService = $cartService;
$this->tokenStorage = $tokenStorage;
$this->customPluginCouponRepository = $customPluginCouponRepository;
$this->couponOrderProRepository = $couponOrderProRepository;
$this->workingTimeRepository = $workingTimeRepository;
}
/**
* @Method("GET")
* @Route("/mypage_wishlist", name="mypage_wishlist")
* @Template("@user_data/mypage/mypage_wishlist.twig")
*/
public function mypage_wishlist(Request $request, PaginatorInterface $paginator)
{
if ($this->orderHelper->isLoginRequired()) {
$this->setLoginTargetPath($this->generateUrl('mypage_wishlist', [], UrlGeneratorInterface::ABSOLUTE_URL));
return $this->redirect('/mypage-login');
}
$Customer = $this->getUser();
$couponPro = $this->couponOrderProRepository->fetchCouponsForMypage($Customer);
// paginator
$qb = $this->customerFavoriteProductRepository->getQueryBuilderByCustomer($Customer);
$event = new EventArgs(
[
'qb' => $qb,
'Customer' => $Customer,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_FAVORITE_SEARCH);
$pagination = $paginator->paginate(
$qb,
$request->get('page_no', 1),
$this->eccubeConfig['eccube_search_pmax'],
['wrap-queries' => true]
);
return [
'couponPro' => $couponPro,
'pagination' => $pagination,
'data' => $qb->getQuery()->getResult()
];
}
/**
* @Method("GET")
* @Route("/mypage_index", name="mypage_index")
* @Template("@user_data/mypage/mypage_index.twig")
*/
public function mypage_index(Request $request, PaginatorInterface $paginator)
{
if ($this->orderHelper->isLoginRequired()) {
$this->setLoginTargetPath($this->generateUrl('mypage_index', [], UrlGeneratorInterface::ABSOLUTE_URL));
return $this->redirect('/mypage-login');
}
$Customer = $this->getUser();
$couponPro = $this->couponOrderProRepository->fetchCouponsForMypage($Customer);
// 購入処理中/決済処理中ステータスの受注を非表示にする.
$this->entityManager
->getFilters()
->enable('incomplete_order_status_hidden');
$qb = $this->orderRepository->getQueryBuilderByCustomer($Customer);
$pagination = $paginator->paginate(
$qb,
$request->get('pageno', 1),
100
);
$workingTime = $this->workingTimeRepository->getTopWorkingTime();
return [
'couponPro' => $couponPro,
'pagination' => $pagination,
'working_time' => $workingTime,
];
}
/**
* @Route("/mypage_address", name="mypage_address", methods={"GET"})
* @Template("@user_data/mypage/mypage_address.twig")
*/
public function mypage_address()
{
if ($this->orderHelper->isLoginRequired()) {
$this->setLoginTargetPath($this->generateUrl('mypage_address', [], UrlGeneratorInterface::ABSOLUTE_URL));
return $this->redirect('/mypage-login');
}
$Customer = $this->getUser();
$couponPro = $this->couponOrderProRepository->fetchCouponsForMypage($Customer);
return [
'couponPro' => $couponPro,
'Customer' => $Customer
];
}
/**
* お届け先編集画面.
*
* @Route("/mypage_address/new", name="mypage_address_new", methods={"GET", "POST"})
* @Route("/mypage_address/{id}/edit", name="mypage_address_edit", requirements={"id" = "\d+"}, methods={"GET", "POST"})
* @Template("@user_data/mypage/mypage_address_edit.twig")
*/
public function mypage_address_edit(Request $request, $id = null)
{
if ($this->orderHelper->isLoginRequired()) {
$this->setLoginTargetPath($this->generateUrl('mypage_address_new', [], UrlGeneratorInterface::ABSOLUTE_URL));
return $this->redirect('/mypage-login');
}
$Customer = $this->getUser();
// 配送先住所最大値判定
// $idが存在する際は、追加処理ではなく、編集の処理ため本ロジックスキップ
if (is_null($id)) {
$addressCurrNum = count($Customer->getCustomerAddresses());
$addressMax = $this->eccubeConfig['eccube_deliv_addr_max'];
if ($addressCurrNum >= $addressMax) {
throw new NotFoundHttpException();
}
$CustomerAddress = new CustomerAddress();
$CustomerAddress->setCustomer($Customer);
} else {
$CustomerAddress = $this->customerAddressRepository->findOneBy(
[
'id' => $id,
'Customer' => $Customer,
]
);
if (!$CustomerAddress) {
throw new NotFoundHttpException();
}
}
$parentPage = $request->get('parent_page', null);
// 正しい遷移かをチェック
$allowedParents = [
$this->generateUrl('mypage_address'),
$this->generateUrl('shopping_redirect_to'),
];
// 遷移が正しくない場合、デフォルトであるマイページの配送先追加の画面を設定する
if (!in_array($parentPage, $allowedParents)) {
// @deprecated 使用されていないコード
$parentPage = $this->generateUrl('mypage_address');
}
$builder = $this->formFactory
->createBuilder(CustomerAddressType::class, $CustomerAddress);
$event = new EventArgs(
[
'builder' => $builder,
'Customer' => $Customer,
'CustomerAddress' => $CustomerAddress,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_DELIVERY_EDIT_INITIALIZE);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
log_info('お届け先登録開始', [$id]);
$this->entityManager->persist($CustomerAddress);
$this->entityManager->flush();
// 会員情報変更時にメールを送信
if ($this->BaseInfo->isOptionMailNotifier()) {
// 情報のセット
$userData['userAgent'] = $request->headers->get('User-Agent');
$userData['ipAddress'] = $request->getClientIp();
$this->mailService->sendCustomerChangeNotifyMail($Customer, $userData, trans('front.mypage.delivery.notify_title'));
}
log_info('お届け先登録完了', [$id]);
$event = new EventArgs(
[
'form' => $form,
'Customer' => $Customer,
'CustomerAddress' => $CustomerAddress,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_DELIVERY_EDIT_COMPLETE);
if ($request->query->has('order')) {
return $this->redirect($this->generateUrl('cart_input'));
}
return $this->redirect($this->generateUrl('mypage_address'));
}
return [
'form' => $form->createView(),
'parentPage' => $parentPage,
'BaseInfo' => $this->BaseInfo,
];
}
/**
* お届け先を削除する.
*
* @Route("/mypage_address/{id}/delete", name="mypage_address_delete", methods={"DELETE"})
*/
public function mypage_address_delete(Request $request, CustomerAddress $CustomerAddress)
{
if ($this->orderHelper->isLoginRequired()) {
return $this->redirect('/mypage-login');
}
$this->isTokenValid();
log_info('お届け先削除開始', [$CustomerAddress->getId()]);
$Customer = $this->getUser();
if ($Customer->getId() != $CustomerAddress->getCustomer()->getId()) {
throw new BadRequestHttpException();
}
$this->customerAddressRepository->delete($CustomerAddress);
$event = new EventArgs(
[
'Customer' => $Customer,
'CustomerAddress' => $CustomerAddress,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_DELIVERY_DELETE_COMPLETE);
// 会員情報変更時にメールを送信
if ($this->BaseInfo->isOptionMailNotifier()) {
// 情報のセット
$userData['userAgent'] = $request->headers->get('User-Agent');
$userData['ipAddress'] = $request->getClientIp();
$this->mailService->sendCustomerChangeNotifyMail($Customer, $userData, trans('front.mypage.delivery.notify_title'));
}
log_info('お届け先削除完了', [$CustomerAddress->getId()]);
return $this->redirect($this->generateUrl('mypage_delivery'));
}
/**
* 会員情報編集画面.
*
* @Route("/mypage_membership", name="mypage_membership", methods={"GET", "POST"})
* @Template("@user_data/mypage/mypage_membership.twig")
*/
public function index(Request $request)
{
if ($this->orderHelper->isLoginRequired()) {
$this->setLoginTargetPath($this->generateUrl('mypage_membership', [], UrlGeneratorInterface::ABSOLUTE_URL));
return $this->redirect('/mypage-login');
}
/** @var Customer $Customer */
$Customer = $this->getUser();
$Customer->setPlainPassword($this->eccubeConfig['eccube_default_password']);
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createBuilder(EntryType::class, $Customer);
$event = new EventArgs(
[
'builder' => $builder,
'Customer' => $Customer,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_CHANGE_INDEX_INITIALIZE);
/* @var $form \Symfony\Component\Form\FormInterface */
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
log_info('会員編集開始');
if ($Customer->getPlainPassword() !== $this->eccubeConfig['eccube_default_password']) {
$encoder = $this->encoderFactory->getEncoder($Customer);
if ($Customer->getSalt() === null) {
$Customer->setSalt($encoder->createSalt());
}
$Customer->setPassword(
$encoder->encodePassword($Customer->getPlainPassword(), $Customer->getSalt())
);
}
if (method_exists($Customer, 'setMailmagaFlg')) {
$mailmagaFlg = $form->get('mailmaga_flg')->getData();
if (!$mailmagaFlg) {
$Customer->setMailmagaFlg(0);
} else {
$Customer->setMailmagaFlg(1);
}
}
// 会員情報変更時にメールを送信
if ($this->baseInfoRepository->get()->isOptionMailNotifier()) {
// 情報のセット
$userData['userAgent'] = $request->headers->get('User-Agent');
$userData['preEmail'] = $request->getSession()->get(self::SESSION_KEY_PRE_EMAIL);
$userData['ipAddress'] = $request->getClientIp();
// メール送信
$this->mailService->sendCustomerChangeNotifyMail($Customer, $userData, trans('front.mypage.customer.notify_title'));
}
$this->session->remove(self::SESSION_KEY_PRE_EMAIL);
$this->entityManager->flush();
log_info('会員編集完了');
$event = new EventArgs(
[
'form' => $form,
'Customer' => $Customer,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_CHANGE_INDEX_COMPLETE);
return $this->redirect($this->generateUrl('mypage_membership_complete'));
}
$preEmail = $form->get('email')->getData();
$this->session->set(self::SESSION_KEY_PRE_EMAIL, $preEmail);
return [
'form' => $form->createView(),
];
}
/**
* 会員情報編集完了画面.
*
* @Route("/mypage_membership/complete", name="mypage_membership_complete", methods={"GET"})
* @Template("@user_data/mypage/mypage_membership_complete.twig")
*/
public function complete(Request $request)
{
if ($this->orderHelper->isLoginRequired()) {
return $this->redirect('/mypage-login');
}
return [];
}
/**
* @Route("/mypage_mailmagazine", name="mypage_mail", methods={"GET"})
* @Route("/mypage-withdraw", name="mypage-withdraw", methods={"POST"})
* @Template("@user_data/mypage/mypage_mailmagazine.twig")
*/
public function mypageMailmagazine(Request $request)
{
if ($this->orderHelper->isLoginRequired()) {
$this->setLoginTargetPath($this->generateUrl('mypage-withdraw', [], UrlGeneratorInterface::ABSOLUTE_URL));
return $this->redirect('/mypage-login');
}
$builder = $this->formFactory->createBuilder();
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_WITHDRAW_INDEX_INITIALIZE);
$form = $builder->getForm();
$form->handleRequest($request);
$Customer = $this->getUser();
$mailmagaFlg = null;
if (method_exists($Customer, 'getMailmagaFlg')) {
$mailmagaFlg = $Customer->getMailmagaFlg();
}
$couponPro = $this->couponOrderProRepository->fetchCouponsForMypage($this->getUser());
if ($form->isSubmitted() && $form->isValid()) {
switch ($request->get('mode')) {
case 'complete':
log_info('退会処理開始');
/* @var $Customer \Eccube\Entity\Customer */
$Customer = $this->getUser();
$email = $Customer->getEmail();
// 退会ステータスに変更
$CustomerStatus = $this->customerStatusRepository->find(CustomerStatus::WITHDRAWING);
$Customer->setStatus($CustomerStatus);
$Customer->setEmail(StringUtil::random(60) . '@dummy.dummy');
$this->entityManager->flush();
log_info('退会処理完了');
$event = new EventArgs(
[
'form' => $form,
'Customer' => $Customer,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_WITHDRAW_INDEX_COMPLETE);
// メール送信
$this->mailService->sendCustomerWithdrawMail($Customer, $email);
// カートと受注のセッションを削除
$this->cartService->clear();
$this->orderHelper->removeSession();
// ログアウト
$this->tokenStorage->setToken(null);
log_info('ログアウト完了');
return [
'couponPro' => $couponPro,
'form' => $form->createView(),
'complete' => true
];
}
}
return [
'couponPro' => $couponPro,
'form' => $form->createView(),
'mailmagaFlg' => $mailmagaFlg,
'complete' => false
];
}
/**
* @Route("/mypage-mailmagazine-update", name="mypage_mail_update_flag", methods={"POST"})
* @return JsonResponse
*/
public function updateMailFlag(Request $request)
{
if (!$this->getUser()) {
return new JsonResponse(['error' => 'Unauthorized'], 401);
}
$customer = $this->getUser();
$flag = $request->request->get('flag', 0);
if (method_exists($customer, 'setMailmagaFlg')) {
$customer->setMailmagaFlg((int)$flag);
$this->entityManager->flush();
return new JsonResponse([
'success' => true,
'message' => $flag ? 'メルマガに登録しました。' : 'メルマガを解除しました。'
]);
}
return new JsonResponse([
'success' => false,
'message' => 'MailMagazine42 プラグインがインストールされていません。'
]);
}
/**
* 退会完了画面.
*
* @Route("/mypage_withdraw/complete", name="mypage_withdraw_done", methods={"GET"})
* @Template("Mypage/withdraw_complete.twig")
*/
public function withdraw_complete(Request $request)
{
if ($this->orderHelper->isLoginRequired()) {
return $this->redirect('/mypage-login');
}
return [];
}
/**
* お気に入り商品を削除する.
*
* @Route("/mypage_wishlist/{id}/delete", name="mypage_wishlist_delete", methods={"GET"}, requirements={"id" = "\d+"})
*/
public function delete(Request $request, Product $Product)
{
if ($this->orderHelper->isLoginRequired()) {
return $this->redirect('/mypage-login');
}
$this->isTokenValid();
$Customer = $this->getUser();
log_info('お気に入り商品削除開始', [$Customer->getId(), $Product->getId()]);
$CustomerFavoriteProduct = $this->customerFavoriteProductRepository->findOneBy(['Customer' => $Customer, 'Product' => $Product]);
if ($CustomerFavoriteProduct) {
$this->customerFavoriteProductRepository->delete($CustomerFavoriteProduct);
} else {
throw new BadRequestHttpException();
}
$event = new EventArgs(
[
'Customer' => $Customer,
'CustomerFavoriteProduct' => $CustomerFavoriteProduct,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_DELETE_COMPLETE);
log_info('お気に入り商品削除完了', [$Customer->getId(), $CustomerFavoriteProduct->getId()]);
return $this->redirect($this->generateUrl('mypage_favorite'));
}
/**
* @Route("/order/export/pdf/my-page", methods={"GET"}, name="mypage_order_export_pdf")
*
* @param Request $request
*
* @return Response
*/
public function export_custom(Request $request, ReportPdf2FtService $reportPdf2Service)
{
$orderId = $request->get('orderId');
$type = $request->get('type');
$order = $this->orderRepository->findOneBy(['id' => $orderId]);
if(!$order){
dd('Order not found!');
}
$shipping_ids = [];
foreach($order->getShippings() as $shipping){
$shipping_ids[] = $shipping['id'];
}
$ids_string = implode(',', $shipping_ids);
$title = "";
$message1 = "";
$message2 = "";
$message3 = "";
$tyohyo_type = "1";
$contact_show = 1;
$number_show = 1;
$haiso_show = 2;
$filename_download = "";
$ryosyu_no = null;
switch ($type) {
case 'quotation':
$title = "見積書";
$message1 = "このたびはお買上げいただきありがとうございます。";
$message2 = "下記の内容にて納品させていただきます。";
$message3 = "ご確認くださいますよう、お願いいたします。";
$tyohyo_type = "2";
$contact_show = 1;
$number_show = 1;
$haiso_show = 1;
$filename_download = "見積書";
break;
case 'receipt':
$title = "領収書";
$message1 = "このたびはお買上げいただきありがとうございます";
$message2 = "下記の内容にて納品させていただきます。";
$message3 = "ご確認くださいますよう、お願いいたします。";
$tyohyo_type = "4";
$contact_show = 1;
$number_show = 1;
$haiso_show = 1;
$filename_download = "領収書";
$ryosyu_no= $order->getOrderNo();
break;
case 'invoice':
$title = "請求書";
$message1 = "";
$message2 = "";
$message3 = "";
$tyohyo_type = "3";
$contact_show = 2;
$number_show = 2;
$haiso_show = 2;
$filename_download = "請求書";
break;
case 'delivery':
$title = "お買上げ明細書(納品書)";
$message1 = "このたびはお買上げいただきありがとうございます。";
$message2 = "下記の内容にて納品させていただきます。";
$message3 = "ご確認くださいますよう、お願いいたします。";
$tyohyo_type = "1";
$contact_show = 1;
$number_show = 1;
$haiso_show = 1;
$filename_download = "納品書";
break;
default:
dd('Invalid type!');
}
$arrData = [
"ids" => $ids_string,
"issue_date" => new DateTime(),
"title" => $title,
"message1" => $message1,
"message2" => $message2,
"message3" => $message3,
"note1" => null,
"note2" => null,
"note3" => null,
"default" => 1 ,
"delivery_multi" => "0",
"add_page" => null,
"tyohyo_type" => $tyohyo_type,
"comment1" => "",
"comment2" => "",
"comment3" => "",
"comment4" => "",
"comment5" => "",
"seikyu1" => null,
"seikyu2" => null,
"seikyu3" => null,
"ryosyu_no" => $ryosyu_no,
"ryosyu_tadasi" => null,
"ryosyu_show" => null,
"contact_show" => $contact_show,
"number_show" => $number_show,
"haiso_show" => $haiso_show,
"change_name" => null,
];
$reportPdf2Service->makePdf($arrData);
$filename = str_replace("OrderId-", $filename_download, $reportPdf2Service->getPdfFileName());
$response = new Response(
$reportPdf2Service->outputPdf(),
200,
['content-type' => 'application/pdf']
);
$response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');
return $response;
}
}