# Fix: پذیرفتن دعوتنامه کلینیک، پزشک را به clinic_doctors اضافه نمی‌کند

## مشکل

وقتی پزشک دعوتنامه کلینیک را می‌پذیرد (از طریق پنل پزشک یا لینک SMS)، فقط وضعیت دعوتنامه به `accepted` تغییر می‌کند — اما پزشک به جدول `clinic_doctors` اضافه **نمی‌شود**.

## ریشه باگ

`src/ClinicInvitation/Service/ClinicInvitationService.php` — متد `accept()`:

```php
public function accept(ClinicDoctorInvitation $inv): void
{
    if (!$inv->isUsable()) {
        throw new AppException('ERR_NOT_FOUND_001', 'دعوتنامه منقضی یا غیرمعتبر است', 410);
    }
    $inv->setStatus(ClinicDoctorInvitation::STATUS_ACCEPTED);
    $inv->markUsed();
    $this->em->flush();   // ← فقط status عوض می‌شود، هیچ رابطه‌ای ثبت نمی‌شود
}
```

باید بعد از `accept`، پزشک به `$clinic->getDoctors()` اضافه شود. رابطه در `Clinic::$doctors` (ManyToMany → جدول `clinic_doctors`) تعریف شده است.

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

| فایل | نقش |
|------|-----|
| `src/ClinicInvitation/Service/ClinicInvitationService.php` | متد `accept()` — جای اصلی باگ |
| `src/ClinicInvitation/Entity/ClinicDoctorInvitation.php` | entity دعوتنامه — دارای `getClinic()` و `getDoctor()` |
| `src/Clinic/Entity/Clinic.php` | دارای `getDoctors(): Collection` و رابطه ManyToMany |

## وضعیت فعلی

- `ClinicDoctorInvitation::$doctor` وقتی پزشک در سیستم وجود دارد، set می‌شود (در `invite()`)
- `ClinicDoctorInvitation::$doctor` ممکن است `null` باشد (پزشک هنوز ثبت‌نام نکرده)
- پذیرش از دو مسیر اتفاق می‌افتد:
  1. **لینک SMS** → `POST /api/v1/clinic-invitation/{token}/accept` (بدون احراز هویت)
  2. **پنل پزشک** → `POST /api/v1/doctor/invitation/{invUuid}/respond` با `action=accept`

## وظایف

### ۱. رفع باگ در `ClinicInvitationService::accept()`

```php
public function accept(ClinicDoctorInvitation $inv): void
{
    if (!$inv->isUsable()) {
        throw new AppException('ERR_NOT_FOUND_001', 'دعوتنامه منقضی یا غیرمعتبر است', 410);
    }

    $inv->setStatus(ClinicDoctorInvitation::STATUS_ACCEPTED);
    $inv->markUsed();

    // اضافه کردن پزشک به کلینیک
    $doctor = $inv->getDoctor();
    if ($doctor !== null) {
        $clinic = $inv->getClinic();
        if (!$clinic->getDoctors()->contains($doctor)) {
            $clinic->getDoctors()->add($doctor);
        }
    }

    $this->em->flush();
}
```

### ۲. بررسی حالت لبه‌ای: پزشک null است

اگر `$inv->getDoctor()` در زمان accept هنوز null باشد (پزشک بعداً ثبت‌نام کرده)، باید با موبایل در DoctorRepository جستجو کرد و doctor را set و اضافه کرد:

```php
if ($doctor === null) {
    $doctor = $this->doctorRepo->findOneByMobile($inv->getMobile());
    if ($doctor !== null) {
        $inv->setDoctor($doctor);
    }
}
```

### ۳. تست

بعد از رفع:

```bash
ddev exec php -l src/ClinicInvitation/Service/ClinicInvitationService.php
ddev exec php bin/console cache:clear
ddev exec yarn dev
```

تست دستی:
- یک دعوتنامه ارسال کن
- پزشک از پنل داشبورد دعوت را بپذیرد
- در صفحه کلینیک بررسی کن که پزشک در لیست پزشکان کلینیک ظاهر شده

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

فایل `docs/api/clinic-invitation.md` را به‌روزرسانی کن:
- اضافه کن: هنگام accept، پزشک به clinic_doctors اضافه می‌شود
- edge case: اگر doctor هنگام دعوت ثبت‌نام نکرده بود، هنگام accept با موبایل match می‌شود

## نکات مهم

- **هر دو مسیر** (لینک SMS و پنل پزشک) از همان `$invitationService->accept()` استفاده می‌کنند — رفع باگ در یک جا کافی است
- `$clinic->getDoctors()->contains($doctor)` را چک کن تا duplicate نشود
- بعد از flush نیازی به migration نیست — جدول `clinic_doctors` از قبل وجود دارد
