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;
 | |
|     }
 | |
| }
 |