getPatients($user, $status, $dateRange, $branchId, $includeCurrent, $fillableAuto, $forSnapshots) ->map(fn ($patient) => $patient instanceof MedicalHistory ? UnifiedPatientData::fromMedicalHistory( $patient, (bool) ($patient->is_recipient_today ?? false), ) : UnifiedPatientData::fromMisMedicalHistory( $patient, (bool) ($patient->is_recipient_today ?? false), )) ->sortByDesc(fn (UnifiedPatientData $patient) => $patient->admittedAt ?? '') ->values(); } /** * Загрузить сырые MIS-модели пациентов для запрошенного статуса отчёта. */ public function getPatients( User $user, string $status, DateRange $dateRange, int $branchId, ?bool $includeCurrent = null, bool $fillableAuto = false, bool $forSnapshots = false ): Collection { $isHeadOrAdmin = $user->isHeadOfDepartment() || $user->isAdmin(); $includeCurrent = $includeCurrent ?? in_array($status, ['plan', 'emergency'], true); return match ($status) { 'plan', 'emergency' => $this->patientService->getPlanOrEmergencyPatients( $status, $isHeadOrAdmin, $branchId, $dateRange, false, false, $includeCurrent, $fillableAuto ), 'current' => $this->patientService->getAllPatientsInDepartment( $isHeadOrAdmin, $branchId, $dateRange, false, false, $fillableAuto ), 'recipient' => $this->patientService->getPlanOrEmergencyPatients( null, $isHeadOrAdmin, $branchId, $dateRange, false, false, false, $fillableAuto ), 'outcome' => $this->patientService->getOutcomePatients($branchId, $dateRange, 'without-transferred'), 'outcome-discharged' => $this->patientService->getOutcomePatients($branchId, $dateRange, 'discharged'), 'outcome-transferred' => $this->patientService->getOutcomePatients($branchId, $dateRange, 'transferred'), 'outcome-deceased' => $this->patientService->getOutcomePatients($branchId, $dateRange, 'deceased'), 'reanimation' => $this->patientService->getReanimationPatients($branchId, $dateRange), default => collect(), }; } /** * Посчитать MIS-пациентов без материализации DTO. */ public function getCount( User $user, string $status, DateRange $dateRange, int $branchId, ?bool $includeCurrent = null, bool $fillableAuto = false ): int { $isHeadOrAdmin = $user->isHeadOfDepartment() || $user->isAdmin(); $includeCurrent = $includeCurrent ?? in_array($status, ['plan', 'emergency'], true); return match ($status) { 'plan', 'emergency' => $includeCurrent ? $this->patientService->getPatientsCountWithCurrent($status, $isHeadOrAdmin, $branchId, $dateRange) : $this->patientService->getPlanOrEmergencyPatients( $status, $isHeadOrAdmin, $branchId, $dateRange, true, false, false, $fillableAuto ), 'current' => $this->patientService->getAllPatientsInDepartment( $isHeadOrAdmin, $branchId, $dateRange, true, false, $fillableAuto ), 'recipient' => $this->patientService->getPlanOrEmergencyPatients( null, $isHeadOrAdmin, $branchId, $dateRange, true, false, false, $fillableAuto ), 'outcome' => $this->patientService->getOutcomePatients($branchId, $dateRange, 'without-transferred', true)->count(), 'outcome-discharged' => $this->patientService->getOutcomePatients($branchId, $dateRange, 'discharged', true)->count(), 'outcome-transferred' => $this->patientService->getOutcomePatients($branchId, $dateRange, 'transferred', true)->count(), 'outcome-deceased' => $this->patientService->getOutcomePatients($branchId, $dateRange, 'deceased', true)->count(), 'reanimation' => $this->patientService->getReanimationPatients($branchId, $dateRange, true)->count(), default => 0, }; } }