<?php
namespace Plugin\TeikiOrder42\EventSubscriber\Controller;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Repository\OrderRepository;
use Eccube\Repository\Master\OrderStatusRepository;
use Eccube\Event\TemplateEvent;
use Eccube\Event\EventArgs;
use Eccube\Event\EccubeEvents;
use Eccube\Service\CartService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Plugin\TeikiOrder42\Entity\TeikiOrder;
use Plugin\TeikiOrder42\Service\TeikiProductService;
use Plugin\TeikiOrder42\Repository\Master\OrganizationRepository;
use Plugin\TeikiOrder42\Repository\Master\ClaimTimesRepository;
use Plugin\GmoPaymentGateway42\Repository\GmoOrderPaymentRepository;
class ShoppingControllerSubscriber implements EventSubscriberInterface
{
/**
* @var OrderRepository
*/
private $orderRepository;
/**
* @var OrderStatusRepository
*/
private $orderStatusRepository;
/**
* @var CartService
*/
private $cartService;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var TeikiProductService
*/
private $teikiProductService;
/**
* @var OrganizationRepository
*/
private $organizationRepository;
/**
* @var ClaimTimesRepository
*/
private $claimTimesRepository;
/**
* @var GmoOrderPaymentRepository
*/
private $gmoOrderPaymentRepository;
/**
* @var ContainerInterface
*/
private $container;
/**
* Event constructor.
* @param OrderRepository $orderRepository
* @param OrderStatusRepository $orderStatusRepository
* @param CartService $cartService
* @param EntityManagerInterface $entityManager
* @param TeikiProductService $teikiProductService
* @param OrganizationRepository $organizationRepository
* @param ClaimTimesRepository $claimTimesRepository
* @param GmoOrderPaymentRepository $gmoOrderPaymentRepository
* @param ContainerInterface $container
*/
public function __construct(
OrderRepository $orderRepository,
OrderStatusRepository $orderStatusRepository,
CartService $cartService,
EntityManagerInterface $entityManager,
TeikiProductService $teikiProductService,
OrganizationRepository $organizationRepository,
ClaimTimesRepository $claimTimesRepository,
GmoOrderPaymentRepository $gmoOrderPaymentRepository,
ContainerInterface $container
) {
$this->orderRepository = $orderRepository;
$this->orderStatusRepository = $orderStatusRepository;
$this->cartService = $cartService;
$this->entityManager = $entityManager;
$this->teikiProductService = $teikiProductService;
$this->organizationRepository = $organizationRepository;
$this->claimTimesRepository = $claimTimesRepository;
$this->gmoOrderPaymentRepository = $gmoOrderPaymentRepository;
$this->container = $container;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'Shopping/login.twig' => ['DefaultShoppingLogin', 1],
'Shopping/index.twig' => ['DefaultShoppingIndex', 1],
'Shopping/confirm.twig' => ['DefaultShoppingConfirm', 1],
EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE => 'FrontShoppingCompleteInitialize',
];
}
/**
* @param TemplateEvent $event
*/
public function DefaultShoppingLogin(TemplateEvent $event)
{
$event->addSnippet('@TeikiOrder42/default/Shopping/login.twig');
$Cart = $this->cartService->getCart();
$required_member_flg = false;
if($Cart) {
foreach($Cart->getCartItems() as $CartItem) {
if($CartItem->isProduct()){
if($CartItem->getProductClass()->getSaleType()->getId() == 4) {
$required_member_flg = true;
break;
}
}
}
}
$parameters = $event->getParameters();
$parameters['required_member_flg'] = $required_member_flg;
$event->setParameters($parameters);
}
/**
* @param TemplateEvent $event
*/
public function DefaultShoppingIndex(TemplateEvent $event)
{
$event->addSnippet('@TeikiOrder42/default/Shopping/index.twig');
}
/**
* @param TemplateEvent $event
*/
public function DefaultShoppingConfirm(TemplateEvent $event)
{
$event->addSnippet('@TeikiOrder42/default/Shopping/confirm.twig');
$nextTeiki = [];
$Order = $event->getParameter('Order');
if($Order) {
foreach($Order->getOrderItems() as $OrderItem){
if($OrderItem->isProduct()){
$TEIKI_PRODUCT_ID = $this->container->getParameter('TEIKI_PRODUCT_ID');
if($OrderItem->getProduct()->getId() == $TEIKI_PRODUCT_ID){
$product_name = $OrderItem->getProductName();
$class_category_name1 = $OrderItem->getClassCategoryName1();
$num = preg_replace('/[^0-9]/', '', $class_category_name1);
$year = substr($num, 0, 4);
$month = substr($num, 4);
$base = '1-'.$month.'-'.$year;
$base_date_time1 = new \DateTime($base);
$next_product_class_category2_date = $base_date_time1->modify('+1 year');
$next_class_category_name1 = $next_product_class_category2_date->format('Y年n月号');
$base_date_time2 = new \DateTime($base);
$next_order_date = $base_date_time2->modify('+10 month');
$base_date_time2 = new \DateTime($base);
$next_payment_date = $base_date_time2->modify('+11 month');
$class_category_name2 = $OrderItem->getClassCategoryName2();
$price_intax = $OrderItem->getPrice() + $OrderItem->getTax();
$nextTeiki = [
'product_name' => $product_name . ' ' . $next_class_category_name1 .' '. $class_category_name2,
'price' => $price_intax,
'order_date' => $next_order_date->modify('+19 day'),
'payment_method' => $Order->getPaymentMethod(),
'payment_date' => $next_payment_date->modify('+9 day'),
];
}
}
}
}
$parameters = $event->getParameters();
$parameters['NextTeiki'] = $nextTeiki;
$event->setParameters($parameters);
}
public function FrontShoppingCompleteInitialize(EventArgs $event)
{
$Order = $event->getArgument('Order');
if($Order) {
// 旧注文IDがあった場合は、そちらをキャンセルへ
if($Order->getOldTeikiOrderId()){
$OldOrder = $this->orderRepository->find($Order->getOldTeikiOrderId());
if($OldOrder){
$Cancel = $this->orderStatusRepository->find(OrderStatus::CANCEL);
$OldOrder->setOrderStatus($Cancel);
$this->entityManager->persist($OldOrder);
}
}
foreach($Order->getOrderItems() as $OrderItem ){
if($OrderItem->isProduct() && $OrderItem->getProductClass()->getSaleType()->getId() == 4) {
$ProductClass = $OrderItem->getProductClass();
$teiki_start_date = $this->teikiProductService->getDBStartDate($ProductClass);
$teiki_end_date = $this->teikiProductService->getDBEndDate($ProductClass);
$Customer = $Order->getCustomer();
$Customer->setTeikiUserFlg(1);
$this->entityManager->persist($Customer);
$Order->setTeikiFlg(1);
$this->entityManager->persist($Order);
//カード登録フラグを取得
$register_card = 0;
$GmoOrderPayment = $this->gmoOrderPaymentRepository->findOneBy(['order_id' => $Order->getId()]);
if($GmoOrderPayment){
if($GmoOrderPayment->getMemo01()){
$GmoOrderPayment = json_decode($GmoOrderPayment->getMemo01());
if($GmoOrderPayment->payment_type == 1) {
$register_card = 1;
} else {
if($GmoOrderPayment->register_card){
$register_card = 1;
}
}
}
}
//学割は自動更新フラグをfalse
$auto_teiki_order_update_flg = 1;
if($ProductClass->getClassCategory2()->getId() == 19 || $ProductClass->getClassCategory2()->getId() == 20) {
$auto_teiki_order_update_flg = 0;
}
$TeikiOrder = new TeikiOrder();
$TeikiOrder
->setOrder($Order)
->setTeikiStartDate(new \DateTime($teiki_start_date))
->setTeikiEndDate(new \DateTime($teiki_end_date))
->setOrganization($this->organizationRepository->find(0))
->setClaimTimes($this->claimTimesRepository->find(1))
->setClaimDate1($Order->getOrderDate())
->setClaimPrice1($Order->getPaymentTotal())
->setRegistCreditCard($register_card)
->setAutoTeikiOrderUpdateFlg($auto_teiki_order_update_flg);
$this->entityManager->persist($TeikiOrder);
$this->entityManager->flush();
break;
}
}
}
}
}