Тарифы и квоты
Planner использует двухуровневую систему тарифов с раздельными квотами для пользователей и организаций.
Модель
Plan
├── name, description
├── price (месяц)
├── maxOrgs, maxStandaloneTeams
├── maxTeamsPerOrg, maxProjectsPerOrg
├── maxProjectsPerTeam, maxMembersPerTeam
├── storagePerOrg, storagePerTeam (в байтах)
├── public (false — скрыть от не-админов, для Enterprise)
└── features (JSON-список возможностей)Два уровня тарифов
| Уровень | Привязка | Контролирует |
|---|---|---|
| User.planId | Пользователь | Количество организаций + самостоятельные команды |
| Organization.planId | Организация | Команды, проекты, хранилище в рамках организации |
Grace period при понижении
При переходе на тариф с меньшими лимитами действует 30-дневный льготный период:
previousPlanId+planChangedAtсохраняются на User/OrganizationQuotaService.getEffectiveLimitsForUser/Org()возвращает MAX лимитов старого и нового тарифа- Через 30 дней применяются строгие лимиты нового тарифа
gracePeriodDaysLeftвозвращается вQuotaInfo- Апгрейд применяется мгновенно (очищает previousPlanId)
API Endpoints
| Метод | Путь | Описание |
|---|---|---|
GET | /api/plans | Список доступных тарифов |
GET | /api/users/me/quota | Информация о квоте пользователя |
PATCH | /api/users/me/plan | Сменить тариф пользователя |
GET | /api/organizations/by-slug/:slug/quota | Квота организации |
PATCH | /api/organizations/by-slug/:slug/plan | Сменить тариф организации |
GET | /api/teams/by-slug/:teamSlug/quota | Квота команды |
Проверка квот
Квоты проверяются перед созданием ресурсов:
checkCanCreateOrganization()— лимит организаций пользователяcheckCanCreateTeam()— лимит команд в организацииcheckCanCreateProject()— лимит проектовcheckStorageQuota()— лимит хранилища
Фронтенд
Store тарифов
typescript
const store = usePlansStore()
const { plans, currentPlan, userQuota } = storeToRefs(store)
await store.fetchPlans()
await store.fetchUserQuota()
await store.selectPlan(planId)Компоненты
PlanSelectionView.vue(/settings/plan) — страница выбора тарифаPlanTable.vue— таблица сравнения тарифов- Grace period banner — предупреждение о льготном периоде при понижении
Ключевые детали реализации
- Enterprise тариф скрыт от обычных пользователей (
public: false) - Администраторы видят все тарифы через
GET /admin/plans - Хранилище пересчитывается ежедневно в 3:00 (cron) из таблицы файлов
QuotasProcessor(Bull queue) — фоновый cron для истечения grace period