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

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

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



> version: 1.9 | last_updated: 2026-09-29 | audience: admin

هدف



هر «حذف موقت» رکورد را پاک دائم نمی‌کند؛ به **سطل آشغال** می‌رود تا بازیابی یا حذف دائم شود. موارد soft-deleted در لیست‌های عادی / پورتال دیده نمی‌شوند.

کجا ببینیم؟



سطل در **سایدبار نیست**. از دکمهٔ **سطل آشغال** بالای لیست همان بخش وارد شوید:

| بخش | صفحهٔ نمونه |
|-----|-------------|
| کاتالوگ | دسته‌بندی‌ها / محصولات و پلن‌ها / سرورها |
| CRM | مشتریان / نمایندگان |
| سفارش | سفارش‌ها |
| Support | تیکت‌ها |
| مالی | صورتحساب‌ها / کد تخفیف |
| انبار | دسته‌های فروش LTE (و …) |
| تنظیمات | قالب اعلان |

لینک مستقیم کاتالوگ: `/panel/trash-catalog` — همه: `/panel/trash-bin`

| اکشن | توضیح |
|------|--------|
| بازیابی | برگشت به لیست‌ها |
| حذف دائم | غیرقابل بازگشت؛ ادمین tenant |

فرزندان cascade مشتری در سطل جدا فهرست نمی‌شوند؛ با بازیابی والد برمی‌گردند.

مشتری و ورود پورتال



  • **حذف موقت:** ایمیل/موبایل کاربر پورتال با پسوند `__del{id}` آزاد می‌شود تا همان مشخصات برای ثبت‌نام مجدد قابل استفاده باشد؛ با **بازیابی** به مقدار اصلی برمی‌گردد.

  • **حذف دائم:** کاربر پورتال حذف می‌شود؛ اگر Party یتیم مانده باشد contact و استعلام‌های هویت هم پاک می‌شوند.

  • چک یکتایی ثبت‌نام فقط حساب‌های **فعال** (خارج از سطل) را در نظر می‌گیرد.


  • رفتار دکمهٔ حذف



    برچسب: **حذف موقت**. مودال توضیح می‌دهد که به سطل می‌رود.

    اگر مدل متصل/در حال استفاده باشد، دکمهٔ حذف مخفی می‌شود (یا در 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` |