Skip to content

bronevik-com/hotels-connector

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Коннектор для SOAP-сервиса hotels-api.bronevik.com

Build Status

Версионирование

Начиная с коннектора для версии API 2.5.0 изменилось версионирование. Для версий до 2.5.0 версия коннектора соответствовала версии API, теперь коннектор имеет свои теги: для API версии 2.5.0 опубликован коннектор 5.0.0

Установка

Требования

PHP 5.6+

ext-soap

Через Composer

Для установки через Composer необходимо выполнить команду:

composer require bronevik/hotels-connector

Без Composer

  1. Склонируйте https://github.com/bronevik-com/hotels-connector.git
  2. Зарегистрируйте автозагрузчик:
<?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,
    Bronevik\HotelsConnector\Enum\Endpoints::SECURE_DEVELOPMENT,
    true
);
$connector->setCredentials('login', 'password', 'privateKey');
$connector->setLanguage(Bronevik\HotelsConnector\Enum\Languages::RUSSIAN);

В конструктор коннектора передаётся endpoint SOAP-сервера и флаг debugMode.

Для endpoint возможны два значения:

  1. \Bronevik\HotelsConnector\Enum\Endpoints::DEVELOPMENT - для разработки, запросы отправляются на тестовый сервер.
  2. \Bronevik\HotelsConnector\Enum\Endpoints::PRODUCTION - для использования в бою.

Для secureEndpoint возможны два значения:

  1. \Bronevik\HotelsConnector\Enum\Endpoints::SECURE_DEVELOPMENT - для разработки, запросы отправляются на тестовый сервер.
  2. \Bronevik\HotelsConnector\Enum\Endpoints::SECURE_PRODUCTION - для использования в бою.

Флаг debugMode, установленный в true, позволяет использовать следующие методы:

  1. $connector->getLastResponse() для получения содержимого последнего ответа сервера.
  2. $connector->getLastResponseHeaders() для получения HTTP-заголовков последнего ответа сервера.
  3. $connector->getLastRequest() для получения содержимого последнего запроса сервера.
  4. $connector->getLastRequestHeaders() для получения HTTP-заголовков последнего запроса сервера.

В метод setCredentials() передаются:

  1. Логин вашей учётной записи bronevik.com.
  2. Пароль от учётной записи bronevik.com
  3. Ключ клиента. Выдаётся только после заключения договора на использование сервиса.

Метод setLanguage() принимает только \Bronevik\HotelsConnector\Enum\Languages::RUSSIAN или \Bronevik\HotelsConnector\Enum\Languages::ENGLISH.

Проверка подключения

Строка переданная в метод ping() будет отправлена сервером обратно.

<?php

echo $connector->ping('Привет, Броневичок!'); // Привет, Броневичок!

Документация по работе с SOAP сервером без использования этого коннектора

Документация в формате PDF: https://hotels-api.bronevik.com/v2.5.0/api.pdf

Следует упомянуть, что при вызове метода SearchHotelOffersRequest параметр currency является обязательным и сейчас у него только одно возможное значение: rub. Без заполнения этого параметра сервис вернёт сообщение об ошибке.

Документация по работе с клиентом и примеры

Справочники

Получение списка стран

Запрос:

<?php

/** @var Bronevik\HotelsConnector\Element\Countries $countries */
$countries = $connector->getCountries();

Разбор результата:

<?php

/** @var Bronevik\HotelsConnector\Element\Countries $countries */
foreach ($countries->getCountry() as $country) {
    $country->getId();   // 1
    $country->getName(); // Россия

    /** @var Bronevik\HotelsConnector\Element\CountryCodes $codes */
    $codes = $country->getCodes();
    
    $codes->getAlpha2(); // RU
    $codes->getAlpha3(); // RUS
}

Получение списка городов

Получение списка городов по стране

<?php

/** @var Bronevik\HotelsConnector\Element\Cities $cities */
$cities = $connector->getCitiesByCountryId(1);

Получение списка городов по городам

<?php
/** @var Bronevik\HotelsConnector\Element\Cities $cities */
$cities = $connector->getCitiesByCityIds([1]);

Разбор результата:

<?php

/** @var Bronevik\HotelsConnector\Element\Cities $cities */
foreach ($cities->city as $city) {
    $city->getId();         // 539
    $city->getName();       // Абаза
    $city->getRegionId();   // 102
    $city->getRegionName(); // Хакасия
    $city->getLatitude();   // 52.6439447
    $city->getLongitude();  // 90.1039492
    $city->getCountryId();  // 1
    $city->getCountryName() // Россия
}

Получение списка удобств

Запрос:

<?php

/** @var Bronevik\HotelsConnector\Element\Amenities $amenities */
$amenities = $connector->getAmenities();

Разбор результата:

<?php

/** @var Bronevik\HotelsConnector\Element\Amenities $amenities */
foreach ($amenities->amenity as $amenity) {
    $amenity->getId();        // 5
    $amenity->getName();      // Трансфер
    $amenity->getGroupName(); // Общие услуги отеля
}

Получение списка питания

<?php

/** @var Bronevik\HotelsConnector\Element\Meals $meals */
$meals = $connector->getMeals();

Разбор результата:

<?php

/** @var Bronevik\HotelsConnector\Element\Meals $meals */
foreach ($meals->meal as $meal) {
    $meal->getId();   // 2
    $meal->getName(); // Завтрак континентальный
}

Поиск предложений отелей

Простой запрос

<?php
$currency = \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB
/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
    '2016-01-22', // дата заезда
    '2016-01-24', // дата выезда,
    $currency,    // Валюта
    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\SearchOfferCriterionNumberOfGuests();
$criterion->setAdults(1); // Количество взрослых обязательно
$child = new HotelsConnector\Element\Child();
$child->setAge(5);
$child->setCount(1);
$criterion->addChild($child);
$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;

$currency = \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB

/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
    '2016-01-22', // дата заезда
    '2016-01-24', // дата выезда
    $currency,    // Валюта 
    1,            // Id города
    $criteria     // массив фильтров
);

Запрос предложений конкретных отелей

<?php

/**
 * Фильтр предложений по конкретным отелям (по ids отелей)
 * Можно указать до 100 отелей
 * @var int[]
*/
$hotelIds = [1, 2, 3];
$currency = \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB

/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
    '2016-01-22', // дата заезда
    '2016-01-24', // дата выезда
    $currency,    // Валюта
    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;

$currency = \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB

/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
    '2016-01-22', // дата заезда
    '2016-01-24', // дата выезда
    $currency,    // Валюта  
    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
$currency = \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB;

/** @var Bronevik\HotelsConnector\Element\Hotels $hotelsWithOffers */
$hotelsWithOffers = $connector->searchHotelOffers(
    '2016-01-22', // дата заезда
    '2016-01-24', // дата выезда
    $currency,    // Валюта
    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->getVatApplicable();      // Применим ли к отелю НДС? (например, true)
    $hotelWithOffers->getVatIncluded();        // Включен ли НДС? (например, true)
    $hotelWithOffers->getVATPercent();         // Процент НДС (например, 20)
    $hotelWithOffers->getHasTaxes();           // Наличие в отеле дополнительных сборов (например, false)
    $hotelWithOffers->getType();               // Тип отеля (например, hotel)
    $hotelWithOffers->isOnline();              // Работает ли отель онлайн

    // Информация для гостя
    $informationForGuest = $hotelWithOffers->getInformationForGuest();


    $allowableCheckinTime = $hotelWithOffers->getAllowableCheckinTime(); // Допустимое время заезда.
    $allowableCheckinTime->getTimeFrom(); // Начальное время.
    $allowableCheckinTime->getTimeTo(); // Конечное время.
    
    $allowableCheckoutTime = $hotelWithOffers->getAllowableCheckoutTime(); // Допустимое время выезда.
    $allowableCheckoutTime->getTimeFrom(); // Начальное время
    $allowableCheckoutTime->getTimeTo(); // Конечное время
    
    
    // уведомления для гостя
    foreach ($informationForGuest->getNotification() as $notification) {
        $notification->getType();  // тип уведомления
        $notification->getValue(); // текст уведомления
    }

    // Описание отеля
    /** @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()->photo as $photo) {
        $photo->getGuid(); // 73c7c9b97a36ac0d970990937d842417
        $photo->getUrl();  // //dev.bronevik.tech/static/photo/g/250x250a/73c7c9b97a36ac0d970990937d842417
    }

    /** @var Bronevik\HotelsConnector\Element\AvailableAmenity $amenity */
    foreach ($descriptionDetails->getAvailableAmenities()->availableAmenity as $amenity) {
        $amenity->getId(); // 1
        $amenity->getIncluded(); // false
        $amenity->getPrice(); // 125.00 
        $amenity->getCurrency()// Валюта - RUB
    }

    // предложения
    $offers = $hotelWithOffers->getOffers();

	/** @var Bronevik\HotelsConnector\Element\HotelOffer $offer */
    foreach ($offers->getOffer() as $offer) {
        $offer->getCode();                  // Код предложения (например, T1I3MTYjI2RvdWJsZSMxMDY0IzIwMTYtMDEtMjIjMjAxNi0wMS0yNCMyLDE=)
        $offer->getName();                  // Название предложения (например, Люкс)
        $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==&currency=RUB&spk=Corteos)
        $offer->getRoomWithWindow();        // Наличие окна в номере (например, true)
        $offer->getGuaranteeType();         // Тип гарантии

        // информация о тарифе
        /** @var Bronevik\HotelsConnector\Element\RateType $rateType */
        $rateType = $offer->getRateType();
        $rateType->getRateName();        // Название тарифа
        $rateType->getRateDescription(); // Описание тарифа

        /**
          * Детализация стоимости 
          * 
          * @var Bronevik\HotelsConnector\Element\PriceDetails $priceDetails
          */
        $priceDetails = $offer->getPriceDetails();
        $priceDetails->getVatApplicable();              // Применим ли к отелю НДС
        $clientDetails    = $priceDetails->getClient(); // Детализация клиентской стоимости
        $hotelDetails     = $priceDetails->getHotel();  // Детализация отельной стоимости
        $additionalPrices = $clientDetails->getClientCurrency()->getExtra()  // Дополнительные цены

        $clientDetails->getVatIncluded();   // Включен ли НДС в клиентскую стоимость
        $clientDetails->getClientCurrency() // Цены в валюте клиента  
        $clientDetails->getCommission();    // Информация о комиссии
        $clientDetails->getGross();         // Брутто-стоимость
        $clientDetails->getNet();           // Нетто-стоимость

        /**
         * @var Bronevik\HotelsConnector\Element\ClientPriceDetails $clientDetails
         * getClientCurrency, 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()->tax 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->getPenaltyPriceDetails(); // Детализация цен штрафа
            
            /** @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()->meal as $meal) {
            $meal->getId();         // Идентификатор услуги питания
            $meal->getIncluded();   // Включена ли услуга в предложение
            $meal->getVATPercent(); // Ставка НДС

            /** @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\OfferPolicies $offerPolicy */
        $offerPolicies = $offer->getOfferPolicies();
        foreach ($offerPolicies->getPolicy() as $policy) {
            $policy->getType();
            $policy->getValue();
        }
        
        //Информация о детях
        if ($offer->getChildrenAccommodation()) {
            foreach ($offer->getChildrenAccommodation()->getChildren() as $childAccommodation) {
                $childAccommodation->getAge();           // Возраст
                $childAccommodation->getCount();         // Количество детей данного возраста
                $childAccommodation->isIncluded();       // Дети включены в услугу
                $childAccommodation->getAccommodation(); // Тип размещения в номере
            }
        }
        
        // размещения кроватей в номере
        /** @var Bronevik\HotelsConnector\Element\BedSets $bedSets */
        $bedSets = $offer->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(); // Количество кроватей
            }
        }
    }
}

Получение информации об отелях

Метод getHotelInfo() принимает массив идентификаторов отелей.

Возвращает те же данные, что и метод searchHotelOffers(), но без информации о предложениях, с информацией о номерах в отеле.

<?php

/** @var Bronevik\HotelsConnector\Element\HotelWithInfo[] $hotelsWithInfo */
$hotelsWithInfo = $connector->getHotelInfo([716, 901]); //Получить по Id отелей

$cityIds = [1, 2, 3];
$hotelsWithInfo = $connector->getHotelInfoByCityIds($cityIds); //Получить по Id городов

Ответ:

<?php

/** @var Bronevik\HotelsConnector\Element\HotelWithInfo[] $hotelsWithInfo */
foreach ($hotelsWithInfo as $hotelWithInfo) {
    // Сертификат, подтверждающий звездность отеля.
    /** @var Bronevik\HotelsConnector\Element\CategoryCertificate $categoryCertificate */
    $categoryCertificate = $hotelWithInfo->getCategoryCertificate();

    $categoryCertificate->getNumber();  // Номер сертификата
    $categoryCertificate->getEndDate(); // Дата истечения сертификата

    /** @var Bronevik\HotelsConnector\Element\HotelRoom $hotelRoom */
    foreach ($hotelWithInfo->getRooms()->room as $hotelRoom) {
        $hotelRoom->getId();            // Id номера
        $hotelRoom->getName();          // Название номера
        $hotelRoom->getDescription();   // Описание номера
        $hotelRoom->getSize();          // Площадь номера
        $hotelRoom->getWithWindow();    // Есть ли окно в номере
        $hotelRoom->getBuildingPart();  // Часть здания, в которой расположен номер
        $hotelRoom->getBedroomAmount(); // Кол-во комнат в номере

        // Удобства в номере
        /** @var Bronevik\HotelsConnector\Element\AvailableAmenity $availableAmenity */
        foreach ($hotelRoom->getAvailableAmenities()->availableAmenity as $availableAmenity) {
            $availableAmenity->getId();
            $availableAmenity->getPrice();
            $availableAmenity->getIncluded();
            $availableAmenity->getCurrency();
        }

        // Фотограции номера
        /** @var Bronevik\HotelsConnector\Element\Image $photo */
        foreach ($hotelRoom->getPhotos()->photo as $photo) {
            $photo->getUrl();
            $photo->getGuid();
        }

        // размещения кроватей в номере
        /** @var Bronevik\HotelsConnector\Element\BedSets $bedSets */
        $bedSets = $hotelRoom->getBedSets(); // Далее аналогично ответу SearchHotelOffers

        /** @var Bronevik\HotelsConnector\Element\WindowViews $windowViews */
        $windowViews = $hotelRoom->getWindowViews();
        // Массив видов из окна

        foreach ($windowViews->getName() as $windowViewName) {
            // название вида из номера
            echo $windowViewName;
        }
    }
}

Заказ бронирования проживания и операции с заказами

Создание заказа

Заказ бронирования осуществляется на основе предложения \Bronevik\HotelsConnector\Element\HotelOffer. На каждый бронируемый номер необходимо создать объект услуги проживания ($accomodation). Все объекты услуг добавляются в заказ.

В этом примере заказывается бронирование двух номеров для четырёх человек:

<?php
// Создание запроса на бронирование номеров
$orderRequest = new Bronevik\HotelsConnector\Element\CreateOrderRequest();
$orderRequest->setCurrency(\Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB);
$orderRequest->setContactPerson('Григорий');
$orderRequest->setContactEmail('grigoriy@example.com');
$orderRequest->setContactPhone('+79991234567');
$orderRequest->setComment('Гости приедут в районе 18 часов.');

// Создание услуг проживания и привязка их к заказу.
$accommodation = new Bronevik\HotelsConnector\Element\ServiceAccommodation;
$accommodation->setOfferCode('T1I3MTYjI2RvdWJsZSMxMDY0IzIwMTYtMDEtMjIjMjAxNi0wMS0yNCMyLDE=');
$accommodation->setComment('Гостям потребуется высокоскоростное подключение к Интернет.');
$guest = new Bronevik\HotelsConnector\Element\Guest();
$guest->setFirstName('Спанч');
$guest->setLastName('Боб');
$accommodation->guests->add($guest);

// Добавление детей
$child = new \Bronevik\HotelsConnector\Element\Child();
$child->setAge(3);
$child->setCount(2);
$accommodation->guests->addChild($child);

//Добавление предпочитаемого набора кроватей
$bed = new HotelsConnector\Element\Bed();
$bed->setAmount(1);                                     //Установить количество кроватей
$bed->setType(HotelsConnector\Enum\BedTypes::DOUBLE);   //Установить тип кроватей
$preferredBedSet = new HotelsConnector\Element\BedSet();
$preferredBedSet->addBed($bed);
$accommodation->setPreferredBedSet($preferredBedSet);

$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('T1I3MTYjI2RvdWJsZSMxMDY0IzIwMTYtMDEtMjIjMjAxNi0wMS0yNCMyLDE=');
$accommodation->setComment('Не представлять напитки из минибара.');

$guestNikolay = new \Bronevik\HotelsConnector\Element\Guest();
$guestNikolay->setFirstName('Николай');
$guestNikolay->setLastName('Петрович');

$guestEldar = new \Bronevik\HotelsConnector\Element\Guest();
$guestEldar->setFirstName('Эльдар');
$guestEldar->setLastName('Джарахов');
$accommodation->guests->add($guestNikolay);
$accommodation->guests->add($guestEldar);
$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()->service as $service) {
    $service->getId();               // Id услуги
    $service->getDate();             // Дата создания услуги
    $service->getComment();          // Комментарий к услуге, который был указан при создании
    $service->getPaymentRecipient(); // Способ оплаты, возможные значения: \Bronevik\HotelsConnector\Enum\PaymentRecipients
    $service->getIsBlockRoom();      // Блочный ли номер?
    $service->getIsSharedRoom();     // Является ли номер номером с подселением?
    $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();       // Ставка НДС
    $service->getGuaranteeType();    // Тип гарантии
    $service->getGuests();           // Гости услуги
    $service->getPaymentTerms()      // Условия оплаты
   
    // информация о тарифе
    /** @var Bronevik\HotelsConnector\Element\RateType $rateType */
    $rateType = $service->getRateType();
    /**
     * Название тарифа
     * @see \Bronevik\HotelsConnector\Enum\RateTypeNames
     */
    $rateType->getRateName();
    $rateType->getRateDescription(); // Описание тарифа

    /** @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()->guest as $guest) {
        /** @var Bronevik\HotelsConnector\Element\Guest $guest */
        echo $guest->getLastName() . ' ' . $guest->getFirstName();
    }

    // договор, привязанный к услуге
    /** @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
    
    //Информация о детях аналогично как и для SearchHotelOffers
    if ($service->getChildrenAccommodation()) {
        foreach ($service->getChildrenAccommodation()->getChildren() as $childAccommodation) {
            $childAccommodation->getAge();           // Возраст
            $childAccommodation->getCount();         // Количество детей данного возраста
            $childAccommodation->isIncluded();       // Дети включены в услугу
            $childAccommodation->getAccommodation(); // Тип размещения в номере
        }
    }
    
    // Предпочитаемые кровати
    if ($service->getPreferredBedSet()) {
        foreach ($service->getPreferredBedSet()->getBed() as $bed) {
            $bed->getAmount(); // Количество кроватей
            $bed->getType();   // Тип размещения
        }
    }
}

Создание заказа с данными банковской карты

Запрос:

<?php
// Создание запроса на бронирование номеров
$orderRequest = new Bronevik\HotelsConnector\Element\CreateOrderWithCardDetailsRequest();
$orderRequest->setCurrency(\Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB) //Валюта

// Заполнение данных банковской карты
$orderRequest->guestInfo = new Bronevik\HotelsConnector\Element\GuestInfo();
$orderRequest->guestInfo->cardDetails = new Bronevik\HotelsConnector\Element\CardDetails();
$orderRequest->guestInfo->cardDetails->pan             = '1234123412341234'; // Номер карты
$orderRequest->guestInfo->cardDetails->cardholder      = 'IVANOV IVAN';      // Владелец карты
$orderRequest->guestInfo->cardDetails->expirationMonth = '01';               // Месяц истечения карты
$orderRequest->guestInfo->cardDetails->expirationYear  = '20';               // Год истечения карты
$orderRequest->guestInfo->cardDetails->CVV             = '123';              // CVV/CVC

// Заполнение информации о госте
$orderRequest->guestInfo->contacts = new Bronevik\HotelsConnector\Element\GuestContacts();
$orderRequest->guestInfo->contacts->email = 'guest@email.com'; // email гостя
$orderRequest->guestInfo->contacts->phone = '+79999999999';    // контактный телефон гостя

$orderRequest->setContactPerson('Григорий');
$orderRequest->setContactEmail('grigoriy@example.com');
$orderRequest->setContactPhone('+79991234567');
$orderRequest->setComment('Гости приедут в районе 18 часов.');

// Создание услуг проживания и привязка их к заказу.
$accommodation = new Bronevik\HotelsConnector\Element\ServiceAccommodation;
$accommodation->setOfferCode('T1I3MTYjI2RvdWJsZSMxMDY0IzIwMTYtMDEtMjIjMjAxNi0wMS0yNCMyLDE=');
$accommodation->setComment('Гостям потребуется высокоскоростное подключение к Интернет.');
$guest = new Bronevik\HotelsConnector\Element\Guest();
$guest->setFirstName('Спанч');
$guest->setLastName('Боб');
$accommodation->guests->add($guest);
// Добавление детей
$child = new \Bronevik\HotelsConnector\Element\Child();
$child->setAge(3);
$child->setCount(2);
$accommodation->guests->addChild($child);
$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('T1I3MTYjI2RvdWJsZSMxMDY0IzIwMTYtMDEtMjIjMjAxNi0wMS0yNCMyLDE=');
$accommodation->setComment('Не представлять напитки из минибара.');

$guestNikolay = new \Bronevik\HotelsConnector\Element\Guest();
$guestNikolay->setFirstName('Николай');
$guestNikolay->setLastName('Петрович');

$guestEldar = new \Bronevik\HotelsConnector\Element\Guest();
$guestEldar->setFirstName('Эльдар');
$guestEldar->setLastName('Джарахов');
$accommodation->guests->add($guestNikolay);
$accommodation->guests->add($guestEldar);
$orderRequest->addServices($accommodation);

// Отправка заказа
/** @var Bronevik\HotelsConnector\Element\Order $order */
$order = $connector->createOrderWithCardDetails($orderRequest);

Результат возвращается такой же, как и для обычного создания заказа (CreateOrder).

Получение информации о заказе

Метод getOrder() принимает Id заказа.

Возвращает те же данные, что и метод createOrder().

<?php

/** @var Bronevik\HotelsConnector\Element\Order $order */
$order = $connector->getOrder(349007);

Получение счетов заказа

Запрос:

<?php

$orderId = 1; // id Заказа
$orderInvoices = $connector->getOrderInvoices($orderId);

Разбор результата:

/** @var Bronevik\HotelsConnector\Element\OrderInvoices $invoice */ 
$orderInvoices->getId(); // id Заказа
$invoices = $orderInvoices->getInvoices(); // Счета заказа

/** @var Bronevik\HotelsConnector\Element\Invoice $invoice */
foreach($invoices as $invoice) {
   $invoice->getInvoiceLink(); // Временная ссылка для скачивания счета
   $invoiceInfo = $invoice->getInvoiceInfo(); // Информация о счете
   
    /** @var Bronevik\HotelsConnector\Element\Info $info */
    foreach($invoiceInfo->getInfo() as $info)
    {
        $info->getName(); //  Название параметра
        $info->getValue(); // Значение параметра
    }
}

Отмена заказа

<?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;

// поиск по типам гарантии
$criterion = new Bronevik\HotelsConnector\Element\SearchOfferCriterionGuaranteeTypes();
$criterion->addGuaranteeType(Bronevik\HotelsConnector\Enum\GuaranteeTypes::CLIENT_CONTRACT);
$criterion->addGuaranteeType(Bronevik\HotelsConnector\Enum\GuaranteeTypes::CONSUMER_CARD_WITH_CVV);
$criteria[] = $criterion;

$orders = $connector->searchOrders($criteria);

Услуги

История изменений

Получение записей истории изменений

Также есть возможность посмотреть историю изменений по всем услугам клиента.

<?php

/** @var Bronevik\HotelsConnector\Element\OrdersChangelogRecord[] $changelogRecords */
$changelogRecords = $connector->getOrdersChangelog()->getOrdersChangelogRecord();

/** @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();  // Название элемента
        $value = $change->getNewValue(); // Его новое значение
        
        //Информации о проживающих
        if ($value instanceof HotelsConnector\Element\GuestsChangeValue) {
            $guests = $value->getGuests();
            $guests->getChildren(); // Информация о взрослых
            $guests->getGuest(); // Информация о Детях
        }
    }
}
Удаление записей из истории изменений

Для того, чтобы удалить записи истории изменений изменений, нужно воспользоваться операцией 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('Гостям потребуется высокоскоростное подключение к Интернет.');
$guest = new \Bronevik\HotelsConnector\Element\Guest();
$guest->setFirstName('Валентин');
$guest->setLastName('Валентинович');

$accommodation->guests->add($guest);

$services[] = $accommodation;

// Нужно создавать по услуге на каждый бронируемый номер.
$accommodation = new Bronevik\HotelsConnector\Element\ServiceAccommodation;
$accommodation->setOfferCode('offer-code');
$accommodation->setComment('Не представлять напитки из минибара.');
$accommodation->guests->add($guest);
$services[] = $accommodation;

$currency = \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB; // Валюта 
/** @var Bronevik\HotelsConnector\Element\OrderServiceAccommodation[] $orderServices */
$orderServices = $connector->getHotelOfferPricing($services, $currency);

// объект услуги в ответе точно такой же как и при создании заказа

Онлайн коррекция услуги

Коррекция услуги

Запрос:

<?php
    $serviceId = 1; // Id услуги
    $updateService = new \Bronevik\HotelsConnector\Element\UpdateService();
    $updateService->setArrivalDate("2021-09-18"); // Коррекция даты заезда
    $updateService->setDepartureDate("2021-09-22"); //  Коррекция даты выезда
    $updateService->setReferenceId(1); // Коррекция номера услуги в системе клиента
    $addMeals = new \Bronevik\HotelsConnector\Element\MealIds();
    $addMeals->addMeal(1); // id услуги питания 
    $removeMeals = new \Bronevik\HotelsConnector\Element\MealIds();
    $removeMeals->addMeal(2); // id услуги питания 
    $updateService->setAddMeals($addMeals); // Добавить питание в услугу
    $updateService->setRemoveMeals($removeMeals); // Удалить питание из услуги 
    $updateService->setCheckinHour(15); // Коррекция часа заезда
    $updateService->setCheckoutHour(21); // Коррекция часа выезда
    $updateService->setComment('Комментарий'); // Коррекция комментария к услуге
    
    $response = $connector->updateService($serviceId, $updateService);

Запрос для коррекции цены продажи:

<?php
    $serviceId = 1; // Id услуги
    $updateService = new \Bronevik\HotelsConnector\Element\UpdateService();
    $updateService->setSellingPrice(100); // Цена продажи
    
    $response = $connector->updateService($serviceId, $updateService);

Разбор результатов:

<?php
/** @var \Bronevik\HotelsConnector\Element\GetServicePricingResponse $response */
$order = $response->getOrder();
$order->getId();            // Id заказа
$order->getComment();       // Комментарий к заказу, который был указан при создании
$order->getContactPerson(); // Контактное лицо
$order->getContactPhone();  // Контактный телефон
$order->getContactEmail();  // Контактный email

/** @var Bronevik\HotelsConnector\Element\OrderServiceAccommodation $service */
foreach ($order->getServices()->service as $service) {
    $service->getId();               // Id услуги
    $service->getDate();             // Дата создания услуги
    $service->getComment();          // Комментарий к услуге, который был указан при создании
    $service->getPaymentRecipient(); // Способ оплаты, возможные значения: \Bronevik\HotelsConnector\Enum\PaymentRecipients
    $service->getIsBlockRoom();      // Блочный ли номер?
    $service->getIsSharedRoom();     // Является ли номер номером с подселением?
    $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();       // Ставка НДС
    $service->getGuaranteeType();    // Тип гарантии
    $service->getGuests();           // Гости услуги
    $service->getPaymentTerms()      // Условия оплаты
   
    // информация о тарифе
    /** @var Bronevik\HotelsConnector\Element\RateType $rateType */
    $rateType = $service->getRateType();
    /**
     * Название тарифа
     * @see \Bronevik\HotelsConnector\Enum\RateTypeNames
     */
    $rateType->getRateName();
    $rateType->getRateDescription(); // Описание тарифа

    /** @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 Bronevik\HotelsConnector\Element\Guest $guest */
        echo $guest->getLastName() . ' ' . $guest->getFirstName();
    }

    // договор, привязанный к услуге
    /** @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
    
    //Информация о детях аналогично CreateOrder
    //Информация о предпочитаемых кроватях аналогично CreateOrder
}

Получение стоимость услуги с учетом коррекции

Запрос:

<?php
    $serviceId = 1; // Id услуги
    $updateService = new \Bronevik\HotelsConnector\Element\UpdateService();
    $updateService->setArrivalDate("2021-09-18"); // Коррекция даты заезда
    $updateService->setDepartureDate("2021-09-22"); //  Коррекция даты выезда
    $updateService->setReferenceId(1); // Коррекция номера услуги в системе клиента
    $addMeals = new \Bronevik\HotelsConnector\Element\MealIds();
    $addMeals->addMeal(1); // id услуги питания 
    $removeMeals = new \Bronevik\HotelsConnector\Element\MealIds();
    $removeMeals->addMeal(2); // id услуги питания 
    $updateService->setAddMeals($addMeals); // Добавить питание в услугу
    $updateService->setRemoveMeals($removeMeals); // Удалить питание из услуги 
    $updateService->setCheckinHour(15); // Коррекция часа заезда
    $updateService->setCheckoutHour(21); // Коррекция часа выезда
    $updateService->setComment('Комментарий'); // Коррекция комментария к услуге
    
    $response = $connector->getServicePricing($serviceId, $updateService);

Запрос для коррекции цены продажи:

<?php
    $serviceId = 1; // Id услуги
    $updateService = new \Bronevik\HotelsConnector\Element\UpdateService();
    $updateService->setSellingPrice(100); // Цена продажи
    
    $response = $connector->updateService($serviceId, $updateService);

Разбор результатов:

<?php
/** @var \Bronevik\HotelsConnector\Element\GetServicePricingResponse $response */
$order = $response->getOrder();
$order->getId();            // Id заказа
$order->getComment();       // Комментарий к заказу, который был указан при создании
$order->getContactPerson(); // Контактное лицо
$order->getContactPhone();  // Контактный телефон
$order->getContactEmail();  // Контактный email

/** @var Bronevik\HotelsConnector\Element\OrderServiceAccommodation $service */
foreach ($order->getServices()->service as $service) {
    $service->getId();               // Id услуги
    $service->getDate();             // Дата создания услуги
    $service->getComment();          // Комментарий к услуге, который был указан при создании
    $service->getPaymentRecipient(); // Способ оплаты, возможные значения: \Bronevik\HotelsConnector\Enum\PaymentRecipients
    $service->getIsBlockRoom();      // Блочный ли номер?
    $service->getIsSharedRoom();     // Является ли номер номером с подселением?
    $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();       // Ставка НДС
    $service->getGuaranteeType();    // Тип гарантии
    $service->getGuests();           // Гости услуги
    $service->getPaymentTerms()      // Условия оплаты
   
    // информация о тарифе
    /** @var Bronevik\HotelsConnector\Element\RateType $rateType */
    $rateType = $service->getRateType();
    /**
     * Название тарифа
     * @see \Bronevik\HotelsConnector\Enum\RateTypeNames
     */
    $rateType->getRateName();
    $rateType->getRateDescription(); // Описание тарифа

    /** @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 Bronevik\HotelsConnector\Element\Guest $guest */
        echo $guest->getLastName() . ' ' . $guest->getFirstName();
    }

    // договор, привязанный к услуге
    /** @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
    
    //Информация о детях аналогично CreateOrder
    //Информация о предпочитаемых кроватях аналогично CreateOrder
}

Получение доступности коррекции для услуг

Запрос:

<?php
$serviceIds = 123;
$availableCorrectionTypes = new Bronevik\HotelsConnector\Element\AvailableCorrectionTypes();
$availableCorrectionTypes->addCorrectionType(\Bronevik\HotelsConnector\Enum\CorrectionTypes::MEALS);
$response = $connector->getServiceAvailableCorrections($serviceIds, $availableCorrectionTypes);

Разбор результатов:

<?php
 /** @var Bronevik\HotelsConnector\Element\GetServiceAvailableCorrectionsResponse $response */
    $editService = $response->getEditService();
    $editService->getServiceId(); // Id услуги
    
    $arrivalDepartureDate = $editService->getArrivalDepartureDates(); // Информация о коррекции дат заезда/выезда
    $arrivalDepartureDate->getArrivalDate(); // Дата заезда
    $departureDate = $arrivalDepartureDate->getDepartureDate(); // Дата выезда
    $departureDate->getMaxAvailableDate(); // Максимально доступная дата для коррекции 
    $departureDate->getMinAvailableDate(); // Минимально доступная дата для коррекции 

    /** @var Bronevik\HotelsConnector\Element\AvailableMeals $meals */
    $meals = $editService->getMeals(); // Доступность питания
    
    /** @var Bronevik\HotelsConnector\Element\AvailableMeal $meal */
    foreach($meals->meal as $meal) {
        $meal->getId(); // Идентификатор услуги питания
        $meal->getIncluded(); // Включена ли услуга в предложение
        $meal->getVATPercent(); // Детализация услуги питания
        $meal->getPriceDetails(); // Ставка НДС
    }
    
    
    $meals->getCorrectionAvailability()->isAdding(); // Доступно ли добавление услуг питания
    $meals->getCorrectionAvailability()->isRemoving(); // Доступно ли удаление услуг питания
    
    $checkinCheckoutPrice = $editService->getCheckinCheckoutPrices(); // Цены и доступность РЗПВ
    $checkin = $checkinCheckoutPrice->getCheckin(); // Информация о раннем заезде
    $checkout = $checkinCheckoutPrice->getCheckout(); // Информация о позднем выезде
    
    $hoursPrice = $checkin->getHourPrice(); // Массив с ценами по часам.
    /** @var Bronevik\HotelsConnector\Element\EditServiceHourPrice $hourPrice */
    foreach($hoursPrice as $hourPrice)
    {
        $hourPrice->getHour(); // Час
        $hourPrice->getAvailabilityCode(); // Код доступности.
        $hourPrice->getPriceDetails(); //  Детализация часа.
    }
    
    $correctionAvailability = $editService->getCorrectionAvailability(); // Информация о доступности коррекции
    $correctionAvailability->getAvailableCorrectionNumber(); // Доступное количество коррекций
    $correctionAvailability->getIsCorrectionAvailable(); // Доступна ли коррекция услуги
    $correctionAvailability->getMeals(); // Доступна ли коррекция питания
    $correctionAvailability->getCheckinHour(); // Доступна ли коррекция часов заезда
    $correctionAvailability->getCheckoutHour(); // Доступна ли коррекция часов выезда
    $correctionAvailability->getArrivalDate(); // Доступна ли коррекция даты заезда
    $correctionAvailability->getDepartureDate(); // Доступна ли коррекция даты выезда
    $correctionAvailability->getSellingPrice(); // Доступна ли коррекция свайп шкалы
    $correctionAvailability->getComment(); // Доступна ли коррекция комментария
    $correctionAvailability->getGuests(); // Доступна ли коррекция гостей
    $correctionAvailability->getReferenceId(); // Доступна ли коррекция referenceId

Аннуляция услуг

Для аннуляции услуг нужно воспользоваться методом 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,
    \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB,
    $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,
    \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB,
    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,
    \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB,
    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,
    \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB,
    $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,
    \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB,
    $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,
    \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB,
    $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->getClientCurrency() // Цены в валюте клиента   
    $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();
        $availableAmenity->getCurrency();
    }

    /** @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();
    
    //Информация о детях
    if ($hotelOffer->getChildrenAccommodation()) {
        foreach ($hotelOffer->getChildrenAccommodation()->getChildren() as $childAccommodation) {
            $childAccommodation->getAge();           // Возраст
            $childAccommodation->getCount();         // Количество детей данного возраста
            $childAccommodation->isIncluded();       // Дети включены в услугу
            $childAccommodation->getAccommodation(); // Тип размещения в номере
        }
    }
    
    // Варианты комбинаций кроватей
    $bedSets = $hotelOffer->getBedSets();  // Далее аналогично ответу SearchHotelOffers
}

Запрос цен за РЗПВ

Для запроса цен раннего заезда и позднего выезда нужно воспользоваться методом getCheckinCheckoutPricing. Он принимает на вход массив оффер-кодов.

<?php
$offerCodes = [
    'offerCode1',
    'offerCode2',
];

$currency = \Bronevik\HotelsConnector\Enum\CurrencyCodes::RUB;
/** @var Bronevik\HotelsConnector\Element\OfferCheckinCheckoutPrices[] $offerCheckinCheckoutPrices */
$offerCheckinCheckoutPrices = $connector->getCheckinCheckoutPricing($offerCodes, $currency);

/** @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 
     */
}