fireStateChangedEvent($vacationRequest, null, $vacationRequest->state, $user); $this->dispatcher->dispatch(new VacationRequestCreated($vacationRequest)); } public function approve(VacationRequest $vacationRequest, ?User $user = null): void { $this->changeState($vacationRequest, Approved::class, $user); $this->dispatcher->dispatch(new VacationRequestApproved($vacationRequest)); } public function reject(VacationRequest $vacationRequest, ?User $user = null): void { $this->changeState($vacationRequest, Rejected::class, $user); } public function cancel(VacationRequest $vacationRequest, ?User $user = null): void { $this->changeState($vacationRequest, Cancelled::class, $user); $this->dispatcher->dispatch(new VacationRequestCancelled($vacationRequest)); } public function acceptAsTechnical(VacationRequest $vacationRequest, ?User $user = null): void { $this->changeState($vacationRequest, AcceptedByTechnical::class, $user); $this->dispatcher->dispatch(new VacationRequestAcceptedByTechnical($vacationRequest)); } public function acceptAsAdministrative(VacationRequest $vacationRequest, ?User $user = null): void { $this->changeState($vacationRequest, AcceptedByAdministrative::class, $user); $this->dispatcher->dispatch(new VacationRequestAcceptedByAdministrative($vacationRequest)); } public function waitForTechnical(VacationRequest $vacationRequest, ?User $user = null): void { $this->changeState($vacationRequest, WaitingForTechnical::class, $user); } public function waitForAdministrative(VacationRequest $vacationRequest, ?User $user = null): void { $this->changeState($vacationRequest, WaitingForAdministrative::class, $user); } protected function changeState(VacationRequest $vacationRequest, string $state, ?User $user = null): void { $previousState = $vacationRequest->state; $vacationRequest->state->transitionTo($state); $vacationRequest->save(); $this->fireStateChangedEvent($vacationRequest, $previousState, $vacationRequest->state, $user); } protected function fireStateChangedEvent( VacationRequest $vacationRequest, ?VacationRequestState $from, VacationRequestState $to, ?User $user = null, ): void { $event = new VacationRequestStateChanged($vacationRequest, $from, $to, $user); $this->dispatcher->dispatch($event); } }