Corraios Gem Version

Codeship Status for imaboldcompany/corrails

Code Climate

Test Coverage

gem que visa facilitar o cálculo do valor do frete cobrado pelo Correios para entregas simples e para entregas com multiplos itens.

Essa gem é focada para aplicações de e-commerce. Assim, os únicos serviços suportados são PAC, SEDEX, SEDEX 10 e E-SEDEX.

Motivação:

Existem outras gems para cálculo de frete, mas elas não incluem todas as regras de cubagem que o Correios aplica.

Regras utilizadas

Para frete de 1 item:

Esse é o caso mais simples. A documentação do Correios explica bem quais são as restrições nesses casos: http://www.correios.com.br/para-voce/correios-de-a-a-z/pdf/calculador-remoto-de-precos-e-prazos/manual-de-implementacao-do-calculo-remoto-de-precos-e-prazos.

Para frete de múltiplos itens com embalagens iguais:

Para o frete de múltiplos itens, sempre somaremos o peso dos itens. O que difere são os calculos das medidas finais de acordo com o tipo de embalagem:

  • Envelopes

O tamanho do envelope não interfere no valor do frete, apenas o peso. Sabendo disso, para unificar os itens e fazer apenas uma requisição ao webservice do Correios, somamos os pesos dos envelopes, com limite de 1kg e desconsideramos os tamanhos dos envelopes.

Quando o peso dos itens superam 1kg, tratamos a entrega como um pacote. Por exemplo, o valor do frete de 3 envelopes de 30x30 (centímetros) de 500g cada, será calculado como um pacote de 30x30x2 com 1,5kg.

  • Caixas

Os volumes das caixas serão somados e um novo valor para os lados da caixa final são calculados. Por exemplo: 2 Caixa de 30x30x30 com 1kg cada, resulta em uma caixa de 2 kg com 37.7976315 centímetros para cada lado.

  • Rolos

Para entrega de multiplos rolos, eles serão convertidos em pacotes. Um rolo com 30 centímetros de comprimero com 10 de diametro é convertido para uma pacote com 30x10x10 e o mesmo peso.

Para frete de múltiplos itens com embalagens diferentes:

TODO

Instalação

Add this line to your application's Gemfile:

gem 'corrails'

And then execute:

$ bundle

Or install it yourself as:

$ gem install corrails

Como usar?

São utilizadas 3 classes principais:

Corraios::Packer

Classe utilizada para agrupar diferentes tipos de embalagens

packer = Corraios::Packer.new
packer.add_item weight: 0.3, height: 30, width: 50, length: 30 # pacote
packer.add_item weight: 1.3, width: 50, length: 30 # envelope
packer.add_item weight: 0.3, diameter: 20, length: 30 # rolo

Corraios::Calculator

Essa classe recebe o cep de origem e destino juntamente com uma instância de Corraios::Packer.

O método perform deve receber quais serviços devem ser calculados.


calculator = Corraios::Calculator.new '38408-090', '38320-000', packer
calculator.perform :pac #=> [Delivery]
calculator.perform :pac, :sedex #=> [Delivery, Delivery]


# quando possuir contrato
calculator.contract_number = '1321231123'
calculator.contract_password = '63h5nch13kd'

Corraios::Delivery

Classe retornada pelo método Corraios::Calculator#perform, e possui os valores retornados pelo webservices do Correios.


delivery = calculator.perform :pac #=> Delivery

delivery.name # :pac
delivery.code # 41106

if delivery.success?
  delivery.deadline # 3
  delivery.value # 32.12
  delivery.number_of_posts # 1
else
  delivery.error_message #
end

TODO

  • Unificar requisições para diferentes serviços (Hoje a chamada calculator.perform :pac, :sedex realiza duas requisiçoes ao servidor do Correios. Pode ser feita em uma)
  • adicionar opção mão própria
  • adicionar opção aviso recebimento
  • adicionar opção valor declarado
  • Opção para configurar o timeout
  • Opção de tentativas

Contributing

  1. Fork it ( https://github.com/[my-github-username]/corrails/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request