60 lines
1.6 KiB
PHP
60 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Toby\Eloquent\Observers;
|
|
|
|
use Illuminate\Contracts\Auth\Factory as Auth;
|
|
use Illuminate\Events\Dispatcher;
|
|
use Toby\Domain\Enums\VacationRequestState;
|
|
use Toby\Domain\Events\VacationRequestStateChanged;
|
|
use Toby\Eloquent\Models\User;
|
|
use Toby\Eloquent\Models\VacationRequest;
|
|
|
|
class VacationRequestObserver
|
|
{
|
|
public function __construct(
|
|
protected Auth $auth,
|
|
protected Dispatcher $dispatcher,
|
|
) {
|
|
}
|
|
|
|
public function creating(VacationRequest $vacationRequest): void
|
|
{
|
|
$year = $vacationRequest->from->year;
|
|
|
|
$vacationRequestNumber = $vacationRequest->user->vacationRequests()
|
|
->whereYear("from", $year)
|
|
->count() + 1;
|
|
|
|
$vacationRequest->name = "{$vacationRequestNumber}/${year}";
|
|
}
|
|
|
|
public function saved(VacationRequest $vacationRequest): void
|
|
{
|
|
if ($vacationRequest->isDirty("state")) {
|
|
$previousState = $vacationRequest->getOriginal("state");
|
|
|
|
$this->fireStateChangedEvent($vacationRequest, $previousState, $vacationRequest->state);
|
|
}
|
|
}
|
|
|
|
protected function fireStateChangedEvent(
|
|
VacationRequest $vacationRequest,
|
|
?VacationRequestState $from,
|
|
VacationRequestState $to,
|
|
): void {
|
|
$event = new VacationRequestStateChanged($vacationRequest, $from, $to, $this->getAuthUser());
|
|
|
|
$this->dispatcher->dispatch($event);
|
|
}
|
|
|
|
protected function getAuthUser(): ?User
|
|
{
|
|
/** @var User $user */
|
|
$user = $this->auth->guard()->user();
|
|
|
|
return $user;
|
|
}
|
|
}
|