gillbus 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +10 -0
  5. data/Guardfile +29 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +140 -0
  8. data/Rakefile +9 -0
  9. data/gillbus.gemspec +31 -0
  10. data/lib/gillbus/base_request.rb +99 -0
  11. data/lib/gillbus/base_response.rb +43 -0
  12. data/lib/gillbus/buy_booking.rb +74 -0
  13. data/lib/gillbus/buy_tickets.rb +36 -0
  14. data/lib/gillbus/cancel_order.rb +55 -0
  15. data/lib/gillbus/drivers/faraday_response_file_logger.rb +19 -0
  16. data/lib/gillbus/find_order.rb +37 -0
  17. data/lib/gillbus/get_all_cities.rb +24 -0
  18. data/lib/gillbus/get_cities.rb +34 -0
  19. data/lib/gillbus/get_countries.rb +24 -0
  20. data/lib/gillbus/get_dates_new.rb +35 -0
  21. data/lib/gillbus/get_order_status.rb +28 -0
  22. data/lib/gillbus/get_order_ticket.rb +62 -0
  23. data/lib/gillbus/get_required_fields.rb +32 -0
  24. data/lib/gillbus/get_time_table.rb +33 -0
  25. data/lib/gillbus/get_trip_seats.rb +61 -0
  26. data/lib/gillbus/get_trips.rb +13 -0
  27. data/lib/gillbus/helpers/fields.rb +47 -0
  28. data/lib/gillbus/helpers/parser.rb +100 -0
  29. data/lib/gillbus/helpers/update_attrs.rb +15 -0
  30. data/lib/gillbus/lock_seats.rb +82 -0
  31. data/lib/gillbus/logout.rb +19 -0
  32. data/lib/gillbus/parse_error.rb +11 -0
  33. data/lib/gillbus/reserve_tickets.rb +13 -0
  34. data/lib/gillbus/search_trips.rb +96 -0
  35. data/lib/gillbus/session_login.rb +32 -0
  36. data/lib/gillbus/structs/commission.rb +54 -0
  37. data/lib/gillbus/structs/item.rb +14 -0
  38. data/lib/gillbus/structs/passenger_discount.rb +37 -0
  39. data/lib/gillbus/structs/point.rb +38 -0
  40. data/lib/gillbus/structs/return_cause.rb +23 -0
  41. data/lib/gillbus/structs/seat.rb +38 -0
  42. data/lib/gillbus/structs/segment.rb +161 -0
  43. data/lib/gillbus/structs/tariff.rb +59 -0
  44. data/lib/gillbus/structs/ticket.rb +285 -0
  45. data/lib/gillbus/structs/timetable_segment.rb +51 -0
  46. data/lib/gillbus/structs/timetable_trip.rb +77 -0
  47. data/lib/gillbus/structs/trip.rb +164 -0
  48. data/lib/gillbus/tickets_booking.rb +182 -0
  49. data/lib/gillbus/unlock_seats.rb +15 -0
  50. data/lib/gillbus/version.rb +3 -0
  51. data/lib/gillbus.rb +86 -0
  52. data/script/example_booking.rb +82 -0
  53. data/script/example_booking_with_segments.rb +90 -0
  54. data/script/example_canceling_booking.rb +67 -0
  55. data/script/example_canceling_reservation.rb +69 -0
  56. data/script/example_reservation.rb +88 -0
  57. data/test/buy_booking_test.rb +32 -0
  58. data/test/buy_tickets_test.rb +12 -0
  59. data/test/cancel_order_test.rb +12 -0
  60. data/test/error_test.rb +31 -0
  61. data/test/find_order_test.rb +24 -0
  62. data/test/get_cities_test.rb +12 -0
  63. data/test/get_countries_test.rb +12 -0
  64. data/test/get_dates_new_test.rb +12 -0
  65. data/test/get_order_ticket_test.rb +12 -0
  66. data/test/get_time_table_test.rb +21 -0
  67. data/test/get_trip_seats_test.rb +40 -0
  68. data/test/lock_seats_test.rb +70 -0
  69. data/test/reserve_tickets_test.rb +22 -0
  70. data/test/responses/buyBooking.xml +9 -0
  71. data/test/responses/buyTickets.xml +7 -0
  72. data/test/responses/cancelOrder.xml +8 -0
  73. data/test/responses/error.xml +1 -0
  74. data/test/responses/findOrder.xml +296 -0
  75. data/test/responses/getCities.xml +266 -0
  76. data/test/responses/getCountries.xml +90 -0
  77. data/test/responses/getOrderTicket.xml +3 -0
  78. data/test/responses/getTimeTable.xml +81 -0
  79. data/test/responses/getTripSeats-one-empty-segment.xml +562 -0
  80. data/test/responses/getTripSeats-segments.xml +1052 -0
  81. data/test/responses/getTripSeats.xml +492 -0
  82. data/test/responses/lockSeats.xml +23 -0
  83. data/test/responses/reserveTickets.xml +76 -0
  84. data/test/responses/searchTrips-empty.xml +3 -0
  85. data/test/responses/searchTrips-prod.xml +193 -0
  86. data/test/responses/searchTrips-segments-roundtrip.xml +15812 -0
  87. data/test/responses/searchTrips-segments.xml +808 -0
  88. data/test/responses/sessionLogin.xml +3 -0
  89. data/test/responses/ticketsBooking.xml +75 -0
  90. data/test/responses/very_empty.xml +1 -0
  91. data/test/search_trips_test.rb +71 -0
  92. data/test/session_login_test.rb +12 -0
  93. data/test/test_helper.rb +3 -0
  94. data/test/tickets_booking_test.rb +16 -0
  95. metadata +303 -0
@@ -0,0 +1,96 @@
1
+ class Gillbus
2
+ module SearchTrips
3
+
4
+ Gillbus.register self, :search_trips
5
+
6
+ class Request < BaseRequest
7
+
8
+ def path; '/online2/searchTrips' end
9
+
10
+ # selectedModes (не обязательный)
11
+ # Вид транспорта, который необходимо искать.
12
+ # @see Gillbus::BaseRequest::MODES
13
+ attr_accessor :selected_modes
14
+
15
+ # connectionIds (не обязательный)
16
+ # Список предполагаемых идентификаторов пересадочных пунктов, разделенных “;”. Используется если выбран вид транспорта 8, 9.
17
+ attr_accessor :connection_ids
18
+
19
+ # tripFullSale (не обязательный)
20
+ # Признак определяющий количество возвращаемых рейсов. Если true, то возвращаются заказные и регулярные рейсы. Если false, то возвращаются только регулярные рейсы.
21
+ attr_accessor :trip_full_sale
22
+
23
+ # fullSearch (не обязательный)
24
+ # Признак полного поиска рейсов, который указывает когда возвращать результат.
25
+ # Если true, то результат будет возвращен тогда, когда будет окончен поиск всех возможных рейсов.
26
+ # Если false, то результат будет возвращен сразу, как только будут найдены первые рейсы.
27
+ attr_accessor :full_search
28
+
29
+ # startCityId
30
+ # ИД пункта отправления
31
+ attr_accessor :start_city_id
32
+
33
+ # endCityId
34
+ # ИД пункта прибытия
35
+ attr_accessor :end_city_id
36
+
37
+ # startDateSearch
38
+ # Дата отправления, на которую будет произведен поиск рейсов.
39
+ attr_accessor :start_date_search
40
+
41
+ # roundTrip
42
+ # Признак поиска рейсов туда-обратно. По-умолчанию false. Если true, то будут искаться рейсы туда-обратно.
43
+ # Если false, то будут искаться рейсы только в одну сторону.
44
+ attr_accessor :round_trip
45
+
46
+ # backStartDateSearch (обязательный если roundTrip=true)
47
+ # Дата отправления, на которую будет произведен поиск обратных рейсов.
48
+ attr_accessor :back_start_date_search
49
+
50
+ # ticketCount
51
+ # Количество оформляемых билетов. От 1 до k.
52
+ attr_accessor :ticket_count
53
+
54
+ # TODO
55
+ # passenger0studentTicket... passengerNstudentTicket (не обязательный)
56
+ # Номер студенческого билета пассажира с порядковым номером 0... N.
57
+ #
58
+ # passenger0birthday... passengerNbirthday (не обязательный)
59
+ # Дата рождения пассажира с порядковым номером 0...N.
60
+ #
61
+ # passenger0ISIC... passengerNISIC (не обязательный)
62
+ # Номер ISIC пассажира с порядковым номером 0...N.
63
+ attr_accessor :passengers
64
+
65
+ # waitTimeout
66
+ # Время ожидания ответа, секунды. Если параметр установлен и поиск рейсов
67
+ # длится дольше указанного времени, то будет возвращен пустой ответ через указанное время.
68
+ # Параметр игнорируется, при fullSearch = true.
69
+ attr_accessor :wait_timeout
70
+
71
+ def params
72
+ pax = (passengers || []).map.with_index { |p, i| PassengerDiscount.wrap(p).params("passenger#{i}") }.reduce({}, :merge)
73
+ compact(
74
+ selectedModes: modes(selected_modes),
75
+ connectionIds: list(connection_ids),
76
+ tripFullSale: bool(trip_full_sale),
77
+ fullSearch: bool(full_search),
78
+ startCityId: start_city_id,
79
+ endCityId: end_city_id,
80
+ startDateSearch: date(start_date_search),
81
+ roundTrip: bool(round_trip),
82
+ backStartDateSearch: date(back_start_date_search),
83
+ ticketCount: ticket_count,
84
+ waitTimeout: wait_timeout,
85
+ **pax
86
+ )
87
+ end
88
+ end
89
+
90
+ class Response < BaseResponse
91
+ field :completed, :bool
92
+ field :trips, [Trip], key: 'TRIP'
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,32 @@
1
+ class Gillbus
2
+ module SessionLogin
3
+
4
+ Gillbus.register self, :session_login
5
+
6
+ class Request < BaseRequest
7
+
8
+ def initialize(password:, locale: nil)
9
+ super
10
+ end
11
+
12
+ attr_accessor :password
13
+ attr_accessor :locale
14
+
15
+ def path
16
+ "/online2/sessionLogin/online/#{@password}"
17
+ end
18
+
19
+ def params
20
+ compact(locale: translated_locale(locale))
21
+ end
22
+
23
+ end
24
+
25
+ class Response < BaseResponse
26
+
27
+ field :logged, :bool
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,54 @@
1
+ # FIXME it's possible I got currency for some fields wrong.
2
+ class Gillbus
3
+ class Commission
4
+
5
+ extend Fields
6
+ include UpdateAttrs
7
+
8
+ # Collecting type
9
+ field :type
10
+
11
+ # Symbolic collecting code
12
+ field :code
13
+
14
+ # Collecting description
15
+ field :description
16
+
17
+ # Value of collecting in sale currency
18
+ field :value, :money
19
+
20
+ # Value of collecting VAT in sale currency
21
+ field :vat, :money
22
+
23
+ # Collecting currency
24
+ field :currency
25
+
26
+ # Exchange rate of collecting to sale currency
27
+ field :rate
28
+
29
+ # Value of collecting in currency in which it is brought
30
+ field :value_in_currency, :money
31
+
32
+ # Value of collecting VAT in currency in which it is brought
33
+ field :vat_in_currency, :money
34
+
35
+ # The return amount from collecting in sale currency (w/o VAT)
36
+ field :return_value, :money
37
+
38
+ # The return amount from collecting VAT in sale currency
39
+ field :return_vat, :money
40
+
41
+ # The return amount from collecting in currency in which it is brought (w/o VAT)
42
+ field :return_value_in_currency, :money
43
+
44
+ # The return amount from collecting VAT in currency in which it is brought.
45
+ field :return_vat_in_currency, :money
46
+
47
+ parser do
48
+ def money(val)
49
+ Monetize.parse(val, doc['CURRENCY'])
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,14 @@
1
+ class Gillbus
2
+ class Item
3
+
4
+ extend Fields
5
+ include UpdateAttrs
6
+
7
+ field :date, :date
8
+ # Признак прямого рейса
9
+ field :is_direct, :bool
10
+ # Признак рейса с пересадкой
11
+ field :is_transfer, :bool
12
+
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ class Gillbus
2
+ # not a request, neither a response part
3
+ # just a params record for SearchTrips
4
+ class PassengerDiscount < BaseRequest
5
+
6
+ def self.wrap(passenger_or_params)
7
+ return passenger_or_params if passenger_or_params.is_a? self
8
+ new(passenger_or_params)
9
+ end
10
+
11
+ # passenger0birthday... passengerNbirthday (обязательный для авиаперевозки)
12
+ # Дата рождения пассажира с порядковым номером 0...N.
13
+ attr_accessor :birthday
14
+
15
+ # passenger0studentTicket... passengerNstudentTicket (не обязательный)
16
+ # Номер студенческого билета пассажира с порядковым номером 0... N.
17
+ attr_accessor :student_ticket
18
+
19
+ # passenger0studentYear... passengerNstudentYear (не обязательный)
20
+ # Курс, на котором учится пассажир с порядковым номером 0...N, если он студент.
21
+ # Для просчета более выгодной скидки.
22
+ attr_accessor :student_year
23
+
24
+ # passenger0ISIC...passengerNISIC (не обязательный)
25
+ # Номер ISIC пассажира с порядковым номером 0...N.
26
+ attr_accessor :isic
27
+
28
+ def params(prefix="")
29
+ compact(
30
+ birthday: date(birthday),
31
+ studentTicket: student_ticket,
32
+ studentYear: student_year,
33
+ ISIC: isic,
34
+ ).map {|k, v| [:"#{prefix}#{k}", v] }.to_h
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ class Gillbus
2
+ class Point
3
+
4
+ extend Fields
5
+ include UpdateAttrs
6
+
7
+ # => "0"
8
+ field :number
9
+
10
+ # => "Москва"
11
+ field :geography_name
12
+
13
+ # => "м. \"Речной Вокзал\""
14
+ field :name
15
+
16
+ # => "ул. Фестивальная, дом 11, метро \"Речной Вокзал\""
17
+ field :address
18
+
19
+ # => "10.10.2014"
20
+ field :arrival_date, :date
21
+
22
+ # => nil
23
+ field :arrival_time, :time
24
+
25
+ # => "10.10.2014"
26
+ field :dispatch_date, :date
27
+
28
+ # => "22:50"
29
+ field :dispatch_time, :time
30
+
31
+ # => "false"
32
+ field :check_point, :bool
33
+
34
+ # Признак наличия пересадки в пункте
35
+ # => "false"
36
+ field :transfer_point, :bool
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ class Gillbus
2
+ class ReturnCause
3
+
4
+ extend Fields
5
+ include UpdateAttrs
6
+
7
+ # The return condition ID
8
+ field :id
9
+
10
+ # Approx. return amount in sale currency
11
+ field :approximate_amount, :money
12
+
13
+ # The return reason’s description.
14
+ field :cause
15
+
16
+ parser do
17
+ def money(val)
18
+ Monetize.parse(val, doc[:_currency])
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,38 @@
1
+ class Gillbus
2
+ class Seat
3
+
4
+ extend Fields
5
+ include UpdateAttrs
6
+
7
+ # seat id
8
+ field :id
9
+
10
+ field :number
11
+
12
+ # Тип места.
13
+ # 0 – пустое место, ячейка прохода.
14
+ # 1 – место заказанное.
15
+ # 2 – заблокированное.
16
+ # 3 – свободное.
17
+ # 4 – забронированное.
18
+ # 5 – проданное.
19
+ # 6 – место под спецбронью.
20
+ # 7 – зарегистрированное.
21
+ # 8 – место под технической бронью.
22
+ # 9 – приоритетное место.
23
+ # Продажи возможно осуществлять только на места типа «3» и «9»
24
+ field :type, :int
25
+
26
+ field :x, :int
27
+ field :y, :int
28
+
29
+ def free?
30
+ type == 3 || type == 9
31
+ end
32
+
33
+ def isle?
34
+ type == 0 || type.nil?
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,161 @@
1
+ class Gillbus
2
+ class Segment
3
+
4
+ extend Fields
5
+ include UpdateAttrs
6
+
7
+ # Порядковый номер сегмента рейса.
8
+ # => "0"
9
+ field :segment_number
10
+
11
+ # Признак сегмента обратного направления искусственного рейса туда-обратно.
12
+ # Если TRIP_MODE = 8 и искались обратные рейсы, то параметр будет равен true.
13
+ # => "false"
14
+ field :back_segment, :bool
15
+
16
+ # => "393409381686201016"
17
+ field :id
18
+
19
+ # Идентификатор стороннего поставщика. 0 - gillbus
20
+ # => "0"
21
+ field :res_id
22
+
23
+ # => "Москва-Санкт-Петербург"
24
+ field :number
25
+
26
+ # => "Москва"
27
+ field :start_city_name
28
+
29
+ # => "Санкт-Петербург"
30
+ field :end_city_name
31
+
32
+ # => "10.10.2014"
33
+ field :start_date, :date
34
+
35
+ # => "11.10.2014"
36
+ field :end_date, :date
37
+
38
+ # => "22:50"
39
+ field :start_time, :time
40
+
41
+ # => "08:00"
42
+ field :end_time, :time
43
+
44
+ # => "Сетра S 315 НDH"
45
+ field :bus_model
46
+
47
+ # => true
48
+ field :trip_seats_map, :bool
49
+
50
+ # => "49"
51
+ field :places_count, :int
52
+
53
+ # => "10"
54
+ field :free_places_count, :int
55
+
56
+ # => "10/49"
57
+ field :free_busy_places
58
+
59
+ # => "ABCDEE23413"
60
+ field :carrier_id
61
+
62
+ # => "RU \"ПЕТРОКОМ - АВТО ПЛЮС\" ООО"
63
+ field :carrier_name
64
+
65
+ # => "09:10"
66
+ field :time_in_road, :time
67
+
68
+ # => "м. \"Речной Вокзал\""
69
+ field :station_begin_name
70
+
71
+ # => "ул. Фестивальная, дом 11, метро \"Речной Вокзал\""
72
+ field :station_begin_address
73
+
74
+ # => "м. \"Бухарестская\""
75
+ field :station_end_name
76
+
77
+ # => "ул. Бухарестская, 30/32 торговый дом \"Континент\", метро \"Бухарестская\""
78
+ field :station_end_address
79
+
80
+ # => "true"
81
+ field :reservation_enabled, :bool
82
+
83
+ # => "true"
84
+ field :sale_enabled, :bool
85
+
86
+ # => "false"
87
+ field :return_enabled, :bool
88
+
89
+ # => "25"
90
+ field :time_for_cancel, :int
91
+
92
+ # => "false"
93
+ field :trip_full_sale, :bool
94
+
95
+ # => "true"
96
+ field :can_discount, :bool
97
+
98
+ # => "false"
99
+ field :international, :bool
100
+
101
+ # => "false"
102
+ field :join_book_buy, :bool
103
+
104
+ # => "1"
105
+ field :trip_mode, :int
106
+
107
+ # => "null"
108
+ field :image_url
109
+
110
+ # => "null"
111
+ field :start_point_type
112
+
113
+ # => "null"
114
+ field :vehicle_description
115
+
116
+ # => "null"
117
+ field :vehicle_features
118
+
119
+ # => "false"
120
+ field :branded, :bool
121
+
122
+ # => "1100"
123
+ field :total_cost, :money
124
+
125
+ # => "RUB"
126
+ field :currency
127
+
128
+ # => "643"
129
+ field :currency_code
130
+
131
+ field :tariffs, [:tariff], key: "TARIFF"
132
+
133
+ field :points, [Point], key: "POINT"
134
+
135
+ field :segments, [Segment], key: "SEGMENT"
136
+
137
+ def start_at
138
+ ActiveSupport::TimeZone["Europe/Kiev"].parse("#{data["START_DATE"]} #{data["START_TIME"]}")
139
+ end
140
+
141
+ parser do
142
+ def money(val)
143
+ Monetize.parse(val, doc['CURRENCY'])
144
+ end
145
+
146
+ def tariff(val)
147
+ Tariff.parse(val.merge(_currency: doc['CURRENCY']))
148
+ end
149
+ end
150
+
151
+ # to hold unserialized data
152
+ attr_accessor :data
153
+
154
+ def self.parse(doc)
155
+ instance = super
156
+ instance.data = doc
157
+ instance
158
+ end
159
+
160
+ end
161
+ end
@@ -0,0 +1,59 @@
1
+ class Gillbus
2
+ class Tariff
3
+
4
+ extend Fields
5
+ include UpdateAttrs
6
+
7
+ # => "Y"
8
+ field :short_name
9
+
10
+ # => "Базовый тариф"
11
+ field :full_name
12
+
13
+ # => nil
14
+ field :start_date, :date
15
+
16
+ # => nil
17
+ field :end_date, :date
18
+
19
+ # => "Базовый тариф стоимости проезда одного пассажиров в одном направлении\n"
20
+ field :description
21
+
22
+ # => "24"
23
+ field :time_to_buy_reserved, :int
24
+
25
+ # => "6"
26
+ field :time_to_stop_booking, :int
27
+
28
+ # Время на выкуп брони, то же что и date_to_pay у ticket'а
29
+ field :time_to_pay_reservation, :datetime
30
+
31
+ # => "1100"
32
+ field :cost, :money
33
+
34
+ # => "true"
35
+ field :after_dispatch_no_return, :bool
36
+
37
+ # => nil
38
+ field :passenger_birthday
39
+
40
+ # => nil
41
+ field :passenger_isic_number
42
+
43
+ # => nil
44
+ field :passenger_student_ticket
45
+
46
+ # => "..."
47
+ field :return_cause
48
+
49
+ # => "66.61"
50
+ field :note
51
+
52
+ parser do
53
+ def money(val)
54
+ Monetize.parse(val, doc[:_currency])
55
+ end
56
+ end
57
+
58
+ end
59
+ end