src/EventSubscriber/LeaveRequestAcceptGuardSubscriber.php line 22

  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\LeaveRequest;
  4. use App\Enum\LeaveRequestStatus;
  5. use App\WorkMonthManagement\WorkMonthChecker;
  6. use Symfony\Component\Workflow\Event\GuardEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. class LeaveRequestAcceptGuardSubscriber implements EventSubscriberInterface
  9. {
  10.     private WorkMonthChecker $workMonthChecker;
  11.     public function __construct(
  12.         WorkMonthChecker $workMonthChecker,
  13.     )
  14.     {
  15.         $this->workMonthChecker $workMonthChecker;
  16.     }
  17.     public function guardAccept(GuardEvent $event): void
  18.     {
  19.         $subject $event->getSubject();
  20.         if (!$subject instanceof LeaveRequest) {
  21.             return;
  22.         }
  23.         /** @var LeaveRequest $subject */
  24.         if (
  25.             $subject->getStatus() === LeaveRequestStatus::REQUESTED->value
  26.             && $this->workMonthChecker->isLockedWorkMonthIntersectingPeriod($subject->getEmployee(), $subject->getStartDate(), $subject->getEndDate())
  27.         ) {
  28.             $event->setBlocked(
  29.                 true,
  30.                 'The period the leave would take place overlaps a month already validated by a Project Admin!'
  31.             );
  32.         }
  33.     }
  34.     public static function getSubscribedEvents(): array
  35.     {
  36.         $workflowName 'leave_request';
  37.         $transitionName 'accept';
  38.         return [
  39.             'workflow.' $workflowName '.guard.' $transitionName => ['guardAccept'],
  40.         ];
  41.     }
  42. }