Тот же root-app, скоуп по countryId. Глобальный суперадмин (isAdmin) видит всё; член орг-администратора страны — только свою страну по platform.* permissions. Новая группа сайдбара — «Биллинг».
Таблица в паттерне остальных страниц root (Countries, Permissions). Правка — в Drawer справа.
| План | Тарификация | Видимость | Perms | Фичи | Бандлы | Статус | |
|---|---|---|---|---|---|---|---|
| Бесплатный по умолчанию | Бесплатный | public | 12 | 6 | — | active | ⋯ |
| Trial 14 дн | Триал | hidden | 18 | 6 | — | active | ⋯ |
| Старт | Платный | public | 24 | 8 | 3 | active | ⋯ |
| Бизнес | Платный | public | 41 | 12 | 4 | active | ⋯ |
| Enterprise | Платный | hidden | 62 | 15 | custom | draft | ⋯ |
isDefault план — назначается новой орг автоматически при создании, без бандлов и инвойсов, статус подписки всегда active. Базовый уровень freemium; апгрейд на платный — по желанию.Permissions — мультиселект из каталога apps/auth (потолок орг). Фичи — из каталога с per-plan лимитом и политикой овеража. Эффективное право = role-perms ∩ plan.allowedPermissions.
Выбери режим в списке → появится поле лимита. «Лимит + доплата» добавляет поле цены за превышение (c/шт). «Безлимит» скрывает лимит. bool-фичи — только флаг вкл/выкл. Модель: limit (null → ∞) + overagePolicy + overageUnitPrice.
Фичи — key, тип (bool / state / flow), единица.
| key | Тип | Ед. |
|---|---|---|
branches | quota_state | шт |
couriers | quota_state | шт |
orders_pm | quota_flow | /мес |
online_pay | boolean | — |
Бандлы — цена за период: month / quarter / half_year / year / custom.
Просмотр / активация / продление / отмена, история инвойсов, ручная отметка оплаты (v1 без автосписания).
| Инвойс | Период | Сумма | Статус | paymentRef | |
|---|---|---|---|---|---|
INV-104 | июн — сен 2026 | 3 200 c | pending | odengi:q_88… | |
INV-097 | мар — июн 2026 | 3 200 c | paid | odengi:q_71… | ✓ 03.03 |
paid → период продлён автоматически.Суперадмин назначает одну орг на страну (country_admin: countryId unique, orgId unique). Её платёжная интеграция собирает оплату подписок страны.
| Страна | Орг-администратор | Платёжная интеграция | Продажи планов | |
|---|---|---|---|---|
| 🇰🇬 Кыргызстан | ОсОО «Batele KG» | O!Dengi | открыты | Заменить |
| 🇰🇿 Казахстан | ТОО «Batele KZ» | нет интеграции | заблокированы | Заменить |
| 🇺🇿 Узбекистан | — не назначен | платформенная орг | открыты |
Нет орг-администратора → оплата на глобальную платформенную орг. Нет интеграции у ответственной орг → продажи в стране заблокированы.
Новый пункт «Подписка» в меню орг. Владелец видит план, usage vs лимиты и покупает бандлы ручной оплатой.
Только visibility: public планы. Скрытые (Trial / Enterprise) не показываются.
| Период | Сумма | Статус |
|---|---|---|
| июн—сен 2026 | 3 200 c | ожидает |
| мар—июн 2026 | 3 200 c | оплачен |
| дек—мар 2026 | 3 200 c | оплачен |
Орг доставки (курьеры). Тот же биллинг, акцент на state-квоте «курьеры» и flow-квоте «доставки/мес». Экраны — ключевые состояния энфорса.
Экраны говорят на этом языке. Статус подписки и тип квоты кодируются цветом и формой бейджа.
Новая орг стартует на бесплатном тарифе по умолчанию (isDefault) — постоянный базовый уровень, без бандлов и инвойсов. Триал — разовый апгрейд-превью платного плана. После истечения платного/триала без оплаты орг откатывается на бесплатный тариф (не в «нет доступа»).
limit = null. Проверка не считает, всегда allowed. Метр без числа, значок ∞.
overagePolicy = block. На пределе — hard-block действия. Метр краснеет, кнопка «добавить» задизейблена.
allow_overage + overageUnitPrice. Сверх лимита пропускаем, аккумулируем, инвойс в конце периода.
Филиалы, продукты, члены, курьеры. Считает сервис-владелец, subscription отдаёт только лимит. В UI — метр «текущее / лимит», блок «добавить» на пределе.
Заказы/мес, SMS. Централизованный счётчик в apps/subscription, идемпотентный ReportUsage(eventId). В UI — метр за период + политика овеража.
Источник правды — снапшот entitlements + live CheckFeature для денежных/квотных операций. Гейтвей: у члена есть permission И план орг разрешает И в пределах лимита.
| Статус | Платные фичи | Баннер | Основное действие | Данные |
|---|---|---|---|---|
| free | по фичам бесплатного плана | — (опц. «апгрейд») | Выбрать платный план | чтение+запись |
| trialing | полный доступ (план триала) | info · «осталось N дней» | Выбрать план | чтение+запись |
| active | по фича-флагам + лимитам | — | Продлить (в конце периода) | чтение+запись |
| grace | ещё работают | warn · «grace до DD.MM» | Оплатить сейчас | чтение+запись |
| past_due | hard-block | crit · «не оплачено» | Оплатить | read-only фолбэк |
| expired | откат на бесплатный тариф | crit · «платный истёк» | Выбрать план | чтение+запись (по free) |
| canceled | до конца периода | warn · «доступ до DD.MM» | Возобновить | до конца периода |
block — жёсткий стоп на лимите. allow_overage — пропускаем, аккумулируем usage, инвойс в конце периода по overageUnitPrice. Метр краснеет + «+N сверх лимита, к счёту X».count(*) vs лимит из снапшота, блок «добавить». flow (заказы/SMS) — live CheckFeature gRPC, источник шлёт ReportUsage.Видны только public-планы. Если у ответственной орг страны нет платёжной интеграции — кнопка оплаты задизейблена (прекондишн).
subscription_invoice = pending, paymentRef = ссылка в payment-system на интеграцию администрирующей орг (страна→орг-админ, иначе глобальная).
Пользователь платит. Модалка показывает QR + статус «ждём подтверждение».
Идемпотентно по paymentRef. Инвойс paid → период продлён → entitlementsVersion++ → снапшот в токене инвалидируется.
Баннер снят, статус active, лимиты нового плана. Фолбэк: суперадмин отмечает оплату вручную в root, если вебхук не пришёл.
autoRenew) — база заложена, no-op до карточной интеграции.