type(VacationType::all()->filter(fn(VacationType $type) => $configRetriever->isVacation($type))->all()) ->get(); /** @var VacationRequest $vacationRequest */ foreach ($vacationRequests as $vacationRequest) { if (!$this->shouldNotify($vacationRequest, $daysCalculator)) { continue; } if ($vacationRequest->state->equals(WaitingForTechnical::class)) { $this->notifyTechnicalApprovers($vacationRequest); } if ($vacationRequest->state->equals(WaitingForAdministrative::class)) { $this->notifyAdminApprovers($vacationRequest); } } } protected function shouldNotify(VacationRequest $vacationRequest, WorkDaysCalculator $daysCalculator): bool { $days = $daysCalculator ->calculateDays($vacationRequest->updated_at->addDay(), Carbon::today()) ->count(); return $days >= static::REMINDER_INTERVAL && ($days % 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)); } } }