Files
radicall/database/seeders/FastRequestSeeder.php
T

129 lines
8.4 KiB
PHP

<?php
namespace Database\Seeders;
use App\Enums\DocumentModalityEnum;
use App\Enums\DocumentPriorityEnum;
use App\Enums\DocumentStatusEnum;
use App\Enums\PetGenderEnum;
use App\Enums\PetTypeEnum;
use App\Enums\UserEnum;
use App\Models\Document;
use App\Models\Pet;
use App\Models\User;
use Illuminate\Database\Seeder;
class FastRequestSeeder extends Seeder
{
public function run(): void
{
$doctors = $this->seedDoctors();
$this->seedPets();
$this->seedDocuments($doctors);
}
protected function seedDoctors()
{
$doctors = [
['email' => 'dr.hosseini@radical.dev', 'fullname' => 'دکتر حسین حسینی', 'specialty' => 'متخصص جراحی پوست و مو'],
['email' => 'dr.amin@radical.dev', 'fullname' => 'دکتر امین حسینی', 'specialty' => 'متخصص و رادیولوژیست'],
['email' => 'dr.mahdipour@radical.dev', 'fullname' => 'دکتر مریم مهدی‌پور', 'specialty' => 'متخصص تصویربرداری'],
['email' => 'dr.golian@radical.dev', 'fullname' => 'دکتر رضا گلیان', 'specialty' => 'متخصص داخلی دام کوچک'],
['email' => 'dr.karimi@radical.dev', 'fullname' => 'دکتر سارا کریمی', 'specialty' => 'متخصص سونوگرافی و اکو'],
['email' => 'dr.nazari@radical.dev', 'fullname' => 'دکتر بهرام نظری', 'specialty' => 'متخصص ارتوپدی دام کوچک'],
];
return collect($doctors)->map(function ($doctor) {
return User::firstOrCreate(
['email' => $doctor['email']],
array_merge(User::factory()->raw(), [
'email' => $doctor['email'],
'username' => explode('@', $doctor['email'])[0],
'level' => UserEnum::Doctor->value,
'fullname' => $doctor['fullname'],
'specialty' => $doctor['specialty'],
])
);
});
}
protected function seedPets(): void
{
$pets = [
['name' => 'مایلو', 'type' => PetTypeEnum::Dog, 'gender' => PetGenderEnum::Male, 'breed' => 'ژرمن شپرد', 'weight' => 28, 'sterilized' => true],
['name' => 'تدی', 'type' => PetTypeEnum::Cat, 'gender' => PetGenderEnum::Male, 'breed' => 'پرشین', 'weight' => 4, 'sterilized' => false],
['name' => 'پونی', 'type' => PetTypeEnum::Rabbit, 'gender' => PetGenderEnum::Female, 'breed' => 'لوپ هلندی', 'weight' => 2, 'sterilized' => false],
['name' => 'روبیک', 'type' => PetTypeEnum::Hamster, 'gender' => PetGenderEnum::Male, 'breed' => 'سوری', 'weight' => 1, 'sterilized' => false],
['name' => 'کولا', 'type' => PetTypeEnum::GuineaPig, 'gender' => PetGenderEnum::Female, 'breed' => 'آمریکایی', 'weight' => 1, 'sterilized' => true],
['name' => 'هاپو', 'type' => PetTypeEnum::Dog, 'gender' => PetGenderEnum::Male, 'breed' => 'هاسکی سیبری', 'weight' => 24, 'sterilized' => false],
['name' => 'نازی', 'type' => PetTypeEnum::Cat, 'gender' => PetGenderEnum::Female, 'breed' => 'اسکاتیش فولد', 'weight' => 3, 'sterilized' => true],
['name' => 'قناری', 'type' => PetTypeEnum::Bird, 'gender' => PetGenderEnum::Unknown, 'breed' => 'قناری رسمی', 'weight' => 1, 'sterilized' => false],
['name' => 'لاکی', 'type' => PetTypeEnum::Turtle, 'gender' => PetGenderEnum::Female, 'breed' => 'برکه‌ای', 'weight' => 1, 'sterilized' => false],
['name' => 'اسنوپی', 'type' => PetTypeEnum::Dog, 'gender' => PetGenderEnum::Female, 'breed' => 'شیتزو', 'weight' => 6, 'sterilized' => true],
];
$owners = User::whereIn('level', [UserEnum::Admin->value, UserEnum::Supervisor->value, UserEnum::Vet->value])->get();
foreach ($owners as $owner) {
foreach ($pets as $pet) {
Pet::firstOrCreate(
['name' => $pet['name'], 'owner_id' => $owner->id],
[
'type' => $pet['type']->value,
'gender' => $pet['gender']->value,
'breed' => $pet['breed'],
'weight' => $pet['weight'],
'sterilized' => $pet['sterilized'],
'birthday' => now()->subYears(rand(1, 8))->startOfDay(),
]
);
}
}
}
protected function seedDocuments($doctors): void
{
$requests = [
['pet' => 'مایلو', 'modality' => DocumentModalityEnum::Radiology, 'priority' => DocumentPriorityEnum::High, 'status' => DocumentStatusEnum::Registered, 'deadline_minutes' => -120, 'note' => 'لنگش اندام حرکتی عقب پس از پرش، احتمال آسیب مفصل ران. لطفا گرافی لگن بررسی شود.'],
['pet' => 'تدی', 'modality' => DocumentModalityEnum::Sonography, 'priority' => DocumentPriorityEnum::Medium, 'status' => DocumentStatusEnum::Registered, 'deadline_minutes' => 53, 'note' => 'بی‌اشتهایی و استفراغ متناوب از سه روز پیش، درخواست سونوگرافی شکمی.'],
['pet' => 'هاپو', 'modality' => DocumentModalityEnum::CtScan, 'priority' => DocumentPriorityEnum::High, 'status' => DocumentStatusEnum::InProgress, 'deadline_minutes' => 290, 'note' => 'تشنج ناگهانی، درخواست سی‌تی‌اسکن جمجمه جهت رد ضایعه فضاگیر.'],
['pet' => 'نازی', 'modality' => DocumentModalityEnum::Echo, 'priority' => DocumentPriorityEnum::Medium, 'status' => DocumentStatusEnum::Registered, 'deadline_minutes' => 1400, 'note' => 'سوفل قلبی در معاینه شنیده شد، درخواست اکوکاردیوگرافی.'],
['pet' => 'اسنوپی', 'modality' => DocumentModalityEnum::Mri, 'priority' => DocumentPriorityEnum::Medium, 'status' => DocumentStatusEnum::InProgress, 'deadline_minutes' => 1900, 'note' => 'ضعف پیش‌رونده اندام حرکتی، بررسی ستون فقرات از نظر دیسک بین‌مهره‌ای.'],
['pet' => 'پونی', 'modality' => DocumentModalityEnum::Radiology, 'priority' => DocumentPriorityEnum::Medium, 'status' => DocumentStatusEnum::Registered, 'deadline_minutes' => null, 'note' => 'کاهش وزن و دندان قروچه، درخواست گرافی دندان و فک.'],
['pet' => 'روبیک', 'modality' => DocumentModalityEnum::Sonography, 'priority' => DocumentPriorityEnum::High, 'status' => DocumentStatusEnum::InProgress, 'deadline_minutes' => 45, 'note' => 'تورم ناحیه شکم و بی‌حالی شدید، درخواست سونوگرافی اورژانسی.'],
['pet' => 'کولا', 'modality' => DocumentModalityEnum::CtScan, 'priority' => DocumentPriorityEnum::Medium, 'status' => DocumentStatusEnum::Registered, 'deadline_minutes' => 600, 'note' => 'کج شدن سر و عدم تعادل، بررسی گوش میانی و داخلی.'],
];
$owners = User::whereIn('level', [UserEnum::Admin->value, UserEnum::Supervisor->value, UserEnum::Vet->value])->get();
foreach ($owners as $owner) {
if (Document::where('requester_id', $owner->id)->exists()) {
continue;
}
foreach ($requests as $index => $request) {
$pet = Pet::where('name', $request['pet'])->where('owner_id', $owner->id)->first();
if (!$pet) {
continue;
}
$document = Document::create([
'modality' => $request['modality']->value,
'priority' => $request['priority']->value,
'status' => $request['status']->value,
'note' => $request['note'],
'submitted_at' => now()->subDays(count($requests) - $index),
'processing_deadline' => $request['deadline_minutes'] !== null ? now()->addMinutes($request['deadline_minutes']) : null,
'pet_id' => $pet->id,
'requester_id' => $owner->id,
]);
$document->assignments()->create([
'user_id' => $doctors[$index % $doctors->count()]->id,
'role' => 'رادیولوژیست',
]);
}
}
}
}