Постановка задачи
При переходе через SSO необходимо передавать следующие данные:
информацию о пользователе системы для создания пользователя на лету
информацию о пассажирах и кодах
информацию о структуре поездки: участки маршрута и даты + разрешенные основные(авиа, ж/д и отели) и дополнительные услуги
Система должна позволять обновлять информацию о маршруте при передаче данных из внешней системы для работы с командировкой-черновиком
Предварительные настройки
Настройки базовой системы
Для корректного сопоставления персон, нам необходимо создать справочник структурных кодов, привязанный ко всем организациям внутри группы клиента, который будет содержать уникальный идентификатор внешней системы, на основании которого будет проводиться обновление данных пассажира.
Активация и настройка модов
В данной задаче моды достаточно просто активировать, настройку производить нет необходимости сверх базовых настроек SSO-портала.
Необходимо активировать моды:
Интеграция с SSO - для обеспечения возможности перехода из SAP и передачи параметров заявки
Детальный маршрут для SSO - для передачи и контроля целостности участков маршрута
Бизнес-логика Норникель - специальный формат передачи участков в соответствии с требованиями интегратора
Web Services
В данной задаче используется стандартный веб-сервис SSO: http://test.sso.corteos.ru/Documentation/GeneralWebService
Сценарий использования
При переходе при помощи SSO, мы инициализируем запрос при помощи следующих данных:
<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> <!--Zero or more repetitions:--> <sso:Person LastName="Максимов" FirstName="Максим" MiddleName="Максимович" LastNameLatin="Maximov" FirstNameLatin="Maxim" MiddleNameLatin="Maximovich" Gender="true" DateBirth="2000-02-01"> <!--Optional:--> <sso:INN>987987987</sso:INN> <!--Optional:--> <sso:KPP>779901001</sso:KPP> <!--Optional:--> <sso:CountryAlpha2>RU</sso:CountryAlpha2> <!--Optional:--> <sso:Documents> <!--Zero or more repetitions:--> <sso:Document CountryCode="RU" DocumentNumber="4505111222" DocumentType="NationalPassport" DateValid="2030-10-10"/> </sso:Documents> <!--Optional:--> <sso:Contacts> <!--Zero or more repetitions:--> <sso:Contact ContactType="MobilePhone" Value="+79162223311"/> </sso:Contacts> <!--Optional:--> <sso:PersonalCodes> <!--Zero or more repetitions:--> <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> </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 - говорит о том, что нужно обновить информацию о командировки(полное перетирание данных новыми)
AccountDetails - информация о пользователе для создания аккаунта на лету или входа в систему. Если пассажир также является пользователем, его все равно надо передать в секции Persons, т.е. дублируем данные для унификации.