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

try
{
	$sql = Doctrine_Query::create()
		->from('Usuario u')
		->leftJoin('u.unidade un')
		->leftJoin('u.tipo t');

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

	$where = 'u.login <> ? or u.idtipo <> ?';
	$params = array('admin',TipoUsuario::ADMINISTRADOR);

	if(isset($_GET['sSearch']))
	{
		$search = '%'.$_GET['sSearch'].'%';

		$where .= ' and (u.login ilike ? or un.nome_fantasia ilike ?)';
		$params[] = $search;
		$params[] = $search;
	}

	$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)
		{
			switch($_GET["iSortCol_$i"])
			{
			case 0:
				$col = "u.login";
				break;
			case 1:
				$col = "t.nome";
				break;
			case 2:
				$col = "un.nome_fantasia";
				break;
			}

			$sql->orderBy("$col ".$_GET["iSortDir_$i"]);
		}
	}

	$users = $sql->execute();

	$total_records = Doctrine_Query::create()
		->select('count(*)')
		->from('Usuario u')
		->where('u.idtipo <> ?',TipoUsuario::ADMINISTRADOR)
		->fetchOne()->count;

	$filtered_records = Doctrine_Query::create()
		->select('count(*)')
		->from('Usuario u')
		->leftJoin('u.unidade un')
		->leftJoin('u.tipo t')
		->where($where, $params)
		->fetchOne()->count;

	echo <<<EOT
	{
		"sEcho": {$_GET['sEcho']},
		"iTotalRecords": $total_records,
		"iTotalDisplayRecords": $filtered_records,
		"sColumns": "username,tipo,unidade,iduser",
		"aaData": [
EOT;

	$userdata = array();
	foreach($users as $u)
	{
		$username = json_encode($u->login);
		$unidade = json_encode($u->unidade->nome_fantasia);
		$tipo = json_encode($u->tipo->nome);

		$userdata[] = "[$username, $tipo, $unidade, $u->id]";
	}

	echo implode(',',$userdata);

	echo "]\n}";
}
catch(Exception $e)
{
	$msg = json_encode($e->getMessage());
	echo <<<EOT
{
	"error" : $msg,
	"sEcho": {$_GET['sEcho']},
	"iTotalRecords": 0,
	"iTotalDisplayRecords": 0,
	"sColumns": "username,tipo,unidade,iduser",
	"aaData": []
}
EOT;
}

?>
