Merge branch 'main' into #43-vacation-summary-for-employee
# Conflicts: # app/Infrastructure/Http/Controllers/HolidayController.php # app/Infrastructure/Http/Controllers/VacationLimitController.php # app/Infrastructure/Http/Controllers/VacationRequestController.php # composer.lock # resources/js/Pages/Holidays/Index.vue # resources/js/Pages/VacationRequest/Create.vue
This commit is contained in:
		@@ -6,15 +6,24 @@ namespace Toby\Domain;
 | 
			
		||||
 | 
			
		||||
use Illuminate\Contracts\Auth\Factory as Auth;
 | 
			
		||||
use Illuminate\Contracts\Events\Dispatcher;
 | 
			
		||||
use Toby\Domain\Enums\VacationRequestState;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestAcceptedByAdministrative;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestAcceptedByTechnical;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestApproved;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestCancelled;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestCreated;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestRejected;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestStateChanged;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestWaitsForAdminApproval;
 | 
			
		||||
use Toby\Domain\Events\VacationRequestWaitsForTechApproval;
 | 
			
		||||
use Toby\Domain\States\VacationRequest\AcceptedByAdministrative;
 | 
			
		||||
use Toby\Domain\States\VacationRequest\AcceptedByTechnical;
 | 
			
		||||
use Toby\Domain\States\VacationRequest\Approved;
 | 
			
		||||
use Toby\Domain\States\VacationRequest\Cancelled;
 | 
			
		||||
use Toby\Domain\States\VacationRequest\Rejected;
 | 
			
		||||
use Toby\Domain\States\VacationRequest\VacationRequestState;
 | 
			
		||||
use Toby\Domain\States\VacationRequest\WaitingForAdministrative;
 | 
			
		||||
use Toby\Domain\States\VacationRequest\WaitingForTechnical;
 | 
			
		||||
use Toby\Eloquent\Models\User;
 | 
			
		||||
use Toby\Eloquent\Models\VacationRequest;
 | 
			
		||||
 | 
			
		||||
class VacationRequestStateManager
 | 
			
		||||
@@ -24,64 +33,77 @@ class VacationRequestStateManager
 | 
			
		||||
        protected Dispatcher $dispatcher,
 | 
			
		||||
    ) {}
 | 
			
		||||
 | 
			
		||||
    public function markAsCreated(VacationRequest $vacationRequest): void
 | 
			
		||||
    public function markAsCreated(VacationRequest $vacationRequest, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->changeState($vacationRequest, VacationRequestState::Created);
 | 
			
		||||
        $this->fireStateChangedEvent($vacationRequest, null, $vacationRequest->state, $user);
 | 
			
		||||
 | 
			
		||||
        $this->dispatcher->dispatch(new VacationRequestCreated($vacationRequest));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function approve(VacationRequest $vacationRequest): void
 | 
			
		||||
    public function approve(VacationRequest $vacationRequest, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->changeState($vacationRequest, VacationRequestState::Approved);
 | 
			
		||||
        $this->changeState($vacationRequest, Approved::class, $user);
 | 
			
		||||
 | 
			
		||||
        $this->dispatcher->dispatch(new VacationRequestApproved($vacationRequest));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function reject(VacationRequest $vacationRequest): void
 | 
			
		||||
    public function reject(VacationRequest $vacationRequest, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->changeState($vacationRequest, VacationRequestState::Rejected);
 | 
			
		||||
 | 
			
		||||
        $this->changeState($vacationRequest, Rejected::class, $user);
 | 
			
		||||
        $this->dispatcher->dispatch(new VacationRequestRejected($vacationRequest));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function cancel(VacationRequest $vacationRequest): void
 | 
			
		||||
    public function cancel(VacationRequest $vacationRequest, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->changeState($vacationRequest, VacationRequestState::Cancelled);
 | 
			
		||||
        $this->changeState($vacationRequest, Cancelled::class, $user);
 | 
			
		||||
 | 
			
		||||
        $this->dispatcher->dispatch(new VacationRequestCancelled($vacationRequest));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function acceptAsTechnical(VacationRequest $vacationRequest): void
 | 
			
		||||
    public function acceptAsTechnical(VacationRequest $vacationRequest, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->changeState($vacationRequest, VacationRequestState::AcceptedByTechnical);
 | 
			
		||||
        $this->changeState($vacationRequest, AcceptedByTechnical::class, $user);
 | 
			
		||||
 | 
			
		||||
        $this->dispatcher->dispatch(new VacationRequestAcceptedByTechnical($vacationRequest));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function acceptAsAdministrative(VacationRequest $vacationRequest): void
 | 
			
		||||
    public function acceptAsAdministrative(VacationRequest $vacationRequest, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->changeState($vacationRequest, VacationRequestState::AcceptedByAdministrative);
 | 
			
		||||
        $this->changeState($vacationRequest, AcceptedByAdministrative::class, $user);
 | 
			
		||||
 | 
			
		||||
        $this->dispatcher->dispatch(new VacationRequestAcceptedByAdministrative($vacationRequest));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function waitForTechnical(VacationRequest $vacationRequest): void
 | 
			
		||||
    public function waitForTechnical(VacationRequest $vacationRequest, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->changeState($vacationRequest, VacationRequestState::WaitingForTechnical);
 | 
			
		||||
        $this->changeState($vacationRequest, WaitingForTechnical::class, $user);
 | 
			
		||||
 | 
			
		||||
        $this->dispatcher->dispatch(new VacationRequestWaitsForTechApproval($vacationRequest));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function waitForAdministrative(VacationRequest $vacationRequest): void
 | 
			
		||||
    public function waitForAdministrative(VacationRequest $vacationRequest, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->changeState($vacationRequest, VacationRequestState::WaitingForAdministrative);
 | 
			
		||||
        $this->changeState($vacationRequest, WaitingForAdministrative::class, $user);
 | 
			
		||||
 | 
			
		||||
        $this->dispatcher->dispatch(new VacationRequestWaitsForAdminApproval($vacationRequest));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function changeState(VacationRequest $vacationRequest, VacationRequestState $state): void
 | 
			
		||||
    protected function changeState(VacationRequest $vacationRequest, string $state, ?User $user = null): void
 | 
			
		||||
    {
 | 
			
		||||
        $vacationRequest->changeStateTo($state);
 | 
			
		||||
        $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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user