...
...
...
...
...
...
...
...
Note |
---|
Обязательно отключить мод Первичный контейнер командировки |
Произвести настройки Интеграции с SSO - Интеграция с SSO (ModSSOService)
тест https://test.sso.corteos.ru/
продуктив https://prd.sso.corteos.ru/
...
...
Сценарий использования
При переходе при помощи SSO, мы инициализируем запрос при помощи следующих данных:
...
Предварительные настройки:
1. Произвести настройки Интеграции с SSO - https://corteos-platform.atlassian.net/wiki/x/acsK
2.Активировать моды.
В данной задаче моды достаточно просто активировать, через тревел менеджмент управляем настройками клиента от его имени и включаем чекбоксы для того, чтобы моды заработали. Настройку производить нет необходимости сверх базовых настроек SSO-портала
мод Интеграция с SSO.
мод Контейнер командировки: жесткое сохранение структуры маршрута или
мод Контейнер командировки: мягкое сохранение структуры маршрута
3. Для корректного сопоставления персон, нам необходимо создать https://corteos-platform.atlassian.net/wiki/x/PtsK , привязанный ко всем организациям внутри группы клиента, который будет содержать уникальный идентификатор внешней системы, на основании которого будет проводиться обновление данных пассажира. В нашем примере справочник будет называться “тестнв”
...
Web Services
Описание службы: http://test.sso.corteos.ru/XmlGate/DataService.asmx
Файл WSDL: https://test.sso.corteos.ru/XmlGate/DataService.asmx?WSDL
Сценарий использования
При переходе при помощи SSO, мы инициализируем запрос при помощи следующих данных:
Code Block |
---|
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sso="https://sso.corteos.ru/"> <soapenv:Header/> <soapenv:Body> <sso:Set> <sso:Set>request> <sso:OuterId>тест1234567890</sso:OuterId> <!--Optional:--> <sso:CustomRoute> <sso:RoutePart> <sso:DateDepart>2024-10-09</sso:DateDepart> <sso:request> <sso:OuterId>0000000001<Origin>Москва</sso:OuterId> Origin> <sso:Destination>Санкт-Петербург</sso:Destination> <sso:ServiceType>transport</sso:ServiceType> <!--Optional:sso:ServiceType>transport,lodging</sso:ServiceType--> <sso:CurrentRoute> <sso:DepartureAdvanceShiftDays>0</sso:DepartureAdvanceShiftDays> <sso:DeparturePostShiftDays>0</sso:DeparturePostShiftDays> <!--Optional:--> <sso:ReturnAdvanceShiftDays>0</sso:ReturnAdvanceShiftDays> <sso:Origin>Москва<ReturnPostShiftDays>0</sso:Origin> ReturnPostShiftDays> <!--Optional:--> <sso:Destination>Санкт-Петербург<BookingSequence>1</sso:Destination> <sso:DepartureDate>2024-09-21<BookingSequence> </sso:DepartureDate> <sso:ReturnDate>2024-09-22</sso:ReturnDate> RoutePart> <sso:RoutePart> <sso:DateDepart>2024-10-15</sso:DateDepart> <sso:Origin>Санкт-Петербург</sso:Origin> <sso:Destination>Москва</sso:Destination> <sso:ServiceType>transport</sso:ServiceType> <sso:DepartureAdvanceShiftDays>0</sso:DepartureAdvanceShiftDays> <sso:DeparturePostShiftDays>0</sso:DeparturePostShiftDays> </sso:CurrentRoute> <sso:ReturnAdvanceShiftDays>0</sso:ReturnAdvanceShiftDays> <sso:ReturnPostShiftDays>0</sso:ReturnPostShiftDays> <!--Optional:--> <sso:BookingSequence>1</sso:BookingSequence> </sso:RoutePart> </sso:CustomRoute> <sso:Persons>CustomOptions> <!--Zero or more repetitions:--><sso:CustomOption> <sso:Person LastName="Ли" FirstName="Лида" MiddleName="Ивановна" LastNameLatin="Li" FirstNameLatin="Lida" MiddleNameLatin="Ivanovna" Gender="false" DateBirth="1988-10-11"> :Key>routeControl</sso:Key> <sso:Value>true</sso:Value> <!--Optional:--> /sso:CustomOption> <sso:INN>111111111111</sso:INN>CustomOption> <!--Optional:--><sso:Key>automaticServices</sso:Key> <sso:KPP>111111111<Value>transport,hotel</sso:KPP>Value> </sso:CustomOption> <!--Optional:--> <sso:CustomOption> <sso:CountryAlpha2>RU<Key>updateMode</sso:CountryAlpha2>Key> <!--Optional:--><sso:Value>update</sso:Value> </sso:CustomOption> <sso:PersonalCodes> </sso:CustomOptions> <!--Zero or more repetitions:--> <sso:Persons> <sso:CodePerson DictionaryNameLastName="Табельный номерЛапочкина" CodeValueFirstName="00003Елена" IsPrimaryKeyMiddleName="trueАлександровна" /> LastNameLatin="Lapochkina" FirstNameLatin="Elena" </sso:PersonalCodes> MiddleNameLatin="Aleksandrovna" Gender="false" DateBirth="1980-02-06"> <<sso:INN>222222222222</sso:Person>INN> <<sso:KPP>222222222</sso:Persons>KPP> <!--Optional:--><sso:CountryAlpha2>RU</sso:CountryAlpha2> <sso:AccountDetails id_Group="8417" GroupSecurityKey="359ED695-6B6F-464E-957F-2D2033ACFFD5" Email="usr8417@corteos.travelDocuments> <sso:Document CountryCode="RU" DocumentNumber="2323222222" DocumentType="NationalPassport" DateValid="2044-09-04"/> </sso:request> </sso:Set>Documents> </soapenv:Body> </soapenv:Envelope> |
...
Данное значение обязательно должно быть уникальным.
Ключ isPrimaryKey = true позволяет определить, какой код отвечает за идентификатор пользователя. По этому параметру синхронизируются данные из запроса с данными в БД и обновляются значениями, передаваемыми в запросе.
Если такого параметра нет, то мы пробуем искать по документу, а потом по ФИО + ДР. Если никто не нашелся, создаем нового.
AccountDetails - данные для авторизации пользователя из внутренней клиентской системы Corteos
id_Group-int, идентификатор компании заказчика,
GroupSecurityKey- ключ для SSO,
Email - это логин пользователя, который создает командировку,
Параметры id_Group и GroupSecurityKey для AccountDetails предоставляются агентством,также их можно определить в настройках договора:
...
Пример ответа:
Code Block |
---|
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <SetResponse xmlns="https://sso.corteos.ru/"> <SetResult><sso:Contacts> <sso:Contact ContactType="MobilePhone" Value="+72222222222"/> </sso:Contacts> <sso:PersonalCodes> <sso:Code DictionaryName="тестнв" CodeValue="1234" IsPrimaryKey="true"/> </sso:PersonalCodes> </sso:Person> </sso:Persons> <sso:AccountDetails id_Group="8418" GroupSecurityKey="2D6DE573-CBAD-4437-90E6-0F4CFE31936C" Email="usr8418@corteos.travel"> <sso:id_Role>1</sso:id_Role> </sso:AccountDetails> </sso:request> </sso:Set> </soapenv:Body> </soapenv:Envelope> |
Запрос состоит:<sso:OuterId>
-идентификатор командировки, уникальный номер ( если такой номер командировки уже существует, то произойдет обновление данных)
Маршрут:<sso:RoutePart>содержит часть маршрута</sso:RoutePart>
<sso:CustomRoute>содержит полный маршрут</sso:CustomRoute>
<sso:DateDepart>
–datetime, дата отправления пассажира в пункт назначения,<sso:Origin>
-string, начальная точка маршрута. Здесь маршрут начинается в Москве.<sso:Destination>
-string, конечная точка маршрута. Путешествие заканчивается в Санкт-Петербурге.<sso:ServiceType>
Тип услуги. <sso:ServiceType>transport,lodging</sso:ServiceType>
- в этом случае транспорт и проживание.<sso:ServiceType>transport</sso:ServiceType>
- в этом случае услуга относится к транспортной категории. <sso:DepartureAdvanceShiftDays>
- количество дней до даты отправления, когда возможно забронировать билет. Здесь оно равно нулю, значит бронирование доступно только в день отправления.
<sso:DeparturePostShiftDays>
- период после даты отправления, в течение которого еще возможно забронировать билет. Здесь также равно нулю, значит после даты отправления билеты уже недоступны для бронирования.<sso:ReturnAdvanceShiftDays>0</sso:ReturnAdvanceShiftDays>-
количество дней до даты прибытия, когда возможно забронировать билет. Здесь оно равно нулю, значит бронирование доступно только в день отправления.<sso:ReturnPostShiftDays>0</sso:ReturnPostShiftDays>-
количество дней после даты прибытия, когда возможно забронировать билет. Здесь оно равно нулю, значит бронирование доступно только в день отправления.<sso:BookingSequence>
- в том случае, если нам нужно бронировать услуги друг за другом(например, сперва один участок, а потом другой), то тут передаем последовательность этой процедуры бронирования. Если мы работаем в стандартном режиме: сперва транспорт, потом гостиницы, потом сервисы, то всегда передаем 1
Бизнес-правила:
<sso:CustomOption>
-контейнер бизнес-правил в формате ключ-значение(строки), которые содержат информацию о том, как должна система вести себя с командировкой</sso:CustomOption>
Code Block |
---|
<sso:CustomOption>
<sso:Key>routeControl</sso:Key>
<sso:Value>true</sso:Value>
</sso:CustomOption> |
<sso:Key>routeControl</sso:Key>
- включает или выключает логику контроля маршрута,true для командировок, false для личных поездок
Code Block |
---|
<sso:CustomOption>
<sso:Key>automaticServices</sso:Key>
<sso:Value>transport,hotel</sso:Value>
</sso:CustomOption> |
<sso:Key>automaticServices</sso:Key>
- transport,hotel - какие услуги можно бронировать в автоматическом режиме(типы услуг, доступны transport - авиа или жд и hotel - гостиница)
Code Block |
---|
<sso:CustomOption>
<sso:Key>updateMode</sso:Key>
<sso:Value>update</sso:Value>
</sso:CustomOption> |
<sso:Key>updateMode</sso:Key>
- говорит о том, что нужно обновить информацию о командировке
Данные о пассажире:
Code Block |
---|
<sso:Persons>
<sso:Person LastName="Лапочкина" FirstName="Елена" MiddleName="Александровна"
LastNameLatin="Lapochkina" FirstNameLatin="Elena" MiddleNameLatin="Aleksandrovna" Gender="false" DateBirth="1980-02-06">
<sso:INN>222222222222</sso:INN>
<sso:KPP>222222222</sso:KPP>
<sso:CountryAlpha2>RU</sso:CountryAlpha2>
<sso:Documents>
<sso:Document CountryCode="RU" DocumentNumber="2323222222" DocumentType="NationalPassport" DateValid="2044-09-04"/>
</sso:Documents>
<sso:Contacts>
<sso:Contact ContactType="MobilePhone" Value="+72222222222"/>
</sso:Contacts>
<sso:PersonalCodes>
<sso:Code DictionaryName="тестнв" CodeValue="1234" IsPrimaryKey="true"/>
</sso:PersonalCodes>
</sso:Person> |
LastName
-string, фамилия персоны на русском языке,FirstName
-string, имя персоны на русском языке,MiddleName
-string,отчество персоны, если нет - передаем пробельный символ,LastNameLatin
FirstNameLatin
MiddleNameLatin
-string, все то же самое, но на английском языке, строка. Если у вас в системе эти данные не хранятся, то русский аналог необходимо транслитерировать по ГОСТ 7.79-2000 (система Б)Gender
- true - мужчина, false - женщина,DateBirth
-datetime, дата рождения,INN
-int, ИНН организации, в которой работает персона,KPP
-int, КПП организации, в которой работает персона
По полям ИНН и КПП мы привязываем персону к нужной компании.CountryAlpha2
-код страны, гражданином которой является персона,
Document CountryCode
- документ какой страны, код страны,DocumentNumber
- номер документа,
DocumentType
- какой документ,DateValid
- срок действия документа,ContactType
- тип контакта,Value
- номер телефона,DictionaryName
-название справочника структурных кодов,CodeValue
-значение кода, предполагается, что оно должно быть уникально внутри справочника,
IsPrimaryKey
- true позволяет определить, какой код отвечает за идентификатор пользователя. По этому параметру синхронизируются данные из запроса с данными в БД и обновляются значениями, передаваемыми в запросе.
Данные для авторизации пользователя из внутренней клиентской системы Corteos:
Code Block |
---|
<sso:AccountDetails id_Group="8418" GroupSecurityKey="2D6DE573-CBAD-4437-90E6-0F4CFE31936C" Email="usr8418@corteos.travel">
<sso:id_Role>1</sso:id_Role>
</sso:AccountDetails> |
AccountDetails
- данные для авторизации пользователя из внутренней клиентской системы Corteosid_Group
-int, идентификатор компании заказчика,GroupSecurityKey
- ключ для SSO,Email
- это логин пользователя, который создает командировку,id_Role
- роль пользователя, который создает командировку,
Параметры id_Group
и GroupSecurityKey
для AccountDetails
предоставляются агентством,также их можно определить в настройках договора:
...
Пример ответа:
Code Block |
---|
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <SetResponse xmlns="https://sso.corteos.ru/"> <SetResult> <OuterId>тест1234567890</OuterId> <CustomRoute> <RoutePart> <DateDepart>2024-10-09T00:00:00</DateDepart> <DateReturn xsi:nil="true"/> <Origin>Москва</Origin> <Destination>Санкт-Петербург</Destination> <ServiceType>transport</ServiceType> <DepartureAdvanceShiftDays>0</DepartureAdvanceShiftDays> <DeparturePostShiftDays>0</DeparturePostShiftDays> <ReturnAdvanceShiftDays>0</ReturnAdvanceShiftDays> <ReturnPostShiftDays>0</ReturnPostShiftDays> <BookingSequence>1</BookingSequence> </RoutePart> <RoutePart> <DateDepart>2024-10-15T00:00:00</DateDepart> <DateReturn xsi:nil="true"/> <Origin>Санкт-Петербург</Origin> <Destination>Москва</Destination> <ServiceType>transport</ServiceType> <DepartureAdvanceShiftDays>0</DepartureAdvanceShiftDays> <DeparturePostShiftDays>0</DeparturePostShiftDays> <ReturnAdvanceShiftDays>0</ReturnAdvanceShiftDays> <ReturnPostShiftDays>0</ReturnPostShiftDays> <BookingSequence>1</BookingSequence> </RoutePart> </CustomRoute> <CustomOptions> <CustomOption> <Key>routeControl</Key> <Value>true</Value> </CustomOption> <CustomOption> <Key>automaticServices</Key> <Value>transport,hotel</Value> </CustomOption> <CustomOption> <Key>updateMode</Key> <Value>update</Value> <OuterId>0000000001<</OuterId>CustomOption> </CustomOptions> <CurrentRoute> <Persons> <Origin>Москва</Origin> <Person LastName="Лапочкина" FirstName="Елена" MiddleName="Александровна" LastNameLatin="Lapochkina" FirstNameLatin="Elena" MiddleNameLatin="Aleksandrovna" <Destination>Санкт-Петербург</Destination>Gender="false" DateBirth="1980-02-06T00:00:00"> <DepartureDate>2024-09-21T00:00:00</DepartureDate> <INN>222222222222</INN> <ReturnDate>2024-09-22T00:00:00</ReturnDate> <KPP>222222222</KPP> </CurrentRoute> <CustomRoute/> <CountryAlpha2>RU</CountryAlpha2> <CustomOptions/> <Documents> <Persons> <Person LastName="Ли" FirstName="Лида" MiddleName="Ивановна" LastNameLatin="Li" FirstNameLatin="Lida" MiddleNameLatin="Ivanovna" Gender="false" DateBirth="1988-10-11T00 <Document CountryCode="RU" DocumentNumber="2323222222" DocumentType="NationalPassport" DateValid="2044-09-04T00:00:00"> /> <INN>111111111111</INN> </Documents> <KPP>111111111</KPP> <Contacts> <CountryAlpha2>RU</CountryAlpha2> <Contact <DocumentsContactType="MobilePhone" Value="+72222222222"/> <Contacts</>Contacts> <BonusCards/> <PersonalVisas/> <PersonalCodes> <Code DictionaryName="Табельный номертестнв" CodeValue="000031234" IsPrimaryKey="true"/> </PersonalCodes> </Person> </Persons> <BudgetCodes/> <AccountDetails id_Group="84178418" GroupSecurityKey="359ED6952D6DE573-6B6FCBAD-464E4437-957F90E6-2D2033ACFFD50F4CFE31936C" Email="usr8417@corteosusr8418@corteos.travel"> <id_Role xsi:nil="true"/>Role>1</id_Role> </AccountDetails> <id_User>145076<User>145077</id_User> <CorteosId>9e3dec0a<CorteosId>95ee2174-f6d6e509-476d45ba-8061a370-827ce3429494<d816d0f53193</CorteosId> <CreationDate>2024-0809-27T1413T16:5046:2441.8535373831792+03:00</CreationDate> <AugmentationData><xml /></AugmentationData> </SetResult> </SetResponse> </soap:Body> </soap:Envelope> |
В ответе веб-сервиса нам следует обратить внимание на поле CorteosId (33 строка69строка)
Значение выглядит таким образом:
...
Данный идентификатор мы используем при SSO переходе на адрес:
https://домен/mods/ssoentrance/go?portalId=CorteosId
Перейдя по этой ссылке мы попадаем на страницу созданной командировки.
Note |
---|
После перехода по ссылке обязательно отключить мод “Интеграция с SSO” и подключить мод “Первичный контейнер командировки” |
Если был включен мод "Контейнер командировки: жесткое сохранение структуры маршрута" (ModComplexReserveRouteValidation) будет автоматически отрисован таймлайн поездки на основании тех параметров которые вы указали при создании командировки
...
Если был включен мод "Контейнер командировки: мягкое сохранение структуры маршрута" (ModComplexReserveRelaxedRouteValidation) не будет отрисован таймлайн, он появится только после добавления услуг.
...