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

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