Files
radicall/app/Services/Document/FastRequestService.php
T

87 lines
3.0 KiB
PHP

<?php
namespace App\Services\Document;
use App\Enums\DocumentPriorityEnum;
use App\Enums\MediaCollectionEnum;
use App\Enums\PetGenderEnum;
use App\Enums\PetTypeEnum;
use App\Models\Document;
use App\Models\Pet;
use App\Models\User;
use App\Services\FileStorageService;
use App\Services\Shift\ShiftScheduleService;
use Illuminate\Support\Facades\DB;
class FastRequestService
{
protected FileStorageService $fileStorageService;
protected ShiftScheduleService $shiftScheduleService;
public function __construct(FileStorageService $fileStorageService, ShiftScheduleService $shiftScheduleService)
{
$this->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]);
}
}
}