<?php
/*
* Copyright(c) 2020 RACCOON HOLDINGS, Inc. All rights reserved.
* https://paid.jp/
*/
namespace Plugin\Paid4\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Common\EccubeConfig;
use Eccube\Entity\Customer;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Event\TemplateEvent;
use \Exception;
use Plugin\Paid4\Entity\PaidCustomer;
use Plugin\Paid4\Form\Type\PaidEntryType;
use Plugin\Paid4\Repository\PaidConfigRepository;
use Plugin\Paid4\Service\PaidApi\PaidHelperMember;
use Plugin\Paid4\Util\PaidUtil;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
//use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent; // ここを修正
use Symfony\Component\HttpKernel\KernelEvents;
class EntryEventSubscriber implements EventSubscriberInterface
{
/**
* @var RequestStack
*/
protected $session;
/**
* @var EccubeConfig
*/
protected $eccubeConfig;
/**
* @var EntityManagerInterface
*/
protected $entityManager;
/**
* @var PaidHelperMember
*/
private $paidHelperMember;
/**
* @var PaidConfigRepository
*/
private $paidConfigRepository;
/**
* OrderEditIndexCompleteListener constructor.
*
* @param SessionInterface $session
* @param EccubeConfig $eccubeConfig
* @param EntityManagerInterface $entityManager
* @param PaidHelperMember $PaidHelperMember
* @param PaidConfigRepository $paidConfigRepository
*/
public function __construct(
SessionInterface $session,
EccubeConfig $eccubeConfig,
EntityManagerInterface $entityManager,
PaidHelperMember $PaidHelperMember,
PaidConfigRepository $paidConfigRepository
)
{
$this->session = $session;
$this->eccubeConfig = $eccubeConfig;
$this->entityManager = $entityManager;
$this->paidHelperMember = $PaidHelperMember;
$this->paidConfigRepository = $paidConfigRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => ['onResponse'],
'Entry/index.twig' => 'onDefaultEntryTwig',
'Entry/complete.twig' => 'onDefaultEntryCompleteTwig',
'Entry/activate.twig' => 'onDefaultEntryCompleteTwig',
EccubeEvents::FRONT_ENTRY_INDEX_INITIALIZE => 'onFrontEntryIndexInitialize',
EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE => 'onFrontEntryIndexComplete',
];
}
/**
* @param ResponseEvent $event
*/
public function onResponse(ResponseEvent $event)
{
}
/**
* フロント -> 新規会員登録
* @throws \Exception
*/
public function onDefaultEntryTwig(TemplateEvent $event)
{
$event->addSnippet('@Paid4/default/Entry/index.twig');
$event->setParameter('is_paid_form_area', $this->paidConfigRepository->getAddPaidFormAreaFlag());
}
/**
* フロント -> 新規会員登録 -> 完了画面
* @throws \Exception
*/
public function onDefaultEntryCompleteTwig(TemplateEvent $event)
{
// sessionにある情報を取得
$paid_success = $this->session->get('plugin.paid.is_success');
$paid_error_Message = $this->session->get('plugin.paid.is_success_error_Message');
if($paid_success != true && $paid_success != false) {
$paid_success = null;
}
$event->addSnippet('@Paid4/default/Entry/complete.twig');
$event->setParameter('paid_success', $paid_success);
$event->setParameter('paid_error_Message', $paid_error_Message);
// sessionにある情報を初期化
$this->session->set('plugin.paid.is_success_error_Message', null);
$this->session->set('plugin.paid.is_success', null);
}
/**
* @param EventArgs $event
*/
public function onFrontEntryIndexInitialize(EventArgs $event)
{
$request = $event->getRequest();
$builder = $event->getArgument("builder");
/* @var $form FormInterface */
$form = $builder->getForm();
$form->handleRequest($request);
$Customer = $event->getArgument("Customer");
if ($form->get('paid_register_check')->getData()) {
if ($form->isSubmitted() && $form->isValid()) {
switch ($request->get('mode')) {
case 'confirm':
$builder
->add('paid_register_check', CheckboxType::class, [
'required' => true,
'label' => null,
'mapped' => false,
'eccube_form_options' => [
'auto_render' => true,
'form_theme' => '@Paid4/default/Entry/form_theme/paid_register_check.twig'
]
])
->add('PaidCustomer', PaidEntryType::class, [
'required' => true,
'mapped' => true,
'newPaidCustomer' => false,
'eccube_form_options' => [
'auto_render' => true,
'form_theme' => '@Paid4/default/Entry/form_theme/confirm.twig'
]
]);
break;
case 'complete':
$this->serLogMessage('FRONT_ENTRY_INDEX_INITIALIZE - paid新規会員データ作成開始');
/** @var Customer $Customer */
$Customer = $event->getArgument("Customer");
$Customer->setPaidCustomer($this->setPaidCustomerData($form));
$this->serLogMessage('FRONT_ENTRY_INDEX_INITIALIZE - paid新規会員データ作成完了');
break;
}
}
}
}
/**
* @param EventArgs $event
*/
public function onFrontEntryIndexComplete(EventArgs $event)
{
// Paid登録API
/** @var Customer $Customer */
$Customer = $event->getArgument("Customer");
/** @var PaidCustomer $PaidCustomer */
$PaidCustomer = $Customer->getPaidCustomer();
if (!empty($PaidCustomer)) {
$PaidCustomer->setCustomer($Customer);
$this->serLogMessage('FRONT_ENTRY_INDEX_COMPLETE - Paid会員登録API開始');
if ($this->paidHelperMember->registerMember($PaidCustomer)) {
$this->serLogMessage('FRONT_ENTRY_INDEX_COMPLETE - Paid会員登録API完了');
$this->serLogMessage('FRONT_ENTRY_INDEX_COMPLETE - Paid会員ステータス更新開始');
try {
// paid登録ステータスを「登録済み」に更新
$PaidCustomer->setPaidRegister($this->eccubeConfig['paid4.register.registered']);
$this->entityManager->persist($PaidCustomer);
$this->entityManager->flush();
$this->session->set('plugin.paid.is_success', true);
$this->serLogMessage('FRONT_ENTRY_INDEX_COMPLETE - Paid会員ステータス更新完了');
} catch (Exception $e) {
$this->serLogMessage('FRONT_ENTRY_INDEX_COMPLETE - Paid会員ステータス更新失敗 - Exception['. $e . ']');
$this->session->set('plugin.paid.is_success', false);
}
} else {
$PaidCustomer->setCustomer(null);
$PaidCustomer->setEmail(null);
$this->entityManager->persist($PaidCustomer);
$this->entityManager->flush();
$this->serLogMessage('FRONT_ENTRY_INDEX_COMPLETE - Paid会員登録API失敗');
// エラー情報をsessionにセット
$this->session->set('plugin.paid.is_success', false);
$this->session->set('plugin.paid.is_success_error_Message', $this->paidHelperMember->getErrorMessage());
}
}
}
/**
* @return PaidCustomer
* @var FormInterface $form
*/
public function setPaidCustomerData($form)
{
$paid_form = $form->get('PaidCustomer');
$representative = $paid_form->get('representative');
$representative_kana = $paid_form->get('representative_kana');
$address = $paid_form->get('address');
$clerk = $paid_form->get('clerk');
$clerk_kana = $paid_form->get('clerk_kana');
$email = $paid_form->get('email');
$PaidCustomer = new PaidCustomer();
$PaidCustomer->setCompanyName($paid_form->get('company_name')->getData())
->setCompanyNameKana($paid_form->get('company_name_kana')->getData())
->setRepresentativeSei($representative->get('representative_sei')->getData())
->setRepresentativeMei($representative->get('representative_mei')->getData())
->setRepresentativeSeiKana($representative_kana->get('representative_sei_kana')->getData())
->setRepresentativeMeiKana($representative_kana->get('representative_mei_kana')->getData())
->setZipCode(substr_replace($paid_form->get('zip_code')->getData(), '-', 3, 0))
->setPrefecture($address->get('prefecture')->getData())
->setAddress1($address->get('address1')->getData())
->setAddress2($address->get('address2')->getData())
->setClerkSei($clerk->get('clerk_sei')->getData())
->setClerkMei($clerk->get('clerk_mei')->getData())
->setClerkSeiKana($clerk_kana->get('clerk_sei_kana')->getData())
->setClerkMeiKana($clerk_kana->get('clerk_mei_kana')->getData())
->setTell($paid_form->get('tell')->getData())
->setEmail($email->get('first')->getData())
// 1:paid未登録, 2:paid登録済み
->setPaidRegister($this->eccubeConfig['paid4.register.unregistered'])
// 1:審査中, 2:利用可能-取引中, 3:利用可能-取引不可, 4:利用不可
->setPaidConfirm($this->eccubeConfig['paid4.confirm.under_review'])
// Eccube運営者による利用可否設定, 1:利用可能, 2:利用不可
->setPaidUse($this->eccubeConfig['paid4.use.available']);
return $PaidCustomer;
}
/**
* @param string $Message
*/
private function serLogMessage($Message = '')
{
PaidUtil::logInfo(__NAMESPACE__ . get_class($this) .' - '. $Message);
}
}