<?PHP
/*
 * DIREITOS AUTORAIS RESERVADOS (C) 2007 UFRJ
 * 
 * ESTE PROGRAMA É SOFTWARE LIVRE; VOCÊ PODE REDISTRIBUÍ-LO E/OU MODIFICÁ-LO SOB OS
 * TERMOS DA LICENÇA PÚBLICA GERAL GNU CONFORME PUBLICADA PELA FREE SOFTWARE FOUNDATION;
 * TANTO A VERSÃO 2 DA LICENÇA, COMO (A SEU CRITÉRIO) QUALQUER VERSÃO POSTERIOR.

 * ESTE PROGRAMA É DISTRIBUÍDO NA EXPECTATIVA DE QUE SEJA ÚTIL, PORÉM, SEM NENHUMA GARANTIA;
 * NEM MESMO A GARANTIA IMPLÍCITA DE COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA.
 * CONSULTE A LICENÇA PÚBLICA GERAL DO GNU PARA MAIS DETALHES.
 * 
 * VOCÊ DEVE TER RECEBIDO UMA CÓPIA DA LICENÇA PÚBLICA GERAL DO GNU JUNTO COM ESTE PROGRAMA; 
 * SE NÃO, ACESSE <<HTTP://WWW.GNU.ORG/LICENSES/LICENSES.PT-BR.HTML>>
 */

<?

require_once 'documento.php';

function cns_valido($codigo)/*{{{*/
{
	if(strlen($codigo) != 15 || !ctype_digit($codigo))
		return false;

	// Eh mais rápido testar se o codigo eh composto de
	// digitos iguais assim...
	$igual = true;
	for($j=1; $j<15; ++$j)
	{
		if($codigo[$j] != $codigo[$j-1])
		{
			$igual = false;
			break;
		}
	}
	if($igual)
		return false;

	// Eh o cartão é o definitivo?
	if ($codigo[0] != '8' && $codigo[0] != '9')
	{
		// O número é formado a partir do número do PIS
		$pis = substr($codigo,0,11);
		$soma = 0;
		for($i=0; $i<11; ++$i)
			$soma += $pis[$i] * (15-$i);
			
		$dv = 11 - $soma % 11;
		if($dv == 11)
			$dv = 0;

		if($dv == 10)
		{
			$soma += 2;
			$dv = 11 - $soma % 11;
			$resultado = $pis."001".$dv;
		}
		else
			$resultado = $pis."000".$dv;

		if(strcmp($codigo, $resultado) != 0)
			return false;
	}
	// É o provisório?
	else
	{
		$soma = 0;
		for($i=0; $i<15; ++$i)
			$soma += $codigo[$i] * (15-$i);

		$dv = $soma % 11;
		if ($dv != 0)
			return false;
	}

	return true;
}/*}}}*/
function output_cns($cns)/*{{{*/
{
	if($cns)
	{
		if(is_numeric($cns))
		{
			return substr($cns, 0, 3).' '.
				   substr($cns, 3, 4).' '.
				   substr($cns, 7, 4).' '.
				   substr($cns, 11, 4);
		}
		else
			return $cns;
	}
	else
		return '';
}/*}}}*/
function input_cns($cns)/*{{{*/
{
	if($cns)
	{
		return substr($cns, 0, 3).
			   substr($cns, 4, 4).
			   substr($cns, 9, 4).
			   substr($cns, 14, 4);
	}
	else
		return '';
}/*}}}*/

class CNS extends Documento
{
	function setTableDefinition()
	{
		$this->setTableName('saude.cns');
		$this->hasColumn('numero','string', 15, 
			array('notnull','notblank','fixed','unique'));

		$this->hasColumn('idpessoa', 'integer', NULL, array('notnull'));
		Documento::setTableDefinition();
	}

	function validate()
	{
		Documento::validate();

		$erros = array();

		if(!$this->numero)
			$erros[] = 'O numero do SUS deve ser informado';
		else if(!cns_valido($this->numero))
			$erros[] = 'Número SUS inválido';

		if($erros)
			throw new Exception(implode("\n",$erros));
	}

	function setUp()
	{
		Documento::setUp();

		$this->index('unique_pessoa_cns',
			array('fields'=>array('idpessoa'),
			      'type'=>'unique'));

		$this->hasOne('Pessoa as pessoa',
			array('local'=>'idpessoa',
			      'foreign'=>'id'));
	}
};

?>
