correios-frete 1.4.0 → 1.5.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.
@@ -1,3 +1,7 @@
1
+ == Versão 1.5.0
2
+ - Novo: {Issue #3: Cálculo de frete para múltiplos itens}[https://github.com/prodis/correios-frete/issues/3] utilizando pacotes.
3
+ - Correção: Formatação de separador de casas decimais com vírgula na requisição do Web Service dos Correios.
4
+
1
5
  == Versão 1.4.0
2
6
  - Novo: Suporte para cálculo de e-SEDEX Prioritário e e-SEDEX Express.
3
7
 
@@ -1,10 +1,5 @@
1
1
  = correios-frete
2
2
 
3
- ---
4
- Esta documentação é das <b>versões >= 1.0.0</b>.
5
- Para a versão 0.3.0, por favor veja {README_v0.3.0.rdoc}[https://github.com/prodis/correios-frete/blob/master/README_v0.3.0.rdoc]
6
- ---
7
-
8
3
  Cálculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices).
9
4
 
10
5
  Os serviços de frete suportados são <b>PAC</b>, <b>SEDEX</b>, <b>SEDEX a Cobrar</b> (necessário informar o valor declarado), <b>SEDEX 10</b>, <b>SEDEX Hoje</b> e <b>e-SEDEX</b>. Para os serviços com contrato é necessário informar código de empresa e senha.
@@ -78,7 +73,7 @@ Verificação de sucesso e erro:
78
73
  servico = frete.calcular_sedex
79
74
  servico.sucesso? # => false
80
75
  servico.erro? # => true
81
- servico.msg_erro # => "A altura nao pode ser maior que 90 cm."
76
+ servico.msg_erro # => "A altura nao pode ser maior que o comprimento."
82
77
 
83
78
  Usando a interface pública em inglês:
84
79
 
@@ -88,13 +83,73 @@ Usando a interface pública em inglês:
88
83
  servico.success? # => true
89
84
  servico.error? # => false
90
85
 
86
+
87
+ === Usando pacotes
88
+
89
+ Você pode "montar" um pacote com vários itens. Com o cálculo do volume dos itens adicionados, o pacote único será gerado em formato de cubo.
90
+
91
+ item1 = Correios::Frete::PacoteItem.new :peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2
92
+ item2 = Correios::Frete::PacoteItem.new :peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3
93
+
94
+ pacote = Correios::Frete::Pacote.new
95
+ pacote.adicionar_item(item1)
96
+ pacote.adicionar_item(item2)
97
+
98
+ pacote.peso # => 1.0
99
+ pacote.comprimento # => 18.32138799447962
100
+ pacote.largura # => 18.32138799447962
101
+ pacote.altura # => 18.32138799447962
102
+ pacote.volume # => 6150.0
103
+ pacote.formato # => :caixa_pacote
104
+ pacote.itens.size # => 2
105
+
106
+ Caso alguma dimensão do pacote montado seja menor que o tamanho mínimo exigido pelos Correios, o valor mínimo será atribuído à dimensão.
107
+
108
+ item1 = Correios::Frete::PacoteItem.new :peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2
109
+ item2 = Correios::Frete::PacoteItem.new :peso => 0.7, :comprimento => 40, :largura => 10, :altura => 3
110
+
111
+ pacote = Correios::Frete::Pacote.new
112
+ pacote.adicionar_item(item1)
113
+ pacote.adicionar_item(item2)
114
+
115
+ pacote.comprimento # => 16.0
116
+ pacote.largura # => 12.80579164987494
117
+ pacote.altura # => 12.80579164987494
118
+
119
+ Montado o pacote, basta passá-lo pelo parâmetro <b>encomenda</b> no construtor de Correios::Frete::Calculador.
120
+
121
+ frete = Correios::Frete::Calculador.new :cep_origem => "04094-050",
122
+ :cep_destino => "90619-900",
123
+ :encomenda => pacote
124
+
125
+ servicos = frete.calcular :sedex, :pac
126
+
127
+ servicos[:sedex].valor # => 29.2
128
+ servicos[:sedex].prazo_entrega # => 1
129
+
130
+ servicos[:pac].valor # => 13.3
131
+ servicos[:pac].prazo_entrega # => 5
132
+
133
+ <b>Observação:</b> Quando uma encomenda é fornecida ao calculador de frete, os parâmetros <b>peso</b>, <b>comprimento</b>, <b>largura</b>, <b>altura</b> e <b>formato</b> serão ignorados, sendo utilizados os valores da encomenda.
134
+
135
+ Usando a interface pública em inglês:
136
+
137
+ item1 = Correios::Frete::PacoteItem.new :peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2
138
+ item2 = Correios::Frete::PacoteItem.new :peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3
139
+
140
+ pacote = Correios::Frete::Pacote.new
141
+ pacote.add_item(item1)
142
+ pacote.add_item(item2)
143
+ pacote.items.size # => 2
144
+
145
+
91
146
  == Log
92
147
 
93
148
  Por padrão, cada chamada ao Web Service dos Correios é logada em STDOUT, com nível de log <b>:info</b>, usando a gem {LogMe}[http://github.com/prodis/log-me].
94
149
 
95
150
  Exemplo de log:
96
151
  I, [2011-10-01T00:26:16.864990 #5631] INFO -- : Correios-Frete Request:
97
- http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?sCepOrigem=04094-050&sCepDestino=90619-900&nVlPeso=0.3&nVlComprimento=30&nVlAltura=2&nVlLargura=15&nVlDiametro=0.0&nCdFormato=1&sCdMaoPropria=N&sCdAvisoRecebimento=N&nVlValorDeclarado=0.00&nCdServico=41106&nCdEmpresa=&sDsSenha=&StrRetorno=xml
152
+ http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?sCepOrigem=04094-050&sCepDestino=90619-900&nVlPeso=0.3&nVlComprimento=30&nVlAltura=2&nVlLargura=15&nVlDiametro=0.0&nCdFormato=1&sCdMaoPropria=N&sCdAvisoRecebimento=N&nVlValorDeclarado=0,00&nCdServico=41106&nCdEmpresa=&sDsSenha=&StrRetorno=xml
98
153
 
99
154
  I, [2011-10-01T00:26:17.121822 #5631] INFO -- : Correios-Frete Response:
100
155
  HTTP/1.1 200 OK
@@ -103,7 +158,7 @@ Exemplo de log:
103
158
 
104
159
  Se você configurar o nível de log como <b>:debug</b>, serão logados também todos os cabeçalhos HTTP da resposta:
105
160
  D, [2011-10-01T00:27:50.597961 #5631] DEBUG -- : Correios-Frete Request:
106
- http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?sCepOrigem=04094-050&sCepDestino=90619-900&nVlPeso=0.3&nVlComprimento=30&nVlAltura=2&nVlLargura=15&nVlDiametro=0.0&nCdFormato=1&sCdMaoPropria=N&sCdAvisoRecebimento=N&nVlValorDeclarado=0.00&nCdServico=41106&nCdEmpresa=&sDsSenha=&StrRetorno=xml
161
+ http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?sCepOrigem=04094-050&sCepDestino=90619-900&nVlPeso=0.3&nVlComprimento=30&nVlAltura=2&nVlLargura=15&nVlDiametro=0.0&nCdFormato=1&sCdMaoPropria=N&sCdAvisoRecebimento=N&nVlValorDeclarado=0,00&nCdServico=41106&nCdEmpresa=&sDsSenha=&StrRetorno=xml
107
162
 
108
163
  D, [2011-10-01T00:27:50.812046 #5631] DEBUG -- : Correios-Frete Response:
109
164
  HTTP/1.1 200 OK
@@ -170,21 +225,50 @@ Para desabilitar o log, mudar o nível do log ou configurar um outro mecanismo d
170
225
  f.altura = 2
171
226
  end
172
227
 
228
+ === Maneiras de adicionar itens em Correios::Frete::Pacote
229
+
230
+ ==== Com instâncias de Correios::Frete::PacoteItem
231
+
232
+ item1 = Correios::Frete::PacoteItem.new :peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2
233
+ item2 = Correios::Frete::PacoteItem.new :peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3
234
+
235
+ pacote = Correios::Frete::Pacote.new
236
+ pacote.adicionar_item(item1)
237
+ pacote.adicionar_item(item2)
238
+
239
+ ==== Com parâmetros dos itens
240
+ pacote = Correios::Frete::Pacote.new
241
+ pacote.adicionar_item(:peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2)
242
+ pacote.adicionar_item(:peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3)
243
+
173
244
 
174
245
  === Atributos de Correios::Frete::Calculador
175
246
 
176
247
  ==== String
177
248
  cep_origem, cep_destino, codigo_empresa, senha
178
249
  ==== Float
179
- peso, valor_declarado
180
- ==== Fixnum
181
- comprimento, largura, altura, diametro
250
+ peso, comprimento, largura, altura, diametro, valor_declarado
182
251
  ==== Boolean
183
252
  mao_propria, aviso_recebimento
184
253
  ==== Symbol
185
254
  formato (:caixa_pacote, :rolo_prisma)
186
255
 
187
256
 
257
+ === Atributos de Correios::Frete::Pacote
258
+
259
+ ==== Float
260
+ peso, comprimento, largura, altura, volume
261
+ ==== Array de Correios::Frete::PacoteItem
262
+ itens
263
+ ==== Symbol
264
+ formato (:caixa_pacote)
265
+
266
+ === Atributos de Correios::Frete::PacoteItem
267
+
268
+ ==== Float
269
+ peso, comprimento, largura, altura, volume
270
+
271
+
188
272
  === Atributos de Correios::Frete::Servico
189
273
 
190
274
  ==== String
@@ -214,7 +298,7 @@ Para desabilitar o log, mudar o nível do log ou configurar um outro mecanismo d
214
298
 
215
299
  {Prodis a.k.a. Fernando Hamasaki}[http://prodis.blog.br]
216
300
 
217
- Copyright (c) 2011 Prodis
301
+ Copyright (c) 2011-2012 Prodis
218
302
 
219
303
  Permission is hereby granted, free of charge, to any person obtaining
220
304
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ Jeweler::Tasks.new do |gem|
18
18
  gem.homepage = "http://prodis.blog.br/2011/07/03/gem-para-calculo-de-frete-dos-correios"
19
19
  gem.license = "MIT"
20
20
  gem.summary = %Q{Calculo de frete dos Correios.}
21
- gem.description = %Q{Calculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices). Os servicos de frete suportados sao PAC, SEDEX, SEDEX a Cobrar, SEDEX 10, SEDEX Hoje e e-SEDEX.}
21
+ gem.description = %Q{Calculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices).\n\nOs servicos de frete suportados sao PAC, SEDEX, SEDEX a Cobrar, SEDEX 10, SEDEX Hoje e e-SEDEX.}
22
22
  gem.email = "prodis@gmail.com"
23
23
  gem.authors = ["Prodis a.k.a. Fernando Hamasaki"]
24
24
  gem.version = Correios::Frete::Version::VERSION
@@ -5,16 +5,15 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "correios-frete"
8
- s.version = "1.4.0"
8
+ s.version = "1.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Prodis a.k.a. Fernando Hamasaki"]
12
- s.date = "2012-01-19"
13
- s.description = "Calculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices). Os servicos de frete suportados sao PAC, SEDEX, SEDEX a Cobrar, SEDEX 10, SEDEX Hoje e e-SEDEX."
12
+ s.date = "2012-01-25"
13
+ s.description = "Calculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices).\n\nOs servicos de frete suportados sao PAC, SEDEX, SEDEX a Cobrar, SEDEX 10, SEDEX Hoje e e-SEDEX."
14
14
  s.email = "prodis@gmail.com"
15
15
  s.extra_rdoc_files = [
16
- "README.rdoc",
17
- "README_v0.3.0.rdoc"
16
+ "README.rdoc"
18
17
  ]
19
18
  s.files = [
20
19
  ".document",
@@ -23,17 +22,20 @@ Gem::Specification.new do |s|
23
22
  "Gemfile",
24
23
  "Gemfile.lock",
25
24
  "README.rdoc",
26
- "README_v0.3.0.rdoc",
27
25
  "Rakefile",
28
26
  "correios-frete.gemspec",
29
27
  "lib/correios-frete.rb",
30
28
  "lib/correios/frete.rb",
31
29
  "lib/correios/frete/calculador.rb",
30
+ "lib/correios/frete/pacote.rb",
31
+ "lib/correios/frete/pacote_item.rb",
32
32
  "lib/correios/frete/parser.rb",
33
33
  "lib/correios/frete/servico.rb",
34
34
  "lib/correios/frete/version.rb",
35
35
  "lib/correios/frete/web_service.rb",
36
36
  "spec/correios/frete/calculador_spec.rb",
37
+ "spec/correios/frete/pacote_item_spec.rb",
38
+ "spec/correios/frete/pacote_spec.rb",
37
39
  "spec/correios/frete/parser_spec.rb",
38
40
  "spec/correios/frete/servico_spec.rb",
39
41
  "spec/correios/frete/web_service_spec.rb",
@@ -2,6 +2,8 @@
2
2
  require 'rubygems'
3
3
  require 'correios/frete'
4
4
  require 'correios/frete/calculador'
5
+ require 'correios/frete/pacote'
6
+ require 'correios/frete/pacote_item'
5
7
  require 'correios/frete/parser'
6
8
  require 'correios/frete/servico'
7
9
  require 'correios/frete/web_service'
@@ -3,15 +3,15 @@ module Correios
3
3
  module Frete
4
4
  class Calculador
5
5
  attr_accessor :cep_origem, :cep_destino
6
- attr_accessor :peso, :comprimento, :altura, :largura, :diametro
7
- attr_accessor :formato, :mao_propria, :aviso_recebimento, :valor_declarado
8
- attr_accessor :codigo_empresa, :senha
6
+ attr_accessor :diametro, :mao_propria, :aviso_recebimento, :valor_declarado
7
+ attr_accessor :codigo_empresa, :senha, :encomenda
8
+ attr_writer :peso, :comprimento, :largura, :altura, :formato
9
9
 
10
10
  DEFAULT_OPTIONS = {
11
11
  :peso => 0.0,
12
12
  :comprimento => 0.0,
13
- :altura => 0.0,
14
13
  :largura => 0.0,
14
+ :altura => 0.0,
15
15
  :diametro => 0.0,
16
16
  :formato => :caixa_pacote,
17
17
  :mao_propria => false,
@@ -27,6 +27,12 @@ module Correios
27
27
  yield self if block_given?
28
28
  end
29
29
 
30
+ [:peso, :comprimento, :largura, :altura, :formato].each do |method|
31
+ define_method method do
32
+ @encomenda ? @encomenda.send(method) : instance_variable_get("@#{method}")
33
+ end
34
+ end
35
+
30
36
  def calcular(*service_types)
31
37
  response = web_service(service_types).request!
32
38
  services = parser.servicos(response)
@@ -0,0 +1,67 @@
1
+ # encoding: UTF-8
2
+ module Correios
3
+ module Frete
4
+ class Pacote
5
+ attr_reader :peso, :comprimento, :altura, :largura, :volume
6
+
7
+ MIN_DIMENSIONS = {
8
+ :comprimento => 16.0,
9
+ :largura => 11.0,
10
+ :altura => 2.0
11
+ }
12
+
13
+ def initialize()
14
+ @peso = @comprimento = @largura = @altura = @volume = 0.0
15
+ @itens = []
16
+ end
17
+
18
+ def formato
19
+ :caixa_pacote
20
+ end
21
+
22
+ def itens
23
+ @itens
24
+ end
25
+ alias items itens
26
+
27
+ def adicionar_item(item)
28
+ return unless item
29
+
30
+ item = Correios::Frete::PacoteItem.new(item) if item.is_a?(Hash)
31
+ @itens << item
32
+
33
+ calcular_medidas(item)
34
+ item
35
+ end
36
+ alias add_item adicionar_item
37
+
38
+ private
39
+
40
+ def calcular_medidas(item)
41
+ @peso += item.peso
42
+ @volume += item.volume
43
+
44
+ if @itens.size == 1
45
+ @comprimento = item.comprimento
46
+ @largura = item.largura
47
+ @altura = item.altura
48
+ else
49
+ dimensao = @volume.to_f**(1.0/3)
50
+ @comprimento = @largura = @altura = dimensao
51
+ end
52
+
53
+ min_dimension_values
54
+ end
55
+
56
+ def min_dimension_values()
57
+ @comprimento = min(@comprimento, MIN_DIMENSIONS[:comprimento])
58
+ @largura = min(@largura, MIN_DIMENSIONS[:largura])
59
+ @altura = min(@altura, MIN_DIMENSIONS[:altura])
60
+ end
61
+
62
+ def min(value, minimum)
63
+ (value < minimum) ? minimum : value
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+ module Correios
3
+ module Frete
4
+ class PacoteItem
5
+ attr_accessor :peso, :comprimento, :largura, :altura
6
+
7
+ DEFAULT_OPTIONS = {
8
+ :peso => 0.0,
9
+ :comprimento => 0.0,
10
+ :largura => 0.0,
11
+ :altura => 0.0
12
+ }
13
+
14
+ def initialize(options = {})
15
+ DEFAULT_OPTIONS.merge(options).each do |attr, value|
16
+ self.send("#{attr}=", value)
17
+ end
18
+
19
+ yield self if block_given?
20
+ end
21
+
22
+ def volume
23
+ @comprimento * @largura * @altura
24
+ end
25
+ end
26
+ end
27
+ end
@@ -3,7 +3,7 @@ module Correios
3
3
  module Frete
4
4
  module Version
5
5
  MAJOR = 1
6
- MINOR = 4
6
+ MINOR = 5
7
7
  PATCH = 0
8
8
  VERSION = [MAJOR, MINOR, PATCH].join(".")
9
9
  end
@@ -24,20 +24,24 @@ module Correios
24
24
  "sCepOrigem=#{frete.cep_origem}&" +
25
25
  "sCepDestino=#{frete.cep_destino}&" +
26
26
  "nVlPeso=#{frete.peso}&" +
27
- "nVlComprimento=#{frete.comprimento}&" +
28
- "nVlAltura=#{frete.altura}&" +
29
- "nVlLargura=#{frete.largura}&" +
30
- "nVlDiametro=#{frete.diametro}&" +
27
+ "nVlComprimento=#{format_decimal(frete.comprimento)}&" +
28
+ "nVlLargura=#{format_decimal(frete.largura)}&" +
29
+ "nVlAltura=#{format_decimal(frete.altura)}&" +
30
+ "nVlDiametro=#{format_decimal(frete.diametro)}&" +
31
31
  "nCdFormato=#{FORMATS[frete.formato]}&" +
32
32
  "sCdMaoPropria=#{CONDITIONS[frete.mao_propria]}&" +
33
33
  "sCdAvisoRecebimento=#{CONDITIONS[frete.aviso_recebimento]}&" +
34
- "nVlValorDeclarado=#{format("%.2f" % frete.valor_declarado)}&" +
34
+ "nVlValorDeclarado=#{format_decimal(format("%.2f" % frete.valor_declarado))}&" +
35
35
  "nCdServico=#{service_codes_for(service_types)}&" +
36
36
  "nCdEmpresa=#{frete.codigo_empresa}&" +
37
37
  "sDsSenha=#{frete.senha}&" +
38
38
  "StrRetorno=xml"
39
39
  end
40
40
 
41
+ def format_decimal(value)
42
+ value.to_s.gsub(".", ",")
43
+ end
44
+
41
45
  def service_codes_for(service_types)
42
46
  service_types.map { |type| Correios::Frete::Servico.code_from_type(type) }.join(",")
43
47
  end
@@ -8,8 +8,8 @@ describe Correios::Frete::Calculador do
8
8
 
9
9
  { :peso => 0.0,
10
10
  :comprimento => 0.0,
11
- :altura => 0.0,
12
11
  :largura => 0.0,
12
+ :altura => 0.0,
13
13
  :diametro => 0.0,
14
14
  :formato => :caixa_pacote,
15
15
  :mao_propria => false,
@@ -25,27 +25,71 @@ describe Correios::Frete::Calculador do
25
25
  { :cep_origem => "01000-000",
26
26
  :cep_destino => "021222-222",
27
27
  :peso => 0.321,
28
- :comprimento => 12.5,
29
- :altura => 1.4,
30
- :largura => 4.6,
31
- :diametro => 5.0,
28
+ :comprimento => 30,
29
+ :largura => 15,
30
+ :altura => 2,
31
+ :diametro => 5,
32
32
  :formato => :rolo_prisma,
33
33
  :mao_propria => true,
34
34
  :aviso_recebimento => true,
35
35
  :valor_declarado => 1.99,
36
36
  :codigo_empresa => "1234567890",
37
37
  :senha => "senha",
38
+ :encomenda => Correios::Frete::Pacote.new
38
39
  }.each do |attr, value|
39
40
  context "when #{attr} is supplied" do
40
41
  it "sets #{attr}" do
41
- @frete = Correios::Frete::Calculador.new(attr => value)
42
- @frete.send(attr).should == value
42
+ frete = Correios::Frete::Calculador.new(attr => value)
43
+ frete.send(attr).should == value
43
44
  end
44
45
  end
45
46
 
46
47
  context "when #{attr} is supplied in a block" do
47
48
  it "sets #{attr}" do
48
- @frete = Correios::Frete::Calculador.new { |f| f.send("#{attr}=", value) }
49
+ frete = Correios::Frete::Calculador.new { |f| f.send("#{attr}=", value) }
50
+ frete.send(attr).should == value
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ describe "#encomenda" do
57
+ context "when encomenda is supplied" do
58
+ before :each do
59
+ @encomenda = Correios::Frete::Pacote.new
60
+ @encomenda.adicionar_item(:peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2)
61
+ @encomenda.adicionar_item(:peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3)
62
+ @frete = Correios::Frete::Calculador.new :peso => 10.5,
63
+ :comprimento => 105,
64
+ :largura => 50,
65
+ :altura => 10,
66
+ :formato => :rolo_prisma,
67
+ :encomenda => @encomenda
68
+ end
69
+
70
+ [:peso, :comprimento, :largura, :altura, :formato].each do |attr|
71
+ it "#{attr} returns encomenda #{attr}" do
72
+ @frete.send(attr).should == @encomenda.send(attr)
73
+ end
74
+ end
75
+ end
76
+
77
+ context "when encomenda is not supplied" do
78
+ before :each do
79
+ @frete = Correios::Frete::Calculador.new :peso => 10.5,
80
+ :comprimento => 105,
81
+ :largura => 50,
82
+ :altura => 10,
83
+ :formato => :rolo_prisma
84
+ end
85
+
86
+ { :peso => 10.5,
87
+ :comprimento => 105,
88
+ :largura => 50,
89
+ :altura => 10,
90
+ :formato => :rolo_prisma
91
+ }.each do |attr, value|
92
+ it "#{attr} returns supplied #{attr}" do
49
93
  @frete.send(attr).should == value
50
94
  end
51
95
  end
@@ -112,7 +156,7 @@ describe Correios::Frete::Calculador do
112
156
  end
113
157
 
114
158
  it "returns true in respond_to?" do
115
- subject.respond_to?("#{method_name}_#{service[:type]}").should be_true
159
+ @frete.respond_to?("#{method_name}_#{service[:type]}").should be_true
116
160
  end
117
161
  end
118
162
  end
@@ -125,7 +169,7 @@ describe Correios::Frete::Calculador do
125
169
  end
126
170
 
127
171
  it "returns false in respond_to?" do
128
- subject.respond_to?("#{method_name}_servico_que_nao_existe").should be_false
172
+ @frete.respond_to?("#{method_name}_servico_que_nao_existe").should be_false
129
173
  end
130
174
  end
131
175
  end
@@ -0,0 +1,47 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe Correios::Frete::PacoteItem do
5
+ describe ".new" do
6
+ context "create with default value of" do
7
+ before(:each) { @item = Correios::Frete::PacoteItem.new }
8
+
9
+ { :peso => 0.0,
10
+ :comprimento => 0.0,
11
+ :largura => 0.0,
12
+ :altura => 0.0
13
+ }.each do |attr, value|
14
+ it attr do
15
+ @item.send(attr).should == value
16
+ end
17
+ end
18
+ end
19
+
20
+ { :peso => 0.3,
21
+ :comprimento => 30,
22
+ :largura => 15,
23
+ :altura => 2,
24
+ }.each do |attr, value|
25
+ context "when #{attr} is supplied" do
26
+ it "sets #{attr}" do
27
+ item = Correios::Frete::PacoteItem.new(attr => value)
28
+ item.send(attr).should == value
29
+ end
30
+ end
31
+
32
+ context "when #{attr} is supplied in a block" do
33
+ it "sets #{attr}" do
34
+ item = Correios::Frete::PacoteItem.new { |f| f.send("#{attr}=", value) }
35
+ item.send(attr).should == value
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "#volume" do
42
+ it "calculates item volume" do
43
+ item = Correios::Frete::PacoteItem.new(:comprimento => 16, :largura => 11, :altura => 2)
44
+ item.volume.should == 16 * 11 * 2
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,160 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe Correios::Frete::Pacote do
5
+ before(:each) { @pacote = Correios::Frete::Pacote.new }
6
+
7
+ describe ".new" do
8
+ context "create with default value of" do
9
+ { :peso => 0.0,
10
+ :comprimento => 0.0,
11
+ :altura => 0.0,
12
+ :largura => 0.0
13
+ }.each do |attr, value|
14
+ it attr do
15
+ @pacote.send(attr).should == value
16
+ end
17
+ end
18
+
19
+ it "itens" do
20
+ @pacote.itens.should be_empty
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "#formato" do
26
+ it "is caixa/pacote" do
27
+ @pacote.formato.should == :caixa_pacote
28
+ end
29
+ end
30
+
31
+ describe "#adicionar_item" do
32
+ context "when adds a package item" do
33
+ it "adds in items" do
34
+ item = Correios::Frete::PacoteItem.new
35
+ @pacote.adicionar_item(item)
36
+ @pacote.itens.first.should == item
37
+ end
38
+ end
39
+
40
+ context "when adds package item params" do
41
+ it "adds new item" do
42
+ params = { :peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2 }
43
+ @pacote.adicionar_item(params)
44
+
45
+ @pacote.itens.first.peso.should == params[:peso]
46
+ @pacote.itens.first.comprimento.should == params[:comprimento]
47
+ @pacote.itens.first.altura.should == params[:altura]
48
+ @pacote.itens.first.largura.should == params[:largura]
49
+ end
50
+ end
51
+
52
+ context "when adds nil item" do
53
+ it "does not add" do
54
+ @pacote.adicionar_item(nil)
55
+ @pacote.itens.should be_empty
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "calculations" do
61
+ context "when adds one package item" do
62
+ before :each do
63
+ @item = Correios::Frete::PacoteItem.new(:peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2)
64
+ @pacote.adicionar_item(@item)
65
+ end
66
+
67
+ it "calculates package weight" do
68
+ @pacote.peso.should == @item.peso
69
+ end
70
+
71
+ it "calculates package volume" do
72
+ @pacote.volume.should == @item.volume
73
+ end
74
+
75
+ it "calculates package length" do
76
+ @pacote.comprimento.should == @item.comprimento
77
+ end
78
+
79
+ it "calculates package width" do
80
+ @pacote.largura.should == @item.largura
81
+ end
82
+
83
+ it "calculates package height" do
84
+ @pacote.altura.should == @item.altura
85
+ end
86
+
87
+ context "with dimensions less than each minimum" do
88
+ before :each do
89
+ item = Correios::Frete::PacoteItem.new(:peso => 0.3, :comprimento => 15, :largura => 10, :altura => 1)
90
+ @pacote = Correios::Frete::Pacote.new
91
+ @pacote.adicionar_item(item)
92
+ end
93
+
94
+ it "sets minimum length value" do
95
+ @pacote.comprimento.should == 16
96
+ end
97
+
98
+ it "sets minimum width value" do
99
+ @pacote.largura.should == 11
100
+ end
101
+
102
+ it "sets minimum height value" do
103
+ @pacote.altura.should == 2
104
+ end
105
+ end
106
+ end
107
+
108
+ context "when adds more than one package item" do
109
+ before :each do
110
+ @item1 = Correios::Frete::PacoteItem.new(:peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2)
111
+ @item2 = Correios::Frete::PacoteItem.new(:peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3)
112
+ @expected_dimension = (@item1.volume + @item2.volume).to_f**(1.0/3)
113
+
114
+ @pacote.adicionar_item(@item1)
115
+ @pacote.adicionar_item(@item2)
116
+ end
117
+
118
+ it "calculates package weight" do
119
+ @pacote.peso.should == @item1.peso + @item2.peso
120
+ end
121
+
122
+ it "calculates package volume" do
123
+ @pacote.volume.should == @item1.volume + @item2.volume
124
+ end
125
+
126
+ it "calculates package length" do
127
+ @pacote.comprimento.should == @expected_dimension
128
+ end
129
+
130
+ it "calculates package width" do
131
+ @pacote.largura.should == @expected_dimension
132
+ end
133
+
134
+ it "calculates package height" do
135
+ @pacote.altura.should == @expected_dimension
136
+ end
137
+
138
+ context "with dimensions less than each minimum" do
139
+ before :each do
140
+ item = Correios::Frete::PacoteItem.new(:peso => 0.3, :comprimento => 3, :largura => 1, :altura => 1)
141
+ @pacote = Correios::Frete::Pacote.new
142
+ @pacote.adicionar_item(item)
143
+ @pacote.adicionar_item(item)
144
+ end
145
+
146
+ it "sets minimum length value" do
147
+ @pacote.comprimento.should == 16
148
+ end
149
+
150
+ it "sets minimum width value" do
151
+ @pacote.largura.should == 11
152
+ end
153
+
154
+ it "sets minimum height value" do
155
+ @pacote.altura.should == 2
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: correios-frete
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.4.0
5
+ version: 1.5.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Prodis a.k.a. Fernando Hamasaki
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-01-19 00:00:00 Z
13
+ date: 2012-01-25 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: log-me
@@ -111,7 +111,10 @@ dependencies:
111
111
  type: :development
112
112
  prerelease: false
113
113
  version_requirements: *id009
114
- description: Calculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices). Os servicos de frete suportados sao PAC, SEDEX, SEDEX a Cobrar, SEDEX 10, SEDEX Hoje e e-SEDEX.
114
+ description: |-
115
+ Calculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices).
116
+
117
+ Os servicos de frete suportados sao PAC, SEDEX, SEDEX a Cobrar, SEDEX 10, SEDEX Hoje e e-SEDEX.
115
118
  email: prodis@gmail.com
116
119
  executables: []
117
120
 
@@ -119,7 +122,6 @@ extensions: []
119
122
 
120
123
  extra_rdoc_files:
121
124
  - README.rdoc
122
- - README_v0.3.0.rdoc
123
125
  files:
124
126
  - .document
125
127
  - .rspec
@@ -127,17 +129,20 @@ files:
127
129
  - Gemfile
128
130
  - Gemfile.lock
129
131
  - README.rdoc
130
- - README_v0.3.0.rdoc
131
132
  - Rakefile
132
133
  - correios-frete.gemspec
133
134
  - lib/correios-frete.rb
134
135
  - lib/correios/frete.rb
135
136
  - lib/correios/frete/calculador.rb
137
+ - lib/correios/frete/pacote.rb
138
+ - lib/correios/frete/pacote_item.rb
136
139
  - lib/correios/frete/parser.rb
137
140
  - lib/correios/frete/servico.rb
138
141
  - lib/correios/frete/version.rb
139
142
  - lib/correios/frete/web_service.rb
140
143
  - spec/correios/frete/calculador_spec.rb
144
+ - spec/correios/frete/pacote_item_spec.rb
145
+ - spec/correios/frete/pacote_spec.rb
141
146
  - spec/correios/frete/parser_spec.rb
142
147
  - spec/correios/frete/servico_spec.rb
143
148
  - spec/correios/frete/web_service_spec.rb
@@ -1,168 +0,0 @@
1
- = correios-frete
2
-
3
- ---
4
- Esta documentação é da <b>versão 0.3.0</b>.
5
- Para a versão 1.0.0 ou acima, por favor veja {README.rdoc}[https://github.com/prodis/correios-frete/blob/master/README.rdoc]
6
- ---
7
-
8
- Cálculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices).
9
-
10
- Os serviços de frete suportados são <b>PAC</b>, <b>SEDEX</b>, <b>SEDEX 10</b>, <b>SEDEX Hoje</b> e <b>e-SEDEX</b> (necessário informar código de empresa e senha).
11
-
12
- == Instalando
13
-
14
- === Gemfile
15
- gem 'correios-frete'
16
-
17
- === Instalação direta
18
- $ gem install correios-frete
19
-
20
-
21
- == Usando
22
-
23
- require 'correios-frete'
24
-
25
- frete = Correios::Frete.new :cep_origem => "04094-050",
26
- :cep_destino => "90619-900",
27
- :peso => 0.3,
28
- :comprimento => 30,
29
- :largura => 15,
30
- :altura => 2
31
-
32
- Cálculo de vários serviços ao mesmo tempo:
33
-
34
- servicos = frete.calcular :sedex, :pac
35
-
36
- servicos[:sedex].nome # => "SEDEX"
37
- servicos[:sedex].valor # => 26.2
38
- servicos[:sedex].prazo_entrega # => 1
39
-
40
- servicos[:pac].nome # => "PAC"
41
- servicos[:pac].valor # => 10.0
42
- servicos[:pac].prazo_entrega # => 5
43
-
44
- Cálculo de um serviço de frete passando o serviço para parâmetro:
45
-
46
- servico = frete.calcular :sedex
47
- service.nome # => "SEDEX"
48
- servico.valor # => 26.2
49
- servico.prazo_entrega # => 1
50
-
51
- servico = frete.calcular :pac
52
- service.nome # => "PAC"
53
- servico.valor # => 10.0
54
- servico.prazo_entrega # => 5
55
-
56
- Cálculo de um serviço de frete chamando o método direto do serviço:
57
-
58
- servico = frete.calcular_sedex
59
- service.nome # => "SEDEX"
60
- servico.valor # => 26.2
61
- servico.prazo_entrega # => 1
62
-
63
- servico = frete.calcular_pac
64
- service.nome # => "PAC"
65
- servico.valor # => 10.0
66
- servico.prazo_entrega # => 5
67
-
68
- Verificação de sucesso e erro:
69
-
70
- frete.altura = 100
71
-
72
- servico = frete.calcular_sedex
73
- servico.sucesso? # => false
74
- servico.erro? # => true
75
- servico.msg_erro # => "A altura nao pode ser maior que 90 cm."
76
-
77
- Usando a interface pública em inglês:
78
-
79
- servicos = frete.calculate :sedex, :pac
80
- servico = frete.calculate_sedex
81
- servico.success? # => true
82
- servico.error? # => false
83
-
84
- == Informações adicionais
85
-
86
- === Serviços suportados
87
- :pac
88
- :sedex
89
- :sedex_10
90
- :sedex_hoje
91
- :e_sedex
92
-
93
-
94
- === Maneiras de configurar atributos no construtor de Correios::Frete
95
-
96
- ==== Com um hash
97
- frete = Correios::Frete.new :cep_origem => "04094-050",
98
- :cep_destino => "90619-900",
99
- :peso => 0.3,
100
- :comprimento => 30,
101
- :largura => 15,
102
- :altura => 2
103
-
104
- ==== Com um bloco
105
- frete = Correios::Frete.new do |f|
106
- f.cep_origem = "04094-050"
107
- f.cep_destino = "90619-900"
108
- f.peso = 0.3
109
- f.comprimento = 30
110
- f.largura = 15
111
- f.altura = 2
112
- end
113
-
114
-
115
- === Atributos de Correios::Frete
116
-
117
- ==== String
118
- cep_origem, cep_destino, codigo_empresa, senha
119
- ==== Float
120
- peso, valor_declarado
121
- ==== Fixnum
122
- comprimento, largura, altura, diametro
123
- ==== Boolean
124
- mao_propria, aviso_recebimento
125
- ==== Symbol
126
- formato (:caixa_pacote, :rolo_prisma)
127
-
128
-
129
- === Atributos de Correios::Frete::Servico
130
-
131
- ==== String
132
- codigo, erro, msg_erro, nome
133
- ==== Float
134
- valor, valor_mao_propria, valor_aviso_recebimento, valor_valor_declarado
135
- ==== Fixnum
136
- prazo_entrega
137
- ==== Boolean
138
- entrega_domiciliar, entrega_sabado
139
- ==== Symbol
140
- tipo (:pac, :sedex, :sedex_10, :sedex_hoje, :e_sedex)
141
-
142
- == Copyright
143
-
144
- (The MIT License)
145
-
146
- {Prodis a.k.a. Fernando Hamasaki}[http://prodis.blog.br]
147
-
148
- Copyright (c) 2011 Prodis
149
-
150
- Permission is hereby granted, free of charge, to any person obtaining
151
- a copy of this software and associated documentation files (the
152
- "Software"), to deal in the Software without restriction, including
153
- without limitation the rights to use, copy, modify, merge, publish,
154
- distribute, sublicense, and/or sell copies of the Software, and to
155
- permit persons to whom the Software is furnished to do so, subject to
156
- the following conditions:
157
-
158
- The above copyright notice and this permission notice shall be
159
- included in all copies or substantial portions of the Software.
160
-
161
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
162
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
163
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
164
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
165
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
166
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
167
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
168
-