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:
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:
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:
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.
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:
- <?php
- /**
- * Classe para validar número do Cartão SUS (CNS)
- *
- * @version 1.1
- * @package validator
- * @autor André Ricardo Fort
- * @site http://www.infort.eti.br/
- **/
- class TCNSValidator extends TFieldValidator
- {
- private $cns;
- /**
- * Validate a given value
- * @param $label Identifies the value to be validated in case of exception
- * @param $value Value to be validated
- * @param $parameters aditional parameters for validation (ex: mask)
- */
- public function validate($label, $value, $parameters = NULL)
- {
- // Retira todos os caracteres que nao sejam 0-9
- $this->cns = preg_replace('/[^0-9]/', '', $value);
- // Retorna falso se for diferente que 15 caracteres
- if ((strlen(trim($this->cns))) != 15) {
- throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS', $label));
- }
- // Retorna falso se houver letras no cns
- if (!(preg_match('/[0-9]/',$this->cns)))
- {
- throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS', $label));
- }
- $acao = substr($this->cns,0,1);
- switch ($acao)
- {
- case '1':
- case '2': $ret = $this->validaCNS(); break;
- case '7':
- case '8':
- case '9': $ret = $this->validaCNS_PROVISORIO(); break;
- default: $ret = FALSE;
- }
- // Analisa o retorno e gera um Exception se for falso
- if (!$ret)
- {
- throw new Exception(TApplicationTranslator::translate('The field ^1 has not a valid CNS', $label));
- }
- }
- private function validaCNS()
- {
- $pis = substr($this->cns,0,11);
- $soma = 0;
- for ( $i = 0, $j = strlen($pis), $k = 15; $i < $j; $i++, $k-- )
- {
- $soma += $pis[$i] * $k;
- }
- $dv = 11 - fmod($soma, 11);
- $dv = ($dv != 11) ? $dv : '0'; // retorna '0' se for igual a 11
- if ( $dv == 10 )
- {
- $soma += 2;
- $dv = 11 - fmod($soma, 11);
- $resultado = $pis.'001'.$dv;
- }
- else
- {
- $resultado = $pis.'000'.$dv;
- }
- if ( $this->cns != $resultado )
- {
- return FALSE;
- }
- else
- {
- return TRUE;
- }
- }
- private function validaCNS_PROVISORIO()
- {
- $soma = 0;
- for ( $i = 0, $j = strlen($this->cns), $k = $j; $i < $j; $i++, $k-- )
- {
- $soma += $this->cns[$i] * $k;
- }
- return $soma % 11 == 0 && $j == 15;
- }
- }
- ?>
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:
- <?php
- ...
- $this->messages['en'][] = 'The field ^1 has not a valid CPF';
- $this->messages['en'][] = 'The field ^1 has not a valid CNS';
- $this->messages['en'][] = 'The field ^1 contains an invalid e-mail';
- ...
- $this->messages['pt'][] = 'O campo ^1 não contém um CPF válido';
- $this->messages['pt'][] = 'O campo ^1 não contém um CNS válido';
- $this->messages['pt'][] = 'O campo ^1 contém um e-mail inválido';
- ...
- ?>
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:
- <?php
- $sus->addValidation('CNS (SUS)', new TCNSValidator);
- ?>
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.
Olá, essa parte do código:
pode ser reduzida para :
boa tarde tarde, como eu poderia usar em um cadastro buscando dados no datasus