<?php
/* ログイン画面コントローラー
* ログイン後に遷移する画面を切り替えるため新規作成
* 2023/12/15 Pico鈴木 規約変更の確認画面 Route=help_new_agreementに飛ばすため修正
* 2024/05/21 Pico鈴木 購入履歴から再購入したときにノベルティまで再購入対象になる問題を修正
*/
namespace Customize\Controller\Mypage;
use Customize\Repository\EventLogRepository;
use Customize\Repository\EigyoRepository;
use Customize\Repository\QRCodeMikiRepository;
use Eccube\Controller\AbstractController;
use Eccube\Entity\Customer;
use Eccube\Entity\Order;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Form\Type\Front\CustomerLoginType;
use Eccube\Repository\CustomerRepository;
use Eccube\Repository\OrderRepository;
use Eccube\Service\CartService;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Service\PurchaseFlow\PurchaseFlow;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class MypageController extends AbstractController
{
/**
* @var CartService
*/
protected $cartService;
/**
* @var OrderRepository
*/
protected $orderRepository;
/**
* @var PurchaseFlow
*/
protected $purchaseFlow;
/**
* @var RequestStack
*/
protected $requestStack;
/**
* @var CustomerRepository
*/
protected $customerRepository;
/**
* @var EventLogRepository
*/
protected $eventLogRepository;
/**
* @var EigyoRepository
*/
protected $eigyoRepository;
/**
* @var QRCodeMikiRepository
*/
protected $qrcodeMikiRepository;
/**
* MypageController constructor.
*
* @param OrderRepository $orderRepository
* @param CartService $cartService
* @param PurchaseFlow $purchaseFlow
* @param RequestStack $requestStack
* @param CustomerRepository $customerRepository
* @param EventLogRepository $eventLogRepository
* @param EigyoRepository $eigyoRepository
*/
public function __construct(
OrderRepository $orderRepository,
CartService $cartService,
PurchaseFlow $purchaseFlow,
RequestStack $requestStack,
CustomerRepository $customerRepository,
EventLogRepository $eventLogRepository,
EigyoRepository $eigyoRepository,
QRCodeMikiRepository $qrcodeMikiRepository
)
{
$this->orderRepository = $orderRepository;
$this->cartService = $cartService;
$this->purchaseFlow = $purchaseFlow;
$this->requestStack = $requestStack;
$this->customerRepository = $customerRepository;
$this->eventLogRepository = $eventLogRepository;
$this->eigyoRepository = $eigyoRepository;
$this->qrcodeMikiRepository = $qrcodeMikiRepository;
}
/**
* ログイン画面.
*
* @Route("/mypage/login", name="mypage_login", methods={"GET", "POST"})
* @Template("Mypage/login.twig")
*/
public function login(Request $request, AuthenticationUtils $utils)
{
if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
log_info('認証済のためログイン処理をスキップ');
return $this->redirectToRoute('mypage');
//return $this->redirectToRoute('homepage');
}
//Cookie削除 Logout後に本ページが表示されるためこの処理で削除する
setcookie('ec', '', time() - 3600, '/');
setcookie('ec_wp', '', time() - 3600, '/');
/* @var $form \Symfony\Component\Form\FormInterface */
$builder = $this->formFactory
->createNamedBuilder('', CustomerLoginType::class);
$builder->get('login_memory')->setData((bool) $request->getSession()->get('_security.login_memory'));
if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
$Customer = $this->getUser();
if ($Customer instanceof Customer) {
$builder->get('login_email')
// ->setData($Customer->getEmail());
->setData($Customer->getHostKono());
}
}
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_LOGIN_INITIALIZE);
$form = $builder->getForm();
// ログイン前の画面へ戻す
$error = $utils->getLastAuthenticationError();
if (!$error) {
$redirect = NULL;
if ($request->getMethod() === 'GET') {
switch (TRUE)
{
case $request->get('BS'):
//$redirect = '/mypage/redirect/';
$redirect = $this->generateUrl('help_new_agreement', ['id' => '1'], UrlGeneratorInterface::ABSOLUTE_URL);
break;
case $request->get('event_id') == 1:
//$redirect = '/mypage/event';
$redirect = $this->generateUrl('help_new_agreement', ['id' => '3'], UrlGeneratorInterface::ABSOLUTE_URL);
break;
}
}
if (empty($redirect))
{
// ログインエラーがなければ戻り先をセット
//$referer = $request->headers->get('referer');
$referer = $request->getSession()->get('_security.customer.target_path');
if ($referer) {
// refererチェック
$referers = parse_url($referer);
if ($referers['host'] == $request->getHost()) {
// ホストが同一であればrefererをセット
$requestStackUri = $this->requestStack->getMasterRequest()->getUri();
if ($request->getUri() == $requestStackUri) {
// ログイン画面遷移直前のuriをセット
if (preg_match('/products/', $referer))
{
//$redirect = $referer;
$arr = explode("/", $referers['path']);
$productCd = $arr[count($arr)-1];
$redirect = $this->generateUrl('help_new_agreement', ['id' => '2', 'productCd' => $productCd], UrlGeneratorInterface::ABSOLUTE_URL);
}
} else {
// ログイン必須画面のuriをセット
$redirect = $requestStackUri;
}
}
}
}
if (empty($redirect))
{
//$redirect = 'homepage';
$this->generateUrl('help_new_agreement', ['id' => '0'], UrlGeneratorInterface::ABSOLUTE_URL);
}
$this->setLoginTargetPath($redirect);
}
return [
'error' => $error,
'form' => $form->createView(),
];
}
/**
* loginリダイレクト 会員専用ページ
* @Route("/mypage/redirect/", name="mypage_redirect", methods={"GET"})
* @Template("Mypage/redirect.twig")
*/
public function mypageRedirect(Request $request)
{
$Customer = $this->getUser();
if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED'))
{
$redirect = null;
switch ($this->getUser()->getBc()->getId())
{
case $this->eccubeConfig['eccube_bckbn1']:
//URLが同じだとキャッシュが表示されるのでタイムスタンプを付与する
$redirect = $this->eccubeConfig['eccube_bckbn1_url'] . '?' . time();
break;
case $this->eccubeConfig['eccube_bckbn2']:
$redirect = $this->eccubeConfig['eccube_bckbn1_url'] . '?' . time();
break;
case $this->eccubeConfig['eccube_bckbn5']:
$redirect = $this->eccubeConfig['eccube_bckbn1_url'] . '?' . time();
break;
case $this->eccubeConfig['eccube_bckbn6']:
$redirect = $this->eccubeConfig['eccube_bckbn1_url'] . '?' . time();
break;
}
}
return[
'url' => $redirect
];
}
/**
* loginリダイレクト イベントページ
* カード会員募集イベントでアクセスログを取得後、オリコのカード募集ページにリダイレクト
* @Route("/mypage/event/", name="mypage_event", methods={"GET"})
* @Template("Mypage/redirect.twig")
*/
public function mypageEvent(Request $request)
{
if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED'))
{
$Customer = $this->getUser();
$EventLog = new \Customize\Entity\EventLog;
$EventLog->setEventId(1)
->setAccessDt(new \DateTime())
->setHostKono($Customer->getHostKono())
->setSibuCd($Customer->getSibu()->getSibuCd())
->setEigyoCd($Customer->getEigyoCd())
->setBiko('新メンバーズカード');
$this->eventLogRepository->save($EventLog);
}
return[
'url' => $this->eccubeConfig['eccube_event1_url']
];
}
/**
* 再購入を行う.
* 2024/05/21 Pico鈴木 再購入時にはノベルティを削除する
* @Route("/mypage/order/{order_no}", name="mypage_order", methods={"PUT"})
*/
public function order(Request $request, $order_no)
{
$this->isTokenValid();
log_info('再注文開始', [$order_no]);
$Customer = $this->getUser();
/* @var $Order \Eccube\Entity\Order */
$Order = $this->orderRepository->findOneBy(
[
'order_no' => $order_no,
'Customer' => $Customer,
]
);
$event = new EventArgs(
[
'Order' => $Order,
'Customer' => $Customer,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_INITIALIZE);
if (!$Order) {
log_info('対象の注文が見つかりません', [$order_no]);
throw new NotFoundHttpException();
}
// エラーメッセージの配列
$errorMessages = [];
foreach ($Order->getOrderItems() as $OrderItem) {
try {
if ($OrderItem->getProduct() && $OrderItem->getProductClass()) {
//ノベルティ削除(商品明細行で価格が0はノベルティと判断)
if ($OrderItem->isProduct() && $OrderItem->getPrice() == 0) {
log_info('ノベルティ(' . $OrderItem->getProductName() . ')を再購入対象から除外', [$order_no]);
continue;
}
$this->cartService->addProduct($OrderItem->getProductClass(), $OrderItem->getQuantity());
// 明細の正規化
$Carts = $this->cartService->getCarts();
foreach ($Carts as $Cart) {
$result = $this->purchaseFlow->validate($Cart, new PurchaseContext($Cart, $this->getUser()));
// 復旧不可のエラーが発生した場合は追加した明細を削除.
if ($result->hasError()) {
$this->cartService->removeProduct($OrderItem->getProductClass());
foreach ($result->getErrors() as $error) {
$errorMessages[] = $error->getMessage();
}
}
foreach ($result->getWarning() as $warning) {
$errorMessages[] = $warning->getMessage();
}
}
$this->cartService->save();
}
} catch (CartException $e) {
log_info($e->getMessage(), [$order_no]);
$this->addRequestError($e->getMessage());
}
}
foreach ($errorMessages as $errorMessage) {
$this->addRequestError($errorMessage);
}
$event = new EventArgs(
[
'Order' => $Order,
'Customer' => $Customer,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_COMPLETE);
if ($event->getResponse() !== null) {
return $event->getResponse();
}
log_info('再注文完了', [$order_no]);
return $this->redirect($this->generateUrl('cart'));
}
}