> ## Documentation Index
> Fetch the complete documentation index at: https://faq.exode.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Подписка и тарифы

> Как устроена подписка школы, что даёт тариф, ограничения и сегменты, как управлять подпиской

Подписка школы определяет, какие возможности и лимиты доступны в вашем пространстве. От тарифа зависит
и набор функций (`SchoolFeatures`), и числовые ограничения (максимум учеников, менеджеров, продуктов
и т.д.), и видимость части разделов интерфейса.

<Note>
  Не путайте два разных «subscription» в проекте. Тарифы школы — это то, о чём эта страница
  (`src/store/platform/school`, `Manage/School/Subscription`). А стор `src/store/subscription` относится
  к real-time подпискам (WebSocket-события чатов, турниров, статусов) и к тарифам школы отношения не имеет.
</Note>

## Как устроена подписка школы

Тариф школы хранится как «доступ к продукту» (`access`) с привязанной ценой (`price`). Именно из этой
цены приложение берёт набор SaaS-возможностей школы. В сторе `SchoolStore` это выражено так:

```javascript theme={null}
/** Список возможностей школы */
get features() {
    return {
        ...toJS(this.school?.access?.price?.meta?.schoolSaasFeatures),
        ...this.config.customSaasFeatures,
    } as Partial<SchoolFeatures>;
}
```

То есть итоговый набор возможностей — это возможности тарифа (`schoolSaasFeatures`), поверх которых
могут накладываться индивидуальные настройки школы (`customSaasFeatures`).

Данные доступа приходят в фрагменте цены и включают тип, сумму, срок доступа и метаданные:

```graphql theme={null}
fragment SchoolPriceFragment on ProductPriceEntity {
    id
    type
    title
    amount
    active
    accessDays
    description
    previousAmount
    product {
        id
        currency
    }
    meta {
        override {
            slug
            tags
            title
            description
        }
        schoolSaasFeatures {
            maxApiKeys
            hidePoweredByExode
        }
    }
}
```

### Тип и валюта тарифа

Тип цены (`ProductPriceType`) определяет модель оплаты, а валюта (`ProductCurrency`) — в чём выставлен
тариф.

| `ProductPriceType` | Значение                 |
| ------------------ | ------------------------ |
| `Subscription`     | Регулярная подписка      |
| `OneTime`          | Разовая оплата           |
| `Installment`      | Рассрочка                |
| `Demo`             | Демо-доступ              |
| `ExternalLink`     | Оплата по внешней ссылке |

Поддерживаемые валюты (`ProductCurrency`): `Rub`, `Usd`, `Eur`, `Kzt`, `Uzs`, `Exes`, а также `Free`
для бесплатного доступа.

## Что даёт тариф

Тариф раскрывает возможности школы (булевы флаги) и задаёт числовые лимиты. Полный список полей —
из типа `SchoolFeatures`.

### Возможности (флаги)

| Флаг                 | Возможность                          |
| -------------------- | ------------------------------------ |
| `courseCreation`     | Создание курсов и уроков             |
| `practiceCreation`   | Практические задания                 |
| `autoTests`          | Автоматические тесты                 |
| `webinarCreation`    | Вебинары                             |
| `onlinePayments`     | Приём онлайн-платежей                |
| `educationAnalytics` | Аналитика обучения                   |
| `financialAnalytics` | Финансовая аналитика                 |
| `gamification`       | Геймификация                         |
| `messenger`          | Мессенджер / чаты                    |
| `calendar`           | Календарь                            |
| `storiesAndReels`    | Истории и Reels                      |
| `articlesAndBlog`    | Статьи и блог                        |
| `marketingTools`     | Маркетинговые инструменты            |
| `autoFunnels`        | Автоворонки                          |
| `integrations`       | Интеграции                           |
| `customDesign`       | Кастомный дизайн                     |
| `customCode`         | Собственный CSS/JS                   |
| `customDomain`       | Свой домен                           |
| `whiteLabel`         | White Label                          |
| `hidePoweredByExode` | Скрытие брендинга «Powered by Exode» |
| `personalManager`    | Персональный менеджер                |
| `prioritySupport`    | Приоритетная поддержка               |

### Числовые лимиты

| Лимит               | Что ограничивает                        |
| ------------------- | --------------------------------------- |
| `maxUsers`          | Максимум учеников (пользователей)       |
| `maxManagers`       | Максимум менеджеров / сотрудников школы |
| `maxActiveProducts` | Максимум активных продуктов (курсов)    |
| `maxStorageSize`    | Объём файлового хранилища               |
| `maxApiKeys`        | Максимум API-ключей                     |

<Warning>
  Значения флагов и лимитов задаёт тариф — они не редактируются владельцем школы вручную из интерфейса.
  Чтобы расширить лимиты или включить возможность, нужно перейти на подходящий тариф.
</Warning>

## Ограничения и сегменты: Corporate vs Commerce

У варианта «Школа» есть два под-сегмента (`SchoolSegment`), которые влияют на набор видимых разделов
интерфейса. Сегмент фиксируется на уровне школы.

| Сегмент             | Значение `SchoolSegment` | Пространство `PageSpace` | Признак в коде       |
| ------------------- | ------------------------ | ------------------------ | -------------------- |
| Коммерческая школа  | `Commerce`               | `SchoolCommerceSegment`  | сегмент по умолчанию |
| Корпоративная школа | `Corporate`              | `SchoolCorporateSegment` | `IS_CORPORATE`       |

Определение сегмента в `src/env.tsx` и `SchoolStore`:

```javascript theme={null}
export const IS_CORPORATE: boolean = SCHOOL?.segment === SchoolSegment.Corporate;

export const CURRENT_SCHOOL_SEGMENT = IS_CORPORATE
    ? PageSpace.SchoolCorporateSegment
    : PageSpace.SchoolCommerceSegment;
```

```javascript theme={null}
/** Является ли школа корпоративной */
get isCorporate() {
    return this.segment === SchoolSegment.Corporate;
}
```

<Note>
  Корпоративный сегмент ориентирован на внутреннее обучение, поэтому часть коммерческих разделов
  (например, связанных с публичной продажей) в нём скрывается. Сегмент школы задаётся при её настройке
  и не меняется владельцем через обычный интерфейс.
</Note>

## Как управлять подпиской

Раздел управления подпиской находится в панели школы: **Управление → Подписка и тариф**
(`pages.Manage.School.Subscription`).

<Steps>
  <Step title="Откройте раздел подписки">
    В панели управления школой перейдите в «Подписка и тариф».
  </Step>

  <Step title="Выберите тариф">
    Страница показывает актуальные тарифы. Сравните возможности и лимиты и выберите подходящий.
  </Step>

  <Step title="Оформите подписку">
    Оплата и оформление проходят на странице тарифов; после подтверждения возможности школы обновляются.
  </Step>
</Steps>

<img src="https://mintlify.s3.us-west-1.amazonaws.com/exode-faq/images/online-schools/getting-started/subscription-page.png" alt="Страница «Подписка и тариф» в панели школы" />

<Note>
  Страница управления подпиской реализована как встроенный iframe с центрального сервиса тарифов Exode
  (`EXODE_SUBSCRIPTION_IFRAME_URL` → `https://home.exode.biz/.../pricing/iframe`), а не как отдельный
  экран внутри приложения. Поэтому оформление тарифа происходит на стороне этого сервиса, а список
  активных тарифов приложение может получать запросом `schoolPriceFindManyActive` (по валюте).
</Note>

```graphql theme={null}
query SchoolPriceFindManyActive($currency: ProductCurrency!) {
    schoolPriceFindManyActive(currency: $currency) {
        ...SchoolPriceFragment
    }
}
```

<Tip>
  Язык страницы тарифов подхватывается автоматически из текущего языка приложения — он передаётся
  в iframe параметром `?lang=`.
</Tip>
