Lançado Adianti Framework 7.6!
Clique aqui para saber mais
TCNSValidator 1.1 - Validação para o Cartão SUS Em meus desenvolvimentos, houve a necessidade de se criar um campo para receber o número do Cartão Nacional de Saúde (SUS). Até aqui sem problemas, mas esse tipo de campo precisava ser validado. No site da DATASUS, no Portal de Cadastros Nacionais, você encontra a rotina de validação em várias linguagens: cartaonet.datasus.gov.br/downloadsNovo.asp Porém, o código apresentado é bem "...
AG
TCNSValidator 1.1 - Validação para o Cartão SUS  
Em meus desenvolvimentos, houve a necessidade de se criar um campo para receber o número do Cartão Nacional de Saúde (SUS). Até aqui sem problemas, mas esse tipo de campo precisava ser validado. No site da DATASUS, no Portal de Cadastros Nacionais, você encontra a rotina de validação em várias linguagens: cartaonet.datasus.gov.br/downloadsNovo.asp

Porém, o código apresentado é bem "didático" e nem um pouco otimizado. Além disso, ele possui 2 validações diferentes, uma para números que começam com 1 ou 2, e outra para números que começam com 7, 8 ou 9. Para outros números a resposta deve ser inválida.

Sem mais delongas, vamos ao código:

  1. <?php
  2. /**
  3.  * Classe para validar número do Cartão SUS (CNS)
  4.  *
  5.  * @version    1.1
  6.  * @package    validator
  7.  * @autor      André Ricardo Fort
  8.  * @site       http://www.infort.eti.br/
  9.  **/
  10. class TCNSValidator extends TFieldValidator
  11. {
  12.     private $cns;
  13.     
  14.     /**
  15.      * Validate a given value
  16.      * @param $label Identifies the value to be validated in case of exception
  17.      * @param $value Value to be validated
  18.      * @param $parameters aditional parameters for validation (ex: mask)
  19.      */
  20.     public function validate($label$value$parameters NULL)
  21.     {
  22.         // Retira todos os caracteres que nao sejam 0-9
  23.         $this->cns preg_replace('/[^0-9]/'''$value);
  24.         
  25.         // Retorna falso se for diferente que 15 caracteres
  26.         if ((strlen(trim($this->cns))) != 15) { 
  27.             throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS'$label));
  28.         }
  29.         
  30.         // Retorna falso se houver letras no cns
  31.         if (!(preg_match('/[0-9]/',$this->cns)))
  32.         {
  33.             throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS'$label));
  34.         }
  35.         
  36.         $acao substr($this->cns,0,1);
  37.         switch ($acao)
  38.         {
  39.             case '1':
  40.             case '2'$ret $this->validaCNS(); break;
  41.             case '7':
  42.             case '8':
  43.             case '9'$ret $this->validaCNS_PROVISORIO(); break;
  44.             default: $ret FALSE;
  45.         }
  46.         
  47.         // Analisa o retorno e gera um Exception se for falso
  48.         if (!$ret)
  49.         {
  50.             throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS'$label));
  51.         }
  52.     }
  53.     
  54.     private function validaCNS()
  55.     {
  56.         $pis substr($this->cns,0,11);
  57.         $soma 0;
  58.         for ( $i 0$j strlen($pis), $k 15$i $j$i++, $k-- )
  59.         {
  60.             $soma += $pis[$i] * $k;
  61.         }
  62.         $dv 11 fmod($soma11);
  63.         $dv = ($dv != 11) ? $dv '0'// retorna '0' se for igual a 11
  64.         if ( $dv == 10 )
  65.         {
  66.             $soma += 2;
  67.             $dv 11 fmod($soma11);
  68.             $resultado $pis.'001'.$dv;
  69.         }
  70.         else
  71.         {
  72.             $resultado $pis.'000'.$dv;
  73.         }
  74.         if ( $this->cns != $resultado )
  75.         {
  76.             return FALSE;
  77.         }
  78.         else
  79.         {
  80.             return TRUE;
  81.         }
  82.     }
  83.     
  84.     private function validaCNS_PROVISORIO()
  85.     {
  86.         $soma 0;
  87.         for ( $i 0$j strlen($this->cns), $k $j$i $j$i++, $k-- )
  88.         {
  89.             $soma += $this->cns[$i] * $k;
  90.         }
  91.         return $soma 11 == && $j == 15;
  92.     }
  93. }
  94. ?>



Se notarem, eu adicionei uma tradução para essa validação no arquivo TApplicationTranslation.class.php, que fica na pasta "app/lib/util". Por se tratar de um documento, eu adicionei a tradução logo abaixo das linhas referente ao CPF. Ficou assim:

  1. <?php
  2.         ...
  3.         $this->messages['en'][] = 'The field ^1 has not a valid CPF';
  4.         $this->messages['en'][] = 'The field ^1 has not a valid CNS';
  5.         $this->messages['en'][] = 'The field ^1 contains an invalid e-mail';
  6.         ...
  7.         $this->messages['pt'][] = 'O campo ^1 não contém um CPF válido';
  8.         $this->messages['pt'][] = 'O campo ^1 não contém um CNS válido';
  9.         $this->messages['pt'][] = 'O campo ^1 contém um e-mail inválido';
  10.         ...
  11. ?>



Outra coisa importante, o arquivo TCNSValidator.class.php deve ser colocado na pasta "app/lib/validator" do seu projeto.

Para utilizá-lo, na sua classe de controle, basta chamá-lo como qualquer outro validador:
  1. <?php
  2. $sus->addValidation('CNS (SUS)', new TCNSValidator);
  3. ?>


Para a minha primeira contribuição e artigo acho que ficou legal. Quem tiver dúvidas ou sugestões para melhorar não deixe de comentar.
Abraços.

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (2)


NP

Olá, essa parte do código:
  1. <?php
  2. if ( $this->cns != $resultado )
  3. {
  4.        return FALSE;
  5. }
  6. else
  7. {
  8.          return TRUE;
  9. }
  10. ?>


pode ser reduzida para :
  1. <?php
  2. return $this->cns == $resultado;
  3. ?>
WQ

boa tarde tarde, como eu poderia usar em um cadastro buscando dados no datasus