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
@@ -0,0 +1,152 @@
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 ReverseLogistics
10
+ class CreateShippingsWithCollection < 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
+ @receiver = data[:receiver]
19
+ @service_code = data[:service_code]
20
+ @shippings = data[:shippings]
21
+ super()
22
+ end
23
+
24
+ def request
25
+ puts xml if @show_request == true
26
+ begin
27
+ format_response(CLIENT.client.call(:solicitar_postagem_simultanea,
28
+ soap_action: '',
29
+ xml: xml).to_hash)
30
+ rescue Savon::SOAPFault => error
31
+ generate_exception(error)
32
+ rescue Savon::HTTPError => error
33
+ if error.http.code == 401
34
+ generate_exception("Unauthorized (#{error.http.code}).")
35
+ end
36
+ generate_exception("Unknown HTTP error (#{error.http.code}).")
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def xml
43
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
44
+ xml['soap'].Envelope(HELPER.namespaces) do
45
+ xml['soap'].Body do
46
+ xml['ns1'].solicitarPostagemSimultanea do
47
+ parent_namespace = xml.parent.namespace
48
+ xml.parent.namespace = nil
49
+
50
+ xml.codAdministrativo @credentials.administrative_code
51
+ xml.cartao @credentials.card
52
+ xml.codigo_servico @service_code
53
+ xml.destinatario do
54
+ receiver_address = @receiver[:address]
55
+ xml.nome @receiver[:name]
56
+ xml.ddd @receiver[:phone][0, 2]
57
+ xml.telefone @receiver[:phone][2, @receiver[:phone].length - 1]
58
+ xml.email @receiver[:email]
59
+ xml.logradouro receiver_address[:street]
60
+ xml.numero receiver_address[:number]
61
+ xml.complemento receiver_address[:additional]
62
+ xml.bairro receiver_address[:neighborhood]
63
+ xml.cidade receiver_address[:city]
64
+ xml.uf receiver_address[:state]
65
+ xml.cep receiver_address[:zip_code]
66
+ xml.referencia
67
+ end
68
+ @shippings.each do |shipping|
69
+ goods = shipping[:goods] || []
70
+ objects = shipping[:objects] || [{}]
71
+ xml.coletas_solicitadas do
72
+ xml.tipo HELPER.shipping_type(shipping[:type])
73
+ xml.id_cliente shipping[:code]
74
+ xml.valor_declarado shipping[:declared_value]
75
+ xml.descricao shipping[:description]
76
+ xml.cklist shipping[:check_list]
77
+ xml.documento shipping[:document]
78
+ xml.obj shipping[:label_number]
79
+ xml.obs shipping[:note]
80
+ xml.remetente do
81
+ sender = shipping[:sender]
82
+ sender_address = shipping[:sender][:address]
83
+ xml.nome sender[:name]
84
+ xml.ddd sender[:phone][0, 2]
85
+ xml.telefone sender[:phone][2, sender[:phone].length - 1]
86
+ xml.ddd_celular sender[:cellphone][0, 2]
87
+ xml.celular sender[:cellphone][2, sender[:phone].length - 1]
88
+ xml.email sender[:email]
89
+ xml.sms HELPER.bool_to_string(sender[:send_sms])
90
+ xml.identificacao sender[:document]
91
+ xml.logradouro sender_address[:street]
92
+ xml.numero sender_address[:number]
93
+ xml.complemento sender_address[:additional]
94
+ xml.bairro sender_address[:neighborhood]
95
+ xml.referencia
96
+ xml.cidade sender_address[:city]
97
+ xml.uf sender_address[:state]
98
+ xml.cep sender_address[:zip_code]
99
+ end
100
+ goods.each do |good|
101
+ xml.produto do
102
+ xml.codigo good[:code]
103
+ xml.tipo good[:type]
104
+ xml.qtd good[:amount]
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ xml.parent.namespace = parent_namespace
111
+ end
112
+ end
113
+ end
114
+ end.doc.root.to_xml
115
+ end
116
+
117
+ def format_response(response)
118
+ response = response[:solicitar_postagem_simultanea_response][:solicitar_postagem_simultanea]
119
+ generate_exception(response[:msg_erro]) if response[:cod_erro].to_i != 0
120
+
121
+ shippings = response[:resultado_solicitacao]
122
+ shippings = [shippings] if shippings.is_a?(Hash)
123
+
124
+ formatted_shippings = []
125
+ shippings.each do |shipping|
126
+ formatted_shippings << format_shipping(shipping)
127
+ end
128
+
129
+ { shippings: formatted_shippings }
130
+ end
131
+
132
+ def format_shipping(shipping)
133
+ if shipping[:codigo_erro].to_i.zero?
134
+ {
135
+ type: HELPER.shipping_type_inverse(shipping[:tipo]),
136
+ code: shipping[:id_cliente],
137
+ ticket_number: shipping[:numero_coleta],
138
+ label_number: shipping[:numero_etiqueta],
139
+ object_id: shipping[:id_obj],
140
+ deadline: HELPER.convert_string_to_date(shipping[:prazo])
141
+ }
142
+ else
143
+ {
144
+ type: HELPER.shipping_type_inverse(shipping[:tipo]),
145
+ code: shipping[:id_cliente],
146
+ error: shipping[:descricao_erro]
147
+ }
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,90 @@
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 ReverseLogistics
10
+ class RequestTicketNumbers < 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
+ @ticket_type = data[:ticket_type]
19
+ @service = data[:service]
20
+ @amount = data[:amount]
21
+ super()
22
+ end
23
+
24
+ def request
25
+ puts xml if @show_request == true
26
+ begin
27
+ format_response(CLIENT.client.call(:solicitar_range,
28
+ soap_action: '',
29
+ xml: xml).to_hash)
30
+ rescue Savon::SOAPFault => error
31
+ generate_exception(error)
32
+ rescue Savon::HTTPError => error
33
+ if error.http.code == 401
34
+ generate_exception("Unauthorized (#{error.http.code}).")
35
+ end
36
+ generate_exception("Unknown HTTP error (#{error.http.code}).")
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def xml
43
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
44
+ xml['soap'].Envelope(HELPER.namespaces) do
45
+ xml['soap'].Body do
46
+ xml['ns1'].solicitarRange do
47
+ parent_namespace = xml.parent.namespace
48
+ xml.parent.namespace = nil
49
+
50
+ xml.codAdministrativo @credentials.administrative_code
51
+ xml.tipo HELPER.ticket_type(@ticket_type)
52
+ xml.servico service(@service)
53
+ xml.quantidade @amount
54
+
55
+ xml.parent.namespace = parent_namespace
56
+ end
57
+ end
58
+ end
59
+ end.doc.root.to_xml
60
+ end
61
+
62
+ def format_response(response)
63
+ response = response[:solicitar_range_response][:solicitar_range]
64
+ generate_exception(response[:msg_erro]) if response[:cod_erro] != '0'
65
+
66
+ initial_number = response[:faixa_inicial].to_i
67
+ final_number = response[:faixa_final].to_i
68
+
69
+ ticket_numbers = []
70
+ while initial_number <= final_number do
71
+ ticket_numbers << initial_number.to_s
72
+ initial_number += 1
73
+ end
74
+
75
+ { ticket_numbers: ticket_numbers }
76
+ end
77
+
78
+ def service(service)
79
+ case service
80
+ when :pac
81
+ 'LR'
82
+ when :sedex
83
+ 'LS'
84
+ when :e_sedex
85
+ 'LV'
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,121 @@
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 ReverseLogistics
10
+ class TrackShipping < 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
+ @ticket_number = data[:ticket_number]
19
+ @type = data[:type]
20
+ @result_type = data[:result_type]
21
+ super()
22
+ end
23
+
24
+ def request
25
+ puts xml if @show_request == true
26
+ begin
27
+ format_response(CLIENT.client.call(:acompanhar_pedido,
28
+ soap_action: '',
29
+ xml: xml).to_hash)
30
+ rescue Savon::SOAPFault => error
31
+ generate_exception(error)
32
+ rescue Savon::HTTPError => error
33
+ if error.http.code == 401
34
+ generate_exception("Unauthorized (#{error.http.code}).")
35
+ end
36
+ generate_exception("Unknown HTTP error (#{error.http.code}).")
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def xml
43
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
44
+ xml['soap'].Envelope(HELPER.namespaces) do
45
+ xml['soap'].Body do
46
+ xml['ns1'].acompanharPedido do
47
+ parent_namespace = xml.parent.namespace
48
+ xml.parent.namespace = nil
49
+
50
+ xml.codAdministrativo @credentials.administrative_code
51
+ xml.numeroPedido @ticket_number
52
+ xml.tipoSolicitacao HELPER.shipping_type(@type)
53
+ xml.tipoBusca HELPER.tracking_result_type(@result_type)
54
+
55
+ xml.parent.namespace = parent_namespace
56
+ end
57
+ end
58
+ end
59
+ end.doc.root.to_xml
60
+ end
61
+
62
+ def format_response(response)
63
+ response = response[:acompanhar_pedido_response][:acompanhar_pedido]
64
+ generate_exception(response[:msg_erro]) if response[:cod_erro].to_i != 0
65
+
66
+ events = response[:coleta][:historico]
67
+ events = [events] if events.is_a?(Hash)
68
+
69
+ objects = response[:coleta][:objeto]
70
+ objects = [objects] if objects.is_a?(Hash)
71
+
72
+ formatted_events = []
73
+ events.each do |event|
74
+ formatted_events << format_event(event)
75
+ end
76
+
77
+ formatted_objects = []
78
+ objects.each do |object|
79
+ formatted_objects << format_object(object)
80
+ end
81
+
82
+ {
83
+ ticket_number: response[:coleta][:numero_pedido],
84
+ type: HELPER.shipping_type_inverse(
85
+ response[:tipo_solicitacao]
86
+ ),
87
+ code: response[:coleta][:controle_cliente],
88
+ events: formatted_events,
89
+ objects: formatted_objects
90
+ }
91
+ end
92
+
93
+ def format_event(event)
94
+ {
95
+ status: event[:status],
96
+ description: event[:descricao_status],
97
+ time: HELPER.convert_string_to_date_time(
98
+ event[:data_atualizacao], event[:hora_atualizacao]
99
+ ),
100
+ note: event[:observacao]
101
+ }
102
+ end
103
+
104
+ def format_object(object)
105
+ shipping_price = object[:valor_postagem] || 0
106
+ {
107
+ label_number: object[:numero_etiqueta],
108
+ id: object[:controle_objeto_cliente],
109
+ shipping_price: shipping_price.to_f,
110
+ last_event: {
111
+ status: object[:ultimo_status],
112
+ description: object[:descricao_status],
113
+ time: HELPER.convert_string_to_date_time(
114
+ object[:data_ultima_atualizacao], object[:hora_ultima_atualizacao]
115
+ )
116
+ }
117
+ }
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,133 @@
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 ReverseLogistics
10
+ class TrackShippingsByDate < 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
+ @type = data[:type]
19
+ @date = data[:date]
20
+ super()
21
+ end
22
+
23
+ def request
24
+ puts xml if @show_request == true
25
+ begin
26
+ format_response(CLIENT.client.call(:acompanhar_pedido_por_data,
27
+ soap_action: '',
28
+ xml: xml).to_hash)
29
+ rescue Savon::SOAPFault => error
30
+ generate_exception(error)
31
+ rescue Savon::HTTPError => error
32
+ if error.http.code == 401
33
+ generate_exception("Unauthorized (#{error.http.code}).")
34
+ end
35
+ generate_exception("Unknown HTTP error (#{error.http.code}).")
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def xml
42
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
43
+ xml['soap'].Envelope(HELPER.namespaces) do
44
+ xml['soap'].Body do
45
+ xml['ns1'].acompanharPedidoPorData do
46
+ parent_namespace = xml.parent.namespace
47
+ xml.parent.namespace = nil
48
+
49
+ xml.codAdministrativo @credentials.administrative_code
50
+ xml.tipoSolicitacao HELPER.shipping_type(@type)
51
+ xml.data HELPER.convert_date_to_string(@date)
52
+
53
+ xml.parent.namespace = parent_namespace
54
+ end
55
+ end
56
+ end
57
+ end.doc.root.to_xml
58
+ end
59
+
60
+ def format_response(response)
61
+ response = response[:acompanhar_pedido_por_data_response][:acompanhar_pedido_por_data]
62
+ generate_exception(response[:msg_erro]) if response[:cod_erro].present?
63
+
64
+ shippings = response[:coleta]
65
+ shippings = [shippings] if shippings.is_a?(Hash)
66
+
67
+ formatted_shippings = []
68
+ shippings.each do |shipping|
69
+ formatted_shippings << format_shippping(shipping)
70
+ end
71
+
72
+ {
73
+ type: HELPER.shipping_type_inverse(
74
+ response[:tipo_solicitacao]
75
+ ),
76
+ shippings: formatted_shippings
77
+ }
78
+ end
79
+
80
+ def format_shippping(shipping)
81
+ events = shipping[:historico]
82
+ events = [events] if events.is_a?(Hash)
83
+
84
+ objects = shipping[:objeto]
85
+ objects = [objects] if objects.is_a?(Hash)
86
+
87
+ formatted_events = []
88
+ events.each do |event|
89
+ formatted_events << format_event(event)
90
+ end
91
+
92
+ formatted_objects = []
93
+ objects.each do |object|
94
+ formatted_objects << format_object(object)
95
+ end
96
+
97
+ {
98
+ ticket_number: shipping[:numero_pedido],
99
+ code: shipping[:controle_cliente],
100
+ events: formatted_events,
101
+ objects: formatted_objects
102
+ }
103
+ end
104
+
105
+ def format_event(event)
106
+ {
107
+ status: event[:status],
108
+ description: event[:descricao_status],
109
+ time: HELPER.convert_string_to_date_time(
110
+ event[:data_atualizacao], event[:hora_atualizacao]
111
+ ),
112
+ note: event[:observacao]
113
+ }
114
+ end
115
+
116
+ def format_object(object)
117
+ shipping_price = object[:valor_postagem] || 0
118
+ {
119
+ label_number: object[:numero_etiqueta],
120
+ id: object[:controle_objeto_cliente],
121
+ shipping_price: shipping_price.to_f,
122
+ last_event: {
123
+ status: object[:ultimo_status],
124
+ description: object[:descricao_status],
125
+ time: HELPER.convert_string_to_date_time(
126
+ object[:data_ultima_atualizacao], object[:hora_ultima_atualizacao]
127
+ )
128
+ }
129
+ }
130
+ end
131
+ end
132
+ end
133
+ end