Skip to main content
Полный перечень полей — в глоссарии.

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

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

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

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

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

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

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

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

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

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

Ключевая развилка ценообразования — флаг функции «Посуточный график платежей» (по умолчанию выключен). Он определяет, как измеряется длительность аренды и появляется ли у аренды план платежей по дням. Полный перечень настроек — на странице ««Флаги функций»».
Длительность аренды — это точная разница во времени в секундах между окончанием и началом (не меньше нуля). Число оплачиваемых периодов округляется вверх исходя из точного хронометража, неполный период тарифицируется как полный.
  • Нет понятия «нерабочих дней»: оплачивается всё время подряд.
  • План платежей по дням не создаётся, посуточные списания не выполняются.
Пример: тариф «сутки» (86400 секунд), аренда на 25 часов (90000 секунд) → округление вверх (90000 / 86400) = 2 периода.
Длительность = число оплачиваемых календарных суток × длина суток. Считаются календарные даты в диапазоне аренды за вычетом нерабочих дней; окончание ровно в полночь не засчитывает последний день. Здесь важен не хронометраж, а количество затронутых календарных дней. Дополнительно включаются нерабочие дни, бесплатный первый день и план платежей по дням.Как именно набираются оплачиваемые дни, как работают выходные и бесплатный первый день, как строится план платежей и распределяются оплаты — подробно разобрано в разделе «График оплат, паузы и рабочие дни». Здесь достаточно знать, что в этом режиме множитель периодов берётся из числа оплачиваемых суток.
Аренда одной единицы с тарифом 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 в посуточном графике — из‑за бесплатного первого дня и посуточного счёта.

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

Правило для услуги такое же по смыслу:
  • Если тариф услуги — разовый платёж, стоимость равна цене тарифа.
  • Если длительность тарифа равна нулю, стоимость также равна цене тарифа (разовая оплата).
  • Иначе стоимость = цена тарифа × округлённое вверх число периодов (длительность услуги, делённая на длительность тарифа).
Длительность услуги = разница между её окончанием и началом (по умолчанию — период всей аренды) за вычетом нерабочих дней, но не меньше нуля.
Это единственная формула цены услуги. Раньше рядом с ней жила упрощённая копия, которая считала цену по длительности всей аренды и без скидок; при частичном периоде услуги или включённом посуточном графике две формулы расходились, и до следующего полного пересчёта клиент видел неверную сумму. Копия убрана: цену и цену со скидкой пишет только пересчёт сумм аренды, и он запускается при создании, изменении и удалении строки услуги.

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

Цена тарифа = 5000, длительность тарифа = 1 день (86400 секунд), аренда ровно 72 часа (259200 секунд). Округление вверх (259200 / 86400) = 3 → стоимость строки = 5000 × 3 = 15000. Без скидок и налога: сумма за инвентарь = 15000, стоимость без скидки = 15000, итоговая стоимость = 15000.
Тот же тариф (сутки, 5000), аренда 25 часов (90000 секунд). Округление вверх (90000 / 86400) = 2 → стоимость строки = 5000 × 2 = 10000. За «лишний» час клиент платит как за полные сутки.
Тип строки — продажа, цена тарифа = 20000. Длительность игнорируется — стоимость строки = цена тарифа = 20000 вне зависимости от периода.

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

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

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

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

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

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

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

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

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

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

Признак «Суммировать скидки» аренды (по умолчанию включён) — флаг на уровне всей аренды, а не отдельной позиции:
  • Включено (актуальный путь): все применимые к позиции скидки суммируются, и результат вычитается из цены с отсечкой снизу нулём: итоговая цена позиции = max(цена − сумма всех скидок, 0).
  • Выключено — устаревший путь: отдельно считаются процентные (позиционные) и суммовые скидки.
Каждая отдельная скидка ограничена сверху ценой позиции, а итог по позиции — снизу нулём. Поэтому даже при стекинге стоимость позиции не уходит в минус.

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

Это не скидки и в итог через механизм скидок не попадают:
  • Бонусы лояльности начисляются постфактум как процент от уже посчитанной итоговой суммы (бонус = итоговая сумма × процент бонуса / 100). Списание бонусов — отдельные операции, см. «Клиенты, бонусы и рефералы».
  • Рефералы живут в отдельном поле «Реферальное вознаграждение» со своей логикой и в формулу скидки не входят.

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

После расчёта строк движок собирает итог по такой логике:
  • Стоимость без скидки = стоимость инвентаря + стоимость услуг + стоимость доставки.
  • Дополнительная скидка = сумма ручных скидок уровня аренды и фиксированных справочных скидок уровня аренды.
  • Промежуточная сумма со скидкой = стоимость инвентаря со скидкой + стоимость услуг со скидкой − дополнительная скидка (при этом из дополнительной скидки вычитается только её положительная часть; отрицательное значение сумму не увеличивает).
  • К этой сумме добавляются штрафы, затем налог (или налог считается «в том числе», если он включён в цену), и в самом конце — стоимость доставки.
  • Итоговая стоимость — это то, что сравнивается с оплаченной суммой при подсчёте задолженности.
Стоимость доставки прибавляется к итогу уже после расчёта налога и никогда не облагается налогом в этой формуле. Штрафы, наоборот, входят в налоговую базу вместе с суммой со скидкой.
Отдельно фиксируются суммы скидок: скидка на инвентарь (разница между стоимостью инвентаря и стоимостью инвентаря со скидкой), скидка на услуги (аналогично), и общая сумма скидки (инвентарь + услуги + дополнительная скидка). Формулой это выглядит так (ставка налога применяется как доля — для 12% это 0,12):
Два одинаковых инвентаря по 15000 (2 строки) → сумма за инвентарь = 30000. Услуга «доставка», разовый платёж 3000 → сумма за услуги = 3000. Скидок и штрафов нет: база к оплате = 33000.Сумма налога = округление(33000 × 0,12) = 3960. Налог не включён в цену → итоговая стоимость = округление(33000 × 1,12) = 36960 — это итог к оплате.

Штрафы

Штраф аренды складывается из двух частей:
  • Автоматический штраф — сумма автоматических штрафов по позициям за просрочку возврата (не начисляется, если штрафы у аренды отключены). Начисление штрафа полностью выключается, если аренда в статусе «заявка», «бронь» или «отмена», а также если у неё выставлен признак отключения штрафов.
  • Ручной штраф — сумма штрафов аренды, заведённых вручную.
Итоговая сумма штрафа = автоматический + ручной. Формула автоматического штрафа за просрочку разобрана в разделе «Депозиты и штрафы».

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

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

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

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

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

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

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

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

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

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

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

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

Скидки аренды создаются, изменяются и удаляются через свои адреса. Для скидки «по графику» сумма за день и общая сумма рассчитываются автоматически по дням графика аренды (с ограничением по максимальной сумме дня в графике). Права на запись скидок. Любая операция записи — добавление, изменение и удаление — требует двух вещей одновременно: права на работу со скидками аренды как таковыми и права на тот тип скидки, который получается в результате операции. Типов прав два: на скидку из справочника и на ручную скидку. Ключевое правило: нужное право определяется по наличию ссылки на справочник в самой скидке, а не по типу, который прислал интерфейс. Суперпользователь компании проходит любую из этих проверок.
Чтение списка скидок аренды намеренно оставлено доступным всем сотрудникам компании — иначе страница аренды ломалась бы у ролей без права просмотра скидок. Ограничены только операции записи.
Любое создание, изменение или удаление скидки автоматически пересобирает «Дополнительную скидку» аренды, поэтому итог остаётся согласованным даже до следующего полного пересчёта.
Форма создания/редактирования скидки принимает привязку к позиции инвентаря, но не даёт задать напрямую привязку к услуге или «Назначение скидки» — новые скидки по умолчанию получают назначение «вся аренда». Скидки уровня услуги и с иным назначением заводятся другими путями.

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

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

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

Глоссарий: Пересчёт сумм и цен

Полный перечень полей скидки аренды и итоговых сумм пересчёта.

Аренда: заявки и жизненный цикл

Обзорный раздел модуля аренды со всеми его страницами.

Аренда и статусы

Ядро аренды и автомат статусов: создание, редактирование, закрытие и архивация.

Выдача и приёмка

Действия по аренде — от брони и сборки до выдачи, приёмки и отмены с откатом статуса.

Позиции инвентаря и обмен

Строки инвентаря, их тарифы и периоды, массовые операции и обмен позиций внутри заявки.

Услуги и доставка

Услуги в составе аренды и доставки с привязкой к действиям выдачи и приёмки.

Депозиты и штрафы

Депозиты и штрафы аренды и позиций, а также генерация штрафных задач.

График оплат, паузы и рабочие дни

График платежей, автосписание, паузы аренды и рабочие дни, влияющие на длительность и суммы.

Уведомления, бонусы и воронка

Реакции на смену статуса: уведомления, бонусы, реферальные выплаты и продвижение по воронке.