From 6160cfd22d7c1698dc9effc7792f24a53ad1bc14 Mon Sep 17 00:00:00 2001 From: Luca Gallinari Date: Thu, 26 Sep 2024 14:19:59 +0200 Subject: [PATCH] Dispatch event so that it's easier to hook into the availability service --- config/services/checker.php | 5 ++++- src/Checker/PausePayAvailabilityChecker.php | 24 ++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/config/services/checker.php b/config/services/checker.php index 44cbcb7..f71ee56 100644 --- a/config/services/checker.php +++ b/config/services/checker.php @@ -9,5 +9,8 @@ return static function (ContainerConfigurator $containerConfigurator) { $services = $containerConfigurator->services(); - $services->set('webgriffe_sylius_pausepay.checker.pause_pay_availability', PausePayAvailabilityChecker::class); + $services->set('webgriffe_sylius_pausepay.checker.pause_pay_availability', PausePayAvailabilityChecker::class) + ->args([ + service('event_dispatcher'), + ]); }; diff --git a/src/Checker/PausePayAvailabilityChecker.php b/src/Checker/PausePayAvailabilityChecker.php index c050df9..a9c0601 100644 --- a/src/Checker/PausePayAvailabilityChecker.php +++ b/src/Checker/PausePayAvailabilityChecker.php @@ -9,6 +9,8 @@ use Sylius\Component\Core\Model\PaymentInterface; use Sylius\Component\Core\Model\PaymentMethodInterface; use Sylius\Component\Payment\Model\PaymentInterface as BasePaymentInterface; +use Symfony\Component\EventDispatcher\GenericEvent; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Webgriffe\SyliusPausePayPlugin\Payum\PausePayApi; use Webmozart\Assert\Assert; @@ -18,6 +20,12 @@ final class PausePayAvailabilityChecker implements PaymentMethodAvailabilityChec public const MAXIMUM_ORDER_AMOUNT = 2000000; + public const AVAILABILITY_EVENT_NAME = 'webgriffe.sylius_pausepay_plugin.checker.pausepay_availability'; + + public function __construct(private EventDispatcherInterface $eventDispatcher) + { + } + public function isAvailable(BasePaymentInterface $subject, PaymentMethodInterface $paymentMethod): bool { $gatewayConfig = $paymentMethod->getGatewayConfig(); @@ -48,6 +56,20 @@ public function isAvailable(BasePaymentInterface $subject, PaymentMethodInterfac $orderAmount = $order->getTotal(); - return $orderAmount >= self::MINIMUM_ORDER_AMOUNT && $orderAmount <= self::MAXIMUM_ORDER_AMOUNT; + $isAvailable = $orderAmount >= self::MINIMUM_ORDER_AMOUNT && $orderAmount <= self::MAXIMUM_ORDER_AMOUNT; + + /** @var GenericEvent $event */ + $event = $this->eventDispatcher->dispatch( + new GenericEvent($order, ['paymentMethod' => $paymentMethod, 'isAvailable' => $isAvailable]), + self::AVAILABILITY_EVENT_NAME, + ); + + /** @var mixed $result */ + $result = $event->getArgument('isAvailable'); + if (is_bool($result)) { + return $result; + } + + return $isAvailable; } }