BSS HostKhaneh

Product Add-on و گزینه‌های قابل تنظیم

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

Product Add-on و گزینه‌های قابل تنظیم



| فیلد | مقدار |
|------|--------|
| **نسخه** | 1.20 |
| **آخرین بروزرسانی** | 2026-09-16 |
| **مخاطب** | ادمین |

---

سه نوع آیتم کاتالوگ



| نوع | توضیح | قیمت | Provision |
|-----|--------|------|-----------|
| **محصول اصلی** | سرویس پایه (VPS، FTTH، …) | روی خود محصول | ماژول محصول |
| **گزینه قابل تنظیم** | مثل RAM/CPU/IP اضافه — سطح‌ها با عنوان و قیمت | روی هر choice: ماهانه/… + Repeater دوره سفارشی روز | نام مقدار + مقدار در سرور مقصد (نه از روی عنوان) |
| **افزونه مستقل** | مثل مودم، حجم اضافه NetBill، SSL | دوره/قیمت خودش | اختیاری (ماژول خودش) |

از لیست محصولات سه دکمه دارید: **محصول جدید** / **گزینه قابل تنظیم** / **افزونه جدید**.

در ویرایش محصول / افزونه / گزینه قابل تنظیم، ریپیترها:

| رنگ | معنی |
|-----|------|
| آبی | **گروه** (لایه بیرونی، مثلاً گروه گزینه) |
| کهربایی | **آیتم** داخل گروه یا ریپیتر تک‌سطحی (سطح گزینه، فیلد سفارش، باکس MVNO، دسته LTE) |

---

نحوه نمایش به مشتری و ریسلر



| نوع | کجا دیده می‌شود |
|-----|------------------|
| **گزینه قابل تنظیم** | نمایش در **جزئیات سرویس اصلی**؛ **تغییر** از صفحه **افزونه‌ها** (ویجت مدیریت سرویس). در تمدید فقط همراه می‌شود و قابل عوض کردن نیست. هرگز ردیف جدا در لیست «سرویس‌های من» یا سوئیچر نیست |
| **افزونه مستقل** | لیست جدا / صفحه **افزونه‌ها** در مدیریت سرویس |

روی هر افزونه/گزینه، محل‌های نمایش (`portal_display`):

| گزینه | کاربرد |
|--------|--------|
| صفحه افزونه‌ها و گزینه‌های قابل تنظیم | افزونه مستقل + گزینه قابل تنظیم (خرید/تغییر از همین ویجت) |
| ویجت حجم اضافه | دکمه «حجم اضافه» در عملیات اینترنت |
| ویجت گیگ باکس | آماده‌سازی آینده |
| نمایش در خرید | Checkout مشتری + سفارش ریسلر |
| نمایش در تمدید | فقط برای **افزونه مستقل** هنگام تمدید (گزینه configurable در تمدید قفل است) |

اگر هیچ‌کدام انتخاب نشود، پیش‌فرض فقط **صفحه افزونه‌ها** است.

**نکته:** برای «گزینه قابل تنظیم» حتماً بعد از تیک زدن، ذخیره کنید. اتصال به **محصولات اصلی** هم لازم است.

---

اتصال به چند محصول اصلی



از تب **محصولات اصلی** (روی افزونه / گزینه قابل تنظیم) چند محصول را با **انتخاب چندتایی** وصل کنید — مثل فیلد «محصولات مجاز برای تمدید».

از طرف محصول اصلی → تب **افزونه‌ها** هم می‌توانید چند افزونه را همزمان انتخاب کنید.

فیلد جداگانه **اجباری** مشخص می‌کند برای کدام‌یک از موارد انتخاب‌شده خرید الزامی است.

برای دستهٔ دیتاسنتر، محصولات همهٔ زیردسته‌ها (VPS، Dedicated، …) در لیست دیده می‌شوند.

گزینه اجباری با یک سطح



اگر روی گروه گزینه تیک **اجباری** باشد و فقط **یک** سطح (radio/dropdown) تعریف شده باشد، همان سطح در خرید از قبل انتخاب می‌شود — لازم نیست مشتری دوباره تیک بزند.

پیام خطای اعتبارسنجی نام خود گزینه را نشان می‌دهد (مثلاً «لطفاً «IP ثابت» را انتخاب کنید») نه کلید فنی مثل `configurable_options.85.ip`.

افزونه اجباری



| محل | رفتار |
|-----|--------|
| Checkout مشتری / ثبت‌نام خرید | افزونه تیک‌خورده، قفل، و در سفارش همیشه هست |
| سفارش ریسلر | همان رفتار |
| تمدید سرویس | همان رفتار |
| مدیریت افزونه وسط دوره | اجباری نمی‌شود (اختیاری برای افزودن/حذف بعد از فروش) |

---

قیمت‌گذاری رایگان



| محل | تنظیم |
|-----|--------|
| محصول / افزونه مستقل | مدل قیمت‌گذاری = **رایگان** |
| choice گزینه قابل‌تنظیم | تیک **رایگان** روی هر سطح |

رفتار سفارش با جمع صفر: **فاکتور ساخته نمی‌شود**، روش پرداخت لازم نیست، فقط فعال‌سازی انجام می‌شود. اگر محصول رایگان باشد ولی افزونه/گزینه پولی انتخاب شود، فقط برای مبلغ باقی‌مانده فاکتور صادر می‌شود.

---

دوره سفارشی روی choice



روی هر سطح گزینه (باکس کهربایی)، بعد از قیمت ماهانه/سه‌ماهه/…:

| فیلد | نقش |
|------|-----|
| دوره‌های سفارشی (Repeater) | روز + برچسب + قیمت → کلید `custom_{days}` داخل `pricing` |

  • اگر محصول دورهٔ `custom_25` داشته باشد و روی choice هم `custom_25` قیمت داشته باشید → همان قیمت

  • اگر فقط روی محصول سفارشی باشد و روی choice نباشد → ماهانه × (روز / ۳۰)


  • جزئیات محصول: [product-cycle-pricing.md](product-cycle-pricing.md)

    ---

    نام / مقدار در سرور مقصد (همهٔ سرویس‌ها)



    | محل | فیلد | نقش |
    |-----|------|-----|
    | **گروه** گزینه | **نام مقدار در سرور مقصد** | یک‌بار برای کل گروه (`ram_mb`, `cores`, `credit`, …) |
    | **هر سطح** | **مقدار در سرور مقصد** | مقدار همان کلید برای آن سطح |

    عنوان سطح فقط برای مشتری است. نام مقدار و مقدار به مشتری نشان داده نمی‌شوند. همهٔ سطح‌های یک گروه از همان نام مقدار استفاده می‌کنند.

    این فیلدها برای **همهٔ ماژول‌ها** هستند (Proxmox، Virtualizor، NetBill، …) — محدود به VPS نیستند. مقدار واردشده با کلید روی `productConfig` ماژول می‌نشیند.

    > توجه: فیلد `ram_mb` **روی خود محصول** (تب Provision) به **مگابایت** است (`2048` = ۲ گیگ). جدول زیر فقط برای **گزینه قابل‌تنظیم** است.
    >
    > مقادیر گزینه با منابع پایهٔ محصول **جمع** می‌شوند. اگر پکیج گزینه را مطلق می‌خواهید (مثلاً «۴ گیگ» = دقیقاً ۴ گیگ)، پایهٔ محصول را برای آن منبع `0` بگذارید. اگر فقط `destination_value` ذخیره شده باشد، هنگام Provision از روی `destination_key` گروه به `cores`/`ram_mb`/… نرمال می‌شود.

    | نام مقدار | معنی مقدار |
    |-----------|------------|
    | `ram_mb` | عدد به **گیگابایت** است؛ `2` یعنی ۲ گیگ (۲۰۴۸ مگابایت روی VM) |
    | `cores` | تعداد هسته CPU |
    | `disk_gb` | گیگابایت دیسک |
    | `num_ips` / `num_ips6` | تعداد IP |
    | `bandwidth` | ترافیک گیگابایت (`0` = نامحدود) |
    | `network_speed` | سرعت KB/s (`0` = نامحدود) |
    | `bpid` / `fwid` / `firewall_enabled` | پلن بکاپ/فایروال Virtualizor یا فایروال Proxmox |
    | `credit` | نمونهٔ کلید آزاد (مثلاً حجم NetBill) — هر کلید دلخواه هم مجاز است |

    **نوع منبع VPS** روی گروه فقط میان‌بر پر کردن نام مقدار است و اختیاری است.

    برای بکاپ/فایروال Virtualizor، علاوه بر نام/مقدار، **شناسه پلن Virtualizor** (`bpid`/`fwid`) لازم است.

    دکمه **آموزش گزینه‌های دیتاسنتر** وقتی دسته دیتاسنتر باشد نمایش داده می‌شود.

    ---

    IP ثابت از انبار BSS



    جدا از «نوع منبع VPS = IP» (افزایش تعداد IP در Virtualizor):

  • روی گروه گزینه: **اتصال به انبار = IP ثابت (انبار)** و **استخر سرویس** (ADSL/FTTH/…)

  • در choice عنوانی مثل «۱ IP ثابت» — عدد از برچسب خوانده می‌شود

  • قبل از خرید موجودی استخر چک می‌شود؛ پس از فعال‌سازی تخصیص تا پایان سرویس والد

  • مدیریت استخر/آدرس در `/panel` → انبار → IP ثابت — [راهنما](static-ip-inventory.md)


  • ---

    بسته LTE از انبار BSS



  • انبار آزاد LTE را با **اپراتور** و **FD/TD** پر کنید و به **دسته فروش** هم‌خوان منتقل کنید

  • محصول اصلی LTE: اپراتور + FD/TD را روی محصول تنظیم کنید

  • **افزونه مستقل** جدید بسازید: در بخش فنی → **اتصال به انبار = بسته LTE** و **چند دسته فروش** (ترتیب = اولویت؛ مشتری/ریسلر از دسته کانال خود)

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

  • مشتری: تخصیص خودکار؛ ریسلر: خودکار یا انتخاب دستی شماره

  • راهنما: [lte-inventory.md](lte-inventory.md)


  • > انبار LTE روی **افزونه مستقل** است، نه گزینه قابل‌تنظیم و نه ماژول Provision.

    ---

    پوشش Wireless از انبار POP



  • در `/panel` → انبار → Wireless، POP سایت‌ها را بسازید (نقشه یا **ایمپورت Excel**)

  • **افزونه مستقل**: اتصال به انبار = **پوشش وایرلس** + فیلد سفارشی نوع **نقشه**

  • افزونه را به محصول Wireless وصل کنید (ترجیحاً اجباری؛ فقط افزونه‌های هم‌نوع دسته در تب محصول دیده می‌شوند)

  • هنگام خرید، نقطه نقشه همان لحظه با شعاع POPها چک می‌شود — [راهنما](wireless-inventory.md)

  • در جزئیات سفارش: آدرس + مختصات `(lat, lng)` از فیلد نقشه ذخیره/نمایش می‌شود


  • ---

    پوشش FTTH از انبار مختصات



  • در `/panel` → انبار → FTTH، نقاط پوشش را بسازید (نقشه یا **ایمپورت Excel**)

  • **افزونه مستقل**: اتصال به انبار = **پوشش FTTH (مختصات)** + فیلد سفارشی نوع **نقشه**

  • افزونه را به محصول FTTH وصل کنید (ترجیحاً اجباری)

  • هنگام خرید، نقطه نقشه همان لحظه با شعاع نقاط پوشش چک می‌شود — [راهنما](ftth-inventory.md)

  • نزدیک‌ترین نقطه پوشش‌دهنده در فیلدهای سفارش (`ftth_coverage_site_name`) ذخیره می‌شود


  • ---

    افزونه مستقل — پورت ADSL



  • انبار ADSL (مناطق / منابع پورت) را آماده کنید

  • **افزونه مستقل**: اتصال به انبار = **پورت ADSL (انبار)**

  • افزونه را به محصول ADSL وصل کنید (ترجیحاً اجباری)

  • هنگام خرید، شماره تلفن روی افزونه گرفته و پورت رزرو می‌شود — [راهنما](adsl-order-port.md)


  • > الگوی فروش مانند LTE/Wireless: انبار روی **افزونه مستقل**؛ محصول اصلی فقط سرویس را تعریف می‌کند.

    سیم/شماره MVNO از انبار BSS



  • در `/panel` → انبار → MVNO، شماره و سیم را ایمپورت کنید؛ در صورت نیاز باندل بسازید و به **باکس فروش** هم‌رده منتقل کنید

  • **افزونه مستقل**: اتصال به انبار = **سیم/شماره MVNO** و چند باکس فروش (ترتیب = اولویت؛ کانال مشتری/ریسلر). رده‌های قابل انتخاب در خرید = رده همان باکس‌ها

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

  • در checkout / ریسلر / پورتال، خریدار شماره را از لیست باکس انتخاب می‌کند (نمایش ۹۸، پیش‌شماره، جستجو، ۲۰+بیشتر)

  • پس از قطع سرویس شماره قرنطینه می‌شود — [راهنما](mvno-inventory.md)


  • > انبار MVNO روی **افزونه مستقل** است (فاز ۱ فیزیکی؛ بدون eSIM). «تخصیص‌یافته‌ها» فقط بعد از فروش پر می‌شود؛ موجودی باکس را در ویرایش باکس ببینید.

    سرور دیتاسنتر روی محصول اصلی Dedicated



    استثنا نسبت به بقیهٔ انبارها: اتصال روی **محصول اصلی** است (نه افزونه).

  • انبار → دیتاسنتر: سایت + رک + سرورهای آزاد را آماده کنید

  • محصول Dedicated: شاهکار type **26**

  • **اتصال به انبار دیتاسنتر = سرور دیتاسنتر (رزرو خودکار هنگام سفارش)**

  • سایت پیش‌فرض + اختیاری حداقل CPU/RAM/سازنده

  • خرید مشتری/ریسلر: موجودی چک و سرور رزرو می‌شود؛ فعال‌سازی → تخصیص نهایی


  • بدون اتصال انبار، تخصیص فقط دستی از کارتابل است. جزئیات: [dcim-datacenter-manager.md](dcim-datacenter-manager.md) · [dedicated-sales-cartable.md](dedicated-sales-cartable.md)

    فضای رک دیتاسنتر روی محصول اصلی (اجاره فضا)



    اتصال انبار فقط روی **محصول اصلی** است؛ گزینه‌ها نقش المان می‌گیرند نه اتصال انبار DCIM:

  • محصول: شاهکار type **26** + **اتصال به انبار = فضای رک**

  • بخش **المان‌های فروش دیتاسنتر**: مثلاً «گزینه تعداد U» یا IP ثابت انبار

  • افزونهٔ گزینه قابل‌تنظیم: **نقش المان = تعداد یونیت رک** + روی هر سطح فیلد تعداد U

  • فایروال و منابع Virtualizor را از مسیر عادی گزینه قابل‌تنظیم (نوع منبع VPS) بسازید — نه از المان انبار


  • جزئیات: [datacenter-space-sales-cartable.md](datacenter-space-sales-cartable.md) · [dcim-datacenter-manager.md](dcim-datacenter-manager.md)

    بسته‌های اپراتور موبایل (مدیریت سرویس)



    روی محصول دستهٔ اپراتوری، در صفحه مدیریت سرویس این ویجت‌ها از روی `portal_display` افزونه می‌آیند:

    | تگ `portal_display` | ویجت |
    |---------------------|------|
    | `addons` | افزونه‌ها (مثلاً IP) |
    | `package_data` | بسته اینترنت |
    | `package_voice` | بسته تماس |
    | `package_sms` | بسته پیامک |
    | `package_combo` | بسته ترکیبی |

    افزونه مستقل بسازید، تگ را بزنید، به محصول والد وصل کنید؛ دکمه فقط وقتی افزونه وصل باشد دیده می‌شود.

    ---

    افزونه مستقل — حجم اضافه NetBill



  • نوع **افزونه**، ماژول `netbill`

  • **نحوه نمایش** → ویجت حجم اضافه (+ در صورت نیاز نمایش در خرید)

  • در `provisioning_config` فیلد **credit** را تنظیم کنید

  • گروه سرور همان گروه NetBill محصول اصلی

  • به محصول اینترنت در **محصولات اصلی** وصل کنید


  • هنگام خرید، سیستم کاربر جدید نمی‌سازد؛ credit را روی username سرویس اصلی اعمال می‌کند.

    افزونه **یک‌بار (one_time)** از فیلد **قیمت** خوانده می‌شود (نه جدول دوره‌های ماهانه).

    افزونه مستقل **گزینه قابل تنظیم ندارد**.

    ---

    کانال‌های فروش



    | کانال | مسیر |
    |--------|------|
    | مشتری — خرید جدید | Checkout (فقط آیتم‌های با «نمایش در خرید») |
    | ریسلر — خرید جدید | ثبت سفارش ریسلر (همان فیلتر) |
    | مشتری — ارتقا/کاهش | پورتال → افزونه‌ها / ویجت حجم |
    | مشتری — تمدید | صفحه تمدید (آیتم‌های با «نمایش در تمدید») |
    | ریسلر — ارتقا/کاهش | مشتری → سرویس‌ها → مدیریت افزونه‌ها |

    ارتقا/کاهش گزینه و هایپروایزر



    بعد از پرداخت **تغییر گزینه** (`action=modify`) یا **حذف افزونه**، علاوه بر به‌روز کردن اشتراک افزونه در BSS، اگر والد VPS فعال باشد `changePackage` با منابع مؤثر (پایه محصول + گزینه‌های افزونه‌های فعال) روی Proxmox/Virtualizor/… زده می‌شود. قبلاً فقط نام/قیمت در BSS عوض می‌شد و VM روی هایپروایزر همان منابع قدیم می‌ماند.

    خرید اولیهٔ افزونهٔ منبع از همان مسیر `syncParentHypervisorAfterAddonChange` استفاده می‌کند.

    ---

    مدل داده



  • `product_offerings.addon_type` — `configurable` | `standalone`

  • `product_offerings.portal_display` — JSON لیست محل‌های نمایش

  • `product_configurable_options.vps_resource_type` — نوع منبع VPS

  • `product_configurable_option_choices.external_plan_id` — bpid/fwid

  • `product_configurable_options.provisioning_delta.destination_key` — نام مقدار در سرور مقصد (سطح گروه)

  • `product_configurable_option_choices.provisioning_delta` — `destination_value` (+ نرمال‌سازی از کلید گروه؛ برای `ram_mb` مقدار به گیگابایت است و به مگابایت تبدیل می‌شود)

  • `product_addon_offerings` — لینک والد ↔ افزونه

  • `subscriptions.parent_subscription_id`