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. * Validate a given value
  15. * @param $label Identifies the value to be validated in case of exception
  16. * @param $value Value to be validated
  17. * @param $parameters aditional parameters for validation (ex: mask)
  18. */
  19. public function validate($label, $value, $parameters = NULL)
  20. {
  21. // Retira todos os caracteres que nao sejam 0-9
  22. $this->cns = preg_replace('/[^0-9]/', '', $value);
  23. // Retorna falso se for diferente que 15 caracteres
  24. if ((strlen(trim($this->cns))) != 15) {
  25. throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS', $label));
  26. }
  27. // Retorna falso se houver letras no cns
  28. if (!(preg_match('/[0-9]/',$this->cns)))
  29. {
  30. throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS', $label));
  31. }
  32. $acao = substr($this->cns,0,1);
  33. switch ($acao)
  34. {
  35. case '1':
  36. case '2': $ret = $this->validaCNS(); break;
  37. case '7':
  38. case '8':
  39. case '9': $ret = $this->validaCNS_PROVISORIO(); break;
  40. default: $ret = FALSE;
  41. }
  42. // Analisa o retorno e gera um Exception se for falso
  43. if (!$ret)
  44. {
  45. throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS', $label));
  46. }
  47. }
  48. private function validaCNS()
  49. {
  50. $pis = substr($this->cns,0,11);
  51. $soma = 0;
  52. for ( $i = 0, $j = strlen($pis), $k = 15; $i < $j; $i++, $k-- )
  53. {
  54. $soma += $pis[$i] * $k;
  55. }
  56. $dv = 11 - fmod($soma, 11);
  57. $dv = ($dv != 11) ? $dv : '0'; // retorna '0' se for igual a 11
  58. if ( $dv == 10 )
  59. {
  60. $soma += 2;
  61. $dv = 11 - fmod($soma, 11);
  62. $resultado = $pis.'001'.$dv;
  63. }
  64. else
  65. {
  66. $resultado = $pis.'000'.$dv;
  67. }
  68. if ( $this->cns != $resultado )
  69. {
  70. return FALSE;
  71. }
  72. else
  73. {
  74. return TRUE;
  75. }
  76. }
  77. private function validaCNS_PROVISORIO()
  78. {
  79. $soma = 0;
  80. for ( $i = 0, $j = strlen($this->cns), $k = $j; $i < $j; $i++, $k-- )
  81. {
  82. $soma += $this->cns[$i] * $k;
  83. }
  84. return $soma % 11 == 0 && $j == 15;
  85. }
  86. }
  87. ?>



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 Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework 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