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,186 @@
1
+ # Pricefier
2
+ require_relative 'pricefier/requests/calculate_deadline'
3
+ require_relative 'pricefier/requests/calculate_deadline_with_date'
4
+ require_relative 'pricefier/requests/calculate_deadline_with_restrictions'
5
+ require_relative 'pricefier/requests/calculate_price'
6
+ require_relative 'pricefier/requests/calculate_price_deadline'
7
+ require_relative 'pricefier/requests/calculate_price_deadline_with_date'
8
+ require_relative 'pricefier/requests/calculate_price_deadline_with_restrictions'
9
+ require_relative 'pricefier/requests/calculate_price_fac'
10
+ require_relative 'pricefier/requests/calculate_price_with_date'
11
+ require_relative 'pricefier/requests/list_services'
12
+ require_relative 'pricefier/requests/list_services_star'
13
+
14
+ # Reverse Logistics
15
+ require_relative 'reverse_logistics/requests/calculate_ticket_number_check_digit'
16
+ require_relative 'reverse_logistics/requests/cancel_shipping'
17
+ require_relative 'reverse_logistics/requests/create_shippings'
18
+ require_relative 'reverse_logistics/requests/create_shippings_with_collection'
19
+ require_relative 'reverse_logistics/requests/request_ticket_numbers'
20
+ require_relative 'reverse_logistics/requests/track_shipping'
21
+ require_relative 'reverse_logistics/requests/track_shippings_by_date'
22
+
23
+ # Sigep
24
+ require_relative 'sigep/requests/cancel_shipping'
25
+ require_relative 'sigep/requests/calculate_label_number_check_digit'
26
+ require_relative 'sigep/requests/check_card_status'
27
+ require_relative 'sigep/requests/check_service_availability'
28
+ require_relative 'sigep/requests/create_shippings'
29
+ require_relative 'sigep/requests/request_label_numbers'
30
+ require_relative 'sigep/requests/request_shippings_xml'
31
+ require_relative 'sigep/requests/search_available_additional_services'
32
+ require_relative 'sigep/requests/search_customer'
33
+ require_relative 'sigep/requests/search_zip_code'
34
+ require_relative 'sigep/requests/track_shippings'
35
+
36
+ # SRO
37
+ require_relative 'SRO/requests/track_shippings'
38
+ require_relative 'SRO/requests/track_shippings_list'
39
+
40
+ require_relative 'credentials'
41
+
42
+ module Correios
43
+ def self.test
44
+ 'YAY! Correios_gem is working! Have fun!'
45
+ end
46
+
47
+ def self.authenticate
48
+ yield(credentials)
49
+ end
50
+
51
+ def self.credentials
52
+ @credentials ||= Credentials.new
53
+ end
54
+
55
+ module Pricefier
56
+ def self.calculate_deadline(data = {})
57
+ CalculateDeadline.new(data).request
58
+ end
59
+
60
+ def self.calculate_deadline_with_date(data = {})
61
+ CalculateDeadlineWithDate.new(data).request
62
+ end
63
+
64
+ def self.calculate_deadline_with_restrictions(data = {})
65
+ CalculateDeadlineWithRestrictions.new(data).request
66
+ end
67
+
68
+ def self.calculate_price(data = {})
69
+ CalculatePrice.new(data).request
70
+ end
71
+
72
+ def self.calculate_price_deadline(data = {})
73
+ CalculatePriceDeadline.new(data).request
74
+ end
75
+
76
+ def self.calculate_price_deadline_with_date(data = {})
77
+ CalculatePriceDeadlineWithDate.new(data).request
78
+ end
79
+
80
+ def self.calculate_price_deadline_with_restrictions(data = {})
81
+ CalculatePriceDeadlineWithRestrictions.new(data).request
82
+ end
83
+
84
+ def self.calculate_price_fac(data = {})
85
+ CalculatePriceFAC.new(data).request
86
+ end
87
+
88
+ def self.calculate_price_with_date(data = {})
89
+ CalculatePriceWithDate.new(data).request
90
+ end
91
+
92
+ def self.list_services(data = {})
93
+ ListServices.new(data).request
94
+ end
95
+
96
+ def self.list_services_star(data = {})
97
+ ListServicesSTAR.new(data).request
98
+ end
99
+ end
100
+
101
+ module ReverseLogistics
102
+ def self.calculate_ticket_number_check_digit(data = {})
103
+ CalculateTicketNumberCheckDigit.new(data).request
104
+ end
105
+
106
+ def self.cancel_shipping(data = {})
107
+ CancelShipping.new(data).request
108
+ end
109
+
110
+ def self.create_shippings(data = {})
111
+ CreateShippings.new(data).request
112
+ end
113
+
114
+ def self.create_shippings_with_collection(data = {})
115
+ CreateShippingsWithCollection.new(data).request
116
+ end
117
+
118
+ def self.request_ticket_numbers(data = {})
119
+ RequestTicketNumbers.new(data).request
120
+ end
121
+
122
+ def self.track_shipping(data = {})
123
+ TrackShipping.new(data).request
124
+ end
125
+
126
+ def self.track_shippings_by_date(data = {})
127
+ TrackShippingsByDate.new(data).request
128
+ end
129
+ end
130
+
131
+ module Sigep
132
+ def self.calculate_label_number_check_digit(data = {})
133
+ CalculateLabelNumberCheckDigit.new(data).request
134
+ end
135
+
136
+ def self.cancel_shipping(data = {})
137
+ CancelShipping.new(data).request
138
+ end
139
+
140
+ def self.check_card_status(data = {})
141
+ CheckCardStatus.new(data).request
142
+ end
143
+
144
+ def self.check_service_availability(data = {})
145
+ CheckServiceAvailability.new(data).request
146
+ end
147
+
148
+ def self.create_shippings(data = {})
149
+ CreateShippings.new(data).request
150
+ end
151
+
152
+ def self.request_label_numbers(data = {})
153
+ RequestLabelNumbers.new(data).request
154
+ end
155
+
156
+ def self.request_shippings_xml(data = {})
157
+ RequestShippingsXML.new(data).request
158
+ end
159
+
160
+ def self.search_available_additional_services(data = {})
161
+ SearchAvailableAdditionalServices.new(data).request
162
+ end
163
+
164
+ def self.search_customer(data = {})
165
+ SearchCustomer.new(data).request
166
+ end
167
+
168
+ def self.search_zip_code(data = {})
169
+ SearchZipCode.new(data).request
170
+ end
171
+
172
+ def self.track_shippings(data = {})
173
+ TrackShippings.new(data).request
174
+ end
175
+ end
176
+
177
+ module SRO
178
+ def self.track_shippings(data = {})
179
+ TrackShippings.new(data).request
180
+ end
181
+
182
+ def self.track_shippings_list(data = {})
183
+ TrackShippingsList.new(data).request
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,27 @@
1
+ module Correios
2
+ class Credentials
3
+ attr_accessor :sigep_user,
4
+ :sigep_password,
5
+ :administrative_code,
6
+ :contract,
7
+ :card,
8
+ :cnpj,
9
+ :reverse_logistics_user,
10
+ :reverse_logistics_password,
11
+ :sro_user,
12
+ :sro_password
13
+
14
+ def initialize
15
+ self.sigep_user = sigep_user
16
+ self.sigep_password = sigep_password
17
+ self.administrative_code = administrative_code
18
+ self.contract = contract
19
+ self.card = card
20
+ self.cnpj = cnpj
21
+ self.reverse_logistics_user = reverse_logistics_user
22
+ self.reverse_logistics_password = reverse_logistics_password
23
+ self.sro_user = sro_user
24
+ self.sro_password = sro_password
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ require 'savon'
2
+
3
+ module Correios
4
+ module Pricefier
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
+ 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?wsdl'
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,72 @@
1
+ require 'date'
2
+
3
+ module Correios
4
+ module Pricefier
5
+ class Helper
6
+ def namespaces
7
+ {
8
+ 'xmlns:soap' => 'http://www.w3.org/2003/05/soap-envelope',
9
+ 'xmlns:ns1' => 'http://tempuri.org/'
10
+ }
11
+ end
12
+
13
+ def calculate_deadline_date(days, saturday, date = Date.today)
14
+ if saturday
15
+ days.to_i.times do
16
+ date += 1.days
17
+ date += 1.days if date.sunday?
18
+ end
19
+ else
20
+ days.to_i.times do
21
+ date += 1.days
22
+ date += 1.days if deadline.sunday? || deadline.saturday?
23
+ end
24
+ end
25
+ date
26
+ end
27
+
28
+ def convert_string_to_date(date)
29
+ Date.strptime(date, '%d/%m/%Y')
30
+ end
31
+
32
+ def convert_date_to_string(date)
33
+ date.strftime('%d/%m/%Y')
34
+ end
35
+
36
+ def convert_string_to_bool(string)
37
+ string == 'S'
38
+ end
39
+
40
+ def convert_bool_to_string(bool)
41
+ return 'S' if bool
42
+ 'N'
43
+ end
44
+
45
+ def convert_string_to_float(string)
46
+ string = string.tr(',', '.')
47
+ string.to_f
48
+ end
49
+
50
+ def object_type(type)
51
+ case type
52
+ when :letter_envelope
53
+ 3
54
+ when :box
55
+ 1
56
+ when :prism
57
+ 1
58
+ when :cylinder
59
+ 2
60
+ end
61
+ end
62
+
63
+ def format_service_codes(services)
64
+ services_string = ''
65
+ services.each do |service|
66
+ services_string += "#{service},"
67
+ end
68
+ services_string
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,100 @@
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 CalculateDeadline < CorreiosException
11
+ HELPER = Helper.new
12
+ CLIENT = Client.new
13
+
14
+ def initialize(data = {})
15
+ @show_request = data[:show_request]
16
+ @service_codes = data[:service_codes]
17
+ @source_zip_code = data[:source_zip_code]
18
+ @target_zip_code = data[:target_zip_code]
19
+ super()
20
+ end
21
+
22
+ def request
23
+ puts xml if @show_request == true
24
+ begin
25
+ format_response(CLIENT.client.call(:calc_prazo,
26
+ soap_action: 'http://tempuri.org/CalcPrazo',
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'].CalcPrazo do
45
+ xml.nCdServico HELPER.format_service_codes(@service_codes)
46
+ xml.sCepOrigem @source_zip_code
47
+ xml.sCepDestino @target_zip_code
48
+ end
49
+ end
50
+ end
51
+ end.doc.root.to_xml
52
+ end
53
+
54
+ def format_response(response)
55
+ response = response[:calc_prazo_response][:calc_prazo_result]
56
+
57
+ services = response[:servicos][:c_servico]
58
+ services = [services] if services.is_a?(Hash)
59
+
60
+ formatted_services = []
61
+ services.each do |service|
62
+ formatted_services << format_service(service)
63
+ end
64
+
65
+ {
66
+ services: formatted_services
67
+ }
68
+ end
69
+
70
+ def format_service(service)
71
+ if [0, 10, 11].include?(service[:erro].to_i)
72
+ {
73
+ code: service[:codigo],
74
+ delivery_at_home: HELPER.convert_string_to_bool(
75
+ service[:entrega_domiciliar]
76
+ ),
77
+ delivery_on_saturdays: HELPER.convert_string_to_bool(
78
+ service[:entrega_sabado]
79
+ ),
80
+ note: service[:obs_fim],
81
+ deadline: {
82
+ days: service[:prazo_entrega].to_i,
83
+ date: HELPER.convert_string_to_date(
84
+ service[:data_max_entrega]
85
+ ),
86
+ }
87
+ }
88
+ else
89
+ {
90
+ code: service[:codigo],
91
+ error: {
92
+ code: service[:erro],
93
+ description: service[:msg_erro]
94
+ }
95
+ }
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,102 @@
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 CalculateDeadlineWithDate < CorreiosException
11
+ HELPER = Helper.new
12
+ CLIENT = Client.new
13
+
14
+ def initialize(data = {})
15
+ @show_request = data[:show_request]
16
+ @service_codes = data[:service_codes]
17
+ @source_zip_code = data[:source_zip_code]
18
+ @target_zip_code = data[:target_zip_code]
19
+ @reference_date = data[:reference_date]
20
+ super()
21
+ end
22
+
23
+ def request
24
+ puts xml if @show_request == true
25
+ begin
26
+ format_response(CLIENT.client.call(:calc_prazo_data,
27
+ soap_action: 'http://tempuri.org/CalcPrazoData',
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'].CalcPrazoData do
46
+ xml.nCdServico HELPER.format_service_codes(@service_codes)
47
+ xml.sCepOrigem @source_zip_code
48
+ xml.sCepDestino @target_zip_code
49
+ xml.sDtCalculo HELPER.convert_date_to_string(@reference_date)
50
+ end
51
+ end
52
+ end
53
+ end.doc.root.to_xml
54
+ end
55
+
56
+ def format_response(response)
57
+ response = response[:calc_prazo_data_response][:calc_prazo_data_result]
58
+
59
+ services = response[:servicos][:c_servico]
60
+ services = [services] if services.is_a?(Hash)
61
+
62
+ formatted_services = []
63
+ services.each do |service|
64
+ formatted_services << format_service(service)
65
+ end
66
+
67
+ {
68
+ services: formatted_services
69
+ }
70
+ end
71
+
72
+ def format_service(service)
73
+ if [0, 10, 11].include?(service[:erro].to_i)
74
+ {
75
+ code: service[:codigo],
76
+ delivery_at_home: HELPER.convert_string_to_bool(
77
+ service[:entrega_domiciliar]
78
+ ),
79
+ delivery_on_saturdays: HELPER.convert_string_to_bool(
80
+ service[:entrega_sabado]
81
+ ),
82
+ note: service[:obs_fim],
83
+ deadline: {
84
+ days: service[:prazo_entrega].to_i,
85
+ date: HELPER.convert_string_to_date(
86
+ service[:data_max_entrega]
87
+ )
88
+ }
89
+ }
90
+ else
91
+ {
92
+ code: service[:codigo],
93
+ error: {
94
+ code: service[:erro],
95
+ description: service[:msg_erro]
96
+ }
97
+ }
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end