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

# Лимиты и тарификация

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

Полный перечень полей — в [глоссарии](/ru/logic/company-billing/limits-glossary).

## Что описывает этот раздел

Раздел отвечает за то, **сколько ресурсов разрешено компании** (сотрудники, точки, техника) и **сколько это стоит**. Здесь три части, которые работают вместе:

1. **Лимит компании** — сколько разрешено и сколько уже используется по каждому виду ресурса.
2. **Цена лимита за период** — прайс за единицу лимита на 1, 3, 6 или 12 месяцев, с возможностью глобальной и персональной цены.
3. **Фоновый пересчёт** — задача, которая сверяет фактическое использование с реальными данными компании и обновляет счётчик.

## Типы нормируемых ресурсов

Лимиты и цены применяются к фиксированному перечню ресурсов:

| Ресурс       | Что считается                                 |
| ------------ | --------------------------------------------- |
| Сотрудники   | активные сотрудники компании                  |
| Точки аренды | действующие (не отключённые) точки            |
| Автомобили   | активные единицы техники с типом «автомобиль» |
| Самокаты     | активные единицы техники с типом «самокат»    |
| Мотоциклы    | активные единицы техники с типом «мотоцикл»   |

<Note>
  **Подписание документов в этот перечень не входит и лимитом плана не нормируется.** Оно тарифицируется отдельно — режимом биллинга подписания, который платформа назначает компании; сама компания режим не выбирает:

  * **«За SMS»** (режим по умолчанию) — компания платит только за сообщения подписания со своего SMS-баланса; пакеты подписей в этом режиме не расходуются и подписание ничем не ограничивают.
  * **«За документ»** — компания платит за каждый подписываемый документ одним слотом из купленного пакета подписей (один слот на документ, сколько бы у него ни было подписантов); при нулевом остатке слотов отправка ссылки на подписание и кода подтверждения блокируется.

  Пакеты подписей и их остаток описаны в [«Пакетах, балансе и квотах подписи»](/ru/logic/documents/packages); лимитов подписки типа «подписание документов» в системе нет.
</Note>

## Модель данных

### Лимит компании

Одна запись описывает лимит по одному виду ресурса для одной компании. Пара «компания + тип ресурса» уникальна — то есть на каждый ресурс у компании ровно одна строка лимита.

| Поле               | Тип                       | Назначение                                                         |
| ------------------ | ------------------------- | ------------------------------------------------------------------ |
| Компания           | связь                     | владелец лимита                                                    |
| Тип ресурса        | выбор                     | нормируемый ресурс из перечня                                      |
| Текущее количество | число                     | фактически используемое количество; обновляется фоновым пересчётом |
| Лимит              | число (может быть пустым) | максимально разрешённое количество                                 |
| Бесплатный лимит   | число                     | количество, доступное без оплаты                                   |
| Конец действия     | дата (**обязательное**)   | конец периода действия лимита                                      |

<Note>
  Если поле «Лимит» пустое (не задано), ограничение по этому ресурсу не заполнено — это отдельное состояние, отличное от нуля.
</Note>

**Срок действия обязателен, и он один.** У лимита есть только дата окончания: если её не указали при создании, подставляется «сегодня + 1 месяц» по календарю. Даты начала у лимита нет — она ничего не решала, а расчёту нужна именно опорная дата окончания, от которой считается пропорция за остаток срока. Какой период был куплен и когда, фиксирует позиция счёта.

**Единственный владелец срока — оплата.** Срок лимита ставится при провижининге по позициям подтверждённого счёта и больше ниоткуда не перезаписывается: автоматического выравнивания сроков всех лимитов по дате окончания подписки «аренда» в системе нет.

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

**Сброс кэша.** Лимиты компании кэшируются под ключом, привязанным к компании. При любом сохранении записи лимита кэш лимитов этой компании автоматически сбрасывается, чтобы следующее чтение взяло свежие значения.

### Цена лимита за период

Одна запись задаёт стоимость единицы лимита для конкретного ресурса и длительности периода. Уникальна тройка «компания + тип ресурса + длительность периода».

| Поле                 | Тип                       | Назначение                                                                 |
| -------------------- | ------------------------- | -------------------------------------------------------------------------- |
| Компания             | связь (может быть пустой) | если пусто — цена глобальная; если задана — персональная для этой компании |
| Тип ресурса          | выбор                     | нормируемый ресурс                                                         |
| Длительность периода | число (месяцы)            | поддерживаются только 1, 3, 6 и 12 месяцев                                 |
| Цена                 | число (2 знака)           | стоимость единицы лимита за указанный период                               |

<Info>
  Цена бывает двух уровней. **Глобальная** (компания не указана) действует для всех. **Персональная** (указана конкретная компания) переопределяет глобальную для этой компании. Персональная всегда в приоритете.
</Info>

## Как подбирается цена

### Точный расчёт по периоду

Основной способ получить цену — запросить её для конкретной компании, ресурса и длительности периода. Логика:

1. Если запрошен период вне списка 1 / 3 / 6 / 12 месяцев — операция завершается ошибкой (недопустимый период).
2. Ищутся строки цены по нужному ресурсу и периоду, где компания либо не указана (глобальная), либо совпадает с запрошенной (персональная).
3. Из найденного выбирается **персональная цена, если она есть**, иначе глобальная.
4. Если ни персональной, ни глобальной цены нет — операция завершается ошибкой «цена не настроена».

### Как цена применяется при покупке

Сам подбор цены отвечает только на вопрос «сколько стоит единица за такой период». Как из этой цены получается сумма к оплате — сколько единиц тарифицируется, берётся ли полный период или пропорция за остаток срока, какой период подбирается автоматически — описано на странице [«Расчёт стоимости и регистрация оплаты»](/ru/logic/company-billing/pricing).

### Цена «на лету» в списках лимитов

При выборке лимитов к каждой строке автоматически подставляется поле цены. Подбор идёт по тому же принципу приоритета персональной цены над глобальной, а если подходящей цены нет вообще — подставляется ноль (а не ошибка).

<Warning>
  Подстановка цены в список лимитов **не учитывает длительность периода** — она подбирает цену только по ресурсу и приоритету «персональная над глобальной». Если для одного ресурса заведены цены сразу на несколько периодов (1/3/6/12 месяцев), в список попадёт цена одного из этих периодов без гарантии, какого именно. Для однозначного результата нужен точный расчёт по конкретному периоду.
</Warning>

## Пересчёт фактического количества

Фоновая задача сверяет «Текущее количество» в лимите с реальным положением дел в компании и при расхождении обновляет счётчик.

### Как запускается

Задача работает **только внутри контекста конкретной компании** — если контекст компании не установлен, она молча завершается, ничего не делая. У задачи ограничение частоты: не чаще 10 запусков в минуту.

### Что и как пересчитывается

Задача принимает вид ресурса для пересчёта и флаг «слать уведомление». По виду ресурса считается фактическое количество:

| Ресурс                            | Что берётся в подсчёт                                                                        |
| --------------------------------- | -------------------------------------------------------------------------------------------- |
| Сотрудники                        | сотрудники компании, помеченные как персонал, с активной учётной записью                     |
| Точки аренды                      | точки компании, которые не отключены                                                         |
| Автомобили / Самокаты / Мотоциклы | единицы техники нужного типа, у которых есть действующая (не отключённая) карточка инвентаря |

Далее:

1. Берётся текущая строка лимита по этому ресурсу; если её нет — создаётся новая с нулевыми значениями.
2. Если новое фактическое количество отличается от сохранённого — сбрасывается кэш компании, счётчик обновляется и запись сохраняется.
3. При включённом флаге уведомления в конце отправляется веб-уведомление с новым значением счётчика в канал лимитов этой компании.

<Warning>
  Пересчёт рассчитан на вызов с указанием одного конкретного вида ресурса. Если вид ресурса не указан, задача работает некорректно: строка лимита ищется и создаётся с незаполненным типом ресурса (а не по каждому ресурсу отдельно), при подсчёте по очереди пробегаются все виды и итоговый счётчик перезаписывается последним из них, а попытка создать запись с незаполненным типом может завершиться ошибкой. Полноценного режима «пересчитать все виды сразу» здесь нет.
</Warning>

### Уведомление администратора о росте (фактически не срабатывает)

В задаче заложен код, который при **увеличении** количества должен отправлять администратору компании отдельное уведомление с заголовком вида «увеличение количества …» и текущим значением. Заголовки заготовлены для всех пяти видов ресурсов.

На практике это уведомление не отправляется никогда: рост определяется сравнением нового количества с сохранённым счётчиком уже **после** того, как счётчику присвоено это же новое значение, поэтому условие всегда ложно.

<Note>
  В коде отдельно перечислен сокращённый набор из трёх ресурсов (сотрудники, точки аренды, автомобили) — судя по всему, как предполагаемый список «уведомляемых». Но сама проверка на него не опирается: она срабатывает по общему перечню заголовков, заведённому для всех пяти видов ресурсов. Так что деление на «уведомляемые» и «не уведомляемые» ресурсы в поведении не реализовано, а само уведомление в любом случае не отправляется.
</Note>

## Как это используется

* **Лимит компании** — источник правды о том, сколько ресурсов разрешено компании; заполняется при провижининге плана и корректируется при оплате инвойса.
* **Цена лимита за период** — прайс, по которому считается стоимость расширения лимита; отсюда берутся суммы при выставлении счёта.
* **Пересчёт** — держит поле «Текущее количество» в актуальном состоянии, чтобы можно было сравнивать фактическое использование с разрешённым лимитом.

## Связанные страницы

<CardGroup cols={2}>
  <Card title="Глоссарий: Лимиты и тарификация" icon="book" href="/ru/logic/company-billing/limits-glossary">
    Полный перечень полей лимита и цены лимита за период.
  </Card>

  <Card title="Компании и биллинг (подписки, платежи)" icon="building" href="/ru/logic/company-billing">
    Обзорная страница модуля со всеми его разделами.
  </Card>

  <Card title="Создание компании и её адрес" icon="building" href="/ru/logic/company-billing/setup">
    Модель компании и её домены, генерация новой компании с дефолтными данными и регистрация владельца.
  </Card>

  <Card title="Инвойсы и платежи" icon="file-invoice-dollar" href="/ru/logic/company-billing/invoices">
    Счета и их позиции, расчёт суммы, инициация оплаты и обработка вебхуков.
  </Card>

  <Card title="Карты и автосписания" icon="credit-card" href="/ru/logic/company-billing/cards">
    Сохранённые платёжные карты компании и их привязка к автоматическим списаниям.
  </Card>

  <Card title="Платёжные шлюзы" icon="money-bill-transfer" href="/ru/logic/company-billing/gateways">
    Интеграция с платёжным шлюзом (подпись, инициация платежа и карты, возвраты) и устаревший клиент.
  </Card>

  <Card title="Онбординг, новости и статистика" icon="chart-line" href="/ru/logic/company-billing/onboarding-news-stats">
    Шаги онбординга компании, лента новостей и снапшоты системной статистики.
  </Card>
</CardGroup>
