jamef-api 0.5.0

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.
@@ -0,0 +1,82 @@
1
+ module Jamef
2
+ module Helper
3
+
4
+ ACCENTS_MAPPING = {
5
+ 'E' => [200,201,202,203],
6
+ 'e' => [232,233,234,235],
7
+ 'A' => [192,193,194,195,196,197],
8
+ 'a' => [224,225,226,227,228,229,230],
9
+ 'C' => [199],
10
+ 'c' => [231],
11
+ 'O' => [210,211,212,213,214,216],
12
+ 'o' => [242,243,244,245,246,248],
13
+ 'I' => [204,205,206,207],
14
+ 'i' => [236,237,238,239],
15
+ 'U' => [217,218,219,220],
16
+ 'u' => [249,250,251,252],
17
+ 'N' => [209],
18
+ 'n' => [241],
19
+ 'Y' => [221],
20
+ 'y' => [253,255],
21
+ 'AE' => [306],
22
+ 'ae' => [346],
23
+ 'OE' => [188],
24
+ 'oe' => [189]
25
+ }
26
+
27
+
28
+ # Remove the accents from the string. Uses String::ACCENTS_MAPPING as the source map.
29
+ def self.unaccent string
30
+ str = string.dup
31
+ ACCENTS_MAPPING.each {|letter,accents|
32
+ packed = accents.pack('U*')
33
+ rxp = Regexp.new("[#{packed}]", nil)
34
+ str.gsub!(rxp, letter)
35
+ }
36
+ str
37
+ end
38
+
39
+ def self.only_numbers string
40
+ string.gsub(/\D*/,'')
41
+ end
42
+
43
+ def self.format_decimal value
44
+ sprintf('%.2f', Float(value))
45
+ end
46
+
47
+ def self.format_zip value
48
+ only_numbers(value)
49
+ end
50
+
51
+ def self.format_city value
52
+ unaccent(value).upcase
53
+ end
54
+
55
+ def self.format_state value
56
+ value.upcase
57
+ end
58
+
59
+ def self.format_document value
60
+ only_numbers(value)
61
+ end
62
+
63
+
64
+ def self.format_date value
65
+ value.strftime("%d/%m/%Y")
66
+ end
67
+
68
+ def self.format_time value
69
+ value.strftime("%H:%M")
70
+ end
71
+
72
+ def self.parse_date value
73
+ Date.strptime(value, '%d/%m/%y')
74
+ end
75
+
76
+ def self.parse_decimal value
77
+ Float(value)
78
+ end
79
+
80
+ end
81
+
82
+ end
@@ -0,0 +1,63 @@
1
+ require 'ostruct'
2
+ require 'active_model'
3
+
4
+ module Jamef
5
+ class Package < OpenStruct
6
+
7
+ include ActiveModel::Validations
8
+
9
+ PRODUCTS_TYPES = [:nf, :livros, :alimentos, :confeccoes, :comesticos, :cirugicos, :jornais, :material_escolar]
10
+
11
+ validates :weight, :package_price, :volume, :type, presence: true
12
+ validates :weight, :package_price, :volume, numericality: true
13
+
14
+ validates :type, inclusion: PRODUCTS_TYPES
15
+
16
+ def initialize *args
17
+ super
18
+ self.type ||= :nf
19
+ raise ArgumentError, errors.first unless self.valid?
20
+ self
21
+ end
22
+
23
+ def self.type_map package_type
24
+ value = {
25
+
26
+ # CONFORME NOTA FISCAL
27
+ nf: '000004',
28
+
29
+ # LIVROS
30
+ livros: '000005',
31
+
32
+ # ALIMENTOS INDUSTRIALIZADOS
33
+ alimentos: '000010',
34
+
35
+ # CONFECCOES
36
+ confeccoes: '000008',
37
+
38
+ # COSMETICOS
39
+ comesticos: '000011',
40
+
41
+ # MATERIAL CIRURGICO
42
+ cirugicos: '000011',
43
+
44
+ # JORNAIS / REVISTAS
45
+ jornais: '000006',
46
+
47
+ # MATERIAL ESCOLAR
48
+ material_escolar: '000013'
49
+
50
+ }[package_type]
51
+ value ? value : raise(ArgumentError,"Unknown Jamef Package Type: #{package_type}")
52
+ end
53
+
54
+ def price
55
+ package_price
56
+ end
57
+
58
+ def price= value
59
+ self.package_price = value
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,162 @@
1
+ require 'ostruct'
2
+ require 'active_model'
3
+
4
+ module Jamef
5
+ class Params < OpenStruct
6
+
7
+ include ActiveModel::Validations
8
+
9
+ validates :sender, :package, :receiver, :shipping_in, :service_type, presence: true
10
+
11
+ validates :service_type, inclusion: [:road,:air]
12
+
13
+ validate :validate_sender
14
+ validate :validate_receiver
15
+ validate :validate_package
16
+
17
+ # validates :tiptra, :cnpjcpf, :munori, :estori, :segprod, :qtdvol, :peso, :valmer, :metro3, :cepdes, :filcot, presence: true
18
+
19
+ def initialize *args
20
+ super
21
+
22
+ raise ArgumentError, errors.full_messages.join("\n") unless self.valid?
23
+ self
24
+ end
25
+
26
+ def freight_hash
27
+ hash = {}
28
+ hash.store(:tiptra, tiptra)
29
+ hash.store(:cnpjcpf, cnpjcpf)
30
+ hash.store(:munori, munori)
31
+ hash.store(:estori, estori)
32
+ hash.store(:segprod, segprod)
33
+ hash.store(:qtdvol, qtdvol)
34
+ hash.store(:peso, peso)
35
+ hash.store(:valmer, valmer)
36
+ hash.store(:metro3, metro3)
37
+ hash.store(:cnpjdes, cnpjdes)
38
+ hash.store(:filcot, filcot)
39
+ hash.store(:cepdes, cepdes)
40
+ hash.store(:contrib, contrib) if contrib?
41
+ hash
42
+ end
43
+
44
+ def delivery_hash
45
+ hash = {}
46
+ hash.store(:tiptra, tiptra)
47
+ hash.store(:munori, munori)
48
+ hash.store(:estori, estori)
49
+ hash.store(:cnpjcpf, cnpjcpf)
50
+ hash.store(:segprod, segprod)
51
+ hash.store(:cdatini, cdatini)
52
+ hash.store(:chorini, chorini)
53
+ hash.store(:cnpjdes, cnpjdes)
54
+ hash.store(:cepdes, cepdes)
55
+ hash
56
+ end
57
+
58
+ private
59
+
60
+ # service type
61
+ def tiptra
62
+ service_code
63
+ end
64
+
65
+ # document
66
+ def cnpjcpf
67
+ Jamef::Helper.format_document(sender.document)
68
+ end
69
+
70
+ # origin city
71
+ def munori
72
+ Jamef::Helper.format_city(sender.city)
73
+ end
74
+
75
+ # origin state
76
+ def estori
77
+ Jamef::Helper.format_state(sender.state)
78
+ end
79
+
80
+ # products type
81
+ def segprod
82
+ Jamef::Package.type_map(package.type)
83
+ end
84
+
85
+ # volumes quantity
86
+ def qtdvol
87
+ package.quantity || 1
88
+ end
89
+
90
+ # package weight
91
+ def peso
92
+ Jamef::Helper.format_decimal(package.weight)
93
+ end
94
+
95
+ # package price
96
+ def valmer
97
+ Jamef::Helper.format_decimal(package.price)
98
+ end
99
+
100
+ # package volume
101
+ def metro3
102
+ Jamef::Helper.format_decimal(package.volume)
103
+ end
104
+
105
+ # destination zip
106
+ def cepdes
107
+ Jamef::Helper.format_zip(receiver.zip)
108
+ end
109
+
110
+ # jamef branch​
111
+ def filcot
112
+ Jamef::Branch.find((branch || jamef_branch) || sender.jamef_branch).code
113
+ end
114
+
115
+ # contrib! pays icms? tem inscrição estadual?
116
+ def contrib
117
+ Jamef::Helper.format_boolean(receiver.contrib)
118
+ end
119
+
120
+ def contrib?
121
+ receiver.contrib.present? and receiver.contrib
122
+ end
123
+
124
+ # receiver document
125
+ def cnpjdes
126
+ receiver.document.present? ? Jamef::Helper.format_document(receiver.document) : ''
127
+ end
128
+
129
+ # shipping date
130
+ def cdatini
131
+ Jamef::Helper.format_date(shipping_in)
132
+ end
133
+
134
+ # shipping time
135
+ def chorini
136
+ Jamef::Helper.format_time(shipping_in)
137
+ end
138
+
139
+ # service type map
140
+ def service_code
141
+ value = {
142
+ road: 1,
143
+ air: 2
144
+ }[service_type]
145
+ value ? value : raise(ArgumentError, "Jamef #{service} service not found")
146
+ end
147
+
148
+ def validate_sender
149
+ errors.add(:sender,'is not a valid Jamef::Sender') unless (sender.present? and sender.valid?)
150
+ end
151
+
152
+ def validate_receiver
153
+ errors.add(:receiver,'is not a valid Jamef::Receiver') unless (receiver.present? and receiver.valid?)
154
+ end
155
+
156
+ def validate_package
157
+ errors.add(:package,'is not a valid Jamef::Package') unless (package.present? and package.valid?)
158
+ end
159
+
160
+
161
+ end
162
+ end
@@ -0,0 +1,11 @@
1
+ require 'active_model'
2
+
3
+ module Jamef
4
+ module Rating
5
+
6
+ class Params < OpenStruct
7
+ include ActiveModel::Validations
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,82 @@
1
+ require 'savon'
2
+ require 'date'
3
+ require_relative './rating/params'
4
+ Bundler.require(:pry,:development)
5
+
6
+ module Jamef
7
+ module Rating
8
+
9
+ WSDL = 'http://www.jamef.com.br/webservice/JAMW0520.apw?WSDL'
10
+
11
+ def self.complete_rate params
12
+ params = Jamef::Params.new(params)
13
+ response = send_message(params)
14
+ parse_response(response)
15
+ end
16
+
17
+ def self.rate params
18
+ simplify_parsed_response(complete_rate(params))
19
+ end
20
+
21
+ def self.savon_client
22
+ @savon_client ||= ::Savon.client do |globals|
23
+ globals.convert_request_keys_to :upcase
24
+ globals.wsdl wsdl
25
+ end
26
+ @savon_client
27
+ end
28
+
29
+ private
30
+
31
+
32
+ def self.wsdl
33
+ WSDL
34
+ end
35
+
36
+ def self.send_message params
37
+ freight_response = savon_client.call(:jamw0520_05, message: params.freight_hash)
38
+ delivery_response = savon_client.call(:jamw0520_04, message: params.delivery_hash)
39
+ {freight: freight_response, delivery: delivery_response}
40
+ end
41
+
42
+ def self.parse_response response
43
+ {freight: parse_freight_response(response), delivery: parse_delivery_response(response)}
44
+ end
45
+
46
+ def self.parse_freight_response response
47
+ response[:freight].body.to_h[:jamw0520_05_response][:jamw0520_05_result]
48
+ end
49
+
50
+ def self.parse_delivery_response response
51
+ response[:delivery].body.to_h[:jamw0520_04_response][:jamw0520_04_result]
52
+ end
53
+
54
+
55
+ def self.simplify_parsed_response parsed_response
56
+ if successful_response?(parsed_response)
57
+ freight = Jamef::Helper.parse_decimal(parsed_response[:freight][:valfre][:avalfre].last[:total])
58
+ min_date = Jamef::Helper.parse_date(parsed_response[:delivery][:cdtmin])
59
+ max_date = Jamef::Helper.parse_date(parsed_response[:delivery][:cdtmax])
60
+ {
61
+ success: true,
62
+ error: false,
63
+ freight: freight,
64
+ min_delivery_date: min_date,
65
+ max_delivery_date: max_date
66
+ }
67
+ else
68
+ { error: get_error(parsed_response), success: false }
69
+ end
70
+ end
71
+
72
+ def self.successful_response? parsed_response
73
+ parsed_response[:freight][:msgerro].match?(/^ok/i) and parsed_response[:delivery][:msgerro].match?(/^ok/i)
74
+ end
75
+
76
+ def self.get_error parsed_response
77
+ parsed_response[:freight][:msgerro].match?(/^ok/i) ? parsed_response[:delivery][:msgerro] : parsed_response[:freight][:msgerro]
78
+ end
79
+
80
+
81
+ end
82
+ end
@@ -0,0 +1,24 @@
1
+ require 'ostruct'
2
+ require 'active_model'
3
+
4
+ module Jamef
5
+
6
+ class Receiver < OpenStruct
7
+
8
+ include ActiveModel::Validations
9
+
10
+ validates :zip, presence: true
11
+
12
+ def initialize *args
13
+ super
14
+ raise ArgumentError, errors.first unless self.valid?
15
+ self
16
+ end
17
+
18
+ def contrib?
19
+ contrib.present?
20
+ end
21
+
22
+
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ require 'ostruct'
2
+ require 'active_model'
3
+
4
+ module Jamef
5
+
6
+ class Sender < OpenStruct
7
+
8
+ include ActiveModel::Validations
9
+
10
+ validates :document, :city, :state, :jamef_branch, presence: true
11
+
12
+ validates :state, length: {is: 2}
13
+
14
+ validate :validate_branch
15
+
16
+ def initialize *args
17
+ super
18
+ raise ArgumentError, errors.first unless self.valid?
19
+ self
20
+ end
21
+
22
+ def validate_branch
23
+ errors.add(:jamef_branch,'Unknown branch') if jamef_branch.present? and Jamef::Branch.find(jamef_branch).blank?
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,4 @@
1
+ module Jamef
2
+ module Rating
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module Jamef
2
+ VERSION = "0.5.0"
3
+ end
data/lib/jamef.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'active_support/all'
2
+ require "jamef/version"
3
+ require "jamef/branch"
4
+ require "jamef/package"
5
+ require "jamef/sender"
6
+ require "jamef/receiver"
7
+ require "jamef/params"
8
+ require 'jamef/rating'
9
+ require 'jamef/tracking'
10
+ require 'jamef/helper'
11
+
12
+ module Jamef
13
+
14
+ def self.rate params
15
+ Jamef::Rating.rate(params)
16
+ end
17
+
18
+ def self.complete_rate params
19
+ Jamef::Rating.complete_rate(params)
20
+ end
21
+
22
+ def self.track params
23
+ Jamef::Tracking.track(params)
24
+ end
25
+
26
+ end
data/lib/jamef_api.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'jamef'
2
+
3
+ module JamefAPI
4
+ end
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jamef-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Agilso
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard-rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activemodel
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rest-client
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: savon
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.0'
139
+ description: Ruby wrapper for the Jamef.com.br SOAP API.
140
+ email:
141
+ - agilso.b@gmail.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".gitignore"
147
+ - ".rspec"
148
+ - ".travis.yml"
149
+ - Gemfile
150
+ - Gemfile.lock
151
+ - Guardfile
152
+ - LICENSE.txt
153
+ - README.md
154
+ - Rakefile
155
+ - bin/console
156
+ - bin/setup
157
+ - jamef.gemspec
158
+ - lib/jamef.rb
159
+ - lib/jamef/branch.rb
160
+ - lib/jamef/helper.rb
161
+ - lib/jamef/package.rb
162
+ - lib/jamef/params.rb
163
+ - lib/jamef/rating.rb
164
+ - lib/jamef/rating/params.rb
165
+ - lib/jamef/receiver.rb
166
+ - lib/jamef/sender.rb
167
+ - lib/jamef/tracking.rb
168
+ - lib/jamef/version.rb
169
+ - lib/jamef_api.rb
170
+ homepage: https://github.com/agilso/jamef-api
171
+ licenses:
172
+ - MIT
173
+ metadata: {}
174
+ post_install_message:
175
+ rdoc_options: []
176
+ require_paths:
177
+ - lib
178
+ required_ruby_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ requirements: []
189
+ rubyforge_project:
190
+ rubygems_version: 2.7.3
191
+ signing_key:
192
+ specification_version: 4
193
+ summary: Ruby wrapper for the Jamef API
194
+ test_files: []