ساخت دستهبندی محصول
| فیلد | مقدار |
|------|--------|
| **نسخه** | 1.20 |
| **آخرین بروزرسانی** | 2026-09-20 |
| **ماژول** | Product Catalog |
| **فاز** | 1 |
| **مخاطب** | ادمین |
---
هدف
دستهبندیها سرویسها را گروهبندی میکنند: اینترنت، دیتاسنتر، هاستینگ، اپراتوری و ...
ساخت و ویرایش در پنل ادمین:
---
مراحل
۱. ورود به پنل
کپی از دسته
در همان لیست:
کپی شامل تنظیمات دسته (مالیات، پرداخت، سیاست پلن/تمدید، کارتابل، اعلانها و …) است. محصولات مستقیم همان دسته با فیلدهای سفارش، گزینههای قابل تنظیم، لینک افزونه/تمدید و تنظیمات Provision کپی میشوند؛ `slug` یکتا میشود. زیردستهها کپی نمیشوند.
۲. مراحل ساخت
| مرحله | محتوا |
|-------|--------|
| ۱. اطلاعات دسته | نام، slug، والد، فعال + نمایش کاتالوگ + **سیاست تغییر پلن و نحوه تمدید** |
| ۲. مالیات و پرداخت | مالیات + روشهای پرداخت + صدور صورتحساب |
| ۳. کارتابل عملیاتی | فروش / ارتقاء / کاهش / جمعآوری — هر کدام اختیاری |
| ۴. اعلانها | انتخاب تمپلیت نوتیفیکیشن برای رویدادها + اخطار چندمرحلهای عدم پرداخت |
اعلانها (تمپلیت)
تمپلیتها را از **تنظیمات → تمپلیت اعلان** بسازید (متن ایمیل با TinyMCE؛ جایگزینها در انتهای فرم)، سپس روی دسته وصل کنید:
| رویداد | توضیح |
|--------|--------|
| سفارش | پس از ثبت سفارش |
| فعالسازی سرویس | وقتی سرویس فعال میشود |
| معلق شدن سرویس | تعلیق |
| جمعآوری سرویس | درخواست جمعآوری |
| ایجاد فاکتور خرید / تمدید | صدور فاکتور |
| فاکتور پرداختشده / کنسلشده | تغییر وضعیت فاکتور |
| اطلاعات سرویس | مشخصات (مثلاً نام کاربری) |
| اخطار عدم پرداخت | چند مرحله با «روز تأخیر» و تمپلیت جدا |
خالی گذاشتن = متن پیشفرض سیستم.
نمایش در کاتالوگ
دسته همیشه در پنل ادمین میماند. با **عدم نمایش**:
| گزینه | اثر |
|-------|------|
| عدم نمایش به مشتری | از فروشگاه و پورتال مشتری پنهان میشود |
| عدم نمایش به نماینده | از کاتالوگ/سفارشگیری ریسلر پنهان میشود |
میتوانید مثلاً دسته را فقط برای نماینده نشان دهید، یا موقتاً از هر دو مخفی کنید بدون حذف از سیستم.
سیاست تغییر پلن و نحوه تمدید
در تب **اطلاعات دسته** بخش **سیاست تغییر پلن و تمدید**:
| فیلد | پیشفرض | اثر |
|------|---------|-----|
| **نحوه تمدید** (`renewal_mode`) | تمدید توسط مشتری | `customer` = مشتری از پورتال تمدید میکند؛ منو «تمدید سرویس»؛ پلن فعلی در لیست هست. `automatic` = تمدید خودکار؛ منوی پورتال «ارتقا / کاهش»؛ پلن فعلی در لیست نیست؛ اشتراک جدید با `auto_renew=true`. اگر هیچ پلن میاندورهٔ مجازی نباشد (مثلاً ارتقا و کاهش هر دو مسدود)، منو غیرفعال است |
| **صدور فاکتور چند روز قبل** (`renewal_invoice_days_before`) | ۰ | فقط وقتی تمدید خودکار است؛ چند روز قبل از `next_billing_at` فاکتور تمدید کرون صادر شود |
| **اجازه کاهش پلن** (`allow_plan_downgrade`) | روشن | اگر خاموش باشد، مشتری و ریسلر نمیتوانند به پلن ارزانتر بروند (تمدید دوره بعد و میاندوره) |
| **برگشت مبلغ بستانکاری هنگام کاهش** (`refund_downgrade_credit`) | روشن | فقط وقتی کاهش مجاز است دیده میشود. روشن = فاکتور برگشت از فروش `RET-` + واریز کیف پول. خاموش = فقط پلن عوض میشود، مبلغی برنمیگردد |
| **اجازه ارتقا در همین دوره** (`allow_mid_cycle_plan_upgrade`) | روشن | خاموش = گزینه «تغییر پلن در همین دوره» برای پلن گرانتر (مابهالتفاوت) مسدود؛ «تمدید دوره بعد» با پلن گرانتر همچنان مجاز است |
سیاست از **دستهٔ پلن فعلی** اشتراک خوانده میشود.
نمایش خطوط صفر در فاکتور
در بخش **صدور صورتحساب**:
| فیلد | پیشفرض | اثر |
|------|---------|-----|
| **نمایش آیتمهای با مبلغ صفر** (`show_zero_amount_invoice_lines`) | روشن | اگر خاموش باشد، هنگام صدور فاکتور/پیشفاکتور از سفارش، خطوطی که مبلغ کلشان صفر است روی سند نمیآیند (مثلاً محصول رایگان کنار آیتم پولی) |
سیاست از **دستهٔ محصول اصلی** سفارش خوانده میشود.
اسناد قبلی هم با باز شدن فاکتور/پیشفاکتور (یا صدور مجدد از سفارش) همراستا میشوند و خطوط صفر حذف میگردند.
کارتابل عملیاتی
برای **هر مقصد** میتوانید کارتابل جدا بسازید (روی دستهٔ سرویس اصلی، نه افزونه):
| مقصد | چه زمانی کار باز میشود |
|------|-------------------------|
| فروش سرویس | سفارش فروش جدید |
| ارتقای سرویس | افزودن افزونه / گزینه قابل تنظیم روی سرویس فعال |
| کاهش سرویس | حذف افزونه / کاهش روی سرویس فعال |
| جمعآوری سرویس | درخواست جمعآوری از پورتال یا ریسلر |
کارتابل از **دستهٔ همان محصول سرویس** خوانده میشود (نه دستهٔ والد/همنام). مثلاً اگر پلن Hestia داخل دسته «سرور Cpanel» باشد، جمعآوری باید روی همان دسته روشن شود — تنظیم روی دستهٔ دیگر (مثل «هاستینگ») کافی نیست.
دکمهٔ «درخواست جمعآوری» در پورتال/ریسلر فقط وقتی دیده میشود که کارتابل جمعآوری همان دسته **روشن و کامل** باشد (مسیر + دپارتمان + وضعیت). نوع سرویس (هاست / VPS / …) بهتنهایی دکمه را نشان یا مخفی نمیکند.
در مسیر مشترک جمعآوری (pipeline 7) پس از تأیید، اول `provisioning.terminate` (حذف از سرور مقصد) و بعد `subscription.terminate` (قطع در BSS) اجرا میشود — جزئیات: [workflow-actions.md](./workflow-actions.md).
| فیلد | توضیح |
|------|--------|
| ساخت خودکار کارتابل | فعال/غیرفعال per مقصد |
| Workflow محصول | مسیر دپارتمان/وضعیت |
| دپارتمان شروع / وضعیت اولیه | نقطه ورود کار |
| قالب موضوع | `{product}` و `{order}` |
**رفتار:**
ابتدا در **Workflow محصول** مسیر را با purpose مناسب بسازید، بعد اینجا وصل کنید. جزئیات: [Workflow و گزارشگیری](workflow-reporting.md)
---
نتیجه
دسته در فروشگاه (`/catalog`) نمایش داده میشود.
---