<?php
namespace Appflix\Studygood\Storefront\Subscriber;
use Appflix\Studygood\Core\Service\VideoCourseService;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates;
use Shopware\Core\System\StateMachine\Event\StateMachineTransitionEvent;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CheckoutSubscriber implements EventSubscriberInterface
{
private VideoCourseService $videoCourseService;
public function __construct(
VideoCourseService $videoCourseService
)
{
$this->videoCourseService = $videoCourseService;
}
public static function getSubscribedEvents(): array
{
return [
CheckoutConfirmPageLoadedEvent::class => 'onCartPageLoaded',
CheckoutOrderPlacedEvent::class => 'onOrderPlaced',
CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinishPage',
StateMachineTransitionEvent::class => 'stateChanged',
];
}
public function onOrderPlaced(CheckoutOrderPlacedEvent $event): void
{
$this->videoCourseService->addEsdToCustomer($event->getOrder());
}
public function stateChanged(StateMachineTransitionEvent $event): void
{
if ($event->getContext()->getVersionId() !== \Shopware\Core\Defaults::LIVE_VERSION) {
return;
}
if ($event->getEntityName() === 'order_transaction' && $event->getToPlace()->getTechnicalName() === OrderTransactionStates::STATE_PAID) {
$order = $this->videoCourseService->getOrderByTransaction($event->getEntityId());
$this->videoCourseService->updateOrderEsd($order);
}
}
public function onCartPageLoaded(CheckoutConfirmPageLoadedEvent $event): void
{
$cart = $event->getPage()->getCart();
$cart->assign(['hasEsd' => $this->videoCourseService->cartHasEsd($cart)]);
}
public function onCheckoutFinishPage(CheckoutFinishPageLoadedEvent $event): void
{
$order = $event->getPage()->getOrder();
$order->assign(['hasEsd' => $this->videoCourseService->orderHasEsd($order)]);
}
}