سطل آشغال سراسری (Soft Delete)
> version: 1.8 | last_updated: 2026-09-26 | audience: admin
هدف
هر «حذف موقت» رکورد را پاک دائم نمیکند؛ به **سطل آشغال** میرود تا بازیابی یا حذف دائم شود. موارد soft-deleted در لیستهای عادی / پورتال دیده نمیشوند.
کجا ببینیم؟
سطل در **سایدبار نیست**. از دکمهٔ **سطل آشغال** بالای لیست همان بخش وارد شوید:
| بخش | صفحهٔ نمونه |
|-----|-------------|
| کاتالوگ | دستهبندیها / محصولات و پلنها / سرورها |
| CRM | مشتریان / نمایندگان |
| سفارش | سفارشها |
| Support | تیکتها |
| مالی | صورتحسابها / کد تخفیف |
| انبار | دستههای فروش LTE (و …) |
| تنظیمات | قالب اعلان |
لینک مستقیم کاتالوگ: `/panel/trash-catalog` — همه: `/panel/trash-bin`
| اکشن | توضیح |
|------|--------|
| بازیابی | برگشت به لیستها |
| حذف دائم | غیرقابل بازگشت؛ ادمین tenant |
فرزندان cascade مشتری در سطل جدا فهرست نمیشوند؛ با بازیابی والد برمیگردند.
رفتار دکمهٔ حذف
برچسب: **حذف موقت**. مودال توضیح میدهد که به سطل میرود.
اگر مدل متصل/در حال استفاده باشد، دکمهٔ حذف مخفی میشود (یا در bulk با اعلان خطر متوقف میشود). منطق: `canMoveToTrash()` / `trashBlockReason()` روی مدل؛ اعمال خودکار از `TrashDeleteActions` → `TrashDeleteGuards`.
محدودیتهای حذف (نمونه)
| موجودیت | شرط مجاز بودن حذف موقت |
|---------|-------------------------|
| **دسته محصول** | بدون زیردسته و بدون محصول |
| **محصول/پلن** | بدون assign نماینده و بدون فروش/سفارش |
| **استخر IP** | همهٔ IPها آزاد (`available`) و بدون `subscription_id`؛ بدون تخصیص فعال |
| **دسته فروش LTE** | بدون کیت |
| **کیت LTE / شماره·سیم MVNO** | فقط وضعیت آزاد و بدون اشتراک |
| **باکس MVNO** | بدون آیتم |
| **DSLAM** | همهٔ پورتها آزاد |
| **نوع DSLAM / منطقه** | بدون دستگاه (و بازهٔ شماره برای منطقه) |
| **سرور پروویژن** | بدون اشتراک و بدون عضویت در گروه |
| **گروه سرور** | بدون محصول و بدون عضو |
| **دسته تیکت** | بدون تیکت |
| **مشتری (CRM)** | بدون سرویس **فعال** یا **معلق**؛ مودال هشدار میدهد که سرویس/سفارش/تیکت/صورتحساب هم soft-delete میشوند |
جزئیات کاتالوگ: [create-product.md](create-product.md) — انبار IP: [static-ip-inventory.md](static-ip-inventory.md)
Cascade مشتری
حذف نرم `CustomerAccount` همزمان soft-delete میکند: سفارش، اشتراک، تیکت، صورتحساب. پیششرط: هیچ اشتراک با وضعیت `active` یا `suspended` نباشد (`canMoveToTrash` / `trashBlockReason`).
یکتایی شمارهها
فیلدهای unique هنگام سطل پسوند `__del{id}` میگیرند.
Tenant
حذف نرم Tenant فقط همان رکورد شرکت (بدون cascade کل داده). فقط در پنل admin.
فنی
| قطعه | مسیر |
|------|------|
| Trait | `modules/Core/Traits/Trashable.php` |
| سرویس | `modules/Core/Services/TrashService.php` |
| ایندکس | `trash_entries` |
| رجیستری | `config/trash.php` |
| صفحات | `app/Filament/Pages/TrashBin.php` + `TrashBins/*` (بدون منوی سایدبار) |
| لینک هدر | `app/Filament/Support/TrashBinLinks.php` |
| دکمههای حذف | `app/Filament/Support/TrashDeleteActions.php` (+ Guard داخلی) |
| محدودیت | `app/Filament/Support/TrashDeleteGuards.php` |