commit
f291334384
55 changed files with 3721 additions and 0 deletions
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
.idea/ |
||||
out/ |
||||
bin/ |
||||
*.log |
||||
web/WEB-INF/config/ |
||||
.gradle/ |
||||
ext/ |
||||
build/ |
@ -0,0 +1,857 @@
@@ -0,0 +1,857 @@
|
||||
# Введение |
||||
|
||||
**Версия документа: 1.2** |
||||
**Дата изменения: 16.09.2016** |
||||
|
||||
Для возможности продажи с использованием протокола AVS5RS необходимо реализовать сервис с использованием протокола HTTP. Все запросы оправляются методом POST. |
||||
Методы включают в себя справочные методы и методы продажи. Продажа состоит из двух этапов резервирование и подтверждение продажи. |
||||
Протокол должен быть защищен авторизацией через логин и пароль. Так же необходимо чтобы трафик передавался по защищенному каналу связи с использованием SSL или VPN. |
||||
|
||||
## Методы сервиса |
||||
|
||||
Все запросы должны передаваться по протоколу HTTP методом пост. В теле POST запроса и ответа передается XML фиксированного формата. |
||||
Каждый метод имеет отдельный URL. Через HTTP заголовок Content-Type передается значение `application/xml; charset=UTF-8`. |
||||
Этот заголовок указывает на тип содержимого запроса и его кодировку. Необходимо использовать только кодировку UTF-8. |
||||
|
||||
### Формат ответа |
||||
|
||||
Корневой тег XML ответа Response. У него есть обязательный атрибут success, который указывает корректно выполнился запрос или нет, значения true - корректно, false - нет. |
||||
Если ответ корректный, то данные ответа содержатся во вложенном теге Body. Если ответ не корректный, тег Body будет проигнорирован, а информация об ошибке должна |
||||
находиться во вложенном теге Error. Который состоит из кода ошибки и описания. Коды ошибок не регламентируются. Описание это произвольные тест, поясняющий причину ошибки. |
||||
Регистр названий тегов и атрибутов должен совпадать с регистром из примеров. |
||||
Все ответы должны приходить с HTTP кодом 200. Все XML ответы должны начинаться с объявления `<?xml version="1.0" encoding="UTF-8"?>` в котором указана кодировка содержимого. |
||||
Формат даты `yyyy-MM-dd`, формат даты и времени `yyyy-MM-dd'T'HH:mm:ss`, пример 2016-09-07T13:10:00 (символ T латинский, обязательный) (секунды обязательны). |
||||
Время указано в часовом поясе сервера который предоставляет контент. |
||||
Все идентификаторы сущностей (id) это строки, произвольного формата, длинной до 36 символов. |
||||
|
||||
Корректный ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<message>Test</message> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
Не корректный ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="false"> |
||||
<Error> |
||||
<code>ERROR</code> |
||||
<message>Место 5 занято</message> |
||||
</Error> |
||||
</Response> |
||||
``` |
||||
|
||||
### echo |
||||
|
||||
Метод принимает в параметра произвольную строку и возвращает её в теле ответа. Не выполняет ни какой логики. Необходим для проверки доступен ли сервис. |
||||
|
||||
**URL: /sales/echo** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<EchoRequest> |
||||
<!-- Сообщение которое будет возвращено в ответ. Обязательно. --> |
||||
<message>Test</message> |
||||
</EchoRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<!-- Сообщение переданное в запросе --> |
||||
<message>Test</message> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### getDispatchStations |
||||
|
||||
Метод получения станций отправления. |
||||
Продажа происходит от станции отправления до станции назначения, поэтому метод должен вернуть хотя бы один элемент. |
||||
Обычно станциями отправления являются автовокзалы или автоматизированные остановочные пункты с функцией продажи билетов. |
||||
|
||||
**URL: /sales/getDispatchStations** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<GetDispatchStationsRequest> |
||||
</GetDispatchStationsRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<!-- Станция --> |
||||
<Station> |
||||
<!-- Идентификатор станции. Обязателен. --> |
||||
<id>983</id> |
||||
<!-- Наименование станции. Обязателен. Используется для отображения в интерфейсе пользователя --> |
||||
<name>ВДНХ АС</name> |
||||
<!-- Название региона станции. Не обязателен. Используется для отображения в интерфейсе пользователя --> |
||||
<region>Москва</region> |
||||
<!-- ОКАТО станции. Не обязателен. Используется для поиска одинаковых станций и отображения в интерфейсе пользователя --> |
||||
<okato>45000000000</okato> |
||||
</Station> |
||||
<Station> |
||||
<id>853</id> |
||||
<name>Варшавская АС</name> |
||||
<region>Москва</region> |
||||
<okato>45000000000</okato> |
||||
</Station> |
||||
<Station> |
||||
<id>6</id> |
||||
<name>Красногвардейская АС</name> |
||||
<region>Москва</region> |
||||
<okato>45000000000</okato> |
||||
</Station> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### getArrivalStations |
||||
|
||||
Метод получения станций назначения от станции отправления. В параметра принимает идентификатор станции отправления. |
||||
Станциями назначения могут быть любые остановочные пункты до которых есть хотя бы один рейс. |
||||
Если станций назначения нет вернуть пустой список. |
||||
|
||||
**URL: /sales/getArrivalStations** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<GetArrivalStationsRequest> |
||||
<!-- Идентификатор станции отправления. Обязательно. --> |
||||
<dispatchStationId>983</dispatchStationId> |
||||
</GetArrivalStationsRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<Station> |
||||
<id>1069</id> |
||||
<name>Рыбинск</name> |
||||
<region>Ярославская область</region> |
||||
<okato>78415000000</okato> |
||||
</Station> |
||||
<Station> |
||||
<id>1018</id> |
||||
<name>Сергиев Посад</name> |
||||
<region>Московская область</region> |
||||
<okato>46215501000</okato> |
||||
</Station> |
||||
<Station> |
||||
<id>1084</id> |
||||
<name>Углич</name> |
||||
<region>Ярославская область</region> |
||||
<okato>78420000000</okato> |
||||
</Station> |
||||
<Station> |
||||
<id>1078</id> |
||||
<name>Утена</name> |
||||
<region>Литва</region> |
||||
</Station> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### searchTrips |
||||
|
||||
Метод возвращает список рейсов от станции отправления до станции назначения на заданную дату. |
||||
В параметрах передается идентификатор станции отправления, идентификатор станции назначения и дата. |
||||
|
||||
**URL: /sales/searchTrips** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<SearchTripsRequest> |
||||
<!-- Идентификатор станции отправления. Обязательно.--> |
||||
<dispatchStationId>983</dispatchStationId> |
||||
<!-- Идентификатор станции назначения. Обязательно. --> |
||||
<arrivalStationId>678</arrivalStationId> |
||||
<!-- Дата на которую выполняется поиск рейса. Обязательно. --> |
||||
<date>2016-07-12</date> |
||||
</SearchTripsRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<!-- Рейс--> |
||||
<Trip> |
||||
<!-- Идентификатор рейса. Обязательно. --> |
||||
<id>570104</id> |
||||
<!-- Номер маршрута. Не обязателен. --> |
||||
<num>000</num> |
||||
<!-- Название маршрута. Обязателен. --> |
||||
<name>ВДНХ АС - Пенза</name> |
||||
<!-- Дата и время отправления. Обязателен. --> |
||||
<dispatchDate>2016-07-13T19:30:00</dispatchDate> |
||||
<!-- Дата и время прибытия. Обязателен. --> |
||||
<arrivalDate>2016-07-14T05:30:00</arrivalDate> |
||||
<!-- ID станции отправления. Обязателен. --> |
||||
<dispatchStationId>983</dispatchStationId> |
||||
<!-- Станция отправления рейса. Обязателен. --> |
||||
<dispatchStationName>ВДНХ АС</dispatchStationName> |
||||
<!-- ID станции назначения. Обязателен. --> |
||||
<arrivalStationId>744</arrivalStationId> |
||||
<!-- Станция назначения рейса. Обязателен. --> |
||||
<arrivalStationName>Пенза</arrivalStationName> |
||||
<!-- Цена полного проездного билета (включая сборы). Обязателен. --> |
||||
<price>1391</price> |
||||
<!-- Название перевозчика. Не Обязателен. --> |
||||
<carrierName>ИП Ерашова Валентина Анатольевна</carrierName> |
||||
<!-- ИНН перевозчика. Обязателен. --> |
||||
<carrierInn>ИНН 582700056092</carrierInn> |
||||
<!-- Описание автобуса. Обязателен. --> |
||||
<busInfo>49 Мест Категория ТС "М3" </busInfo> |
||||
<!-- |
||||
Флаг обязательности ввода дополнительных персональных данных покупателя. |
||||
Основые персональные данные: Имя, Фамилия, Тип документа, Номер документа. |
||||
Дополнительные персональные данные: Отчество, Пол, Дата рождения, Гражданство. |
||||
Ввод дополнительных данных требуется во исполнение статьи 11 закона "О транспортной безопасности" |
||||
(с изменениями на 3 февраля 2014 года). |
||||
<p> |
||||
См. http://docs.cntd.ru/document/902027326 |
||||
|
||||
Обязателен. Если система не поддерживает, возвращать всегда true. |
||||
--> |
||||
<extDataRequired>true</extDataRequired> |
||||
<!-- |
||||
тип рейса. Обязателен. |
||||
Междугородный - INTERURBAN |
||||
Пригородный - SUBURBAN |
||||
Международный - INTERNATIONAL |
||||
Внутриобластной - INTRAREGIONAL |
||||
Межобластной - INTERREGIONAL |
||||
Межреспубликанский - INTERREPUBLICAN |
||||
Внутрирайонный - INTRADISTRICT |
||||
--> |
||||
<type>INTERREGIONAL</type> |
||||
<!-- |
||||
статус рейса. Обязателен. |
||||
ON_SALE - В продаже. На рейса доступны все опрерации., |
||||
SUSPENDED - Приостановка остановка продажи. Рейс не доступен для продажи. |
||||
CANCELED - Рейс отменен. Рейс не доступен для продажи. |
||||
UNKNOWN - Неопределенный статус. Рейс не доступен для продажи. |
||||
--> |
||||
<status>ON_SALE</status> |
||||
<!-- Количество мест в автобусе. Обязателен. --> |
||||
<seatCount>49</seatCount> |
||||
<!-- Кол-во мест, доступных для продажи. Обязателен.--> |
||||
<freeSeatCount>49</freeSeatCount> |
||||
</Trip> |
||||
<Trip> |
||||
<id>570105</id> |
||||
<num>000</num> |
||||
<name>ВДНХ АС - Пенза</name> |
||||
<dispatchDate>2016-07-13T21:30:00</dispatchDate> |
||||
<arrivalDate>2016-07-14T07:30:00</arrivalDate> |
||||
<dispatchStationId>983</dispatchStationId> |
||||
<dispatchStationName>ВДНХ АС</dispatchStationName> |
||||
<arrivalStationId>744</arrivalStationId> |
||||
<arrivalStationName>Пенза</arrivalStationName> |
||||
<price>1391</price> |
||||
<carrierName>ИП Ерашова Валентина Анатольевна</carrierName> |
||||
<carrierInn>ИНН 582700056092</carrierInn> |
||||
<busInfo>49 Мест Категория ТС "М3" </busInfo> |
||||
<extDataRequired>true</extDataRequired> |
||||
<type>INTERREGIONAL</type> |
||||
<status>ON_SALE</status> |
||||
<seatCount>49</seatCount> |
||||
<freeSeatCount>49</freeSeatCount> |
||||
</Trip> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### getFreeSeats |
||||
|
||||
Получение списка свободных мест для рейса. |
||||
В параметра принимает идентификатор рейса, идентификтор станции отправления и идентификатор станции назначения. |
||||
|
||||
**URL: /sales/getFreeSeats** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<GetFreeSeatsRequest> |
||||
<!-- Идентификатор рейса. Обязательный. --> |
||||
<tripId>570101</tripId> |
||||
<!-- Идентификатор станции отправления. Обязательный. --> |
||||
<dispatchStationId>983</dispatchStationId> |
||||
<!-- Идентификатор станции назначения. Обязательный. --> |
||||
<arrivalStationId>1080</arrivalStationId> |
||||
</GetFreeSeatsRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<!-- Место--> |
||||
<Seat> |
||||
<!-- Идентификатор места. Обязателен. Может совпадать с названием.--> |
||||
<id>17926</id> |
||||
<!-- Название места. Обязателен. Отображается в интерфейсе пользователя. --> |
||||
<name>Место 1</name> |
||||
<!-- Тип места. Не обязателен --> |
||||
<type>Сидячее</type> |
||||
</Seat> |
||||
<Seat> |
||||
<id>17927</id> |
||||
<name>Место 2</name> |
||||
<type>Сидячее</type> |
||||
</Seat> |
||||
<Seat> |
||||
<id>17928</id> |
||||
<name>Место 3</name> |
||||
<type>Сидячее</type> |
||||
</Seat> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### getTicketTypes |
||||
|
||||
Получение списка типов билетов, доступных для продажи. |
||||
В параметра принимает идентификатор рейса, идентификатор станции отправления и идентификатор станции назначения. |
||||
|
||||
**URL: /sales/getTicketTypes** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<GetTicketTypesRequest> |
||||
<!-- Идентификатор рейса. Обязательный. --> |
||||
<tripId>570101</tripId> |
||||
<!-- Идентификатор станции отправления. Обязательный. --> |
||||
<dispatchStationId>983</dispatchStationId> |
||||
<!-- Идентификатор станции назначения. Обязательный. --> |
||||
<arrivalStationId>1080</arrivalStationId> |
||||
/GetTicketTypesRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<TicketType> |
||||
<!-- Идентификатор типа билета. Обязателен. Может совпадать с названием. --> |
||||
<id>1#1#0</id> |
||||
<!-- Название типа билета. Обязателен. --> |
||||
<name>Полный</name> |
||||
<!-- Цена для заданного типа билета (со сборами). Обязателен. --> |
||||
<price>1391</price> |
||||
<!-- |
||||
Класс билета. Обязателен. |
||||
PASSENGER Пассажирский билет, с выделением места |
||||
BAGGAGE Багажный билет, без выделения места |
||||
--> |
||||
<ticketClass>PASSENGER</ticketClass> |
||||
</TicketType> |
||||
<TicketType> |
||||
<id>38#6#0</id> |
||||
<name>Детский</name> |
||||
<price>696</price> |
||||
<ticketClass>PASSENGER</ticketClass> |
||||
</TicketType> |
||||
<TicketType> |
||||
<id>0#0#0</id> |
||||
<name>Багажный</name> |
||||
<price>40</price> |
||||
<ticketClass>BAGGAGE</ticketClass> |
||||
</TicketType> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### getDocumentTypes |
||||
|
||||
Получение списка типов документов, допустимых при оформлении билетов. Система должна предоставить хотя бы один тип документа. |
||||
Рекомендуется использовать документы из (приказа)[http://base.garant.ru/70229008/] в Таблице 1. |
||||
В параметра принимает идентификатор рейса, идентификатор станции отправления и идентификатор станции назначения. |
||||
|
||||
**URL: /sales/getDocumentTypes** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<GetDocumentTypesRequest> |
||||
<!-- Идентификатор рейса. Обязательный. --> |
||||
<tripId>570101</tripId> |
||||
<!-- Идентификатор станции отправления. Обязательный. --> |
||||
<dispatchStationId>983</dispatchStationId> |
||||
<!-- Идентификатор станции назначения. Обязательный. --> |
||||
<arrivalStationId>1080</arrivalStationId> |
||||
</GetDocumentTypesRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<DocumentType> |
||||
<!-- ID типа документа. Обязателен. Может совпадать с названием. --> |
||||
<id>1</id> |
||||
<!-- Название типа документа. Обязателен. --> |
||||
<name>Паспорт РФ</name> |
||||
</DocumentType> |
||||
<DocumentType> |
||||
<id>52</id> |
||||
<name>Паспорт иностранного гражданина</name> |
||||
</DocumentType> |
||||
<DocumentType> |
||||
<id>40</id> |
||||
<name>Удостоверение (Казахстан)</name> |
||||
</DocumentType> |
||||
<DocumentType> |
||||
<id>2</id> |
||||
<name>Свидетельство о рождении</name> |
||||
</DocumentType> |
||||
<DocumentType> |
||||
<id>4</id> |
||||
<name>Удостоверение личности военнослужащего</name> |
||||
</DocumentType> |
||||
<DocumentType> |
||||
<id>55</id> |
||||
<name>Временное удостоверение ОВД</name> |
||||
</DocumentType> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### getTripStops |
||||
|
||||
Метод возвращает список остановочных пунктов для рейса. |
||||
В параметра принимает идентификатор рейса. |
||||
Метод информационный. |
||||
|
||||
**URL: /sales/getTripStops** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<GetTripStopsRequest> |
||||
<!-- Идентификатор рейса. Обязателен. --> |
||||
<tripId>569839</tripId> |
||||
</GetTripStopsRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<Stop> |
||||
<!-- ID остановки. Совпадает с ID станции. Обязателен. --> |
||||
<id>1011</id> |
||||
<!-- Название остановки. Совпадает с названием станции. Обязателен. --> |
||||
<name>Скопин (трасса)</name> |
||||
<!-- Район расположения остановки. Не обязателен. --> |
||||
<regionName>Рязанская область</regionName> |
||||
<!-- Дата-время прибытия на остановку. Обязателен. --> |
||||
<arrivalDate>2016-07-14T16:20:00</arrivalDate> |
||||
<!-- Дата-время отправления с остановки. Обязателен. --> |
||||
<dispatchDate>2016-07-13T21:00:00</dispatchDate> |
||||
<!-- Время стоянки в минутах. Не Обязателен. --> |
||||
<stopTime>10</stopTime> |
||||
<!-- Расстояние от пункта отправления до остановки в км. Не Обязателен. --> |
||||
<distance>260</distance> |
||||
<!-- Цена полного билета. Обязателен. --> |
||||
<price>1177</price> |
||||
</Stop> |
||||
<Stop> |
||||
<id>1010</id> |
||||
<name>Мичуринск (трасса)</name> |
||||
<regionName>Тамбовская область</regionName> |
||||
<arrivalDate>2016-07-14T16:20:00</arrivalDate> |
||||
<dispatchDate>2016-07-13T21:00:00</dispatchDate> |
||||
<stopTime>10</stopTime> |
||||
<distance>385</distance> |
||||
<price>1177</price> |
||||
</Stop> |
||||
<Stop> |
||||
<id>818</id> |
||||
<name>Тамбов (трасса)</name> |
||||
<regionName>Тамбовская область</regionName> |
||||
<arrivalDate>2016-07-14T16:20:00</arrivalDate> |
||||
<dispatchDate>2016-07-13T21:00:00</dispatchDate> |
||||
<stopTime>10</stopTime> |
||||
<distance>455</distance> |
||||
<price>1177</price> |
||||
</Stop> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### bookOrder |
||||
|
||||
Бронирование заказа. Бронь сохраняется в течение ограниченного времени, от 20 до 60 минут. Если в указанный |
||||
период времени не поступает подтверждение оплаты через метод confirmOrder(), то бронирование автоматически |
||||
отменяется. Метод должен выполнить все возможные проверки корректности переданных данных. В случае ошибки |
||||
заказ не должен быть создан. Допускается бронирование нескольких билетов в рамках одного заказа. |
||||
В параметра принимает идентификатор рейса, идентификатор станции отправления, идентификатор станции назначения, |
||||
информацию о бронируемых билетах, информацию об агенте совершивший эту операцию. Информации о бронируемых билетах |
||||
включает в себя идентификатор типа билета, идентификатор места и информацию о пассажире. Информация об |
||||
агенте включает в себя наименование и ИНН агента. |
||||
|
||||
**URL: /sales/bookOrder** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<BookOrderRequest> |
||||
<!-- Идентификатор рейса. Обязательный. --> |
||||
<tripId>570101</tripId> |
||||
<!-- Идентификатор станции отправления. Обязательный. --> |
||||
<dispatchStationId>983</dispatchStationId> |
||||
<!-- Идентификатор станции назначения. Обязательный. --> |
||||
<arrivalStationId>1080</arrivalStationId> |
||||
<!-- Информация о бронируемом билете. Для каждой брони отдельный тег Sale --> |
||||
<Sale> |
||||
<!-- Идентификатор места, полученный из getFreeSeats. Обязателен. --> |
||||
<seatId>25862</seatId> |
||||
<!-- Идентификатор типа билета, полученный из getDocumentTypes. Обязателен. --> |
||||
<ticketTypeId>1#1#0</ticketTypeId> |
||||
<!-- Персональные данные пассажира. Один пассажир на один билет --> |
||||
<Passenger> |
||||
<!-- Имя пассажира. Обязательно --> |
||||
<firstName>goxUEpWCud</firstName> |
||||
<!-- Фамилия пассажира. Обязательно--> |
||||
<lastName>sKZXIloHFn</lastName> |
||||
<!-- Отчество пассажира. Обязательно для Международных, Межобластных и Межреспубликанских рейсов--> |
||||
<middleName>pCaEgXgfWO</middleName> |
||||
<!-- Номер документа удостоверяющего личности. Обязателен.--> |
||||
<docNum>jwcmdIrmcc</docNum> |
||||
<!-- Серия документа удостоверяющего личности. Не Обязателен.--> |
||||
<docSeries>iFAElsnFHn</docSeries> |
||||
<!-- Идентификатор типа документа полученный при вызове getDocumentTypes. Обязателен. --> |
||||
<docTypeId>1</docTypeId> |
||||
<!-- Дата рождения. Обязательно для Международных, Межобластных и Межреспубликанских рейсов --> |
||||
<birthday>1986-01-01</birthday> |
||||
<!-- Гражданство виде ISO2. Обязательно для Международных, Межобластных и Межреспубликанских рейсов --> |
||||
<citizenshipISO2>RU</citizenshipISO2> |
||||
<!-- |
||||
Пол. Обязательно для Международных, Межобластных и Межреспубликанских рейсов |
||||
MALE - Мужской |
||||
FEMALE - Женский |
||||
--> |
||||
<gender>MALE</gender> |
||||
</Passenger> |
||||
</Sale> |
||||
<!-- Агент выполнивший операцию. Не Обязателен. --> |
||||
<Agent> |
||||
<!-- Имя агента. Не обязателен.--> |
||||
<name>ИП Твои билеты</name> |
||||
<!-- ИНН агента. Не обязателен.--> |
||||
<inn>2225555777</inn> |
||||
</Agent> |
||||
</BookOrderRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<!-- Идентификатор заказ. Обязателен. --> |
||||
<orderId>9828350</orderId> |
||||
<!-- Время жизни заказа. В минутах. Не обязателен. По умолчанию значение 30 --> |
||||
<lifetime>30</lifetime> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### getOrder |
||||
|
||||
Получение информации о заказе. В параметрах принимает идентификатор заказа, полученный в результате bookOrder. |
||||
Метод должен вернуть такое же количество билетов сколько было передано при вызове bookOrder. |
||||
Метод должен работать на любом этапе жизни заказа т.е. после создания, подтверждения, отмены, возврата. |
||||
|
||||
**URL: /sales/getOrder** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<GetOrderRequest> |
||||
<!-- Идентификатор заказа, полученный при вызове bookOrder. Обязателен.--> |
||||
<orderId>9828350</orderId> |
||||
</GetOrderRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
<Response success="true"> |
||||
<Body> |
||||
<!-- Идентификатор заказа. Обязателен. --> |
||||
<orderId>9828350</orderId> |
||||
<!-- Информация о билетах. Отдельный тег для каждого билета --> |
||||
<Ticket> |
||||
<!-- Идентификатор билет. Обязателен. --> |
||||
<id>12435438</id> |
||||
<!-- Номер билета. Обязателен после подтверждения заказа. --> |
||||
<number></number> |
||||
<!-- Серия билета. Не обязателен. --> |
||||
<series></series> |
||||
<!-- Дата и время создания билета. Обязателен. --> |
||||
<created>2016-07-13T05:48:15</created> |
||||
<!-- Дата и время возврата билета. Обязателен после возврата или отмены. --> |
||||
<returned></returned> |
||||
<!-- |
||||
Статус билета |
||||
RESERVED Забронирован. Данный статус билет получает после бронирования. bookOrder |
||||
SOLD Продан. Данный статус билет получает после операции продажи. confirmOrder |
||||
CANCELED Отмена билета. Данный статус билет получает после отмены билета. cancelTicket |
||||
RETURNED Выполнен возврат билета. Данный статус билет получает после возврата билета. returnTicket |
||||
--> |
||||
<status>RESERVED</status> |
||||
<!-- |
||||
Класс билета |
||||
PASSENGER Пассажирский билет, с выделением места |
||||
BAGGAGE Багажный билет, без выделения места |
||||
--> |
||||
<ticketClass>PASSENGER</ticketClass> |
||||
<!-- Идентификато типа билета. Обязателен. --> |
||||
<typeId>1#1#0</typeId> |
||||
<!-- Номер маршрута. Не обязателен. --> |
||||
<routeNum>000</routeNum> |
||||
<!-- Название маршрута. Обязателен. --> |
||||
<routeName>ВДНХ АС - Рыбинск</routeName> |
||||
<!-- Информация об автобусе. Обязателен --> |
||||
<busInfo>19 Мест Категория ТС "М3" </busInfo> |
||||
<!-- Название перевозчика. Не обязателен --> |
||||
<carrierName>ООО "ВВМЛ"</carrierName> |
||||
<!-- ИНН перевозчика. Обязателен. --> |
||||
<carrierInn>ИНН 7610074937</carrierInn> |
||||
<!-- Платформа отправления. Не обязателен. --> |
||||
<platform>Перрон 11</platform> |
||||
<!-- Дата и время отправления рейса. Обязателен. --> |
||||
<dispatchDate>2016-07-13T12:20:00</dispatchDate> |
||||
<!-- Станция посадки. Обязателен.--> |
||||
<dispatchStation>ВДНХ АС</dispatchStation> |
||||
<!-- Адрес станции посадки. Не обязателен --> |
||||
<dispatchAddress>пл.Шарля де Голля напротив Космонавтов2А,</dispatchAddress> |
||||
<!-- Дата и время прибытия. Обязателен. --> |
||||
<arrivalDate>2016-07-13T16:20:00</arrivalDate> |
||||
<!-- Станция назначения. Обязателен. --> |
||||
<arrivalStation>Углич</arrivalStation> |
||||
<!-- Название места. Обязателен. --> |
||||
<seatName>Место 1</seatName> |
||||
<!-- Информация о пассажире. --> |
||||
<Passenger> |
||||
<lastName>Ckayuukvgn</lastName> |
||||
<firstName>Bgkzxffotu</firstName> |
||||
<middleName>Isdikvryin</middleName> |
||||
<docNum>PUPrvbqlgU</docNum> |
||||
<docSeries>fRHEoBHVbG</docSeries> |
||||
<docTypeId>1</docTypeId> |
||||
<birthday>1985-01-01</birthday> |
||||
<citizenshipISO2>RU</citizenshipISO2> |
||||
<gender>MALE</gender> |
||||
</Passenger> |
||||
<!-- Тариф (руб). Обязателен после подтверждения. --> |
||||
<fare>0</fare> |
||||
<!-- Cборы (руб). Обязателен после подтверждения. Если нет то 0. --> |
||||
<fees>0</fees> |
||||
<!-- Удержано Тариф (руб). Обязателен в случает возврата или отмены. --> |
||||
<chargeFare>0</chargeFare> |
||||
<!-- Удержано Остальные сборы (руб). Обязателен в случает возврата или отмены. --> |
||||
<chargeOthers>0</chargeOthers> |
||||
<!-- Возврат Тариф (руб). Обязателен в случает возврата или отмены. --> |
||||
<repaymentFare>0</repaymentFare> |
||||
<!-- Возврат Остальные сборы (руб). Обязателен в случает возврата или отмены. --> |
||||
<repaymentOthers>0</repaymentOthers> |
||||
<!-- Информация о страховании. Обязательно. Необходим при печати билета. --> |
||||
<insuranceInfo>СТРАХОВЩИК: ПАО "Росстрах"; 119991; г. Москва; ул. Большая Ордынка; д. 40; стр.</insuranceInfo> |
||||
</Ticket> |
||||
</Body> |
||||
</Response> |
||||
``` |
||||
|
||||
### confirmOrder |
||||
|
||||
Подтверждение оплаты заказа. Данный метод должен вызываться только после того как заказ действительно был |
||||
оплачен покупателем. Метод не должен делать проверок корректности заказа. Все проверки должны делать в bookOrder |
||||
или updateTicket. Вызов этого метода означает, все данные заполнены правильно и деньги от покупателя получены. |
||||
В параметрах принимает идентификатор заказа, полученный в результате bookOrder и информацию об агенте который |
||||
совершил операцию |
||||
|
||||
**URL: /sales/confirmOrder** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ConfirmOrderRequest> |
||||
<orderId>9828585</orderId> |
||||
<!-- Агент выполнивший операцию. Не Обязателен. --> |
||||
<Agent> |
||||
<!-- Имя агента. Не обязателен.--> |
||||
<name>ИП Твои билеты</name> |
||||
<!-- ИНН агента. Не обязателен.--> |
||||
<inn>2225555777</inn> |
||||
</Agent> |
||||
</ConfirmOrderRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
Ответ аналогичен ответу на запрос getOrder |
||||
|
||||
|
||||
### cancelTicket |
||||
|
||||
Отмена билета. Техническая операция, выполняет полный возврат билета без удержаний. |
||||
Необходима при нештатных ситуациях например в случае сбоев ККМ или ошибки выбора рейса. |
||||
В параметрах принимает идентификатор билета и информацию об агенте который совершил операцию. |
||||
Можно выполнять после создания заказа и в течении 5-30 минут после подтверждения заказа. |
||||
|
||||
**URL: /sales/cancelTicket** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<CancelTicketRequest> |
||||
<ticketId>12435434</ticketId> |
||||
<!-- Агент выполнивший операцию. Не Обязателен. --> |
||||
<Agent> |
||||
<!-- Имя агента. Не обязателен.--> |
||||
<name>ИП Твои билеты</name> |
||||
<!-- ИНН агента. Не обязателен.--> |
||||
<inn>2225555777</inn> |
||||
</Agent> |
||||
</CancelTicketRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
Ответ аналогичен ответу на запрос getOrder |
||||
|
||||
### returnTicket |
||||
|
||||
Возврат билета. При возврате возможны удержания. В параметрах принимает идентификатор билета и информацию |
||||
об агенте который совершил операцию. Билет можно вернуть только после подтверждения confirmOrder. |
||||
|
||||
**URL: /sales/returnTicket** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ReturnTicketRequest> |
||||
<ticketId>12435435</ticketId> |
||||
<!-- Агент выполнивший операцию. Не Обязателен. --> |
||||
<Agent> |
||||
<!-- Имя агента. Не обязателен.--> |
||||
<name>ИП Твои билеты</name> |
||||
<!-- ИНН агента. Не обязателен.--> |
||||
<inn>2225555777</inn> |
||||
</Agent> |
||||
</ReturnTicketRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
Ответ аналогичен ответу на запрос getOrder |
||||
|
||||
### updateTicket |
||||
|
||||
Изменение персональных данных пассажира в забронированном или проданном билете. |
||||
В параметрах принимает идентификатор билета, информацию о пассажире и информацию |
||||
об агенте который совершил операцию. |
||||
|
||||
**URL: /sales/updateTicket** |
||||
|
||||
Запрос: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<UpdateTicketRequest> |
||||
<!-- Идентификатор билета. Обязательный --> |
||||
<ticketId>12435438</ticketId> |
||||
<Passenger> |
||||
<!-- Имя пассажира. Обязательно --> |
||||
<firstName>goxUEpWCud</firstName> |
||||
<!-- Фамилия пассажира. Обязательно--> |
||||
<lastName>sKZXIloHFn</lastName> |
||||
<!-- Отчество пассажира. Обязательно для Международных, Межобластных и Межреспубликанских рейсов--> |
||||
<middleName>pCaEgXgfWO</middleName> |
||||
<!-- Номер документа удостоверяющего личности. Обязателен.--> |
||||
<docNum>jwcmdIrmcc</docNum> |
||||
<!-- Серия документа удостоверяющего личности. Не Обязателен.--> |
||||
<docSeries>iFAElsnFHn</docSeries> |
||||
<!-- Идентификатор типа документа полученный при вызове getDocumentTypes. Обязателен. --> |
||||
<docTypeId>1</docTypeId> |
||||
<!-- Дата рождения. Обязательно для Международных, Межобластных и Межреспубликанских рейсов --> |
||||
<birthday>1986-01-01</birthday> |
||||
<!-- Гражданство виде ISO2. Обязательно для Международных, Межобластных и Межреспубликанских рейсов --> |
||||
<citizenshipISO2>RU</citizenshipISO2> |
||||
<!-- |
||||
Пол. Обязательно для Международных, Межобластных и Межреспубликанских рейсов |
||||
MALE - Мужской |
||||
FEMALE - Женский |
||||
--> |
||||
<gender>FEMALE</gender> |
||||
</Passenger> |
||||
<!-- Агент выполнивший операцию. Не Обязателен. --> |
||||
<Agent> |
||||
<!-- Имя агента. Не обязателен.--> |
||||
<name>ИП Твои билеты</name> |
||||
<!-- ИНН агента. Не обязателен.--> |
||||
<inn>2225555777</inn> |
||||
</Agent> |
||||
</UpdateTicketRequest> |
||||
``` |
||||
|
||||
Ответ: |
||||
|
||||
```xml |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<Response success="true"> |
||||
/Response> |
||||
``` |
||||
|
||||
|
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
group 'com.artmark' |
||||
version '1.0-SNAPSHOT' |
||||
|
||||
apply plugin: 'java' |
||||
|
||||
sourceCompatibility = 1.6 |
||||
|
||||
repositories { |
||||
mavenCentral() |
||||
} |
||||
|
||||
dependencies { |
||||
compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0.1' |
||||
testCompile group: 'junit', name: 'junit', version: '4.11' |
||||
} |
Binary file not shown.
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
#Fri Sep 16 16:48:38 KRAT 2016 |
||||
distributionBase=GRADLE_USER_HOME |
||||
distributionPath=wrapper/dists |
||||
zipStoreBase=GRADLE_USER_HOME |
||||
zipStorePath=wrapper/dists |
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip |
@ -0,0 +1,160 @@
@@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env bash |
||||
|
||||
############################################################################## |
||||
## |
||||
## Gradle start up script for UN*X |
||||
## |
||||
############################################################################## |
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
||||
DEFAULT_JVM_OPTS="" |
||||
|
||||
APP_NAME="Gradle" |
||||
APP_BASE_NAME=`basename "$0"` |
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value. |
||||
MAX_FD="maximum" |
||||
|
||||
warn ( ) { |
||||
echo "$*" |
||||
} |
||||
|
||||
die ( ) { |
||||
echo |
||||
echo "$*" |
||||
echo |
||||
exit 1 |
||||
} |
||||
|
||||
# OS specific support (must be 'true' or 'false'). |
||||
cygwin=false |
||||
msys=false |
||||
darwin=false |
||||
case "`uname`" in |
||||
CYGWIN* ) |
||||
cygwin=true |
||||
;; |
||||
Darwin* ) |
||||
darwin=true |
||||
;; |
||||
MINGW* ) |
||||
msys=true |
||||
;; |
||||
esac |
||||
|
||||
# Attempt to set APP_HOME |
||||
# Resolve links: $0 may be a link |
||||
PRG="$0" |
||||
# Need this for relative symlinks. |
||||
while [ -h "$PRG" ] ; do |
||||
ls=`ls -ld "$PRG"` |
||||
link=`expr "$ls" : '.*-> \(.*\)$'` |
||||
if expr "$link" : '/.*' > /dev/null; then |
||||
PRG="$link" |
||||
else |
||||
PRG=`dirname "$PRG"`"/$link" |
||||
fi |
||||
done |
||||
SAVED="`pwd`" |
||||
cd "`dirname \"$PRG\"`/" >/dev/null |
||||
APP_HOME="`pwd -P`" |
||||
cd "$SAVED" >/dev/null |
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar |
||||
|
||||
# Determine the Java command to use to start the JVM. |
||||
if [ -n "$JAVA_HOME" ] ; then |
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then |
||||
# IBM's JDK on AIX uses strange locations for the executables |
||||
JAVACMD="$JAVA_HOME/jre/sh/java" |
||||
else |
||||
JAVACMD="$JAVA_HOME/bin/java" |
||||
fi |
||||
if [ ! -x "$JAVACMD" ] ; then |
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME |
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the |
||||
location of your Java installation." |
||||
fi |
||||
else |
||||
JAVACMD="java" |
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the |
||||
location of your Java installation." |
||||
fi |
||||
|
||||
# Increase the maximum file descriptors if we can. |
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then |
||||
MAX_FD_LIMIT=`ulimit -H -n` |
||||
if [ $? -eq 0 ] ; then |
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then |
||||
MAX_FD="$MAX_FD_LIMIT" |
||||
fi |
||||
ulimit -n $MAX_FD |
||||
if [ $? -ne 0 ] ; then |
||||
warn "Could not set maximum file descriptor limit: $MAX_FD" |
||||
fi |
||||
else |
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" |
||||
fi |
||||
fi |
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock |
||||
if $darwin; then |
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" |
||||
fi |
||||
|
||||
# For Cygwin, switch paths to Windows format before running java |
||||
if $cygwin ; then |
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"` |
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` |
||||
JAVACMD=`cygpath --unix "$JAVACMD"` |
||||
|
||||
# We build the pattern for arguments to be converted via cygpath |
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` |
||||
SEP="" |
||||
for dir in $ROOTDIRSRAW ; do |
||||
ROOTDIRS="$ROOTDIRS$SEP$dir" |
||||
SEP="|" |
||||
done |
||||
OURCYGPATTERN="(^($ROOTDIRS))" |
||||
# Add a user-defined pattern to the cygpath arguments |
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then |
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" |
||||
fi |
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh |
||||
i=0 |
||||
for arg in "$@" ; do |
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` |
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option |
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition |
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` |
||||
else |
||||
eval `echo args$i`="\"$arg\"" |
||||
fi |
||||
i=$((i+1)) |
||||
done |
||||
case $i in |
||||
(0) set -- ;; |
||||
(1) set -- "$args0" ;; |
||||
(2) set -- "$args0" "$args1" ;; |
||||
(3) set -- "$args0" "$args1" "$args2" ;; |
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;; |
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; |
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; |
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; |
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; |
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; |
||||
esac |
||||
fi |
||||
|
||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules |
||||
function splitJvmOpts() { |
||||
JVM_OPTS=("$@") |
||||
} |
||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS |
||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" |
||||
|
||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" |
@ -0,0 +1,90 @@
@@ -0,0 +1,90 @@
|
||||
@if "%DEBUG%" == "" @echo off |
||||
@rem ########################################################################## |
||||
@rem |
||||
@rem Gradle startup script for Windows |
||||
@rem |
||||
@rem ########################################################################## |
||||
|
||||
@rem Set local scope for the variables with windows NT shell |
||||
if "%OS%"=="Windows_NT" setlocal |
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
||||
set DEFAULT_JVM_OPTS= |
||||
|
||||
set DIRNAME=%~dp0 |
||||
if "%DIRNAME%" == "" set DIRNAME=. |
||||
set APP_BASE_NAME=%~n0 |
||||
set APP_HOME=%DIRNAME% |
||||
|
||||
@rem Find java.exe |
||||
if defined JAVA_HOME goto findJavaFromJavaHome |
||||
|
||||
set JAVA_EXE=java.exe |
||||
%JAVA_EXE% -version >NUL 2>&1 |
||||
if "%ERRORLEVEL%" == "0" goto init |
||||
|
||||
echo. |
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
||||
echo. |
||||
echo Please set the JAVA_HOME variable in your environment to match the |
||||
echo location of your Java installation. |
||||
|
||||
goto fail |
||||
|
||||
:findJavaFromJavaHome |
||||
set JAVA_HOME=%JAVA_HOME:"=% |
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe |
||||
|
||||
if exist "%JAVA_EXE%" goto init |
||||
|
||||
echo. |
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% |
||||
echo. |
||||
echo Please set the JAVA_HOME variable in your environment to match the |
||||
echo location of your Java installation. |
||||
|
||||
goto fail |
||||
|
||||
:init |
||||
@rem Get command-line arguments, handling Windowz variants |
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args |
||||
if "%@eval[2+2]" == "4" goto 4NT_args |
||||
|
||||
:win9xME_args |
||||
@rem Slurp the command line arguments. |
||||
set CMD_LINE_ARGS= |
||||
set _SKIP=2 |
||||
|
||||
:win9xME_args_slurp |
||||
if "x%~1" == "x" goto execute |
||||
|
||||
set CMD_LINE_ARGS=%* |
||||
goto execute |
||||
|
||||
:4NT_args |
||||
@rem Get arguments from the 4NT Shell from JP Software |
||||
set CMD_LINE_ARGS=%$ |
||||
|
||||
:execute |
||||
@rem Setup the command line |
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar |
||||
|
||||
@rem Execute Gradle |
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% |
||||
|
||||
:end |
||||
@rem End local scope for the variables with windows NT shell |
||||
if "%ERRORLEVEL%"=="0" goto mainEnd |
||||
|
||||
:fail |
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of |
||||
rem the _cmd.exe /c_ return code! |
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 |
||||
exit /b 1 |
||||
|
||||
:mainEnd |
||||
if "%OS%"=="Windows_NT" endlocal |
||||
|
||||
:omega |
@ -0,0 +1,144 @@
@@ -0,0 +1,144 @@
|
||||
package com.artmark.avs5rs; |
||||
|
||||
import com.artmark.avs5rs.model.*; |
||||
|
||||
import javax.ws.rs.POST; |
||||
import javax.ws.rs.Path; |
||||
|
||||
/** |
||||
* Сервис продажи билетов. |
||||
* @author Ushmodin N. |
||||
* @since 07.07.2016 10:06 |
||||
*/ |
||||
|
||||
@Path("/sales") |
||||
public interface SaleService { |
||||
|
||||
/** |
||||
* Метод примает в параметра произвольную строку и возвращает её в теле ответа. |
||||
* Не выпольняет ни какой логики. Необходим для проверки доступен ли сервис. |
||||
*/ |
||||
@Path("/echo") |
||||
@POST |
||||
Response<EchoResponse> echo(EchoRequest request); |
||||
|
||||
/** |
||||
* Метод получения станций отправления. |
||||
* Продажа происходит от станции отправления до станции назначения, поэтому метод должен вернуть хотябы один элемент. |
||||
* Обычно станциями отправления являются автовокзалы или автоматизированные остановочные пункты с фунцией продажи билетов. |
||||
*/ |
||||
@Path("/getDispatchStations") |
||||
@POST |
||||
Response<GetDispatchStationsResponse> getDispatchStations(GetDispatchStationsRequest request); |
||||
|
||||
/** |
||||
* Метод получения станций назначения от станции отправления. В параметра принимает идентификато станции отправления. |
||||
* Станциями назначения могут быть любые остановочные пункты до которых есть хотябы один рейс |
||||
*/ |
||||
@Path("/getArrivalStations") |
||||
@POST |
||||
Response<GetArrivalStationsResponse> getArrivalStations(GetArrivalStationsRequest request); |
||||
|
||||
/** |
||||
* Метод возвращает список рейсов от станции отправления до станции назначения на заданную дату. |
||||
* В параметрах передается идентификатор станции отправления, идентификатор станции назначения и дата. |
||||
*/ |
||||
@Path("/searchTrips") |
||||
@POST |
||||
Response<SearchTripsResponse> searchTrips(SearchTripsRequest request); |
||||
|
||||
/** |
||||
* Метод возвращает список остановочных пунктов для рейса. |
||||
* В параметра принимает идентификатор рейса. |
||||
* Метод информационный. |
||||
*/ |
||||
@Path("/getTripStops") |
||||
@POST |
||||
Response<GetTripStopsResponse> getTripStops(GetTripStopsRequest request); |
||||
|
||||
/** |
||||
* Получение списка свободных мест для рейса. |
||||
* В параметра принимает идентификатор рейса, идентификтор станции отправления и идентификатор станции назначения. |
||||
*/ |
||||
@Path("/getFreeSeats") |
||||
@POST |
||||
Response<GetFreeSeatsResponse> getFreeSeats(GetFreeSeatsRequest request); |
||||
|
||||
/** |
||||
* Получение списка типов билетов, доступных для продажи. |
||||
* В параметра принимает идентификатор рейса, идентификтор станции отправления и идентификатор станции назначения. |
||||
*/ |
||||
@Path("/getTicketTypes") |
||||
@POST |
||||
Response<GetTicketTypesResponse> getTicketTypes(GetTicketTypesRequest request); |
||||
|
||||
/** |
||||
* Получение списка типов документов, допустимых при оформлении билетов. Система должна предоставить хотя бы один тип документа. |
||||
* Рекомендуется использовать документы из (приказа)[http://base.garant.ru/70229008/] в Таблице 1.
|
||||
* В параметра принимает идентификатор рейса, идентификатор станции отправления и идентификатор станции назначения. |
||||
*/ |
||||
@Path("/getDocumentTypes") |
||||
@POST |
||||
Response<GetDocumentTypesResponse> getDocumentTypes(GetDocumentTypesRequest request); |
||||
|
||||
|
||||
/** |
||||
* Бронирование заказа. Бронь сохраняется в течение ограниченного времени, от 20 до 60 минут. Если в указанный |
||||
* период времени не поступает подтверждение оплаты через метод confirmOrder(), то бронирование автоматически |
||||
* отменяется. Метод должен выполнить все возможные проверки корректности переданных данных. В случае ошибки |
||||
* заказ не должен быть создан. |
||||
* В параметра принимает идентификатор рейса, идентификтор станции отправления, идентификатор станции назначения, |
||||
* информацию о бронируемых билетах, информацию об агенте совершивший эту операцию. Информаци о бронируемых билетах |
||||
* включает в себя идентификатор типа билета, идентификато места и информацию о пассажире. Информация об |
||||
* агенте включает в себя наименование и ИНН агента. |
||||
*/ |
||||
@Path("/bookOrder") |
||||
@POST |
||||
Response<BookOrderResponse> bookOrder(BookOrderRequest request); |
||||
|
||||
/** |
||||
* Получение информации о заказе. В пареметрах принимает идентификатор заказа, полученный в результате bookOrder |
||||
* Метод должен работать на любом этапе жизни заказа т.е. после создания, подтверждения, отмены, возврата. |
||||
*/ |
||||
@Path("/getOrder") |
||||
@POST |
||||
Response<GetOrderResponse> getOrder(GetOrderRequest request); |
||||
|
||||
/** |
||||
* Подтверждение оплаты заказа. Данный метод должен вызываться только после того как заказ действительно был |
||||
* оплачен покупателем. Метод не должен делать проверок корректности заказа. Все проверки должны делать в bookOrder |
||||
* или updateTicket. Вызов этого метода означает, все данные заполнены правильно и деньги от покупателя получены. |
||||
* В пареметрах принимает идентификатор заказа, полученный в результате bookOrder и информацию об агенте который |
||||
* совершил операцию |
||||
*/ |
||||
@Path("/confirmOrder") |
||||
@POST |
||||
Response<ConfirmOrderResponse> confirmOrder(ConfirmOrderRequest request); |
||||
|
||||
/** |
||||
* Возврат билета. При возврате возможны удержания. В пареметрах принимает идентификатор билета и информацию |
||||
* об агенте который совершил операцию. Билет можно вернуть только после подтверждения confirmOrder. |
||||
*/ |
||||
@Path("/returnTicket") |
||||
@POST |
||||
Response<ReturnTicketResponse> returnTicket(ReturnTicketRequest request); |
||||
|
||||
/** |
||||
* Отмена билета. Техническая операция, выполняет полный возврат билета без удержаний. |
||||
* Необходима при нештатных ситуациях например в случае сбоев ККМ или ошибки выбора рейса. |
||||
* В пареметрах принимает идентификатор билета и информацию об агенте который совершил операцию. |
||||
* Можно выполнять после создания заказа и в течении 5-30 минут после подтвержения заказа. |
||||
*/ |
||||
@Path("/cancelTicket") |
||||
@POST |
||||
Response<CancelTicketResponse> cancelTicket(CancelTicketRequest request); |
||||
|
||||
/** |
||||
* Изменение персональных данных пассажира в забронированном или проданном билете. |
||||
* В пареметрах принимает идентификатор билета, информацию о пассажире и информацию |
||||
* об агенте который совершил операцию. |
||||
*/ |
||||
@Path("/updateTicket") |
||||
@POST |
||||
Response<UpdateTicketResponse> updateTicket(UpdateTicketRequest request); |
||||
} |
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
package com.artmark.avs5rs.model; |
||||
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType; |
||||
import javax.xml.bind.annotation.XmlAccessorType; |
||||
import javax.xml.bind.annotation.XmlType; |
||||
|
||||
/** |
||||
* Информация об агенте |
||||
* |
||||
* @author V.Skorykh |
||||
* @since 30.05.2016 13:42 |
||||
* @since 5.2 |
||||
*/ |
||||
@XmlType |
||||
@XmlAccessorType(XmlAccessType.FIELD) |
||||
public class Agent { |
||||
|
||||
/** |
||||
* ИНН агента |
||||
*/ |
||||
private String inn; |
||||
|
||||
/** |
||||
* Имя агента (название организации) |
||||
*/ |
||||
private String name; |
||||
|
||||
public String getInn() { |
||||
return inn; |
||||
} |
||||
|
||||
public void setInn(String inn) { |
||||
this.inn = inn; |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
} |
@ -0,0 +1,64 @@
@@ -0,0 +1,64 @@
|
||||
package com.artmark.avs5rs.model; |
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType; |
||||
import javax.xml.bind.annotation.XmlAccessorType; |
||||
import javax.xml.bind.annotation.XmlElement; |
||||
import javax.xml.bind.annotation.XmlRootElement; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author Ushmodin N. |
||||
* @since 07.07.2016 11:04 |
||||
*/ |
||||
|
||||
@XmlAccessorType(XmlAccessType.FIELD) |
||||
@XmlRootElement(name = "BookOrderRequest") |
||||
public class BookOrderRequest { |
||||
private String tripId; |
||||
private String dispatchStationId; |
||||
private String arrivalStationId; |
||||
@XmlElement(name = "Sale") |
||||
private List<Sale> sales; |
||||
@XmlElement(name = "Agent") |
||||
private Agent agent; |
||||
|
||||
public String getTripId() { |
||||
return tripId; |
||||
} |
||||
|
||||
public void setTripId(String tripId) { |
||||
this.tripId = tripId; |
||||
} |
||||
|
||||
public String getDispatchStationId() { |
||||
return dispatchStationId; |
||||
} |
||||
|
||||
public void setDispatchStationId(String dispatchStationId) { |
||||
this.dispatchStationId = dispatchStationId; |
||||
} |
||||
|
||||
public String getArrivalStationId() { |
||||
return arrivalStationId; |
||||
} |
||||
|
||||
public void setArrivalStationId(String arrivalStationId) { |
||||
this.arrivalStationId = arrivalStationId; |
||||
} |
||||
|
||||
public List<Sale> getSales() { |
||||
return sales; |
||||
} |
||||
|
||||
public void setSales(List<Sale> sales) { |
||||
this.sales = sales; |
||||
} |
||||
|
||||
public Agent getAgent() { |
||||
return agent; |
||||
} |
||||
|
||||
public void setAgent(Agent agent) { |
||||
this.agent = agent; |
||||
} |
||||
} |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
package com.artmark.avs5rs.model; |
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType; |
||||
import javax.xml.bind.annotation.XmlAccessorType; |
||||
import javax.xml.bind.annotation.XmlType; |
||||
|
||||
/** |
||||
* @author Ushmodin N. |
||||
* @since 07.07.2016 11:09 |
||||
*/ |
||||
|
||||
|
||||
@XmlAccessorType(XmlAccessType.FIELD) |
||||
@XmlType(name = "BookOrderResponse") |
||||
public class BookOrderResponse { |
||||
/** |
||||
* Идентификато договора |
||||
*/ |
||||
private String orderId; |
||||
|
||||
public String getOrderId() { |
||||
return orderId; |
||||
} |
||||
|
||||
public void setOrderId(String orderId) { |
||||
this.orderId = orderId; |
||||
} |
||||
} |
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
package com.artmark.avs5rs.model; |
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType; |
||||
import javax.xml.bind.annotation.XmlAccessorType; |
||||
import javax.xml.bind.annotation.XmlElement; |
||||
import javax.xml.bind.annotation.XmlRootElement; |
||||
|
||||
/** |
||||
* @author Ushmodin N. |
||||
* @since 07.07.2016 11:23 |
||||
*/ |
||||
|
||||
@XmlAccessorType(XmlAccessType.FIELD) |
||||
@XmlRootElement(name = "CancelTicketRequest") |
||||
public class CancelTicketRequest { |
||||
private String ticketId; |
||||
@XmlElement(name = "Agent") |
||||
private Agent agent; |
||||
|
||||
public String getTicketId() { |
||||
return ticketId; |
||||
} |
||||
|
||||
public void setTicketId(String ticketId) { |
||||
this.ticketId = ticketId; |
||||
} |
||||
|
||||
public Agent getAgent() { |
||||
return agent; |
||||
} |
||||
|
||||
public void setAgent(Agent agent) { |
||||
this.agent = agent; |
||||
} |
||||
} |
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
package com.artmark.avs5rs.model; |
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType; |
||||
import javax.xml.bind.annotation.XmlAccessorType; |
||||
import javax.xml.bind.annotation.XmlElement; |
||||
import javax.xml.bind.annotation.XmlType; |
||||
|
||||
/** |
||||
* @author Ushmodin N. |
||||
* @since 07.07.2016 11:23 |
||||
*/ |
||||
|
||||
@XmlAccessorType(XmlAccessType.FIELD) |
||||
@XmlType(name = "CancelTicketResponse") |
||||
public class CancelTicketResponse { |
||||
@XmlElement(name = "Ticket") |
||||
private Ticket ticket; |
||||
|
||||
public Ticket getTicket() { |
||||
return ticket; |
||||
} |
||||
|
||||
public void setTicket(Ticket ticket) { |
||||
this.ticket = ticket; |
||||
} |
||||
} |
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
package com.artmark.avs5rs.model; |
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType; |
||||
import javax.xml.bind.annotation.XmlAccessorType; |
||||
import javax.xml.bind.annotation.XmlElement; |
||||
import javax.xml.bind.annotation.XmlRootElement; |
||||
|
||||
/** |
||||
* @author Ushmodin N. |
||||
* @since 07.07.2016 11:18 |
||||
*/ |
||||
|
||||
@XmlAccessorType(XmlAccessType.FIELD) |
||||
@XmlRootElement(name = "ConfirmOrderRequest") |
||||
public class ConfirmOrderRequest { |
||||
private String orderId; |
||||
@XmlElement(name = "Agent") |
||||
private Agent agent; |
||||
|
||||
public String getOrderId() { |
||||
return orderId; |
||||
} |
||||
|
||||
public void setOrderId(String orderId) { |
||||
this.orderId = orderId; |
||||
} |
||||
|
||||
public Agent getAgent() { |
||||
return agent; |
||||
} |
||||
|
||||
public void setAgent(Agent agent) { |
||||
this.agent = agent; |
||||
} |
||||
} |