<?php
namespace Plugin\np42;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Page;
use Eccube\Entity\Payment;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Event\TemplateEvent;
use Eccube\Repository\PageRepository;
use Plugin\np42\Entity\Config;
use Plugin\np42\Entity\OrderNp;
use Plugin\np42\Repository\ConfigRepository;
use Plugin\np42\Service\Module\ModuleAtoneTransactionsRegister;
use Plugin\np42\Service\Module\ModuleTransactionsRegister;
use Plugin\np42\ValueObject\ServiceType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Twig\Environment;
class Event implements EventSubscriberInterface
{
/** @var Environment */
protected Environment $twig;
/** * @var PageRepository */
protected PageRepository $pageRepository;
private ConfigRepository $configRepository;
private ModuleAtoneTransactionsRegister $moduleAtoneTransactionsRegister;
private ModuleTransactionsRegister $moduleTransactionsRegister;
/** @var EntityManagerInterface */
protected EntityManagerInterface $entityManager;
public function __construct(
Environment $twig,
PageRepository $pageRepository,
ConfigRepository $configRepository,
ModuleAtoneTransactionsRegister $moduleAtoneTransactionsRegister,
EntityManagerInterface $entityManager,
ModuleTransactionsRegister $moduleTransactionsRegister
) {
$this->twig = $twig;
$this->pageRepository = $pageRepository;
$this->configRepository = $configRepository;
$this->moduleAtoneTransactionsRegister = $moduleAtoneTransactionsRegister;
$this->entityManager = $entityManager;
$this->moduleTransactionsRegister = $moduleTransactionsRegister;
}
/**
* @return array<string, mixed> The event names to listen to
*/
public static function getSubscribedEvents()
{
return [
'Shopping/confirm.twig' => 'shoppingConfirm',
'@np42/default/Shopping/atone_confirm.twig' => 'atone',
EccubeEvents::ADMIN_ORDER_EDIT_INDEX_COMPLETE => 'adminOrderEditIndexComplete',
];
}
public function adminOrderEditIndexComplete(EventArgs $event)
{
$Arguments = $event->getArguments();
/** @var \Eccube\Entity\Order $OriginOrder */
$OriginOrder = $Arguments['OriginOrder'];
/** @var \Eccube\Entity\Order $TargetOrder */
$TargetOrder = $Arguments['TargetOrder'];
$originPayment = $OriginOrder->getPayment();
$targetPaymentMethod = $TargetOrder->getPayment()->getMethodClass();
if ($originPayment instanceof Payment) {
// 管理画面 受注更新
$originPaymentMethod = $originPayment->getMethodClass();
if ($originPaymentMethod === $targetPaymentMethod) {
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Atone/', $targetPaymentMethod)
|| preg_match('/^Plugin\\\np42\\\Service\\\Method\\\TsudoAtone/', $targetPaymentMethod)
) {
$md5 = $this->moduleAtoneTransactionsRegister->makeAtoneOrderDetailMd5($TargetOrder);
$TargetOrder->setOrderAtoneDetailMd5($md5);
$this->entityManager->persist($TargetOrder);
$this->entityManager->flush();
}
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Np/', $targetPaymentMethod)) {
$md5 = $this->moduleTransactionsRegister->makeNpOrderDetailMd5($TargetOrder);
$TargetOrder->setOrderNpDetailMd5($md5);
$this->entityManager->persist($TargetOrder);
$this->entityManager->flush();
}
}
} else {
// 管理画面 新規受注
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Atone/', $targetPaymentMethod)
|| preg_match('/^Plugin\\\np42\\\Service\\\Method\\\TsudoAtone/', $targetPaymentMethod)
) {
$md5 = $this->moduleAtoneTransactionsRegister->makeAtoneOrderDetailMd5($TargetOrder);
$TargetOrder->setOrderAtoneDetailMd5($md5);
$this->entityManager->persist($TargetOrder);
$this->entityManager->flush();
}
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Np/', $targetPaymentMethod)) {
$md5 = $this->moduleTransactionsRegister->makeNpOrderDetailMd5($TargetOrder);
$TargetOrder->setOrderNpDetailMd5($md5);
$OrderNp = new OrderNp();
$OrderNp
->setOrder($TargetOrder)
->setAuthorizationResult('')
->setShopCode('')
->setShopTransactionNo('')
->setTransactionId('')
->setAuthoriHold('')
->setAmount((int)$TargetOrder->getPaymentTotal())
->setNpSettlementType('')
->setNpStatusId(OrderNp::NP_STATUS_NONE)
->setOrderNpDetailMd5($md5)
;
$TargetOrder->addOrderNp($OrderNp);
$this->moduleTransactionsRegister->npShoptransactionNoResiter($TargetOrder);
$this->entityManager->persist($TargetOrder);
$this->entityManager->flush();
}
}
}
public function shoppingConfirm(TemplateEvent $event)
{
$paymentMethod = $event->getParameter('Order')->getPayment()->getMethodClass();
$service_type = '';
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Atone/', $paymentMethod)) {
$service_type = ServiceType::TYPE_ATONE;
}
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\TsudoAtone/', $paymentMethod)) {
$service_type = ServiceType::TYPE_TSU_DO_ATONE;
}
$Config = $this->configRepository->get();
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Atone/', $paymentMethod)) {
if ((!$Config instanceof Config)
|| empty($Config->getAtoneSettlementUse())
|| is_null($Config->getAtoneProdMode())
|| empty($Config->getAtonePublicKey())
|| empty($Config->getAtonePrivateKey())
) {
$event->setParameter('np42_plugin_error', 'error');
}
// atoneボタンの設置
$event->addSnippet('@np42/default/Shopping/atone_confirm_button.twig');
}
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\TsudoAtone/', $paymentMethod)) {
if ((!$Config instanceof Config)
|| empty($Config->getAtoneSettlementUse())
|| is_null($Config->getAtoneProdMode())
|| empty($Config->getAtonePublicKey())
|| empty($Config->getAtonePrivateKey())
|| empty($Config->getAtoneTsudoSettlementUse())
) {
$event->setParameter('np42_plugin_error', 'error');
}
// つど後払いボタンの設置
$event->addSnippet('@np42/default/Shopping/atone_confirm_button.twig');
}
if (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Np/', $paymentMethod)) {
if ((!$Config instanceof Config)
|| empty($Config->getNpSettlementUse())
|| is_null($Config->getNpProdMode())
|| empty($Config->getNpPublicKey())
|| empty($Config->getMerchantCode())
|| empty($Config->getSpCode())
|| empty($Config->getShippingCompany())
) {
$event->setParameter('np42_plugin_error', 'error');
} else {
$event->setParameter('script_url', Config::MODULE_JS[$Config->getNpProdMode()]);
$event->addAsset('@np42/default/Shopping/assets_js.twig');
}
$event->setParameter('npAtobaraiData', $this->moduleTransactionsRegister->create($event->getParameter('Order')));
// サービス
$event->setParameter('service_type', ServiceType::TYPE_NP);
$event->setParameter('pub_key', $Config->getNpPublicKey());
$event->setParameter('terminal_id', Config::TERMINAL_ID);
$event->addSnippet('@np42/default/Shopping/np_confirm_button.twig');
}
}
public function atone(TemplateEvent $event)
{
// meta.twig 対応 Page::EDIT_TYPE_USER -> Page::EDIT_TYPE_DEFAULT に変更
/** @var Page $Page */
$Page = $this->pageRepository->newPage();
$Page->setEditType(Page::EDIT_TYPE_DEFAULT);
$this->twig->addGlobal('Page', $Page);
$event->addAsset('@np42/default/Shopping/assets_js.twig');
}
}