Arquivo

Textos com Etiquetas ‘Gem’

correios-sro-xml - Gem para rastreamento de objetos dos Correios

17 de agosto de 2012

O Sistema de Rastreamento de Objetos dos Correios (SRO) possibilita o acompanhamento dos objetos postados sob registro, incluindo portanto todas as encomendas SEDEX, e-SEDEX e PAC.

Os Correios disponibilizam um Web Service para consultar o progresso na entrega das mercadorias. O SRO XML permite a consulta de até 50 encomendas simultaneamente.

A gem correios-sro-xml utiliza o SRO XML dos Correios facilitando o uso desse recurso em aplicações Ruby.

Para usar o SRO XML em ambiente de produção, é necessário solicitar dados de acesso (usuário e senha) junto aos Correios, conforme descrito no blog dos Correios.

Para o ambiente de desenvolvimento, você pode usar os seguintes dados:

  • Usuário: ECT
  • Senha: SRO

Instalando

Gemfile:
gem 'correios-sro-xml'

Instalação direta:
$ gem install correios-sro-xml

Usando

require 'correios-sro-xml'

sro = Correios::SRO::Tracker.new(:user => "ECT", :password => "SRO")

Rastreamento de um objeto:

object = sro.get("SI047624825BR")
object.number                   # => "SI047624825BR"
object.events.first.date        # => "26/12/2011"
object.events.first.hour        # => "15:22"
object.events.first.place       # => "AC CENTRAL DE SAO PAULO"
object.events.first.description # => "Entregue"

Rastreamento de vários objetos:

objects = sro.get("SI047624825BR", "SX104110463BR")

objects["SI047624825BR"].number                   # => "SI047624825BR"
objects["SI047624825BR"].events.first.date        # => "26/12/2011"
objects["SI047624825BR"].events.first.hour        # => "15:22"
objects["SI047624825BR"].events.first.place       # => "AC CENTRAL DE SAO PAULO"
objects["SI047624825BR"].events.first.description # => "Entregue"

objects["SX104110463BR"].number                   # => "SX104110463BR"
objects["SX104110463BR"].events.first.date        # => "08/12/2011"
objects["SX104110463BR"].events.first.hour        # => "09:30"
objects["SX104110463BR"].events.first.place       # => "CEE JUNDIAI"
objects["SX104110463BR"].events.first.description # => "Entregue"
Modo de resultado (result mode)

Um objeto pode ter um ou mais eventos. Por padrão, o modo de resultado do rastreador irá retornar o último evento do objeto.

sro.result_mode # => :last

object = sro.get("SI047624825BR")
object.events.size # => 1

Você pode configurar para o retorno ser todos os eventos do objeto.

sro.result_mode = :all

object = sro.get("SI047624825BR")
object.events.size # => 5
Tipo de consulta (query type)

Existem duas maneiras para consultar objetos no rastreador:

Lista de objetos

Onde todos os números de objetos serão consultados (o padrão).

sro.query_type # => :list

objects = sro.get("PB996681660BR", "PB996681700BR")
objects.keys # => ["PB996681660BR", "PB996681700BR"]
Intervalo de objetos

No qual você fornece primeiro e último números de objetos de um intervalo.

sro.query_type = :range

objects = sro.get("PB996681660BR", "PB996681700BR")
objects.keys # => ["PB996681660BR", "PB996681673BR", "PB996681687BR", "PB996681695BR", "PB996681700BR"]

Configurações

Timeout

Por padrão, o tempo de espera de resposta (timeout) para uma requisição ao SRO XML é de 5 segundos. Após isso, se o SRO XML não responder, uma exceção do tipo Timeout::Error será lançada.

Você pode configurar esse tempo de espera usando o módulo Correios::SRO.

Correios::SRO.configure do |config|
  config.request_timeout = 3  # Configura o tempo de espera para 3 segundos
end
Log

Por padrão, cada chamada ao SRO XML é logada em STDOUT, com nível de log :info, usando a gem LogMe.

Exemplo de log:

I, [2012-08-17T00:55:10.531780 #22692]  INFO -- : Correios-SRO-XML Request:
POST http://websro.correios.com.br/sro_bin/sroii_xml.eventos
Usuario=ECT&Senha=SRO&Tipo=L&Resultado=U&Objetos=PB996681660BR

I, [2012-08-17T00:55:10.750308 #22692]  INFO -- : Correios-SRO-XML Response:
HTTP/1.1 200 OK
<?xml version="1.0" encoding="iso-8859-1" ?>
<sroxml>
   <versao>1.0</versao>
   <qtd>1</qtd>
   <TipoPesquisa>Lista de Objetos</TipoPesquisa>
   <TipoResultado>Último evento</TipoResultado>
     <objeto>
       <numero>PB996681660BR</numero>
       <evento>
          <tipo>BDE</tipo>
          <status>01</status>
          <data>05/07/2012</data>
          <hora>21:11</hora>
          <descricao>Entregue</descricao>
          <recebedor>                         </recebedor>
          <documento>                         </documento>
          <comentario>                         </comentario>
          <local>CDD VILA ANDRADE</local>
          <codigo>05724970</codigo>
          <cidade>SAO PAULO</cidade>
          <uf>SP</uf>
          <sto>72824000</sto>
      </evento>
     </objeto>
</sroxml>

Se você configurar o nível de log como :debug, serão logados também todos os cabeçalhos HTTP da requisição e da resposta:

D, [2012-08-17T00:58:56.226742 #22692] DEBUG -- : Correios-SRO-XML Request:
POST http://websro.correios.com.br/sro_bin/sroii_xml.eventos
accept: */*
user-agent: Ruby
content-type: application/x-www-form-urlencoded
Usuario=ECT&Senha=SRO&Tipo=L&Resultado=U&Objetos=PB996681660BR

D, [2012-08-17T00:58:56.495131 #22692] DEBUG -- : Correios-SRO-XML Response:
HTTP/1.1 200 OK
date: Fri, 17 Aug 2012 03:58:56 GMT
server: Oracle-Application-Server-10g/10.1.2.0.2 Oracle-HTTP-Server
content-length: 855
content-type: text/html; charset=ISO-8859-1
x-cache: MISS from 127.0.0.1
connection: close
<?xml version="1.0" encoding="iso-8859-1" ?>
<sroxml>
   <versao>1.0</versao>
   <qtd>1</qtd>
   <TipoPesquisa>Lista de Objetos</TipoPesquisa>
   <TipoResultado>?ltimo evento</TipoResultado>
     <objeto>
       <numero>PB996681660BR</numero>
       <evento>
          <tipo>BDE</tipo>
          <status>01</status>
          <data>05/07/2012</data>
          <hora>21:11</hora>
          <descricao>Entregue</descricao>
          <recebedor>                         </recebedor>
          <documento>                         </documento>
          <comentario>                         </comentario>
          <local>CDD VILA ANDRADE</local>
          <codigo>05724970</codigo>
          <cidade>SAO PAULO</cidade>
          <uf>SP</uf>
          <sto>72824000</sto>
      </evento>
     </objeto>
</sroxml>

Para desabilitar o log, mudar o nível do log ou configurar um outro mecanismo de log, use o módulo Correios::SRO.

Correios::SRO.configure do |config|
  config.log_enabled = false   # Desabilita o log
  config.log_level = :debug    # Altera o nível do log
  config.logger = Rails.logger # Usa o logger do Rails
end
Exemplo de configuração
Correios::SRO.configure do |config|
  config.log_level = :debug
  config.logger = Rails.logger
  config.request_timeout = 3
end
Código no Github

https://github.com/prodis/correios-sro-xml

Gem no RubyGems.org

https://rubygems.org/gems/correios-sro-xml

Ruby , , , ,

Gem para cálculo de frete do PayPal Frete Fácil

4 de setembro de 2011

Gem para cálculo de frete dos Correios

3 de julho de 2011

“Pretty print” para seus objetos Ruby

8 de abril de 2010

Vira e mexe, seja no irb ou no script/console, temos que exibir o conteúdo de objetos para examinar seus valores. A maneira mais comum para fazer isso é utilizando os método puts ou o método p, como no exemplo abaixo:

Esse tipo de exibição não é muito legível, principalmente se você estiver no script/console visualizando os dados de  um ActiveRecord:

No caso de objetos ActiveRecord, há a opção da exibição em YAML, chamando o método y no script/console:

Agora existe uma gem chamada awesome_print que permite exibir os dados dos objetos com identação e cores de acordo com o tipo de dado.

Primeiro vamos instalá-la:
$ sudo gem install awesome_print

E para exemplificar, vamos usar o script/console para exibir os valores de um hash. Note que é necessário fazer uma referência para o arquivo “ap”. Depois bastar chamar o método ap:

Uma coisa legal é que dependendo do tipo do valor, as cores são diferentes.

Agora veja um exemplo utilizando um ActiveRecord:

Uma ressalva negativa é a não exibição dos valores decimais, como acontece quando se exibe o ActiveRecord em YAML. Talvez para uma próxima versão isso melhore.

Há também algumas opções para customizar a forma como os dados são exibidos pela awesome_print, como por exemplo o tamanho da identação e as cores. Para mais informações, veja a documentação da gem: http://github.com/michaeldv/awesome_print.

Ruby , , , , , ,