gillbus 0.17.6 → 0.22.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.ruby-version +1 -1
- data/Gemfile +0 -4
- data/gillbus.gemspec +1 -1
- data/lib/gillbus/base_request.rb +2 -0
- data/lib/gillbus/base_response.rb +8 -4
- data/lib/gillbus/get_carriers.rb +13 -0
- data/lib/gillbus/get_required_fields.rb +1 -0
- data/lib/gillbus/get_trip_seats.rb +7 -0
- data/lib/gillbus/helpers/parser.rb +45 -11
- data/lib/gillbus/return_position.rb +2 -0
- data/lib/gillbus/return_position_forced.rb +16 -0
- data/lib/gillbus/search_nearby_trips.rb +39 -0
- data/lib/gillbus/search_trips.rb +20 -13
- data/lib/gillbus/structs/carrier.rb +11 -0
- data/lib/gillbus/structs/luggage.rb +19 -0
- data/lib/gillbus/structs/nearby_cities_trip.rb +61 -0
- data/lib/gillbus/structs/point.rb +2 -0
- data/lib/gillbus/structs/return_cause.rb +1 -1
- data/lib/gillbus/structs/seat.rb +1 -0
- data/lib/gillbus/structs/segment.rb +27 -0
- data/lib/gillbus/structs/tariff/return_cause.rb +8 -3
- data/lib/gillbus/structs/ticket.rb +29 -12
- data/lib/gillbus/structs/tickets_option.rb +29 -0
- data/lib/gillbus/structs/trip.rb +35 -0
- data/lib/gillbus/structs/trip_options.rb +82 -24
- data/lib/gillbus/structs/trip_service.rb +16 -1
- data/lib/gillbus/tickets_booking.rb +34 -0
- data/lib/gillbus/version.rb +1 -1
- data/lib/gillbus.rb +31 -3
- data/test/error_test.rb +1 -1
- data/test/find_order_test.rb +16 -0
- data/test/get_required_fields_test.rb +77 -0
- data/test/get_trip_seats_test.rb +36 -0
- data/test/get_trip_segments_test.rb +1 -0
- data/test/parse_trip_options_test.rb +92 -0
- data/test/parse_trip_test.rb +25 -0
- data/test/responses/findOrder.xml +8 -0
- data/test/responses/getRequiredFieldsWithOneLuggage.xml +28 -0
- data/test/responses/getRequiredFieldsWithTwoLuggageSegments.xml +40 -0
- data/test/responses/getRequiredFieldsWithoutLuggage.xml +23 -0
- data/test/responses/getTripSeats-back-seats.xml +1192 -0
- data/test/responses/getTripSeats-two-floors.xml +1122 -0
- data/test/responses/getTripSeats.xml +70 -0
- data/test/responses/legacy_trip.yml +120 -0
- data/test/responses/legacy_trip_2.yml +217 -0
- data/test/responses/searchTrips-full-carriers-info.xml +231 -0
- data/test/responses/searchTrips-new-options-format.xml +244 -0
- data/test/responses/searchTrips-prod.xml +5 -0
- data/test/responses/searchTrips-round-trip-offers.xml +2016 -0
- data/test/responses/searchTripsNearby.xml +707 -0
- data/test/responses/ticketsBooking.xml +1 -0
- data/test/search_nearby_trips_test.rb +18 -0
- data/test/search_trips_test.rb +93 -0
- data/test/tickets_booking_test.rb +63 -0
- metadata +49 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b85dbfeb542cb41597bcaff503e35298c94742adcf937f536f41d26849c41f0b
|
4
|
+
data.tar.gz: fe22b0ac687bf787630356475e001b40f8ecbeccb1f6a3560816b8663666a75d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bdc19f44370f737270f8220415b9c6ef927a7821e08d072bf2f778c6adbfe9b847a212b53a036b7ab226772bc1459cbab5d5be29337fb16bd5de11d89d61cd0
|
7
|
+
data.tar.gz: 24b1d2cf5459a9f61bafa62adf9f2cdfd27c18562ca3bdb5f15afcdf306ed60e98f29e19444682f955d26380b5162adfd3b1d4d8e97c8cba11907b5d907952d0
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3
|
1
|
+
2.6.3
|
data/Gemfile
CHANGED
data/gillbus.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency 'faraday'
|
23
23
|
spec.add_dependency 'monetize'
|
24
24
|
spec.add_dependency 'money'
|
25
|
-
spec.add_dependency '
|
25
|
+
spec.add_dependency 'ox', '~> 2.9'
|
26
26
|
|
27
27
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
28
28
|
spec.add_development_dependency 'minitest'
|
data/lib/gillbus/base_request.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'ox'
|
2
2
|
|
3
3
|
class Gillbus
|
4
4
|
class BaseResponse
|
@@ -13,11 +13,15 @@ class Gillbus
|
|
13
13
|
attr_accessor :external_error_message
|
14
14
|
attr_accessor :request_time
|
15
15
|
|
16
|
+
attr_accessor :raw_xml # make accessible for logging and debuging
|
17
|
+
|
16
18
|
def error?
|
17
19
|
!error_code.nil?
|
18
20
|
end
|
19
21
|
|
20
22
|
def self.parse(data, instance: new, options: {})
|
23
|
+
instance.raw_xml = options[:raw_xml] if options[:raw_xml]
|
24
|
+
|
21
25
|
# ugly
|
22
26
|
if data['MESSAGE']
|
23
27
|
instance.error_code = data['MESSAGE']['CODE'].to_i
|
@@ -32,12 +36,12 @@ class Gillbus
|
|
32
36
|
end
|
33
37
|
|
34
38
|
def self.parse_string(xml_string, **options)
|
35
|
-
xml =
|
39
|
+
xml = Ox.load(xml_string, mode: :hash, symbolize_keys: false)
|
36
40
|
# <DATA/> is a valid response
|
37
41
|
return ParseError.new(xml_string, 'DATA attribute missing') unless xml.key?('DATA')
|
38
42
|
data = xml['DATA'] || {}
|
39
|
-
parse(data, instance: new, options: options)
|
40
|
-
rescue
|
43
|
+
parse(data, instance: new, options: options.merge(raw_xml: xml_string))
|
44
|
+
rescue Ox::ParseError, ArgumentError => e
|
41
45
|
ParseError.new(xml_string, e.message)
|
42
46
|
end
|
43
47
|
end
|
@@ -21,6 +21,11 @@ class Gillbus
|
|
21
21
|
# Только для железнодорожных рейсов.
|
22
22
|
attr_accessor :back_carriage_id
|
23
23
|
|
24
|
+
# floorNumber
|
25
|
+
# Номер этажа автобуса, если указан, то возвращается карта мест указанного этажа.
|
26
|
+
# Если задан неверно или не указан, то возвращается вся карта мест.
|
27
|
+
attr_accessor :floor_number
|
28
|
+
|
24
29
|
# segment0carriageId...segmentNcarriageId (не обязательный)
|
25
30
|
# ИД вагона сегмента рейса с порядковым нормеом 0...N, для которого нужно получить карту мест.
|
26
31
|
# По-умолчанию первый попавшийся. Только для железнодорожных рейсов.
|
@@ -30,6 +35,7 @@ class Gillbus
|
|
30
35
|
tripId: trip_id,
|
31
36
|
carriageId: carriage_id,
|
32
37
|
backCarriageId: back_carriage_id,
|
38
|
+
floorNumber: floor_number,
|
33
39
|
)
|
34
40
|
end
|
35
41
|
end
|
@@ -38,6 +44,7 @@ class Gillbus
|
|
38
44
|
SEGMENT_REGEX = /SEGMENT_(?<number>\d+)_SEAT/
|
39
45
|
|
40
46
|
field :seats, [Seat], key: 'SEAT'
|
47
|
+
field :back_seats, [Seat], key: 'BACK_SEAT' # для round_trip offers
|
41
48
|
|
42
49
|
field :segments, :segments, key: SEGMENT_REGEX
|
43
50
|
|
@@ -3,6 +3,13 @@ require 'active_support/time'
|
|
3
3
|
|
4
4
|
class Gillbus
|
5
5
|
class Parser
|
6
|
+
NULL_CONST = 'null'.freeze
|
7
|
+
TRUE_CONST = 'true'.freeze
|
8
|
+
YES_CONST = 'Y'.freeze
|
9
|
+
DATE_FORMAT_CONST = '%d.%m.%Y'.freeze
|
10
|
+
TIME_FORMAT_REGEXP = /^ ( \d\d:\d\d ) (?: :\d\d )? $/x.freeze
|
11
|
+
DEFAULT_TIMEZONE = 'Europe/Kiev'.freeze
|
12
|
+
|
6
13
|
attr_accessor :doc
|
7
14
|
attr_accessor :instance
|
8
15
|
attr_accessor :fields
|
@@ -33,18 +40,43 @@ class Gillbus
|
|
33
40
|
private
|
34
41
|
|
35
42
|
def fetch_value(key:, root:)
|
43
|
+
target_doc = root ? doc[root] : doc
|
44
|
+
return unless target_doc
|
45
|
+
|
36
46
|
if key.is_a?(Regexp)
|
37
|
-
|
38
|
-
elsif
|
39
|
-
|
47
|
+
target_doc.select { |k| k =~ key }
|
48
|
+
elsif key.is_a?(Array)
|
49
|
+
key.map { |k| ensure_array(target_doc[k]) }.inject(&:+)
|
50
|
+
else
|
51
|
+
target_doc[key]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Нужно удостовериться, что элемент завёрнут в массив,
|
56
|
+
# чтобы дальше эти массивы сложить в методе fetch_value.
|
57
|
+
# Есть нюанс, что при сложении ['Item'] + [{'ID'=>'1'}, 'Subitem'] получается
|
58
|
+
# ['Item', {'ID'=>'1'}, 'Subitem'], а нам надо ['Item', [{'ID'=>'1'}, 'Subitem']]
|
59
|
+
# Поэтому item_with_id заворачиваем во внешний массив
|
60
|
+
def ensure_array(val)
|
61
|
+
if is_item_with_id?(val)
|
62
|
+
[val]
|
40
63
|
else
|
41
|
-
|
64
|
+
Array(val)
|
42
65
|
end
|
43
66
|
end
|
44
67
|
|
68
|
+
# Детектит элементы вида <CRITICAL_INF ID="1">Text</CRITICAL_INF>,
|
69
|
+
# которые парсятся как [{'ID'=>'1'}, 'Text']
|
70
|
+
def is_item_with_id?(val)
|
71
|
+
val.is_a?(Array) && val.size == 2 && val.first.is_a?(Hash) && val.first.keys == ['ID']
|
72
|
+
end
|
73
|
+
|
45
74
|
def make_one_or_many(type, val)
|
46
75
|
# [:type]
|
47
76
|
if type.is_a? Array
|
77
|
+
if val.is_a?(Array) && val[0].is_a?(Hash) && !val[0].has_key?('__content__')
|
78
|
+
val = [val] if val[1].is_a?(String) # hack to handle attribute parsing by Ox
|
79
|
+
end
|
48
80
|
array(val).map { |v| make_one type.first, v }
|
49
81
|
# :type
|
50
82
|
else
|
@@ -70,16 +102,18 @@ class Gillbus
|
|
70
102
|
end
|
71
103
|
|
72
104
|
def string(val)
|
73
|
-
return if val ==
|
105
|
+
return if val == NULL_CONST
|
106
|
+
# если это тег с атрибутами - возвращаем только содержимое тега
|
107
|
+
return val.last if val.is_a?(Array) && val.size == 2
|
74
108
|
val
|
75
109
|
end
|
76
110
|
|
77
111
|
def bool(val)
|
78
|
-
val ==
|
112
|
+
val == TRUE_CONST
|
79
113
|
end
|
80
114
|
|
81
115
|
def yesno_bool(val)
|
82
|
-
val ==
|
116
|
+
val == YES_CONST
|
83
117
|
end
|
84
118
|
|
85
119
|
def int(val)
|
@@ -87,12 +121,12 @@ class Gillbus
|
|
87
121
|
end
|
88
122
|
|
89
123
|
def date(val)
|
90
|
-
Date.strptime(val,
|
124
|
+
Date.strptime(val, DATE_FORMAT_CONST)
|
91
125
|
end
|
92
126
|
|
93
127
|
# rubocop:disable Style/GuardClause, Style/IfUnlessModifier
|
94
128
|
def time(val)
|
95
|
-
if val =~
|
129
|
+
if val =~ TIME_FORMAT_REGEXP
|
96
130
|
$1
|
97
131
|
end
|
98
132
|
end
|
@@ -109,11 +143,11 @@ class Gillbus
|
|
109
143
|
end
|
110
144
|
|
111
145
|
def default_timezone
|
112
|
-
@options[:timezone] ||
|
146
|
+
@options[:timezone] || DEFAULT_TIMEZONE
|
113
147
|
end
|
114
148
|
|
115
149
|
def decimal(val)
|
116
|
-
BigDecimal
|
150
|
+
BigDecimal(val)
|
117
151
|
end
|
118
152
|
end
|
119
153
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Gillbus
|
2
|
+
module ReturnPositionForced
|
3
|
+
Gillbus.register self, :return_position_forced
|
4
|
+
|
5
|
+
class Request < ::Gillbus::ReturnPosition::Request
|
6
|
+
def path; '/online2/ReturnPositionForced'; end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Response < ::Gillbus::ReturnPosition::Response
|
10
|
+
class ReturnPositionForced < ::Gillbus::ReturnPosition::Response::ReturnPosition
|
11
|
+
end
|
12
|
+
|
13
|
+
field :return_positions, [::Gillbus::ReturnPosition::Response::ReturnPosition], key: 'RETURN_POSITION'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Gillbus
|
2
|
+
module SearchTripNearbyCities
|
3
|
+
Gillbus.register self, :search_nearby_cities_trips
|
4
|
+
|
5
|
+
class Request < BaseRequest
|
6
|
+
def path; '/online2/searchTripNearbyCities' end
|
7
|
+
|
8
|
+
# startCityId
|
9
|
+
# ИД пункта отправления
|
10
|
+
attr_accessor :start_city_id
|
11
|
+
|
12
|
+
# endCityId
|
13
|
+
# ИД пункта прибытия
|
14
|
+
attr_accessor :end_city_id
|
15
|
+
|
16
|
+
# startDateSearch
|
17
|
+
# Дата отправления, на которую будет произведен поиск рейсов.
|
18
|
+
attr_accessor :start_date_search
|
19
|
+
|
20
|
+
# ticketCount
|
21
|
+
# Количество оформляемых билетов. От 1 до k.
|
22
|
+
attr_accessor :ticket_count
|
23
|
+
|
24
|
+
def params
|
25
|
+
compact(
|
26
|
+
startCityId: start_city_id,
|
27
|
+
endCityId: end_city_id,
|
28
|
+
startDateSearch: date(start_date_search),
|
29
|
+
ticketCount: ticket_count,
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Response < BaseResponse
|
35
|
+
field :completed, :bool
|
36
|
+
field :trips, [NearbyCitiesTrip], key: 'TRIP', root: 'NEARBY_CITIES'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/gillbus/search_trips.rb
CHANGED
@@ -44,6 +44,11 @@ class Gillbus
|
|
44
44
|
# Если false, то будут искаться рейсы только в одну сторону.
|
45
45
|
attr_accessor :round_trip
|
46
46
|
|
47
|
+
# limitSegmentTripShow (опциональный параметр)
|
48
|
+
# Ограничение максимального количества сегментных рейсов.
|
49
|
+
# Если ничего не передано или передано число -1, то выдача не ограничена.
|
50
|
+
attr_accessor :limit_segment_trip_show
|
51
|
+
|
47
52
|
# backStartDateSearch (обязательный если roundTrip=true)
|
48
53
|
# Дата отправления, на которую будет произведен поиск обратных рейсов.
|
49
54
|
attr_accessor :back_start_date_search
|
@@ -93,20 +98,21 @@ class Gillbus
|
|
93
98
|
|
94
99
|
def params
|
95
100
|
compact(
|
96
|
-
selectedModes:
|
97
|
-
connectionIds:
|
98
|
-
tripFullSale:
|
99
|
-
fullSearch:
|
100
|
-
startCityId:
|
101
|
-
endCityId:
|
102
|
-
startDateSearch:
|
103
|
-
roundTrip:
|
101
|
+
selectedModes: modes(selected_modes),
|
102
|
+
connectionIds: list(connection_ids),
|
103
|
+
tripFullSale: bool(trip_full_sale),
|
104
|
+
fullSearch: bool(full_search),
|
105
|
+
startCityId: start_city_id,
|
106
|
+
endCityId: end_city_id,
|
107
|
+
startDateSearch: date(start_date_search),
|
108
|
+
roundTrip: bool(round_trip),
|
109
|
+
limitSegmentTripShow: limit_segment_trip_show,
|
104
110
|
backStartDateSearch: date(back_start_date_search),
|
105
|
-
ticketCount:
|
106
|
-
waitTimeout:
|
107
|
-
onlyBranded:
|
108
|
-
tripOptions:
|
109
|
-
insuranceId:
|
111
|
+
ticketCount: ticket_count,
|
112
|
+
waitTimeout: wait_timeout,
|
113
|
+
onlyBranded: bool(only_branded),
|
114
|
+
tripOptions: bool(trip_options),
|
115
|
+
insuranceId: insurance_id,
|
110
116
|
**passengers_data,
|
111
117
|
)
|
112
118
|
end
|
@@ -132,6 +138,7 @@ class Gillbus
|
|
132
138
|
class Response < BaseResponse
|
133
139
|
field :completed, :bool
|
134
140
|
field :trips, [Trip], key: 'TRIP'
|
141
|
+
field :back_trips, [Trip], key: 'BACK_TRIP'
|
135
142
|
end
|
136
143
|
end
|
137
144
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Gillbus
|
2
|
+
class Luggage
|
3
|
+
extend Fields
|
4
|
+
|
5
|
+
# => "0"
|
6
|
+
field :segment_number, :int
|
7
|
+
|
8
|
+
# => "true"
|
9
|
+
field :is_buy, :bool
|
10
|
+
|
11
|
+
# => "50.5"
|
12
|
+
field :luggage_tariff, :decimal, key: 'BAGGAGE_TARIFF'
|
13
|
+
|
14
|
+
# => "2"
|
15
|
+
field :luggage_limit, :int, key: 'BAGGAGE_LIMIT'
|
16
|
+
|
17
|
+
field :segments, [Luggage], key: 'SEGMENT'
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# результаты поиска по соседним городам, берется из кеша и содержит меньше данных, чем поездка из выдачи
|
2
|
+
class Gillbus
|
3
|
+
class NearbyCitiesTrip
|
4
|
+
extend Fields
|
5
|
+
include UpdateAttrs
|
6
|
+
|
7
|
+
# => "Москва"
|
8
|
+
field :start_city_name
|
9
|
+
|
10
|
+
# => "A7CD147C07E7CD1BE040A8C0630328EC"
|
11
|
+
field :start_city_guid
|
12
|
+
|
13
|
+
# => "Europe/Moscow"
|
14
|
+
field :start_timezone
|
15
|
+
|
16
|
+
# => 20
|
17
|
+
field :distance_to_start
|
18
|
+
|
19
|
+
# => "Смоленск"
|
20
|
+
field :end_city_name
|
21
|
+
|
22
|
+
# => "DD253CDEE7D1555EE040B8596052093F"
|
23
|
+
field :end_city_guid
|
24
|
+
|
25
|
+
# => "Europe/Moscow"
|
26
|
+
field :end_timezone
|
27
|
+
|
28
|
+
# => 0
|
29
|
+
field :distance_to_end
|
30
|
+
|
31
|
+
# => "22:50"
|
32
|
+
field :start_time, :time # XXX
|
33
|
+
|
34
|
+
# => "08:00"
|
35
|
+
field :end_time, :time # XXX
|
36
|
+
|
37
|
+
# => ""Автофлот Автоколонна-1601" ООО"
|
38
|
+
field :carrier_name # XXX
|
39
|
+
|
40
|
+
# => "RU "Автофлот Автоколонна-1601" ООО"
|
41
|
+
field :carrier_legal_name # XXX
|
42
|
+
|
43
|
+
# => "390"
|
44
|
+
field :time_in_road
|
45
|
+
|
46
|
+
# => "1100"
|
47
|
+
field :total_cost, :money
|
48
|
+
|
49
|
+
# => "RUB"
|
50
|
+
field :currency
|
51
|
+
|
52
|
+
parser do
|
53
|
+
def money(val)
|
54
|
+
Monetize.parse(val, doc['CURRENCY'])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# to hold unserialized data
|
59
|
+
attr_accessor :data
|
60
|
+
end
|
61
|
+
end
|
data/lib/gillbus/structs/seat.rb
CHANGED
@@ -67,6 +67,24 @@ class Gillbus
|
|
67
67
|
# => "RU \"ПЕТРОКОМ - АВТО ПЛЮС\" ООО"
|
68
68
|
field :carrier_name
|
69
69
|
|
70
|
+
# => "RU \"Еременчук Е.А.\" ИП"
|
71
|
+
field :carrier_legal_name
|
72
|
+
|
73
|
+
# => "260802027265"
|
74
|
+
field :carrier_inn
|
75
|
+
|
76
|
+
# => "г СНТ Лилия, Московская, Наро-фоминский"
|
77
|
+
field :carrier_address_fact
|
78
|
+
|
79
|
+
# => "г СНТ Лилия, Московская, Наро-фоминский"
|
80
|
+
field :carrier_address_leg
|
81
|
+
|
82
|
+
# => "316265100057314"
|
83
|
+
field :carrier_egrul_egis
|
84
|
+
|
85
|
+
# => "2514411332"
|
86
|
+
field :carrier_ogrn
|
87
|
+
|
70
88
|
# => "09:10"
|
71
89
|
field :time_in_road, :time
|
72
90
|
|
@@ -130,6 +148,15 @@ class Gillbus
|
|
130
148
|
# => "1100"
|
131
149
|
field :total_cost, :money
|
132
150
|
|
151
|
+
# => "1300"
|
152
|
+
field :original_amount, :money
|
153
|
+
|
154
|
+
# => "200"
|
155
|
+
field :discount_value, :money
|
156
|
+
|
157
|
+
# => "13.57"
|
158
|
+
field :discount_percentage
|
159
|
+
|
133
160
|
# => "RUB"
|
134
161
|
field :currency
|
135
162
|
|
@@ -1,6 +1,8 @@
|
|
1
1
|
class Gillbus
|
2
2
|
class Tariff
|
3
3
|
class ReturnCause
|
4
|
+
LOSSLESS = 'lossless'.freeze
|
5
|
+
|
4
6
|
extend Fields
|
5
7
|
include UpdateAttrs
|
6
8
|
|
@@ -10,10 +12,13 @@ class Gillbus
|
|
10
12
|
|
11
13
|
# rubocop:disable Lint/UnusedMethodArgument
|
12
14
|
def self.parse(doc, instance: nil, parent: nil, options: {})
|
13
|
-
instance =
|
14
|
-
if doc.is_a? Hash
|
15
|
+
instance = new
|
16
|
+
if doc.is_a?(Array) && doc.size == 2 && doc.first.is_a?(Hash) && doc.last.is_a?(String)
|
17
|
+
instance.lossless = doc.first[LOSSLESS] == Parser::TRUE_CONST
|
18
|
+
instance.cause = doc.last
|
19
|
+
elsif doc.is_a?(Hash) && doc.has_key?('__content__')
|
20
|
+
instance.lossless = (doc['lossless'] == 'true')
|
15
21
|
instance.cause = doc['__content__']
|
16
|
-
instance.lossless = doc['lossless'] == 'true'
|
17
22
|
else
|
18
23
|
instance.cause = doc
|
19
24
|
instance.lossless = false
|
@@ -1,5 +1,17 @@
|
|
1
1
|
class Gillbus
|
2
2
|
class Ticket
|
3
|
+
STATUS_MAPPING = {
|
4
|
+
'0' => :voiding, # ticket in processing, interim status during refund;
|
5
|
+
'1' => :reserved, # ticket booked;
|
6
|
+
'2' => :ticketed, # ticket sold;
|
7
|
+
'3' => :ordered, # the booking, that waiting for the confirmation;
|
8
|
+
'4' => :returned, # ticket returned;
|
9
|
+
'5' => :canceled, # booking canceled;
|
10
|
+
'6' => :voided, # ticket canceled;
|
11
|
+
'8' => :booked, # the sale, that waiting for the confirmation;
|
12
|
+
'e' => :ticketing_error, # resource failed to process this ticket;
|
13
|
+
}.freeze
|
14
|
+
|
3
15
|
extend Fields
|
4
16
|
include UpdateAttrs
|
5
17
|
|
@@ -22,8 +34,8 @@ class Gillbus
|
|
22
34
|
# :ticketed 2 – ticket sold;
|
23
35
|
# :ordered 3 – the booking, that waiting for the confirmation;
|
24
36
|
# :returned 4 – ticket returned;
|
25
|
-
# :canceled 5 – booking
|
26
|
-
# :voided 6 – ticket
|
37
|
+
# :canceled 5 – booking canceled;
|
38
|
+
# :voided 6 – ticket canceled;
|
27
39
|
# :booked 8 – the sale, that waiting for the confirmation
|
28
40
|
field :ticket_status, :ticket_status
|
29
41
|
|
@@ -256,7 +268,7 @@ class Gillbus
|
|
256
268
|
# Array of commissions only for us (with additional fields)
|
257
269
|
field :all_commissions, [Commission], key: 'COMMISSION', root: 'ALL_COMMISSIONS'
|
258
270
|
|
259
|
-
field :return_causes, [
|
271
|
+
field :return_causes, [ReturnCause], key: 'RETURN_CAUSE'
|
260
272
|
|
261
273
|
# Date to pay reserved ticket
|
262
274
|
field :date_to_pay, :datetime
|
@@ -271,17 +283,22 @@ class Gillbus
|
|
271
283
|
|
272
284
|
field :end_at, :datetime_combined, key: 'END'
|
273
285
|
|
286
|
+
field :is_online_refund, :bool
|
287
|
+
|
288
|
+
field :is_luggage, :bool, key: 'IS_BAGGAGE'
|
289
|
+
|
290
|
+
# => '3257025789'
|
291
|
+
field :supplier_inn
|
292
|
+
|
293
|
+
# => '"Клен 2" ООО'
|
294
|
+
field :supplier_name
|
295
|
+
|
296
|
+
# => "+79065002926"
|
297
|
+
field :supplier_phone
|
298
|
+
|
274
299
|
parser do
|
275
300
|
def ticket_status(value)
|
276
|
-
|
277
|
-
'1' => :reserved, # ticket booked;
|
278
|
-
'2' => :ticketed, # ticket sold;
|
279
|
-
'3' => :ordered, # the booking, that waiting for the confirmation;
|
280
|
-
'4' => :returned, # ticket returned;
|
281
|
-
'5' => :canceled, # booking cancelled;
|
282
|
-
'6' => :voided, # ticket cancelled;
|
283
|
-
'8' => :booked, # the sale, that waiting for the confirmation
|
284
|
-
}[value]
|
301
|
+
::Gillbus::Ticket::STATUS_MAPPING[value]
|
285
302
|
end
|
286
303
|
|
287
304
|
def money(val)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Gillbus
|
2
|
+
class TicketsOption
|
3
|
+
extend Fields
|
4
|
+
include UpdateAttrs
|
5
|
+
|
6
|
+
# идентификатор опции
|
7
|
+
field :id, :int, key: 'ID'
|
8
|
+
|
9
|
+
# текст опции
|
10
|
+
field :text, :string, key: :__content__
|
11
|
+
|
12
|
+
def self.parse(doc, instance: nil, parent: nil, options: {})
|
13
|
+
instance = new
|
14
|
+
if doc.is_a?(String)
|
15
|
+
instance.text = doc
|
16
|
+
elsif doc.is_a?(Array)
|
17
|
+
raise ArgumentError, "Unable to parse TicketsOption: #{doc.inspect}" unless doc.size == 2
|
18
|
+
instance.id = doc.first.fetch('ID').to_i
|
19
|
+
instance.text = doc.last
|
20
|
+
elsif doc.is_a?(Hash) #legacy data made with MultiXML
|
21
|
+
instance.id = doc.fetch('ID')
|
22
|
+
instance.text = doc.fetch('__content__')
|
23
|
+
else
|
24
|
+
raise ArgumentError, "Unable to parse TicketsOption: #{doc.inspect}"
|
25
|
+
end
|
26
|
+
instance
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|