jamef-api 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []