tapajos / brazilian-rails

Brazilian Rails é um conjunto de gems para serem usadas com Ruby e com o Ruby on Rails e tem como objetivo unir alguns recursos úteis para os desenvolvedores brasileiros.
http://brazilian-rails.rubyforge.org
361 stars 100 forks source link

Valida atributo como CPF ou CNPJ #38

Closed josuelima closed 12 years ago

josuelima commented 12 years ago

Olá pessoal,

Essa implementação surgiu da necessidade que tive em um projeto de utilizar um atributo hora como cnpj hora como cpf (o cliente poderia ser pessoa física ou jurídica).

Ao usar "usar_como_cpf_ou_cnpj" é possível validar se o valor do atributo é cpf ou cnpj.

class Cliente < ActiveRecord::Base
  usar_como_cpf_ou_cnpj :codigo
end

# válido (cpf)
Cliente.new(:codigo => "11144477735")

# válido (cnpj)
Cliente.new(:codigo => "69103604000160")

# inválido
Cliente.new(:codigo => "123456789")

Esta é minha contribuição caso considerem útil adicionar ao projeto.

Abs.

cassiomarques commented 12 years ago

Hum... eu não sei se gosto da idéia, acho que a validação fica muito "frouxa". Para ser sincero, eu raramente tenho usado o usar_como_cpf ou o usar_como_cnpj. O que tenho feito é usar algo como:

class Company < ActiveRecord::Base
  validates :cnpj, :cnpj => true
end

Lembrando que essa forma de validação pode ser condicional, através do uso de um :if => :blabla, onde :blabla é um método qualquer que retorna um booleano. Acredito que além do número de cpf/cnpj, deveriamos receber também mais alguma coisa (talvez em um atributo virtual) que indique se o objeto deverá ser validado como PF o PJ. Deixa isso livre e automaticamente validar como um ou outro eu acho que seria um pouco inseguro.

tinogomes commented 12 years ago

Sou da mesma opinião do @cassiomarques. Na verdade, estou quase matando os métodos usar_como_cpf e usar_como_cnpj e deixar apenas a abortagem com o novo esqueca de validações.

josuelima commented 12 years ago

Como tinha dito, foi em um caso específico de projeto. Recebia varios relatorios em csv onde o codigo era cpf ou cnpj e precisava ser validado. Concordo que um atributo virtual resolveria esse problema, mas como não podia fazer alterações no layout que estava recebendo de outros sistemas, tive que optar por esse tipo de validação. Também é possível utilizar

validates :codigo, :cpf_ou_cnpj => true

Pensei em fazer uma validação condicional, como o @cassiomarques citou, mas ficaria um pouco mais pesado sair aplicando isso nos models e achei melhor transferir essa responsabilidade para a lib.

Bem, de toda forma compreendo que essa situação seja mais específica e fuja um pouco do escopo da gem.

[]

cassiomarques commented 12 years ago

@josuelima Você pode sempre criar um module, colocar todo o esquema da validação condicional dentro dele e somente dar um include nos models que usam. Esses models não precisariam de nenhum código adicional para que essa validação funcionasse. Não acho que ficaria "pesado" e estaria suficientemente isolado e organizado.

tapajos commented 12 years ago

@tinogomes +1 para matar isso.