تعریف محصول و پلن
| فیلد | مقدار |
|------|--------|
| **نسخه** | 1.19 |
| **آخرین بروزرسانی** | 2026-09-26 |
| **ماژول** | Product Catalog |
| **فاز** | 2 |
| **مخاطب** | ادمین |
---
هدف
هر **محصول (Product Offering)** یک پلن قابل فروش است — مثلاً FTTH 100Mbps یا VPS 2Core.
چهار نوع آیتم: **محصول اصلی** / **دامنه** / **گزینه قابل تنظیم** / **افزونه مستقل**.
---
مراحل
۱. ایجاد محصول
در **لیست** محصولات و پلنها ستون **ماژول Provision** نمایش داده میشود (بهجای نوع سرویس اینترنت). ستونهای اپراتور LTE، FD/TD و قیمت در لیست نیستند — جزئیات در فرم ویرایش / تب قیمت و فیلدهای LTE محصول باقی است.
حذف دسته و محصول (سطل آشغال)
| مورد | شرط حذف |
|------|---------|
| **دسته** | زیردسته نداشته باشد و هیچ محصول/پلنی زیر آن نباشد |
| **محصول / پلن** | به نماینده assign نباشد (grant یا پورسانت روی همان محصول) و هیچ اشتراک/آیتم سفارشی با آن محصول ثبت نشده باشد |
اگر شرط برقرار نباشد دکمهٔ حذف دیده نمیشود (یا در حذف گروهی با پیام خطا متوقف میشود).
کپی از محصول / پلن
در همان لیست:
کپی شامل قیمتگذاری، Provision، فیلدهای سفارش، گزینههای قابل تنظیم (+ انتخابها)، لینک افزونهها، اهداف تمدید، باندل، و اتصال انبار LTE/MVNO است. بعد از ایجاد، به صفحه ویرایش کپی هدایت میشوید. کپی از `replicate` مدل استفاده میکند تا فیلدهای JSON دوبار encode نشوند.
۲. تب «عمومی»
| فیلد | توضیح |
|------|--------|
| شرکت / دسته | Tenant و دستهبندی |
| نام / slug | نام محصول؛ slug یکتا در هر شرکت — تکراری بودن باعث پسوند `-2` و … میشود |
| Add-on | اگر مکمل سرویس دیگر است (در کاتالوگ مستقل فروخته نمیشود) |
| Bundle | اگر شامل چند سرویس است |
| ویژه | نمایش در بخش پیشنهاد ویژه |
برای اتصال افزونه به محصول اصلی، تب **Add-onها** را ببینید. جزئیات: [`product-addons.md`](product-addons.md)
۳. تب «قیمت»
| فیلد | توضیح |
|------|--------|
| مدل قیمت | Recurring, Postpaid (جلالی), One-time, … |
| دوره پیشفرض | برای recurring/postpaid؛ مشتری میتواند دورهٔ دیگر را انتخاب کند |
| همترازی تقویم | فقط Postpaid: اول ماه جلالی یا سالگرد جلالی — [jalali-postpaid-billing.md](./jalali-postpaid-billing.md) |
| قیمت هر دوره | ماهانه / سهماهه / ششماهه / سالانه + (فقط recurring) Repeater دوره سفارشی روز |
| قیمت / نصب تکفیلد | فقط برای one-time / prepaid |
| واحد قیمتگذاری | ریال یا دلار — دلار با نرخ روز در تنظیمات مالی به ریال تبدیل میشود |
| مالیات | درصد VAT |
جزئیات چنددورهای: [product-cycle-pricing.md](./product-cycle-pricing.md)
۴. تب «فنی / Provision»
| فیلد | توضیح |
|------|--------|
| ماژول Provision | Select دستهبندیشده (اینترنت / میزبانی / VPS / کلود عمومی / …) — جزئیات: [provisioning-modules.md](./provisioning-modules.md) |
| گروه سرور | برای هاستینگ پکیج؛ برای Proxmox نود/استوریج از API همان گروه. قالبها در فیلد سفارش `iso` برای انتخاب مشتری؛ `bridge` پیشفرض `vmbr0` |
| کارتابل فروش | از **دسته** محصول تنظیم میشود (نه از محصول) |
| مشخصات فنی | کلید/مقدار نمایشی در کاتالوگ (`specifications`)؛ برای مقایسه و فیلتر، کلیدها بین محصولات یک دسته باید یکسان باشند (فاصلهٔ اضافه هنگام ذخیره حذف میشود) |
۵. تب «فیلدهای سفارش»
فیلدهای سفارشی — موقع خرید از مشتری/نماینده پرسیده میشوند.
جزئیات: [product-custom-fields.md](product-custom-fields.md)
۶. تب «تمدید»
اجازه تمدید به همین محصول و لیست محصولات مجاز برای تمدید/ارتقا.
لیست فقط محصولات **همماژول Provision** را نشان میدهد (مثلاً برای محصول `hestia` فقط پلنهای `hestia`؛ پلنهای `cpanel` / `ispconfig` دیده نمیشوند)، بههمراه فیلتر دسته یا نوع سرویس اینترنت در صورت اعمال.
همان فیلتر در **پورتال/ریسلر** هم اعمال میشود (`RenewalCatalogService`): حتی اگر قبلاً پلن ناهمماژول در «محصولات مجاز برای تمدید» ذخیره شده باشد، در صفحه ارتقا/کاهش نمایش داده نمیشود و ثبت سفارش هم رد میشود.
---
نتیجه
محصول در `/catalog` قابل مشاهده است. API: `/api/tmf/productCatalogManagement/v1/productOffering`
---
خطاهای رایج
| مشکل | راهحل |
|------|--------|
| slug تکراری | slug یکتا per Tenant باشد |
| در فروشگاه نیست | «فعال» را چک کنید |