where('rf_DepartmentID', $department->rf_mis_department_id) ->value('StationarBranchID'); } /** * Определить, нужно ли читать submitted-снапшоты вместо live-данных. */ public function shouldUseSnapshots( Department $department, DateRange $dateRange, bool $beforeCreate = false ): bool { if ($beforeCreate) { return false; } $report = $this->getReportForPeriod($department->department_id, $dateRange); return $report?->status === 'submitted'; } /** * Для самых изменчивых статусов врачи должны продолжать видеть live-данные за текущие сутки. */ public function shouldUseReplicaForLiveStatus(User $user, string $status, DateRange $dateRange): bool { if ($user->isHeadOfDepartment() || $user->isAdmin()) { return false; } return in_array($status, ['plan', 'emergency', 'recipient', 'current', 'reanimation'], true) && $dateRange->isOneDay && $dateRange->isEndDateToday(); } /** * Вернуть submitted-отчёты, относящиеся к выбранному отчётному окну. * * @return Collection */ public function getReportsForDateRange(int $departmentId, DateRange $dateRange): Collection { if ($dateRange->isOneDay) { return Report::query() ->where('rf_department_id', $departmentId) ->exactPeriod($dateRange->startSql(), $dateRange->endSql()) ->onlySubmitted() ->orderBy('period_end', 'DESC') ->get(); } return Report::query() ->where('rf_department_id', $departmentId) ->withinPeriod($dateRange->startSql(), $dateRange->endSql()) ->onlySubmitted() ->orderBy('period_end', 'DESC') ->get(); } /** * Recipient-снапшоты читаются из последнего отчёта в выбранном окне. * * @param array $reportIds * @return array */ public function getRecipientReportIds(array $reportIds): array { if (empty($reportIds)) { return []; } return [reset($reportIds)]; } /** * Найти отчёт, который определяет видимость снапшотов для запрошенного периода. */ private function getReportForPeriod(int $departmentId, DateRange $dateRange): ?Report { $query = Report::query() ->where('rf_department_id', $departmentId) ->exactPeriod($dateRange->startSql(), $dateRange->endSql()) ->orderByDesc('report_id'); if ($dateRange->isOneDay) { return $query->first(); } return $query->onlySubmitted()->first(); } }