<?php
namespace Plugin\TeikiOrder42\Controller\Mypage;
use Eccube\Controller\AbstractController;
use Eccube\Entity\CustomerAddress;
use Eccube\Entity\Shipping;
use Eccube\Repository\OrderRepository;
use Eccube\Repository\ShippingRepository;
use Eccube\Service\CartService;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Service\PurchaseFlow\PurchaseFlow;
use Eccube\Form\Type\Front\ShoppingShippingType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Knp\Component\Pager\PaginatorInterface;
use Plugin\TeikiOrder42\Repository\TeikiOrderRepository;
use Plugin\TeikiOrder42\Service\TeikiOrderMailService;
use Plugin\TeikiOrder42\Form\Type\TeikiWithdrawalType;
class TeikiUserController extends AbstractController
{
/**
* @var TeikiOrderRepository
*/
protected $teikiOrderRepository;
/**
* @var ShippingRepository
*/
protected $shippingRepository;
/**
* @var TeikiOrderMailService
*/
protected $teikiOrderMailService;
/**
* @var OrderRepository
*/
protected $orderRepository;
/**
* @var CartService
*/
protected $cartService;
/**
* @var PurchaseFlow
*/
protected $purchaseFlow;
/**
* CouponShoppingController constructor.
*
* @param TeikiOrderRepository $teikiOrderRepository
* @param ShippingRepository $shippingRepository
* @param OrderRepository $orderRepository
* @param CartService $cartService
* @param PurchaseFlow $purchaseFlow
*/
public function __construct(
TeikiOrderRepository $teikiOrderRepository,
ShippingRepository $shippingRepository,
TeikiOrderMailService $teikiOrderMailService,
OrderRepository $orderRepository,
CartService $cartService,
PurchaseFlow $purchaseFlow
) {
$this->teikiOrderRepository = $teikiOrderRepository;
$this->shippingRepository = $shippingRepository;
$this->teikiOrderMailService = $teikiOrderMailService;
$this->orderRepository = $orderRepository;
$this->cartService = $cartService;
$this->purchaseFlow = $purchaseFlow;
}
/**
* 書籍読み放題ページページ.
*
* @Route("/mypage/teiki", name="mypage_teiki", methods={"GET"})
* @Template("Mypage/teiki.twig")
*
* @param Request $request
*/
public function teiki(Request $request, PaginatorInterface $paginator)
{
//定期ユーザーかチェック
$Customer = $this->getUser();
if ($Customer->getTeikiUserFlg() != 1) {
new NotFoundHttpException();
}
// 購入処理中/決済処理中ステータスの受注を非表示にする.
$this->entityManager
->getFilters()
->enable('incomplete_order_status_hidden');
// paginator
$qb = $this->teikiOrderRepository->getQueryBuilderByCustomer($Customer);
$pagination = $paginator->paginate(
$qb,
$request->get('pageno', 1),
$this->eccubeConfig['eccube_search_pmax']
);
return [
'pagination' => $pagination,
];
}
/**
* 書籍読み放題ページページ.
*
* @Route("/mypage/teiki/history/{order_no}", name="mypage_teiki_history", methods={"GET"}, requirements={"order_no" = "\d+"})
* @Template("Mypage/teiki_history.twig")
*
* @param Request $request
*/
public function teikiHistory(Request $request, $order_no)
{
$this->entityManager->getFilters()
->enable('incomplete_order_status_hidden');
$TeikiOrder = $this->teikiOrderRepository->findOneBy(
[
'Order' => $order_no,
]
);
if (!$TeikiOrder) {
throw new NotFoundHttpException();
}
if ($TeikiOrder->getOrder()->getCustomer() !== $this->getUser()) {
throw new NotFoundHttpException();
}
$Carts = $this->cartService->getCarts();
$teiki_book_in_cart = false;
foreach ($Carts as $Cart) {
foreach ($Cart->getCartItems() as $CartItem) {
if ($CartItem->isProduct()) {
if ($CartItem->getProductClass()->getSaleType()->getId() == 4) {
$teiki_book_in_cart = true;
break;
}
}
}
}
return [
'TeikiOrder' => $TeikiOrder,
'teiki_book_in_cart' => $teiki_book_in_cart,
];
}
/**
* 書籍読み放題ページページ.
*
* @Route("/mypage/teiki/change_delivery/{order_no}", name="mypage_teiki_change_delivery", methods={"GET", "POST"}, requirements={"order_no" = "\d+"})
* @Route("/mypage/teiki/change_delivery/{order_no}", name="mypage_teiki_change_delivery_confirm", methods={"GET", "POST"}, requirements={"order_no" = "\d+"})
* @Template("Mypage/teiki_change_delivery.twig")
*
* @param Request $request
*/
public function teikiChange(Request $request, $order_no)
{
$TeikiOrder = $this->teikiOrderRepository->findOneBy(
[
'Order' => $order_no,
]
);
if ($TeikiOrder->getOrder()->getCustomer() !== $this->getUser()) {
throw new NotFoundHttpException();
}
$CustomerAddress = new CustomerAddress();
$builder = $this->formFactory->createBuilder(ShoppingShippingType::class, $CustomerAddress);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
log_info('[定期購読]お届け先変更確認画面', ['order_id' => $TeikiOrder->getOrder()->getId()]);
switch ($request->get('mode')) {
case 'confirm':
return $this->render('Mypage/teiki_change_delivery_confirm.twig', [
'form' => $form->createView(),
'TeikiOrder' => $TeikiOrder,
]);
case 'complete':
$data = $form->getData();
$Shipping = $this->shippingRepository->findBy(['Order' => $TeikiOrder->getOrder()]);
if (!$Shipping) {
throw new NotFoundHttpException();
}
$Shipping[0]
->setName01($data['name01'])
->setName02($data['name02'])
->setKana01($data['kana01'])
->setKana02($data['kana02'])
->setCompanyName($data['company_name'])
->setPhoneNumber($data['phone_number'])
->setPostalCode($data['postal_code'])
->setPref($data['Pref'])
->setAddr01($data['addr01'])
->setAddr02($data['addr02']);
$this->entityManager->persist($Shipping[0]);
$this->entityManager->flush();
$this->teikiOrderMailService->sendChangeDeliveryMail($TeikiOrder, $data);
//return $this->render('Mypage/teiki_change_delivery_complete.twig', [
// 'form' => $form->createView(),
// 'TeikiOrder' => $TeikiOrder,
//]);
return $this->redirect($this->generateUrl('mypage_teiki_change_delivery_complete'));
}
}
return [
'form' => $form->createView(),
'TeikiOrder' => $TeikiOrder,
];
}
/**
* 定期購読完了画面.
*
* @Route("/mypage/teiki/change_delivery/complete", name="mypage_teiki_change_delivery_complete", methods={"GET"})
* @Template("Mypage/teiki_change_delivery_complete.twig")
*/
public function complete()
{
return [];
}
/**
* 定期購読を解約する.
*
* @Route("/mypage/teiki/withdrawal/{order_no}", name="mypage_teiki_withdrawal", methods={"GET", "POST"}, requirements={"order_no" = "\d+"})
* @Route("/mypage/teiki/withdrawal/{order_no}", name="mypage_teiki_withdrawal_confirm", methods={"GET", "POST"}, requirements={"order_no" = "\d+"})
* @Template("Mypage/teiki_withdrawal.twig")
*
* @param Request $request
*/
public function teikiWithdrawal(Request $request, $order_no)
{
$TeikiOrder = $this->teikiOrderRepository->findOneBy(
[
'Order' => $order_no,
]
);
if ($TeikiOrder->getOrder()->getCustomer() !== $this->getUser()) {
throw new NotFoundHttpException();
}
foreach ($TeikiOrder->getOrder()->getOrderItems() as $orderItem) {
if ($orderItem->isProduct()) {
$TeikiOrderItem = $orderItem;
}
}
if (!$TeikiOrderItem) {
throw new NotFoundHttpException();
}
$builder = $this->formFactory->createBuilder(TeikiWithdrawalType::class);
$builder->setData(
[
'TeikiOrder' => $TeikiOrder,
]
);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
log_info('[定期購読]解約申し込み', ['order_id' => $TeikiOrder->getOrder()->getId()]);
switch ($request->get('mode')) {
case 'confirm':
return $this->render('Mypage/teiki_withdrawal_confirm.twig', [
'form' => $form->createView(),
'TeikiOrder' => $TeikiOrder,
]);
case 'complete':
$data = $form->getData();
$this->teikiOrderMailService->sendWithdrawalMail($TeikiOrder, $data);
//return $this->render('Mypage/teiki_withdrawal_complete.twig', [
// 'form' => $form->createView(),
// 'TeikiOrder' => $TeikiOrder,
//]);
return $this->redirect($this->generateUrl('mypage_teiki_withdrawal_complete'));
}
}
return [
'form' => $form->createView(),
'TeikiOrder' => $TeikiOrder,
];
}
/**
* 定期購読完了画面.
*
* @Route("/mypage/teiki/withdrawal/complete", name="mypage_teiki_withdrawal_complete", methods={"GET"})
* @Template("Mypage/teiki_withdrawal_complete.twig")
*/
public function completeWithdrawal()
{
return [];
}
/**
* 再購入を行う.
*
* @Route("/mypage/teiki/order/{order_no}", name="mypage_teiki_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,
]
);
if (!$Order) {
log_info('対象の注文が見つかりません', [$order_no]);
throw new NotFoundHttpException();
}
// エラーメッセージの配列
$errorMessages = [];
foreach ($Order->getOrderItems() as $OrderItem) {
try {
if ($OrderItem->getProduct() && $OrderItem->getProductClass()) {
$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();
}
$Cart->setOldTeikiOrderId($order_no);
}
$this->cartService->save();
}
} catch (CartException $e) {
log_info($e->getMessage(), [$order_no]);
$this->addRequestError($e->getMessage());
}
}
foreach ($errorMessages as $errorMessage) {
$this->addRequestError($errorMessage);
}
log_info('再注文完了', [$order_no]);
return $this->redirect($this->generateUrl('cart'));
}
}