segunda-feira, 28 de maio de 2012

Codeigniter - Validando CNPJ em formulários

Salve!

Segue agora uma função para validar CNPJ em formulários com o Codeigniter.
Essa função deve ser inserida no final do arquivo "Form_validation.php" que geralmente se encontra em: "/* Location: ./system/libraries/Form_validation.php */"


Obs: Nessa função, o formato do CNPJ deve ser: 00.000.000/0000-00
Sem os pontos, barra e traço apresentará erro!!


Função:
 /**
      * Verifica se o CNPJ é valido
      * @param     string
      * @return     bool
      */
     function valid_cnpj($str)
     {
         if (strlen($str) <> 18) return FALSE;
         $soma1 = ($str[0] * 5) +
                 ($str[1] * 4) +
                 ($str[3] * 3) +
                 ($str[4] * 2) +
                 ($str[5] * 9) +
                 ($str[7] * 8) +
                 ($str[8] * 7) +
                 ($str[9] * 6) +
                 ($str[11] * 5) +
                 ($str[12] * 4) +
                 ($str[13] * 3) +
                 ($str[14] * 2);
         $resto = $soma1 % 11;
         $digito1 = $resto < 2 ? 0 : 11 - $resto;
         $soma2 = ($str[0] * 6) +
                 ($str[1] * 5) +
                 ($str[3] * 4) +
                 ($str[4] * 3) +
                 ($str[5] * 2) +
                 ($str[7] * 9) +
                 ($str[8] * 8) +
                 ($str[9] * 7) +
                 ($str[11] * 6) +
                 ($str[12] * 5) +
                 ($str[13] * 4) +
                 ($str[14] * 3) +
                 ($str[16] * 2);
         $resto = $soma2 % 11;
         $digito2 = $resto < 2 ? 0 : 11 - $resto;
         return (($str[16] == $digito1) && ($str[17] == $digito2));
     }

     // --------------------------------------------------------------------



Não se esqueça de adicionar a seguinte linha no arquivo de mensagens de erro de validação de formulários:

$lang['valid_cnpj'] = "O campo %s nao e um CNPJ valido. Use o formato 00.000.000/0000-00";


Para chamar a validação do formulário em um controller, utilize e seguinte linha:

$this->form_validation->set_rules('cnpj', 'CNPJ', 'required|valid_cnpj');




Duvidas?? Deixe um comentário...

8 comentários:

  1. O cnpj 00.000.000/0000-00 é cadastrado como valido, como fazemos para não permitir isso????

    ResponderExcluir
  2. Fiz tudo como esta acima e o meu não funcionou, mesmo colocando um cnpj inválido o cadastro passa da mesma forma.

    ResponderExcluir
  3. Galera alguem pode me ajudar ...

    o meu CNPJ também não funcionou 11.111.111/1111-11 foi salvo no banco de dados...

    ResponderExcluir
  4. Funcionou perfeitamente. Para evitar registros com 0, adicione "is_natural_no_zero" na validação assim:

    $this->form_validation->set_rules('cnpj', 'CNPJ', 'required|valid_cnpj|is_natural_no_zero');

    ResponderExcluir
    Respostas
    1. se você inserir um número de cnpj gerado no derador de testes ele apresenta erro

      mesmo utilizando a configuração citada "is_natural_no_zero"

      -- Campo requer somente número maior que zero

      Excluir
    2. Ao acrescentar no codigo uma alteração para não aceitar os campos preenchidos com zero

      if($str == '00.000.000/0000-00') return FALSE;

      Excluir
  5. se você inserir um número de cnpj gerado no derador de testes ele apresenta erro

    mesmo utilizando a configuração citada "is_natural_no_zero"

    -- Campo requer somente número maior que zero

    ResponderExcluir
  6. //--------------------------------------------------------------------

    /**
    * Verifica se o CNPJ é valido
    * @param string
    * @return bool
    */

    function valid_cnpj($str)
    {
    if($str == '00.000.000/0000-00') return FALSE;

    if (strlen($str) <> 18) return FALSE;

    $soma1 = ($str[0] * 5) +
    ($str[1] * 4) +
    ($str[3] * 3) +
    ($str[4] * 2) +
    ($str[5] * 9) +
    ($str[7] * 8) +
    ($str[8] * 7) +
    ($str[9] * 6) +
    ($str[11] * 5) +
    ($str[12] * 4) +
    ($str[13] * 3) +
    ($str[14] * 2);
    $resto = $soma1 % 11;
    $digito1 = $resto < 2 ? 0 : 11 - $resto;
    $soma2 = ($str[0] * 6) +
    ($str[1] * 5) +
    ($str[3] * 4) +
    ($str[4] * 3) +
    ($str[5] * 2) +
    ($str[7] * 9) +
    ($str[8] * 8) +
    ($str[9] * 7) +
    ($str[11] * 6) +
    ($str[12] * 5) +
    ($str[13] * 4) +
    ($str[14] * 3) +
    ($str[16] * 2);
    $resto = $soma2 % 11;
    $digito2 = $resto < 2 ? 0 : 11 - $resto;
    return (($str[16] == $digito1) && ($str[17] == $digito2));
    }

    // --------------------------------------------------------------------
    $lang['valid_cnpj'] = "O campo %s nao e um CNPJ valido. Use o formato 00.000.000/0000-00";

    //------------------------------------------------------------------------------------------

    $this->form_validation->set_rules('cnpj', 'CNPJ', 'required|valid_cnpj');

    ResponderExcluir