evaluate($rule->condition, ['study' => $dicomHeaders]); if ($matches) { return [ 'organization_id' => $rule->organization_id, 'department_id' => $rule->department_id, 'rule_id' => $rule->id, 'rule_name' => $rule->name, 'radiologists' => self::getRadiologists($rule), ]; } } return self::fallbackRouting(); } private static function fallbackRouting(): array { return [ 'organization_id' => self::$catchAll, 'department_id' => null, 'rule_id' => null, 'radiologists' => null, ]; } private static function initialize(): void { if (is_null(self::$rules)) { self::$rules = Cache::remember('dicom.rules', now()->addMinutes(self::CACHE_TTL), fn () => DicomRoutingRule::active() ->orderByDesc('priority') ->get() ); } if (is_null(self::$activeRads)) { self::$activeRads = Cache::remember('dicom.rads', now()->addMinutes(self::CACHE_TTL), fn () => User::active() ->role(Role::Radiologist) ->pluck('id') ); } if (self::$catchAll < 0) { self::$catchAll = Organization::where('name', 'CATCH-ALL') ->first('id') ->id; } } private static function getRadiologists(DicomRoutingRule $rule): array { if (! is_null($rule->assignment_panel_id)) { $panel = AssignmentPanel::active() ->with('radiologists:id') ->find($rule->assignment_panel_id); if ($panel) { $rads = $panel->radiologists->pluck('id')->toArray(); if (! empty($rads)) { // return only existing id from self::$activeRads return array_intersect($rads, self::$activeRads->toArray()); } } } elseif (! is_null($rule->user_id)) { if (self::$activeRads->contains($rule->user_id)) { return [$rule->user_id]; } } return []; } }