99 lines
3.5 KiB
PHP
99 lines
3.5 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\Invoice\InvoiceService;
|
|
use App\Services\Shift\ShiftScheduleService;
|
|
use App\Services\Sms\SmsNotificationService;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class FastRequestService
|
|
{
|
|
protected FileStorageService $fileStorageService;
|
|
|
|
protected ShiftScheduleService $shiftScheduleService;
|
|
|
|
protected InvoiceService $invoiceService;
|
|
|
|
protected SmsNotificationService $smsNotificationService;
|
|
|
|
public function __construct(FileStorageService $fileStorageService, ShiftScheduleService $shiftScheduleService, InvoiceService $invoiceService, SmsNotificationService $smsNotificationService)
|
|
{
|
|
$this->fileStorageService = $fileStorageService;
|
|
$this->shiftScheduleService = $shiftScheduleService;
|
|
$this->invoiceService = $invoiceService;
|
|
$this->smsNotificationService = $smsNotificationService;
|
|
}
|
|
|
|
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->invoiceService->createForDocument($document);
|
|
|
|
$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' => 'رادیولوژیست',
|
|
]);
|
|
}
|
|
|
|
$this->smsNotificationService->requestRegistered($document);
|
|
|
|
return $document;
|
|
});
|
|
}
|
|
|
|
protected function resolvePet(User $requester, array $data): Pet
|
|
{
|
|
if (!empty($data['pet_id'])) {
|
|
return $requester->pets()->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]);
|
|
}
|
|
}
|
|
}
|