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` |
جزئیات محصول: [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):
---
بسته LTE از انبار BSS
> انبار LTE روی **افزونه مستقل** است، نه گزینه قابلتنظیم و نه ماژول Provision.
---
پوشش Wireless از انبار POP
---
پوشش FTTH از انبار مختصات
---
افزونه مستقل — پورت ADSL
> الگوی فروش مانند LTE/Wireless: انبار روی **افزونه مستقل**؛ محصول اصلی فقط سرویس را تعریف میکند.
سیم/شماره MVNO از انبار BSS
> انبار MVNO روی **افزونه مستقل** است (فاز ۱ فیزیکی؛ بدون eSIM). «تخصیصیافتهها» فقط بعد از فروش پر میشود؛ موجودی باکس را در ویرایش باکس ببینید.
سرور دیتاسنتر روی محصول اصلی Dedicated
استثنا نسبت به بقیهٔ انبارها: اتصال روی **محصول اصلی** است (نه افزونه).
بدون اتصال انبار، تخصیص فقط دستی از کارتابل است. جزئیات: [dcim-datacenter-manager.md](dcim-datacenter-manager.md) · [dedicated-sales-cartable.md](dedicated-sales-cartable.md)
فضای رک دیتاسنتر روی محصول اصلی (اجاره فضا)
اتصال انبار فقط روی **محصول اصلی** است؛ گزینهها نقش المان میگیرند نه اتصال انبار DCIM:
جزئیات: [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
هنگام خرید، سیستم کاربر جدید نمیسازد؛ credit را روی username سرویس اصلی اعمال میکند.
افزونه **یکبار (one_time)** از فیلد **قیمت** خوانده میشود (نه جدول دورههای ماهانه).
افزونه مستقل **گزینه قابل تنظیم ندارد**.
---
کانالهای فروش
| کانال | مسیر |
|--------|------|
| مشتری — خرید جدید | Checkout (فقط آیتمهای با «نمایش در خرید») |
| ریسلر — خرید جدید | ثبت سفارش ریسلر (همان فیلتر) |
| مشتری — ارتقا/کاهش | پورتال → افزونهها / ویجت حجم |
| مشتری — تمدید | صفحه تمدید (آیتمهای با «نمایش در تمدید») |
| ریسلر — ارتقا/کاهش | مشتری → سرویسها → مدیریت افزونهها |
ارتقا/کاهش گزینه و هایپروایزر
بعد از پرداخت **تغییر گزینه** (`action=modify`) یا **حذف افزونه**، علاوه بر بهروز کردن اشتراک افزونه در BSS، اگر والد VPS فعال باشد `changePackage` با منابع مؤثر (پایه محصول + گزینههای افزونههای فعال) روی Proxmox/Virtualizor/… زده میشود. قبلاً فقط نام/قیمت در BSS عوض میشد و VM روی هایپروایزر همان منابع قدیم میماند.
خرید اولیهٔ افزونهٔ منبع از همان مسیر `syncParentHypervisorAfterAddonChange` استفاده میکند.
---