GET /api/v1/patient/{uuid} now returns a `profile` object from UserProfile
(demographics, contact, insurance names resolved). Admin record detail shows
a "patient info" section. Empty fields render as "ثبت نشده".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
94 lines
4.9 KiB
Markdown
94 lines
4.9 KiB
Markdown
# اتصال پروندهی بیمار به پروفایل بیمار
|
|
|
|
## پروژه
|
|
|
|
`clinicpro` (backend + admin frontend)
|
|
|
|
## زمینه
|
|
|
|
پروندهی بیمار (`PatientRecord`) فعلاً فقط به `User` وصل است و در پنل صرفاً نام و موبایل (و اخیراً کد ملی) نمایش داده میشود. اطلاعات کامل دموگرافیک بیمار که در `UserProfile` ذخیره شده، برای کلینیک/مطب قابل مشاهده نیست.
|
|
|
|
## مشکل / هدف
|
|
|
|
وقتی کاربری به یک مطب یا کلینیک اضافه میشود، **اطلاعات پروفایل او باید برای آن کلینیک مشخص باشد**: نام و نام خانوادگی، کد ملی، جنسیت، تاریخ تولد، بیمهی پایه/مکمل، تماس و … . یعنی پروندهی بیمار باید بر اساس `UserProfile` غنی شود.
|
|
|
|
## فایلهای مرتبط
|
|
|
|
| فایل | نقش |
|
|
|------|-----|
|
|
| `src/UserProfile/Entity/UserProfile.php` | پروفایل کامل بیمار |
|
|
| `src/Patient/Entity/PatientRecord.php` | پرونده؛ `toArray()` فعلاً فقط `user_name/user_mobile/user_national_code` |
|
|
| `src/Patient/Controller/PatientController.php` | `list` + `show` |
|
|
| `src/Patient/Repository/PatientRecordRepository.php` | کوئریها |
|
|
| `assets/admin/pages/MyPatientsPage.tsx` | لیست کارتی + صفحهی جزئیات پرونده (بنر بالای پرونده) |
|
|
| `assets/admin/types/index.ts` | `PatientRecord` type |
|
|
| `docs/api/patient.md` | مستندات |
|
|
|
|
## وضعیت فعلی
|
|
|
|
`UserProfile` فیلدهای موجود (نمونه):
|
|
|
|
```php
|
|
private ?string $family;
|
|
private ?string $fathersName;
|
|
private ?string $nationalCode;
|
|
private ?string $gender;
|
|
private ?int $dateOfBirth; // unix
|
|
private ?string $bloodType;
|
|
private ?string $maritalStatus;
|
|
private ?string $job;
|
|
private ?string $address;
|
|
private ?string $homePhone;
|
|
private ?int $basicInsuranceId;
|
|
private ?int $supplementaryInsuranceId;
|
|
```
|
|
|
|
`PatientRecord::toArray()`:
|
|
|
|
```php
|
|
return [
|
|
'uuid' => $this->uuid,
|
|
'entity_type' => $this->entityType,
|
|
'entity_id' => $this->entityId,
|
|
'user_uuid' => $this->user->getUuid(),
|
|
'user_name' => $this->user->getRealName(),
|
|
'user_mobile' => $this->user->getMobileNumber(),
|
|
'user_national_code' => $this->user->getNationalCode(),
|
|
'created_by_type' => $this->createdByType,
|
|
'created_at' => $this->createdAt,
|
|
];
|
|
```
|
|
|
|
پروفایل بیمار اصلاً در پاسخ نیست.
|
|
|
|
## وظایف
|
|
|
|
### ۱. تحلیل رابطه User ↔ UserProfile
|
|
|
|
`UserProfile` را کامل بخوان: رابطه به `User`، repository، و اینکه آیا یکبهیک است. روش گرفتن پروفایل از روی `User` را پیدا کن.
|
|
|
|
### ۲. غنیسازی پاسخ پرونده
|
|
|
|
- در `show` (و در صورت نیاز `list`) اطلاعات پروفایل بیمار را به پاسخ اضافه کن. توصیه: یک کلید `profile` در پاسخِ `show` (جزئیات کامل)، و در `list` فقط فیلدهای سبک (نام، جنسیت، کد ملی) برای کارت.
|
|
- نام بیمهها از id به نام resolve شود (LEFT JOIN یا lookup روی `insurances`).
|
|
- اگر پروفایل وجود نداشت، مقادیر null برگردد (نه خطا).
|
|
|
|
> برای `list` از kept-light استفاده کن تا کوئری سنگین نشود؛ برای `show` میتوان پروفایل کامل را join کرد.
|
|
|
|
### ۳. Admin Frontend — نمایش پروفایل در پرونده
|
|
|
|
- در صفحهی جزئیات پرونده (بنر بالای تاریخچهی مراجعات)، یک بخش «اطلاعات بیمار» با فیلدهای پروفایل (نام کامل، کد ملی، جنسیت، تاریخ تولد شمسی با `formatDate`، بیمه پایه/مکمل، تماس) اضافه کن.
|
|
- `PatientRecord` type در `types/index.ts` را با `profile` بهروز کن.
|
|
- اگر فیلدی خالی بود، «ثبت نشده» نشان بده.
|
|
|
|
### ۴. مستندات
|
|
|
|
`docs/api/patient.md` را با ساختار جدید پاسخ (`profile`) برای `show` و فیلدهای سبک `list` بهروز کن.
|
|
|
|
## نکات مهم
|
|
|
|
- تاریخ تولد unix timestamp است؛ با `formatDate()` شمسی نمایش بده.
|
|
- `entity_type` میتواند `doctor` یا `clinic` باشد؛ نمایش پروفایل برای هر دو یکسان.
|
|
- این پرامپت مکمل `create-patient-without-signup.md` است؛ اگر بیمار جدید بدون ثبتنام ساخته میشود، همان فیلدهای پروفایل باید قابل ذخیره و سپس قابل نمایش باشند — ساختار `UserProfile` را یکدست نگهدار.
|
|
- کوئری list نباید N+1 شود؛ از join استفاده کن.
|