custom/plugins/PayonePayment/src/EventListener/CheckoutFinishEventListener.php line 44

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace PayonePayment\EventListener;
  4. use PayonePayment\DataAbstractionLayer\Entity\Mandate\PayonePaymentMandateEntity;
  5. use PayonePayment\Installer\CustomFieldInstaller;
  6. use PayonePayment\Installer\PaymentMethodInstaller;
  7. use PayonePayment\Storefront\Struct\CheckoutFinishPaymentData;
  8. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
  9. use Shopware\Core\Checkout\Order\OrderEntity;
  10. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  11. use Shopware\Core\Framework\Context;
  12. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  15. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. class CheckoutFinishEventListener implements EventSubscriberInterface
  18. {
  19.     /** @var EntityRepositoryInterface */
  20.     private $mandateRepository;
  21.     /** @var EntityRepositoryInterface */
  22.     private $orderTransactionRepository;
  23.     public function __construct(
  24.         EntityRepositoryInterface $mandateRepository,
  25.         EntityRepositoryInterface $orderTransactionRepository
  26.     ) {
  27.         $this->mandateRepository          $mandateRepository;
  28.         $this->orderTransactionRepository $orderTransactionRepository;
  29.     }
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinish',
  34.         ];
  35.     }
  36.     public function onCheckoutFinish(CheckoutFinishPageLoadedEvent $event): void
  37.     {
  38.         $salesChannelContext $event->getSalesChannelContext();
  39.         $context             $salesChannelContext->getContext();
  40.         if (!$this->isPayonePayment($salesChannelContext->getPaymentMethod())) {
  41.             return;
  42.         }
  43.         $mandateIdentification $this->getMandateIdentification(
  44.             $event->getPage()->getOrder(),
  45.             $context
  46.         );
  47.         if (null === $mandateIdentification) {
  48.             return;
  49.         }
  50.         if (!$this->hasDirectDebitPayment($mandateIdentification)) {
  51.             return;
  52.         }
  53.         $payoneData = new CheckoutFinishPaymentData();
  54.         $payoneData->assign([
  55.             'mandate' => $this->getMandate($mandateIdentification$context),
  56.         ]);
  57.         $event->getPage()->addExtension(CheckoutFinishPaymentData::EXTENSION_NAME$payoneData);
  58.     }
  59.     protected function hasDirectDebitPayment(?string $mandateIdentification): bool
  60.     {
  61.         return null !== $mandateIdentification;
  62.     }
  63.     private function isPayonePayment(PaymentMethodEntity $paymentMethod): bool
  64.     {
  65.         return in_array($paymentMethod->getId(), PaymentMethodInstaller::PAYMENT_METHOD_IDS);
  66.     }
  67.     private function getMandate(string $mandateIdentificationContext $context): ?PayonePaymentMandateEntity
  68.     {
  69.         $criteria = new Criteria();
  70.         $criteria->addFilter(new EqualsFilter('identification'$mandateIdentification));
  71.         return $this->mandateRepository->search($criteria$context)->first();
  72.     }
  73.     private function getMandateIdentification(OrderEntity $orderContext $context): ?string
  74.     {
  75.         $criteria = new Criteria();
  76.         $criteria->addFilter(new EqualsFilter('orderId'$order->getId()));
  77.         /** @var OrderTransactionEntity[] $transactions */
  78.         $transactions $this->orderTransactionRepository->search($criteria$context);
  79.         foreach ($transactions as $transaction) {
  80.             $customFields $transaction->getCustomFields();
  81.             if (!empty($customFields[CustomFieldInstaller::MANDATE_IDENTIFICATION])) {
  82.                 return $customFields[CustomFieldInstaller::MANDATE_IDENTIFICATION];
  83.             }
  84.         }
  85.         return null;
  86.     }
  87. }