128 lines
8.3 KiB
PHP
128 lines
8.3 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(
|
|
['username' => explode('@', $doctor['email'])[0]],
|
|
User::factory()->raw([
|
|
'email' => $doctor['email'],
|
|
'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' => 'رادیولوژیست',
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|