fileStorageService = $fileStorageService; $this->shiftScheduleService = $shiftScheduleService; } public function create(User $requester, array $data, array $historyFiles = [], array $scanFiles = []): Document { return DB::transaction(function () use ($requester, $data, $historyFiles, $scanFiles) { $pet = $this->resolvePet($requester, $data); $document = Document::create([ 'modality' => $data['modality'], 'priority' => DocumentPriorityEnum::fromName($data['priority'])->value, 'note' => $data['note'] ?? null, 'submitted_at' => now(), 'pet_id' => $pet->id, 'requester_id' => $requester->id, ]); $this->attachFiles($document, $historyFiles, MediaCollectionEnum::History); $this->attachFiles($document, $scanFiles, MediaCollectionEnum::Primary); $doctorId = $data['doctor_id'] ?? $this->shiftScheduleService->autoSelectDoctor(now())?->id; if (!empty($doctorId)) { $document->assignments()->create([ 'user_id' => $doctorId, 'role' => 'رادیولوژیست', ]); } return $document; }); } protected function resolvePet(User $requester, array $data): Pet { if (!empty($data['pet_id'])) { return Pet::findOrFail($data['pet_id']); } $pet = $data['pet']; return Pet::create([ 'name' => $pet['name'], 'type' => PetTypeEnum::fromName($pet['type'])->value, 'gender' => isset($pet['gender']) ? PetGenderEnum::fromName($pet['gender'])->value : PetGenderEnum::Unknown->value, 'breed' => $pet['breed'] ?? null, 'weight' => $pet['weight'] ?? null, 'sterilized' => $pet['sterilized'] ?? null, 'birthday' => isset($pet['age']) ? now()->subYears((int) $pet['age'])->startOfDay() : null, 'owner_id' => $requester->id, ]); } protected function attachFiles(Document $document, array $files, MediaCollectionEnum $collection): void { foreach ($files as $file) { $medium = $this->fileStorageService->storeFile($file); $document->media()->attach($medium->id, ['collection' => $collection->value]); } } }