Вопросы к АСБ (ihmanagement) по интеграции бронирования

Окружение: тестовое (АСБ), базовый URL http://test.ihmanagement.ru/webservice/api/res/v1/, логин Provotorov_API · 18.07.2026. Формат каждого пункта: эндпоинт (метод + URL) → что наблюдаемвопрос(ы).

⬇ Скачать в .docx
1 Коды ошибок2 quotes = false 3 catplacefl/oneplacefl4 Изменение заказа 5 Оплата6 СправочныеПриоритеты

1. Коды ошибок при регистрации/изменении заказа

Эндпоинты: POST http://.../res/v1/setletter · PUT http://.../res/v1/letters

Что наблюдаем. При отказе — {"ref": <отрицательное>, "mes": "<текст>"}. Справочника кодов в доке нет. Встретили:

refmes (дословно)наша догадка
-2the check-in date cannot be less than the current oneдата заезда в прошлом
-21Quota is empty...нет квоты на весь номер
-35Booking of one main seat is not available!нельзя продать одно отдельное место
-34The number of additional seats exceeds the allowed number in this category!доп. место (dopplacefl=1) в категорию с catdopnum=0проверено
-36 / -37the check-in/out time is not equal to the time in the accommodation programвремя заезда/выезда ≠ времени программы
-31max days 0срок / минимум дней?
-32(программа недоступна на период)?
-3нет денег на счёте агента (letter_set_status_sold)баланс агента
Вопросы:
  1. Дайте полный список кодов ref с расшифровкой и рекомендацией по обработке.
  2. Подтвердите/поправьте догадки в таблице (особенно -31, -32).
  3. Код ref стабилен (можно завязывать логику), или ориентироваться на текст mes? Локализуется ли mes?

2. Квота: по части объектов ответ — false

Эндпоинт: GET http://.../res/v1/quotes?objid=<код>&datein=<YYYY-MM-DD>&length=<дней>&catcod=<код>

Что наблюдаем. По 58 из 169 объектов приходит список строк квоты, по 111 — булев false. Пример:

GET quotes?objid=1456&datein=2026-08-01&length=16          -> false
GET quotes?objid=1456&datein=2026-08-01&catcod=6518        -> false
POST quotes (objid=1456, те же даты)                       -> false
GET quotes?objid=1&datein=2026-08-01&length=16 (контроль)  -> список из 384 строк

Формат запроса верный (по объекту 1 данные приходят), но по объекту 1456 (и ещё 110) — всегда false.

Вопросы:
  1. Почему по этому объекту приходит false? Какая из причин верна: (1) по объекту в тестовом окружении просто не заданы места (данные о количестве мест не загружены); (2) по этому объекту у нашей учётной записи нет договора, поэтому места не отдаются; (3) для объекта количество мест вообще не ведётся в системе; (4) другая причина — какая?
  2. На боевом (рабочем) окружении по этим объектам места будут отдаваться? Нужно ли что-то отдельно заводить или открывать нам доступ?
  3. Если по объекту quotes вернул false — бронировать нельзя, или места просто не показываются через quotes, но само бронирование (setletter) может пройти? (по таким объектам мы получали и отказы -21/-35, и успешные брони)

3. Флаги размещения catplacefl и oneplacefl

Где живут: catplacefl — поле номера в теле POST http://.../res/v1/setletter (и calcsum); oneplacefl, oneplacedates — поля категории в ответе GET http://.../res/v1/categs?objid=<код>

Что в доке. oneplacefl = «Возможность размещения 1 гостя во весь номер, 1/0». catplacefl — описания нет, только "catplacefl": 0.

Что наблюдаем (объект 1, договор concod=1, живой setletter с авто-отменой):

КатегорияЧто просимРезультат
catcod 5, oneplacefl=11 гость, catplacefl=0бронь, 59 850 (цена одного места)
catcod 5, oneplacefl=11 гость, catplacefl=1бронь, 89 950 (= prices.price, номер целиком)
catcod 5, oneplacefl=12 гостя, catplacefl=0бронь, 119 700 (2× места)
catcod 9, oneplacefl=01 гость, catplacefl=0-35 «one main seat not available»
catcod 9, oneplacefl=01 гость, catplacefl=1бронь, 105 700 (выкуп прошёл ДАЖЕ при oneplacefl=0)
catcod 9, oneplacefl=02 гостя, catplacefl=0бронь, 140 700

Расхождение доки и поведения: дока описывает oneplacefl как «1 гость во весь номер» (звучит как выкуп), но выкуп включается флагом catplacefl=1 и работает независимо от oneplacefl. А oneplacefl=1 фактически разрешает продать одно место (подселение), oneplacefl=0 — запрещает (-35).

Вопросы:
  1. Дайте официальное определение catplacefl и все допустимые значения. Верно ли, что catplacefl=1 = выкуп всего номера одним гостем?
  2. Уточните точный смысл oneplacefl: «разрешена продажа одного отдельного места (подселение)» или «разрешено занять весь номер одним гостем»? Как согласуется с таблицей?
  3. Подтвердите: выкуп (catplacefl=1) работает независимо от oneplacefl — нужна только квота номера?
  4. Подтвердите: prices.price («стоимость номера целиком») = цена выкупа всего номера (catplacefl=1)? Проба: price × ночи = 12850 × 7 = 89 950 = цена брони с catplacefl=1.
  5. Поле категории oneplacedates — массив пар дат [{d1,d2}] («пары дат ограничений по подселению в номер»). Интервал [d1,d2] — это период, когда подселение (продажа отдельного места) ЗАПРЕЩЕНО, или наоборот РАЗРЕШЕНО? И что важнее, если oneplacefl=1, а дата заезда попадает в интервал oneplacedates — можно продать одно место или нет?
  6. Выкуп номера, когда гостей меньше, чем мест. Если номер рассчитан на 3 места (catbednum=3), а мы хотим поселить в него 2 гостей и выкупить его целиком (никого к ним не подселять) — как правильно оформить запрос? Достаточно прислать 2 реальных гостей и catplacefl=1, или нужно чем-то обозначить 3-е (незанятое) место? И как считается цена выкупа в этом случае: всегда полная стоимость номера (prices.price за все места) независимо от того, что фактически заселены 2 гостя, или иначе? Дайте формулу цены выкупа для случая «гостей меньше, чем мест».
  7. Цена доп. места приходит и там, где доп. мест нет. В prices для КАЖДОЙ категории приходят ставки доп. места (pricedop/pricedopchild) — в том числе у категорий с catdopnum=0 (напр. одноместных). При этом setletter с доп. гостем (dopplacefl=1) в такую категорию отклоняется кодом -34 «The number of additional seats exceeds the allowed number in this category» (проверено на тест-АСБ). Правильно ли мы понимаем, что ставка доп. места в прайсе — это цена уровня программы/объекта, а фактический лимит доп. мест задаёт catdopnum по категории, и цену доп. надо применять ТОЛЬКО к категориям с catdopnum>0? И бывают ли случаи, когда catdopnum=0, но доп. место всё же можно продать (напр. раскладушка по запросу)?
  8. Размещение ребёнка БЕЗ выделения отдельного места. До какого возраста можно поселить ребёнка в номер, не занимая ни осн., ни доп. койку (ребёнок с родителями), и какие варианты путёвки для него доступны: (а) с питанием и лечением; (б) с питанием, но без лечения; (в) без питания; (г) полностью бесплатно (без путёвки)? Как это оформить в setletter, если у каждого клиента обязателен флаг места dopplacefl (0/1) — то есть слота «без места» сейчас нет? Есть ли отдельный признак / servcod для такого ребёнка, и как считается его цена?

4. Изменение заказа и «черновая» бронь заглушками

Эндпоинты: PUT http://.../res/v1/letters (изменение) · POST http://.../res/v1/setletter (создание) · DELETE http://.../res/v1/letters (аннуляция)

Что наблюдаем. Изменение заказа делается методом PUT .../letters (в доке описано). setletter при создании принимает данные без проверки реальности ФИО. Технически это позволяет: создать бронь с заглушками → увидеть, прошла ли проверка мест → затем поправить PUT на реальные данные или отменить DELETE.

Вопросы:
  1. Какие поля можно менять через PUT letters (даты, программу, состав гостей, номер) и в каких статусах заказа (только «Забронирован», или и «Продан»/«Оплачен»)?
  2. Допустимо ли по вашим правилам создавать бронь заглушками ради проверки наличия, а затем править или отменять её? Нет ли ограничений или защиты от злоупотреблений при частых «создать заказ → отменить»?
  3. Есть ли отдельный механизм удержания места (hold) без создания полноценного заказа?

5. Оплата и статусы заказа

Эндпоинты: POST http://.../res/v1/setletter (возвращает paysysurl) · http://.../res/v1/letter_set_status_sold · GET http://.../res/v1/url_let_docs?letcod=<код>

Что наблюдаем. На тесте платёжка не подключена: setletter возвращает paysysurl:"", paysysid:0. Статусы: Забронирован(1)→Продан(2)→Оплачен(3)→Аннулирован(4). letter_set_status_sold вернул -3 «нет денег на счёте агента».

Вопросы:
  1. Сколько времени держится заказ в статусе «Забронирован», если он не оплачен? Отменяется ли он автоматически по истечении срока (и освобождается ли занятое место), или висит, пока мы сами не отменим? Если срок есть — какой он и можно ли его настроить?
  2. Как подключается онлайн-оплата (заполнение paysysurl)? Есть ли callback/webhook о факте оплаты, чтобы мы обновили статус у себя?
  3. Автоматически ли при оплате статус заказа переходит из «Забронирован» в «Оплачен», или это отдельное действие с нашей стороны?
  4. Ваучер (url_let_docs) у нас доступен сразу после setletter (статус «Забронирован») — это ожидаемо, или ссылка должна выдаваться только после оплаты?

6. Справочные

  1. Программа — признак «профсоюзная». GET http://.../res/v1/programms?objid=<код>: в ответе явного флага нет, определяем по слову «Профсоюзная» в названии. Есть ли отдельное поле/признак?
  2. Программа — возрастной ценз, особенно для детей. GET http://.../res/v1/programms?objid=<код>: в выходных полях (prognam, minlength/maxlength, datein/dateout, servcods …) нет ничего про возраст гостя. Сейчас, кому подходит программа, определяем по её названию (слова «взрослый»/«детский», «от X до Y лет») — это ненадёжно.
    • Есть ли у программы возрастной ценз (минимальный/максимальный возраст гостя), и в каком поле он приходит? Если поля нет — как правильно, НЕ по названию, понять, что программа только для взрослых / только для детей / с ограничением по возрасту?
    • Отдельно по детям: бывают ли программы «для детей от N лет» или чисто детские путёвки, и как их различить программно?
    • Как АСБ реагирует, если по программе оформить гостя неподходящего возраста (calcsum/setletter) — отсекает с ошибкой или пропускает?
  3. Как узнавать только изменившиеся объекты (чтобы не перекачивать весь каталог заново). GET http://.../res/v1/check_price_by_object?a=1&last_check_date=<YYYY-MM-DD>. Нужна более детальная документация:
    • В примере URL есть параметр a=1, но в описании входных параметров он не указан — что это за параметр, какие значения принимает, обязателен ли?
    • В описании ответа указано только поле objid (код объекта). Ответ — это просто список объектов, у которых что-то изменилось (и мы должны пере-синхронизировать их целиком), или есть детализация, ЧТО именно изменилось (характеристики объекта / договора / программы / услуги / цены)? Пришлите полную структуру ответа.

Приоритетные (блокируют продукт)