<?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 titulo_eleitor_valido($codigo)/*{{{*/
{
	if(strlen($codigo) != 13 || !ctype_digit($codigo))
		return false;

	$cod_estado = substr($codigo, 9, 2);
	if($cod_estado < 1 || $cod_estado > 28)
		return false;

	$soma = 0;
	for($i=0; $i<9; ++$i)
		$soma += $codigo[$i]*(10-$i);
	$dv = $soma % 11;
	if($dv <= 1)
	{
		if($cod_estado <= 2)
			$dv = 1 - $dv;
		else
			$dv = 0;
	}
	else
		$dv = 11-$dv;

	if($dv != $codigo[11])
		return false;

	$soma = $dv*2;
	for($i=9; $i<11; ++$i)
		$soma += $codigo[$i]*(13-$i);
	$dv = $soma % 11;
	if($dv <= 1)
	{
		if($cod_estado <= 2)
			$dv = 1 - $dv;
		else
			$dv = 0;
	}
	else
		$dv = 11-$dv;

	if($dv != $codigo[12])
		return false;

	return true;
}/*}}}*/

class TituloEleitor extends Documento
{
	function setTableDefinition()
	{
		$this->setTableName('saude.titulo_eleitor');

		$this->hasColumn('numero', 'string', 13,
			array('fixed','notnull','notblank','unique'));
		$this->hasColumn('zona', 'integer');
		$this->hasColumn('secao', 'integer');

		$this->hasColumn('idpessoa', 'integer', NULL, array('notnull'));

		Documento::setTableDefinition();
	}

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

		$erros = array();

		if(!$this->numero)
			$erros[] = 'O numero do título de eleitor deve ser informado';
		else if(!titulo_eleitor_valido($this->numero))
			$erros[] = 'Número do título de eleitor inválido: '.$this->numero;

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

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

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

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

?>
