107 lines
4.3 KiB
Markdown
107 lines
4.3 KiB
Markdown
# 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` از قبل وجود دارد
|