BSS HostKhaneh

انبار MVNO (شماره / سیم / باندل) — راهنمای ادمین شرکت

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

انبار MVNO (شماره / سیم / باندل) — راهنمای ادمین شرکت



| فیلد | مقدار |
|------|--------|
| **نسخه** | 1.1 |
| **آخرین بروزرسانی** | 2026-08-05 |
| **ماژول** | Inventory (MVNO) |
| **مخاطب** | ادمین شرکت (Tenant `/panel`) |

---

هدف



موجودی MVNO از سه واحد پایه ساخته می‌شود:

  • **شماره** (`msisdn` + رده طلایی/نقره‌ای/برنزی)

  • **سیم** (`iccid` + `imsi`/`pin`/`puk`)

  • **باندل** = یک شماره + یک سیم که به هم گره خورده‌اند (برای فروش سیم‌کارت فعال با شماره ثابت)


  • جریان: انبار آزاد (شماره/سیم/باندل) → انتقال به **باکس فروش** (هم‌رده) → فروش از افزونه محصول → **انتخاب شماره توسط مشتری/ریسلر** → تخصیص به سرویس در workflow → در صورت قطع سرویس، شماره وارد **قرنطینه** می‌شود و بعد از N روز خودکار به انبار آزاد برمی‌گردد.

    سرویس دستهٔ **اپراتوری** در پورتال/ریسلر به‌عنوان «اپراتور موبایل» مدیریت می‌شود و دکمه‌های **تمدید سرویس / گیگ‌باکس / حجم اضافه** ندارد.

    به‌جای آن:

    | دکمه | شرط نمایش |
    |------|-----------|
    | **افزونه‌ها** | همیشه (برای IP و گزینه‌های عمومی؛ `portal_display` شامل `addons`) |
    | **بسته اینترنت** | افزونه با `portal_display` = `package_data` به محصول وصل باشد |
    | **بسته تماس** | `package_voice` |
    | **بسته پیامک** | `package_sms` |
    | **بسته ترکیبی** | `package_combo` |

    ساخت: افزونه مستقل بسازید → تگ نمایش مناسب را بزنید → به محصول اپراتوری وصل کنید.

    ---

    منو (`/panel`)



    مسیر: `/panel` → **انبار** → **MVNO**

    | زیرمنو | کاربرد |
    |--------|--------|
    | **انبار آزاد شماره** | افزودن تکی + ایمپورت Excel/CSV/چسباندن + نمونه CSV + انتقال دسته‌جمعی به باکس |
    | **انبار آزاد سیم** | افزودن تکی + ایمپورت Excel/CSV/چسباندن + نمونه CSV |
    | **انبار آزاد باندل** | ساخت باندل از شماره+سیم آزاد، ایمپورت جفتی، آنباندل، انتقال دسته‌جمعی به باکس |
    | **باکس‌های فروش** | ساخت باکس؛ در **ویرایش باکس** لیست شماره‌های داخل باکس (جستجو / برگشت تکی یا گروهی به آزاد)؛ باکس‌گذاری از انبار آزاد یا فایل |
    | **تخصیص‌یافته‌ها** | فقط بعد از فروش/workflow: شماره تخصیص‌شده به اشتراک مشتری — **موجودی باکس اینجا نیست** |
    | **قرنطینه و تنظیمات** | تعداد روز قرنطینه پس از آزادسازی + لیست شماره‌های در حال قرنطینه + آزادسازی فوری |

    ---

    رده شماره (Tier)



    هر شماره و هر باکس فروش یک رده دارد: **طلایی / نقره‌ای / برنزی**. انتقال شماره یا باندل به باکس فقط وقتی مجاز است که رده شماره با رده باکس یکسان باشد.

    روی افزونه فقط رده‌هایی در فیلتر انتخاب شماره دیده می‌شوند که باکس مربوطه‌شان به همان افزونه وصل شده باشد (مثلاً فقط باکس طلایی → فقط طلایی).

    ---

    ساخت باندل



    از **انبار آزاد باندل** → دکمهٔ **ساخت باندل**: یک شماره آزاد + یک سیم آزاد انتخاب می‌شود؛ سیستم باندل می‌سازد (شماره در انبار باندل آزاد می‌ماند، سیم وضعیت «در باندل» می‌گیرد). با **آنباندل** هر دو به انبار آزاد جدا برمی‌گردند (فقط اگر باندل در باکس/تخصیص نباشد).

    فرمت ایمپورت باندل جفتی



    ستون‌ها: `msisdn` (الزامی)، `iccid` **یا** `imsi` (حداقل یکی)، اختیاری: `tier`, `pin`, `puk` — اگر شماره یا سیم از قبل نباشد ساخته می‌شود؛ IMSI به‌تنهایی فقط به سیم آزاد موجود وصل می‌شود.

    ---

    باکس فروش



    فرم: نام، رده شماره، فروش به مشتری، فروش به ریسلر، **ریسلرهای مجاز** (خالی = همه ریسلرهای شرکت)، فعال، یادداشت.

    روی صفحهٔ ویرایش باکس:

    | اکشن / بخش | کاربرد |
    |------|--------|
    | **از انبار آزاد** | چک‌لیست شماره‌ها/باندل‌های آزاد هم‌رده برای افزودن به باکس |
    | **باکس کردن با فایل** | فایل CSV/Excel با ستون `msisdn` یا `iccid` |
    | **برگشت همه به آزاد** | همه آیتم‌های باکس را به انبار آزاد برمی‌گرداند |
    | **جدول شماره‌های داخل باکس** | لیست موجودی باکس با نمایش ۹۸…، جستجو، برگشت تکی/گروهی به آزاد |

    موجودی باکس (`boxedCount`) در جدول لیست باکس‌ها نمایش داده می‌شود. همان اکشن‌های باکس در ردیف جدول لیست هم در دسترس‌اند.

    ---

    انتخاب شماره در خرید (مشتری / ریسلر / پورتال)



    کامپوننت: `inventory::components.mvno-assign-fields` — API: `GET /inventory/mvno/numbers`

    | مورد | رفتار |
    |------|--------|
    | نمایش شماره | با کد کشور **۹۸** (ذخیره داخلی همچنان با ۰۹…) |
    | پیش‌شماره | از موجودی باکس‌های وصل‌شده به افزونه (۶ رقم ملی → مثلاً `9899988`) به‌صورت دکمه انتخاب |
    | جستجو | LTR؛ بعد از انتخاب پیش‌شماره، ارقام بعدی خانه‌به‌خانه؛ فیلتر لحظه‌ای روی شروع شماره |
    | لیست | هر ردیف ۴ شماره؛ ابتدا ۲۰ تا؛ دکمه **بیشتر** هر بار ۲۰ تای بعدی |
    | رده | فقط رده‌های باکس‌های همان افزونه؛ اگر یکی باشد خودکار همان انتخاب می‌شود |
    | الزام | بدون انتخاب شماره، سفارش MVNO ثبت نمی‌شود |

    انتخاب در metadata سفارش ذخیره می‌شود (`mvno_selections` / `mvno_manual_msisdn`) و در workflow همان MSISDN از باکس قفل می‌شود.

    ---

    قرنطینه



    پس از پایان/قطع سرویس، شماره به‌جای بازگشت فوری به انبار آزاد، به مدت **N روز** (پیش‌فرض ۳۰، قابل تغییر در `/panel` → انبار → MVNO → **قرنطینه و تنظیمات**) در وضعیت قرنطینه می‌ماند و سپس به‌صورت خودکار آزاد می‌شود (Scheduler: `inventory:release-mvno-quarantines` روزانه ۰۱:۱۵). در همان صفحه لیست شماره‌های در حال قرنطینه با تاریخ پایان دیده می‌شود و می‌توان با «آزادسازی فوری» زودتر آزاد کرد. تنظیم روی `tenant.settings.mvno_number_quarantine_days` ذخیره می‌شود.

    ---

    فروش در کاتالوگ



  • افزونه **مستقل** بسازید با «اتصال به انبار» = **سیم/شماره MVNO**.

  • یک یا چند **باکس فروش** را به ترتیب اولویت وصل کنید (رده هر باکس = رده‌های قابل انتخاب در checkout).

  • افزونه را به محصول اصلی وصل کنید.

  • مشتری/ریسلر شماره را از لیست باکس‌های مجاز انتخاب می‌کند؛ موجودی در checkout چک و در workflow تخصیص می‌شود (`MvnoOrderService`).


  • روی **تخصیص‌یافته‌ها** می‌توان بدون قرنطینه «برگشت به آزاد» (جدا) یا «برگشت باندل» زد. قطع سرویس همچنان شماره را قرنطینه می‌کند.

    ---

    مرتبط



  • [product-addons.md](product-addons.md)

  • [tenant-panel.md](tenant-panel.md)

  • [lte-inventory.md](lte-inventory.md) — الگوی مشابه (انبار آزاد → دسته/باکس → افزونه)

  • ADR-025 در [DECISIONS.md](../DECISIONS.md)

  • کلاس‌ها: `MvnoInventoryService`, `MvnoImportService`, `MvnoOrderService`

  • UI: `MvnoSaleBoxStockActions`, `BoxItemsRelationManager`, `mvno-assign-fields`