К содержимому
Type — API сайта
Разделы

Цены и скидки

Цены считает CRM — сайту не нужно повторять правила тарифов, особых дат и скидок. Суммы приходят строками с двумя знаками после точки ("1250.00") в валюте компании (currency). Не переводите их в number для расчётов — округление разойдётся с CRM; для показа форматируйте как есть.

Цена в каталоге: SiteUnit

У каждого объекта в units() и unit() три поля про цену ночи:

ПолеЧто значит
base_priceцена ночи без скидок — «старая» цена, если есть скидка
priceцена ночи «от» с учётом скидки, которая действует сегодня без условий; особые даты не учитываются. Нет скидки — равна base_price
discountскидка, которая уже вошла в price, или null

discount — объект SiteDiscount:

ПолеЧто значит
nameназвание скидки, его можно показать на карточке
value_typepercent — процент, fixed — сумма за ночь
valueразмер скидки (строка)
ends_onпоследний день действия (YYYY-MM-DD) или null — бессрочно

Как показать на карточке:

tsx
{u.discount ? (
  <p>
    <s>{u.base_price}</s> <strong>{u.price} {u.currency}</strong>
    <span>{u.discount.name}</span>
  </p>
) : (
  <p>{u.price} {u.currency}</p>
)}

Цена в каталоге — ориентир «от». Точную сумму за даты всегда берите из quote() или prices(): в ней учтены особые даты, условия скидок и число ночей.

Цены всех объектов на даты: prices()

prices({ check_in, check_out, guests, group_id }) отвечает списком units — по объекту SitePrice:

ПолеЧто значит
availableдаты свободны и условия выполнены
subtotalитог до скидок
totalитог после скидок
per_night_beforeсредняя цена ночи до скидок
per_nightсредняя цена ночи после скидок
violationsпочему недоступно (см. ниже)

Если даты недоступны, суммы — null. Так каталог показывает «2 ночи — 2 400 вместо 2 600» и прячет занятые объекты.

Расчёт для одного объекта: quote()

quote({ unit_id, check_in, check_out, guests }) — тот же расчёт, что видит менеджер в CRM:

ПолеЧто значит
nightsчисло ночей
per_nightсписок ночей Night: date, base (цена ночи по тарифу), price (цена этой ночи с учётом особой даты), special_name (название особой даты или null)
discountsсработавшие скидки AppliedDiscount: name, amount (на сколько уменьшили итог), kind (line — на объект, deal — на всю бронь), application (auto — сработала сама)
subtotalитог до скидок
totalитог к оплате
availableнет блокирующих нарушений — можно отправлять заявку
violationsнарушения

Если даты заняты, ответ всё равно 200, но с available: false и списком violations — это не ошибка, а подсказка для формы.

Нарушения: violations

Каждое нарушение — { code, blocking, params }. При blocking: true заявка не будет принята (422 rental_unavailable), при false это предупреждение.

codeЧто показать посетителю
dates_invalidдаты заданы неверно
occupiedдаты заняты
blockedобъект закрыт на эти даты
min_nightsменьше минимального срока; минимум — в params
max_guestsгостей больше, чем вмещает объект; максимум — в params
unit_archivedобъект больше не сдаётся

Пересчитывайте quote() при каждом изменении дат и гостей в форме, а total в заявке не передавайте — CRM считает его сама и возвращает в ответе на заявку.