<?php declare(strict_types=1);
namespace Wexo\FreeShipping\Subscriber;
use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoadedEvent;
use Shopware\Storefront\Page\Page;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Wexo\FreeShipping\Service\FreeShippingCalculator;
class FreeShippingSubscriber implements EventSubscriberInterface
{
public const FREE_SHIPPING_EXTENSION = 'free_shipping';
protected FreeShippingCalculator $freeShippingCalculator;
/**
* @param FreeShippingCalculator $freeShippingCalculator
*/
public function __construct(FreeShippingCalculator $freeShippingCalculator)
{
$this->freeShippingCalculator = $freeShippingCalculator;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
OffcanvasCartPageLoadedEvent::class => 'onOffcanvasCartPage',
CheckoutConfirmPageLoadedEvent::class => 'onCheckoutConfirmPage',
CheckoutRegisterPageLoadedEvent::class => 'onCheckoutRegisterPage',
CheckoutCartPageLoadedEvent::class => 'onCheckoutCartPage'
];
}
/**
* @param OffcanvasCartPageLoadedEvent $event
*/
public function onOffcanvasCartPage(OffcanvasCartPageLoadedEvent $event): void
{
$salesChannelContext = $event->getSalesChannelContext();
$page = $event->getPage();
$this->addFreeShippingAmount($page->getCart(), $page, $salesChannelContext);
}
/**
* @param CheckoutCartPageLoadedEvent $event
*/
public function onCheckoutCartPage(CheckoutCartPageLoadedEvent $event)
{
$salesChannelContext = $event->getSalesChannelContext();
$page = $event->getPage();
$this->addFreeShippingAmount($page->getCart(), $page, $salesChannelContext);
}
/**
* @param CheckoutRegisterPageLoadedEvent $event
*/
public function onCheckoutRegisterPage(CheckoutRegisterPageLoadedEvent $event)
{
$salesChannelContext = $event->getSalesChannelContext();
$page = $event->getPage();
$this->addFreeShippingAmount($page->getCart(), $page, $salesChannelContext);
}
/**
* @param CheckoutConfirmPageLoadedEvent $event
*/
public function onCheckoutConfirmPage(CheckoutConfirmPageLoadedEvent $event)
{
$salesChannelContext = $event->getSalesChannelContext();
$page = $event->getPage();
$this->addFreeShippingAmount($page->getCart(), $page, $salesChannelContext);
}
/**
* @param Cart $cart
* @param Page $page
* @param SalesChannelContext $salesChannelContext
*/
public function addFreeShippingAmount(Cart $cart, Page $page, SalesChannelContext $salesChannelContext): void
{
$page->addExtension(
self::FREE_SHIPPING_EXTENSION,
$this->freeShippingCalculator->calculateAmountToFreeShipping(
$cart->getPrice()->getPositionPrice(),
$salesChannelContext
)
);
}
}