src/Order/Workflow/OrderSubscriber.php line 47

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Order\Workflow;
  4. use App\Order\Doctrine\Entity\Detail;
  5. use App\Order\Doctrine\Entity\Order;
  6. use Doctrine\Common\Collections\Collection;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\Workflow\Event\Event;
  9. use Symfony\Component\Workflow\Event\GuardEvent;
  10. use Symfony\Component\Workflow\WorkflowInterface;
  11. final class OrderSubscriber implements EventSubscriberInterface
  12. {
  13.     public function __construct(private WorkflowInterface $detailStateMachine)
  14.     {
  15.     }
  16.     /**
  17.      * {@inheritdoc}
  18.      */
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return [
  22.             'workflow.order.completed' => ['onCompleted'],
  23.             'workflow.order.completed.cancel' => ['onCompletedCancel'],
  24.             'workflow.order.guard.process' => ['guardProcess'],
  25.         ];
  26.     }
  27.     public function guardProcess(GuardEvent $event): void
  28.     {
  29.         /** @var Order $order */
  30.         $order $event->getSubject();
  31.         if (
  32.             $order->getDetailsToDeliver()->count() > 0
  33.             || $order->getDetailsToShip()->count() > 0
  34.             || $order->getDetailsToProcess()->count() > 0
  35.         ) {
  36.             $event->setBlocked(true);
  37.         }
  38.     }
  39.     public function onCompletedCancel(Event $event): void
  40.     {
  41.         /** @var Order $order */
  42.         $order $event->getSubject();
  43.         /** @var Collection<int, Detail> $detailsToCancel */
  44.         $detailsToCancel $order->getDetails()
  45.             ->filter(fn (Detail $detail) => $this->detailStateMachine->can($detail'cancel'));
  46.         foreach ($detailsToCancel as $detail) {
  47.             $this->detailStateMachine->apply($detail'cancel');
  48.         }
  49.         $order->addStateHistory($order->getState());
  50.     }
  51.     public function onCompleted(Event $event): void
  52.     {
  53.         /** @var Order $order */
  54.         $order $event->getSubject();
  55.         $order->addStateHistory($order->getState());
  56.     }
  57. }