<?php declare(strict_types=1);
namespace Econsor\Shopware\AtBitConfiguratorConnector\Subscriber;
use Econsor\Shopware\AtBitConfiguratorConnector\Services\AtBitPriceCalculator;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Shopware\Core\Checkout\Cart\Event\LineItemQuantityChangedEvent;
use Shopware\Core\Checkout\Cart\Event\LineItemRemovedEvent;
use Shopware\Core\Checkout\Cart\LineItem\LineItem;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\Session;
class AtBitSessionCleaner implements EventSubscriberInterface
{
private $session;
private $priceCalculator;
public function __construct(Session $session, AtBitPriceCalculator $priceCalculator)
{
$this->session = $session;
$this->priceCalculator = $priceCalculator;
}
public static function getSubscribedEvents(): array
{
return [
LineItemRemovedEvent::class => 'onLineItemRemoved',
LineItemQuantityChangedEvent::class => 'onQuantityChanged',
CheckoutOrderPlacedEvent::class => 'onOrderPlaced',
];
}
public function onLineItemRemoved(LineItemRemovedEvent $event): void
{
$id = $event->getLineItem()->getId();
$config = $this->session->has('atBitConfiguratorProducts')
? $this->session->get('atBitConfiguratorProducts')
: null;
if ($config && array_key_exists($id, $config)) {
unset($config[$id]);
$this->session->set('atBitConfiguratorProducts', $config);
}
}
public function onQuantityChanged(LineItemQuantityChangedEvent $event): void
{
if (!$configuratorProduct = $this->getLineItemFromSession($event->getLineItem()->getId())) {
return;
}
$quantity = $event->getLineItem()->getQuantity();
/** @var ArrayStruct $extension */
$extension = $configuratorProduct->getExtension('atbitConfiguration');
$configuratorProduct->setQuantity($quantity);
$configuratorProduct->setPrice($this->priceCalculator->calculate(
(float) $extension->get('GesamtpreisOhneMwSt'),
(float) $extension->get('MwSt'),
$quantity
));
$this->setLineItemFromSession($configuratorProduct, $event->getLineItem()->getId());
}
public function onOrderPlaced(CheckoutOrderPlacedEvent $event): void
{
$this->session->remove('atBitConfiguratorProducts');
}
private function getLineItemFromSession(string $id): ?LineItem
{
$lineItems = $this->session->get('atBitConfiguratorProducts');
if ($lineItems && array_key_exists($id, $lineItems)) {
return $lineItems[$id];
}
return null;
}
private function setLineItemFromSession(LineItem $lineItem, string $id): void
{
if ($lineItems = $this->session->get('atBitConfiguratorProducts')) {
$lineItems[$id] = $lineItem;
$this->session->set('atBitConfiguratorProducts', $lineItems);
}
}
}