- Установка
- Подготовка
- Документация по работе с SOAP сервером (без использования этого коннектора)
- Документация по работе с клиентом и примеры
PHP 5.6+
ext-soap
Для установки через Composer необходимо выполнить команду:
composer require bronevik/hotels-connector
- Склонируйте https://github.com/bronevik-com/hotels-connector.git
- Зарегистрируйте автозагрузчик:
<?php
spl_autoload_register(function ($class) {
$file = 'ПУТЬ_К_ФАЙЛАМ_КОННЕКТОРА' . '/src/' . strtr($class, ['Bronevik/HotelsConnector/' => '', '\\' => '/']) . '.php';
if (is_readable($file)) {
require_once $file;
}
});
<?php
$connector = new Bronevik\HotelsConnector(Bronevik\HotelsConnector\Enum\Endpoints::DEVELOPMENT, true);
$connector->setCredentials('login', 'password', 'privateKey');
$connector->setLanguage(Bronevik\HotelsConnector\Enum\Languages::RUSSIAN);
В конструктор коннектора передаётся endpoint
SOAP-сервера и флаг debugMode
.
Для endpoint
возможны два значения:
\Bronevik\HotelsConnector\Enum\Endpoints::DEVELOPMENT
- для разработки, запросы отправляются на тестовый сервер.\Bronevik\HotelsConnector\Enum\Endpoints::PRODUCTION
- для использования в бою.
Флаг debugMode
, установленный в true
, позволяет использовать следующие методы:
$connector->getLastResponse()
для получения содержимого последнего ответа сервера.$connector->getLastResponceHeaders()
для получения HTTP-заголовков последнего ответа сервера.
В метод setCredentials()
передаются:
- Логин вашей учётной записи bronevik.com.
- Пароль от учётной записи bronevik.com
- Ключ клиента. Выдаётся только после заключения договора на использование сервиса.
Метод setLanguage()
принимает только \Bronevik\HotelsConnector\Enum\Languages::RUSSIAN
или
\Bronevik\HotelsConnector\Enum\Languages::ENGLISH
.
Строка переданная в метод ping()
будет отправлена сервером обратно.
<?php
echo $connector->ping('Привет, Броневичок!'); // Привет, Броневичок!
Документация в формате PDF: https://hotels-api.bronevik.com/v2.2.0/api.pdf
Следует упомянуть, что при вызове метода SearchHotelOffersRequest
параметр currency
является обязательным и сейчас
у него только одно возможное значение: rub
. Без заполнения этого параметра сервис вернёт сообщение об ошибке.
Запрос:
<?php
/** @var Bronevik\HotelsConnector\Element\Country[] $countries */
$countries = $connector->getCountries();
Разбор результата:
<?php
/** @var Bronevik\HotelsConnector\Element\Country[] $countries */
foreach ($countries as $country) {
$country->getId(); // 1
$country->getName(); // Россия
/** @var Bronevik\HotelsConnector\Element\CountryCodes $codes */
$codes = $country->getCodes();
$codes->getAlpha2(); // RU
$codes->getAlpha3(); // RUS
}
В метод getCities()
нужно передать Id страны.
<?php
/** @var Bronevik\HotelsConnector\Element\City[] $cities */
$cities = $connector->getCities(1);
Разбор результата:
<?php
/** @var Bronevik\HotelsConnector\Element\City[] $cities */
foreach ($cities as $city) {
$city->getId(); // 539
$city->getName(); // Абаза
$city->getRegionId(); // 102
$city->getRegionName(); // Хакасия
$city->getLatitude(); // 52.6439447
$city->getLongitude(); // 90.1039492
}
Запрос:
<?php
/** @var Bronevik\HotelsConnector\Element\Amenity[] $amenities */
$amenities = $connector->getAmenities();
Разбор результата:
<?php
/** @var Bronevik\HotelsConnector\Element\Amenity[] $amenities */
foreach ($amenities as $amenity) {
$amenity->getId(); // 5
$amenity->getName(); // Трансфер
$amenity->getGroupName(); // Общие услуги отеля
}
<?php
/** @var Bronevik\HotelsConnector\Element\Meal[] $meals */
$meals = $connector->getMeals();
Разбор результата:
<?php
/** @var Bronevik\HotelsConnector\Element\Meal[] $meals */
foreach ($meals as $meal) {
$meal->getId(); // 2
$meal->getName(); // Завтрак континентальный
}
<?php
/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
'2016-01-22', // дата заезда
'2016-01-24', // дата выезда
1 // Id города
);
<?php
// Массив фильтров
$criteria = [];
// Фильтр предложений по категории отеля (количеству звёзд)
$criterion = new Bronevik\HotelsConnector\Element\SearchOfferCriterionHotelCategory();
$criterion->addCategory(4);
$criterion->addCategory(5);
$criteria[] = $criterion;
// Фильтр предложений по количеству гостей
$criterion = new Bronevik\HotelsConnector\Element\SearchOfferCriterionNumberOfGuests();
$criterion->setAdults(2);
$criteria[] = $criterion;
// Фильтр предложений по возможности моментального подтверждения бронирования (онлайн)
$criterion = new Bronevik\HotelsConnector\Element\SearchOfferCriterionOnlyOnline();
$criteria[] = $criterion;
// фильтр по названию отеля
$criterion = new Bronevik\HotelsConnector\Element\SearchOfferCriterionHotelName();
$criterion->setName('Название отеля');
$criteria[] = $criterion;
// фильтр предложений по включенному завтраку
$criterion = new Bronevik\HotelsConnector\Element\SearchOfferCriterionBreakfastIncluded();
$criteria[] = $criterion;
// фильтр предложений по способу оплаты
$criterion = new Bronevik\HotelsConnector\Element\SearchOfferCriterionPaymentRecipient();
// в качестве paymentRecipient можно использовать только константы \Bronevik\HotelsConnector\Enum\PaymentRecipients
$criterion->addPaymentRecipient(Bronevik\HotelsConnector\Enum\PaymentRecipients::HOTEL); // оплата в отеле
$criterion->addPaymentRecipient(Bronevik\HotelsConnector\Enum\PaymentRecipients::AGENCY); // безналичный расчёт
$criteria[] = $criterion;
/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
'2016-01-22', // дата заезда
'2016-01-24', // дата выезда
1, // Id города
$criteria // массив фильтров
);
<?php
/**
* Фильтр предложений по конкретным отелям (по ids отелей)
* Можно указать до 100 отелей
* @var int[]
*/
$hotelIds = [1, 2, 3];
/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
'2016-01-22', // дата заезда
'2016-01-24', // дата выезда
null, // Id города
[], // массив фильтров
$hotelIds // ids отелей
);
<?php
$latitude = 30.1234; // широта
$longitude = 30.1234; // долгота
$radius = 12.1; // радиус в км (от 0 до 30 км, точность до 1 десятой)
$geolocation = new Bronevik\HotelsConnector\Element\GeoLocation();
$geolocation->latitude = $latitude;
$geolocation->longitude = $longitude;
$geolocation->radius = $radius;
/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
'2016-01-22', // дата заезда
'2016-01-24', // дата выезда
null, // Id города
[], // массив фильтров
[], // ids отелей
[], // skipElements
$geolocation
);
Вы можете пропустить некоторые элементы в поиске:
<?php
$skipElements = [
Bronevik\HotelsConnector\Enum\SkipElementTypes::DAILY_PRICES, // ежедневные цены
Bronevik\HotelsConnector\Enum\SkipElementTypes::DESCRIPTION_DETAILS, // описание отеля
];
// Все доступные для пропуска элементы для SearchHotelOffers - \Bronevik\HotelsConnector\Enum\SkipElementTypes::$availableSkipElementsForSearchHotelOffers
/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
'2016-01-22', // дата заезда
'2016-01-24', // дата выезда
1, // Id города
[], // массив фильтров
[], // ids отелей
$skipElements // элементы для пропуска
);
<?php
/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
foreach ($hotelsWithOffers->getHotel() as $hotelWithOffers) {
$hotelWithOffers->getId(); // Id отеля (например, 716)
$hotelWithOffers->getCityId(); // Id города (например, 1)
$hotelWithOffers->getCityName(); // Название города (например, Екатеринбург)
$hotelWithOffers->getName(); // Название отеля (например, Октябрьская)
$hotelWithOffers->getAddress(); // Адрес отеля (например, ул. Софьи Ковалевской, 17)
$hotelWithOffers->getCategory(); // Количество звезд в отеле (например, 4)
$hotelWithOffers->getCheckinTime(); // Расчётный час заезда (например, 12:00:00)
$hotelWithOffers->getCheckoutTime(); // Расчётный час выезда (например, 12:00:00)
$hotelWithOffers->getIsFixedCheckinTime(); // Фиксирован ли час заезда? (например, true)
$hotelWithOffers->getVatApplicable(); // Применим ли к отелю НДС? (например, true)
$hotelWithOffers->getVatIncluded(); // Включен ли НДС? (например, true)
$hotelWithOffers->getVATPercent(); // Процент НДС (например, 20)
$hotelWithOffers->getHasTaxes(); // Наличие в отеле дополнительных сборов (например, false)
$hotelWithOffers->getType(); // Тип отеля (например, hotel)
// Комментарий для гостя
$hotelWithOffers->getInformationForGuest()->getComment();
// Услуги отеля
/** @var Bronevik\HotelsConnector\Element\HotelAmenity $amenity */
foreach ($hotelWithOffers->getAmenities() as $amenity) {
$amenity->getName(); // Название услуги
$amenity->getType(); // Тип услуги
}
// Описание отеля
/** @var Bronevik\HotelsConnector\Element\DescriptionDetails $descriptionDetails */
/**
* Примечание: если в skipElements одним из элементов указать
* @see \Bronevik\HotelsConnector\Enum\SkipElementTypes::DESCRIPTION_DETAILS
* То $hotelWithOffers->getDescriptionDetails() вернет пустой объект
*/
$descriptionDetails = $hotelWithOffers->getDescriptionDetails();
$descriptionDetails->getCountryId(); // Id страны (например, 1)
$descriptionDetails->getCountryName(); // Название страны (например, Россия)
$descriptionDetails->getDistanceToCenter(); // Расстояние до центра в км (например, 1)
$descriptionDetails->getLatitude(); // Широта (например, 56.8499105)
$descriptionDetails->getLongitude(); // Долгота (например, 60.6525664)
$descriptionDetails->getDescription(); // Описание отеля
$descriptionDetails->getZipCode(); // Почтовый адрес отеля
// Фотографии отеля
/** @var Bronevik\HotelsConnector\Element\Image $photo */
foreach ($descriptionDetails->getPhotos() as $photo) {
$photo->getGuid(); // 73c7c9b97a36ac0d970990937d842417
$photo->getUrl(); // //dev.bronevik.tech/static/photo/g/250x250a/73c7c9b97a36ac0d970990937d842417
}
/** @var Bronevik\HotelsConnector\Element\AvailableAmenity $amenity */
foreach ($descriptionDetails->getAvailableAmenities() as $amenity) {
$amenity->getId(); // 1
$amenity->getIncluded(); // false
$amenity->getPrice(); // 125.00
}
// предложения
$offers = $hotelWithOffers->getOffers();
/** @var Bronevik\HotelsConnector\Element\HotelOffer $offer */
foreach ($offers->getOffer() as $offer) {
$offer->getCode(); // Код предложения (например, T1I3MTYjI2RvdWJsZSMxMDY0IzIwMTYtMDEtMjIjMjAxNi0wMS0yNCMyLDE=)
$offer->getName(); // Название предложения (например, Люкс)
$offer->getLhp(); // Флаг наличия lhp-цен в предложении (например, true)
$offer->getNonRefundable(); // Является ли предложение невозвратным (например, false)
$offer->getCurrency(); // Валюта оплаты (например, RUB)
$offer->getImmediateConfirmation(); // Возможно ли немедленное подтверждение (например, true)
$offer->getFreeRooms(); // Количество свободных номеров (например, 5)
$offer->getRoomId(); // Id номера (например, 24)
$offer->getRoomType(); // Тип размещения (например, single)
$offer->getIsSharedRoom(); // Является ли номер номером с подселением (например, false)
$offer->getIsBlockRoom(); // Является ли номер блочным (например, false)
$offer->getPaymentRecipient(); // Способ оплаты (например, \Bronevik\HotelsConnector\Enum\PaymentRecipients::AGENCY)
$offer->getDeepLink(); // Элемент для работы метапоисковых систем (например, http://dev.bronevik.tech/ru/hotel/russia/yekaterinburg/oktyabrskaya?sd=2019-06-01&ed=2019-06-02&code=T1I3MTYjOTgxNSNzaW5nbGUjMjQjMjAxOS0wNi0wMSMyMDE5LTA2LTAyIzIjMA==¤cy=RUB&spk=Corteos)
$offer->getRoomWithWindow(); // Наличие окна в номере (например, true)
/**
* Детализация стоимости
*
* @var Bronevik\HotelsConnector\Element\PriceDetails $priceDetails
*/
$priceDetails = $offer->getPriceDetails();
$priceDetails->getVatApplicable(); // Применим ли к отелю НДС
$clientDetails = $priceDetails->getClient(); // Детализация клиентской стоимости
$hotelDetails = $priceDetails->getHotel(); // Детализация отельной стоимости
$additionalPrices = $priceDetails->getExtra(); // Дополнительные цены
$clientDetails->getVatIncluded(); // Включен ли НДС в клиентскую стоимость
$clientDetails->getCommission(); // Информация о комиссии
$clientDetails->getGross(); // Брутто-стоимость
$clientDetails->getNet(); // Нетто-стоимость
/**
* @var Bronevik\HotelsConnector\Element\ClientPriceDetails $clientDetails
* getGross, getNet, getCommission возвращают объект DetailedPrice, который содержит в себе:
*/
$clientDetails->getGross()->getCurrency(); // Валюта
$clientDetails->getGross()->getPrice(); // Стоимость
$clientDetails->getGross()->getVatAmount(); // Сумма ндс
$hotelDetails->getVatIncluded(); // Включен ли НДС в отельную стоимость
foreach ($additionalPrices as $detailedPrice) {
$detailedPrice->getName(); // Наименование цены
$detailedPrice->getVatAmount(); // Сумма ндс
$detailedPrice->getPrice(); // Стоимость
$detailedPrice->getCurrency(); // Валюта
}
/** @var Bronevik\HotelsConnector\Element\Tax $tax */
// Дополнительные сборы при заселении
foreach ($offer->getTaxes() as $tax) {
$tax->getCurrency(); // Валюта оплаты
$tax->getComment(); // Комментарий
$tax->getType(); // Тип сбора
$tax->getAmount(); // Величина сбора
$tax->getIncluded(); // Включен ли сбор в стоимость предложения
}
/** @var Bronevik\HotelsConnector\Element\HotelOfferCancellationPolicy $cancellationPolicy */
// политика аннуляции
foreach ($offer->getCancellationPolicies() as $cancellationPolicy) {
$cancellationPolicy->getPenaltyDateTime(); // Дата наступления штрафа
$cancellationPolicy->getPenaltySum(); // Размер штрафа
/** @var Bronevik\HotelsConnector\Element\ClientPriceDetails $cancellationPriceDetails */
$cancellationPriceDetails = $cancellationPolicy->getPenaltyPriceDetails();
/** @var Bronevik\HotelsConnector\Element\DetailedPrice $commission */
$commission = $cancellationPriceDetails->getCommission();
$commission->getPrice(); // стоимость
$commission->getVatAmount(); // сумма НДС
$commission->getCurrency(); // валюта
/** @var Bronevik\HotelsConnector\Element\DetailedPrice $net */
$net = $cancellationPriceDetails->getNet();
$net->getPrice(); // стоимость
$net->getVatAmount(); // сумма НДС
$net->getCurrency(); // валюта
/** @var Bronevik\HotelsConnector\Element\DetailedPrice $gross */
$gross = $cancellationPriceDetails->getGross();
$gross->getPrice(); // стоимость
$gross->getVatAmount(); // сумма НДС
$gross->getCurrency(); // валюта
$cancellationPriceDetails->getVatIncluded(); // включен ли в стоимость НДС
}
/** @var Bronevik\HotelsConnector\Element\AvailableMeal $meal */
// питание
foreach ($offer->getMeals() as $meal) {
$meal->getId(); // Идентификатор услуги питания
$meal->getIncluded(); // Включена ли услуга в предложение
/** @var Bronevik\HotelsConnector\Element\ClientPriceDetails $mealPriceDetails */
$mealPriceDetails = $meal->getPriceDetails();
/** @var Bronevik\HotelsConnector\Element\DetailedPrice $commission */
$commission = $mealPriceDetails->getCommission();
$commission->getPrice(); // стоимость
$commission->getVatAmount(); // сумма НДС
$commission->getCurrency(); // валюта
/** @var Bronevik\HotelsConnector\Element\DetailedPrice $net */
$net = $mealPriceDetails->getNet();
$net->getPrice(); // стоимость
$net->getVatAmount(); // сумма НДС
$net->getCurrency(); // валюта
/** @var Bronevik\HotelsConnector\Element\DetailedPrice $gross */
$gross = $mealPriceDetails->getGross();
$gross->getPrice(); // стоимость
$gross->getVatAmount(); // сумма НДС
$gross->getCurrency(); // валюта
$mealPriceDetails->getVatIncluded(); // включен ли в стоимость НДС
}
// ежедневные цены
/** @var Bronevik\HotelsConnector\Element\DailyPrice $dailyPrice */
/**
* Примечание: если в skipElements одним из элементов указать
* @see \Bronevik\HotelsConnector\Enum\SkipElementTypes::DAILY_PRICES
* То массив $offer->getDailyPrices() будет пустой
*/
foreach ($offer->getDailyPrices() as $dailyPrice) {
$dailyPrice->getDate(); // Дата, на которую рассчитана цена
$dailyPrice->getBookingFee(); // Стоимость брони в отеле
$dailyPrice->getEarlyArrival(); // Стоимость раннего заезда
$dailyPrice->getLateDeparture(); // Стоимость позднего выезда
$dailyPrice->getRate(); // Стоимость номера
// Стоимость платного питания
/** @var Bronevik\HotelsConnector\Element\MealPriceDetails $mealPriceDetails */
foreach ($dailyPrice->getMeals()->meal as $mealPriceDetails) {
$mealPriceDetails->getId(); // Идентификатор услуги питания
$mealPriceDetails->getCommission(); // Информация о комиссии
$mealPriceDetails->getGross(); // Брутто-стоимость
$mealPriceDetails->getNet(); // Нетто-стоимость
$mealPriceDetails->getVatIncluded(); // Включен ли НДС в клиентскую стоимость
$mealPriceDetails->getIncluded(); // Включена ли услуга в предложение
}
/**
* getBookingFee, getEarlyArrival, getLateDeparture, getRate возвращает объект ClientPriceDetails, который описан чуть выше
* @see \Bronevik\HotelsConnector\Element\ClientPriceDetails
*/
}
// Правила предоставления предложения
/** @var Bronevik\HotelsConnector\Element\OfferPolicy $offerPolicy */
foreach ($offer->getOfferPolicies() as $offerPolicy) {
$offerPolicy->description; // описание
}
}
}
Метод getHotelInfo()
принимает массив идентификаторов отелей.
Возвращает те же данные, что и метод searchHotelOffers()
, но без информации о предложениях, с информацией о номерах в отеле.
<?php
/** @var Bronevik\HotelsConnector\Element\HotelWithInfo[] $hotelsWithInfo */
$hotelsWithInfo = $connector->getHotelInfo([716, 901]);
Ответ:
<?php
/** @var Bronevik\HotelsConnector\Element\HotelWithInfo[] $hotelsWithInfo */
foreach ($hotelsWithInfo as $hotelWithInfo) {
/** @var Bronevik\HotelsConnector\Element\HotelRoom $hotelRoom */
foreach ($hotelWithInfo->getRooms() as $hotelRoom) {
$hotelRoom->getId(); // Id номера
$hotelRoom->getName(); // Название номера
$hotelRoom->getDescription(); // Описание номера
$hotelRoom->getRoomCapacity(); // Количество гостей, которых можно разместить в номере
$hotelRoom->getSize(); // Площадь номера
$hotelRoom->getWithWindow(); // Есть ли окно в номере
$hotelRoom->getBuildingPart(); // Часть здания, в которой расположен номер
$hotelRoom->getBedroomAmount(); // Кол-во комнат в номере
// Удобства в номере
/** @var Bronevik\HotelsConnector\Element\AvailableAmenity $availableAmenity */
foreach ($hotelRoom->getAvailableAmenities() as $availableAmenity) {
$availableAmenity->getId();
$availableAmenity->getPrice();
$availableAmenity->getIncluded();
}
// Фотограции номера
/** @var Bronevik\HotelsConnector\Element\Image $photo */
foreach ($hotelRoom->getPhotos() as $photo) {
$photo->getUrl();
$photo->getGuid();
}
// размещения кроватей в номере
/** @var Bronevik\HotelsConnector\Element\BedSets $bedSets */
$bedSets = $hotelRoom->getBedSets();
// Массив вариантов комбинаций кроватей
/** @var Bronevik\HotelsConnector\Element\BedSet $bedSet */
foreach ($bedSets->getBedSet() as $bedSet) {
// Вариант размещения кроватей
/** @var Bronevik\HotelsConnector\Element\Bed $bed */
foreach ($bedSet->getBed() as $bed) {
$bed->getType(); // Тип размещения в номере
$bed->getAmount(); // Количество кроватей
}
}
/** @var Bronevik\HotelsConnector\Element\WindowViews $windowViews */
$windowViews = $hotelRoom->getWindowViews();
// Массив видов из окна
foreach ($windowViews->getName() as $windowViewName) {
// название вида из номера
echo $windowViewName;
}
}
}
Метод getHotelOffer()
принимает код предложения.
Возвращает те же данные, что и метод searchHotelOffers()
.
<?php
/**
* Также есть возможность управлять содержимым ответа
* Все возможные элементы, которые можно пропустить здесь:
* @see \Bronevik\HotelsConnector\Enum\SkipElementTypes::$availableSkipElementsForGetHotelOffer
*/
$skipElements = [Bronevik\HotelsConnector\Enum\SkipElementTypes::DAILY_PRICES];
/** @var Bronevik\HotelsConnector\Element\HotelOffer $offer */
$offer = $connector->getHotelOffer(
'T1I3MTYjI2RvdWJsZSMxMDY0IzIwMTYtMDEtMjIjMjAxNi0wMS0yNCMyLDE=',
$skipElements
);
Заказ бронирования осуществляется на основе предложения \Bronevik\HotelsConnector\Element\HotelOffer
. На каждый
бронируемый номер необходимо создать объект услуги проживания ($accomodation
). Все объекты услуг добавляются в заказ.
В этом примере заказывается бронирование двух номеров для четырёх человек:
<?php
/** @var Bronevik\HotelsConnector\Element\HotelOffer $offer */
$offer = $connector->getHotelOffer('T1I3MTYjI2RvdWJsZSMxMDY0IzIwMTYtMDEtMjIjMjAxNi0wMS0yNCMyLDE=');
// Создание запроса на бронирование номеров
$orderRequest = new Bronevik\HotelsConnector\Element\CreateOrderRequest();
$orderRequest->setContactPerson('Григорий');
$orderRequest->setContactEmail('[email protected]');
$orderRequest->setContactPhone('+79991234567');
$orderRequest->setComment('Гости приедут в районе 18 часов.');
// Создание услуг проживания и привязка их к заказу.
$accommodation = new Bronevik\HotelsConnector\Element\ServiceAccommodation;
$accommodation->setOfferCode($offer->getCode());
$accommodation->setComment('Гостям потребуется высокоскоростное подключение к Интернет.');
$accommodation->addGuests('Валентин');
$accommodation->addMeals(2); // Добавить питание в услугу
$accommodation->addMeals(34); // Если нужно несколько услуг питания
$accommodation->setCheckinHour(10); // Установить час заезда
$accommodation->setCheckoutHour(8); // Установить час выезда
$accommodation->setSellingPrice(1000); // Установить желаемую цену продажи
$accommodation->setReferenceId('test'); // Установить номер услуги в системе клиента
// также можно добавить доп. поля для создания услуг
$serviceExtraField = new Bronevik\HotelsConnector\Element\ServiceExtraField();
$serviceExtraField->setName('name');
$serviceExtraField->setValue('value');
$accommodation->addExtraField($serviceExtraField);
$orderRequest->addServices($accommodation);
// Нужно создавать по услуге на каждый бронируемый номер.
$accommodation = new Bronevik\HotelsConnector\Element\ServiceAccommodation;
$accommodation->setOfferCode($offer->getCode());
$accommodation->setComment('Не представлять напитки из минибара.');
$accommodation->addGuests('Николай');
$accommodation->addGuests('Эльдар');
$orderRequest->addServices($accommodation);
// Отправка заказа
/** @var Bronevik\HotelsConnector\Element\Order $order */
$order = $connector->createOrder($orderRequest);
Разбор результата:
<?php
/** @var Bronevik\HotelsConnector\Element\Order $order */
$order->getId(); // Id заказа
$order->getComment(); // Комментарий к заказу, который был указан при создании
$order->getContactPerson(); // Контактное лицо
$order->getContactPhone(); // Контактный телефон
$order->getContactEmail(); // Контактный email
/** @var Bronevik\HotelsConnector\Element\OrderServiceAccommodation $service */
foreach ($order->getServices() as $service) {
$service->getId(); // Id услуги
$service->getDate(); // Дата создания услуги
$service->getComment(); // Комментарий к услуге, который был указан при создании
$service->getPaymentRecipient(); // Способ оплаты, возможные значения: \Bronevik\HotelsConnector\Enum\PaymentRecipients
$service->getIsBlockRoom(); // Блочный ли номер?
$service->getRoomId(); // Id номера
$service->getCountryId(); // Id страны
$service->getCountryName(); // Название страны
$service->getCityId(); // Id города
$service->getCityName(); // Название города
$service->getHotelId(); // Id отеля
$service->getHotelName(); // Название отеля
$service->getReferenceId(); // Номер услуги в системе клиента
$service->getStatusId(); // Id статуса
$service->getStatusName(); // Название статуса
$service->getCheckin(); // Час заезда
$service->getCheckout(); // Час выезда
$service->getNonRefundable(); // Является ли тариф невозвратным?
$service->getOfferCode(); // Код предложения, с помощью которого оформлена услуга
$service->getOfferName(); // Название предложения
$service->getRoomType(); // Тип размещения
$service->getVATPercent(); // Ставка НДС
/** @var Bronevik\HotelsConnector\Element\ServiceExtraField $serviceExtraField */
// доп. поля для создания услуг
foreach ($service->getExtraField() as $serviceExtraField) {
$serviceExtraField->getName(); // Название
$serviceExtraField->getValue(); // Значение
}
// ежедневные цены
/** @var Bronevik\HotelsConnector\Element\DailyPrice $dailyPrice */
foreach ($service->getDailyPrices()->dailyPrice as $dailyPrice) {
// аналогично dailyPrice в SearchHotelOffers
$dailyPrice->getDate(); // Дата, на которую рассчитана цена
$dailyPrice->getBookingFee(); // Стоимость брони в отеле
$dailyPrice->getEarlyArrival(); // Стоимость раннего заезда
$dailyPrice->getLateDeparture(); // Стоимость позднего выезда
$dailyPrice->getRate(); // Стоимость номера
}
// гости
foreach ($service->getGuests() as $guest) {
/** @var string $guest */
echo $guest;
}
// договор, привязанный к услуге
/** @var Bronevik\HotelsConnector\Element\Contract $contract */
$contract = $service->getContract();
$contract->getId(); // Id договора
$contract->getNumber(); // Номер договора
$contract->getBeginsAt(); // Дата начала действия договора
$contract->getLegalEntity(); // Юридическое лицо
$service->getPriceDetails(); // аналогично как и для SearchHotelOffers
$service->getCancellationPolicies(); // аналогично как и для SearchHotelOffers
$service->getMeals(); // аналогично как и для SearchHotelOffers
$service->getOfferPolicies(); // аналогично как и для SearchHotelOffers
}
Метод getOrder()
принимает Id заказа.
Возвращает те же данные, что и метод createOrder().
<?php
/** @var Bronevik\HotelsConnector\Element\Order $order */
$order = $connector->getOrder(349007);
<?php
/** @var Bronevik\HotelsConnector\Element\Order $order */
/** @var bool $cancelResult */
$cancelResult = $connector->cancelOrder($order->getId());
<?php
// критерии поиска
$criteria = [];
// поиск по id заказа
$criterion = new Bronevik\HotelsConnector\Element\SearchOrderCriterionOrderId();
$criterion->setOrderId(123); // id заказа
$criteria[] = $criterion;
// поиск по id услуги
$criterion = new Bronevik\HotelsConnector\Element\SearchOrderCriterionServiceId();
$criterion->setServiceId(123); // id услуги
$criteria[] = $criterion;
// поиск по номеру услуги в системе клиента
$criterion = new Bronevik\HotelsConnector\Element\SearchOrderCriterionServiceReferenceId();
$criterion->setReferenceId(123); // номер услуги в системе клиента
$criteria[] = $criterion;
// поиск по дате создания заказа
$criterion = new Bronevik\HotelsConnector\Element\SearchOrderCriterionCreateDate();
$criterion->setDateStart('2019-01-01'); // начальная дата периода поиска
$criterion->setDateEnd('2019-01-10'); // конечная дата периода поиска
$criteria[] = $criterion;
// поиск по дате заезда
$criterion = new Bronevik\HotelsConnector\Element\SearchOrderCriterionArrivalDate();
$criterion->setDateStart('2019-01-01'); // начальная дата периода поиска
$criterion->setDateEnd('2019-01-10'); // конечная дата периода поиска
$criteria[] = $criterion;
// поиск по дате выезда
$criterion = new Bronevik\HotelsConnector\Element\SearchOrderCriterionDepartureDate();
$criterion->setDateStart('2019-01-01'); // начальная дата периода поиска
$criterion->setDateEnd('2019-01-10'); // конечная дата периода поиска
$criteria[] = $criterion;
// поиск по имени гостя
$criterion = new Bronevik\HotelsConnector\Element\SearchOrderCriterionGuest();
$criterion->setName('Имя гостя'); // Имя гостя
$criteria[] = $criterion;
$orders = $connector->searchOrders($criteria);
Также есть возможность посмотреть историю изменений по всем услугам клиента.
<?php
/** @var Bronevik\HotelsConnector\Element\OrdersChangelogRecord[] $changelogRecords */
$changelogRecords = $connector->GetOrdersChangelog();
/** @var Bronevik\HotelsConnector\Element\OrdersChangelogRecord[] $changelogRecords */
foreach ($changelogRecords as $changelogRecord) {
$changelogRecord->getId(); // идентификатор записи
$changelogRecord->getOrderId(); // номер заказа
$changelogRecord->getServiceId(); // номер услуги
$changelogRecord->getReferenceId(); // номер услуги в системе клиента
$changelogRecord->getCreatedAt(); // дата создания записи об изменениях
$changelogRecord->getServiceCreationSource(); // ресурс, откуда создана услуга
/** @var Bronevik\HotelsConnector\Element\ChangeList $changes */
$changes = $changelogRecord->getChangeList();
/** @var Bronevik\HotelsConnector\Element\Change $change */
foreach ($changes->change as $change) {
$change->getElement(); // Название элемента
$change->getNewValue(); // Его новое значение
}
}
Для того, чтобы удалить записи истории изменений изменений, нужно воспользоваться операцией RemoveOrdersChangelogRecords и в качестве аргумента передать массив идентификаторов записей.
<?php
// идентификаторы записей в историю изменений
$ids = [1, 2, 3];
/** @var string $status */
$status = $connector->RemoveOrdersChangelogRecords($ids);
// при успешном удалении записей будет возвращен статус 'ok'
// в случае ошибки будет выброшено исключение
Для получения комментариев необходимо воспользоваться операцией getServiceMessages. В качестве аргуметов можно передать id услуги или ids сообщений.
Примечание. Если передать и id услуги, и ids сообщений, то будет осуществлен поиск ids комментариев в этой услуге.
<?php
// идентификаторы записей в историю изменений
$serviceId = 123; // id услуги
$messageIds = [1, 2, 3]; // ids сообщений
/** @var Bronevik\HotelsConnector\Element\Messages $messages */
$messages = $connector->getServiceMessages(
$serviceId,
$messageIds
);
/** @var Bronevik\HotelsConnector\Element\Message $message */
foreach ($messages->getMessage() as $message) {
$message->getId(); // id сообщения
$message->getServiceId(); // id услуги
$message->getDate(); // Дата и время отправки комментария.
$message->getSenderName(); // Имя отправителя комментария
$message->getSenderType(); // Тип отправителя: менеджер или клиент.
$message->getText(); // Текст комментария
}
Для отправки комментария нужно передать id услуги и текст комментария. В качестве ответа будет id только что созданного комментария.
<?php
// идентификаторы записей в историю изменений
$serviceId = 123; // id услуги
$text = 'Текст комментария'; // Текст комментария
/** @var int $messageId */
$messageId = $connector->sendServiceMessage(
$serviceId,
$text
);
Для получения детализации предложений можно воспользоваться операцией GetHotelOfferPricing, которая позволяет просмотреть подробную детализацию услуг, не создавая заказа.
<?php
// массив услуг
$services = [];
// Проживание создается также как и для создания заказа
$accommodation = new Bronevik\HotelsConnector\Element\ServiceAccommodation;
$accommodation->setOfferCode('offer-code');
$accommodation->setComment('Гостям потребуется высокоскоростное подключение к Интернет.');
$accommodation->addGuests('Валентин');
$services[] = $accommodation;
// Нужно создавать по услуге на каждый бронируемый номер.
$accommodation = new Bronevik\HotelsConnector\Element\ServiceAccommodation;
$accommodation->setOfferCode('offer-code');
$accommodation->setComment('Не представлять напитки из минибара.');
$accommodation->addGuests('Николай');
$services[] = $accommodation;
/** @var Bronevik\HotelsConnector\Element\OrderServiceAccommodation[] $orderServices */
$orderServices = $connector->GetHotelOfferPricing($services);
// объект услуги в ответе точно такой же как и при создании заказа
Для обновления услуги нужно воспользоваться методом updateService, который принимает на вход идентификатор услуги и referenceId.
<?php
$serviceId = 123; // идентификатор услуги
$referenceId = 'referenceId'; // идентификатор услуги в системе клиента
$response = $connector->updateService($serviceId, $referenceId);
$response->getReferenceId(); // Обновленный referenceId
$response->getResult(); // результат обновления referenceId (true или false)
Для аннуляции услуг нужно воспользоваться методом cancelServices, который принимает на вход массив идентификаторов услуг.
<?php
$serviceIds = [123 ,234]; // идентификаторы услуг
/** @var Bronevik\HotelsConnector\Element\CancelledService[] $cancelledServices */
$cancelledServices = $connector->cancelServices($serviceIds);
foreach ($cancelledServices as $cancelledService) {
/** @var Bronevik\HotelsConnector\Element\CancelledService $cancelledService */
$cancelledService->getId(); // идентификатор услуги
$cancelledService->getStatus(); // статус услуги (Описание статусов есть в документации)
$cancelledService->getResult(); // результат аннуляции услуги
}
<?php
$checkinDate = '2019-08-01'; // дата заезда
$checkoutDate = '2019-08-02'; // дата выезда
$cityId = 1; // идентификатор города
/** @var Bronevik\HotelsConnector\Element\HotelWithCheapestOffer[] $hotelsWithCheapestOffers */
$hotelsWithCheapestOffers = $connector->searchHotelAvailability(
$checkinDate,
$checkoutDate,
$cityId
);
<?php
$checkinDate = '2019-08-01'; // дата заезда
$checkoutDate = '2019-08-02'; // дата выезда
$hotelIds = [1, 2, 3]; // идентификаторы отелей (до 100 шт)
/** @var Bronevik\HotelsConnector\Element\HotelWithCheapestOffer[] $hotelsWithCheapestOffers */
$hotelsWithCheapestOffers = $connector->searchHotelAvailability(
$checkinDate,
$checkoutDate,
null,
$hotelIds
);
<?php
$latitude = 30.1234; // широта
$longitude = 30.1234; // долгота
$radius = 12.1; // радиус в км (от 0 до 30 км, точность до 1 десятой)
$geolocation = new Bronevik\HotelsConnector\Element\GeoLocation();
$geolocation->latitude = $latitude;
$geolocation->longitude = $longitude;
$geolocation->radius = $radius;
$checkinDate = '2019-08-01'; // дата заезда
$checkoutDate = '2019-08-02'; // дата выезда
/** @var Bronevik\HotelsConnector\Element\HotelWithCheapestOffer[] $hotelsWithCheapestOffers */
$hotelsWithCheapestOffers = $connector->searchHotelAvailability(
$checkinDate,
$checkoutDate,
null,
[],
$geolocation
);
<?php
$checkinDate = '2019-08-01'; // дата заезда
$checkoutDate = '2019-08-02'; // дата выезда
$cityId = 1; // идентификатор города
$criteria = []; // массив критериев
$criteria[] = new Bronevik\HotelsConnector\Element\SearchOfferCriterionOnlyOnline();
/**
* Более подробную информацию о критериях смотрите в методе searchHotelOffers
*/
/** @var Bronevik\HotelsConnector\Element\HotelWithCheapestOffer[] $hotelsWithCheapestOffers */
$hotelsWithCheapestOffers = $connector->searchHotelAvailability(
$checkinDate,
$checkoutDate,
$cityId,
[],
null,
[],
$criteria
);
<?php
$checkinDate = '2019-08-01'; // дата заезда
$checkoutDate = '2019-08-02'; // дата выезда
$cityId = 1; // идентификатор города
$addElements = []; // массив с названиями нужных элементов
/**
* Все названия элементов содержатся в классе
* @see \Bronevik\HotelsConnector\Enum\AddElementsTypes
*/
$addElements[] = Bronevik\HotelsConnector\Enum\AddElementsTypes::HOTEL_AMENITIES;
$addElements[] = Bronevik\HotelsConnector\Enum\AddElementsTypes::GEO;
/** @var Bronevik\HotelsConnector\Element\HotelWithCheapestOffer[] $hotelsWithCheapestOffers */
$hotelsWithCheapestOffers = $connector->searchHotelAvailability(
$checkinDate,
$checkoutDate,
$cityId,
[],
null,
$addElements
);
<?php
$checkinDate = '2019-08-01'; // дата заезда
$checkoutDate = '2019-08-02'; // дата выезда
$cityId = 1; // идентификатор города
/** @var Bronevik\HotelsConnector\Element\HotelWithCheapestOffer[] $hotelsWithCheapestOffers */
$hotelsWithCheapestOffers = $connector->searchHotelAvailability(
$checkinDate,
$checkoutDate,
$cityId
);
foreach ($hotelsWithCheapestOffers as $hotelWithCheapestOffer) {
$hotelWithCheapestOffer->getId(); // идентификатор отеля
/**
* Детализация стоимости
*
* @var Bronevik\HotelsConnector\Element\PriceDetails $priceDetails
*/
$priceDetails = $hotelWithCheapestOffer->getMinimalPriceDetails();
$priceDetails->getVatApplicable(); // Применим ли к отелю НДС
$clientDetails = $priceDetails->getClient(); // Детализация клиентской стоимости
$hotelDetails = $priceDetails->getHotel(); // Детализация отельной стоимости
$additionalPrices = $priceDetails->getExtra(); // Дополнительные цены
$clientDetails->getVatIncluded(); // Включен ли НДС в клиентскую стоимость
$clientDetails->getCommission(); // Информация о комиссии
$clientDetails->getGross(); // Брутто-стоимость
$clientDetails->getNet(); // Нетто-стоимость
/** @var Bronevik\HotelsConnector\Element\AvailableAmenities */
$availableAmenities = $hotelWithCheapestOffer->getAmenities();
/** @var Bronevik\HotelsConnector\Element\AvailableAmenity $availableAmenity */
foreach ($availableAmenities->availableAmenity as $availableAmenity) {
$availableAmenity->getId();
$availableAmenity->getPrice();
$availableAmenity->getIncluded();
}
/** @var Bronevik\HotelsConnector\Element\HotelGeo $geoInfo */
$geoInfo = $hotelWithCheapestOffer->getGeo();
$geoInfo->getCityId(); // идентификатор города
$geoInfo->getCityName(); // название города
$geoInfo->getAddress(); // адрес отеля
$geoInfo->getDistanceToCenter(); // расстояние до центра города
/** @var Bronevik\HotelsConnector\Element\Coordinates $coordinates */
$coordinates = $geoInfo->getCoordinates();
$coordinates->getLatitude(); // широта
$coordinates->getLongitude(); // долгота
/** @var Bronevik\HotelsConnector\Element\HotelInfo $hotelInfo */
$hotelInfo = $hotelWithCheapestOffer->getInfo();
$hotelInfo->getName(); // название отеля
$hotelInfo->getDescription(); // описание отеля
$hotelInfo->getType(); // тип отеля
$hotelInfo->getCategory(); // категория отеля
$hotelInfo->getDeepLink(); // элемент для работы метапоисковых систем
/** @var Bronevik\HotelsConnector\Element\Image $hotelPhoto */
$hotelPhoto = $hotelInfo->getPhoto(); // главная фотография отеля
/** @var Bronevik\HotelsConnector\Element\HotelVatInfo $hotelVatInfo */
$hotelVatInfo = $hotelWithCheapestOffer->getVat();
$hotelVatInfo->getIncluded(); // включен ли НДС в отеле
$hotelVatInfo->getApplicable(); // применим ли НДС к отелю
$hotelVatInfo->getPercent(); // процент НДС
/** @var Bronevik\HotelsConnector\Element\SearchAvailabilityHotelOffer $hotelOffer */
$hotelOffer = $hotelWithCheapestOffer->getOffer();
/** @var Bronevik\HotelsConnector\Element\Image $roomPhoto */
$roomPhoto = $hotelOffer->getPhoto(); // главная фотография отеля
/** @var Bronevik\HotelsConnector\Element\AvailableAmenities $roomAmenities */
$roomAmenities = $hotelOffer->getAmenities();
$hotelOffer->getRoomId(); // идентификатор номера
$hotelOffer->getName(); // название номера
$hotelOffer->getRoomType(); // тип номера
$hotelOffer->getFreeRooms(); // кол-во свободных номеров
$hotelOffer->getIsBlockRoom(); // номер блочный?
$hotelOffer->getIsSharedRoom(); // номер с подселением?
$hotelOffer->getPaymentRecipient(); // способ оплаты
$hotelOffer->getNonRefundable(); // невозвратный ли тариф?
/** @var Bronevik\HotelsConnector\Element\AvailableMeals $meals */
$meals = $hotelOffer->getMeals();
/** @var Bronevik\HotelsConnector\Element\HotelOfferCancellationPolicy[] $cancellationPolicies */
$cancellationPolicies = $hotelOffer->getCancellationPolicies();
}
Для запроса цен раннего заезда и позднего выезда нужно воспользоваться методом getCheckinCheckoutPricing. Он принимает на вход массив оффер-кодов.
<?php
$offerCodes = [
'offerCode1',
'offerCode2',
];
/** @var Bronevik\HotelsConnector\Element\OfferCheckinCheckoutPrices[] $offerCheckinCheckoutPrices */
$offerCheckinCheckoutPrices = $connector->getCheckinCheckoutPricing($offerCodes);
/** @var Bronevik\HotelsConnector\Element\OfferCheckinCheckoutPrices $offerCheckinCheckoutPrice */
foreach ($offerCheckinCheckoutPrices as $offerCheckinCheckoutPrice) {
$offerCheckinCheckoutPrice->getOfferCode(); // оффер-код, для которого рассчитывается РЗПВ
/** @var Bronevik\HotelsConnector\Element\OfferHourPrices $earlyArrival */
$earlyArrival = $offerCheckinCheckoutPrice->getCheckin();
/** @var Bronevik\HotelsConnector\Element\OfferHourPrices $lateDeparture */
$lateDeparture = $offerCheckinCheckoutPrice->getOfferCode();
foreach ($earlyArrival->hourPrice as $offerHourPrice) {
$offerHourPrice->getHour(); // час
$offerHourPrice->getAvailabilityCode(); // код доступности (Описание кодов доступно в документации)
/**
* @see \Bronevik\HotelsConnector\Enum\AvailabilityCodes
*/
// детализация часа заезда
/** @var Bronevik\HotelsConnector\Element\PriceDetails $hourPriceDetails */
$hourPriceDetails = $offerHourPrice->getPriceDetails();
}
}
В случае внутренней ошибки API, возвращается SoapFault
Примечание. Описания ошибок (коды, описания ошибок и их текст) можно найти в документации в разделе
Коды ошибок
<?php
try {
$connector->getMeals();
}
catch (SoapFault $e) {
/** @var \StdClass $detail */
$detail = $e->detail->Fault;
$detail->traceId; // Id запроса
$detail->code; // Код ошибки
/**
* @see \Bronevik\HotelsConnector\Enum\ExceptionCodes
*/
}