belongsTo(MedicalHistory::class, 'medical_history_id', 'id'); } public function operations() { return $this->hasMany(SurgicalOperation::class, 'migration_patient_id', 'id'); } // Пересечение с отчетным периодом public function scopeDateRange($query, string $from, string $to) { return $query->where('ingoing_date', '<=', $to) ->where(function ($q) use ($from) { $q->whereNull('out_date')->orWhere('out_date', '>=', $from); }); } // Фильтр по подразделению (получает ID отделений) public function scopeDepartment($query, int $departmentId) { $branchIds = DB::table('stt_stationarbranch') ->where('rf_DepartmentID', $departmentId) ->pluck('StationarBranchID'); return $query->whereIn('stationar_branch_id', $branchIds); } // Добавляет вычисляемый столбец `category` (только для отображения) public function scopeWithCategory($query, string $from, string $to) { $sql = "CASE WHEN ingoing_date BETWEEN ? AND ? THEN 'admitted' WHEN out_date BETWEEN ? AND ? THEN CASE WHEN death_date IS NOT NULL AND death_date BETWEEN ? AND ? THEN 'deceased' WHEN stat_cure_result_id IN (3,4,7) THEN 'transferred' ELSE 'discharged' END WHEN ingoing_date < ? AND (out_date IS NULL OR out_date > ?) THEN 'current' ELSE 'historical' END as category"; return $query->selectRaw($sql, [$from, $to, $from, $to, $from, $to, $to, $to]); } // Быстрые фильтры по статусам (используют индексы MV, а не computed column) public function scopeAdmitted($query, string $from, string $to) { return $query->where('ingoing_date', '>', $from) ->where('ingoing_date', '<=', $to); } public function scopeDischarged($query, string $from, string $to) { return $query->where('out_date', '>', $from) ->where('out_date', '<=', $to) ->whereNotIn('visit_result_id', [3, 4, 5, 6]) ->whereNull('death_date'); // умершие не считаются "выбывшими домой" } public function scopeTransferred($query, string $from, string $to) { return $query->where('out_date', '>', $from) ->where('out_date', '<=', $to) ->whereIn('visit_result_id', [3, 4]); } public function scopeDeceased($query, string $from, string $to) { return $query->whereNotNull('death_date') ->where('death_date', '>', $from) ->where('death_date', '<=', $to); } public function scopeCurrent($query, DateRange $dateRange) { return $query->where('is_actually_current', true); } public function scopeCurrentMigration($query, $historyId) { return $query->where('medical_history_id', $historyId) ->orderBy('ingoing_date', 'desc') ->limit(1)->first(); } }