Мастер-Тур(15):Программа туров. Внешние системы. Авиа GDS

Материал из Megatec
Версия от 05:28, 9 октября 2023; Romanov (обсуждение | вклад) (Обработка исключительных ситуаций)
Перейти к: навигация, поиск

Версия статьи от 9-10-2023.

Поддерживаемые версии ПК «Мастер-Тур»:
Начиная с 15 версии
Доступна с релиза 15.2


Введение

Система работает через API компании НЕМО тревел.
Она позволяет клиентам, имеющим договора с системами GDS (Амадеус, Сирена и т.д.) производить в корзине программы Мастер-Тур поиск по актуальным перелетам и бронировать их.

Работа в экране «Внешние системы»

На страницу Внешние системы можно попасть из меню турпрограмм (ссылка на страницу http://ip-адрес сервера/TourPrograms/ExternalSystems). Также на страницу Внешние системы можно попасть с любой страницы, перейдя в Меню → Внешние системы.

Страница Внешние системы представлена двумя вкладками:

  • Внешние поставщики – где происходит создание и редактирование пользователей системы;
  • Синхронизация – где осуществляется работа по сопоставлению данных из внешней системы.

Внешние поставщики

На вкладке Внешние поставщики представлен список поставщиков. Для каждого поставщика указан:

  • Название
  • Адаптер
  • Адрес API
  • Срок действия лицензии

Внешние поставщики

Любого поставщика можно отредактировать, выбрав по названию. Также можно добавить нового, нажав кнопку Добавить.

Редактирование поставщика NEMO

Список полей для заполнения ( * – обязательное):

  • Адаптер * – выбирается из списка
  • Название * – название поставщика
  • API адрес * – должен быть представлен в виде http(s)://domain(.ru)(:9999)(/something)
  • Авторизационный токен * – ключ доступа к серверу, по которому будет происходить подключение к внешнему поставщику
  • ID клиента * – id поставщика во внешней системе (предоставляется вместе с авторизационным токеном)
  • ID агентства – id агентства во внешней системе (предоставляется вместе с авторизационным токеном)
  • Багаж – все, багаж и ручная кладь, без багажа. Значение по умолчанию – все.
  • Класс авиаперелета – эконом, премиум-эконом, бизнес, первый. Значение по умолчанию – эконом.
  • Пересадки – все, без пересадок, 1 пересадка, 2 и более. Значение по умолчанию – без пересадок.
  • Сортировка – сначала дешевые, сначала быстрые, оптимальные. Значение по умолчанию – сначала дешевые.
    • сначала дешевые – сортировка по размеру доплаты от меньше к большей
    • сначала быстрые – сортировка по общей продолжительности авиаперелета туда от меньшей к большей
    • оптимальные – берется целиком вся поисковая выдача, считается среднее арифметическое от всех цен перелетов и среднее арифметическое от времени перелетов. На основе этих средних значений формируется рейтинг каждого отдельного перелета: чем цена перелета ниже относительно средней –> чем короче время перелета относительного среднего времени среди всех перелетов –> тем он оптимальнее. Точная формула рейтинга для каждого перелета такая: Рейтинг = (средняя цена на выдаче / цена перелета) х 0.9 + (средняя длительность перелета на выдаче / длительность перелета) х 1.1
  • Обновление цен – отвечает за включение/выключение механизма сохранения цен. По умолчанию признак выключен. Более детальное описание механизма сохранения цен.
    • Багаж – все, багаж и ручная кладь, без багажа. Значение по умолчанию – все. Возможен множественный выбор.
    • Пересадки – все, без пересадок, 1 пересадка, 2 и более. Значение по умолчанию – без пересадок. Возможен множественный выбор.
Предупреждение


Механизм обновления цен будет работать только для туров, у которых в настройках тура выбран признак 
«Применять комиссии, наценки и доплаты к услуге от внешнего поставщика».
  • Выбирать рейс автоматически, если не выбран пользователем - данная настройка регулирует обязательность выбора рейса от Авиа GDS в туре. Если настройка включена, то в случае, если пользователь попытается выйти из окна подбора рейса от внешнего поставщика в корзине, для него отобразится сообщение Вы не можете продолжить бронирование тура без выбора регулярного авиаперелета. При закрытии экрана будет автоматически подобран авиаперелет с минимальной стоимостью. После этого автоматически будет выбран перелёт по самой низкой цене из числа доступных. Если настройка выключена, то пользователь сможет выйти из окна подбора рейса и выбрать перелёт, заведённый на базе Мастер-Тур. Обрабатывается с релиза 15.6.
  • Поиск багажа в других тарифах – если выбран, то при наличии багажа в других тарифах пользователь будет видеть в поиске сообщение Возможно есть багаж в другом тарифе

Подключение к API адресу внешнего поставщика можно проверить по нажатию на кнопку Проверить подключение. Система производит пробное подключение к API и проверяет его доступность.

При сохранении внешнего поставщика в БД автоматически создается ценовой пакет и поставщик с названием, 
которое было введено при создании поставщика, в скобках указывается (внешняя система). Это необходимо для того, 
чтобы была возможность внести стоимость услуги, по которой будет работать поиск (при условии, что разрешается 
только бронирование услуги из внешней системы).

В случае, если внешний поставщик внесен для услуги Авиаперелет, то поставщику автоматически ставится признак Авиаперевозчик.

Синхронизация

Предупреждение


Для работы с внешними системами в папку \\TourPrograms\bin нужно добавить файл nemo_guide_etalon.s3db.
Также файл nemo_guide_etalon.s3db нужно добавить в папку \\TourSearchOwin.
Либо использовать настройку Путь к папке с файлом базы данных авиа GDS в панели администрирования


Синхронизация служит для сопоставления справочных данных из внешней системы со справочными данными, указанными в ПК Мастер-Тур. Для того, чтобы начать работу, нужно выбрать необходимые данные:

  • В списке Поставщик выбираем интересующего поставщика (в списке отображаются названия поставщиков, созданные на вкладке внешние поставщики)
  • В списке Справочник выбираем необходимый справочник

Новый поставщик

Слева отображаются справочные данные внешней системы. Справа отображаются справочные данные из ПК Мастер-Тур.
Данные, которые сопоставлены - подсвечены черным цветом. Не сопоставленные данные подсвечены красным цветом. Существует возможность фильтрации справочных данных по статусу (Сопоставлен или Не сопоставлен) и поиска по названию.
В блоке Сопоставленные данные отображаются сопоставленные данные по выбранным элементам в левой или/и правой частях. Отображаемые данные сортируются по алфавиту. Данные можно сопоставлять и удалять сопоставление:

  • Если нужно удалить сопоставление, можно воспользоваться кнопкой Удалить после нажатия данные станут не сопоставленными и подсвечены красным цветом. Если есть связанные сопоставления с удаляемой записью (к примеру, Страна->Город), то связанные сопоставления также будут удалены;
  • Если нужно данные сопоставить, то есть два варианта:
    • Точечное сопоставление - т.е. нужно выбрать не сопоставленное значение (подсвеченное красным цветом) в левой части и аналогичное ему значение в правой части (или то значение, которое должно быть сопоставлено). После того как значения выбраны, станет активной кнопка Сопоставить. Нажимаем кнопку, данные станут сопоставленными и подсвечены черным цветом
    • Автоматическое сопоставление (* – обязательное сопоставление) - при нажатии кнопки Автоматическое сопоставление запускается процесс автоматического сопоставления справочников. Для авиаперелетов сопоставляются только следующие справочники:
      • Страна (по названию) *
      • Город (по названию и стране) *
      • Авиакомпания (по коду) *
      • Тип самолета (по коду) – начиная с релиза 15.7 сопоставление типа самолета является необязательным. В том случае, если тип самолета не сопоставлен, то при выборе рейса в корзине он будет создан в базе данных Мастер-Тур и автоматически сопоставлен со значением из базы данных внешней системы.
      • Аэропорт (по стране и городу) *

Работа в системе

После того, как создан внешний поставщик и данные из внешней системы синхронизированы с данными ПК "Мастер-Тур", нужно создать тур, в который будут добавлены услуги от внешнего поставщика. Рассмотрим на примере создания тура, в котором содержатся три услуги – Авиаперелет туда (этот авиаперелет будет подбираться из внешней системы), Отель/круиз, Авиаперелет обратно:

Создание услуг и внесение цены

1. Создаем услугу Авиаперелет от внешнего поставщика:

  • Во вкладке Внешние поставщики создаем внешнего поставщика, например Nemo4 и у нас автоматически создается ценовой пакет, который называется Nemo4(внешняя система), поэтому в экране Выбор ценового пакета нужно выбрать именно этот ценовой пакет (т.е. услугу, подбираемую у внешнего поставщика, обязательно нужно заводить в ценовом пакете, созданном при создании внешнего поставщика).
  • Затем выбираем тип услуги Авиаперелет. Страну/город вылета и страну/город прилета выбираем те, которые нас интересуют для подбора перелета. Причем перелет может быть как обычным, так и многоплечевым. При подборе перелета в поиске анализируются точка отправления и точка прибытия. Для нашего примера выберем следующие страны: Россия/Москва - Австрия/Вена (т.к. нас интересуют такие перелеты, которые будут отправляться из Москвы и прибывать в Вену).
  • Создаем расписание – можно указывать любую авиакомпанию, рейс, аэропорт вылета/прилета, тип самолета и т.д. Внимание нужно обратить на время вылета и прилета, т.е. если перелет осуществляется в рамках одного дня, то внешние перелеты будут подбираться не выходя за границы дня (например, если в расписании указать время вылета 08:00, прилета 10:00, то в поиске будут подбираться рейсы, осуществляющиеся с 00:00 по 23:59 часов).
  • Выбираем тариф – Экономический класс (можно выбрать любой, т.к. на подбор перелетов от внешнего поставщика он никак не влияет).
  • Выбираем поставщика – выбираем именного внешнего поставщика. Он также появляется в БД "Партнеры" автоматически, при создании внешнего поставщика во вкладке Внешние поставщики. В нашем случае это поставщик Nemo4(внешняя система).
  • Затем заводим цену стандартным способом в экране Цены на услугу.
  • Начиная с релиза 15.7 добавлена возможность отображать цены, исключая деактивированные с помощью признака Исключая деактивированные.

Экран "Цены на услугу"

2. Создаем услугу Отель/круиз стандартным способом в экране Цены на услугу (можно использовать любой ценовой пакет и поставщика).

Создание тура и внесение услуг в его состав

3. Создаем тур стандартным способом и вносим в него созданные услуги (из примера, услуги, созданные в п.1, 2, 3).

Пример тура с услугой от внешнего поставщика

4. В итоге получаем тур для поиска, в котором Авиаперелет "туда" будет подбираться от внешнего поставщика (т.е. в подобранном перелете страна/город отправления и конечная страна/город прибытия будут соответствовать стране/городу отправления и конечной стране/городу прибытия, заведенным в услуге Авиаперелет от внешнего поставщика. Все остальные параметры услуги могут отличаться).

Предупреждение


Обратите внимание, что при тестировании функционала нельзя вводить фейковые данные 
как в тестовых, так и в реальных бронях. За это авиакомпании и GDS назначают штрафы.
Обратите внимание, что штрафы назначаются даже если бронирование с фейковыми данными 
делается на тестовом доступе.

Фейковыми данными являются ФИО следующих типов:
«test test»
«А А» (из одной или двух букв)
«1 1» (ФИО цифрами, или в ФИО будет цифра)
«АААА1 АААА1»
«ААА ВВВ» 

При добавлении услуг в состав тура, ценовой пакет (с пометкой внешняя система) и внешний поставщик для выбора появятся только если есть заведенная цена.

Экран поиска авиабилетов, начиная с релиза 15.5

При переходе в корзину по туру, где добавлена услуга Авиаперелет с заведенной ценой на внешнего поставщика, возможны два варианта подбора:

  • подбор осуществляется автоматически. Такой вариант подбора происходит, если в программе тура прямой или обратный перелеты заведены только от внешнего поставщика. Пока происходит подбор перелетов от внешнего поставщика в разделе выбора перелета отображается индикатор загрузки.
  • подбор перелетов осуществляется по нажатию кнопки Получить другие варианты. Такой вариант подбора происходит в случае, когда в программе тура прямой или обратный перелеты заведены как от внешнего поставщика, так и от поставщика внутри системы (т.е. есть как минимум две группы перелетов). При переходе в корзину, до нажатия кнопки Получить другие варианты отображается перелет (№ рейса, расписание и т.д.) от внутрисистемного поставщика.

Получить другие варианты

В шапке отображаются следующие данные:

  • городе, стране вылета
  • городе, стране прилета
  • дате вылета
  • дате возврата
  • количестве взрослых/детей (в виде иконок)
  • фильтр Класс перелета – по умолчанию выбрано то, что задано в настройках адаптера. Доступные значения: Эконом, Премиум-Эконом, Бизнес, Первый
  • Найти – кнопка активна в том случае, если был изменен фильтр Класс перелета. При нажатии отправляется новый поисковый запрос во внешнюю систему и после получения результатов перезагружаются фильтры и результаты выдачи

В фильтрах отображаются следующие данные:

  • Багаж – по умолчанию выбрано то, что задано в настройках адаптера. Доступные значения: Все, С багажом, Без багажа
  • Пересадки – по умолчанию выбрано то, что задано в настройках адаптера. Доступные значения: Все, Без пересадок, 1 пересадка, 2 и более
  • Время вылета/Время в пути – вылет/прилет туда и вылет/прилет обратно, разделенные на четыре диапазона
    • Утро (06:00-12:00)
    • День (12:00-18:00)
    • Вечер (18:00-24:00)
    • Ночь (00:00-06:00)
    • Время в пути (туда) – диапазон времени в пути для прямых авиаперелетов
    • Время в пути (обратно) – диапазон времени в пути для обратных авиаперелетов
    • Длительность пересадок – время длительности пересадок между перелетами, если перелет со стыковочными рейсами. Зависит от фильтра Длительность пересадок в Индивидуальные настройки подбора перелетов в туре. Если в фильтре в туре время стыковок меньше того, которое получаем от GDS, то в фильтре Длительность пересадок в поисковой выдаче будет указано время из тура, если наоборот - время максимальной длительности пересадки от GDS.
  • Аэропорты/Авиакомпании
    • Аэропорт вылета
    • Аэропорт пересадки
    • Аэропорт прилета
    • Авиакомпании
  • Сортировка: – по умолчанию выбрано то, что задано в настройках адаптера. Доступные значения: Сначала дешевые, Сначала быстрые, Оптимальные.
    • Сначала дешевые – сортировка по размеру доплаты от меньше к большей (значение по умолчанию)
    • Сначала быстрые – сортировка по общей продолжительности времени перелетов всех сегментов и пересадок между ними, от меньшей к большей
    • Оптимальные – берется целиком вся поисковая выдача, считается среднее арифметическое от всех цен перелетов и среднее арифметическое от времени перелетов. На основе этих средний значений формируется рейтинг каждого отдельного перелета – чем цена перелета ниже относительно средней и чем короче время перелета относительного среднего времени среди всех перелетов – тем он оптимальнее.
      Формула рейтинга для каждого перелета:
      Рейтинг = (средняя цена на выдаче / цена перелета) х 0.9 + (средняя длительность перелета на выдаче / длительность перелета) х 1.1

В результатах отображаются следующие данные:

  • Маршрут – город отправления (код аэропорта города отправления) –> город прибытия (код аэропорта города прибытия)
  • Время вылета/прилета
  • Рейс
  • Класс
  • Информация – информация о ручной клади, багаже и тайм-лимите. Тайм-лимит - время для выкупа билета
  • Доплата/скидка за авиаперелет

Кнопка Сменить тариф, отображается только для перелетов с семействами тарифов.

При включенной настройке Поиск багажа в других тарифах для рейсов без багажа под кнопкой "Сменить тариф" выводится сообщение с текстом "Возможно есть багаж в другом тарифе"

Mm 0003.png

При нажатии на кнопку "Сменить тариф" появляется окно с доступными тарифами, размером доплаты или скидки, детализацией по тарифу.

Выбор тарифа
Возле детализации отображаются значки:
IA 1.png - входит в стоимость
IA 2.png - за дополнительную плату
IA 3.png - недоступно
В детализации указывается: Название тарифа, стоимость доплаты или размер скидки, ручная кладь, багаж, выбор места, VIP сервис, программа бонусные милли, питание, возвратность, возможность обмена, ограничения по продажам
Далее после нажатия выбрать тариф доплата/скидка по данному перелету пересчитывается

Подобранные перелеты

Подбор перелетов (как прямого, так и обратного) осуществляется таким образом, что хотя бы прилет или вылет у перелета от внешнего поставщика обязательно будет в тот же день, что и у перелета, указанного в программе тура. Также количество промежуточных перелетов может быть больше или вообще их может не быть, обязательным является город/аэропорт вылета и город/аэропорт прилета. Количество свободных мест у выбранного подобранного перелета также берется из внешней системы.
Обратите внимание, что другие услуги, имеющиеся в туре, останутся неизменными, независимо от выбора регулярного перелета. Например был найден тур, в котором перелет туда происходил в первый день тура и заезд в отель – тоже в первый день. При подборе перелета выбирается перелет с прилетом на второй день. Заезд в отель все равно останется на первый день тура. В такой ситуации система выдает предупреждение, текст которого вы может отредактировать в соответствии со своими требованиями.
После того, как выбран перелет, в базу данных ПК "Мастер-Тур" записывается информация о расписании выбранных перелетов. Также пересчитывается стоимость всего тура и обновляется информация о перелетах в чеке.
Также необходимо обратить внимание на то, что, при наличии перед обратным перелетом маршрутной услуги, его дата подбирается исходя из даты окончания данной маршрутной услуги. К примеру, если в туре после проживания есть услуга трансфера (например, из отеля в аэропорт), приезд по которой в расписании происходит на следующий день, то и обратный перелет будет подбираться уже на следующий день, а не на день окончания услуги проживания.


Предупреждение


При бронировании билетов во внешней системе если были указаны данные по загранпаспорту 
и по национальному паспорту (фио и серия/номер паспорта), то во внешнюю систему 
отправляются данные из загранпаспорта

После бронирования пользователь переходит в экран Информация о заказе, где может увидеть всю информацию по своей путевке, включая информацию о тайм-лимите.

Экран поиска авиабилетов, начиная с релиза 15.6 (Canary)

В релизе 15.6 был разработан новый дизайн поиска туров и авиабилетов под названием Canary. Ознакомиться с описанием подбора перелетов от внешнего поставщика приложения Canary можно в соответствующем разделе.

Подобранные перелеты

Экран поиска авиабилетов, начиная с релиза 15.9 (Canary)

Начиная с релиза 15.9 разработан новый дизайн отображения вариантов перелетов от внешнего поставщика. Ознакомиться с описанием подбора перелетов от внешнего поставщика приложения Canary можно в соответствующем разделе. Возможны два варианта отображения перелетов:

  • "Компактный", где все рейсы сгруппированы внутри блока
Компактный вариант отображения рейсов


  • "Развернутый", где по кнопке Показать все рейсы - отображаются все рейсы внутри каждого блока по всем перелетам
Развернутый вариант отображения рейсов


По умолчанию отображается "компактный" вариант отображения рейсов. По нажатию на кнопку Показать все рейсы раскрывается список рейсов. Доступность кнопки задается настройкой СompactView. Если настройка не задана или стоит в значении false, то кнопка Показать все рейсы не отображается, по умолчанию представлен развернутый список рейсов.

Создание расписания для авиаперелетов из внешней системы

При бронировании путевки с авиаперелетом от внешнего поставщика, система будет создавать новую строку в справочнике Авиаперелеты с единичным расписанием одного перелета по путевке. Новая строка создаваться не будет, если в базе данных уже есть заведенное расписание, даты которого совпадают или включают в себя дату авиаперелета от внешнего поставщика, а также совпадает по времени вылета и прилета. Новое расписание создается без учета типа самолета (то есть, в том случае, если уже была создана строка с авиаперелетом, но с другим типом самолета, то не будет создаваться новая строка авиаперелета, а новая строка расписания будет добавлена к уже существующему авиаперелету).

Например, бронируем авиаперелет Москва - Вена с пересадкой в Варшаве.

Пример авиаперелета

Дальше можем наблюдать, что в справочнике Авиаперелеты по рейсу Москва - Варшава было создано новое расписание на дату перелета.

Создание новой строки в справочнике Авиаперелетов

Однако по рейсу Варшава - Вена новая строка не была создана, поскольку в системе уже было заведено расписание, даты которого включают в себя и дату перелета, а также совпадающее по времени вылета и прилета.

Создание новой строки в справочнике Авиаперелетов

Добавление услуги Авиаперелет в уже созданный тур

Возможен вариант добавление услуги Авиаперелет, заведенной от внешнего поставщика, в тур, где уже есть обычная услуга Авиаперелет. В таком случае перелет от внешнего поставщика нужно добавить в новую группу перелетов.

Jk 211.png

Обработка исключительных ситуаций

  • Если из-за технических ошибок бронь выбранной цены на авиаперелет из внешней системы невозможна или по выбранному направлению нет перелетов, то пользователю отобразится сообщение: Мы не смогли актуализировать цену регулярного авиаперелета. Вы можете продолжить бронирование тура. После бронирования тура его стоимость и детали регулярного авиаперелета могут измениться. Наш менеджер свяжется с вами для уточнения деталей. При этом при нажатии на кнопку ОК, пользователь возвращается в экран корзины, где сможет забронировать данный тур с локальным авиаперелетом. После бронирования пользователю на почту придет письмо с указанием: При бронировании рейсов в данном туре есть возможность бронирования удаленных рейсов, но в связи с техническими проблемами были забронированы локальные рейсы или For technical reasons, it was not possible to select a flight in GDS, but you can continue to book the tour. After finishing of the booking, the company manager will contact you and negotiate on the details and cost of the flights available for booking., саму ошибку можно найти в логах службы поиска TourSearchOwin (в файле CreateFlightsReservationRequestResponseLogger.txt, GetFlightsRequestResponseLogger.txt или ActualizeFlightsRequestResponseLogger.txt).

Техническая ошибка при поиске

  • Если при поиске билетов не найдено свободных мест, то пользователю отобразится сообщение: По выбранному направлению на эти даты отсутствуют свободные места. При этом при нажатии на кнопку ОК, пользователь возвращается в экран корзины, где сможет забронировать данный тур с локальным авиаперелетом. После бронирования пользователю на почту придет письмо с указанием: При бронировании рейсов в данном туре есть возможность бронирования удаленных рейсов, но в связи с техническими проблемами были забронированы локальные рейсы, саму ошибку можно найти в логах службы поиска TourSearchOwin (в файле CreateFlightsReservationRequestResponseLogger.txt, GetFlightsRequestResponseLogger.txt или ActualizeFlightsRequestResponseLogger.txt)..

Отсутствуют свободные места

  • Если при выборе цены на авиаперелет из внешней системы случилась ошибка запроса на актуализацию данных, то пользователю отобразится сообщение: Бронирование регулярного авиаперелета по данной цене невозможно, повторите запрос поиска и выберите подходящий вариант.

Ошибка запроса на актуализацию данных

  • У пользователя есть возможность выйти из экрана поиска перелета из внешней системы без выбора цены, вне зависимости от того, является перелет из внешней системы обязательным в туре. Для этого нужно нажать на крестик в правом верхнем углу, после чего пользователю отобразится сообщение: Внимание! Авиаперелет не был выбран! Нажмите "ОК" и повторите подбор с помощью кнопки "Получить другие варианты". В противном случае процесс бронирования тура продолжится без бронирования регулярного авиаперелета. Продолжая бронирование без выбора регулярного авиаперелета, вы соглашаетесь с тем, что стоимость тура и детали авиаперелета могут поменяться после бронирования тура. С вами свяжется наш менеджер для уточнения деталей.

Выход из экрана поиска

  • В случае, если у внешнего адаптера включена настройка Выбирать рейс автоматически, если не выбран пользователем, то при нажатии на крестик в правом верхнем углу пользователю отобразится сообщение: Вы не можете продолжить бронирование тура без выбора регулярного авиаперелета. При закрытии экрана будет автоматически подобран авиаперелет с минимальной стоимостью. После этого автоматически будет выбран перелёт по самой низкой цене из числа доступных.

Автоматическое бронирование

  • Если при поиске цены на авиаперелет из внешней системы, пользователь выбрал перелет с аэропортами вылета и/или прилета, не совпадающими с изначально указанными аэропортами, то пользователю отобразится сообщение: Внимание! Изменились аэропорты вылета/прилета. После бронирования просьба связаться с Вашим менеджером для уточнения деталей по трансферам.

Изменение аэропортов вылета/прилета

  • Если по выбранным фильтрам поиска нет перелетов, однако они имеются по общему направлению, то пользователю отобразится сообщение: Мы нашли N рейса(ов), но ни один не соответствует заданным фильтрам и кнопка "Очистить фильтры", по нажатию на которую все поисковые фильтры сбросятся.

Отсутствие цен по выбранным фильтрам

  • Если в туре есть отель от внешнего поставщика и перелет от внешнего поставщика, но у отеля установлен запрет на сквозное бронирование, то при создании путевки перелет от внешнего поставщика будет забронирован, а отель от внешнего поставщика забронирован не будет.
  • Если во время поиска отсутствуют места по выбранному классу перелета, на экране отобразится всплывающее сообщение, с предложением искать доступные, для продажи билеты, в другом классе.
RR 60.png
RR 61.png

Передача информации о гражданстве во внешнюю систему

Для передачи гражданства туриста во внешнюю систему используется следующая логика:

  • Берется гражданство из базы данных внешней системы, если сделано сопоставление для выбранной страны
  • Если сопоставление не сделано, то берется двухбуквенный ISO код из справочника Страны ПК Мастер-Тур
  • Если двухбуквенный ISO код для выбранной страны не задан, то берется двухбуквенный ISO код из страны фирмы-владельца
  • Если двухбуквенный ISO код не указан в стране фирмы-владельца, то передается RU

Настройка логирования

Для получения данных о работе внешнего поставщика используется логирование, настройки которого осуществляются в файле Megatec.TourSearchOwin.exe.config папки TourSearchOwin. Путь к папке лог-файлов прописывается в секции Loggers path. Включение логирования осуществляется в секции Logger level. Возможные значения: ALL или OFF.

Название Описание Настройка
1 Логирование Разные настройки логирования отвечают за получение разной информации:
  • GetFlightsRequestResponseLogger – включает получение информации об авиаперелетах при переходе в корзину (поиск)
  • ActualizeFlightsRequestResponseLogger – включает получение информации о выбранном авиаперелете (актуализация)
  • CreateFlightsReservationRequestResponseLogger – включает получение информации о бронировании
  • GetFlightsDetailsLogger – включает получение информации об ошибках, возникающих при работе с внешним поставщиком
  • GetFareFamiliesFlightsRequestResponseLogger – включает получение информации о тарифах (при нажатии кнопки Сменить тариф)
  • SupplierFlightsCountLogger – выводит информацию о количестве полученных перелетов от каждого поставщика
  • GlobalInformationFlightLogger – включает запись краткой статистики по каждому запросу к внешнему поставщику
  • GetFlightsRequestResponseNotValidLogger – включает сохранение запросов и ответов с ошибками или пустыми результатами поиска
  <Loggers path="Logs\">
    <Logger level="ALL" name="GetFlightsRequestResponseLogger"/> 
    <Logger level="ALL" name="ActualizeFlightsRequestResponseLogger"/>
    <Logger level="ALL" name="CreateFlightsReservationRequestResponseLogger"/>
    <Logger level="ALL" name="GetFlightsDetailsLogger"/>
    <Logger level="ALL" name="GetFareFamiliesFlightsRequestResponseLogger"/>
    <Logger level="ALL" name="SupplierFlightsCountLogger"/>
    <Logger level="ALL" name="GlobalInformationFlightLogger"/>
    <Logger level="ALL" name="GetFlightsRequestResponseNotValidLogger"/>
  </Loggers>

Аналитика поиска по логам

Начиная с релиза 15.8 добавлены новые логи для аналитики авиаперелетов от внешних поставщиков GlobalInformationFlightLogger и GetFlightsRequestResponseNotValidLogger.

GlobalInformationFlightLogger

Включает запись краткой статистики по каждому запросу к внешнему поставщику. В случае получения в поле статус значений Error или Null запросы и ответы записываются в лог GetFlightsRequestResponseNotValidLogger. Лог формируется в формате:

Дата/Время запроса  [PID] - ;RequestID;Дата вылета туда;OUT;IN;Дата вылета обратно;OUT;IN;Класс;t Отв;t Обр;t Сум;N;N-;t Update;ЦБ ID;Статус
  • Дата/Время запроса – дата и время отправки запроса к внешнему поставщику;
  • PID – внутренний ID процесса;
  • RequestID – ID ответа от внешнего поставщика из лога GetFlightsRequestResponseLogger. Выводится значение "Null", если в ответе от внешнего поставщика тег <RequestID> отсутствует;
  • Дата вылета туда – дата и время вылета прямого рейса из запроса к внешнему поставщику;
  • OUT – код вылета прямого рейса из запроса к внешнему поставщику;
  • IN – код прилёта прямого рейса из запроса к внешнему поставщику;
  • Дата вылета обратно – дата и время вылета обратного рейса из запроса к внешнему поставщику;
  • OUT – код вылета обратного рейса из запроса к внешнему поставщику;
  • IN – код прилёта обратного рейса из запроса к внешнему поставщику;
  • Класс – класс перелёта из запроса к внешнему поставщику;
  • t Отв – время получения ответа от внешнего поставщика;
  • t Обр – время обработки ответа;
  • t Сум – общее время работы;
  • N – количество результатов, полученных от внешнего поставщика;
  • N- – количество результатов, пропущенных для отображения клиенту;
  • t Update – время отработки запроса по изменению цены;
  • ЦБ ID – ID ценового блока, в котором сохранилась цена;
  • Статус – статус показа данных клиенту. Если получен результат от внешнего поставщика, то проставляется "Ок", если внешний сбой ответа, то "Error", если пустой ответ - Null. Детализация указана в отдельном логе GetFlightsRequestResponseNotValidLogger.
Пример

Пример лога

2023-03-22 15:12:35,383 [13] INFO  [PID123] - ;RequestID;Дата вылета туда;OUT;IN;Дата вылета обратно;OUT;IN;Класс;t От;t Обр;t Сум;N;N-;t Update;ЦБ ID;Статус
2023-01-26 17:27:02,944 [27] INFO  [PID124] - ;125583138;2023-02-23T00:00:00;MOW;VIE;2023-02-25T00:00:00;MOW;VIE;Economy;0;0;0;0;0;0;0;Error
2023-01-26 17:27:58,666 [36] INFO  [PID125] - ;51397211583;2023-02-23T00:00:00;MOW;MLE;2023-02-25T00:00:00;MLE;MOW;Economy;15622;11459;27081;445;211;883;41450;Ok
2023-01-26 17:28:39,695 [16] INFO  [PID126] - ;51397214573;2023-02-23T00:00:00;MOW;MLE;2023-02-25T00:00:00;MLE;MOW;Economy;4720;11335;16055;442;209;0;0;Ok
2023-01-26 17:30:08,681 [53] INFO  [PID127] - ;51397220623;2023-02-23T00:00:00;MOW;MLE;2023-02-25T00:00:00;MLE;MOW;First;0;0;0;0;0;0;0;Null
2023-01-26 17:32:53,512 [56] INFO  [PID128] - ;51397230615;2023-02-23T00:00:00;MOW;MLE;2023-02-25T00:00:00;MLE;MOW;First;0;0;0;0;0;0;0;Null


GetFlightsRequestResponseNotValidLogger

В данный лог записываются запросы и ответы от внешнего поставщика в случае наличия ошибок в ответе или пустого ответа.

Пример

Пример лога

2023-01-26 17:37:06,890 [29] DEBUG [(null)] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Request%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2023-01-26 17:37:06,892 [29] DEBUG [(null)] - 
<?xml version="1.0" encoding="utf-16"?>
<Search_1_2Request xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Request>
    <Requisites xmlns="http://nemo-ibe.com/STL">
      <Login xsi:nil="true" />
      <Password xsi:nil="true" />
      <AuthToken xsi:nil="true" />
      <NemoOneAuthToken>BB7D0E3E31411F82C880E56E97B9D1E6</NemoOneAuthToken>
      <UserContextId xsi:nil="true" />
      <SupplierSessionId xsi:nil="true" />
    </Requisites>
    <UserID xmlns="http://nemo-ibe.com/STL">618153</UserID>
    <RequestBody xmlns="http://nemo-ibe.com/STL">
      <RequestedFlightInfo xmlns="http://nemo-ibe.com/Avia">
        <Direct>true</Direct>
        <ODPairs>
          <ODPair>
            <DepatureDateTime>2023-02-23T00:00:00</DepatureDateTime>
            <MaxDepatureTime xsi:nil="true" />
            <DepaturePoint>
              <Code>MOW</Code>
            </DepaturePoint>
            <DepatureAltPoints xsi:nil="true" />
            <ArrivalPoint>
              <Code>MLE</Code>
            </ArrivalPoint>
            <ArrivalAltPoints xsi:nil="true" />
          </ODPair>
          <ODPair>
            <DepatureDateTime>2023-02-25T00:00:00</DepatureDateTime>
            <MaxDepatureTime xsi:nil="true" />
            <DepaturePoint>
              <Code>MLE</Code>
            </DepaturePoint>
            <DepatureAltPoints xsi:nil="true" />
            <ArrivalPoint>
              <Code>MOW</Code>
            </ArrivalPoint>
            <ArrivalAltPoints xsi:nil="true" />
          </ODPair>
        </ODPairs>
      </RequestedFlightInfo>
      <Passengers xmlns="http://nemo-ibe.com/Avia">
        <Passenger>
          <Type>ADT</Type>
          <Count>2</Count>
          <PricedAs />
          <Nationality />
        </Passenger>
      </Passengers>
      <Restrictions xmlns="http://nemo-ibe.com/Avia">
        <CurrencyCode>USD</CurrencyCode>
        <CompanyFilter xsi:nil="true" />
        <ClassPreference>
          <ClassOfService>First</ClassOfService>
        </ClassPreference>
        <ResultsGrouping>None</ResultsGrouping>
        <SourcePreference xsi:nil="true" />
        <RequestorTags>
          <Tag xmlns="http://nemo-ibe.com/STL">618153</Tag>
        </RequestorTags>
        <ThreeDomainAgreementNumber xsi:nil="true" />
        <PromotionCode xsi:nil="true" />
      </Restrictions>
      <EndUserData xsi:nil="true" xmlns="http://nemo-ibe.com/Avia" />
      <SellingPointDescription xsi:nil="true" xmlns="http://nemo-ibe.com/Avia" />
    </RequestBody>
  </Request>
</Search_1_2Request>
2023-01-26 17:37:06,893 [29] DEBUG [(null)] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2023-01-26 17:37:06,895 [29] DEBUG [(null)] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Response%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2023-01-26 17:37:06,896 [29] DEBUG [(null)] - 
<?xml version="1.0" encoding="utf-16"?>
<Search_1_2Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Search_1_2Result>
    <RequestID xmlns="http://nemo-ibe.com/STL">51397245514</RequestID>
    <Errors xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <Warnings xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <CreatedPNRLocator xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <CreatedPNRLocators xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <CancelledPNRLocators xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <ResponseBody xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
  </Search_1_2Result>
</Search_1_2Response>
2023-01-26 17:37:06,897 [29] DEBUG [(null)] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2023-01-26 19:29:09,753 [86] DEBUG [(null)] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Request%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2023-01-26 19:29:09,754 [86] DEBUG [(null)] - 
<?xml version="1.0" encoding="utf-16"?>
<Search_1_2Request xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Request>
    <Requisites xmlns="http://nemo-ibe.com/STL">
      <Login xsi:nil="true" />
      <Password xsi:nil="true" />
      <AuthToken xsi:nil="true" />
      <NemoOneAuthToken>D7201C63EB991CED1E643B7E25876508</NemoOneAuthToken>
      <UserContextId xsi:nil="true" />
      <SupplierSessionId xsi:nil="true" />
    </Requisites>
    <UserID xmlns="http://nemo-ibe.com/STL">10190</UserID>
    <RequestBody xmlns="http://nemo-ibe.com/STL">
      <RequestedFlightInfo xmlns="http://nemo-ibe.com/Avia">
        <Direct>false</Direct>
        <ODPairs>
          <ODPair>
            <DepatureDateTime>2023-02-23T00:00:00</DepatureDateTime>
            <MaxDepatureTime xsi:nil="true" />
            <DepaturePoint>
              <Code>MOW</Code>
            </DepaturePoint>
            <DepatureAltPoints xsi:nil="true" />
            <ArrivalPoint>
              <Code>VIE</Code>
            </ArrivalPoint>
            <ArrivalAltPoints xsi:nil="true" />
          </ODPair>
          <ODPair>
            <DepatureDateTime>2023-02-25T00:00:00</DepatureDateTime>
            <MaxDepatureTime xsi:nil="true" />
            <DepaturePoint>
              <Code>VIE</Code>
            </DepaturePoint>
            <DepatureAltPoints xsi:nil="true" />
            <ArrivalPoint>
              <Code>MOW</Code>
            </ArrivalPoint>
            <ArrivalAltPoints xsi:nil="true" />
          </ODPair>
        </ODPairs>
      </RequestedFlightInfo>
      <Passengers xmlns="http://nemo-ibe.com/Avia">
        <Passenger>
          <Type>ADT</Type>
          <Count>2</Count>
          <PricedAs />
          <Nationality />
        </Passenger>
      </Passengers>
      <Restrictions xmlns="http://nemo-ibe.com/Avia">
        <CurrencyCode>USD</CurrencyCode>
        <CompanyFilter xsi:nil="true" />
        <ClassPreference>
          <ClassOfService>Economy</ClassOfService>
        </ClassPreference>
        <ResultsGrouping>None</ResultsGrouping>
        <SourcePreference xsi:nil="true" />
        <RequestorTags>
          <Tag xmlns="http://nemo-ibe.com/STL">10190</Tag>
        </RequestorTags>
        <ThreeDomainAgreementNumber xsi:nil="true" />
        <PromotionCode xsi:nil="true" />
      </Restrictions>
      <EndUserData xsi:nil="true" xmlns="http://nemo-ibe.com/Avia" />
      <SellingPointDescription xsi:nil="true" xmlns="http://nemo-ibe.com/Avia" />
    </RequestBody>
  </Request>
</Search_1_2Request>
2023-01-26 19:29:09,756 [86] DEBUG [(null)] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2023-01-26 19:29:09,756 [86] DEBUG [(null)] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Response%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2023-01-26 19:29:09,757 [86] DEBUG [(null)] - 
<?xml version="1.0" encoding="utf-16"?>
<Search_1_2Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Search_1_2Result>
    <RequestID xmlns="http://nemo-ibe.com/STL">125584887</RequestID>
    <Errors xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <Warnings xmlns="http://nemo-ibe.com/STL">
      <Warning>
        <Code>1</Code>
        <Message>The requested package 162108 was not found.</Message>
        <ServiceMessage xsi:nil="true" />
      </Warning>
      <Warning>
        <Code>1</Code>
        <Message>The requested package 162656 was not found.</Message>
        <ServiceMessage xsi:nil="true" />
      </Warning>
      <Warning>
        <Code>1</Code>
        <Message>The requested package 167550 was not found.</Message>
        <ServiceMessage xsi:nil="true" />
      </Warning>
      <Warning>
        <Code>1</Code>
        <Message>The requested package 162169 was not found.</Message>
        <ServiceMessage xsi:nil="true" />
      </Warning>
    </Warnings>
    <CreatedPNRLocator xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <CreatedPNRLocators xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <CancelledPNRLocators xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
    <ResponseBody xsi:nil="true" xmlns="http://nemo-ibe.com/STL" />
  </Search_1_2Result>
</Search_1_2Response>
2023-01-26 19:29:09,758 [86] DEBUG [(null)] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


Внесение данных в БД Немо

Для того чтобы добавить данные напрямую в БД Немо можно использовать стороннее приложение BD Browser for SQLite. Для этого нужно открыть БД Немо для внесения изменений:

  • Запустить файл BD Browser for SQLite.exe от имени администратора
  • Загрузить базу данных: для этого нужно нажать кнопку Открыть базу данных и выбрать необходимую базу данных Немо nemo_guide_etalon.s3db из папки \\TourPrograms\bin
  • Открыть вкладку Данные (отменить предложение о создании резервной копии)

Экран «DB Browser for SQLite»

Основные таблицы для внесения изменений:

  • Aircraft – тип самолета
    • Aircraft_code
    • Aircraft_name
  • Airport – аэропорт
    • Airport_code
    • Airport_name
  • Carrier – авиакомпания
    • Carrier_code
    • Carrier_name
  • Country – страна
    • Country_code
    • Country_name
  • City – город
    • City_code
    • City_name

Внесение данных происходит по следующему принципу:

  • Добавляем запись в основную таблицу (например для добавления авиакомпании это таблица Carrier
  • Затем добавляем запись в таблицу Name (в нашем примере это будет таблица Carrier_name)
  • Затем вносим запись в таблицу Code (в нашем примере это будет таблица Carrier_code)

После внесения изменений необходимо файл базы данных из папки \\TourPrograms\bin скопировать и вставить в папку \\TourSearchOwin.

Добавить авиакомпанию

  • Заходим в Carrier_name и ищем компанию по названию (для этого можно воспользоваться фильтрами поиска), это необходимо, чтобы избежать дублей авиакомпаний. Если такой авиакомпании нет, то переходим в основную таблицу Carrier и добавляем запись.
  • В таблице Carrier_Name создаем запись и в поле Carrier_Id вставляем Id из таблицы Carrier.
  • В таблице Carrier_Code создать запись:
    • В поле Carrier_Id вставляем Id из таблицы Carrier;
    • В поле Service_Id выставляем значение 4;
    • В поле Code прописываем код авиакомпании;
  • Сверху нажимаем кнопку Записать изменения.

После внесения изменений, необходимо файл базы данных из папки \\TourPrograms\bin скопировать и вставить в папку \\TourSearchOwin.

Удалить запись

Удаление любой записи происходит по следующему принципу:

  • Сначала удаляем запись из таблицы Code (например для удаления авиакомпании это таблица Carrier_code);
  • Затем удаляем запись из таблицы Name (в нашем примере это будет таблица Carrier_name);
  • Затем удаляем запись из основной таблицы (в нашем примере это будет Carrier).