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
@@ -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