feat: add command to purge unclaimed imported doctors and their surrogates

This commit is contained in:
hamed
2026-07-20 09:44:09 +03:30
parent 97e5acdf18
commit 46d7253ad9
5 changed files with 337 additions and 6 deletions
+29 -3
View File
@@ -260,14 +260,40 @@ php bin/console app:doctors:repair --list # فهرست گام‌ها
> **افزودن گام جدید:** یک کلاس با `DoctorRepairStep` در `src/Doctor/Service/Repair/` بساز؛
> خودکار کشف و اجرا می‌شود و نیازی به تغییر کامند نیست.
### حذف پزشکانِ ایمپورت‌شدهٔ claim‌نشده
فقط رکوردهای خزنده که هنوز مالکیتشان گرفته نشده (`owner_status='unclaimed'`) و کاربران
جانشینِ یتیمشان را حذف می‌کند. پزشکان دستی (`source='manual'`) و پروفایل‌های تصاحب‌شده
(`claimed`/`pending_transfer`) دست‌نخورده می‌مانند.
```bash
php bin/console app:doctors:purge-unclaimed # dry-run: تعداد هدف + هر جدول وابسته
php bin/console app:doctors:purge-unclaimed --force # حذف
php bin/console app:doctors:purge-unclaimed --source=irimc # فقط این منبع (پیش‌فرض irimc)
php bin/console app:doctors:purge-unclaimed --all-sources # هر منبعِ غیر manual
```
| سوییچ | اثر |
|---|---|
| `--force` | حذف واقعی (بدون آن فقط گزارش) |
| `--source=X` | فقط منبع X (پیش‌فرض `irimc`) |
| `--all-sources` | هر پزشک claim‌نشدهٔ غیرِ `manual` |
| `--i-know-this-is-prod` | لازم برای اجرا روی `APP_ENV=prod` |
> حذف FK-safe است (همان ۱۶ جدول وابستهٔ `app:doctors:purge`). اگر نوبتی به پزشک
> claim‌نشده وصل باشد در dry-run هشدار می‌دهد چون آن نوبت هم حذف می‌شود. کاربر جانشین
> فقط وقتی حذف می‌شود که غیرفعال (`status=0`) و با موبایلِ `imp_` باشد — تا کاربر واقعی
> به‌اشتباه پاک نشود.
### پاک‌سازی کامل برای دیتابیس تست
حذف همهٔ پزشکان + داده‌های وابسته (FK-safe) برای شروع تمیز:
حذف **همهٔ** پزشکان + داده‌های وابسته (FK-safe) برای شروع تمیز:
```bash
php bin/console app:doctors:purge # dry-run: فقط گزارش تعداد هر جدول
php bin/console app:doctors:purge --force # حذف واقعی + کاربران جانشین یتیم
```
> ⚠️ مخرب — `appointments`/`comments`/`rates` را هم پاک می‌کند. روی prod نیازمند
> `--i-know-this-is-prod` است و پیش‌فرض متوقف می‌شود.
> ⚠️ مخرب — `appointments`/`comments`/`rates` را هم پاک می‌کند. **فقط در محیط
> `dev`/`test` اجرا می‌شود**؛ روی هر `APP_ENV` دیگری (از جمله `prod`) بدون هیچ راه
> فراری با خطا متوقف می‌شود.