Files
clinicpro/.claude/prompt/patient-record-profile-binding.md
T
hamedandClaude Opus 4.8 2206f02396 feat: enrich patient record with full profile
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>
2026-06-23 17:21:33 +03:30

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 استفاده کن.