correios_gem 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/lib/SRO/client.rb +25 -0
  3. data/lib/SRO/helper.rb +118 -0
  4. data/lib/SRO/requests/track_shippings.rb +142 -0
  5. data/lib/SRO/requests/track_shippings_list.rb +144 -0
  6. data/lib/correios_exception.rb +11 -0
  7. data/lib/correios_gem.rb +186 -0
  8. data/lib/credentials.rb +27 -0
  9. data/lib/pricefier/client.rb +20 -0
  10. data/lib/pricefier/helper.rb +72 -0
  11. data/lib/pricefier/requests/calculate_deadline.rb +100 -0
  12. data/lib/pricefier/requests/calculate_deadline_with_date.rb +102 -0
  13. data/lib/pricefier/requests/calculate_deadline_with_restrictions.rb +102 -0
  14. data/lib/pricefier/requests/calculate_price.rb +123 -0
  15. data/lib/pricefier/requests/calculate_price_deadline.rb +138 -0
  16. data/lib/pricefier/requests/calculate_price_deadline_with_date.rb +142 -0
  17. data/lib/pricefier/requests/calculate_price_deadline_with_restrictions.rb +142 -0
  18. data/lib/pricefier/requests/calculate_price_fac.rb +106 -0
  19. data/lib/pricefier/requests/calculate_price_with_date.rb +125 -0
  20. data/lib/pricefier/requests/list_services.rb +87 -0
  21. data/lib/pricefier/requests/list_services_star.rb +87 -0
  22. data/lib/reverse_logistics/client.rb +34 -0
  23. data/lib/reverse_logistics/helper.rb +95 -0
  24. data/lib/reverse_logistics/requests/calculate_ticket_number_check_digit.rb +66 -0
  25. data/lib/reverse_logistics/requests/cancel_shipping.rb +70 -0
  26. data/lib/reverse_logistics/requests/create_shippings.rb +166 -0
  27. data/lib/reverse_logistics/requests/create_shippings_with_collection.rb +152 -0
  28. data/lib/reverse_logistics/requests/request_ticket_numbers.rb +90 -0
  29. data/lib/reverse_logistics/requests/track_shipping.rb +121 -0
  30. data/lib/reverse_logistics/requests/track_shippings_by_date.rb +133 -0
  31. data/lib/sigep/client.rb +29 -0
  32. data/lib/sigep/helper.rb +234 -0
  33. data/lib/sigep/requests/calculate_label_number_check_digit.rb +72 -0
  34. data/lib/sigep/requests/cancel_shipping.rb +72 -0
  35. data/lib/sigep/requests/check_card_status.rb +69 -0
  36. data/lib/sigep/requests/check_service_availability.rb +91 -0
  37. data/lib/sigep/requests/create_shippings.rb +70 -0
  38. data/lib/sigep/requests/request_label_numbers.rb +76 -0
  39. data/lib/sigep/requests/request_shippings_xml.rb +208 -0
  40. data/lib/sigep/requests/search_available_additional_services.rb +62 -0
  41. data/lib/sigep/requests/search_customer.rb +129 -0
  42. data/lib/sigep/requests/search_zip_code.rb +63 -0
  43. data/lib/sigep/requests/track_shippings.rb +145 -0
  44. 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