type(VacationType::all()->filter(fn(VacationType $type) => $configRetriever->isVacation($type))->all()) ->get(); /** @var VacationRequest $vacationRequest */ foreach ($vacationRequests as $vacationRequest) { if (!$this->shouldNotify($vacationRequest)) { continue; } if ($vacationRequest->state->equals(WaitingForTechnical::class)) { $this->notifyTechnicalApprovers($vacationRequest); } if ($vacationRequest->state->equals(WaitingForAdministrative::class)) { $this->notifyAdminApprovers($vacationRequest); } } } protected function shouldNotify(VacationRequest $vacationRequest): bool { $today = Carbon::today(); $diff = $vacationRequest->updated_at->diffInDays($today); return $diff >= static::REMINDER_INTERVAL && ($diff % static::REMINDER_INTERVAL === 0); } protected function notifyAdminApprovers(VacationRequest $vacationRequest): void { $users = User::query() ->whereIn("role", [Role::AdministrativeApprover, Role::Administrator]) ->get(); foreach ($users as $user) { $user->notify(new VacationRequestWaitsForApprovalNotification($vacationRequest, $user)); } } protected function notifyTechnicalApprovers(VacationRequest $vacationRequest): void { $users = User::query() ->whereIn("role", [Role::TechnicalApprover, Role::Administrator]) ->get(); foreach ($users as $user) { $user->notify(new VacationRequestWaitsForApprovalNotification($vacationRequest, $user)); } } }