czech_post_b2b_client 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +1,14 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # Available printing templates, which can be used in AdressSheetsGenerator `options[:template_id]`
3
4
  #
4
- # Do not miss `CzechPostB2bClient::PrintingTemplate.all_template_classes` method,
5
+ # Do not miss `CzechPostB2bClient::PrintingTemplates.all_classes` method,
5
6
  # it has to be at end of module to work properly
6
7
  module CzechPostB2bClient
7
8
  module PrintingTemplates
8
9
  class Base
9
10
  class << self
10
- attr_reader :id
11
- end
12
-
13
- class << self
14
- attr_reader :description
11
+ attr_reader :id, :description
15
12
  end
16
13
  end
17
14
 
@@ -158,9 +155,9 @@ module CzechPostB2bClient
158
155
  end
159
156
 
160
157
  # has to be at the end, to load all subcasses before
161
- def all_template_classes
158
+ def all_classes
162
159
  ObjectSpace.each_object(CzechPostB2bClient::PrintingTemplates::Base.singleton_class)
163
160
  end
164
- module_function :all_template_classes
161
+ module_function :all_classes
165
162
  end
166
163
  end
@@ -12,7 +12,7 @@ module CzechPostB2bClient
12
12
  end
13
13
 
14
14
  def self.allowed_printing_template_classes
15
- @allowed_printing_template_classes ||= CzechPostB2bClient::PrintingTemplates.all_template_classes
15
+ @allowed_printing_template_classes ||= CzechPostB2bClient::PrintingTemplates.all_classes
16
16
  end
17
17
 
18
18
  private
@@ -34,7 +34,7 @@ module CzechPostB2bClient
34
34
  [:sending_post_office_code]].each do |key_chain|
35
35
  value = common_data.dig(*key_chain)
36
36
  if value.nil? || value == ''
37
- errors.add(:common_data, "Missing value for key { :#{key_chain.join(' => :') } }!")
37
+ errors.add(:common_data, "Missing value for key { :#{key_chain.join(' => :')} }!")
38
38
  end
39
39
  end
40
40
  end
@@ -260,7 +260,7 @@ module CzechPostB2bClient
260
260
  'ns2:city' => address_data[:city], # Nepovinne: Obec
261
261
  'ns2:zipCode' => address_data[:post_code], # Nepovinne: PSC
262
262
  'ns2:isoCountry' => address_data[:country_iso_code], # Nepovinne, default 'CZ': ISO kod zeme
263
- 'ns2:subIsoCountry' => address_data[:subcountry_iso_code], # Nepovinne: ISO kod uzemi
263
+ 'ns2:subIsoCountry' => address_data[:subcountry_iso_code] # Nepovinne: ISO kod uzemi
264
264
  }
265
265
  end
266
266
 
@@ -1,25 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Codes, which can be returned in response nodes `doParcelStateResponse`
2
4
  #
3
- # Do not miss `CzechPostB2bClient::ResponseCodes.all_code_classes` and `CzechPostB2bClient::ResponseCodes.new_by_code`,
5
+ # Do not miss `CzechPostB2bClient::ResponseCodes.all_classes` and `CzechPostB2bClient::ResponseCodes.new_by_code`,
4
6
  # they have to be at end of module to work properly
5
7
  module CzechPostB2bClient
6
8
  module ResponseCodes
7
9
  class BaseCode
8
- @code = 'undefined'
9
- @text = '_NONE_'
10
- @decription = 'Unspecified B2B response code, is it listed in /doc/.../ResponseCodes.ods'
10
+ @code = 'undefined'
11
+ @text = '_NONE_'
12
+ @decription = 'Unspecified B2B response code, is it listed in /doc/.../ResponseCodes.ods'
11
13
 
12
- def self.code
13
- @code
14
- end
14
+ class << self
15
+ attr_reader :code
16
+ end
15
17
 
16
- def self.text
17
- @text
18
- end
18
+ class << self
19
+ attr_reader :text
20
+ end
19
21
 
20
- def self.description
21
- @description
22
- end
22
+ class << self
23
+ attr_reader :description
24
+ end
23
25
 
24
26
  def self.error?
25
27
  @type == :error
@@ -29,9 +31,9 @@ module CzechPostB2bClient
29
31
  @type == :info
30
32
  end
31
33
 
32
- def self.type
33
- @type
34
- end
34
+ class << self
35
+ attr_reader :type
36
+ end
35
37
 
36
38
  def self.to_s
37
39
  "ResponseCode[#{code} #{text}] #{description}"
@@ -1061,7 +1063,6 @@ module CzechPostB2bClient
1061
1063
  @type = :chyba
1062
1064
  end
1063
1065
 
1064
-
1065
1066
  class AddressSuitableForLocalDelivery < CzechPostB2bClient::ResponseCodes::BaseCode
1066
1067
  @code = 257
1067
1068
  @text = 'INVALID_ADRESS' # no kidding! Like 6 times same text?
@@ -1881,14 +1882,14 @@ module CzechPostB2bClient
1881
1882
  @type = :info
1882
1883
  end
1883
1884
 
1884
- def all_code_classes
1885
+ def all_classes
1885
1886
  ObjectSpace.each_object(CzechPostB2bClient::ResponseCodes::BaseCode.singleton_class)
1886
1887
  end
1887
1888
 
1888
- module_function :all_code_classes
1889
+ module_function :all_classes
1889
1890
 
1890
1891
  def new_by_code(code)
1891
- klass = all_code_classes.detect { |k| k.code == code }
1892
+ klass = all_classes.detect { |k| k.code == code }
1892
1893
  raise "ResponseCode with code: #{code} is unknown!" unless klass
1893
1894
 
1894
1895
  klass.new
@@ -1897,4 +1898,3 @@ module CzechPostB2bClient
1897
1898
  module_function :new_by_code
1898
1899
  end
1899
1900
  end
1900
-
@@ -22,14 +22,14 @@ module CzechPostB2bClient
22
22
  strip_namespace: true,
23
23
  symbolize_keys: false,
24
24
  mode: :hash_no_attrs)
25
- rescue Ox::ParseError => error
26
- handle_parsing_error(error)
25
+ rescue Ox::ParseError => e
26
+ handle_parsing_error(e)
27
27
  end
28
28
 
29
29
  def safely_build_result
30
30
  build_result
31
- rescue NoMethodError => error # NoMethodError: undefined method `dig' for nil:NilClass
32
- handle_result_building_error(error)
31
+ rescue NoMethodError => e # NoMethodError: undefined method `dig' for nil:NilClass
32
+ handle_result_building_error(e)
33
33
  end
34
34
 
35
35
  def build_result
@@ -50,7 +50,9 @@ module CzechPostB2bClient
50
50
  end
51
51
 
52
52
  def response_root_node
53
- return response_service_data.dig(response_root_node_name) if response_service_data.keys.include?(response_root_node_name)
53
+ if response_service_data.keys.include?(response_root_node_name)
54
+ return response_service_data.dig(response_root_node_name)
55
+ end
54
56
 
55
57
  errors.add(:xml, "Cannot find `#{response_root_node_name}` in `serviceData` node.")
56
58
  fail_on_structure_parsing
@@ -71,7 +73,7 @@ module CzechPostB2bClient
71
73
  state_hash = hash || { 'responseCode' => '999', 'responseText' => 'Unknown' }
72
74
  state_hash = state_hash.first if state_hash.is_a?(Array) # more <doParcelStateResponse> elements
73
75
 
74
- { code: state_hash['responseCode'].to_i, text: state_hash['responseText'].to_s}
76
+ { code: state_hash['responseCode'].to_i, text: state_hash['responseText'].to_s }
75
77
  end
76
78
 
77
79
  def handle_parsing_error(error)
@@ -27,7 +27,7 @@ module CzechPostB2bClient
27
27
  def parcel_data_from(rp_hash)
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, # hopefully it is in KG
30
+ weight_in_kg: rp_hash['weight'].nil? ? nil : rp_hash['weight'].to_f, # hopefully it is in KG
31
31
  cash_on_delivery: { amount: (rp_hash['amount'] || 0).to_f, currency_iso_code: rp_hash['currency'].to_s },
32
32
  pieces: (rp_hash['quantityParcel'] || 1).to_i,
33
33
  deposited_until: rp_hash['depositTo'].nil? ? nil : Date.parse(rp_hash['depositTo']),
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require "base64"
2
+
3
+ require 'base64'
3
4
 
4
5
  module CzechPostB2bClient
5
6
  module ResponseParsers
@@ -38,7 +38,7 @@ module CzechPostB2bClient
38
38
  end
39
39
 
40
40
  def updated_result_value_for(value, parcel_params_result_hash)
41
- pd_hash=parcel_data_from(parcel_params_result_hash)
41
+ pd_hash = parcel_data_from(parcel_params_result_hash)
42
42
 
43
43
  return pd_hash if value.nil?
44
44
 
@@ -47,7 +47,9 @@ module CzechPostB2bClient
47
47
  new_p_code = pd_hash[:parcel_code]
48
48
 
49
49
  value[:states] = (value[:states] + pd_hash[:states]).sort { |a, b| a[:code] <=> b[:code] }
50
- raise "Two different parcel_codes [#{old_p_code}, #{new_p_code}] for parcel_id:'#{parcel_id}'" if old_p_code != new_p_code
50
+ if old_p_code != new_p_code
51
+ raise "Two different parcel_codes [#{old_p_code}, #{new_p_code}] for parcel_id:'#{parcel_id}'"
52
+ end
51
53
 
52
54
  value
53
55
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'czech_post_b2b_client/services/orchestrator'
3
4
  require 'czech_post_b2b_client/services/communicator'
4
5
  require 'czech_post_b2b_client/services/api_caller'
5
6
  require 'czech_post_b2b_client/services/parcels_sender'
7
+ require 'czech_post_b2b_client/services/parcels_immediate_sender'
6
8
  require 'czech_post_b2b_client/services/parcels_send_process_updater'
7
9
  require 'czech_post_b2b_client/services/address_sheets_generator'
8
10
  require 'czech_post_b2b_client/services/parcels_submission_closer'
@@ -36,10 +36,10 @@ module CzechPostB2bClient
36
36
  result_hash = {}
37
37
  response_hash[:parcels].each_pair do |parcel_code, delivering_hash|
38
38
  result_hash[parcel_code] = {
39
- deposited_until: delivering_hash[:deposited_until],
40
- deposited_for_days: delivering_hash[:deposited_for_days],
41
- current_state: delivering_hash[:states].last,
42
- all_states: delivering_hash[:states]
39
+ deposited_until: delivering_hash[:deposited_until],
40
+ deposited_for_days: delivering_hash[:deposited_for_days],
41
+ current_state: delivering_hash[:states].last,
42
+ all_states: delivering_hash[:states]
43
43
  }
44
44
  end
45
45
  puts("RESULT_HASH: #{result_hash}")
@@ -3,7 +3,6 @@
3
3
  module CzechPostB2bClient
4
4
  module Services
5
5
  class Orchestrator < SteppedService::Base
6
-
7
6
  private
8
7
 
9
8
  def result_of_subservice(service_hash)
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CzechPostB2bClient
4
+ module Services
5
+ # Combination of ParcelsSender + ParcelsSendProcessUpdater for fast SYNC registering parcel at CPOST
6
+ # It accept all parcels or none!
7
+ # It should be used for instant one parcel registration.
8
+ class ParcelsImmediateSender < CzechPostB2bClient::Services::Communicator
9
+ attr_reader :sending_data, :parcels
10
+
11
+ def initialize(sending_data:, parcels:)
12
+ @sending_data = sending_data
13
+ @parcels = parcels
14
+ end
15
+
16
+ def steps
17
+ super + %i[check_for_state_errors]
18
+ end
19
+
20
+ private
21
+
22
+ def request_builder_args
23
+ { common_data: common_data, parcels: parcels }
24
+ end
25
+
26
+ def request_builder_class
27
+ CzechPostB2bClient::RequestBuilders::SendParcelsBuilder
28
+ end
29
+
30
+ def api_caller_class
31
+ CzechPostB2bClient::Services::ApiCaller
32
+ end
33
+
34
+ def response_parser_class
35
+ CzechPostB2bClient::ResponseParsers::GetResultParcelsParser
36
+ end
37
+
38
+ def common_data
39
+ data_from_config.merge(sending_data)
40
+ end
41
+
42
+ def data_from_config
43
+ {
44
+ contract_id: configuration.contract_id,
45
+ customer_id: configuration.customer_id,
46
+ sending_post_office_code: configuration.sending_post_office_code
47
+ }
48
+ end
49
+
50
+ def endpoint_path
51
+ '/sendParcelsSync'
52
+ end
53
+
54
+ def build_result_from(response_hash)
55
+ OpenStruct.new(parcels_hash: response_hash[:parcels],
56
+ state_text: response_hash.dig(:response, :state, :text),
57
+ state_code: response_hash.dig(:response, :state, :code))
58
+ end
59
+
60
+ def check_for_state_errors
61
+ return if result.state_code == CzechPostB2bClient::ResponseCodes::Ok.code
62
+
63
+ r_code = CzechPostB2bClient::ResponseCodes.new_by_code(result.state_code)
64
+ errors.add(:response_state, r_code.to_s)
65
+
66
+ collect_parcel_errors
67
+
68
+ fail! unless r_code.info?
69
+ end
70
+
71
+ def collect_parcel_errors
72
+ result.parcels_hash.each_pair do |parcel_id, parcel_hash|
73
+ add_errors_for_failed_states(parcel_id, parcel_hash[:states])
74
+ end
75
+ end
76
+
77
+ def add_errors_for_failed_states(parcel_id, response_states)
78
+ response_states.each do |response_state|
79
+ response_code = response_state[:code]
80
+ next if response_code == CzechPostB2bClient::ResponseCodes::Ok.code
81
+
82
+ errors.add(:parcels, "Parcel[#{parcel_id}] => #{CzechPostB2bClient::ResponseCodes.new_by_code(response_code)}")
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -61,7 +61,7 @@ module CzechPostB2bClient
61
61
  def add_errors_for_failed_states(parcel_id, response_states)
62
62
  response_states.each do |response_state|
63
63
  response_code = response_state[:code]
64
- next if response_code == CzechPostB2bClient::ResponseCodes::Ok.code
64
+ next if response_code == CzechPostB2bClient::ResponseCodes::Ok.code
65
65
 
66
66
  errors.add(:parcels, "Parcel[#{parcel_id}] => #{CzechPostB2bClient::ResponseCodes.new_by_code(response_code)}")
67
67
  end
@@ -6,7 +6,7 @@ module CzechPostB2bClient
6
6
  attr_reader :from_date, :to_date
7
7
 
8
8
  def initialize(from_date:, to_date:)
9
- @from_date =from_date
9
+ @from_date = from_date
10
10
  @to_date = to_date
11
11
  end
12
12
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CzechPostB2bClient
4
- VERSION = '1.0.0'
4
+ VERSION = '1.0.2'
5
5
  end
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.0
4
+ version: 1.0.2
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-03-21 00:00:00.000000000 Z
11
+ date: 2020-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ox
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -508,6 +508,7 @@ files:
508
508
  - lib/czech_post_b2b_client.rb
509
509
  - lib/czech_post_b2b_client/b2b_errors.rb
510
510
  - lib/czech_post_b2b_client/configuration.rb
511
+ - lib/czech_post_b2b_client/post_services.rb
511
512
  - lib/czech_post_b2b_client/printing_templates.rb
512
513
  - lib/czech_post_b2b_client/request_builders.rb
513
514
  - lib/czech_post_b2b_client/request_builders/base_builder.rb
@@ -530,6 +531,7 @@ files:
530
531
  - lib/czech_post_b2b_client/services/communicator.rb
531
532
  - lib/czech_post_b2b_client/services/delivering_inspector.rb
532
533
  - lib/czech_post_b2b_client/services/orchestrator.rb
534
+ - lib/czech_post_b2b_client/services/parcels_immediate_sender.rb
533
535
  - lib/czech_post_b2b_client/services/parcels_send_process_updater.rb
534
536
  - lib/czech_post_b2b_client/services/parcels_sender.rb
535
537
  - lib/czech_post_b2b_client/services/parcels_submission_closer.rb