# اتصال پرونده‌ی بیمار به پروفایل بیمار

## پروژه

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