
* wip * wip * wip * wip * wip * wip * wip * #5 - bump dependencies * #43 - wip * #43 - add composer script * #43 - fix * #43 - fix * #43 - wip * #43 - ecs fix * #43 - cr fix * #43 - cr fix * #43 - fix Co-authored-by: EwelinaLasowy <ewelina.lasowy@blumilk.pl>
110 lines
4.2 KiB
PHP
110 lines
4.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Toby\Domain;
|
|
|
|
use Illuminate\Contracts\Auth\Factory as Auth;
|
|
use Illuminate\Contracts\Events\Dispatcher;
|
|
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
|
|
{
|
|
public function __construct(
|
|
protected Auth $auth,
|
|
protected Dispatcher $dispatcher,
|
|
) {}
|
|
|
|
public function markAsCreated(VacationRequest $vacationRequest, ?User $user = null): void
|
|
{
|
|
$this->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);
|
|
$this->dispatcher->dispatch(new VacationRequestRejected($vacationRequest));
|
|
}
|
|
|
|
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);
|
|
|
|
$this->dispatcher->dispatch(new VacationRequestWaitsForTechApproval($vacationRequest));
|
|
}
|
|
|
|
public function waitForAdministrative(VacationRequest $vacationRequest, ?User $user = null): void
|
|
{
|
|
$this->changeState($vacationRequest, WaitingForAdministrative::class, $user);
|
|
|
|
$this->dispatcher->dispatch(new VacationRequestWaitsForAdminApproval($vacationRequest));
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|