# باگ: افزودن خودکار بیمار به کلینیک هنگام نوبت با آدرس کلینیک

## پروژه

`clinicpro` (backend)

## زمینه

وقتی یک نوبت برای پزشکی که در یک کلینیک عضو است ثبت و تأیید می‌شود، اگر آن نوبت با **آدرس کلینیک** باشد، بیمار باید **به‌صورت خودکار به پرونده‌های آن کلینیک** هم اضافه شود. در حال حاضر فقط به پرونده‌ی پزشک اضافه می‌شود.

## مشکل / هدف

در `PatientService::autoCreateOnAppointmentConfirm`، entity همیشه `doctor` فرض می‌شود:

```php
public function autoCreateOnAppointmentConfirm(Appointment $appointment): void
{
    $doctor     = $appointment->getDoctor();
    $entityType = 'doctor';
    $entityId   = $doctor->getId();
    ...
    $record = $this->recordRepo->findByEntityAndUser($entityType, $entityId, $patient);
    if ($record === null) {
        $record = new PatientRecord($entityType, $entityId, $patient, 'system', $doctor->getId());
        $this->recordRepo->save($record);
    }
    $session = new PatientSession($record, $appointment);
    $this->sessionRepo->save($session);
}
```

کلینیک هیچ‌وقت پرونده نمی‌گیرد.

## فایل‌های مرتبط

| فایل | نقش |
|------|-----|
| `src/Patient/Service/PatientService.php` | `autoCreateOnAppointmentConfirm` |
| `src/Appointment/Entity/Appointment.php` | نوبت؛ **فعلاً آدرس/کلینیک انتخابی را ذخیره نمی‌کند** |
| `src/Appointment/Controller/AppointmentController.php` | فراخوانی auto-create در تأیید (خط ~۴۹۹) |
| `src/Doctor/Entity/DoctorAddress.php` | آدرس پزشک؛ دارای `clinicId` (`TYPE_CLINIC`, `forClinic($clinicId)`, `getClinicId()`) |
| `src/Patient/Entity/PatientRecord.php` | پرونده (polymorphic: `entityType` = `doctor|clinic`) |
| `docs/api/patient.md` + `docs/api/appointment.md` | مستندات |

## وضعیت فعلی — یافته‌ی مهم

**`Appointment` آدرس/کلینیکِ انتخاب‌شده را نگه نمی‌دارد.** فیلدهای موجود: `doctor`, `user`, `slotStart`, `slotEnd`, `status`, و فیلدهای مهمان (`patientName`, `patientMobile`, `patientNationalCode`, `patientGender`). در `toArray()` آدرس صرفاً «اولین آدرس پزشک» است:

```php
$firstAddress = $this->doctor->getAddresses()->first() ?: null;
'address' => $firstAddress?->toArray(),
```

پس برای تشخیص اینکه نوبت با کدام آدرس/کلینیک بوده، **اول باید نوبت آدرس/کلینیک را ذخیره کند**.

## وظایف

### ۱. ذخیره‌ی آدرس/کلینیک روی نوبت

- به `Appointment` فیلد `?int $addressId` یا `?int $clinicId` (یا رابطه به `DoctorAddress`) اضافه کن.
- جریان رزرو نوبت (آنجا که Appointment ساخته می‌شود) باید آدرس انتخاب‌شده‌ی کاربر را ست کند. کد رزرو را پیدا کن (`debug:router | grep appointment`، سپس controller/Service رزرو) و آدرس را propagate کن.
- migration بساز و اجرا کن.

اگر در عمل کاربر در رزرو آدرس انتخاب می‌کند، آن انتخاب را تا Appointment دنبال کن؛ اگر فعلاً انتخاب آدرس وجود ندارد، حداقل آدرس نوع `clinic` پیش‌فرض پزشک را ست کن و در پرامپت یادداشت بگذار.

### ۲. افزودن بیمار به کلینیک در تأیید

`autoCreateOnAppointmentConfirm` را طوری تغییر بده که:

1. همیشه پرونده‌ی `doctor` را بسازد (رفتار فعلی).
2. اگر نوبت آدرس کلینیک دارد (`DoctorAddress::getClinicId() !== null` برای آدرس نوبت)، یک `PatientRecord` با `entityType='clinic'`, `entityId=$clinicId` هم بساز (اگر نبود) و در صورت لزوم `PatientSession` متناظر را اضافه کن.
3. قبل از ساخت، `subscriptionService->hasFeature('clinic', $clinicId, 'patient_records')` را چک کن (مثل چک فعلی doctor).

### ۳. مستندات

اگر شکل پاسخ Appointment تغییر کرد (`address_id`/`clinic_id`)، `docs/api/appointment.md` را به‌روز کن. رفتار auto-add را در `docs/api/patient.md` مستند کن.

## نکات مهم

- `PatientRecord` از قبل polymorphic است؛ ساخت نسخه‌ی `clinic` نیاز به schema جدید ندارد.
- duplicate را با `findByEntityAndUser` چک کن (هم برای doctor هم clinic).
- اگر چند آدرس کلینیک متفاوت در نوبت‌های مختلف باشد، هر کلینیک پرونده‌ی خودش را بگیرد.
- منبع کلینیک از `DoctorAddress.clinicId` است، نه از خود پزشک.
