czech_post_b2b_client 1.0.2 → 1.0.3
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +6 -2
- data/lib/czech_post_b2b_client/b2b_errors.rb +6 -7
- data/lib/czech_post_b2b_client/configuration.rb +10 -6
- data/lib/czech_post_b2b_client/post_services.rb +20 -11
- data/lib/czech_post_b2b_client/printing_templates.rb +1 -2
- data/lib/czech_post_b2b_client/request_builders/get_parcels_printing_builder.rb +5 -1
- data/lib/czech_post_b2b_client/request_builders/send_parcels_builder.rb +10 -5
- data/lib/czech_post_b2b_client/response_codes.rb +17 -15
- data/lib/czech_post_b2b_client/response_parsers/get_parcel_state_parser.rb +4 -3
- data/lib/czech_post_b2b_client/response_parsers/send_parcels_parser.rb +24 -2
- data/lib/czech_post_b2b_client/services/api_caller.rb +15 -9
- data/lib/czech_post_b2b_client/services/parcels_immediate_sender.rb +1 -1
- data/lib/czech_post_b2b_client/services/parcels_send_process_updater.rb +1 -1
- data/lib/czech_post_b2b_client/services/xsds_downloader.rb +59 -0
- data/lib/czech_post_b2b_client/services.rb +1 -0
- data/lib/czech_post_b2b_client/version.rb +1 -1
- data/lib/stepped_service/base.rb +2 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7c296befdf3e8a0575b0855f80ddc0bfd730db4
|
4
|
+
data.tar.gz: 2c9519c8d7e5a483c60cf356bafe5dd652149763
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a66d5f3d8160159490b7197cd0e1edf0107e7cb6610d019495a8ab02650118881f94d6c8deca7ef3bce55cdcfe3573392626e10220ec158876f807556f147b81
|
7
|
+
data.tar.gz: f0cdc245a2c4f58432475e7cb3afe32acb707d0710e150977e823418142424f955ae3301748aeae072cf994db52654d0c544d02257bfd8bdc6e6dc7219e16a94
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -3,13 +3,17 @@
|
|
3
3
|
All changes to the gem are documented here.
|
4
4
|
|
5
5
|
|
6
|
+
## [1.0.3] - 2020-05-20
|
7
|
+
|
8
|
+
- Added Czech Post service DiscountForOnlinePosting.
|
9
|
+
- **Breaking**: Renamed Post service size classes `CzechPostB2bClient::PostServices::Size???` to `CzechPostB2bClient::PostServices::ParcelSize???` (eg. : `CzechPostB2bClient::PostServices::ParcelSizeXL`)
|
10
|
+
I know, that I have **breaking** in every new version, I hope You are not fast enough.
|
11
|
+
|
6
12
|
## [1.0.2] - 2020-05-08
|
7
13
|
|
8
14
|
- Added Czech Post services as classes, not just list in docs.
|
9
15
|
- **Breaking**: Renamed methods `CzechPostB2bClient::PrintingTemplate.all_template_classes` and `CzechPostB2bClient::ResponseCodes.all_code_classes` to `CzechPostB2bClient::PrintingTemplate.all_classes` , and `CzechPostB2bClient::ResponseCodes.all_classes`
|
10
16
|
|
11
|
-
|
12
|
-
|
13
17
|
## [1.0.0] - 2020-03-19
|
14
18
|
|
15
19
|
Production ready release
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable Style/AsciiComments
|
3
|
+
# rubocop:disable Style/AsciiComments, Layout/LineLength
|
4
4
|
|
5
5
|
# response <B2BFaultMessage>
|
6
6
|
# Chybový kód | Detail chyby | Popis
|
@@ -15,8 +15,6 @@
|
|
15
15
|
# 9 | TRY_AGAIN_LATER | Překročen parametr maximálního počtu volání služby v daný okamžik
|
16
16
|
# 10 | UNFINISHED_PROCESS | Zpracování není ještě ukončeno (u async operací)
|
17
17
|
|
18
|
-
# rubocop:enable Style/AsciiComments
|
19
|
-
|
20
18
|
# B2B errors, which can be returned in response `B2BFaultMessage`
|
21
19
|
#
|
22
20
|
# Do not miss `CzechPostB2bClient::B2BErrors.all_error_classes` and `CzechPostB2bClient::B2BErrors.new_by_code`,
|
@@ -91,17 +89,18 @@ module CzechPostB2bClient
|
|
91
89
|
@message = 'Zpracování není ještě ukončeno (u async operací)'
|
92
90
|
end
|
93
91
|
|
94
|
-
|
92
|
+
# have t be at end of file, to collect all classes defined before
|
93
|
+
def self.all_error_classes
|
95
94
|
ObjectSpace.each_object(CzechPostB2bClient::B2BErrors::BaseError.singleton_class)
|
96
95
|
end
|
97
|
-
module_function :all_error_classes
|
98
96
|
|
99
|
-
def new_by_code(code)
|
97
|
+
def self.new_by_code(code)
|
100
98
|
klass = all_error_classes.detect { |k| k.code == code }
|
101
99
|
raise "B2BError with code: #{code} is unknown!" unless klass
|
102
100
|
|
103
101
|
klass.new
|
104
102
|
end
|
105
|
-
module_function :new_by_code
|
106
103
|
end
|
107
104
|
end
|
105
|
+
|
106
|
+
# rubocop:enable Style/AsciiComments, Layout/LineLength
|
@@ -19,12 +19,16 @@ module CzechPostB2bClient
|
|
19
19
|
def initialize
|
20
20
|
# set defaults here
|
21
21
|
|
22
|
-
# ours, accessible, but maybe
|
23
|
-
@namespaces = {
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
# ours, accessible, but maybe out of date, for test usage
|
23
|
+
@namespaces = {
|
24
|
+
'xmlns' => 'https://raw.githubusercontent.com/foton/czech_post_b2b_client/master/doc/20181023/B2BCommon-v1.1.xsd',
|
25
|
+
'xmlns:ns2' => 'https://raw.githubusercontent.com/foton/czech_post_b2b_client/master/doc/20181023/B2B-POLServices-v1.6.xsd'
|
26
|
+
}
|
27
|
+
# original, accessible only with setup certificates
|
28
|
+
@namespaces = {
|
29
|
+
'xmlns' => 'https://b2b.postaonline.cz/schema/B2BCommon-v1',
|
30
|
+
'xmlns:ns2' => 'https://b2b.postaonline.cz/schema/POLServices-v1'
|
31
|
+
}
|
28
32
|
@language = :cs
|
29
33
|
@logger = defined?(Rails) ? ::Rails.logger : ::Logger.new(STDOUT)
|
30
34
|
@b2b_api_base_uri = 'https://b2b.postaonline.cz/services/POLService/v1'
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Layout/LineLength, Style/AsciiComments
|
4
|
+
|
3
5
|
# Hopefully complete list of services which can be assigned to parcels
|
4
6
|
# It is hard to get list of current services and even harder to find out what does they mean (so You pick right name in English).
|
5
7
|
# They have SAME CODES! for different services (depending on which parcel You send).
|
@@ -7,7 +9,7 @@
|
|
7
9
|
|
8
10
|
# source: https://www.postaonline.cz/podanionline/ePOST-dokumentace/20prilohy.html and older one
|
9
11
|
# Old services are commented out
|
10
|
-
#
|
12
|
+
# Comments at end of line mostly describes which type of parcels can 'afford' such service
|
11
13
|
#
|
12
14
|
# Do not miss `CzechPostB2bClient::PostServices.all_classes` method,
|
13
15
|
# it has to be at end of module to work properly
|
@@ -20,31 +22,31 @@ module CzechPostB2bClient
|
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
|
-
class
|
25
|
+
class ParcelSizeS < Base
|
24
26
|
@code = 'S'
|
25
27
|
@abbreviation = 'S'
|
26
|
-
@description = '
|
28
|
+
@description = 'Velikost S (nejdelší strana do 35cm)'
|
27
29
|
# ; Balík Do ruky (DR, DV, DE) ; Balík Na poštu (NP, NV, NA) ; Cenný balík ((B, BD, BB, V, VD, VV) ; EMS (EE) ; Doporučený balíček (BA) ; Balík Expres (BE) ; Obyčejný balík (O)
|
28
30
|
end
|
29
31
|
|
30
|
-
class
|
32
|
+
class ParcelSizeM < Base
|
31
33
|
@code = 'M'
|
32
34
|
@abbreviation = 'M'
|
33
|
-
@description = 'Velikost M'
|
35
|
+
@description = 'Velikost M (nejdelší strana do 50cm)'
|
34
36
|
# ; Balík Do ruky (DR, DV, DE) ; Balík Na poštu (NP, NV, NA) ; Cenný balík ((B, BD, BB, V, VD, VV) ; EMS (EE) ; Doporučený balíček (BA) ; Balík Expres (BE) ; Obyčejný balík (O)
|
35
37
|
end
|
36
38
|
|
37
|
-
class
|
39
|
+
class ParcelSizeL < Base
|
38
40
|
@code = 'L'
|
39
41
|
@abbreviation = 'L'
|
40
|
-
@description = 'Velikost L'
|
42
|
+
@description = 'Velikost L (nejdelší strana do 100cm)'
|
41
43
|
# ; Balík Do ruky (DR, DV, DE) ; Balík Na poštu (NP, NV, NA) ; Cenný balík ((B, BD, BB, V, VD, VV) ; EMS (EE) ; Doporučený balíček (BA) ; Obyčejný balík (O)
|
42
44
|
end
|
43
45
|
|
44
|
-
class
|
46
|
+
class ParcelSizeXL < Base
|
45
47
|
@code = 'XL'
|
46
48
|
@abbreviation = 'XL'
|
47
|
-
@description = 'Velikost XL'
|
49
|
+
@description = 'Velikost XL (nejdelší strana do 240cm)'
|
48
50
|
# ; Balík Do ruky (DR, DV, DE) ; Balík Na poštu (NP, NV, NA) ; Cenný balík ((B, BD, BB, V, VD, VV) ; Obyčejný balík (O) |
|
49
51
|
end
|
50
52
|
|
@@ -739,6 +741,12 @@ module CzechPostB2bClient
|
|
739
741
|
@description = 'Vrátit ekonomicky'
|
740
742
|
end
|
741
743
|
|
744
|
+
class DiscountForOnlinePosting < Base
|
745
|
+
@code = '97'
|
746
|
+
@abbreviation = ''
|
747
|
+
@description = 'Sleva za elektronické předání dat'
|
748
|
+
end
|
749
|
+
|
742
750
|
# **Pozn. U RR zásilek je vždy jedna ze služeb 50 až 60 povinná!!!!!!**
|
743
751
|
# Čísla požadovaných služeb budou zadána do pole požadované služby k zásilce dle výše uvedeného číselníku v libovolném pořadí. Kombinace více služeb bude zadávána tímto způsobem, např. Dodejka, Pilně a Dobírka s Pk A: 3+4+15
|
744
752
|
# U služeb pro elektronické avízo lze zadat vždy jen jednu z uvedených služeb 34 nebo 45 nebo 46. Kombinace těchto služeb není možná a bude na poště vyhodnocená jako chybná. Bez uvedení kontaktních údajů na adresáta (mobilní telefonní číslo nebo e-mail) není služba možná a na poště bude vyhodnocena jako chybná.
|
@@ -759,9 +767,10 @@ module CzechPostB2bClient
|
|
759
767
|
# Podavatelé, kteří nemají sjednánu smluvní cenu, musí od 1. 3.2019 při podání zásilek Balík Do ruky, Balík Na poštu, Cenný Balík, Doporučený balíček, Balík Expres, Obyčejný balík a EMS uvádět povinně ve službách jednu z rozměrových služeb S, M, L, XL.
|
760
768
|
|
761
769
|
# has to be at the end, to load all subcasses before
|
762
|
-
def all_classes
|
770
|
+
def self.all_classes
|
763
771
|
ObjectSpace.each_object(CzechPostB2bClient::PostServices::Base.singleton_class)
|
764
772
|
end
|
765
|
-
module_function :all_classes
|
766
773
|
end
|
767
774
|
end
|
775
|
+
|
776
|
+
# rubocop:enable Layout/LineLength, Style/AsciiComments
|
@@ -155,9 +155,8 @@ module CzechPostB2bClient
|
|
155
155
|
end
|
156
156
|
|
157
157
|
# has to be at the end, to load all subcasses before
|
158
|
-
def all_classes
|
158
|
+
def self.all_classes
|
159
159
|
ObjectSpace.each_object(CzechPostB2bClient::PrintingTemplates::Base.singleton_class)
|
160
160
|
end
|
161
|
-
module_function :all_classes
|
162
161
|
end
|
163
162
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
|
3
5
|
module CzechPostB2bClient
|
4
6
|
module RequestBuilders
|
5
7
|
class GetParcelsPrintingBuilder < BaseBuilder
|
@@ -44,7 +46,7 @@ module CzechPostB2bClient
|
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
47
|
-
def do_printing_header
|
49
|
+
def do_printing_header # rubocop:disable Metrics/AbcSize
|
48
50
|
new_element('ns2:doPrintingHeader').tap do |printing_header|
|
49
51
|
add_element_to(printing_header, 'ns2:customerID', value: options[:customer_id]) # Technologicke cislo podavatele
|
50
52
|
add_element_to(printing_header, 'ns2:contractNumber', value: options[:contract_number]) # Nepovine: ID CCK slozky podavatele
|
@@ -77,3 +79,5 @@ module CzechPostB2bClient
|
|
77
79
|
end
|
78
80
|
end
|
79
81
|
end
|
82
|
+
|
83
|
+
# rubocop:enable Layout/LineLength
|
@@ -1,8 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Layout/LineLength, Style/AsciiComments
|
4
|
+
|
3
5
|
module CzechPostB2bClient
|
4
6
|
module RequestBuilders
|
5
|
-
class SendParcelsBuilder < BaseBuilder
|
7
|
+
class SendParcelsBuilder < BaseBuilder # rubocop:disable Metrics/ClassLength
|
6
8
|
attr_reader :common_data, :parcels
|
7
9
|
|
8
10
|
def initialize(common_data:, parcels:, request_id: 1)
|
@@ -72,7 +74,7 @@ module CzechPostB2bClient
|
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
75
|
-
def do_parcel_header
|
77
|
+
def do_parcel_header # rubocop:disable Metrics/AbcSize
|
76
78
|
new_element('ns2:doParcelHeader').tap do |parcel_header|
|
77
79
|
add_element_to(parcel_header, 'ns2:transmissionDate', value: common_data[:parcels_sending_date].strftime('%d.%m.%Y')) # Predpokladane datum podani (format DD.MM.YYYY !)
|
78
80
|
add_element_to(parcel_header, 'ns2:customerID', value: common_data[:customer_id]) # Technologicke cislo podavatele
|
@@ -133,7 +135,7 @@ module CzechPostB2bClient
|
|
133
135
|
end
|
134
136
|
end
|
135
137
|
|
136
|
-
def do_parcel_params(parcel_data)
|
138
|
+
def do_parcel_params(parcel_data) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
137
139
|
params = parcel_data[:params]
|
138
140
|
cod = parcel_data[:cash_on_delivery] || {}
|
139
141
|
new_element('ns2:doParcelParams').tap do |parcel_params|
|
@@ -183,7 +185,7 @@ module CzechPostB2bClient
|
|
183
185
|
add_parcel_adress_element('ns2:doParcelAddressDocument', parcel_data[:document_addressee])
|
184
186
|
end
|
185
187
|
|
186
|
-
def add_parcel_adress_element(element_name, addressee_data)
|
188
|
+
def add_parcel_adress_element(element_name, addressee_data) # rubocop:disable Metrics/AbcSize
|
187
189
|
return nil if addressee_data.nil?
|
188
190
|
|
189
191
|
address_data = addressee_data[:address]
|
@@ -237,7 +239,8 @@ module CzechPostB2bClient
|
|
237
239
|
end
|
238
240
|
end
|
239
241
|
|
240
|
-
|
242
|
+
# Nepovinne. Adresa
|
243
|
+
def add_address_elements(parent_element, address_data, without: [])
|
241
244
|
return if address_data.nil?
|
242
245
|
|
243
246
|
address_tags_and_values(address_data).each_pair do |xml_tag, value|
|
@@ -292,3 +295,5 @@ module CzechPostB2bClient
|
|
292
295
|
end
|
293
296
|
end
|
294
297
|
end
|
298
|
+
|
299
|
+
# rubocop:enable Layout/LineLength, Style/AsciiComments
|
@@ -5,7 +5,7 @@
|
|
5
5
|
# Do not miss `CzechPostB2bClient::ResponseCodes.all_classes` and `CzechPostB2bClient::ResponseCodes.new_by_code`,
|
6
6
|
# they have to be at end of module to work properly
|
7
7
|
module CzechPostB2bClient
|
8
|
-
module ResponseCodes
|
8
|
+
module ResponseCodes # rubocop:disable Metrics/ModuleLength
|
9
9
|
class BaseCode
|
10
10
|
@code = 'undefined'
|
11
11
|
@text = '_NONE_'
|
@@ -281,7 +281,8 @@ module CzechPostB2bClient
|
|
281
281
|
class InvalidAddressForBigPackage < CzechPostB2bClient::ResponseCodes::BaseCode
|
282
282
|
@code = 119
|
283
283
|
@text = 'INVALID_ADRESS'
|
284
|
-
@description = 'Adresa odesílatele není vhodná pro produkt Nadrozměrná zásilka
|
284
|
+
@description = 'Adresa odesílatele není vhodná pro produkt Nadrozměrná zásilka' \
|
285
|
+
'(adresa obsahuje údaj P.O.Box nebo Poste restante)!'
|
285
286
|
@type = :chyba
|
286
287
|
end
|
287
288
|
|
@@ -589,21 +590,24 @@ module CzechPostB2bClient
|
|
589
590
|
class CODAmountTooBig < CzechPostB2bClient::ResponseCodes::BaseCode
|
590
591
|
@code = 177
|
591
592
|
@text = 'INVALID_AMOUNT'
|
592
|
-
@description = 'Limit pro uložení zásilky na Výdejním místě je pro Dobírku max. 50.000,- Kč.
|
593
|
+
@description = 'Limit pro uložení zásilky na Výdejním místě je pro Dobírku max. 50.000,- Kč.' \
|
594
|
+
' Zásilka bude uložena na poště, která je Výdejnímu místu nadřízená.'
|
593
595
|
@type = :chyba
|
594
596
|
end
|
595
597
|
|
596
598
|
class PriceTooBig < CzechPostB2bClient::ResponseCodes::BaseCode
|
597
599
|
@code = 178
|
598
600
|
@text = 'INVALID_PRICE'
|
599
|
-
@description = 'Limit pro uložení zásilky na Výdejním místě je pro Udanou cenu a Dobírku max. 50.000,- Kč.
|
601
|
+
@description = 'Limit pro uložení zásilky na Výdejním místě je pro Udanou cenu a Dobírku max. 50.000,- Kč.' \
|
602
|
+
' Zásilka bude uložena na poště, která je Výdejnímu místu nadřízená.'
|
600
603
|
@type = :chyba
|
601
604
|
end
|
602
605
|
|
603
606
|
class PriceAndCODAmountTooBig < CzechPostB2bClient::ResponseCodes::BaseCode
|
604
607
|
@code = 179
|
605
608
|
@text = 'INVALID_PRICE_AND_AMOUNT'
|
606
|
-
@description = 'Limit pro uložení zásilky na Výdejním místě je pro Udanou cenu a Dobírku max. 50.000,- Kč.
|
609
|
+
@description = 'Limit pro uložení zásilky na Výdejním místě je pro Udanou cenu a Dobírku max. 50.000,- Kč.' \
|
610
|
+
' Zásilka bude uložena na poště, která je Výdejnímu místu nadřízená.'
|
607
611
|
@type = :chyba
|
608
612
|
end
|
609
613
|
|
@@ -1290,7 +1294,8 @@ module CzechPostB2bClient
|
|
1290
1294
|
class InfoService29And47 < CzechPostB2bClient::ResponseCodes::BaseCode
|
1291
1295
|
@code = 324
|
1292
1296
|
@text = 'INFO_SERVICE_29+47'
|
1293
|
-
@description = 'Zásilku s výškou nad 150cm nelze podat jako Balík Do ruky se sl.47,
|
1297
|
+
@description = 'Zásilku s výškou nad 150cm nelze podat jako Balík Do ruky se sl.47,' \
|
1298
|
+
' ale musí být využit Balík Nadrozměr v kategorii NZ 2'
|
1294
1299
|
@type = :info
|
1295
1300
|
end
|
1296
1301
|
|
@@ -1756,14 +1761,14 @@ module CzechPostB2bClient
|
|
1756
1761
|
@type = :info
|
1757
1762
|
end
|
1758
1763
|
|
1759
|
-
class InfoMissingPartCityServiceDeliveryOnSundayOrHolidayMayNotBeRealized < CzechPostB2bClient::ResponseCodes::BaseCode
|
1764
|
+
class InfoMissingPartCityServiceDeliveryOnSundayOrHolidayMayNotBeRealized < CzechPostB2bClient::ResponseCodes::BaseCode # rubocop:disable Layout/LineLength
|
1760
1765
|
@code = 391
|
1761
1766
|
@text = 'INFO_MISSING_PART_CITY_SERVICE_DELIVERY_ON_SUNDAY/HOLIDAY_MAY_NOT_BE_REALIZED'
|
1762
|
-
@description = 'Neuvedena část obce -
|
1767
|
+
@description = 'Neuvedena část obce - služba Garantovaný čas dodání v Ne/Sv nemusí být realizována'
|
1763
1768
|
@type = :info
|
1764
1769
|
end
|
1765
1770
|
|
1766
|
-
class
|
1771
|
+
class InfoCancelService9 < CzechPostB2bClient::ResponseCodes::BaseCode
|
1767
1772
|
@code = 392
|
1768
1773
|
@text = 'NFO_CANCEL_SERVICE_9'
|
1769
1774
|
@description = 'Zrušena nepovolená služba 9 Prioritně'
|
@@ -1882,19 +1887,16 @@ module CzechPostB2bClient
|
|
1882
1887
|
@type = :info
|
1883
1888
|
end
|
1884
1889
|
|
1885
|
-
|
1890
|
+
# must be at end to collect all classes defined before
|
1891
|
+
def self.all_classes
|
1886
1892
|
ObjectSpace.each_object(CzechPostB2bClient::ResponseCodes::BaseCode.singleton_class)
|
1887
1893
|
end
|
1888
1894
|
|
1889
|
-
|
1890
|
-
|
1891
|
-
def new_by_code(code)
|
1895
|
+
def self.new_by_code(code)
|
1892
1896
|
klass = all_classes.detect { |k| k.code == code }
|
1893
1897
|
raise "ResponseCode with code: #{code} is unknown!" unless klass
|
1894
1898
|
|
1895
1899
|
klass.new
|
1896
1900
|
end
|
1897
|
-
|
1898
|
-
module_function :new_by_code
|
1899
1901
|
end
|
1900
1902
|
end
|
@@ -24,11 +24,12 @@ module CzechPostB2bClient
|
|
24
24
|
[response_root_node.dig('parcel')].flatten.compact # to always get array of hash(es)
|
25
25
|
end
|
26
26
|
|
27
|
-
def parcel_data_from(rp_hash)
|
27
|
+
def parcel_data_from(rp_hash) # rubocop:disable Metrics/AbcSize
|
28
28
|
{
|
29
29
|
parcel_type: rp_hash['parcelType'].to_s,
|
30
|
-
weight_in_kg: rp_hash['weight'].nil? ? nil : rp_hash['weight'].to_f,
|
31
|
-
cash_on_delivery: { amount: (rp_hash['amount'] || 0).to_f,
|
30
|
+
weight_in_kg: rp_hash['weight'].nil? ? nil : rp_hash['weight'].to_f,
|
31
|
+
cash_on_delivery: { amount: (rp_hash['amount'] || 0).to_f,
|
32
|
+
currency_iso_code: rp_hash['currency'].to_s },
|
32
33
|
pieces: (rp_hash['quantityParcel'] || 1).to_i,
|
33
34
|
deposited_until: rp_hash['depositTo'].nil? ? nil : Date.parse(rp_hash['depositTo']),
|
34
35
|
deposited_for_days: rp_hash['timeDeposit'].nil? ? nil : rp_hash['timeDeposit'].to_i,
|
@@ -5,8 +5,30 @@ module CzechPostB2bClient
|
|
5
5
|
class SendParcelsParser < BaseParser
|
6
6
|
def build_result
|
7
7
|
super
|
8
|
-
|
9
|
-
|
8
|
+
|
9
|
+
@result[:async_result] = {
|
10
|
+
transaction_id: response_header.dig('idTransaction'),
|
11
|
+
processing_end_expected_at: parse_time_with_correction(response_header.dig('timeStampProcessing'))
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse_time_with_correction(b2b_time_str)
|
16
|
+
# b2b time in XML is NOT CORRECT! They return CET time value with UTC timezone
|
17
|
+
# Like `2016-02-25T09:30:03.678Z`, which is actually `2016-02-25T09:30:03.678+0100` (CET)
|
18
|
+
# Or `2016-05-25T09:30:03.678Z`, which is actually `2016-05-25T09:30:03.678+0200` (CET + DST)
|
19
|
+
# But we must be prepare for unnoticed fix by CPost
|
20
|
+
|
21
|
+
# unfortunattely this can be done for only freshly generated XMLs (comparing b2b_time with Time.now.utc)
|
22
|
+
# but we have to kepp it compatible for old XML
|
23
|
+
# so we pass it up and leave comments in documenation
|
24
|
+
# Users of this gem will have to care of it
|
25
|
+
|
26
|
+
Time.parse(b2b_time_str)
|
27
|
+
end
|
28
|
+
|
29
|
+
# just for info
|
30
|
+
def cpost_time_zone
|
31
|
+
timezone('Europe/Prague')
|
10
32
|
end
|
11
33
|
end
|
12
34
|
end
|
@@ -32,14 +32,9 @@ module CzechPostB2bClient
|
|
32
32
|
attr_accessor :request_xml, :response, :endpoint_path
|
33
33
|
|
34
34
|
def call_api
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
begin
|
39
|
-
self.response = https_conn.request(request)
|
40
|
-
rescue *KNOWN_CONNECTION_ERRORS => e
|
41
|
-
handle_connection_error(e)
|
42
|
-
end
|
35
|
+
self.response = https_conn.request(request)
|
36
|
+
rescue *KNOWN_CONNECTION_ERRORS => e
|
37
|
+
handle_connection_error(e)
|
43
38
|
end
|
44
39
|
|
45
40
|
def handle_response
|
@@ -56,6 +51,16 @@ module CzechPostB2bClient
|
|
56
51
|
@https_conn ||= Net::HTTP.start(service_uri.host, service_uri.port, connection_options)
|
57
52
|
end
|
58
53
|
|
54
|
+
def request
|
55
|
+
request = Net::HTTP::Post.new service_uri.request_uri, headers
|
56
|
+
request.body = request_xml
|
57
|
+
|
58
|
+
debug_msg = "CzechPost B2B REQUEST: #{request} to #{service_uri.request_uri} with body:\n#{request.body}"
|
59
|
+
CzechPostB2bClient.logger.debug(debug_msg)
|
60
|
+
|
61
|
+
request
|
62
|
+
end
|
63
|
+
|
59
64
|
def service_uri
|
60
65
|
@service_uri ||= URI.parse(configuration.b2b_api_base_uri + endpoint_path)
|
61
66
|
end
|
@@ -95,7 +100,8 @@ module CzechPostB2bClient
|
|
95
100
|
end
|
96
101
|
|
97
102
|
def b2b_error_text
|
98
|
-
|
103
|
+
err_code_without_namespace_regexp = %r{<(?:\w+\:)?errorCode>(\d+)</(?:\w+\:)?errorCode>}
|
104
|
+
error_match = result.xml.match(err_code_without_namespace_regexp)
|
99
105
|
return 'error code not found in XML' unless error_match
|
100
106
|
|
101
107
|
error_code = error_match[1].to_i
|
@@ -79,7 +79,7 @@ module CzechPostB2bClient
|
|
79
79
|
response_code = response_state[:code]
|
80
80
|
next if response_code == CzechPostB2bClient::ResponseCodes::Ok.code
|
81
81
|
|
82
|
-
errors.add(:parcels, "Parcel[#{parcel_id}] => #{CzechPostB2bClient::ResponseCodes.new_by_code(response_code)}")
|
82
|
+
errors.add(:parcels, "Parcel[#{parcel_id}] => #{CzechPostB2bClient::ResponseCodes.new_by_code(response_code)}") # rubocop:disable Layout/LineLength
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
@@ -63,7 +63,7 @@ module CzechPostB2bClient
|
|
63
63
|
response_code = response_state[:code]
|
64
64
|
next if response_code == CzechPostB2bClient::ResponseCodes::Ok.code
|
65
65
|
|
66
|
-
errors.add(:parcels, "Parcel[#{parcel_id}] => #{CzechPostB2bClient::ResponseCodes.new_by_code(response_code)}")
|
66
|
+
errors.add(:parcels, "Parcel[#{parcel_id}] => #{CzechPostB2bClient::ResponseCodes.new_by_code(response_code)}") # rubocop:disable Layout/LineLength
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openssl'
|
4
|
+
require 'net/http'
|
5
|
+
|
6
|
+
module CzechPostB2bClient
|
7
|
+
module Services
|
8
|
+
class XsdsDownloader < ApiCaller
|
9
|
+
def initialize(_anything); end
|
10
|
+
|
11
|
+
def steps
|
12
|
+
%i[download_xsds]
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :xsd_uri
|
18
|
+
|
19
|
+
def download_xsds
|
20
|
+
xsd_uris = configuration.namespaces.values
|
21
|
+
xsd_uris.each do |uri|
|
22
|
+
# check for `.xsd` at end?
|
23
|
+
@xsd_uri = URI.parse(uri)
|
24
|
+
download
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def download # rubocop:disable Metrics/AbcSize
|
29
|
+
self.response = https_conn.request(request)
|
30
|
+
|
31
|
+
debug_msg = "CzechPost XSD REQUEST: #{request} to #{xsd_uri} with body:\n#{request.body} => #{response.code}"
|
32
|
+
CzechPostB2bClient.logger.debug(debug_msg)
|
33
|
+
|
34
|
+
raise "Error in downloading #{xsd_uri} => #{response}" unless response.code.to_i == 200
|
35
|
+
|
36
|
+
save_response_to_file
|
37
|
+
rescue *KNOWN_CONNECTION_ERRORS => e
|
38
|
+
raise "Error in downloading #{xsd_uri} => #{e.message}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def https_conn
|
42
|
+
Net::HTTP.start(xsd_uri.host, xsd_uri.port, connection_options)
|
43
|
+
end
|
44
|
+
|
45
|
+
def request
|
46
|
+
Net::HTTP::Get.new xsd_uri.request_uri, headers
|
47
|
+
end
|
48
|
+
|
49
|
+
def save_response_to_file
|
50
|
+
filename = xsd_uri.request_uri.split('/').last
|
51
|
+
File.write(filename, response.body)
|
52
|
+
end
|
53
|
+
|
54
|
+
def headers
|
55
|
+
{}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -10,3 +10,4 @@ require 'czech_post_b2b_client/services/address_sheets_generator'
|
|
10
10
|
require 'czech_post_b2b_client/services/parcels_submission_closer'
|
11
11
|
require 'czech_post_b2b_client/services/delivering_inspector'
|
12
12
|
require 'czech_post_b2b_client/services/time_period_statisticator'
|
13
|
+
require 'czech_post_b2b_client/services/xsds_downloader'
|
data/lib/stepped_service/base.rb
CHANGED
@@ -43,7 +43,8 @@
|
|
43
43
|
# def put_tea_bags_into_kettle
|
44
44
|
# self.teabags = get_teabags(tea_type, bags_into_kettle)
|
45
45
|
# if teabags.empty?
|
46
|
-
# errors.add(:teabags, "There is no #{bags_into_kettle} #{tea_type} tea teabags in storage,
|
46
|
+
# errors.add(:teabags, "There is no #{bags_into_kettle} #{tea_type} tea teabags in storage," \
|
47
|
+
# " using fruit tea teabags.")
|
47
48
|
# self.teabags = get_teabags(:fruit, bags_into_kettle)
|
48
49
|
# if teabags.empty?
|
49
50
|
# errors.add(:teabags, "There is no #{bags_into_kettle} fruit tea teabags in storage either!")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: czech_post_b2b_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Petr Mlčoch
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ox
|
@@ -536,6 +536,7 @@ files:
|
|
536
536
|
- lib/czech_post_b2b_client/services/parcels_sender.rb
|
537
537
|
- lib/czech_post_b2b_client/services/parcels_submission_closer.rb
|
538
538
|
- lib/czech_post_b2b_client/services/time_period_statisticator.rb
|
539
|
+
- lib/czech_post_b2b_client/services/xsds_downloader.rb
|
539
540
|
- lib/czech_post_b2b_client/version.rb
|
540
541
|
- lib/stepped_service.rb
|
541
542
|
- lib/stepped_service/base.rb
|