deliveries 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2102df4101cad8142a4673ee79f2d18994309db3e7a5d70ea03281abb4d9c5c5
4
- data.tar.gz: 7ffe9bf7dd2546132118c6e1d028cc36f216eb7e2eaad34b6543f76d4090452a
3
+ metadata.gz: bb252635f57203e34b0d593df80f4fc0aa033ebfb70675f646cf192fc946a647
4
+ data.tar.gz: 6e232ea5c543aaeaf298e618f2f97b7192b04b6de72f45de3204b1f2f4ab1d3f
5
5
  SHA512:
6
- metadata.gz: 44eee42b323ffea42bbdb8d963a69084d5f9196b0b92fa3078954411bbf1e6d22a5e5229564edf53deefebc21cd6ab6e1a05cade53e80c83b214f1b7d4eb7e48
7
- data.tar.gz: 7c07fb3e9f88692391d806b18960720f22cf1339574f335c10bce33cef2f14a123ea1ca5fe8cc116d2f5c5ffbee953861851cfacc85dd2a538353af93dad52f9
6
+ metadata.gz: 75e7cd7e1b1380f0b889d91515e7f356f5847b24106e98487c4b2cc1b1a907da87dfee8c184f29d7c6ffb6c9d89398b06d3ab30a67ee8535330a2263ff989a58
7
+ data.tar.gz: f09ac1de09045873b6a8e0f91d31e011f7b7a232c4924d6b391f9b87b99d40dc62d1d0923b00c8fd96138df8dccda169f80669f259664d974dca47a8952dbb77
@@ -1,19 +1,26 @@
1
1
  name: Ruby
2
2
 
3
- on: [push,pull_request]
3
+ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  build:
7
7
  runs-on: ubuntu-latest
8
+
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby: [2.6, 2.7, '3.0']
13
+
8
14
  steps:
9
15
  - uses: actions/checkout@v2
10
- - name: Set up Ruby
16
+ - name: Install poppler-utils
17
+ run: sudo apt-get install poppler-utils
18
+ - name: Set up Ruby ${{ matrix.ruby }}
11
19
  uses: ruby/setup-ruby@v1
12
20
  with:
13
- ruby-version: 2.6.7
21
+ ruby-version: ${{ matrix.ruby }}
14
22
  - name: Run the default task
15
23
  run: |
16
- sudo apt-get install poppler-utils
17
24
  gem install bundler -v 2.2.4
18
25
  bundle install
19
26
  bundle exec rake
data/CHANGELOG.md CHANGED
@@ -6,8 +6,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.0] - 2021-11-26
10
+ ### Added
11
+ - Envialia courier integration
12
+
13
+ ## [0.2.1] - 2021-11-04
14
+ ### Fixed
15
+ - Field `clienteRecogida` must have the same value as `codDest` in Correos Express pickup.
16
+
17
+ ## [0.2.0] - 2021-11-03
18
+ ### Added
19
+ - `Address` can now include a custom id for couriers that support it (currently only Correos Express).
20
+
21
+ ## [0.1.1] - 2021-10-11
22
+ ### Fixed
23
+ - Fix keyword parameter passing to make it compatible with Ruby 3.0.
24
+
9
25
  ## [0.1.0] - 2021-09-27
10
26
  🎉 First release!
11
27
 
12
- [Unreleased]: https://github.com/ecommerce-ventures/deliveries/compare/v0.1.0...HEAD
13
- [0.1.0]: https://github.com/ecommerce-ventures/deliveries/releases/tag/v0.1.0
28
+ [Unreleased]: https://github.com/ecommerce-ventures/deliveries/compare/v0.3.0...HEAD
29
+ [0.3.0]: https://github.com/ecommerce-ventures/deliveries/compare/v0.2.1...v0.3.0
30
+ [0.2.1]: https://github.com/ecommerce-ventures/deliveries/compare/v0.2.0...v0.2.1
31
+ [0.2.0]: https://github.com/ecommerce-ventures/deliveries/compare/v0.1.1...v0.2.0
32
+ [0.1.1]: https://github.com/ecommerce-ventures/deliveries/compare/v0.1.0...v0.1.1
33
+ [0.1.0]: https://github.com/ecommerce-ventures/deliveries/releases/tag/v0.1.0
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- deliveries (0.1.0)
4
+ deliveries (0.3.0)
5
5
  activesupport (>= 5.2.0)
6
6
  hexapdf
7
7
  httparty
@@ -12,7 +12,7 @@ PATH
12
12
  GEM
13
13
  remote: https://rubygems.org/
14
14
  specs:
15
- activesupport (6.1.4)
15
+ activesupport (6.1.4.1)
16
16
  concurrent-ruby (~> 1.0, >= 1.0.2)
17
17
  i18n (>= 1.6, < 2)
18
18
  minitest (>= 5.1)
@@ -35,49 +35,49 @@ GEM
35
35
  gyoku (1.3.1)
36
36
  builder (>= 2.1.2)
37
37
  hashdiff (1.0.1)
38
- hexapdf (0.15.8)
38
+ hexapdf (0.19.0)
39
39
  cmdparse (~> 3.0, >= 3.0.3)
40
40
  geom2d (~> 0.3)
41
- httparty (0.18.1)
41
+ httparty (0.20.0)
42
42
  mime-types (~> 3.0)
43
43
  multi_xml (>= 0.5.2)
44
- httpi (2.4.5)
44
+ httpi (2.5.0)
45
45
  rack
46
46
  socksify
47
- i18n (1.8.10)
47
+ i18n (1.8.11)
48
48
  concurrent-ruby (~> 1.0)
49
- mime-types (3.3.1)
49
+ mime-types (3.4.1)
50
50
  mime-types-data (~> 3.2015)
51
- mime-types-data (3.2021.0704)
51
+ mime-types-data (3.2021.1115)
52
52
  mini_magick (4.11.0)
53
53
  minitest (5.14.4)
54
54
  multi_xml (0.6.0)
55
- nokogiri (1.12.3-x86_64-linux)
55
+ nokogiri (1.12.5-x86_64-linux)
56
56
  racc (~> 1.4)
57
57
  nori (2.6.0)
58
- parallel (1.20.1)
58
+ parallel (1.21.0)
59
59
  parser (3.0.2.0)
60
60
  ast (~> 2.4.1)
61
61
  public_suffix (4.0.6)
62
- racc (1.5.2)
62
+ racc (1.6.0)
63
63
  rack (2.2.3)
64
64
  rainbow (3.0.0)
65
65
  rake (13.0.6)
66
66
  regexp_parser (2.1.1)
67
67
  rexml (3.2.5)
68
- rspec (3.9.0)
69
- rspec-core (~> 3.9.0)
70
- rspec-expectations (~> 3.9.0)
71
- rspec-mocks (~> 3.9.0)
72
- rspec-core (3.9.3)
73
- rspec-support (~> 3.9.3)
74
- rspec-expectations (3.9.4)
68
+ rspec (3.10.0)
69
+ rspec-core (~> 3.10.0)
70
+ rspec-expectations (~> 3.10.0)
71
+ rspec-mocks (~> 3.10.0)
72
+ rspec-core (3.10.1)
73
+ rspec-support (~> 3.10.0)
74
+ rspec-expectations (3.10.1)
75
75
  diff-lcs (>= 1.2.0, < 2.0)
76
- rspec-support (~> 3.9.0)
77
- rspec-mocks (3.9.1)
76
+ rspec-support (~> 3.10.0)
77
+ rspec-mocks (3.10.2)
78
78
  diff-lcs (>= 1.2.0, < 2.0)
79
- rspec-support (~> 3.9.0)
80
- rspec-support (3.9.4)
79
+ rspec-support (~> 3.10.0)
80
+ rspec-support (3.10.3)
81
81
  rubocop (0.93.1)
82
82
  parallel (~> 1.10)
83
83
  parser (>= 2.7.1.5)
@@ -87,7 +87,7 @@ GEM
87
87
  rubocop-ast (>= 0.6.0)
88
88
  ruby-progressbar (~> 1.7)
89
89
  unicode-display_width (>= 1.4.0, < 2.0)
90
- rubocop-ast (1.10.0)
90
+ rubocop-ast (1.12.0)
91
91
  parser (>= 3.0.1.1)
92
92
  ruby-progressbar (1.11.0)
93
93
  savon (2.12.1)
@@ -101,7 +101,7 @@ GEM
101
101
  socksify (1.7.1)
102
102
  tzinfo (2.0.4)
103
103
  concurrent-ruby (~> 1.0)
104
- unicode-display_width (1.7.0)
104
+ unicode-display_width (1.8.0)
105
105
  wasabi (3.6.1)
106
106
  addressable
107
107
  httpi (~> 2.0)
@@ -110,7 +110,7 @@ GEM
110
110
  addressable (>= 2.8.0)
111
111
  crack (>= 0.3.2)
112
112
  hashdiff (>= 0.4.0, < 2.0.0)
113
- zeitwerk (2.4.2)
113
+ zeitwerk (2.5.1)
114
114
 
115
115
  PLATFORMS
116
116
  x86_64-linux
data/README.md CHANGED
@@ -6,7 +6,7 @@ Deliveries is a gem that gives you the ability to integrate multiple shipping se
6
6
 
7
7
  Add the following line to your Gemfile
8
8
 
9
- ```bash
9
+ ```ruby
10
10
  gem 'deliveries'
11
11
  ```
12
12
  Then run:
@@ -20,7 +20,7 @@ bundle install
20
20
  Each courier requires a different configuration, below we will leave some examples
21
21
 
22
22
  #### 1. Mondial Relay
23
- ```bash
23
+ ```ruby
24
24
  Deliveries.courier(:mondial_relay).configure do |config|
25
25
  config.mondial_relay_merchant = '...'
26
26
  config.mondial_relay_key = '...'
@@ -28,7 +28,7 @@ end
28
28
  ```
29
29
 
30
30
  #### 2. Mondial Relay Dual
31
- ```bash
31
+ ```ruby
32
32
  Deliveries.courier(:mondial_relay_dual).configure do |config|
33
33
  config.dual_carrier_login = '...'
34
34
  config.dual_carrier_password = '...'
@@ -48,7 +48,7 @@ end
48
48
  ```
49
49
 
50
50
  #### 3. Correos Express
51
- ```bash
51
+ ```ruby
52
52
  Deliveries.courier(:correos_express).configure do |config|
53
53
  config.username = '...'
54
54
  config.password = '...'
@@ -67,7 +67,7 @@ end
67
67
  ```
68
68
 
69
69
  #### 4. Spring
70
- ```bash
70
+ ```ruby
71
71
  Deliveries.courier(:spring).configure do |config|
72
72
  config.api_key = '...'
73
73
  config.countries = {
@@ -89,7 +89,7 @@ end
89
89
  ```
90
90
 
91
91
  #### 5. UPS
92
- ```bash
92
+ ```ruby
93
93
  Deliveries.courier(:ups).configure do |config|
94
94
  config.license_number = '...'
95
95
  config.username = '...'
@@ -103,25 +103,36 @@ Deliveries.courier(:ups).configure do |config|
103
103
  end
104
104
  ```
105
105
 
106
+ #### Time Zone
107
+
108
+ This library uses Active Support's Time extension, so a time zone must be set before using it:
109
+
110
+ ```ruby
111
+ require 'active_support/time'
112
+
113
+ # Configure time zone
114
+ Time.zone = 'Madrid'
115
+ ```
116
+
106
117
  ## Usage
107
118
 
108
119
  #### Get collection point by country and postcode
109
120
 
110
- ```bash
121
+ ```ruby
111
122
  # Example Using Ups
112
123
 
113
124
  Deliveries.courier(:ups).get_collection_points(postcode: '...', country: 'it')
114
125
  ```
115
126
  #### Get collection point info
116
127
 
117
- ```bash
128
+ ```ruby
118
129
  # Example Using Mondial Relay
119
130
 
120
131
  Deliveries.courier(:mondial_relay).get_collection_point(global_point_id: 'mondial_relay~fr~00000~XXXXXX')
121
132
  ```
122
133
 
123
134
  #### Create a Shipment
124
- ```bash
135
+ ```ruby
125
136
  # Example Using Correos Express
126
137
 
127
138
  sender = Deliveries::Address.new(
@@ -158,7 +169,7 @@ response = Deliveries.courier(:correos_express).create_shipment(
158
169
  ```
159
170
 
160
171
  #### Create a Pickup
161
- ```bash
172
+ ```ruby
162
173
  # Example Using Spring
163
174
 
164
175
  sender = Deliveries::Address.new(
@@ -193,7 +204,7 @@ response = Deliveries.courier(:spring).create_pickup(
193
204
  ```
194
205
 
195
206
  #### Download a Label
196
- ```bash
207
+ ```ruby
197
208
  # Example Using Spring
198
209
 
199
210
  label = Deliveries.courier(:spring).get_label(tracking_code: '...')
data/deliveries.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
15
15
 
16
16
  spec.metadata['homepage_uri'] = spec.homepage
17
17
  spec.metadata['source_code_uri'] = 'https://github.com/ecommerce-ventures/deliveries'
18
- spec.metadata['changelog_uri'] = 'https://github.com/ecommerce-ventures/deliveries/CHANGELOG.md'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/ecommerce-ventures/deliveries/blob/master/CHANGELOG.md'
19
19
 
20
20
  # Specify which files should be added to the gem when it is released.
21
21
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -1,6 +1,6 @@
1
1
  module Deliveries
2
2
  class Address
3
- attr_accessor :name, :email, :phone, :country, :state, :city, :street, :postcode
3
+ attr_accessor :name, :email, :phone, :country, :state, :city, :street, :postcode, :address_id
4
4
 
5
5
  COUNTRY_PHONE_PREFIXES = {
6
6
  be: 32,
@@ -30,6 +30,7 @@ module Deliveries
30
30
  self.city = attributes[:city]
31
31
  self.street = attributes[:street]
32
32
  self.postcode = attributes[:postcode]
33
+ self.address_id = attributes[:address_id]
33
34
  end
34
35
 
35
36
  def courierize(courier_id)
@@ -24,8 +24,8 @@ module Deliveries
24
24
  solicitante: CorreosExpress.config(:client_code),
25
25
  refRecogida: reference_code,
26
26
  fechaRecogida: pickup_date&.strftime('%d%m%Y') || '',
27
- clienteRecogida: CorreosExpress.config(:pickup_receiver_code),
28
- codRemit: '',
27
+ clienteRecogida: receiver.address_id || CorreosExpress.config(:pickup_receiver_code),
28
+ codRemit: sender.address_id || '',
29
29
  nomRemit: sender.name,
30
30
  nifRemit: '',
31
31
  dirRecog: sender.street,
@@ -34,7 +34,7 @@ module Deliveries
34
34
  contRecog: sender.name,
35
35
  tlfnoRecog: sender.phone,
36
36
  emailRecog: sender.email,
37
- codDest: CorreosExpress.config(:pickup_receiver_code),
37
+ codDest: receiver.address_id || CorreosExpress.config(:pickup_receiver_code),
38
38
  nomDest: receiver.name,
39
39
  dirDest: receiver.street,
40
40
  pobDest: receiver.city,
@@ -23,7 +23,7 @@ module Deliveries
23
23
  def execute
24
24
  params = {
25
25
  solicitante: CorreosExpress.config(:client_code),
26
- codRte: CorreosExpress.config(:shipment_sender_code),
26
+ codRte: sender.address_id || CorreosExpress.config(:shipment_sender_code),
27
27
  ref: reference_code,
28
28
  fecha: format_date(shipment_date),
29
29
  nomRte: sender.name,
@@ -33,6 +33,7 @@ module Deliveries
33
33
  contacRte: sender.name,
34
34
  telefRte: sender.phone,
35
35
  emailRte: sender.email,
36
+ codDest: receiver.address_id || '',
36
37
  nomDest: receiver.name,
37
38
  dirDest: receiver.street,
38
39
  pobDest: receiver.city,
@@ -51,7 +51,7 @@ module Deliveries
51
51
  points = CollectionPoints::Search.new(postcode: postcode).execute
52
52
  points.each do |point|
53
53
  collection_point_params = CollectionPoints::Search::FormatResponse.new(response: point).execute
54
- collection_points << Deliveries::CollectionPoint.new(collection_point_params)
54
+ collection_points << Deliveries::CollectionPoint.new(**collection_point_params)
55
55
  end
56
56
 
57
57
  collection_points
@@ -79,7 +79,7 @@ module Deliveries
79
79
  ).execute
80
80
 
81
81
  tracking_info_params = Shipments::Trace::FormatResponse.new(response: response).execute
82
- Deliveries::TrackingInfo.new(tracking_info_params)
82
+ Deliveries::TrackingInfo.new(**tracking_info_params)
83
83
  end
84
84
 
85
85
  def pickup_info(tracking_code:, **)
@@ -89,7 +89,7 @@ module Deliveries
89
89
 
90
90
  tracking_info_params = Pickups::Trace::FormatResponse.new(response: response).execute
91
91
 
92
- Deliveries::TrackingInfo.new(tracking_info_params)
92
+ Deliveries::TrackingInfo.new(**tracking_info_params)
93
93
  end
94
94
 
95
95
  def get_label(tracking_code:, **)
@@ -0,0 +1,50 @@
1
+ require 'httparty'
2
+
3
+ module Deliveries
4
+ module Couriers
5
+ module Envialia
6
+ module Authentication
7
+ include HTTParty
8
+
9
+ def session_id
10
+ response = HTTParty.post(
11
+ login_endpoint,
12
+ body: login_body,
13
+ headers: login_headers,
14
+ debug_output: Deliveries.debug ? Deliveries.logger : nil
15
+ )
16
+
17
+ raise Deliveries::ClientError unless response.success?
18
+
19
+ response.dig('Envelope', 'Header', 'ROClientIDHeader', 'ID')
20
+ end
21
+
22
+ def login_body
23
+ <<~XML
24
+ <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
25
+ <soapenv:Body>
26
+ <tns:LoginWSService___LoginCli2 xmlns:tns="http://tempuri.org/">
27
+ <strCodAge>#{Deliveries.courier(:envialia).config(:agency_code)}</strCodAge>
28
+ <strCliente>#{Deliveries.courier(:envialia).config(:username)}</strCliente>
29
+ <strPass>#{Deliveries.courier(:envialia).config(:password)}</strPass>
30
+ </tns:LoginWSService___LoginCli2>
31
+ </soapenv:Body>
32
+ </soapenv:Envelope>
33
+ XML
34
+ end
35
+
36
+ def login_headers
37
+ { 'Content-Type' => 'application/json;charset=UTF-8', 'Accept' => 'application/json' }
38
+ end
39
+
40
+ def login_endpoint
41
+ if Envialia.live?
42
+ Envialia::ENVIALIA_LOGIN_ENDPOINT_LIVE
43
+ else
44
+ Envialia::ENVIALIA_LOGIN_ENDPOINT_TEST
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,88 @@
1
+ require 'httparty'
2
+
3
+ module Deliveries
4
+ module Couriers
5
+ module Envialia
6
+ module Labels
7
+ class Generate
8
+ include HTTParty
9
+ include Authentication
10
+
11
+ attr_accessor :tracking_codes
12
+
13
+ def initialize(tracking_codes:)
14
+ self.tracking_codes = tracking_codes.respond_to?(:each) ? tracking_codes : [tracking_codes]
15
+ end
16
+
17
+ def execute
18
+ decoded_labels = []
19
+
20
+ tracking_codes.each do |tracking_code|
21
+ response = self.class.post(
22
+ api_endpoint,
23
+ body: body(tracking_code),
24
+ headers: headers,
25
+ debug_output: Deliveries.debug ? Deliveries.logger : nil
26
+ )
27
+
28
+ raise Deliveries::ClientError unless response.success?
29
+
30
+ labels = response.dig('Envelope', 'Body', 'WebServService___ConsEtiquetaEnvio6Response', 'strEtiquetas')
31
+
32
+ if labels.blank?
33
+ raise Deliveries::APIError.new(
34
+ 'No hay etiqutas disponibles',
35
+ 404
36
+ )
37
+ else
38
+ decoded_labels << Base64.decode64(labels).force_encoding('binary')
39
+ end
40
+ end
41
+
42
+ decoded_labels
43
+ end
44
+
45
+ private
46
+
47
+ def body(tracking_code)
48
+ <<~XML
49
+ <?xml version="1.0" encoding="utf-8"?>
50
+ <soap:Envelope
51
+ xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
52
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
53
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
54
+ <soap:Header>
55
+ <ROClientIDHeader xmlns="http://tempuri.org/">
56
+ <ID>#{session_id}</ID>
57
+ </ROClientIDHeader>
58
+ </soap:Header>
59
+ <soap:Body>
60
+ <WebServService___ConsEtiquetaEnvio6>
61
+ <strCodAgeOri>#{Deliveries.courier(:envialia).config(:agency_code)}</strCodAgeOri>
62
+ <strAlbaran>#{tracking_code}</strAlbaran>
63
+ <strBulto></strBulto>
64
+ <boPaginaA4>false</boPaginaA4>
65
+ <intNumEtiqImpresasA4>0</intNumEtiqImpresasA4>
66
+ <strFormato>PDF</strFormato>
67
+ </WebServService___ConsEtiquetaEnvio6>
68
+ </soap:Body>
69
+ </soap:Envelope>
70
+ XML
71
+ end
72
+
73
+ def headers
74
+ { 'Content-Type' => 'application/json;charset=UTF-8', 'Accept' => 'application/json' }
75
+ end
76
+
77
+ def api_endpoint
78
+ if Envialia.live?
79
+ Envialia::ENVIALIA_ENDPOINT_LIVE
80
+ else
81
+ Envialia::ENVIALIA_ENDPOINT_TEST
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,147 @@
1
+ require 'httparty'
2
+
3
+ module Deliveries
4
+ module Couriers
5
+ module Envialia
6
+ module Pickups
7
+ class Create
8
+ include HTTParty
9
+ include Authentication
10
+
11
+ attr_accessor :sender, :receiver, :parcels,
12
+ :reference_code, :pickup_date, :remarks, :tracking_code
13
+
14
+ def initialize(sender:, receiver:, parcels:,
15
+ reference_code:, pickup_date:, remarks:, tracking_code:)
16
+
17
+ self.sender = sender
18
+ self.receiver = receiver
19
+ self.parcels = parcels
20
+ self.reference_code = reference_code
21
+ self.pickup_date = pickup_date
22
+ self.remarks = remarks
23
+ self.tracking_code = tracking_code
24
+ end
25
+
26
+ def execute
27
+ response = self.class.post(
28
+ api_endpoint,
29
+ body: body,
30
+ headers: headers,
31
+ debug_output: Deliveries.debug ? Deliveries.logger : nil
32
+ )
33
+
34
+ raise Deliveries::ClientError unless response.success?
35
+
36
+ pickup_number = response.dig('Envelope', 'Body', 'WebServService___GrabaRecogida3Response', 'strCodOut')
37
+
38
+ if pickup_number
39
+ Deliveries::Pickup.new(
40
+ courier_id: 'envialia',
41
+ sender: sender,
42
+ receiver: receiver,
43
+ parcels: parcels,
44
+ reference_code: reference_code,
45
+ tracking_code: pickup_number,
46
+ pickup_date: pickup_date
47
+ )
48
+ else
49
+ exception = response.dig('Envelope', 'Body', 'Fault')
50
+
51
+ if exception['faultcode'].eql?('Exception')
52
+ exception_code, exception_str = exception['faultstring'].split(':')
53
+ else
54
+ exception_code = 400
55
+ exception_str = exception['faultstring']
56
+ end
57
+
58
+ raise Deliveries::APIError.new(
59
+ exception_str.strip,
60
+ exception_code.to_i
61
+ )
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def body
68
+ <<~XML
69
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
70
+ <soap:Header>
71
+ <ROClientIDHeader xmlns="http://tempuri.org/">
72
+ <ID>#{session_id}</ID>
73
+ </ROClientIDHeader>
74
+ </soap:Header>
75
+ <soap:Body>
76
+ <WebServService___GrabaRecogida3 xmlns="http://tempuri.org/">
77
+ <strCod></strCod>
78
+ <strAlbaran>#{tracking_code}</strAlbaran>
79
+ <strCodAgeCargo>#{Deliveries.courier(:envialia).config(:agency_code)}</strCodAgeCargo>
80
+ <strCodAgeOri></strCodAgeOri>
81
+ <dtFecRec>#{pickup_date.strftime('%Y/%m/%d')}</dtFecRec>
82
+ <strNomOri>#{sender.name}</strNomOri>
83
+ <strPobOri>#{sender.city}</strPobOri>
84
+ <strDirOri>#{sender.street}</strDirOri>
85
+ <strCPOri>#{format_postcode(sender.postcode, sender.country)}</strCPOri>
86
+ <strTlfOri>#{sender.phone}</strTlfOri>
87
+ <strNomDes>#{receiver.name}</strNomDes>
88
+ <strPobDes>#{receiver.city}</strPobDes>
89
+ <strDirDes>#{receiver.street}</strDirDes>
90
+ <strCPDes>#{format_postcode(receiver.postcode, receiver.country)}</strCPDes>
91
+ <strTlfDes>#{receiver.phone}</strTlfDes>
92
+ <strCodPais>#{receiver.country}</strCodPais>
93
+ <intBul>#{parcels}</intBul>
94
+ <strCodTipoServ>72</strCodTipoServ>
95
+ <dPesoOri>0</dPesoOri>
96
+ <dAltoOri>0</dAltoOri>
97
+ <dAnchoOri>0</dAnchoOri>
98
+ <dLargoOri>0</dLargoOri>
99
+ <dReembolso>0</dReembolso>
100
+ <dValor>0</dValor>
101
+ <dAnticipo>0</dAnticipo>
102
+ <dCobCli>0</dCobCli>
103
+ <strObs>#{remarks}</strObs>
104
+ <boSabado>false</boSabado>
105
+ <boRetorno>false</boRetorno>
106
+ <boGestOri>false</boGestOri>
107
+ <boGestDes>false</boGestDes>
108
+ <boAnulado>false</boAnulado>
109
+ <boAcuse>false</boAcuse>
110
+ <strRef>#{reference_code}</strRef>
111
+ <dBaseImp>0</dBaseImp>
112
+ <dImpuesto>0</dImpuesto>
113
+ <boPorteDebCli>false</boPorteDebCli>
114
+ <strDesDirEmails>#{receiver.email}</strDesDirEmails>
115
+ <boCampo5>false</boCampo5>
116
+ <boPagoDUAImp>false</boPagoDUAImp>
117
+ <boPagoImpDes>false</boPagoImpDes>
118
+ </WebServService___GrabaRecogida3>
119
+ </soap:Body>
120
+ </soap:Envelope>
121
+ XML
122
+ end
123
+
124
+ def headers
125
+ { 'Content-Type' => 'application/json;charset=UTF-8', 'Accept' => 'application/json' }
126
+ end
127
+
128
+ def api_endpoint
129
+ if Envialia.live?
130
+ Envialia::ENVIALIA_ENDPOINT_LIVE
131
+ else
132
+ Envialia::ENVIALIA_ENDPOINT_TEST
133
+ end
134
+ end
135
+
136
+ def format_postcode(postcode, country)
137
+ if country.to_sym.downcase == :pt
138
+ postcode&.split('-')&.first
139
+ else
140
+ postcode
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end