...
При переходе через SSO необходимо передавать следующие данные:
информацию о пользователе системы для создания пользователя на лету
информацию о пассажирах и кодах
информацию о структуре поездки: участки маршрута и даты + разрешенные основные(авиа, ж/д и отели) и дополнительные услуги
Система должна позволять обновлять информацию о маршруте при передаче данных из внешней системы для работы с командировкой-черновиком
...
Для корректного сопоставления персон, нам необходимо создать справочник структурных кодов, привязанный ко всем организациям внутри группы клиента, который будет содержать уникальный идентификатор внешней системы, на основании которого будет проводиться обновление данных пассажира. В нашем примере справочник будет называться “Идентификатор в SAP”
...
Активация и настройка модов
В данной задаче моды достаточно просто активировать, настройку производить нет необходимости сверх базовых настроек SSO-портала.
Необходимо активировать моды:
...
МОД https://corteos-platform.atlassian.net/wiki/x/acsK - для обеспечения возможности перехода из SAP и передачи параметров заявки
...
Детальный маршрут для SSO - для передачи и контроля целостности участков маршрута
...
Бизнес-логика Норникель - специальный формат передачи участков в соответствии с требованиями интегратора
Web Services
В данной задаче используется стандартный веб-сервис SSO: .
Web Services
В данной задаче используется стандартный веб-сервис SSO:
http://test.sso.corteos.ru/Documentation/GeneralWebService (для тестовой среды)
https://prd.sso.corteos.ru/Documentation/GeneralWebService ((для продуктивной среды)
Сценарий использования
При переходе при помощи 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:request>
<sso:OuterId>2000000171</sso:OuterId>
<sso:CustomRoute>
<sso:RoutePart>
<sso:DateDepart>2020-12-14</sso:DateDepart>
<sso:Origin>Москва</sso:Origin>
<sso:Destination>Санкт-Петербург</sso:Destination>
<sso:DepartureAdvanceShiftDays>1</sso:DepartureAdvanceShiftDays>
<sso:DeparturePostShiftDays>1</sso:DeparturePostShiftDays>
<sso:ReturnAdvanceShiftDays>0</sso:ReturnAdvanceShiftDays>
<sso:ReturnPostShiftDays>0</sso:ReturnPostShiftDays>
<sso:BookingSequence>1</sso:BookingSequence>
</sso:RoutePart>
<sso:RoutePart>
<sso:DateDepart>2020-12-16</sso:DateDepart>
<sso:Origin>Самара</sso:Origin>
<sso:Destination>Санкт-Петербург</sso:Destination>
<sso:DepartureAdvanceShiftDays>1</sso:DepartureAdvanceShiftDays>
<sso:DeparturePostShiftDays>1</sso:DeparturePostShiftDays>
<sso:ReturnAdvanceShiftDays>0</sso:ReturnAdvanceShiftDays>
<sso:ReturnPostShiftDays>0</sso:ReturnPostShiftDays>
<sso:BookingSequence>1</sso:BookingSequence>
</sso:RoutePart>
</sso:CustomRoute>
<sso:CustomOptions>
<sso:CustomOption>
<sso:Key>routeControl</sso:Key>
<sso:Value>true</sso:Value>
</sso:CustomOption>
<sso:CustomOption>
<sso:Key>automaticServices</sso:Key>
<sso:Value>transport,hotel</sso:Value>
</sso:CustomOption>
<sso:CustomOption>
<sso:Key>allowedExtraServices</sso:Key>
<sso:Value>transfer</sso:Value>
</sso:CustomOption>
<sso:CustomOption>
<sso:Key>updateMode</sso:Key>
<sso:Value>update</sso:Value>
</sso:CustomOption>
<sso:CustomOption>
<sso:Key>personalDays</sso:Key>
<sso:Value>2020-12-14,2020-12-15</sso:Value>
</sso:CustomOption>
</sso:CustomOptions>
<sso:Persons>
|
...
<sso:Person LastName="Максимов" FirstName="Максим" MiddleName="Максимович" LastNameLatin="Maximov" FirstNameLatin="Maxim" MiddleNameLatin="Maximovich" Gender="true" DateBirth="2000-02-01"> |
...
<sso:INN>987987987</sso:INN> <sso: |
...
KPP>779901001</sso: |
...
KPP> |
...
<sso:CountryAlpha2>RU</sso:CountryAlpha2> <sso: |
...
Documents> |
...
<sso:Document CountryCode="RU" DocumentNumber="4505111222" DocumentType="NationalPassport" DateValid="2030-10-10"/> |
...
</sso: |
...
Documents> |
...
<sso:Contacts> <sso: |
...
Contact ContactType="MobilePhone" Value="+79162223311"/> </sso:Contacts> |
...
<sso:PersonalCodes> <sso: |
...
Code |
...
DictionaryName=" |
...
Идентификатор в SAP" CodeValue="1234" IsPrimaryKey="true"/> </sso: |
...
PersonalCodes> |
...
</sso:Person> |
...
</sso:Persons> <sso:AccountDetails id_Group="XX" |
...
GroupSecurityKey="test" Email="user@somedomain.ru"> <sso: |
...
PersonToCreate LastName="Админских" FirstName=" |
...
Максим" |
...
MiddleName=" |
...
Валерьевич" |
...
|
...
LastNameLatin="Adminskih" FirstNameLatin="Maksim" MiddleNameLatin="Valerievich" Gender="true" DateBirth="2000-01-02"> |
...
<sso:INN>987987987</sso:INN> <sso:KPP>779901001</sso: |
...
KPP> |
...
<sso:CountryAlpha2>RU</sso:CountryAlpha2> |
...
|
...
|
...
|
...
</sso:PersonToCreate> |
...
|
...
|
...
|
...
|
...
<sso:id_Role>1</sso:id_Role> </sso:AccountDetails> |
...
</sso: |
...
request> |
...
</sso: |
...
Set> |
...
Разберем структуру запроса более детально:
...
OuterId - идентификатор заявки в SAP, по нему система понимает, что делать - обновить существующую командировку(если с таким номером уже был переход ранее) или создать новую
...
CustomRoute - участки маршрута, целостность которых мы контролируем
RoutePart - элемент маршрута, один участок
Origin - string, обязательный элемент, название или цифровой идентификатор города из справочника городов
Destination - string, обязательный элемент, название или цифровой идентификатор города из справочника городов
DateDepart - datetime, обязательный элемент, дата отправления пассажира в пункт назначения
DateReturn - datetime, не обязательный элемент, нужен для участков вида туда и обратно
DepartureAdvanceShiftDays - int, обязательный, на сколько дней назад можно сдвинуть вылет в пункт назначения
DeparturePostShiftDays - int, обязательный, на сколько дней вперед можно сдвинуть вылет в пункт назначения
ReturnAdvanceShiftDays - int, обязательный, на сколько дней назад можно сдвинуть возвращение в пункт отправления, для маршрута в одну сторону передаем 0
ReturnPostShiftDays - int, обязательный, на сколько дней вперед можно сдвинуть возвращение в пункт отправления, для маршрута в одну сторону передаем 0
BookingSequence - int, обязательный, в том случае, если нам нужно бронировать услуги друг за другом(например, сперва один участок, а потом другой), то тут передаем последовательность этой процедуры бронирования. Если нас это не волнует, а мы работаем в стандартном режиме: сперва транспорт, потом гостиницы, потом сервисы, то всегда передаем 1
...
Persons - список пассажиров командировки, подробности о структуре данных можно почитать на SSO портале.
...
CustomOptions - контейнер бизнес-правил в формате ключ-значение(строки), которые содержат информацию о том, как должна система вести себя с командировкой
routeControl - true для командировок, false для личных поездок, включает или выключает логику контроля маршрута
automaticServices - transport,hotel - какие услуги можно бронировать в автоматическом режиме(типы услуг, доступны transport - авиа или жд и hotel - гостиница)
allowedExtraServices - какие дополнительные сервисы можно заказывать, в настоящий момент только transfer
personalDays - список личных дней через запятую в формате dd-MM-yyyy, правило бронирований отеля такое, что в одном заказе не может быть и личный, и рабочий день
updateMode - update - говорит о том, что нужно обновить информацию о командировки(полное перетирание данных новыми)
...
</soapenv:Body>
</soapenv:Envelope> |
Разберем структуру запроса более детально:
OuterId - идентификатор заявки в SAP, по нему система понимает, что делать - обновить существующую командировку(если с таким номером уже был переход ранее) или создать новую
CustomRoute - участки маршрута, целостность которых мы контролируем
RoutePart - элемент маршрута, один участок
Origin - string, обязательный элемент, название или цифровой идентификатор города из справочника городов
Destination - string, обязательный элемент, название или цифровой идентификатор города из справочника городов
DateDepart - datetime, обязательный элемент, дата отправления пассажира в пункт назначения
DateReturn - datetime, не обязательный элемент, нужен для участков вида туда и обратно
DepartureAdvanceShiftDays - int, обязательный, на сколько дней назад можно сдвинуть вылет в пункт назначения
DeparturePostShiftDays - int, обязательный, на сколько дней вперед можно сдвинуть вылет в пункт назначения
ReturnAdvanceShiftDays - int, обязательный, на сколько дней назад можно сдвинуть возвращение в пункт отправления, для маршрута в одну сторону передаем 0
ReturnPostShiftDays - int, обязательный, на сколько дней вперед можно сдвинуть возвращение в пункт отправления, для маршрута в одну сторону передаем 0
BookingSequence - int, обязательный, в том случае, если нам нужно бронировать услуги друг за другом(например, сперва один участок, а потом другой), то тут передаем последовательность этой процедуры бронирования. Если нас это не волнует, а мы работаем в стандартном режиме: сперва транспорт, потом гостиницы, потом сервисы, то всегда передаем 1
Persons - список пассажиров командировки, подробности о структуре данных можно почитать на SSO портале.
CustomOptions - контейнер бизнес-правил в формате ключ-значение(строки), которые содержат информацию о том, как должна система вести себя с командировкой
routeControl - true для командировок, false для личных поездок, включает или выключает логику контроля маршрута
automaticServices - transport,hotel - какие услуги можно бронировать в автоматическом режиме(типы услуг, доступны transport - авиа или жд и hotel - гостиница)
allowedExtraServices - какие дополнительные сервисы можно заказывать, в настоящий момент только transfer
personalDays - список личных дней через запятую в формате dd-MM-yyyy, правило бронирований отеля такое, что в одном заказе не может быть и личный, и рабочий день
updateMode - update - говорит о том, что нужно обновить информацию о командировки(полное перетирание данных новыми)
ChangeOrganization - true - говорит о том, что необходимо обновить в профиле персоны привязку к организации, в которой она числится.
AccountDetails - информация о пользователе для создания аккаунта на лету или входа в систему. Если пассажир также является пользователем, его все равно надо передать в секции Persons, т.е. дублируем данные для унификации.
Info |
---|
При передаче персоны следует обратить внимание на то, что мы определяем профайл по идентификатору в SAP, таким образом нужно уделять особое внимание корректной передаче этого кода |
Code Block | ||
---|---|---|
| ||
<sso:PersonalCodes>
<sso:Code DictionaryName="Идентификатор в SAP" CodeValue="1234" IsPrimaryKey="true"/>
</sso:PersonalCodes> |
Переход в Corteos
В ответе веб-сервиса нам следует обратить внимание на поле CorteosId:
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>2000000171</OuterId>
<CustomRoute>
<RoutePart>
<DateDepart>2020-12-14T00:00:00</DateDepart>
<DateReturn xsi:nil="true"/>
<Origin>Москва</Origin>
<Destination>Санкт-Петербург</Destination>
<DepartureAdvanceShiftDays>1</DepartureAdvanceShiftDays>
<DeparturePostShiftDays>1</DeparturePostShiftDays>
<ReturnAdvanceShiftDays>0</ReturnAdvanceShiftDays>
<ReturnPostShiftDays>0</ReturnPostShiftDays>
<BookingSequence>1</BookingSequence>
</RoutePart>
<RoutePart>
<DateDepart>2020-12-16T00:00:00</DateDepart>
<DateReturn xsi:nil="true"/>
<Origin>Самара</Origin>
<Destination>Санкт-Петербург</Destination>
<DepartureAdvanceShiftDays>1</DepartureAdvanceShiftDays>
<DeparturePostShiftDays>1</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>allowedExtraServices</Key>
<Value>transfer</Value>
</CustomOption>
<CustomOption>
<Key>updateMode</Key>
<Value>update</Value>
</CustomOption>
</CustomOptions>
<Persons>
<Person LastName="Максимов" FirstName="Максим" MiddleName="Максимович" LastNameLatin="Maximov" FirstNameLatin="Maxim" MiddleNameLatin="Maximovich" Gender="true" DateBirth="2000-02-01T00:00:00">
<INN>987987987</INN>
<KPP>779901001</KPP>
<CountryAlpha2>RU</CountryAlpha2>
<Documents>
<Document CountryCode="RU" DocumentNumber="4505111222" DocumentType="NationalPassport" DateValid="2030-10-10T00:00:00"/>
</Documents>
<Contacts>
<Contact ContactType="MobilePhone" Value="+79162223311"/>
</Contacts>
<PersonalCodes>
<Code DictionaryName="Идентификатор в SAP" CodeValue="1234" IsPrimaryKey="true"/>
</PersonalCodes>
</Person>
</Persons>
<BudgetCodes/>
<AccountDetails id_Group="xxx" GroupSecurityKey="xxxx" Email="xxxx@xxxxx.ru">
</AccountDetails>
<id_User>xxxx</id_User>
<CorteosId>xxxx-xxx-xxx-xxxx-xxxxxxxxx</CorteosId>
<CreationDate>2020-11-16T20:02:37.1565805+03:00</CreationDate>
<AugmentationData>
<xml xmlns=""/>
</AugmentationData>
</SetResult>
</SetResponse>
</soap:Body>
</soap:Envelope> |
Значение выглядит таким образом:
Code Block | ||
---|---|---|
| ||
<CorteosId>xxxx-xxx-xxx-xxxx-xxxxxxxxx</CorteosId> |
Данный идентификатор мы используем при SSO переходе на адрес: домен/mods/ssoentrance/go?portalId={CorteosId}
Перейдя по этой ссылке мы попадаем на страницу командировки:
...
Как видно на картинке, OuterId был передан и отображается в шапке командировки. Далее мы можем делать заказы транспортных услуг:
...
При создании заказа мы видим логику применения ограничений по изменению дат и направлений маршрута:
...
После того, как на какую-либо услугу был создан заказ, она убирается из списка доступных услуг:
Как только мы создали оба заказа на транспортные участки, нам становится доступно бронирование отеля:
...
При поиске гостиниц используются те же ограничения на участки маршрута, что и для транспортных услуг:
...
После того, как список доступных для заказа услуг исчерпан, возможность бронирования исчезает:
...