custom/plugins/KlarnaPayment/src/Components/EventListener/CheckoutEventListener.php line 43

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace KlarnaPayment\Components\EventListener;
  4. use KlarnaPayment\Components\Extension\TemplateData\CheckoutDataExtension;
  5. use KlarnaPayment\Components\Helper\PaymentHelper\PaymentHelperInterface;
  6. use KlarnaPayment\Core\Checkout\Cart\Error\MissingStateError;
  7. use KlarnaPayment\Installer\Modules\PaymentMethodInstaller;
  8. use Shopware\Core\Checkout\Order\Aggregate\OrderAddress\OrderAddressCollection;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent;
  12. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  13. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  14. use Shopware\Storefront\Page\PageLoadedEvent;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. class CheckoutEventListener implements EventSubscriberInterface
  17. {
  18.     /** @var PaymentHelperInterface */
  19.     private $paymentHelper;
  20.     /** @var EntityRepository */
  21.     private $orderAddressRepository;
  22.     public function __construct(PaymentHelperInterface $paymentHelperEntityRepository $orderAddressRepository)
  23.     {
  24.         $this->paymentHelper          $paymentHelper;
  25.         $this->orderAddressRepository $orderAddressRepository;
  26.     }
  27.     public static function getSubscribedEvents(): array
  28.     {
  29.         return [
  30.             CheckoutConfirmPageLoadedEvent::class  => [['addKlarnaTemplateData'], ['validateCountryState']],
  31.             AccountEditOrderPageLoadedEvent::class => [['addKlarnaTemplateData']],
  32.             CheckoutFinishPageLoadedEvent::class   => [['addOrderBillingAddress']],
  33.         ];
  34.     }
  35.     public function addKlarnaTemplateData(PageLoadedEvent $event): void
  36.     {
  37.         if (!($event instanceof CheckoutConfirmPageLoadedEvent) && !($event instanceof AccountEditOrderPageLoadedEvent)) {
  38.             return;
  39.         }
  40.         if ($this->paymentHelper->isKlarnaPaymentsEnabled($event->getSalesChannelContext())) {
  41.             $type CheckoutDataExtension::TYPE_PAYMENTS;
  42.         } elseif ($this->paymentHelper->isKlarnaCheckoutEnabled($event->getSalesChannelContext())) {
  43.             $type CheckoutDataExtension::TYPE_CHECKOUT;
  44.         } else {
  45.             return;
  46.         }
  47.         $templateData = new CheckoutDataExtension();
  48.         $templateData->assign([
  49.             'klarnaType' => $type,
  50.         ]);
  51.         $event->getPage()->addExtension(CheckoutDataExtension::EXTENSION_NAME$templateData);
  52.     }
  53.     public function addOrderBillingAddress(CheckoutFinishPageLoadedEvent $event): void
  54.     {
  55.         $order            $event->getPage()->getOrder();
  56.         $orderAddresses   $order->getAddresses() ?? new OrderAddressCollection();
  57.         $billingAddressId $order->getBillingAddressId();
  58.         if ($orderAddresses->has($billingAddressId)) {
  59.             return;
  60.         }
  61.         $billingAddress $this->orderAddressRepository->search((new Criteria([$billingAddressId]))->addAssociation('country'), $event->getContext())->first();
  62.         $orderAddresses->set($billingAddressId$billingAddress);
  63.         $order->setAddresses($orderAddresses);
  64.     }
  65.     public function validateCountryState(CheckoutConfirmPageLoadedEvent $event): void
  66.     {
  67.         if (!($this->paymentHelper->isKlarnaPaymentsEnabled($event->getSalesChannelContext()) || $this->paymentHelper->isKlarnaCheckoutEnabled($event->getSalesChannelContext()))) {
  68.             return;
  69.         }
  70.         if (!$this->paymentHelper->isKlarnaPaymentsSelected($event->getSalesChannelContext())) {
  71.             return;
  72.         }
  73.         $customer $event->getSalesChannelContext()->getCustomer();
  74.         if ($customer === null) {
  75.             return;
  76.         }
  77.         if (is_null($customer->getActiveBillingAddress())) {
  78.             return;
  79.         }
  80.         $activeBillingAddress $customer->getActiveBillingAddress();
  81.         if ($activeBillingAddress->getCountry() === null) {
  82.             return;
  83.         }
  84.         if ($activeBillingAddress->getCountry()->getIso() === PaymentMethodInstaller::KLARNA_API_REGION_US && $activeBillingAddress->getCountryStateId() === null) {
  85.             $errors $event->getPage()->getCart()->getErrors();
  86.             $errors->add(new MissingStateError());
  87.             $event->getPage()->getCart()->setErrors($errors);
  88.         }
  89.     }
  90. }