Бронирование.
https://selena-online.ru/rest/v1/reserve [PUT]
Входные данные передаются в теле http-запроса и представлены в формате JSON. Передаваемый сервису http-запрос должен содержать заголовок Content-Type, соответствующий формату входных данных: application/json.
Шаблон структуры входных данных в формате JSON:
{
"commit": boolean,
"pre_order": boolean,
"buyer_email": string,
"buyer_phone": string,
"order": {
"baseid": int ,
"begindate": date,
"enddate": date,
"duration": int,
"tourid": int,
"agentid": int,
"customerid": int,
"note": string,
"promo": string,
"silence": boolean,
"agree_number": string,
"agree_date": date,
"agree_cost": int,
"seller_taxcode": string,
"seller_phone": string,
"seller_email": string
},
"buyer": {
"firstname": string,
"middlename": string,
"lastname": string,
"citizenship": string,
"birthdate": date,
"identity": int,
"identity_sn": string,
"address": string,
"phone": string,
"email": string
},
"tourists": [
{
"is_buyer": boolean,
"apartmentid": int,
"place_type": int,
"main_place_type": int,
"place_is_locked": boolean
"firstname": string,
"middlename": string,
"lastname": string,
"birthdate": date,
"identity": int,
"identity_sn": string,
"identity_issued": date,
"identity_issuer": string,
"identity_expired": date,
"address": string,
"phone": string,
"email": string,
"sex": int,
"roomid": int,
"services": [int,int, ...],
"socials": {"id": int, "doc": string},
"tourpackid": int,
"city": string,
"cityid": int,
"citizenship": string,
"forward_tripid": string,
"forward_trip_seat": string,
"forward_load_point": int,
"forward_unload_point": int,
"backward_tripid": string,
"backward_trip_seat": string,
"backward_load_point": int,
"backward_unload_point": int
},
{
"apartmentid": int,
"place_type": int,
...
}
]
}
Пакет данных, содержащий запрос на бронирование заказа, условно разделяется на 3 части: основные параметры заказа, данные туристов и их размещения, и управляющая информация.
Раздел order описывает следующие характеристики заказа:
int:baseid - ID объекта размещения (тура - для экскурсионных туров). Обязательный.
int:tourid - ID тура. Обязательный.
date(yyyy-mm-dd):begindate - дата начала тура. Необязательный, если тур является фиксированным (свойство тура type="fixed").
int:duration - Продолжительность тура, дней. Необязательный, если тур является фиксированным.
int:customerid - ID заказчика-физлица в случае прямой продажи без посредника-агента. Опциональный.
int:agentid - ID заказчика-агента. Опциональный.
string:note - примечание к заказу в свободной форме. Опциональный.
string:promo - промокод. Опциональный.
boolean:silence - Флаг "Режим тишины". Если true, то система не отправляет покупателю никаких уведомлений о происходящих с заказом событиях: о факте бронирования, об изменении статуса заказа и т.д. Опциональный.
customerid и agentid - взаимоисключающие параметры. Если указаны оба параметра, приоритет имеет agentid, а customerid игнорируется.
customerid устанавливается в случае прямой продажи туроператора физлицу, без участия турагента. Если не указан или указан 0 (ноль), в качестве заказчика используется первый турист в заказе, но только при условии, что соответствующее разрешение установлено в конфигурации базы данных (определяется оператором БД). Если такого разрешения нет, ID заказчика должен быть целым положительным числом, отличным от нуля, а это означает, что заказчик либо должен присутствовать в справочнике, либо его нужно предварительно создать.
agentid устанавливается в случае, если заказчик - турагент. При этом выполняется автоматический расчёт комиссий, если это предусмотрено в конфигурации БД оператора. Для сторонних компаний и агрегаторов, использующих API бронирования для создания соответствующего интерфейса на своих онлайн-ресурсах, agentid необязательный, т.к. он принудительно устанавливается в ID этой компании-турагента в БД оператора системы бронирования. В случае, если компания имеет несколько юр. лиц, то с помощью agentid можно выбирать, от чьего имени должен быть выполнен заказ.
Также существует возможность указать покупателя-физлицо с помощью параметров раздела buyer, или с помощью параметра туриста is_buyer. Это работает как при установленном agentid, так и без него. Указанный покупатель добавляется в системный справочник покупателей-физлиц. При этом, если установлен agentid, то физлицо становится клиентом агента и доступно только турагенту в его собственном справочнике покупателей-физлиц, в его ЛК. Рекомендуется использовать buyer когда конечный покупатель путёвки (физлицо) не является одним из туристов. Для того, чтобы по возможности исключить добавление одного и того же покупателя-физлица в справочник много раз, выполняется сопоставление по параметрам firstname, lastname и phone. Идентификатор созданного покупателя возвращается в ответе на запрос в параметре customer_id.
Следующие параметры заполняются, если между агентом agentid и конечным покупателем стоят один или более посредников-турагентов. В соответствии с требованиями ГИС ЭП эти данные обязательно должны указываться турагентом agentid.
string:agree_number - номер договора конечного покупателя (туриста, юр.лица) с продавцом путёвки. Опциональный. Если не будет указан, номер договора назначится автоматически как номер заявки у оператора.
string:agree_date - дата договора конечного покупателя (туриста, юр.лица) с продавцом путёвки. Опциональный. Если не будет указана, дата договора назначится автоматически как дата создания заявки у оператора.
string:agree_cost - цена договора конечного покупателя (туриста, юр.лица) с продавцом путёвки. Опциональный. Если не будет указана, цена договора назначится автоматически как полная стоимость заявки у оператора (включая агентскую комиссию).
string:seller_taxcode - ИНН конечного агента-продавца, с которым заключает договор конечный покупатель. Опциональный. Если не будет указан, продавцом путёвки будет считаться агент agentid.
string:seller_phone - Контактный телефон конечного агента-продавца, с которым заключает договор конечный покупатель. Опциональный. Обязательно должен быть указан, если указан seller_taxcode.
string:seller_email - Email конечного агента-продавца, с которым заключает договор конечный покупатель. Опциональный. Обязательно должен быть указан, если указан seller_taxcode.
Раздел buyer является необязательным и описывает данные заказчика, если это не один из туристов:
string:firstname - имя заказчика. Обязательный.
string:middlename - отчество заказчика. Обязательный.
string:lastname - фамилия заказчика. Обязательный.
date(yyyy-mm-dd):birthdate - дата рождения заказчика. Опциональный.
string:citizenship - код (в контексте официального справочника - числовой, здесь должен быть представлен строковым типом) гражданства заказчика по ОКСМ (Общероссийский классификатор стран мира). Обязательный.
int:identity - документ, удостоверяющий личность заказчика: 1 - паспорт РФ, 2 - загранпаспорт, 3 - свидетельство о рождении РФ, 100 - другой документ. По умолчанию - паспорт РФ. Номер указывается без символа "№", пробелы допускаются.
string:identity_sn - серия и номер документа, удостоверяющего личность заказчика. Обязательный.
string:address - адрес заказчика. Обязательный.
string:phone - контактный телефон заказчика. Обязательный.
string:email - email заказчика. Опциональный.
Раздел tourists содержит список туристов, их личные данные, а также информацию о категории размещения и типе места.
boolean:is_buyer - Турист является покупателем. Опциональный. Игнорируется, если есть раздел buyer.
int:apartmentid - ID категории размещения. Обязательный.
int:place_type - тип места: 1 - основное, 2 - дополнительное, 3 - детское (без места). Обязательный.
boolean:main_place_type - тип основного места: 0 - не имеет значения, 1 - нижнее место, 2 - верхнее место. Опциональный, по умолчанию 0. Имеет смысл:
- только для основных мест (place_type=1);
- только для номеров, в которых есть основные верхние места;
- только если указан параметр roomid.
Если параметр = 0, система сама размещает туриста на первое свободное место в номере, начиная поиск с нижних мест. Если параметр отличается от 0, то система пытается найти свободное место указанного типа, и если его нет - возвращает отказ.
boolean:place_is_locked - флаг "место зарезервировано". Если требуется (N-1)-местное размещение в N-местном номере, то флаг указывает место (только одно на номер), которое резервируется без размещения туриста. Опциональный, по умолчанию false.
string:firstname - имя туриста. Обязательный, если не установлен флаг place_is_locked, а также в соответствии с требованиями ГИС ЭП.
string:middlename - отчество туриста. Обязательный, если не установлен флаг place_is_locked, а также в соответствии с требованиями ГИС ЭП.
string:lastname - фамилия туриста. Обязательный, если не установлен флаг place_is_locked, а также в соответствии с требованиями ГИС ЭП.
date(yyyy-mm-dd):birthdate - дата рождения туриста. Обязательный, если не установлен флаг place_is_locked, а также в соответствии с требованиями ГИС ЭП.
string:citizenship - код (в контексте официального справочника - числовой, здесь должен быть представлен строковым типом) гражданства туриста по ОКСМ (Общероссийский классификатор стран мира). Обязательный в соответствии с требованиями ГИС ЭП.
int:identity - документ, удостоверяющий личность туриста: 1 - паспорт РФ, 2 - загранпаспорт, 3 - свидетельство о рождении РФ, 100 - другой документ. По умолчанию - паспорт РФ. Номер указывается без символа "№", пробелы допускаются. Обязательный в соответствии с требованиями ГИС ЭП.
string:identity_sn - серия и номер документа, удостоверяющего личность туриста. Обязательный в соответствии с требованиями ГИС ЭП, и должен быть уникальным в рамках одного заказа.
date(yyyy-mm-dd):identity_issued - дата выдачи документа, удостоверяющего личность туриста. Опциональный.
string:identity_issuer - орган власти, выдавший документа, удостоверяющий личность туриста. Опциональный.
date(yyyy-mm-dd):identity_expired - срок действия документа, удостоверяющего личность туриста. Опциональный.
string:address - адрес туриста. Опциональный.
string:phone - контактный телефон туриста. Обязательный в соответствии с требованиями ГИС ЭП, если установлен параметр is_buyer.
string:email - email туриста. Опциональный.
int:sex - пол туриста: 1 - мужской, 2 - женский. Опциональный, по умолчанию - мужской.
int:roomid - ID номера (каюты и пр.) для размещения, если необходимо разместить туриста. Опциональный.
[int]:services - список ID-ов услуг, выбранных туристом. Опциональный.
array:socials - документ, представленный туристом в подтверждение права на скидку. Опциональный. Документ передаётся в виде объекта: {"id": social_discount_id, "doc": document_number}
int:tourpackid - ID вида путёвки (тарифа). Опциональный.
string:city - название города проживания туриста. Опциональный.
int:cityid - идентификатор города проживания туриста (справочник citylist). Опциональный.
string:forward_tripid - идентификатор рейса "туда" (автобус, поезд, авиа и т.д.), который перевозит туриста в рамках тура. Этот же рейс может быть рейсом "обратно", если в туре не предусмотрено отдельного обратного рейса, и турист возвращается из тура домой на том же транспортном средстве и на том же месте.
string:backward_tripid - идентификатор рейса "обратно" (автобус, поезд, авиа и т.д.), который перевозит туриста в рамках тура. Если в туре нет обратного рейса, параметр не указывается.
string:forward_trip_seat - место в рейсе "туда"
string:backward_trip_seat - место в рейсе "обратно"
string:forward_load_point - пункт посадки туриста на рейс "туда"
string:forward_unload_point - пункт высадки туриста с рейса "туда"
string:backward_load_point - пункт посадки туриста на рейс "обратно"
string:backward_unload_point - пункт высадки туриста с рейса "обратно"
Флаг place_is_locked устанавливается, если нужно занять основное место без подселения в многоместном номере (более одного основного места). Например, если необходимо 1-местное размещение в 2-местном номере, одно из мест нужно отметить флагом place_is_locked. При этом не нужно указывать данные туристов и тип места, т.к. резервировать можно только основные места, и place_type=1 устанавливается по умолчанию:
...
{
"apartmentid": 19,
"roomid": 209,
"place_is_locked": true
},
...
Для (N-1)-местного размещения в N-местном номере, в котором есть верхние места, и требуется размещение в номер (указан параметр roomid), действует специальное условие: резервировать (выкупать без размещения туриста) можно только верхнее место. Это означает, что place_is_locked=true может быть только в случае, если main_place_type=2.
При резервировании места важно учитывать тот факт, что неполное заселение допускается не во все категории размещения. Информацию о параметрах категории размещения можно найти в соответствующем разделе FrontAPI.
boolean:commit - флаг "Выполнить бронирование". По умолчанию false. Если не установлен, выполняется только формальный логический контроль входных данных и расчёт стоимости заказа.
boolean:pre_order - флаг "Предварительный заказ". По умолчанию false. Если true, заказ принудительно устанавливается в статус "Ожидание подтверждения", при этом в момент бронирования не выполняются проверки заполнения некоторых полей персональных данных, которые, в частности, требуются для передачи информации в ГИС ЭП. Следует иметь в виду, что установка в true будет иметь эффект только в случаях, если это разрешено внутренней политикой оператора, и это нужно уточнять.
string:buyer_email - адрес, на который нужно отправить сообщение покупателю-туристу
string:buyer_phone - альтернативный телефон для отправки смс в случае, если он не указан у customer и buyer.
При обработке запроса на бронирование система выполняет такие же операции и такую же проверку входных данных, которые выполняются при бронировании в личном кабинете (ЛК) через веб-интерфейс. Поэтому заказ, выполненный через API, ничем не отличается от заказа, сделанного в ЛК. При возникновении ошибок при проверке входных данных, а также при отсутствии возможности подтвердить наличие мест (квот) система возвращает соответствующие сообщения. Некоторые сообщения, кроме http-кодов, могут содержать коды ошибок, поясняющие причину неуспеха операции. В следующей таблице перечислены дополнительные коды возможных ошибок.
| http код | Код ошибки | Описание |
|---|---|---|
| 422 | INVALID_PLACEMENT_TYPE | Неверно указан тип размещения (place_type). |
| 422 | INVALID_APARTMENT_CATEGORY | Неверно указана категория размещения. |
| 422 | MAIN_PLACES_NOT_SPECIFIED | Не указаны основные места. Обычно ошибка возникает, если была попытка выполнить заказ только на дополнительные или детские места, а конфигурация БД оператора этого не позволяет. |
| 422 | PLACES_LIMIT_EXCEEDED | Превышено допустимое количество дополнительных или детских мест. Информацию о количестве таких мест для каждой категории размещения можно найти в соответствующем разделе FrontAPI. |
| 422 | APARTMENT_MUST_BE_RESERVED_WHOLLY | Номер должен быть забронирован целиком. |
| 422 | EMPTY_PLACE_PROHIBITED | Запрещено резервирование (выкуп) основного места без заселения на него туриста. Т.е. нельзя, например, бронировать 2-местный номер в одноместном размещении. Эта ошибка указывает на то, что параметр place_is_locked применяется некорректно. |
| 422 | EMPTY_PLACE_LIMIT_EXCEEDED | Превышено количество зарезервированных (выкупленных) мест. При бронировании через API и ЛК не позволяется резервировать (выкупать) более одного места на номер. |
| 422 | ADD_PLACE_WITHOUT_FULL_BOOKING_PROHIBITED | Нельзя бронировать дополнительное место, если номер не бронируется целиком. |
| 422 | ADD_OR_CHILD_PLACE_WITHOUT_MAIN_PLACE_PROHIBITED | Нельзя бронировать дополнительное или детское место, если для него не бронируется основное место. Т.е. ребёнок без места размещается на основном месте, вместе со взрослым. |
| 422 | INVALID_DATE_FORMAT | Неверный формат даты. |
| 422 | INVALID_IDENTITY | Неверно указан тип документа, удостоверяющего личность (identity). |
| 422 | INVALID_MONEY_FORMAT | Неверно указана сумма |
| 422 | INVALID_TAXCODE | Неверно указан ИНН |
| 422 | INVALID_PHONE | Неверно указан номер телефона |
| 422 | INVALID_EMAIL | Неверно указан email |
| 422 | RESERVATION_ERROR | Ошибка бронирования. Обычно эта ошибка содержит текстовое описание, поясняющее её суть. |
| 422 | INVALID_BUYER_DATA | Ошибка в личных данных заказчика или не указаны обязательные данные. |
| 422 | INVALID_BUYER_CONTACT_DATA | Ошибка в контактных данных заказчика или не указаны обязательные данные. |
Флаг commit определяет, нужно ли сразу после проверки данных и расчёта заказа выполнять его бронирование. Если флаг commit не установлен, то система не выполняет реальное бронирование, и возвращается структура с данными, описывающими результат расчёта заказа, включая итоговые суммы. Эту информацию можно использовать для того, чтобы перед реальным бронированием показать туристу форму с итоговым заказом и кнопкой "Подтвердить". Нажатие на кнопку "Подтвердить" должно инициировать повторный запуск этого же метода с теми же входными данными, но с установленным флагом commit. Если флаг commit установлен, система выполняет его бронирование и возвращает информацию о реальном заказе.
Если бронирование подразумевает размещение в конкретный номер, например, в каюту речных круизах, то запрос без указания номера каюты выполнит бронирование, но туристы не будут размещены в каюты. Так как на круизах обычно контроль за наличием мест выполняется на основе информации о занятости кают, такой заказ не будет гарантировать размещение до тех пор, пока менеджер оператора не разместит туристов в каюты.
Если туристов в заказе более одного, некоторые незаполненные данные второго и последующих туристов автоматически заполняются аналогичными данными первого туриста. К таким относятся:
Заказчиком - конечным покупателем тура - при бронировании через API по умолчанию является первый турист в заказе.
Возвращает структуры данных, состав которых зависит от установки флага commit.
Если флаг commit не установлен, возвращается информация об итоговых суммах заказа:
{
"bonus_sum": float,
"discount_desc": string,
"discount_sum": float,
"full_sum": float,
"order_sum": float
}
float:full_sum - полная сумма заказа, без учёта скидок и комиссий.
float:order_sum - сумма заказа к оплате.
float:discount_sum - сумма скидки.
string:discount_desc - текстовое описание скидки.
float:bonus_sum - сумма комиссии, если заказ от агента.
Если флаг commit установлен, возвращается информация о заказе:
{
"id": int,
"order_id": string,
"status": int,
"currency": string,
"url": string,
"bill_enabled": bool,
"customer_id": int
}
string:order_id - номер заказа.
int:id - id заказа.
int:status - статус заказа: 0 или 1 - заказ на брони, 5 - заказ ожидает подтверждения.
string:currency - валюта заказа.
string:url - прямая беспарольная ссылка на html-страницу, содержащую информацию о заказе. Эту ссылку можно отправлять туристу.
bool:bill_enabled - флаг, указывающий на доступность счёта на оплату. В зависимости от действующих условий бронирования, счёт может быть либо доступен сразу после бронирования, либо станет доступным после подтверждения заявки менеджером.
int:customer_id - id заказчика (частное лицо), который создаётся в справочнике покупателей, если в запросе передан параметр buyer. Если заказчик уже был в справочнике, возвращается его id.
Статус заказа 0 или 1 означает, что заказ принят к исполнению и ожидает оплаты. Такой заказ может быть автоматически аннулирован системой через определённое количество дней, если он не оплачивается заказчиком.
Статус заказа 5 означает, что заказ требует подтверждения оператора, и в общем случае может быть изменён без согласования с покупателем.
Следует заметить однако, что решение об изменении заказа оператор может принять в любом случае, независимо от статуса, и обычно это регламентируется договором оферты или субагентским договором. Но в любом случае и при любом из указанных статусов действует правило: если бронирование подразумевает снятие квот или заселение в номер (каюту), то происходит реальное снятие/заселение, и купленные в заказе места могут быть реализованы другому покупателю только в том случае, если заказ будет аннулирован.
{ "order": {
"baseid": 2 ,
"tourid": 9,
"agentid": 1,
"note": "Тестовый заказ",
"promo": "495663524-443" },
"commit": true,
"tourists": [
{
"apartmentid": 19,
"place_type": 1,
"firstname": "Иван",
"middlename": "Иванович",
"lastname": "Иванов",
"birthdate": "1980-01-01",
"identity": 1,
"identity_sn": "1232 123312",
"identity_issued": "2000-01-01",
"identity_issuer": "Кировский РОВД",
"address": "Пермь, ул.Ленина, д. 20, кв. 17",
"phone": "213123123",
"sex": 1,
"place_is_locked": false,
"services": [2,7],
"socials": {"id": 3, "doc": "CA-675342"}
}
]
}