correios_gem 1.4.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.
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