سطل آشغال سراسری (Soft Delete)

← بازگشت به راهنما

سطل آشغال سراسری (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` |