<?php
declare(strict_types=1);
namespace App\EventListener;
use App\Provider\ShippingDateProvider;
use Doctrine\ORM\EntityManagerInterface;
use SM\Factory\FactoryInterface as StateMachineFactoryInterface;
use Sylius\Component\Channel\Context\ChannelContextInterface;
use Sylius\Component\Core\Model\PaymentInterface;
use Sylius\Component\Order\Model\OrderInterface;
use Sylius\Component\Order\Processor\OrderProcessorInterface;
use Sylius\Component\Payment\PaymentTransitions;
use Symfony\Component\EventDispatcher\GenericEvent;
use Webmozart\Assert\Assert;
final class OrderListener
{
private ChannelContextInterface $channelContext;
private EntityManagerInterface $manager;
private ShippingDateProvider $deliveryDateProvider;
private StateMachineFactoryInterface $stateMachineFactory;
public function __construct(ChannelContextInterface $channelContext, EntityManagerInterface $manager, ShippingDateProvider $deliveryDateProvider, OrderProcessorInterface $orderPromotionProcessor, OrderProcessorInterface $orderTaxesProcessor, StateMachineFactoryInterface $stateMachineFactory)
{
$this->channelContext = $channelContext;
$this->manager = $manager;
$this->deliveryDateProvider = $deliveryDateProvider;
$this->stateMachineFactory = $stateMachineFactory;
}
public function setShippingDaysEstimated(GenericEvent $event): void
{
$order = $event->getSubject();
Assert::isInstanceOf($order, OrderInterface::class);
$channelCode = $this->channelContext->getChannel()->getCode();
$calculateDate = $this->deliveryDateProvider->getDeliveryDate($order);
$order->setShippingDateEstimated($calculateDate);
$this->manager->persist($order);
$this->manager->flush();
}
public function preUpdate(GenericEvent $event): void
{
/** @var \Sylius\Component\Core\Model\OrderInterface $order */
$order = $event->getSubject();
$lastPayment = $order->getLastPayment();
if ($lastPayment->getState() === PaymentInterface::STATE_NEW) {
$lastPayment->setDetails([]);
}
if ($lastPayment->getState() === PaymentInterface::STATE_PROCESSING) {
$sm = $this->stateMachineFactory->get($lastPayment, PaymentTransitions::GRAPH);
if ($sm->can('back_to_new')) {
$sm->apply('back_to_new');
}
$lastPayment->setDetails([]);
}
}
}