vendor/wallee/shopware-6/src/Core/Storefront/Checkout/Subscriber/CheckoutSubscriber.php line 81

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace WalleePayment\Core\Storefront\Checkout\Subscriber;
  3. use Psr\Log\LoggerInterface;
  4. use Shopware\Core\{
  5.     Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates,
  6.     Checkout\Order\Aggregate\OrderTransaction\OrderTransactionCollection,
  7.     Checkout\Order\OrderEntity,
  8.     Content\MailTemplate\Service\Event\MailBeforeValidateEvent};
  9. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use WalleePayment\Core\{
  12.     Api\Transaction\Service\OrderMailService,
  13.     Checkout\PaymentHandler\WalleePaymentHandler,
  14.     Settings\Service\SettingsService,
  15.     Util\PaymentMethodUtil};
  16. /**
  17.  * Class CheckoutSubscriber
  18.  *
  19.  * @package WalleePayment\Storefront\Checkout\Subscriber
  20.  */
  21. class CheckoutSubscriber implements EventSubscriberInterface {
  22.     /**
  23.      * @var \Psr\Log\LoggerInterface
  24.      */
  25.     protected $logger;
  26.     /**
  27.      * @var \WalleePayment\Core\Util\PaymentMethodUtil
  28.      */
  29.     private $paymentMethodUtil;
  30.     /**
  31.      * @var \WalleePayment\Core\Settings\Service\SettingsService
  32.      */
  33.     private $settingsService;
  34.     /**
  35.      * CheckoutSubscriber constructor.
  36.      *
  37.      * @param \WalleePayment\Core\Settings\Service\SettingsService $settingsService
  38.      * @param \WalleePayment\Core\Util\PaymentMethodUtil           $paymentMethodUtil
  39.      */
  40.     public function __construct(SettingsService $settingsServicePaymentMethodUtil $paymentMethodUtil)
  41.     {
  42.         $this->settingsService   $settingsService;
  43.         $this->paymentMethodUtil $paymentMethodUtil;
  44.     }
  45.     /**
  46.      * @param \Psr\Log\LoggerInterface $logger
  47.      *
  48.      * @internal
  49.      * @required
  50.      *
  51.      */
  52.     public function setLogger(LoggerInterface $logger): void
  53.     {
  54.         $this->logger $logger;
  55.     }
  56.     /**
  57.      * @return array
  58.      */
  59.     public static function getSubscribedEvents(): array
  60.     {
  61.         return [
  62.             CheckoutConfirmPageLoadedEvent::class => ['onConfirmPageLoaded'1],
  63.             MailBeforeValidateEvent::class        => ['onMailBeforeValidate'1],
  64.         ];
  65.     }
  66.     /**
  67.      * Stop order emails being sent out
  68.      *
  69.      * @param \Shopware\Core\Content\MailTemplate\Service\Event\MailBeforeValidateEvent $event
  70.      */
  71.     public function onMailBeforeValidate(MailBeforeValidateEvent $event): void
  72.     {
  73.         $templateData $event->getTemplateData();
  74.         
  75.         /**
  76.          * @var $order \Shopware\Core\Checkout\Order\OrderEntity
  77.          */
  78.         $order = !empty($templateData['order']) && $templateData['order'] instanceof OrderEntity $templateData['order'] : null;
  79.         if (!empty($order) && $order->getAmountTotal() > 0){
  80.             $isWalleeEmailSettingEnabled $this->settingsService->getSettings($order->getSalesChannelId())->isEmailEnabled();
  81.             if (!$isWalleeEmailSettingEnabled) { //setting is disabled
  82.                 return;
  83.             }
  84.             $orderTransactions $order->getTransactions();
  85.             if (!($orderTransactions instanceof OrderTransactionCollection)) {
  86.                 return;
  87.             }
  88.             $orderTransactionLast $orderTransactions->last();
  89.             if (empty($orderTransactionLast) || empty($orderTransactionLast->getPaymentMethod())) { // no payment method available
  90.                 return;
  91.             }
  92.             $isWalleePM WalleePaymentHandler::class == $orderTransactionLast->getPaymentMethod()->getHandlerIdentifier();
  93.             if (!$isWalleePM) { // not our payment method
  94.                 return;
  95.             }
  96.             $isOrderTransactionStateOpen in_array(
  97.                 $orderTransactionLast->getStateMachineState()->getTechnicalName(), [
  98.                 OrderTransactionStates::STATE_OPEN,
  99.                 OrderTransactionStates::STATE_IN_PROGRESS,
  100.             ]);
  101.             if (!$isOrderTransactionStateOpen) { // order payment status is open or in progress
  102.                 return;
  103.             }
  104.             $isWalleeEmail = isset($templateData[OrderMailService::EMAIL_ORIGIN_IS_WALLEE]);
  105.             if (!$isWalleeEmail) {
  106.                 $this->logger->info('Email disabled for ', ['orderId' => $order->getId()]);
  107.                 $event->stopPropagation();
  108.             }
  109.         }
  110.     }
  111.     /**
  112.      * @param \Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent $event
  113.      */
  114.     public function onConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event): void
  115.     {
  116.         try {
  117.             $settings $this->settingsService->getValidSettings($event->getSalesChannelContext()->getSalesChannel()->getId());
  118.             if (is_null($settings)) {
  119.                 $this->logger->notice('Removing payment methods because settings are invalid');
  120.                 $this->removeWalleePaymentMethodFromConfirmPage($event);
  121.             }
  122.         } catch (\Exception $e) {
  123.             $this->logger->error($e->getMessage());
  124.             $this->removeWalleePaymentMethodFromConfirmPage($event);
  125.         }
  126.     }
  127.     /**
  128.      * @param \Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent $event
  129.      */
  130.     private function removeWalleePaymentMethodFromConfirmPage(CheckoutConfirmPageLoadedEvent $event): void
  131.     {
  132.         $paymentMethodCollection $event->getPage()->getPaymentMethods();
  133.         $paymentMethodIds        $this->paymentMethodUtil->getWalleePaymentMethodIds($event->getContext());
  134.         foreach ($paymentMethodIds as $paymentMethodId) {
  135.             $paymentMethodCollection->remove($paymentMethodId);
  136.         }
  137.     }
  138. }