<?php declare(strict_types=1);
namespace CioFixDuplicateDiscounts\Subscriber;
use Shopware\Core\Checkout\Cart\Delivery\Struct\DeliveryCollection;
use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryCollection;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class FixDuplicateShippingCosts implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
OffcanvasCartPageLoadedEvent::class => 'removeDuplicateShippingCosts',
CheckoutCartPageLoadedEvent::class => 'removeDuplicateShippingCosts',
CheckoutConfirmPageLoadedEvent::class => 'removeDuplicateShippingCosts',
CheckoutFinishPageLoadedEvent::class => 'removeDuplicateShippingCosts'
];
}
/**
* @param OffcanvasCartPageLoadedEvent|CheckoutCartPageLoadedEvent|CheckoutConfirmPageLoadedEvent|CheckoutFinishPageLoadedEvent $event
* @return void
*/
public function removeDuplicateShippingCosts($event)
{
$page = $event->getPage();
if ($event instanceof CheckoutFinishPageLoadedEvent) {
$deliveries = $page->getOrder()->getDeliveries();
} else {
$deliveries = $page->getCart()->getDeliveries();
}
$page->assign(['shippingCostsNegated' => $this->checkDuplicateShippingCosts($deliveries)]);
}
/**
* @param DeliveryCollection|OrderDeliveryCollection $deliveryCollection
* @return bool
*/
private function checkDuplicateShippingCosts($deliveryCollection): bool
{
if (count($deliveryCollection) > 1) {
$price = 0;
foreach ($deliveryCollection as $delivery) {
$price += $delivery->getShippingCosts()->getUnitPrice();
}
if ($price == 0) {
return true;
}
}
return false;
}
}