correios_gem 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/SRO/client.rb +25 -0
- data/lib/SRO/helper.rb +118 -0
- data/lib/SRO/requests/track_shippings.rb +142 -0
- data/lib/SRO/requests/track_shippings_list.rb +144 -0
- data/lib/correios_exception.rb +11 -0
- data/lib/correios_gem.rb +186 -0
- data/lib/credentials.rb +27 -0
- data/lib/pricefier/client.rb +20 -0
- data/lib/pricefier/helper.rb +72 -0
- data/lib/pricefier/requests/calculate_deadline.rb +100 -0
- data/lib/pricefier/requests/calculate_deadline_with_date.rb +102 -0
- data/lib/pricefier/requests/calculate_deadline_with_restrictions.rb +102 -0
- data/lib/pricefier/requests/calculate_price.rb +123 -0
- data/lib/pricefier/requests/calculate_price_deadline.rb +138 -0
- data/lib/pricefier/requests/calculate_price_deadline_with_date.rb +142 -0
- data/lib/pricefier/requests/calculate_price_deadline_with_restrictions.rb +142 -0
- data/lib/pricefier/requests/calculate_price_fac.rb +106 -0
- data/lib/pricefier/requests/calculate_price_with_date.rb +125 -0
- data/lib/pricefier/requests/list_services.rb +87 -0
- data/lib/pricefier/requests/list_services_star.rb +87 -0
- data/lib/reverse_logistics/client.rb +34 -0
- data/lib/reverse_logistics/helper.rb +95 -0
- data/lib/reverse_logistics/requests/calculate_ticket_number_check_digit.rb +66 -0
- data/lib/reverse_logistics/requests/cancel_shipping.rb +70 -0
- data/lib/reverse_logistics/requests/create_shippings.rb +166 -0
- data/lib/reverse_logistics/requests/create_shippings_with_collection.rb +152 -0
- data/lib/reverse_logistics/requests/request_ticket_numbers.rb +90 -0
- data/lib/reverse_logistics/requests/track_shipping.rb +121 -0
- data/lib/reverse_logistics/requests/track_shippings_by_date.rb +133 -0
- data/lib/sigep/client.rb +29 -0
- data/lib/sigep/helper.rb +234 -0
- data/lib/sigep/requests/calculate_label_number_check_digit.rb +72 -0
- data/lib/sigep/requests/cancel_shipping.rb +72 -0
- data/lib/sigep/requests/check_card_status.rb +69 -0
- data/lib/sigep/requests/check_service_availability.rb +91 -0
- data/lib/sigep/requests/create_shippings.rb +70 -0
- data/lib/sigep/requests/request_label_numbers.rb +76 -0
- data/lib/sigep/requests/request_shippings_xml.rb +208 -0
- data/lib/sigep/requests/search_available_additional_services.rb +62 -0
- data/lib/sigep/requests/search_customer.rb +129 -0
- data/lib/sigep/requests/search_zip_code.rb +63 -0
- data/lib/sigep/requests/track_shippings.rb +145 -0
- metadata +145 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4bcdea458108961276833153250ad580148c625d6fb4500a90ad69558d54a98a
|
4
|
+
data.tar.gz: '0967af2c766255082c6a6231d2321d42c25283906b42f72606dbd1559d2517f0'
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d11f27adbbfc2648b8c73442052d707ebe2e3783e14a84ccd8053a7670815ce2ad2939806a4040b3870b402c49cdc1a5e840ede98c25b940a6c08b3e6cdf7749
|
7
|
+
data.tar.gz: 2ce68ea63004a35f7eec0021987b1a6a47d8a88461da43891a44c7ff315b937efdc0f890fce11946646be27c3491b6ce4c7331b46213a8d7a6ec84dbc63d02ee
|
data/lib/SRO/client.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'savon'
|
2
|
+
|
3
|
+
module Correios
|
4
|
+
module SRO
|
5
|
+
class Client
|
6
|
+
def client
|
7
|
+
Savon.client(
|
8
|
+
wsdl: wsdl,
|
9
|
+
ssl_verify_mode: :none
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def wsdl
|
16
|
+
'https://webservice.correios.com.br/service/rastro/Rastro.wsdl'
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_env?
|
20
|
+
(defined?(Rails) && ENV['RAILS_ENV'].in?(%w[test development]) ||
|
21
|
+
ENV['GEM_ENV'].in?(%w[test development]))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/SRO/helper.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
module Correios
|
2
|
+
module SRO
|
3
|
+
class Helper
|
4
|
+
def namespaces
|
5
|
+
{
|
6
|
+
'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/',
|
7
|
+
'xmlns:ns1' => 'http://resource.webservice.correios.com.br/'
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def tracking_event_status(event)
|
12
|
+
type = event[:tipo]
|
13
|
+
status = event[:status].to_i
|
14
|
+
|
15
|
+
case type
|
16
|
+
when 'BDE', 'BDI', 'BDR'
|
17
|
+
case status
|
18
|
+
when 0, 1
|
19
|
+
return :delivered
|
20
|
+
when 2
|
21
|
+
return :not_delivered
|
22
|
+
when 4, 5, 6, 8, 10, 21, 22, 26, 33, 36, 40, 42, 48, 49, 56
|
23
|
+
return :returning
|
24
|
+
when 7, 19, 25, 32, 38, 41, 45, 46, 47, 53, 57, 66, 69
|
25
|
+
return :in_transit
|
26
|
+
when 9, 50, 51, 52
|
27
|
+
return :stolen_lost
|
28
|
+
when 3, 12, 24
|
29
|
+
return :awaiting_pickup
|
30
|
+
when 20, 34, 35
|
31
|
+
return :not_delivered
|
32
|
+
when 23
|
33
|
+
return :returned
|
34
|
+
when 28, 37
|
35
|
+
return :damaged
|
36
|
+
when 43
|
37
|
+
return :arrested
|
38
|
+
when 54, 55, 58, 59
|
39
|
+
return :taxing
|
40
|
+
end
|
41
|
+
when 'BLQ', 'PMT', 'CD', 'CMT', 'TRI', 'CUN', 'RO', 'DO', 'EST', 'PAR'
|
42
|
+
case status
|
43
|
+
when 0, 1, 2, 3, 4, 5, 6, 9, 15, 16, 17, 18
|
44
|
+
return :in_transit
|
45
|
+
end
|
46
|
+
when 'FC'
|
47
|
+
case status
|
48
|
+
when 1
|
49
|
+
return :returning
|
50
|
+
when 2, 3, 5, 7
|
51
|
+
return :in_transit
|
52
|
+
when 4
|
53
|
+
return :not_delivered
|
54
|
+
end
|
55
|
+
when 'IDC'
|
56
|
+
case status
|
57
|
+
when 1, 2, 3, 4, 5, 6, 7
|
58
|
+
return :stolen_lost
|
59
|
+
end
|
60
|
+
when 'LDI'
|
61
|
+
case status
|
62
|
+
when 0, 1, 2, 3, 14
|
63
|
+
return :awaiting_pickup
|
64
|
+
end
|
65
|
+
when 'OEC', 'LDE'
|
66
|
+
case status
|
67
|
+
when 0, 1, 9
|
68
|
+
return :delivering
|
69
|
+
end
|
70
|
+
when 'PO', 'CO'
|
71
|
+
case status
|
72
|
+
when 0, 1, 9
|
73
|
+
return :posted
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def query_type(type)
|
79
|
+
case type
|
80
|
+
when :list
|
81
|
+
'L'
|
82
|
+
when :range
|
83
|
+
'F'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def result_type(type)
|
88
|
+
case type
|
89
|
+
when :last_event
|
90
|
+
'U'
|
91
|
+
when :all_events
|
92
|
+
'T'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def language(type)
|
97
|
+
case type
|
98
|
+
when :portuguese
|
99
|
+
'101'
|
100
|
+
when :english
|
101
|
+
'102'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def format_label_numbers(label_numbers)
|
106
|
+
label_numbers_string = ''
|
107
|
+
label_numbers.each do |label_number|
|
108
|
+
label_numbers_string += label_number
|
109
|
+
end
|
110
|
+
label_numbers_string
|
111
|
+
end
|
112
|
+
|
113
|
+
def convert_string_to_date(date, time)
|
114
|
+
Time.strptime("#{date} #{time}", '%d/%m/%Y %H:%M')
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'savon'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
require_relative '../client'
|
5
|
+
require_relative '../helper'
|
6
|
+
require_relative '../../correios_exception.rb'
|
7
|
+
|
8
|
+
module Correios
|
9
|
+
module SRO
|
10
|
+
class TrackShippings < CorreiosException
|
11
|
+
HELPER = Helper.new
|
12
|
+
CLIENT = Client.new
|
13
|
+
|
14
|
+
def initialize(data = {})
|
15
|
+
@credentials = Correios.credentials
|
16
|
+
|
17
|
+
@show_request = data[:show_request]
|
18
|
+
@label_numbers = data[:label_numbers]
|
19
|
+
@query_type = data[:query_type]
|
20
|
+
@result_type = data[:result_type]
|
21
|
+
@language = data[:language]
|
22
|
+
super()
|
23
|
+
end
|
24
|
+
|
25
|
+
def request
|
26
|
+
puts xml if @show_request == true
|
27
|
+
begin
|
28
|
+
format_response(CLIENT.client.call(:busca_eventos,
|
29
|
+
soap_action: '',
|
30
|
+
xml: xml).to_hash)
|
31
|
+
rescue Savon::SOAPFault => error
|
32
|
+
generate_exception(error)
|
33
|
+
rescue Savon::HTTPError => error
|
34
|
+
if error.http.code == 401
|
35
|
+
generate_exception("Unauthorized (#{error.http.code}).")
|
36
|
+
end
|
37
|
+
generate_exception("Unknown HTTP error (#{error.http.code}).")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def xml
|
44
|
+
Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
45
|
+
xml['soap'].Envelope(HELPER.namespaces) do
|
46
|
+
xml['soap'].Body do
|
47
|
+
xml['ns1'].buscaEventos do
|
48
|
+
parent_namespace = xml.parent.namespace
|
49
|
+
xml.parent.namespace = nil
|
50
|
+
|
51
|
+
xml.objetos HELPER.format_label_numbers(@label_numbers)
|
52
|
+
xml.tipo HELPER.query_type(@query_type)
|
53
|
+
xml.resultado HELPER.result_type(@result_type)
|
54
|
+
xml.lingua HELPER.language(@language)
|
55
|
+
xml.usuario @credentials.sro_user
|
56
|
+
xml.senha @credentials.sro_password
|
57
|
+
|
58
|
+
xml.parent.namespace = parent_namespace
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end.doc.root.to_xml
|
63
|
+
end
|
64
|
+
|
65
|
+
def format_response(response)
|
66
|
+
response = response[:busca_eventos_response][:return]
|
67
|
+
|
68
|
+
objects = response[:objeto]
|
69
|
+
objects = [objects] if objects.is_a?(Hash)
|
70
|
+
|
71
|
+
generate_exception(objects.first[:erro]) if objects.first[:numero] == 'Erro'
|
72
|
+
|
73
|
+
formatted_objects = []
|
74
|
+
objects.each do |object|
|
75
|
+
formatted_objects << format_object(object)
|
76
|
+
end
|
77
|
+
|
78
|
+
{ tracking: formatted_objects }
|
79
|
+
end
|
80
|
+
|
81
|
+
def format_object(object)
|
82
|
+
if object[:erro].present?
|
83
|
+
return {
|
84
|
+
label: {
|
85
|
+
number: object[:numero]
|
86
|
+
},
|
87
|
+
error: object[:erro]
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
events = object[:evento]
|
92
|
+
events = [events] if events.is_a?(Hash)
|
93
|
+
|
94
|
+
formatted_events = []
|
95
|
+
events.each do |event|
|
96
|
+
formatted_events << format_event(event)
|
97
|
+
end
|
98
|
+
|
99
|
+
{
|
100
|
+
label: {
|
101
|
+
number: object[:numero],
|
102
|
+
initials: object[:sigla],
|
103
|
+
name: object[:nome],
|
104
|
+
category: object[:categoria]
|
105
|
+
},
|
106
|
+
events: formatted_events
|
107
|
+
}
|
108
|
+
end
|
109
|
+
|
110
|
+
def format_event(event)
|
111
|
+
{
|
112
|
+
movement: HELPER.tracking_event_status(event),
|
113
|
+
type: event[:tipo],
|
114
|
+
status: event[:status],
|
115
|
+
time: HELPER.convert_string_to_date(event[:data], event[:hora]),
|
116
|
+
description: event[:descricao],
|
117
|
+
detail: event[:detalhe],
|
118
|
+
city: event[:cidade],
|
119
|
+
state: event[:uf],
|
120
|
+
destination: format_destination(event[:destino]),
|
121
|
+
site: {
|
122
|
+
description: event[:local],
|
123
|
+
zip_code: event[:codigo]
|
124
|
+
}
|
125
|
+
}
|
126
|
+
end
|
127
|
+
|
128
|
+
def format_destination(destination)
|
129
|
+
return nil if destination.nil?
|
130
|
+
{
|
131
|
+
city: destination[:cidade],
|
132
|
+
neighborhood: destination[:bairro],
|
133
|
+
state: destination[:uf],
|
134
|
+
site: {
|
135
|
+
description: destination[:local],
|
136
|
+
zip_code: destination[:codigo]
|
137
|
+
}
|
138
|
+
}
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'savon'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
require_relative '../client'
|
5
|
+
require_relative '../helper'
|
6
|
+
require_relative '../../correios_exception.rb'
|
7
|
+
|
8
|
+
module Correios
|
9
|
+
module SRO
|
10
|
+
class TrackShippingsList < CorreiosException
|
11
|
+
HELPER = Helper.new
|
12
|
+
CLIENT = Client.new
|
13
|
+
|
14
|
+
def initialize(data = {})
|
15
|
+
@credentials = Correios.credentials
|
16
|
+
|
17
|
+
@show_request = data[:show_request]
|
18
|
+
@label_numbers = data[:label_numbers]
|
19
|
+
@query_type = data[:query_type]
|
20
|
+
@result_type = data[:result_type]
|
21
|
+
@language = data[:language]
|
22
|
+
super()
|
23
|
+
end
|
24
|
+
|
25
|
+
def request
|
26
|
+
puts xml if @show_request == true
|
27
|
+
begin
|
28
|
+
format_response(CLIENT.client.call(:busca_eventos_lista,
|
29
|
+
soap_action: '',
|
30
|
+
xml: xml).to_hash)
|
31
|
+
rescue Savon::SOAPFault => error
|
32
|
+
generate_exception(error)
|
33
|
+
rescue Savon::HTTPError => error
|
34
|
+
if error.http.code == 401
|
35
|
+
generate_exception("Unauthorized (#{error.http.code}).")
|
36
|
+
end
|
37
|
+
generate_exception("Unknown HTTP error (#{error.http.code}).")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def xml
|
44
|
+
Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
45
|
+
xml['soap'].Envelope(HELPER.namespaces) do
|
46
|
+
xml['soap'].Body do
|
47
|
+
xml['ns1'].buscaEventosLista do
|
48
|
+
parent_namespace = xml.parent.namespace
|
49
|
+
xml.parent.namespace = nil
|
50
|
+
|
51
|
+
@label_numbers.each do |label_number|
|
52
|
+
xml.objetos label_number
|
53
|
+
end
|
54
|
+
xml.tipo HELPER.query_type(@query_type)
|
55
|
+
xml.resultado HELPER.result_type(@result_type)
|
56
|
+
xml.lingua HELPER.language(@language)
|
57
|
+
xml.usuario @credentials.sro_user
|
58
|
+
xml.senha @credentials.sro_password
|
59
|
+
|
60
|
+
xml.parent.namespace = parent_namespace
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end.doc.root.to_xml
|
65
|
+
end
|
66
|
+
|
67
|
+
def format_response(response)
|
68
|
+
response = response[:busca_eventos_lista_response][:return]
|
69
|
+
|
70
|
+
objects = response[:objeto]
|
71
|
+
objects = [objects] if objects.is_a?(Hash)
|
72
|
+
|
73
|
+
generate_exception(objects.first[:erro]) if objects.first[:numero] == 'Erro'
|
74
|
+
|
75
|
+
formatted_objects = []
|
76
|
+
objects.each do |object|
|
77
|
+
formatted_objects << format_object(object)
|
78
|
+
end
|
79
|
+
|
80
|
+
{ tracking: formatted_objects }
|
81
|
+
end
|
82
|
+
|
83
|
+
def format_object(object)
|
84
|
+
if object[:erro].present?
|
85
|
+
return {
|
86
|
+
label: {
|
87
|
+
number: object[:numero]
|
88
|
+
},
|
89
|
+
error: object[:erro]
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
events = object[:evento]
|
94
|
+
events = [events] if events.is_a?(Hash)
|
95
|
+
|
96
|
+
formatted_events = []
|
97
|
+
events.each do |event|
|
98
|
+
formatted_events << format_event(event)
|
99
|
+
end
|
100
|
+
|
101
|
+
{
|
102
|
+
label: {
|
103
|
+
number: object[:numero],
|
104
|
+
initials: object[:sigla],
|
105
|
+
name: object[:nome],
|
106
|
+
category: object[:categoria]
|
107
|
+
},
|
108
|
+
events: formatted_events
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
def format_event(event)
|
113
|
+
{
|
114
|
+
movement: HELPER.tracking_event_status(event),
|
115
|
+
type: event[:tipo],
|
116
|
+
status: event[:status],
|
117
|
+
time: HELPER.convert_string_to_date(event[:data], event[:hora]),
|
118
|
+
description: event[:descricao],
|
119
|
+
detail: event[:detalhe],
|
120
|
+
city: event[:cidade],
|
121
|
+
state: event[:uf],
|
122
|
+
destination: format_destination(event[:destino]),
|
123
|
+
site: {
|
124
|
+
description: event[:local],
|
125
|
+
zip_code: event[:codigo]
|
126
|
+
}
|
127
|
+
}
|
128
|
+
end
|
129
|
+
|
130
|
+
def format_destination(destination)
|
131
|
+
return nil if destination.nil?
|
132
|
+
{
|
133
|
+
city: destination[:cidade],
|
134
|
+
neighborhood: destination[:bairro],
|
135
|
+
state: destination[:uf],
|
136
|
+
site: {
|
137
|
+
description: destination[:local],
|
138
|
+
zip_code: destination[:codigo]
|
139
|
+
}
|
140
|
+
}
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CorreiosException < StandardError
|
2
|
+
def generate_exception(message)
|
3
|
+
raise CorreiosException, format_error_message(message)
|
4
|
+
end
|
5
|
+
|
6
|
+
def format_error_message(message)
|
7
|
+
message = message.to_s.gsub('(soap:Server)', '')
|
8
|
+
message = message.strip
|
9
|
+
message.capitalize
|
10
|
+
end
|
11
|
+
end
|