Browse Source

init

master
Nikolay Ushmodin 3 years ago
commit
f291334384
55 changed files with 3721 additions and 0 deletions
  1. 8
    0
      .gitignore
  2. 857
    0
      avs5rs.md
  3. 15
    0
      build.gradle
  4. BIN
      gradle/wrapper/gradle-wrapper.jar
  5. 6
    0
      gradle/wrapper/gradle-wrapper.properties
  6. 160
    0
      gradlew
  7. 90
    0
      gradlew.bat
  8. 2
    0
      settings.gradle
  9. 144
    0
      src/main/java/com/artmark/avs5rs/SaleService.java
  10. 44
    0
      src/main/java/com/artmark/avs5rs/model/Agent.java
  11. 64
    0
      src/main/java/com/artmark/avs5rs/model/BookOrderRequest.java
  12. 28
    0
      src/main/java/com/artmark/avs5rs/model/BookOrderResponse.java
  13. 35
    0
      src/main/java/com/artmark/avs5rs/model/CancelTicketRequest.java
  14. 26
    0
      src/main/java/com/artmark/avs5rs/model/CancelTicketResponse.java
  15. 35
    0
      src/main/java/com/artmark/avs5rs/model/ConfirmOrderRequest.java
  16. 37
    0
      src/main/java/com/artmark/avs5rs/model/ConfirmOrderResponse.java
  17. 28
    0
      src/main/java/com/artmark/avs5rs/model/DateAdapter.java
  18. 38
    0
      src/main/java/com/artmark/avs5rs/model/DocumentType.java
  19. 27
    0
      src/main/java/com/artmark/avs5rs/model/EchoRequest.java
  20. 26
    0
      src/main/java/com/artmark/avs5rs/model/EchoResponse.java
  21. 10
    0
      src/main/java/com/artmark/avs5rs/model/Gender.java
  22. 27
    0
      src/main/java/com/artmark/avs5rs/model/GetArrivalStationsRequest.java
  23. 27
    0
      src/main/java/com/artmark/avs5rs/model/GetArrivalStationsResponse.java
  24. 15
    0
      src/main/java/com/artmark/avs5rs/model/GetDispatchStationsRequest.java
  25. 27
    0
      src/main/java/com/artmark/avs5rs/model/GetDispatchStationsResponse.java
  26. 43
    0
      src/main/java/com/artmark/avs5rs/model/GetDocumentTypesRequest.java
  27. 28
    0
      src/main/java/com/artmark/avs5rs/model/GetDocumentTypesResponse.java
  28. 52
    0
      src/main/java/com/artmark/avs5rs/model/GetFreeSeatsRequest.java
  29. 27
    0
      src/main/java/com/artmark/avs5rs/model/GetFreeSeatsResponse.java
  30. 24
    0
      src/main/java/com/artmark/avs5rs/model/GetOrderRequest.java
  31. 37
    0
      src/main/java/com/artmark/avs5rs/model/GetOrderResponse.java
  32. 42
    0
      src/main/java/com/artmark/avs5rs/model/GetTicketTypesRequest.java
  33. 28
    0
      src/main/java/com/artmark/avs5rs/model/GetTicketTypesResponse.java
  34. 28
    0
      src/main/java/com/artmark/avs5rs/model/GetTripStopsRequest.java
  35. 27
    0
      src/main/java/com/artmark/avs5rs/model/GetTripStopsResponse.java
  36. 149
    0
      src/main/java/com/artmark/avs5rs/model/Passenger.java
  37. 82
    0
      src/main/java/com/artmark/avs5rs/model/Response.java
  38. 35
    0
      src/main/java/com/artmark/avs5rs/model/ReturnTicketRequest.java
  39. 26
    0
      src/main/java/com/artmark/avs5rs/model/ReturnTicketResponse.java
  40. 44
    0
      src/main/java/com/artmark/avs5rs/model/Sale.java
  41. 54
    0
      src/main/java/com/artmark/avs5rs/model/SearchTripsRequest.java
  42. 30
    0
      src/main/java/com/artmark/avs5rs/model/SearchTripsResponse.java
  43. 51
    0
      src/main/java/com/artmark/avs5rs/model/Seat.java
  44. 64
    0
      src/main/java/com/artmark/avs5rs/model/Station.java
  45. 125
    0
      src/main/java/com/artmark/avs5rs/model/Stop.java
  46. 413
    0
      src/main/java/com/artmark/avs5rs/model/Ticket.java
  47. 17
    0
      src/main/java/com/artmark/avs5rs/model/TicketClassCode.java
  48. 29
    0
      src/main/java/com/artmark/avs5rs/model/TicketStatusCode.java
  49. 65
    0
      src/main/java/com/artmark/avs5rs/model/TicketType.java
  50. 26
    0
      src/main/java/com/artmark/avs5rs/model/TimestampAdapter.java
  51. 262
    0
      src/main/java/com/artmark/avs5rs/model/Trip.java
  52. 25
    0
      src/main/java/com/artmark/avs5rs/model/TripStatusCode.java
  53. 43
    0
      src/main/java/com/artmark/avs5rs/model/TripTypeCode.java
  54. 44
    0
      src/main/java/com/artmark/avs5rs/model/UpdateTicketRequest.java
  55. 25
    0
      src/main/java/com/artmark/avs5rs/model/UpdateTicketResponse.java

+ 8
- 0
.gitignore View File

@@ -0,0 +1,8 @@
.idea/
out/
bin/
*.log
web/WEB-INF/config/
.gradle/
ext/
build/

+ 857
- 0
avs5rs.md View File

@@ -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 Мест Категория ТС &quot;М3&quot; </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 Мест Категория ТС &quot;М3&quot; </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 Мест Категория ТС &quot;М3&quot; </busInfo>
<!-- Название перевозчика. Не обязателен -->
<carrierName>ООО &quot;ВВМЛ&quot;</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>СТРАХОВЩИК: ПАО &quot;Росстрах&quot;; 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>
```



+ 15
- 0
build.gradle View File

@@ -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'
}

BIN
gradle/wrapper/gradle-wrapper.jar View File


+ 6
- 0
gradle/wrapper/gradle-wrapper.properties View File

@@ -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

+ 160
- 0
gradlew View File

@@ -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 "$@"

+ 90
- 0
gradlew.bat View File

@@ -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

+ 2
- 0
settings.gradle View File

@@ -0,0 +1,2 @@
rootProject.name = 'avs5rs'


+ 144
- 0
src/main/java/com/artmark/avs5rs/SaleService.java View File

@@ -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);
}

+ 44
- 0
src/main/java/com/artmark/avs5rs/model/Agent.java View File

@@ -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;
}
}

+ 64
- 0
src/main/java/com/artmark/avs5rs/model/BookOrderRequest.java View File

@@ -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;
}
}

+ 28
- 0
src/main/java/com/artmark/avs5rs/model/BookOrderResponse.java View File

@@ -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;
}
}

+ 35
- 0
src/main/java/com/artmark/avs5rs/model/CancelTicketRequest.java View File

@@ -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;
}
}

+ 26
- 0
src/main/java/com/artmark/avs5rs/model/CancelTicketResponse.java View File

@@ -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;
}
}

+ 35
- 0
src/main/java/com/artmark/avs5rs/model/ConfirmOrderRequest.java View File

@@ -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;
}
}

+ 37
- 0
src/main/java/com/artmark/avs5rs/model/ConfirmOrderResponse.java View File

@@ -0,0 +1,37 @@
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;
import java.util.List;

/**
* @author Ushmodin N.
* @since 07.07.2016 11:18
*/


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ConfirmOrderResponse")
public class ConfirmOrderResponse {
private String orderId;
@XmlElement(name = "Ticket")
private List<Ticket> tickets;

public String getOrderId() {
return orderId;
}

public void setOrderId(String orderId) {
this.orderId = orderId;
}

public List<Ticket> getTickets() {
return tickets;
}

public void setTickets(List<Ticket> tickets) {
this.tickets = tickets;
}
}

+ 28
- 0
src/main/java/com/artmark/avs5rs/model/DateAdapter.java View File

@@ -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.adapters.XmlAdapter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* @author Ushmodin N.
* @since 07.07.2016 14:34
*/

@XmlAccessorType(XmlAccessType.FIELD)
public class DateAdapter extends XmlAdapter<String, Date> {

private static final String FORMAT = "yyyy-MM-dd";

@Override
public Date unmarshal(String s) throws Exception {
return new SimpleDateFormat(FORMAT).parse(s);
}

@Override
public String marshal(Date date) throws Exception {
return new SimpleDateFormat(FORMAT).format(date);
}
}

+ 38
- 0
src/main/java/com/artmark/avs5rs/model/DocumentType.java View File

@@ -0,0 +1,38 @@
package com.artmark.avs5rs.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

/**
* @author Ushmodin N.
* @since 07.07.2016 12:36
*/

@XmlAccessorType(XmlAccessType.FIELD)
public class DocumentType {
/**
* ID типа документа. Обязателен. Может совпадать с названием.
*/
protected String id;

/**
* Название типа документа. Обязателен.
*/
protected String name;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

+ 27
- 0
src/main/java/com/artmark/avs5rs/model/EchoRequest.java View File

@@ -0,0 +1,27 @@
package com.artmark.avs5rs.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:25
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "EchoRequest")
public class EchoRequest {
/**
* Сообщение которое будет возвращено в ответ
*/
private String message;

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}

+ 26
- 0
src/main/java/com/artmark/avs5rs/model/EchoResponse.java View File

@@ -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.XmlType;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:25
*/
@XmlType(name = "EchoResponse")
@XmlAccessorType(XmlAccessType.FIELD)
public class EchoResponse {
/**
* Сообщение переданное в запросе
*/
private String message;

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}

+ 10
- 0
src/main/java/com/artmark/avs5rs/model/Gender.java View File

@@ -0,0 +1,10 @@
package com.artmark.avs5rs.model;

/**
* @author Ushmodin N.
* @since 07.07.2016 12:27
*/

public enum Gender {
MALE, FEMALE
}

+ 27
- 0
src/main/java/com/artmark/avs5rs/model/GetArrivalStationsRequest.java View File

@@ -0,0 +1,27 @@
package com.artmark.avs5rs.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:27
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "GetArrivalStationsRequest")
public class GetArrivalStationsRequest {
/**
* Идентификатор станции отправления. Обязательно.
*/
private String dispatchStationId;

public String getDispatchStationId() {
return dispatchStationId;
}

public void setDispatchStationId(String dispatchStationId) {
this.dispatchStationId = dispatchStationId;
}
}

+ 27
- 0
src/main/java/com/artmark/avs5rs/model/GetArrivalStationsResponse.java View File

@@ -0,0 +1,27 @@
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;
import java.util.List;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:30
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetArrivalStationsResponse")
public class GetArrivalStationsResponse {
@XmlElement(name = "Station")
private List<Station> stations;

public List<Station> getStations() {
return stations;
}

public void setStations(List<Station> stations) {
this.stations = stations;
}
}

+ 15
- 0
src/main/java/com/artmark/avs5rs/model/GetDispatchStationsRequest.java View File

@@ -0,0 +1,15 @@
package com.artmark.avs5rs.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
* @author Ushmodin N.
* @since 08.07.2016 09:08
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "GetDispatchStationsRequest")
public class GetDispatchStationsRequest {
}

+ 27
- 0
src/main/java/com/artmark/avs5rs/model/GetDispatchStationsResponse.java View File

@@ -0,0 +1,27 @@
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;
import java.util.List;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:27
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetDispatchStationsResponse")
public class GetDispatchStationsResponse {
@XmlElement(name = "Station")
private List<Station> station;

public List<Station> getStation() {
return station;
}

public void setStation(List<Station> station) {
this.station = station;
}
}

+ 43
- 0
src/main/java/com/artmark/avs5rs/model/GetDocumentTypesRequest.java View File

@@ -0,0 +1,43 @@
package com.artmark.avs5rs.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:59
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "GetDocumentTypesRequest")
public class GetDocumentTypesRequest {
private String tripId;
private String dispatchStationId;
private String arrivalStationId;

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;
}

}

+ 28
- 0
src/main/java/com/artmark/avs5rs/model/GetDocumentTypesResponse.java View File

@@ -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.XmlElement;
import javax.xml.bind.annotation.XmlType;
import java.util.List;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:59
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetDocumentTypesResponse")
public class GetDocumentTypesResponse {
@XmlElement(name = "DocumentType")
private List<DocumentType> documentTypes;

public List<DocumentType> getDocumentTypes() {
return documentTypes;
}

public void setDocumentTypes(List<DocumentType> documentTypes) {
this.documentTypes = documentTypes;
}
}

+ 52
- 0
src/main/java/com/artmark/avs5rs/model/GetFreeSeatsRequest.java View File

@@ -0,0 +1,52 @@
package com.artmark.avs5rs.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:53
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "GetFreeSeatsRequest")
public class GetFreeSeatsRequest {

/**
* Идентификатор рейса. Обязательный.
*/
private String tripId;
/**
* Идентификатор станции отправления. Обязательный.
*/
private String dispatchStationId;
/**
* Идентификатор станции назначения. Обязательный.
*/
private String arrivalStationId;

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;
}
}

+ 27
- 0
src/main/java/com/artmark/avs5rs/model/GetFreeSeatsResponse.java View File

@@ -0,0 +1,27 @@
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;
import java.util.List;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:54
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetFreeSeatsResponse")
public class GetFreeSeatsResponse {
@XmlElement(name = "Seat")
private List<Seat> seats;

public List<Seat> getSeats() {
return seats;
}

public void setSeats(List<Seat> seats) {
this.seats = seats;
}
}

+ 24
- 0
src/main/java/com/artmark/avs5rs/model/GetOrderRequest.java View File

@@ -0,0 +1,24 @@
package com.artmark.avs5rs.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
* @author Ushmodin N.
* @since 07.07.2016 11:15
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "GetOrderRequest")
public class GetOrderRequest {
private String orderId;

public String getOrderId() {
return orderId;
}

public void setOrderId(String orderId) {
this.orderId = orderId;
}
}

+ 37
- 0
src/main/java/com/artmark/avs5rs/model/GetOrderResponse.java View File

@@ -0,0 +1,37 @@
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;
import java.util.List;

/**
* @author Ushmodin N.
* @since 07.07.2016 11:15
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetOrderResponse")
public class GetOrderResponse {
private String orderId;
@XmlElement(name = "Ticket")
private List<Ticket> tickets;

public String getOrderId() {
return orderId;
}

public void setOrderId(String orderId) {
this.orderId = orderId;
}

public List<Ticket> getTickets() {
return tickets;
}

public void setTickets(List<Ticket> tickets) {
this.tickets = tickets;
}
}

+ 42
- 0
src/main/java/com/artmark/avs5rs/model/GetTicketTypesRequest.java View File

@@ -0,0 +1,42 @@
package com.artmark.avs5rs.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
* @author Ushmodin N.
* @since 07.07.2016 10:55
*/

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "GetTicketTypesRequest")
public class GetTicketTypesRequest {
private String tripId;
private String dispatchStationId;
private String arrivalStationId;

public String getTripId() {
return tripId;
}

public void setTripId(String tripId) {
this.tripId = tripId;
}

public String getDispatchStationId() {
return dispatchStationId;
}

public void setDispatchStationId(String dispatchStationId) {