custom/plugins/UnzerPayment6/src/EventListeners/Checkout/ConfirmPageEventListener.php line 88

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace UnzerPayment6\EventListeners\Checkout;
  4. use Shopware\Core\Framework\Context;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  7. use Shopware\Core\Framework\Uuid\Uuid;
  8. use Shopware\Core\System\SystemConfig\SystemConfigService;
  9. use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent;
  10. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  11. use Shopware\Storefront\Page\PageLoadedEvent;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Throwable;
  14. use UnzerPayment6\Components\ClientFactory\ClientFactoryInterface;
  15. use UnzerPayment6\Components\ConfigReader\ConfigReader;
  16. use UnzerPayment6\Components\ConfigReader\ConfigReaderInterface;
  17. use UnzerPayment6\Components\PaymentFrame\PaymentFrameFactoryInterface;
  18. use UnzerPayment6\Components\Struct\Configuration;
  19. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\ApplePayPageExtension;
  20. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\CreditCardPageExtension;
  21. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\DirectDebitPageExtension;
  22. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\DirectDebitSecuredPageExtension;
  23. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\FraudPreventionPageExtension;
  24. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\InstallmentSecuredPageExtension;
  25. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\PaymentFramePageExtension;
  26. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\PayPalPageExtension;
  27. use UnzerPayment6\Components\Struct\PageExtension\Checkout\Confirm\UnzerDataPageExtension;
  28. use UnzerPayment6\DataAbstractionLayer\Entity\PaymentDevice\UnzerPaymentDeviceEntity;
  29. use UnzerPayment6\DataAbstractionLayer\Repository\PaymentDevice\UnzerPaymentDeviceRepositoryInterface;
  30. use UnzerPayment6\Installer\PaymentInstaller;
  31. use UnzerSDK\Resources\Customer;
  32. class ConfirmPageEventListener implements EventSubscriberInterface
  33. {
  34.     private const INSTALLMENT_SECURED_EFFECTIVE_INTEREST_DEFAULT 4.5;
  35.     /** @var Configuration */
  36.     protected $configData;
  37.     /** @var UnzerPaymentDeviceRepositoryInterface */
  38.     private $deviceRepository;
  39.     /** @var ConfigReaderInterface */
  40.     private $configReader;
  41.     /** @var PaymentFrameFactoryInterface */
  42.     private $paymentFrameFactory;
  43.     /** @var SystemConfigService */
  44.     private $systemConfigReader;
  45.     /** @var EntityRepository */
  46.     private $languageRepository;
  47.     /** @var ClientFactoryInterface */
  48.     private $clientFactory;
  49.     public function __construct(
  50.         UnzerPaymentDeviceRepositoryInterface $deviceRepository,
  51.         ConfigReaderInterface $configReader,
  52.         PaymentFrameFactoryInterface $paymentFrameFactory,
  53.         SystemConfigService $systemConfigReader,
  54.         EntityRepository $languageRepository,
  55.         ClientFactoryInterface $clientFactory
  56.     ) {
  57.         $this->deviceRepository    $deviceRepository;
  58.         $this->configReader        $configReader;
  59.         $this->paymentFrameFactory $paymentFrameFactory;
  60.         $this->systemConfigReader  $systemConfigReader;
  61.         $this->languageRepository  $languageRepository;
  62.         $this->clientFactory       $clientFactory;
  63.     }
  64.     /**
  65.      * {@inheritdoc}
  66.      */
  67.     public static function getSubscribedEvents(): array
  68.     {
  69.         return [
  70.             CheckoutConfirmPageLoadedEvent::class  => 'onCheckoutConfirm',
  71.             AccountEditOrderPageLoadedEvent::class => 'onCheckoutConfirm',
  72.         ];
  73.     }
  74.     public function onCheckoutConfirm(PageLoadedEvent $event): void
  75.     {
  76.         if (!($event instanceof CheckoutConfirmPageLoadedEvent) && !($event instanceof AccountEditOrderPageLoadedEvent)) {
  77.             return;
  78.         }
  79.         $salesChannelContext $event->getSalesChannelContext();
  80.         $this->configData    $this->configReader->read($salesChannelContext->getSalesChannel()->getId());
  81.         if ($salesChannelContext->getPaymentMethod()->getId() === PaymentInstaller::PAYMENT_ID_CREDIT_CARD
  82.         ) {
  83.             $this->addCreditCardExtension($event);
  84.         }
  85.         if ($salesChannelContext->getPaymentMethod()->getId() === PaymentInstaller::PAYMENT_ID_PAYPAL
  86.         ) {
  87.             $this->addPayPalExtension($event);
  88.         }
  89.         if ($salesChannelContext->getPaymentMethod()->getId() === PaymentInstaller::PAYMENT_ID_DIRECT_DEBIT
  90.         ) {
  91.             $this->addDirectDebitExtension($event);
  92.         }
  93.         if ($salesChannelContext->getPaymentMethod()->getId() === PaymentInstaller::PAYMENT_ID_DIRECT_DEBIT_SECURED
  94.         ) {
  95.             $this->addDirectDebitSecuredExtension($event);
  96.         }
  97.         if ($salesChannelContext->getPaymentMethod()->getId() === PaymentInstaller::PAYMENT_ID_PAYLATER_INVOICE) {
  98.             $this->addFraudPreventionExtension($event);
  99.         }
  100.         if ($salesChannelContext->getPaymentMethod()->getId() === PaymentInstaller::PAYMENT_ID_INSTALLMENT_SECURED) {
  101.             $this->addInstallmentSecuredExtension($event);
  102.         }
  103.         if ($salesChannelContext->getPaymentMethod()->getId() === PaymentInstaller::PAYMENT_ID_APPLE_PAY) {
  104.             $this->addApplePayExtension($event);
  105.         }
  106.         if (in_array($salesChannelContext->getPaymentMethod()->getId(), PaymentInstaller::PAYMENT_METHOD_IDS)) {
  107.             $this->addPaymentFrameExtension($event);
  108.             $this->addUnzerDataExtension($event);
  109.         }
  110.     }
  111.     private function addFraudPreventionExtension(PageLoadedEvent $event): void
  112.     {
  113.         $extension = new FraudPreventionPageExtension();
  114.         $extension->setFraudPreventionSessionId(Uuid::randomHex());
  115.         $event->getPage()->addExtension(FraudPreventionPageExtension::EXTENSION_NAME$extension);
  116.     }
  117.     private function addUnzerDataExtension(PageLoadedEvent $event): void
  118.     {
  119.         $context $event->getSalesChannelContext()->getContext();
  120.         $extension = new UnzerDataPageExtension();
  121.         $extension->setPublicKey($this->configData->get(ConfigReader::CONFIG_KEY_PUBLIC_KEY));
  122.         $extension->setLocale($this->getLocaleByLanguageId($context->getLanguageId(), $context));
  123.         $extension->setShowTestData((bool) $this->configData->get(ConfigReader::CONFIG_KEY_TEST_DATA));
  124.         $extension->setUnzerCustomer($this->getUnzerCustomer($event));
  125.         $event->getPage()->addExtension(UnzerDataPageExtension::EXTENSION_NAME$extension);
  126.     }
  127.     private function getUnzerCustomer(PageLoadedEvent $event): ?Customer
  128.     {
  129.         $customer $event->getSalesChannelContext()->getCustomer();
  130.         if ($customer === null) {
  131.             return null;
  132.         }
  133.         $salesChannelId $event->getSalesChannelContext()->getSalesChannelId();
  134.         $client         $this->clientFactory->createClient($salesChannelId);
  135.         $customerNumber $customer->getCustomerNumber();
  136.         $billingAddress $customer->getActiveBillingAddress();
  137.         if ($billingAddress !== null && !empty($billingAddress->getCompany())) {
  138.             $customerNumber .= '_b';
  139.         }
  140.         try {
  141.             return $client->fetchCustomerByExtCustomerId($customerNumber);
  142.         } catch (Throwable $t) {
  143.             return null;
  144.         }
  145.     }
  146.     private function addPaymentFrameExtension(PageLoadedEvent $event): void
  147.     {
  148.         $paymentId           $event->getSalesChannelContext()->getPaymentMethod()->getId();
  149.         $mappedFrameTemplate $this->paymentFrameFactory->getPaymentFrame($paymentId);
  150.         if (!$mappedFrameTemplate) {
  151.             return;
  152.         }
  153.         $shopName $this->systemConfigReader->get(
  154.             'core.basicInformation.shopName',
  155.             $event->getSalesChannelContext()->getSalesChannel()->getId()
  156.         );
  157.         $event->getPage()->addExtension(
  158.             PaymentFramePageExtension::EXTENSION_NAME,
  159.             (new PaymentFramePageExtension())
  160.                 ->setPaymentFrame($mappedFrameTemplate)
  161.                 ->setShopName(is_string($shopName) ? $shopName '')
  162.         );
  163.     }
  164.     private function addCreditCardExtension(PageLoadedEvent $event): void
  165.     {
  166.         $customer $event->getSalesChannelContext()->getCustomer();
  167.         if (!$customer) {
  168.             return;
  169.         }
  170.         $creditCards $this->deviceRepository->getCollectionByCustomer($customer$event->getContext(), UnzerPaymentDeviceEntity::DEVICE_TYPE_CREDIT_CARD);
  171.         $extension   = new CreditCardPageExtension();
  172.         /** @var UnzerPaymentDeviceEntity $creditCard */
  173.         foreach ($creditCards as $creditCard) {
  174.             $extension->addCreditCard($creditCard);
  175.         }
  176.         $event->getPage()->addExtension(CreditCardPageExtension::EXTENSION_NAME$extension);
  177.     }
  178.     private function addPayPalExtension(PageLoadedEvent $event): void
  179.     {
  180.         $customer $event->getSalesChannelContext()->getCustomer();
  181.         if (!$customer) {
  182.             return;
  183.         }
  184.         $payPalAccounts $this->deviceRepository->getCollectionByCustomer($customer$event->getContext(), UnzerPaymentDeviceEntity::DEVICE_TYPE_PAYPAL);
  185.         $extension      = new PayPalPageExtension();
  186.         /** @var UnzerPaymentDeviceEntity $payPalAccount */
  187.         foreach ($payPalAccounts as $payPalAccount) {
  188.             $extension->addPayPalAccount($payPalAccount);
  189.         }
  190.         $event->getPage()->addExtension(PayPalPageExtension::EXTENSION_NAME$extension);
  191.     }
  192.     private function addDirectDebitExtension(PageLoadedEvent $event): void
  193.     {
  194.         $customer $event->getSalesChannelContext()->getCustomer();
  195.         if (!$customer) {
  196.             return;
  197.         }
  198.         $directDebitDevices $this->deviceRepository->getCollectionByCustomer($customer$event->getContext(), UnzerPaymentDeviceEntity::DEVICE_TYPE_DIRECT_DEBIT);
  199.         $extension          = new DirectDebitPageExtension();
  200.         /** @var UnzerPaymentDeviceEntity $directDebitDevice */
  201.         foreach ($directDebitDevices as $directDebitDevice) {
  202.             $extension->addDirectDebitDevice($directDebitDevice);
  203.         }
  204.         $event->getPage()->addExtension(DirectDebitPageExtension::EXTENSION_NAME$extension);
  205.     }
  206.     private function addDirectDebitSecuredExtension(PageLoadedEvent $event): void
  207.     {
  208.         $customer $event->getSalesChannelContext()->getCustomer();
  209.         if (!$customer) {
  210.             return;
  211.         }
  212.         $directDebitDevices $this->deviceRepository->getCollectionByCustomer($customer$event->getContext(), UnzerPaymentDeviceEntity::DEVICE_TYPE_DIRECT_DEBIT_SECURED);
  213.         $extension          = (new DirectDebitSecuredPageExtension())->setDisplayDirectDebitDeviceSelection(true);
  214.         /** @var UnzerPaymentDeviceEntity $directDebitDevice */
  215.         foreach ($directDebitDevices as $directDebitDevice) {
  216.             $extension->addDirectDebitDevice($directDebitDevice);
  217.         }
  218.         $event->getPage()->addExtension(DirectDebitSecuredPageExtension::EXTENSION_NAME$extension);
  219.     }
  220.     private function addInstallmentSecuredExtension(PageLoadedEvent $event): void
  221.     {
  222.         $extension = new InstallmentSecuredPageExtension();
  223.         $extension->setCurrency($event->getSalesChannelContext()->getCurrency()->getIsoCode());
  224.         $extension->setEffectiveInterest((float) $this->configData->get(ConfigReader::CONFIG_KEY_INSTALLMENT_SECURED_INTERESTself::INSTALLMENT_SECURED_EFFECTIVE_INTEREST_DEFAULT));
  225.         if ($event instanceof CheckoutConfirmPageLoadedEvent) {
  226.             $extension->setAmount($event->getPage()->getCart()->getPrice()->getTotalPrice());
  227.         } elseif ($event instanceof AccountEditOrderPageLoadedEvent) {
  228.             $extension->setAmount($event->getPage()->getOrder()->getPrice()->getTotalPrice());
  229.         }
  230.         $extension->setOrderDate(date('Y-m-d'));
  231.         $event->getPage()->addExtension(InstallmentSecuredPageExtension::EXTENSION_NAME$extension);
  232.     }
  233.     private function addApplePayExtension(PageLoadedEvent $event): void
  234.     {
  235.         $event->getPage()->addExtension(ApplePayPageExtension::EXTENSION_NAME, new ApplePayPageExtension());
  236.     }
  237.     private function getLocaleByLanguageId(string $languageIdContext $context): string
  238.     {
  239.         $critera = new Criteria([$languageId]);
  240.         $critera->addAssociation('locale');
  241.         /** @var null|\Shopware\Core\System\Language\LanguageEntity $searchResult */
  242.         $searchResult $this->languageRepository->search($critera$context)->first();
  243.         if ($searchResult === null || $searchResult->getLocale() === null) {
  244.             return ClientFactoryInterface::DEFAULT_LOCALE;
  245.         }
  246.         return $searchResult->getLocale()->getCode();
  247.     }
  248. }