> ## 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/rent/pricing-glossary).

## Что делает движок пересчёта

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

Вся арифметика по строкам считается на стороне базы данных одним набором выражений, а не в цикле на Python — движок формирует запрос с расчётными полями, база возвращает готовые числа, и они складываются в итоги аренды.

<Info>
  Эта страница — единый справочник по деньгам аренды: и «дирижёр» пересчёта (что за чем происходит, куда попадают скидки, когда запускается пересчёт прибыли), и точные формулы — стоимость строки в двух режимах, стоимость услуги, скидки и налог. Устройство самих тарифов (записи цен, интервалы тарификации, цены комплектов) описано в разделе [«Тарифы и цены»](/ru/logic/inventory/tariffs), а формула штрафа за просрочку — в разделе [«Депозиты и штрафы»](/ru/logic/rent/deposits-penalties).
</Info>

## Когда запускается пересчёт

Пересчёт вызывается автоматически после действий, меняющих состав или деньги аренды. У процедуры есть два независимых переключателя:

| Переключатель           | Назначение                                           |
| ----------------------- | ---------------------------------------------------- |
| Пересчитывать инвентарь | Обновлять ли цены, скидки и штрафы позиций инвентаря |
| Пересчитывать услуги    | Обновлять ли цены услуг                              |

Итоговые суммы самой аренды пересобираются всегда, независимо от переключателей; переключатели влияют только на то, будут ли переписаны цены в самих строках позиций и услуг. Это позволяет, например, пересчитать общий итог, не трогая вручную зафиксированные цены строк.

<Warning>
  Если аренда помечена как удалённая (в архиве), пересчёт немедленно завершается: он лишь снимает связанные списания по графику и ничего не считает. Архивная аренда не участвует в перерасчёте сумм.
</Warning>

## Формулы расчёта стоимости

### Тариф «замораживается» в строке аренды

Тариф не читается динамически при каждом пересчёте. При добавлении инвентаря в аренду цена тарифа и длительность тарифа **копируются** из действующего тарифа и его интервала времени в строку инвентаря. Если у тарифа не задан интервал времени, длительность по умолчанию — **1 день**. Дальнейшее изменение прайса компании на уже созданную аренду не влияет. Для услуги снимок берётся аналогично, но **только когда тариф действительно сменили**: в строку записываются цена тарифа и длительность соответствующего интервала (а при его отсутствии — 1 день). Устройство самих записей тарифов описано в разделе [«Тарифы и цены»](/ru/logic/inventory/tariffs).

<Note>
  Цена тарифа в строке — это **редактируемый снимок**, а не копия прайса, которую система постоянно подтягивает заново. Заданная вручную цена за период сохраняется: ни последующие сохранения строки, ни пересчёты аренды её не сбрасывают к тарифной. Тарифная цена подставляется повторно только при реальной смене тарифа в строке.
</Note>

### Стоимость одной строки инвентаря

Ядро расчёта — стоимость одной строки инвентаря.

<Info>
  **Словами:** количество оплачиваемых периодов = длительность аренды, делённая на длительность тарифа, с округлением **вверх**. Стоимость строки = цена тарифа × количество оплачиваемых периодов. Продажа и тариф с нулевой длительностью оплачиваются один раз по цене тарифа. Итоговая стоимость строки не может быть отрицательной.
</Info>

где:

* **Длительность аренды строки** измеряется в секундах. В режиме по умолчанию это точная разница между плановым (или фактическим) окончанием и началом, не меньше нуля; при включённом посуточном графике это число оплачиваемых календарных суток, умноженное на длину суток.
* **Округление вверх** означает, что неполный период всегда тарифицируется как полный.
* **Длительность тарифа** — это длительность одного интервала тарификации.

<Warning>
  «Количества» как отдельного множителя в формуле **нет**. Каждая физическая единица инвентаря — это отдельная строка аренды со своей ценой; несколько единиц = несколько строк. Итог по аренде — это сумма стоимостей всех строк.
</Warning>

#### Два режима: непрерывное время и посуточный график

Ключевая развилка ценообразования — флаг функции **«Посуточный график платежей»** (по умолчанию **выключен**). Он определяет, как измеряется длительность аренды и появляется ли у аренды план платежей по дням. Полный перечень настроек — на странице ««Флаги функций»».

<AccordionGroup>
  <Accordion title="Непрерывное время (по умолчанию, флаг выключен)">
    Длительность аренды — это **точная разница во времени** в секундах между окончанием и началом (не меньше нуля). Число оплачиваемых периодов округляется вверх исходя из точного хронометража, неполный период тарифицируется как полный.

    * Нет понятия «нерабочих дней»: оплачивается всё время подряд.
    * План платежей по дням **не создаётся**, посуточные списания не выполняются.

    Пример: тариф «сутки» (86400 секунд), аренда на 25 часов (90000 секунд) → округление вверх (90000 / 86400) = 2 периода.
  </Accordion>

  <Accordion title="Посуточный график (флаг включён)">
    Длительность = число оплачиваемых **календарных суток** × длина суток. Считаются календарные даты в диапазоне аренды за вычетом нерабочих дней; окончание ровно в полночь не засчитывает последний день. Здесь важен не хронометраж, а количество затронутых календарных дней. Дополнительно включаются нерабочие дни, бесплатный первый день и план платежей по дням.

    Как именно набираются оплачиваемые дни, как работают выходные и бесплатный первый день, как строится план платежей и распределяются оплаты — подробно разобрано в разделе [«График оплат, паузы и рабочие дни»](/ru/logic/rent/schedule). Здесь достаточно знать, что в этом режиме множитель периодов берётся из числа оплачиваемых суток.
  </Accordion>

  <Accordion title="Пример: одна и та же аренда в двух режимах">
    Аренда одной единицы с тарифом **10 000 / сутки**, с понедельника 00:00 по субботу 00:00 (окончание в полночь → суббота не считается, остаётся 5 дней: Пн–Пт). Выходных по графику нет, «Плата за первый день» выключена.

    **Непрерывное время (по умолчанию):** длительность = 5 × 86400 секунд → 5 периодов → стоимость = 10 000 × 5 = **50 000**. Плана по дням нет.

    **Посуточный график:** первый день (Пн) становится бесплатным → оплачиваемых суток 4 (Вт–Пт) → стоимость = 10 000 × 4 = **40 000**. Создаётся 5 дневных строк: Пн — 0 (нерабочий), Вт/Ср/Чт/Пт — по 10 000.

    Итог: тот же тариф даёт **50 000** в режиме непрерывного времени и **40 000** в посуточном графике — из‑за бесплатного первого дня и посуточного счёта.
  </Accordion>
</AccordionGroup>

### Стоимость услуги

Правило для услуги такое же по смыслу:

* Если тариф услуги — **разовый платёж**, стоимость равна цене тарифа.
* Если длительность тарифа равна нулю, стоимость также равна цене тарифа (разовая оплата).
* Иначе стоимость = цена тарифа × округлённое **вверх** число периодов (длительность услуги, делённая на длительность тарифа).

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

<Note>
  Это **единственная** формула цены услуги. Раньше рядом с ней жила упрощённая копия, которая считала цену по длительности всей аренды и без скидок; при частичном периоде услуги или включённом посуточном графике две формулы расходились, и до следующего полного пересчёта клиент видел неверную сумму. Копия убрана: цену и цену со скидкой пишет только пересчёт сумм аренды, и он запускается при создании, изменении и удалении строки услуги.
</Note>

### Числовые примеры (без скидок)

<AccordionGroup>
  <Accordion title="Пример 1. Посуточная аренда, 3 суток, тариф 5000">
    Цена тарифа = 5000, длительность тарифа = 1 день (86400 секунд), аренда ровно 72 часа (259200 секунд).
    Округление вверх (259200 / 86400) = 3 → стоимость строки = 5000 × 3 = 15000.
    Без скидок и налога: сумма за инвентарь = 15000, стоимость без скидки = 15000, итоговая стоимость = 15000.
  </Accordion>

  <Accordion title="Пример 2. Неполный период округляется вверх">
    Тот же тариф (сутки, 5000), аренда 25 часов (90000 секунд).
    Округление вверх (90000 / 86400) = 2 → стоимость строки = 5000 × 2 = 10000. За «лишний» час клиент платит как за полные сутки.
  </Accordion>

  <Accordion title="Пример 3. Продажа">
    Тип строки — продажа, цена тарифа = 20000. Длительность игнорируется — стоимость строки = цена тарифа = 20000 вне зависимости от периода.
  </Accordion>
</AccordionGroup>

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

Ключевая для этой под-области сущность — **Скидка аренды**: одна применённая скидка с рассчитанной суммой. Именно её поля определяют, к какому уровню относится скидка.

| Поле                       | Тип                       | Назначение                                                                          |
| -------------------------- | ------------------------- | ----------------------------------------------------------------------------------- |
| Аренда                     | связь                     | Аренда, к которой относится скидка                                                  |
| Позиция инвентаря          | связь (может быть пустой) | Заполнено — скидка на конкретную позицию инвентаря                                  |
| Услуга                     | связь (может быть пустой) | Заполнено — скидка на конкретную услугу                                             |
| Тип скидки                 | перечисление              | По справочнику или ручная сумма                                                     |
| Справочная скидка          | связь                     | Ссылка на скидку из справочника (процент или фиксированная сумма)                   |
| Сумма скидки               | число (2 знака)           | Итоговая рассчитанная сумма скидки в деньгах                                        |
| Действует с / Действует по | дата                      | Ограничение действия скидки внутри периода аренды                                   |
| По графику / Сумма за день | флаг / число              | Скидка, распределённая по дням графика фиксированной суммой за день                 |
| Назначение скидки          | перечисление              | Куда относится скидка **уровня аренды**: вся аренда / инвентарь / услуги / доставка |

Суммы результата пересчёта складываются в саму аренду: стоимость инвентаря и стоимость инвентаря со скидкой, стоимость услуг и стоимость услуг со скидкой, стоимость без скидки, итоговая стоимость, сумма налога, суммы скидок (общая, на инвентарь, на услуги), автоматический и ручной штраф, оплаченная сумма.

## Логика и побочные эффекты

### Общий порядок пересчёта

1. Аренда блокируется на запись (чтобы параллельные пересчёты не затёрли друг друга), вся процедура идёт в одной транзакции.
2. Для каждой позиции инвентаря считаются базовая стоимость, автоматический штраф за просрочку и стоимость со скидкой.
3. Для каждой услуги считаются стоимость и стоимость со скидкой.
4. Строки суммируются в итоги инвентаря и услуг.
5. Если включены соответствующие переключатели — новые цены записываются обратно в строки (только для тех строк, где значение изменилось).
6. Пересчитываются итоги аренды: оплаченная сумма, дополнительная скидка, штрафы, налог, итоговая стоимость, суммы скидок, длительности.
7. Автоматически уточняется статус: если есть просрочка — «просрочка», иначе «в аренде» (только для арендов, уже находящихся в этих двух статусах; статусы «заявка», «бронь», «отмена», «завершена» этот шаг не трогает).
8. Аренда сохраняется, затем пересчитываются суммы самих строк скидок, обновляется занятость склада и при необходимости ставится задача пересчёта прибыли.

<Note>
  Оплаченная сумма пересчитывается из успешных платежей аренды (черновые платежи-выписки исключаются). Статус оплаты в этой процедуре напрямую не выставляется — он выводится из сумм. Жизненный статус аренды здесь меняется только между «в аренде» и «просрочка» (см. шаг 7); остальные статусы процедура не трогает.
</Note>

### Куда относится скидка: уровень аренды против уровня позиции

Это центральное различие всей механики скидок. Скидка может быть привязана к конкретной строке или ко всей аренде, и от этого зависит, в какой расчёт она попадает.

**Скидка уровня позиции** — у неё заполнена ссылка на позицию инвентаря или на услугу. Такая скидка уменьшает цену именно этой строки и никакой другой.

**Скидка уровня аренды** — у неё не заполнена ни позиция, ни услуга. Куда её отнести, определяет поле «Назначение скидки»:

| Назначение | Куда попадает при разложении по строкам                                      |
| ---------- | ---------------------------------------------------------------------------- |
| Вся аренда | Учитывается и в подсчёте скидок по инвентарю, и в подсчёте скидок по услугам |
| Инвентарь  | Учитывается только в скидках по позициям инвентаря                           |
| Услуги     | Учитывается только в скидках по услугам                                      |
| Доставка   | Не входит ни в подсчёт по инвентарю, ни по услугам                           |

То есть при построении скидки по позиции инвентаря система берёт и скидки, привязанные к этой позиции, и скидки уровня аренды с назначением «вся аренда» или «инвентарь». При построении скидки по услуге — скидки, привязанные к этой услуге, и скидки уровня аренды с назначением «вся аренда» или «услуги». Скидка с назначением «вся аренда» распространяется одновременно на обе ветки.

<Warning>
  Не все скидки уровня аренды раскладываются по строкам. Процентные справочные скидки уровня аренды распределяются пропорционально по позициям. А вот **ручные скидки уровня аренды** и **фиксированные (в деньгах) справочные скидки уровня аренды** в разложение по строкам не попадают — в подсчёте по позициям их вклад равен нулю. Вместо этого они собираются в «Дополнительную скидку» аренды и вычитаются один раз из общего итога. Так фиксированная сумма скидки не «размазывается» по строкам, а уменьшает финальную сумму к оплате целиком.
</Warning>

#### Типы скидок и точные формулы

Скидка на аренде бывает четырёх типов: **процентная из справочника** (процент от базы, пропорционально дням), **фиксированная из справочника** (сумма из справочника), **ручная** (оператор задаёт сумму) и **скидка‑график** (ручная с признаком «по расписанию» — фиксированная сумма за каждый оплачиваемый день). Справочник скидок/промокодов (название, процент или сумма, период, лимит) — это шаблон уровня компании; применённая скидка либо ссылается на него, либо задаётся вручную.

Скидки считаются раздельно по трём корзинам (инвентарь, услуги, заказ целиком) и потом складываются. Расчёт суммы одной скидки для позиции инвентаря:

```text theme={null}
дней_скидки  = число оплачиваемых дней действия скидки (выходные исключены)
дней_аренды  = число оплачиваемых дней самой позиции инвентаря
цена         = базовая цена позиции

# Процентная скидка (из справочника, способ расчёта «Процент»):
сумма = min( цена, (дней_скидки × цена × величина скидки) / (100 × дней_аренды) )

# Фиксированная сумма на позицию (из справочника, задана позиция):
сумма = min( цена, величина скидки )

# Ручная на позицию (ручная, задана позиция):
сумма = min( цена, размер скидки, дней_скидки × цена / дней_аренды )

# Ручная / фиксированная на уровне заказа (позиция не задана):
сумма = размер скидки   # в подсчёте по инвентарю обнуляется, учитывается через «Дополнительную скидку»
```

Скидка на услугу — только **процентная из справочника**, без пропорции дней:

```text theme={null}
сумма = min( стоимость услуги, (стоимость услуги × величина скидки) / 100 )
```

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

#### Правила совмещения (стекинг)

Признак «Суммировать скидки» аренды (по умолчанию включён) — флаг на уровне **всей аренды**, а не отдельной позиции:

* **Включено** (актуальный путь): все применимые к позиции скидки суммируются, и результат вычитается из цены с отсечкой снизу нулём: итоговая цена позиции = max(цена − сумма всех скидок, 0).
* **Выключено** — устаревший путь: отдельно считаются процентные (позиционные) и суммовые скидки.

<Tip>
  Каждая отдельная скидка ограничена сверху ценой позиции, а итог по позиции — снизу нулём. Поэтому даже при стекинге стоимость позиции не уходит в минус.
</Tip>

#### Взаимодействие с бонусами и рефералами

Это **не** скидки и в итог через механизм скидок не попадают:

* **Бонусы лояльности** начисляются постфактум как процент от уже посчитанной итоговой суммы (бонус = итоговая сумма × процент бонуса / 100). Списание бонусов — отдельные операции, см. [«Клиенты, бонусы и рефералы»](/ru/logic/clients-loyalty).
* **Рефералы** живут в отдельном поле «Реферальное вознаграждение» со своей логикой и в формулу скидки не входят.

### Как складываются итоги аренды

После расчёта строк движок собирает итог по такой логике:

* **Стоимость без скидки** = стоимость инвентаря + стоимость услуг + стоимость доставки.
* **Дополнительная скидка** = сумма ручных скидок уровня аренды и фиксированных справочных скидок уровня аренды.
* Промежуточная сумма со скидкой = стоимость инвентаря со скидкой + стоимость услуг со скидкой − дополнительная скидка (при этом из дополнительной скидки вычитается только её положительная часть; отрицательное значение сумму не увеличивает).
* К этой сумме добавляются штрафы, затем налог (или налог считается «в том числе», если он включён в цену), и в самом конце — стоимость доставки.
* **Итоговая стоимость** — это то, что сравнивается с оплаченной суммой при подсчёте задолженности.

<Info>
  Стоимость доставки прибавляется к итогу уже **после** расчёта налога и никогда не облагается налогом в этой формуле. Штрафы, наоборот, входят в налоговую базу вместе с суммой со скидкой.
</Info>

Отдельно фиксируются суммы скидок: скидка на инвентарь (разница между стоимостью инвентаря и стоимостью инвентаря со скидкой), скидка на услуги (аналогично), и общая сумма скидки (инвентарь + услуги + дополнительная скидка).

Формулой это выглядит так (ставка налога применяется как доля — для 12% это 0,12):

```text theme={null}
дополнительная_скидка = max(дополнительная скидка аренды, 0)

база_к_оплате = округление(инвентарь со скидкой + услуги со скидкой − дополнительная_скидка, до целого)
сумма_налога  = округление((база_к_оплате + сумма штрафов) × доля налога, до целого)

# Налог включён в цену:
итоговая_стоимость = округление(база_к_оплате + сумма штрафов + стоимость доставки, до целого)
# Налог не включён в цену:
итоговая_стоимость = округление((база_к_оплате + сумма штрафов) × (1 + доля налога) + стоимость доставки, до целого)
```

<Accordion title="Пример: две единицы + услуга + налог 12% (не включён в цену)">
  Два одинаковых инвентаря по 15000 (2 строки) → сумма за инвентарь = 30000. Услуга «доставка», разовый платёж 3000 → сумма за услуги = 3000. Скидок и штрафов нет: база к оплате = 33000.

  Сумма налога = округление(33000 × 0,12) = 3960. Налог не включён в цену → итоговая стоимость = округление(33000 × 1,12) = **36960** — это итог к оплате.
</Accordion>

### Штрафы

Штраф аренды складывается из двух частей:

* **Автоматический штраф** — сумма автоматических штрафов по позициям за просрочку возврата (не начисляется, если штрафы у аренды отключены). Начисление штрафа полностью выключается, если аренда в статусе «заявка», «бронь» или «отмена», а также если у неё выставлен признак отключения штрафов.
* **Ручной штраф** — сумма штрафов аренды, заведённых вручную.

Итоговая сумма штрафа = автоматический + ручной. Формула автоматического штрафа за просрочку разобрана в разделе [«Депозиты и штрафы»](/ru/logic/rent/deposits-penalties).

### Пересчёт скидок в строках скидок

После сохранения аренды движок отдельным проходом пересчитывает поле «Сумма скидки» у самих записей скидок — по их типу (процент / фиксированная сумма / по графику) и по числу оплачиваемых дней. Это касается скидок уровня аренды, скидок по графику, скидок по позициям и по услугам.

<Note>
  Ручные скидки, привязанные к конкретной позиции или услуге (не по графику), при этом **не пересчитываются** — за ними сохраняется введённая вручную сумма. Пересчёту поддаются только скидки уровня аренды, скидки по графику и справочные скидки строк.
</Note>

### Автопродление и повторные проходы

Если у аренды включено автопродление и она находится «в аренде» или «в просрочке», движок дотягивает плановый конец до начала следующих суток и продлевает позиции. Когда текущий момент уже прошёл конец и позиции были продлены, аренда сохраняется и пересчёт запускается заново. Таких проходов может быть до 15; если за 15 проходов расчёт не сошёлся, в журнал пишется предупреждение и процедура завершается с последним результатом.

### Запуск пересчёта прибыли

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

* аренда в статусе «должник» или «завершена»;
* сумма прогнозной выручки по дням разошлась с итоговой стоимостью;
* сумма фактической выручки по дням разошлась с оплаченной суммой.

Если ничего не изменилось, пересчёт прибыли пропускается — это экономит фоновую работу. Сама дневная разбивка (плановая, прогнозная и фактическая выручка по дням) и правила её пересборки описаны отдельно. Подробнее: [«Прибыль и окупаемость»](/ru/logic/profit-payback).

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

### Предпросмотр итогов по нескольким арендам

Есть отдельный сводный адрес, который агрегирует деньги по отфильтрованному списку аренд и возвращает пять сумм:

| Поле                | Назначение                                   |
| ------------------- | -------------------------------------------- |
| Сумма цены          | Суммарная стоимость без скидки               |
| Сумма со скидкой    | Суммарная итоговая стоимость                 |
| Сумма налога        | Суммарная сумма налога                       |
| Сумма оплат         | Суммарная оплаченная сумма                   |
| Сумма задолженности | Сумма разниц «итоговая стоимость − оплачено» |

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

<Note>
  Этот адрес читает уже сохранённые в арендах суммы и сам пересчёт не запускает. Значения отражают состояние на момент последнего пересчёта. «Сумма задолженности» может оказаться отрицательной, если по арендам есть переплата.
</Note>

### Смена периода тарификации по позициям

Отдельный адрес помогает пересобрать тариф при смене периода тарификации для набора единиц (в том числе входящих в комплекты). На вход подаются новый период, список единиц вне комплектов и список комплектов с их единицами. Для каждой единицы система подбирает подходящий тариф по единице или её группе и возвращает форму с новым тарифом, ценой тарифа и длительностью периода. Если тариф под новый период не найден, единица пропускается; длительность по умолчанию — 1 сутки.

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

### Управление скидками аренды

Скидки аренды создаются, изменяются и удаляются через свои адреса. Для скидки «по графику» сумма за день и общая сумма рассчитываются автоматически по дням графика аренды (с ограничением по максимальной сумме дня в графике).

**Права на запись скидок.** Любая операция записи — добавление, изменение и **удаление** — требует двух вещей одновременно: права на работу со скидками аренды как таковыми и права на **тот тип скидки**, который получается в результате операции. Типов прав два: на скидку из справочника и на ручную скидку.

Ключевое правило: нужное право определяется **по наличию ссылки на справочник** в самой скидке, а не по типу, который прислал интерфейс.

| Операция                                                                        | Требуемое право                      |
| ------------------------------------------------------------------------------- | ------------------------------------ |
| Добавляется скидка со ссылкой на справочную скидку                              | Право на справочную скидку           |
| Добавляется скидка с суммой, но без ссылки на справочник                        | Право на ручную скидку               |
| Изменение, при котором ссылка на справочник снимается, а сумма задаётся вручную | Право на ручную скидку               |
| Удаление скидки                                                                 | Право по типу самой удаляемой скидки |

Суперпользователь компании проходит любую из этих проверок.

<Note>
  **Чтение списка скидок аренды намеренно оставлено доступным всем сотрудникам компании** — иначе страница аренды ломалась бы у ролей без права просмотра скидок. Ограничены только операции записи.
</Note>

Любое создание, изменение или удаление скидки автоматически пересобирает «Дополнительную скидку» аренды, поэтому итог остаётся согласованным даже до следующего полного пересчёта.

<Info>
  Форма создания/редактирования скидки принимает привязку к позиции инвентаря, но не даёт задать напрямую привязку к услуге или «Назначение скидки» — новые скидки по умолчанию получают назначение «вся аренда». Скидки уровня услуги и с иным назначением заводятся другими путями.
</Info>

## Особенности поведения

* Пересчёт сумм в строках скидок пропускает ручные скидки, привязанные к конкретной позиции или услуге (не по графику), — за ними сохраняется введённая вручную сумма.
* Право на тип скидки проверяется на всех операциях записи, включая удаление, и определяется по наличию ссылки на справочник, а не по типу, присланному интерфейсом; чтение списка скидок доступно всем сотрудникам компании.
* Цена и цена со скидкой строки услуги пишутся только пересчётом сумм аренды; сохранение самой строки обновляет лишь снимок тарифа, и только при реальной смене тарифа. Пересчёт запускается при создании, изменении и удалении строки услуги.
* Вручную заданная цена тарифа в строке (инвентаря или услуги) переживает пересчёты и сохраняется до следующей смены тарифа.
* Задача пересчёта прибыли ставится не всегда: только если статус «должник»/«завершена» или если дневные суммы прогноза/факта разошлись с итоговой стоимостью/оплатой; иначе пересчёт прибыли пропускается.
* Адрес-сводка сумм читает уже сохранённые поля аренд и сам пересчёт не запускает, поэтому показывает состояние на момент последнего пересчёта; «Сумма задолженности» может быть отрицательной при переплате.
* Адрес смены периода тарификации ничего не пишет в базу — возвращает только формы позиций с новым тарифом; применение и пересчёт происходят отдельным сохранением.
* Форма создания/редактирования скидки не отдаёт поля «Назначение скидки» и привязку к услуге, поэтому новые скидки через этот адрес всегда получают назначение «вся аренда» и не могут быть заданы как скидка уровня услуги.
* Автопродление выполняется в цикле до 15 проходов; если за 15 итераций расчёт не сошёлся, в журнал пишется предупреждение и возвращается последний результат.
* Стоимость доставки прибавляется к итогу после расчёта налога и налогом не облагается; штрафы, наоборот, входят в налоговую базу.
* Для удалённой (архивной) аренды пересчёт немедленно завершается: снимаются списания по графику, суммы не считаются.
* Начисление автоматического штрафа полностью выключается, если штрафы у аренды отключены или статус «заявка»/«бронь»/«отмена».
* Применение, редактирование или удаление любой скидки аренды автоматически запускает **полный пересчёт** аренды (цены строк, «Дополнительная скидка», штрафы, налог, итоги, статус и прибыль), поэтому итоговая сумма к оплате и метрики обновляются сразу, а не при следующем сохранении аренды.
* Весь пересчёт идёт в одной транзакции с блокировкой аренды на запись, чтобы параллельные пересчёты не затирали друг друга.
* Пересчёт напрямую меняет жизненный статус аренды только между «в аренде» и «просрочка» (по наличию просрочки) и только если аренда уже в одном из этих двух статусов; статусы «заявка»/«бронь»/«отмена»/«завершена» не трогаются.

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

<CardGroup cols={2}>
  <Card title="Глоссарий: Пересчёт сумм и цен" icon="book" href="/ru/logic/rent/pricing-glossary">
    Полный перечень полей скидки аренды и итоговых сумм пересчёта.
  </Card>

  <Card title="Аренда: заявки и жизненный цикл" icon="file-signature" href="/ru/logic/rent">
    Обзорный раздел модуля аренды со всеми его страницами.
  </Card>

  <Card title="Аренда и статусы" icon="diagram-project" href="/ru/logic/rent/lifecycle">
    Ядро аренды и автомат статусов: создание, редактирование, закрытие и архивация.
  </Card>

  <Card title="Выдача и приёмка" icon="right-left" href="/ru/logic/rent/actions">
    Действия по аренде — от брони и сборки до выдачи, приёмки и отмены с откатом статуса.
  </Card>

  <Card title="Позиции инвентаря и обмен" icon="boxes-stacked" href="/ru/logic/rent/inventory-lines">
    Строки инвентаря, их тарифы и периоды, массовые операции и обмен позиций внутри заявки.
  </Card>

  <Card title="Услуги и доставка" icon="truck" href="/ru/logic/rent/services-delivery">
    Услуги в составе аренды и доставки с привязкой к действиям выдачи и приёмки.
  </Card>

  <Card title="Депозиты и штрафы" icon="shield-halved" href="/ru/logic/rent/deposits-penalties">
    Депозиты и штрафы аренды и позиций, а также генерация штрафных задач.
  </Card>

  <Card title="График оплат, паузы и рабочие дни" icon="calendar-days" href="/ru/logic/rent/schedule">
    График платежей, автосписание, паузы аренды и рабочие дни, влияющие на длительность и суммы.
  </Card>

  <Card title="Уведомления, бонусы и воронка" icon="bell" href="/ru/logic/rent/triggers">
    Реакции на смену статуса: уведомления, бонусы, реферальные выплаты и продвижение по воронке.
  </Card>
</CardGroup>
