Files
clinicpro/.claude/prompt/fix-invitation-accept.md
T

107 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` از قبل وجود دارد