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,87 @@
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 Pricefier
10
+ class ListServicesSTAR < CorreiosException
11
+ HELPER = Helper.new
12
+ CLIENT = Client.new
13
+
14
+ def initialize(data = {})
15
+ @show_request = data[:show_request]
16
+ super()
17
+ end
18
+
19
+ def request
20
+ puts xml if @show_request == true
21
+ begin
22
+ format_response(CLIENT.client.call(:calc_preco,
23
+ soap_action: 'http://tempuri.org/ListaServicosSTAR',
24
+ xml: xml).to_hash)
25
+ rescue Savon::SOAPFault => error
26
+ generate_exception(error)
27
+ rescue Savon::HTTPError => error
28
+ if error.http.code == 401
29
+ generate_exception("Unauthorized (#{error.http.code}).")
30
+ end
31
+ generate_exception("Unknown HTTP error (#{error.http.code}).")
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def xml
38
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
39
+ xml['soap'].Envelope(HELPER.namespaces) do
40
+ xml['soap'].Body do
41
+ xml['ns1'].ListaServicosSTAR
42
+ end
43
+ end
44
+ end.doc.root.to_xml
45
+ end
46
+
47
+ def format_response(response)
48
+ response = response[:lista_servicos_star_response][:lista_servicos_star_result]
49
+
50
+ services = response[:servicos_calculo][:c_servicos_calculo]
51
+ services = [services] if services.is_a?(Hash)
52
+
53
+ formatted_services = []
54
+ services.each do |service|
55
+ formatted_services << format_service(service)
56
+ end
57
+
58
+ {
59
+ services: formatted_services
60
+ }
61
+ end
62
+
63
+ def format_service(service)
64
+ if service[:erro].to_i == 0
65
+ {
66
+ code: service[:codigo],
67
+ description: service[:descricao].strip,
68
+ calculate_price: HELPER.convert_string_to_bool(
69
+ service[:calcula_preco]
70
+ ),
71
+ calculate_deadline: HELPER.convert_string_to_bool(
72
+ service[:calcula_prazo]
73
+ )
74
+ }
75
+ else
76
+ {
77
+ code: service[:codigo],
78
+ error: {
79
+ code: service[:erro],
80
+ description: service[:msg_erro]
81
+ }
82
+ }
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,34 @@
1
+ require 'savon'
2
+
3
+ module Correios
4
+ module ReverseLogistics
5
+ class Client
6
+ def client
7
+ credentials = Correios.credentials
8
+
9
+ Savon.client(
10
+ wsdl: wsdl,
11
+ basic_auth: [
12
+ credentials.reverse_logistics_user,
13
+ credentials.reverse_logistics_password
14
+ ]
15
+ )
16
+ end
17
+
18
+ private
19
+
20
+ def wsdl
21
+ if test_env?
22
+ 'https://apphom.correios.com.br/logisticaReversaWS/logisticaReversaService/logisticaReversaWS?wsdl'
23
+ else
24
+ 'https://cws.correios.com.br/logisticaReversaWS/logisticaReversaService/logisticaReversaWS?wsdl'
25
+ end
26
+ end
27
+
28
+ def test_env?
29
+ (defined?(Rails) && ENV['RAILS_ENV'].in?(%w[test development]) ||
30
+ ENV['GEM_ENV'].in?(%w[test development]))
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,95 @@
1
+ require 'date'
2
+
3
+ module Correios
4
+ module ReverseLogistics
5
+ class Helper
6
+ def namespaces
7
+ {
8
+ 'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/',
9
+ 'xmlns:ns1' => 'http://service.logisticareversa.correios.com.br/'
10
+ }
11
+ end
12
+
13
+ def bool_to_string(bool)
14
+ 'S' if bool
15
+ 'N'
16
+ end
17
+
18
+ def bool_to_int(bool)
19
+ 1 if bool
20
+ 0
21
+ end
22
+
23
+ def deadline(value, type)
24
+ if type == :authorization
25
+ return value if value.is_a?(Numeric)
26
+
27
+ Date.today - value
28
+ else
29
+ return (Date.today + value).strftime('%d/%m/%Y') if value.is_a?(Numeric)
30
+
31
+ value.strftime('%d/%m/%Y')
32
+ end
33
+ end
34
+
35
+ def shipping_type(type)
36
+ case type
37
+ when :authorization
38
+ 'A'
39
+ when :pickup
40
+ 'C'
41
+ end
42
+ end
43
+
44
+ def shipping_type_inverse(type)
45
+ case type
46
+ when 'A'
47
+ :authorization
48
+ when 'C'
49
+ :pickup
50
+ end
51
+ end
52
+
53
+ def ticket_type(type)
54
+ case type
55
+ when :authorization
56
+ 'AP'
57
+ when :pickup
58
+ 'LR'
59
+ end
60
+ end
61
+
62
+ def additional_services(services)
63
+ nil if services.nil?
64
+
65
+ services_string = ''
66
+ services.each do |service|
67
+ services_string += "#{service},"
68
+ end
69
+ services_string
70
+ end
71
+
72
+ def convert_string_to_date(date)
73
+ Date.strptime(date, '%d/%m/%Y')
74
+ end
75
+
76
+ def tracking_result_type(result_type)
77
+ case result_type
78
+ when :last_event
79
+ 'U'
80
+ when :all_events
81
+ 'H'
82
+ end
83
+ end
84
+
85
+ def convert_string_to_date_time(date, time)
86
+ time = time.strftime('%H:%M:%S')
87
+ Time.strptime("#{date} #{time}", '%d-%m-%Y %H:%M:%S')
88
+ end
89
+
90
+ def convert_date_to_string(date)
91
+ date.strftime('%d/%m/%Y')
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,66 @@
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 CalculateTicketNumberCheckDigit < CorreiosException
11
+ HELPER = Helper.new
12
+ CLIENT = Client.new
13
+
14
+ def initialize(data = {})
15
+ @show_request = data[:show_request]
16
+ @ticket_number = data[:ticket_number]
17
+ super()
18
+ end
19
+
20
+ def request
21
+ puts xml if @show_request == true
22
+ begin
23
+ format_response(CLIENT.client.call(:calcular_digito_verificador,
24
+ soap_action: '',
25
+ xml: xml).to_hash)
26
+ rescue Savon::SOAPFault => error
27
+ generate_exception(error)
28
+ rescue Savon::HTTPError => error
29
+ if error.http.code == 401
30
+ generate_exception("Unauthorized (#{error.http.code}).")
31
+ end
32
+ generate_exception("Unknown HTTP error (#{error.http.code}).")
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def xml
39
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
40
+ xml['soap'].Envelope(HELPER.namespaces) do
41
+ xml['soap'].Body do
42
+ xml['ns1'].calcularDigitoVerificador do
43
+ parent_namespace = xml.parent.namespace
44
+ xml.parent.namespace = nil
45
+
46
+ xml.numero @ticket_number
47
+
48
+ xml.parent.namespace = parent_namespace
49
+ end
50
+ end
51
+ end
52
+ end.doc.root.to_xml
53
+ end
54
+
55
+ def format_response(response)
56
+ response = response[:calcular_digito_verificador_response][:calcular_digito_verificador]
57
+ generate_exception(response[:msg_erro]) if response[:cod_erro] != '0'
58
+
59
+ {
60
+ digit_checker: response[:digito],
61
+ ticket_number: response[:numero]
62
+ }
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,70 @@
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 CancelShipping < CorreiosException
11
+ HELPER = Helper.new
12
+ CLIENT = Client.new
13
+
14
+ def initialize(data = {})
15
+ @credentials = Correios.credentials
16
+
17
+ @ticket_number = data[:ticket_number]
18
+ @type = data[:type]
19
+ super()
20
+ end
21
+
22
+ def request
23
+ puts xml if @show_request == true
24
+ begin
25
+ format_response(CLIENT.client.call(:cancelar_pedido,
26
+ soap_action: '',
27
+ xml: xml).to_hash)
28
+ rescue Savon::SOAPFault => error
29
+ generate_exception(error)
30
+ rescue Savon::HTTPError => error
31
+ if error.http.code == 401
32
+ generate_exception("Unauthorized (#{error.http.code}).")
33
+ end
34
+ generate_exception("Unknown HTTP error (#{error.http.code}).")
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def xml
41
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
42
+ xml['soap'].Envelope(HELPER.namespaces) do
43
+ xml['soap'].Body do
44
+ xml['ns1'].cancelarPedido do
45
+ parent_namespace = xml.parent.namespace
46
+ xml.parent.namespace = nil
47
+
48
+ xml.codAdministrativo @credentials.administrative_code
49
+ xml.numeroPedido @ticket_number
50
+ xml.tipo HELPER.shipping_type(@type)
51
+
52
+ xml.parent.namespace = parent_namespace
53
+ end
54
+ end
55
+ end
56
+ end.doc.root.to_xml
57
+ end
58
+
59
+ def format_response(response)
60
+ response = response[:cancelar_pedido_response][:cancelar_pedido]
61
+ generate_exception(response[:msg_erro]) if response[:cod_erro].to_i != 0
62
+
63
+ {
64
+ ticket_number: response[:objeto_postal][:numero_pedido],
65
+ status: response[:objeto_postal][:status_pedido]
66
+ }
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,166 @@
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 CreateShippings < 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_reversa,
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'].solicitarPostagemReversa 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.numero shipping[:ticket_number]
74
+ xml.id_cliente shipping[:code]
75
+ xml.ag HELPER.deadline(shipping[:deadline], shipping[:type])
76
+ xml.cartao @credentials.card
77
+ xml.valor_declarado shipping[:_value]
78
+ xml.servico_adicional HELPER.additional_services(
79
+ shipping[:additional_services]
80
+ )
81
+ xml.descricao shipping[:description]
82
+ xml.ar HELPER.bool_to_int(shipping[:receipt_notification])
83
+ xml.cklist shipping[:check_list]
84
+ xml.documento shipping[:document]
85
+ xml.remetente do
86
+ sender = shipping[:sender]
87
+ sender_address = shipping[:sender][:address]
88
+ xml.nome sender[:name]
89
+ xml.ddd sender[:phone][0, 2]
90
+ xml.telefone sender[:phone][2, sender[:phone].length - 1]
91
+ xml.ddd_celular sender[:cellphone][0, 2]
92
+ xml.celular sender[:cellphone][2, sender[:phone].length - 1]
93
+ xml.email sender[:email]
94
+ xml.sms HELPER.bool_to_string(sender[:send_sms])
95
+ xml.identificacao sender[:document]
96
+ xml.logradouro sender_address[:street]
97
+ xml.numero sender_address[:number]
98
+ xml.complemento sender_address[:additional]
99
+ xml.bairro sender_address[:neighborhood]
100
+ xml.referencia
101
+ xml.cidade sender_address[:city]
102
+ xml.uf sender_address[:state]
103
+ xml.cep sender_address[:zip_code]
104
+ end
105
+ goods.each do |good|
106
+ xml.produto do
107
+ xml.codigo good[:code]
108
+ xml.tipo good[:type]
109
+ xml.qtd good[:amount]
110
+ end
111
+ end
112
+ objects.each do |object|
113
+ xml.obj_col do
114
+ xml.item 1
115
+ xml.id object[:id]
116
+ xml.desc object[:description]
117
+ xml.entrega object[:number]
118
+ xml.num
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ xml.parent.namespace = parent_namespace
125
+ end
126
+ end
127
+ end
128
+ end.doc.root.to_xml
129
+ end
130
+
131
+ def format_response(response)
132
+ response = response[:solicitar_postagem_reversa_response][:solicitar_postagem_reversa]
133
+ generate_exception(response[:msg_erro]) if response[:cod_erro].to_i != 0
134
+
135
+ shippings = response[:resultado_solicitacao]
136
+ shippings = [shippings] if shippings.is_a?(Hash)
137
+
138
+ formatted_shippings = []
139
+ shippings.each do |shipping|
140
+ formatted_shippings << format_shipping(shipping)
141
+ end
142
+
143
+ { shippings: formatted_shippings }
144
+ end
145
+
146
+ def format_shipping(shipping)
147
+ if shipping[:codigo_erro].to_i.zero?
148
+ {
149
+ type: HELPER.shipping_type_inverse(shipping[:tipo]),
150
+ code: shipping[:id_cliente],
151
+ ticket_number: shipping[:numero_coleta],
152
+ label_number: shipping[:numero_etiqueta],
153
+ object_id: shipping[:id_obj],
154
+ deadline: HELPER.convert_string_to_date(shipping[:prazo])
155
+ }
156
+ else
157
+ {
158
+ type: HELPER.shipping_type_inverse(shipping[:tipo]),
159
+ code: shipping[:id_cliente],
160
+ error: shipping[:descricao_erro]
161
+ }
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end