مدیریت پلتفرم
پلنها و همگامسازی استرایپ
پلنها تنها بخشی از دادههای مشتریمحور هستند که مدیران مستقیماً ایجاد میکنند. صفحهی مدیریت پلنها (/admin/plans) با Stripe همگامسازی شده است تا هرگز نیازی به دستکاری در داشبورد Stripe برای ایجاد محصولات و قیمتها نداشته باشید — هر تغییری که در اینجا ذخیره شود، بهطور خودکار به Stripe ارسال میشود.
جدول پلنها
/admin/plans لیست کامل پلنها را به همراه ویژگیهای اصلی، تعداد فضاهای کاری استفادهکننده و وضعیت همگامسازی (سبز = همگام با Stripe، نارنجی = در انتظار، خاکستری = فقط محلی / رایگان) نشان میدهد.
| ستون | توضیحات |
|---|---|
| نام | نام نمایشی. قابل ویرایش. |
| نامک | شناسه ثابت. پس از ایجاد قفل میشود — فضاهای کاری از طریق شناسهی نامک به پلن اشاره میکنند و تغییر آن باعث خرابی فاکتورها میشود. |
| تعداد مکالمات ماهانه | سهمیه. |
| قیمت | قیمت ماهانه. تغییر آن، قیمت قدیمی Stripe را بایگانی کرده و یک قیمت جدید ایجاد میکند. |
| فضاهای کاری | تعداد فضاهای کاری که در حال حاضر از این پلن استفاده میکنند. |
| شناسههای Stripe | شناسههای محصول و قیمت پس از همگامسازی. پلنهای رایگان/سفارشی «—» نشان میدهند. |
| فعال | کلید تغییر وضعیت. پلنهای غیرفعال در بخش مشتری قابل انتخاب نیستند. |
ایجاد پلن جدید
پلن جدید فرم را باز میکند. فیلدها:
- نام — الزامی.
- تعداد مکالمات ماهانه — الزامی.
0= نامحدود. - تعداد پیامهای ماهانه — اختیاری. حداکثر تعداد پیامهای هر فضای کاری در ماه را محدود میکند. برای بدون محدودیت خالی بگذارید.
- حداکثر توکن در هر پاسخ — اختیاری. محدودیت سقف طول پاسخ هوش مصنوعی. حداقل ۱۰۰، حداکثر ۸۰۰۰.
- قیمت (به واحد سنت) — الزامی.
0= رایگان/سفارشی (نیاز به Stripe ندارد). - قابلیتها — کلیدهای تغییر وضعیت:
remove_brandingو سایر موارد آینده. - فعال — پیشفرض روشن است.
محدودیتهای منابع (سقف هر فضای کاری)
کارت محدودیتهای منابع به مدیران اجازه میدهد تا سطوح پلن را فراتر از سهمیههای هوش مصنوعی متمایز کنند. هر فیلد میتواند یک عدد مثبت، 0 یا خالی باشد:
- خالی = نامحدود. تمام پلنهای قبل از نسخه ۱.۳ در هر شش ستون به NULL تبدیل شدهاند، بنابراین مشتریان قبلی هرگز محدود نمیشوند.
- 0 = مسدود کامل. مناسب برای نسخهی رایگان (مثلاً «در این پلن اتصالی وجود ندارد»).
- عدد مثبت = سقف مطلق. شمارش با احترام به حذف نرم انجام میشود (یک دستیار فروش حذفشده محاسبه نمیشود) و دعوتنامههای در انتظار در محدودیت اعضا محاسبه میشوند (در غیر این صورت، یک فضای کاری میتواند ۱۰۰ دعوتنامه صف کند و بعداً همه را بپذیرد).
| فیلد | محدودیت | روش شمارش |
|---|---|---|
agents_limit | تعداد دستیاران فروش در هر فضای کاری | Agent::where('workspace_id', X) — هر دستیار فروش حذفنشده. |
sources_limit | تعداد منابع دانش در تمام دستیاران فروش فضای کاری | جمع ردیفهای Source که دستیار فروش آنها متعلق به فضای کاری است. ستون دانش در /app/agents این را به صورت استفاده شده/محدودیت نمایش میدهد (یا فقط استفاده شده در صورت نامحدود بودن پلن). |
workflows_limit | تعداد گردشهای کار در هر فضای کاری | Workflow::where('workspace_id', X) |
integrations_limit | تعداد اتصالات اسلک و اشتراکهای وبهوک خروجی | جمع ردیفهای IntegrationConnection و WebhookSubscription. |
members_limit | تعداد اعضای هر فضای کاری | ردیفهای پذیرفتهشدهی workspace_users + دعوتنامههای در انتظار منقضینشده. |
api_access | آیا فضاهای کاری در این پلن میتوانند توکن API ایجاد کنند | چکباکس. برای سازگاری با نسخههای قبلی، پیشفرض روشن است. |
وقتی یک فضای کاری به سقف میرسد، نقطهی پایانی «ایجاد» با پیام خطا به عقب هدایت میشود: "شما به محدودیت پلن خود یعنی N دستیار فروش رسیدهاید. برای افزودن بیشتر ارتقا دهید." بخش جلویی نیز پیام را بدون نیاز به کد جداگانه برای هر منبع نمایش میدهد.
اعمال محدودیتها در App\Services\Billing\PlanLimits انجام میشود. تستهای مربوطه در tests/Feature/PlanLimitsTest.php تمام کنترلرها و مسیرهای سازگاری با نسخههای قبلی را پوشش میدهند.
هنگام ذخیره، سرور ابتدا ردیف محلی را ایجاد میکند و سپس StripeProductSync::syncPlan() را اجرا میکند. اگر قیمت > ۰ باشد، محصول و قیمت در Stripe ایجاد شده و شناسههای آنها در ردیف پلن ذخیره میشوند. اگر Stripe در دسترس نباشد یا اشتباه تنظیم شده باشد، ردیف محلی نگهداری شده و یک خطا نمایش داده میشود — میتوانید بدون ذخیرهی مجدد فرم، همگامسازی را دوباره اجرا کنید.
دکمهی همگامسازی
هر ردیف یک دکمهی همگامسازی دارد که مستقیماً StripeProductSync::syncPlan() را اجرا میکند. نتیجه را به صورت JSON برمیگرداند تا صفحه بتواند «همگام شد» یا خطا را بدون بارگذاری مجدد نمایش دهد. کاربردها:
- وقتی کلید Stripe را تغییر دادهاید و میخواهید همهچیز را دوباره متصل کنید.
- همگامسازی قبلی ناموفق بوده و مشکل اصلی را برطرف کردهاید.
- میخواهید وضعیت Stripe یک پلن را بدون دستکاری فرم بررسی کنید.
ویرایش
ویرایشها بهصورت طبیعی عمل میکنند، به جز دو نکته:
- تغییر قیمت، قیمت Stripe را تغییر میدهد. قیمتهای Stripe غیرقابل تغییر هستند، بنابراین قیمت قدیمی بایگانی شده و یک قیمت جدید ایجاد میشود. اشتراکهای موجود با قیمت قدیمی باقی میمانند و فقط اشتراکهای جدید از قیمت جدید استفاده میکنند.
- نامک قفل است. در حالت ویرایش، ورودی غیرفعال است.
حذف
پلنها هرگز بهصورت مخرب حذف نمیشوند. عملیات حذف، آن را غیرفعال (is_active = false) کرده و محصول Stripe را بایگانی میکند. دلایل:
workspaces.plan_idیک کلید خارجی واقعی است — حذف آن باعث یتیم شدن یا آبشاری شدن میشود.- فاکتورهای تاریخی به پلن اشاره دارند و باید بتوانیم برای همیشه آنها را پیدا کنیم.
- اشتراکهای در حال انجام به یک پلن پایدار برای اتصال نیاز دارند.
برای فعالسازی مجدد یک پلن غیرفعال: آن را ویرایش کرده و کلید فعال را دوباره روشن کنید. محصول Stripe از حالت بایگانی خارج شده و پلن دوباره قابل انتخاب میشود.
پلنهای رایگان / سفارشی
پلنهایی با price_cents = 0 هرگز به Stripe همگامسازی نمیشوند. فقط در Pitchbar وجود دارند — برای پلن رایگان پیشفرض و معاملات دستی سازمانی که میخواهید سهمیه و قابلیتها را داشته باشید اما صورتحساب خارج از سیستم انجام شود، مفید هستند.
واحد پول
بهصورت سراسری از طریق CASHIER_CURRENCY در محیط تنظیم میشود. پیشفرض دلار آمریکا است. تغییر واحد پول در یک استقرار با قیمتهای موجود، یک مهاجرت دستی است — باید تمام قیمتهای Stripe را بایگانی کنید، متغیر محیط را تغییر دهید و سپس هر پلن را همگامسازی کنید تا قیمتهای جدید در واحد پول جدید ایجاد شوند.