<?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 'begin.php';

try
{
//	$doc->execute('set enable_seqscan=off');
//	$doc->execute('set enable_indexscan=off');

	$sql = Doctrine_Query::create()
		->select("p.id, p.nome, p.nome_mae, cpf.numero, cns.numero,
			      p.data_atualizacao")
		->from('CabcomumPessoa p')
		->leftJoin('p.documentos cpf with cpf.idtipo_documento=5 INDEXBY cpf.idtipo_documento')
		->leftJoin('p.documentos cns with cns.idtipo_documento=6 INDEXBY cns.idtipo_documento');

	// Evita resultados inconsistentes nos queries
	$doc->transaction->setIsolation('SERIALIZABLE');

	$tables = array('p.id', 'p.nome', 'p.nome_mae', 'cpf.numero', 'cns.numero',
					'p.data_atualizacao', 'p.data_atualizacao');

	$where = array();
	$params = array();

	$has_temp_pessoas = false;

	// Busca por nome?
	if(!empty($_GET["sSearch_1"]))
	{
		$words = str_word_count(normaliza($_GET["sSearch_1"]), 1);
		$search = implode(' & ', $words);

		$doc->execute("create TEMP TABLE temp_pessoas as select id as idpessoa_temp from cabcomum.pessoa where to_tsvector('portuguese',nome) @@ to_tsquery('portuguese',?)",array($search));

		$has_temp_pessoas = true;

		$where[] = "p.id in (select idpessoa_temp from temp_pessoas)";
	}

	// Busca por cpf?
	if(!empty($_GET["sSearch_3"]))
	{
		$params = input_cpf($_GET["sSearch_3"]);
		$where[] = "cpf.numero = ?";
	}

	// Busca por cns?
	if(!empty($_GET["sSearch_4"]))
	{
		$params = input_cns($_GET["sSearch_4"]);
		$where[] = "cns.numero = ?";
	}

	$where = implode(' and ',$where);

	if($where)
		$sql->where($where, $params);

	if(isset($_GET['iDisplayStart']))
	{
		$sql->limit($_GET['iDisplayLength'])
			->offset($_GET['iDisplayStart']);
	}

	if(isset($_GET['iSortCol_0']))
	{
		for($i=0; $i<$_GET['iSortingCols']; ++$i)
		{
			$sql->orderBy("{$tables[$_GET["iSortCol_$i"]]} {$_GET["iSortDir_$i"]}");
		}
	}

	$pessoas = $sql->execute();

	$total_records = Doctrine::getTable('CabcomumPessoa')->count();

	if($where)
	{
		$sql = Doctrine_Query::create()
			->select('count(*)')
			->from('CabcomumPessoa p');

		if(strpos($where, 'cns') !== false)
			$sql = $sql->innerJoin('p.documentos cns with cns.idtipo_documento=6 INDEXBY cns.idtipo_documento');
		if(strpos($where, 'cpf') !== false)
			$sql = $sql->innerJoin('p.documentos cpf with cpf.idtipo_documento=5 INDEXBY cpf.idtipo_documento');

		$filtered_records = $sql->where($where, $params)
			->fetchOne()->count;
	}
	else
		$filtered_records = $total_records;

	if($has_temp_pessoas)
		$doc->execute('drop table temp_pessoas');

	$saida = <<<EOT
	{
		"sEcho": {$_GET['sEcho']},
		"iTotalRecords": $total_records,
		"iTotalDisplayRecords": $filtered_records,
		"sColumns": "idpessoa,nome_pessoa,nome_mae,cpf,cns,situacao,data_atualizacao",
		"aaData": [
EOT;

	$userdata = array();
	foreach($pessoas as $p)
	{
		$nome_pessoa = json_encode($p->nome?$p->nome:'');
		$nome_mae = json_encode($p->nome_mae?$p->nome_mae:'');
		$cpf = json_encode(output_cpf($p->documentos[ID_DOC_CPF]->numero));
		$cns = json_encode(output_cns($p->documentos[ID_DOC_CNS]->numero));
/*
		switch($p->situacao->codigo)
		{
		case SituacaoFormulario::SEM_VALIDACAO:
			$situacao = json_encode('sem_validacao');
			break;
		case SituacaoFormulario::NAO_VALIDADO:
			$situacao = json_encode('nao_validado');
			break;
		case SituacaoFormulario::VALIDADO:
			$situacao = json_encode('validado');
			break;
		default:
			$situacao = json_encode('');
		}
 */
		$situacao = json_encode('');

		$data_atualizacao = json_encode(output_timestamp($p->data_atualizacao));

		$userdata[] = "[$p->id,$nome_pessoa, $nome_mae, $cpf, $cns, $situacao, $data_atualizacao]";
	}

	$saida .= implode(',',$userdata);

	$saida .= "]\n}";

//	throw new Exception($saida);

	echo $saida;
}
catch(Exception $e)
{
	$msg = json_encode($e->getMessage());
	echo <<<EOT
{
	"error" : $msg,
	"sEcho": {$_GET['sEcho']},
	"iTotalRecords": 0,
	"iTotalDisplayRecords": 0,
	"sColumns": "idpessoa,nome_pessoa,nome_mae,cpf,cns,situacao,data_atualizacao",
	"aaData": []
}
EOT;
}

?>
