czech_post_b2b_client 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|