buildMetricsSection($department, $dateRange), $this->sources->get('nurse_patients')->toSection($department, $dateRange, null, [], 'Журнал пациентов'), ]; return new ReportPayload( title: $this->label(), meta: [ 'Отделение' => $department->name_full ?? $department->name_short, 'Период' => $dateRange->start()->format('d.m.Y H:i').' — '.$dateRange->end()->format('d.m.Y H:i'), 'Сформирован' => now('Asia/Yakutsk')->format('d.m.Y H:i'), ], sections: $sections, ); } private function buildMetricsSection(Department $department, DateRange $dateRange): ReportSection { $reportIds = $this->sources->nurseReports($department, $dateRange)->pluck('id'); $counts = [ 'recipient' => 0, 'discharged' => 0, 'transferred' => 0, 'deceased' => 0, 'in_department' => 0, ]; if ($reportIds->isNotEmpty()) { $patients = ReportNursePatient::whereIn('report_nurse_id', $reportIds)->with('migrations')->get(); foreach ($patients as $patient) { match (PatientStatusClassifier::classify($patient, $dateRange)) { PatientStatusClassifier::STATUS_RECIPIENT => $counts['recipient']++, PatientStatusClassifier::STATUS_DISCHARGED => $counts['discharged']++, PatientStatusClassifier::STATUS_TRANSFERRED => $counts['transferred']++, PatientStatusClassifier::STATUS_DECEASED => $counts['deceased']++, PatientStatusClassifier::STATUS_IN_DEPARTMENT => $counts['in_department']++, default => null, }; } } $beds = (int) (DepartmentMetrikaDefault::where('rf_department_id', $department->department_id) ->where('rf_metrika_item_id', MetrikaConfig::BEDS) ->value('value') ?? 0); $occupancy = $beds > 0 ? round($counts['in_department'] * 100 / $beds, 1) : 0; $row = [ 'beds' => $beds, 'recipient' => $counts['recipient'], 'discharged' => $counts['discharged'], 'transferred' => $counts['transferred'], 'deceased' => $counts['deceased'], 'in_department' => $counts['in_department'], 'occupancy_percent' => $occupancy, ]; return new ReportSection('Показатели', [ 'beds' => 'Коек', 'recipient' => 'Поступило', 'discharged' => 'Выписано', 'transferred' => 'Переведено', 'deceased' => 'Умерло', 'in_department' => 'В отделении', 'occupancy_percent' => 'Занятость, %', ], [$row]); } }