<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Core\Shop\Listener;
use BitBag\OpenMarketplace\Component\Order\Entity\OrderInterface;
use BitBag\OpenMarketplace\Component\Order\Entity\OrderItemInterface;
use BitBag\OpenMarketplace\Component\RFQ\Entity\OfferInterface;
use BitBag\OpenMarketplace\Component\RFQ\StateMachine\OfferTransitions;
use Doctrine\ORM\EntityManagerInterface;
use SM\Factory\FactoryInterface;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
final class CartListener
{
public function __construct(
private FactoryInterface $factory,
private EntityManagerInterface $entityManager,
) {
}
public function onOrderPreDelete(ResourceControllerEvent $event): void
{
$subject = $event->getSubject();
if (!$subject instanceof OrderInterface) {
return;
}
if (OrderInterface::STATE_CART !== $subject->getState()) {
return;
}
$items = $subject->getItems();
/** @var OrderItemInterface $item */
foreach ($items as $item) {
$offer = $item->getOffer();
if (!$offer instanceof OfferInterface) {
continue;
}
$sm = $this->factory->get($offer, OfferTransitions::GRAPH);
if ($sm->can(OfferTransitions::TRANSITION_CLEAR_CART)) {
$sm->apply(OfferTransitions::TRANSITION_CLEAR_CART);
$this->entityManager->persist($offer);
}
}
}
public function onItemPostRemove(ResourceControllerEvent $event): void
{
$subject = $event->getSubject();
if (!$subject instanceof OrderItemInterface) {
return;
}
$offer = $subject->getOffer();
if (!$offer instanceof OfferInterface) {
return;
}
$sm = $this->factory->get($offer, OfferTransitions::GRAPH);
if ($sm->can(OfferTransitions::TRANSITION_CLEAR_CART)) {
$sm->apply(OfferTransitions::TRANSITION_CLEAR_CART);
$this->entityManager->persist($offer);
}
$this->entityManager->flush();
}
}