...
При переходе через SSO необходимо передавать следующие данные:
информацию о пользователе системы для создания пользователя на лету
информацию о пассажирах и кодах
информацию о структуре поездки: участки маршрута и даты + разрешенные основные(авиа, ж/д и отели) и дополнительные услуги
Система должна позволять обновлять информацию о маршруте при передаче данных из внешней системы для работы с командировкой-черновиком
...
В данной задаче моды достаточно просто активировать, настройку производить нет необходимости сверх базовых настроек SSO-портала.
Необходимо активировать моды:
...
МОД https://corteos-platform.atlassian.net/wiki/x/acsK - для обеспечения возможности перехода из SAP и передачи параметров заявки
...
Детальный маршрут для 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>
</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, т.е. дублируем данные для унификации.
...
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 был передан и отображается в шапке командировки. Далее мы можем делать заказы транспортных услуг:
...
При создании заказа мы видим логику применения ограничений по изменению дат и направлений маршрута:
...
После того, как на какую-либо услугу был создан заказ, она убирается из списка доступных услуг:
Как только мы создали оба заказа на транспортные участки, нам становится доступно бронирование отеля:
...
При поиске гостиниц используются те же ограничения на участки маршрута, что и для транспортных услуг:
...
После того, как список доступных для заказа услуг исчерпан, возможность бронирования исчезает:
...