ulissesalmeida / cnpj

A Brazilian CNPJ validation written in Elixir.
MIT License
4 stars 3 forks source link

Não considerar certos casos como CNPJ válido #1

Open leandro opened 3 years ago

leandro commented 3 years ago

Eu percebi que há alguns casos em que certas entradas de 14 dígitos não deveriam estar sendo consideradas como CNPJ válidos.

A questão é: há casos onde me é informado entradas variadas de 14 dígitos, onde precisamos verificar se essa entrada é um CNPJ válido ou um CPF válido (removendo os 3 primeiros dígitos). E por conta disso me deparei com um caso onde tanto os 14 dígitos configuram como um CNPJ válido, quanto os últimos 11 dígitos configuram como um CPF válido (quando a realidade é que essa entrada é apenas um CPF válido).

Percebi que a solução se dá fazendo certas verificações para o caso de CNPJs e, para isso, segue uma citação que extraí desse link aqui:

Não será considerado válido CNPJ com número de ORDEM igual a 0000 Não será considerado válido CNPJ com número de ORDEM maior do que 0300 e com as três primeiras posições do número BÁSICO com 000 (zeros). Esta crítica não será feita, quando o no básico do CNPJ for igual a 00.000.000

Acredito que atualmente a lib não está levando em consideração essas regras acima na hora de validar o CNPJ. O que acha de incluirmos isso no algoritmo de validação de CNPJ? Se precisarem de um suposto CNPJ (que na verdade é um CPF) que caia nesse caso, me peçam no privado (meu e-mail: leandroico@gmail.com), para que não se exponha publicamente CPF de terceiros por aqui.

ulissesalmeida commented 3 years ago

Eu acho uma boa ideia adicionar mais lógica na validação sim para poder pegar mais casos de CNPJ inválidos. O algoritmo atual foi inspirado na Wikipedia mesmo: https://pt.wikipedia.org/wiki/Cadastro_Nacional_da_Pessoa_Jur%C3%ADdica

Você sabe de onde o participante do fórum tirou essas regras adicionais? Não que eu não confie nele, mas seria legal ter mais alguma fonte que suporta essas regras adicionais.

leandro commented 3 years ago

Acredito que ele tenha tirado desse link aqui: http://www.receita.fazenda.gov.br/publico/Legislacao/atos/AtosConjuntos/AnexoIADEConjuntoCoratCotec0012002.doc

Se assim, você achar procedente, eu posso prover um PR para resolver essas questões.

ulissesalmeida commented 3 years ago

Maravilha! Manda bala ❤️

leandro commented 3 years ago

Eu havia reportado o mesmo problema nessa outra lib aqui. E um dos contribuidores já propôs uma solução: https://github.com/williamgueiros/Brcpfcnpj/pull/30.

Acha que vale usarmos algo parecido?

ulissesalmeida commented 3 years ago

Opa, algo parecido parece bacana.

Acho que a lógica vai precisar ser adicionada aqui com a variável safe_digits https://github.com/ulissesalmeida/cnpj/blob/master/lib/cnpj/cnpj.ex#L147

A diferença aqui, é que o safe_digits é uma lista de inteiros, então ao invés de usar o modulo String, você vai precisar usar Enum ou List, ou pattern matching com listas.

Tambem seria legal adicionar bastantes exemplos de invalidos para exercitar os ramos de excessões do codigo.

VitorTrin commented 3 years ago

Eu que fiz o pr na outra lib, e encontrei problemas no mundo real. O cpnj 11111111000191 não só é valido, como ele existe, e pelas regras desse documento, não deveria ser válido. Sugiro não continuar com esse pr até que uma fonte de regras mais confiável seja encontrada.

Em paralelo: Não encontrei lib em outra linguagem que também faça essa validação, mas não acredito que elixir foi a primeira linguaguem a ter esse problema

ulissesalmeida commented 3 years ago

Obrigado @VitorTrin pelo feedback!

Lembro quando eu estava pesquisando outras libs em outras linguagens, as validações eram bem diretas, não continham essa lista.

É melhor aguardar por mais confirmações mesmo. Enquanto isso, cada aplicação por criar sua própria lista de CNPJs proibidos ou inválidos.