Skip to content

Commit

Permalink
[ECP-8333] Add event listener for SalesChannelContextRestoredEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
candemiralp committed Nov 14, 2023
1 parent ecc3b5c commit 2a68b94
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 12 deletions.
4 changes: 4 additions & 0 deletions src/Resources/config/services/subscribers.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@
<service id="Adyen\Shopware\Subscriber\ContextSubscriber">
<argument type="service" id="Adyen\Shopware\Service\ConfigurationService"/>
<argument type="service" id="Adyen\Shopware\Service\PaymentStateDataService"/>
<argument type="service" id="Shopware\Core\System\SalesChannel\SalesChannel\ContextSwitchRoute"/>
<argument type="service" id="Shopware\Core\Checkout\Cart\CartPersister"/>
<argument type="service" id="Shopware\Core\Checkout\Cart\CartCalculator"/>
<argument type="service" id="Adyen\Util\Currency"/>
<tag name="kernel.event_subscriber"/>
</service>
<service id="Adyen\Shopware\Subscriber\Response\PaymentMethodRouteResponseSubscriber">
Expand Down
86 changes: 74 additions & 12 deletions src/Subscriber/ContextSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,71 @@

namespace Adyen\Shopware\Subscriber;

use Adyen\Shopware\Entity\PaymentStateData\PaymentStateDataEntity;
use Adyen\Shopware\Service\ConfigurationService;
use Adyen\Shopware\Service\PaymentStateDataService;
use Adyen\Shopware\Struct\AdyenContextDataStruct;
use Adyen\Util\Currency;
use Shopware\Core\Checkout\Cart\AbstractCartPersister;
use Shopware\Core\Checkout\Cart\CartCalculator;
use Shopware\Core\Checkout\Cart\Exception\CartTokenNotFoundException;
use Shopware\Core\Framework\Routing\Event\SalesChannelContextResolvedEvent;
use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
use Shopware\Core\System\SalesChannel\Event\SalesChannelContextRestoredEvent;
use Shopware\Core\System\SalesChannel\Event\SalesChannelContextTokenChangeEvent;
use Shopware\Core\System\SalesChannel\SalesChannel\AbstractContextSwitchRoute;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ContextSubscriber implements EventSubscriberInterface
{
/**
* @var ConfigurationService
*/
private $configurationService;

/**
* @var PaymentStateDataService
*/
private $paymentStateDataService;
private ConfigurationService $configurationService;
private PaymentStateDataService $paymentStateDataService;
private AbstractContextSwitchRoute $contextSwitchRoute;
private AbstractCartPersister $cartPersister;
private CartCalculator $cartCalculator;
private Currency $currency;

public function __construct(
ConfigurationService $configurationService,
PaymentStateDataService $paymentStateDataService
PaymentStateDataService $paymentStateDataService,
AbstractContextSwitchRoute $contextSwitchRoute,
AbstractCartPersister $cartPersister,
CartCalculator $cartCalculator,
Currency $currency
) {
$this->configurationService = $configurationService;
$this->paymentStateDataService = $paymentStateDataService;
$this->contextSwitchRoute = $contextSwitchRoute;
$this->cartPersister = $cartPersister;
$this->cartCalculator = $cartCalculator;
$this->currency = $currency;
}

public static function getSubscribedEvents()
{
return [
SalesChannelContextResolvedEvent::class => 'addAdyenData',
SalesChannelContextTokenChangeEvent::class => 'onContextTokenChange'
SalesChannelContextTokenChangeEvent::class => 'onContextTokenChange',
SalesChannelContextRestoredEvent::class => 'onContextRestored'
];
}

public function onContextTokenChange(SalesChannelContextTokenChangeEvent $event)
public function onContextRestored(SalesChannelContextRestoredEvent $event): void
{
$token = $event->getRestoredSalesChannelContext()->getToken();
$oldToken = $event->getCurrentSalesChannelContext()->getToken();

$stateData = $this->paymentStateDataService->getPaymentStateDataFromContextToken($oldToken);

if ($stateData) {
$this->paymentStateDataService->updateStateDataContextToken($stateData, $token);
$this->setGiftcardPaymentMethodAfterContextRestored($event->getRestoredSalesChannelContext(), $stateData);
}
}

public function onContextTokenChange(SalesChannelContextTokenChangeEvent $event): void
{
$token = $event->getCurrentToken();
$oldToken = $event->getPreviousToken();
Expand All @@ -85,4 +114,37 @@ public function addAdyenData(SalesChannelContextResolvedEvent $event): void
$data = $this->paymentStateDataService->getPaymentStateDataFromContextToken($context->getToken());
$extension->setHasPaymentStateData(!empty($data));
}

private function setGiftcardPaymentMethodAfterContextRestored(
SalesChannelContext $context,
PaymentStateDataEntity $stateData,
): void {
$currency = $context->getCurrency()->getIsoCode();
$decodedStateData = json_decode($stateData->getStateData(), true);

try {
$cart = $this->cartCalculator->calculate(
$this->cartPersister->load($context->getToken(), $context),
$context
);
$totalPrice = $cart->getPrice()->getTotalPrice();
} catch (CartTokenNotFoundException $exception) {
// No cart information found.
return;
}

$amount = $this->currency->sanitize($totalPrice, $currency);
$giftcardDiscount = $decodedStateData['additionalData']['amount'] ?? 0;

if ($giftcardDiscount >= $amount) {
$this->contextSwitchRoute->switchContext(
new RequestDataBag(
[
SalesChannelContextService::PAYMENT_METHOD_ID => $decodedStateData['additionalData']['paymentMethodId']
]
),
$context
);
}
}
}

0 comments on commit 2a68b94

Please sign in to comment.