correios_gem 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/SRO/client.rb +25 -0
- data/lib/SRO/helper.rb +118 -0
- data/lib/SRO/requests/track_shippings.rb +142 -0
- data/lib/SRO/requests/track_shippings_list.rb +144 -0
- data/lib/correios_exception.rb +11 -0
- data/lib/correios_gem.rb +186 -0
- data/lib/credentials.rb +27 -0
- data/lib/pricefier/client.rb +20 -0
- data/lib/pricefier/helper.rb +72 -0
- data/lib/pricefier/requests/calculate_deadline.rb +100 -0
- data/lib/pricefier/requests/calculate_deadline_with_date.rb +102 -0
- data/lib/pricefier/requests/calculate_deadline_with_restrictions.rb +102 -0
- data/lib/pricefier/requests/calculate_price.rb +123 -0
- data/lib/pricefier/requests/calculate_price_deadline.rb +138 -0
- data/lib/pricefier/requests/calculate_price_deadline_with_date.rb +142 -0
- data/lib/pricefier/requests/calculate_price_deadline_with_restrictions.rb +142 -0
- data/lib/pricefier/requests/calculate_price_fac.rb +106 -0
- data/lib/pricefier/requests/calculate_price_with_date.rb +125 -0
- data/lib/pricefier/requests/list_services.rb +87 -0
- data/lib/pricefier/requests/list_services_star.rb +87 -0
- data/lib/reverse_logistics/client.rb +34 -0
- data/lib/reverse_logistics/helper.rb +95 -0
- data/lib/reverse_logistics/requests/calculate_ticket_number_check_digit.rb +66 -0
- data/lib/reverse_logistics/requests/cancel_shipping.rb +70 -0
- data/lib/reverse_logistics/requests/create_shippings.rb +166 -0
- data/lib/reverse_logistics/requests/create_shippings_with_collection.rb +152 -0
- data/lib/reverse_logistics/requests/request_ticket_numbers.rb +90 -0
- data/lib/reverse_logistics/requests/track_shipping.rb +121 -0
- data/lib/reverse_logistics/requests/track_shippings_by_date.rb +133 -0
- data/lib/sigep/client.rb +29 -0
- data/lib/sigep/helper.rb +234 -0
- data/lib/sigep/requests/calculate_label_number_check_digit.rb +72 -0
- data/lib/sigep/requests/cancel_shipping.rb +72 -0
- data/lib/sigep/requests/check_card_status.rb +69 -0
- data/lib/sigep/requests/check_service_availability.rb +91 -0
- data/lib/sigep/requests/create_shippings.rb +70 -0
- data/lib/sigep/requests/request_label_numbers.rb +76 -0
- data/lib/sigep/requests/request_shippings_xml.rb +208 -0
- data/lib/sigep/requests/search_available_additional_services.rb +62 -0
- data/lib/sigep/requests/search_customer.rb +129 -0
- data/lib/sigep/requests/search_zip_code.rb +63 -0
- data/lib/sigep/requests/track_shippings.rb +145 -0
- 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
|