<?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>>
 */

<?php

require_once '../../common/begin.php';

/*

Setor: Sa�de

Indicador: 
	SA3. Taxa de Freq��ncia da Popula��o Infantil � Rede de Servi�os Municipais
	de Sa�de

Defini��o: 
	N�mero de registros da popula��o infantil, no semestre e ao fim de um ano, 
	obtidos a partir dos atendimentos feitos na rede municipal de sa�de.

C�lculo: 
	Quantidade de atendimentos feitos, em m�dia, para cada crian�a na rede de 
	servi�os municipais de sa�de, ao longo de um semestre e de um ano.

Unidade de medida: 
	N�mero de atendimentos realizados em m�dia por cada crian�a segundo faixa 
	et�ria (0, 1, 2-4, 4-6, mais de 6)/ total de crian�as na faixa 
	correspondente * 100

Periodicidade de c�lculo: 
	Semestral e Anual

Granularidade: 
	Para o munic�pio. Separar tamb�m por tipo de atendimento (consultas, 
	exames, outros) e por faixas et�rias (menor de um ano, 1 ano, 2-4 anos, 5-9 
	anos, 10-14 anos)

Estilo: 
	Maior, melhor

Fonte: 
	Sistema de Coleta de Dados do Usu�rio da Rede de Sa�de - form online

Observa��es: 
	Meta: ao menos dois atendimentos anuais at� 6 anos

*/

/* 

Parametros de entrada:
	indicador (SA3)
	granularidade (municipio, modalidade, faixaetaria)
	periodo (semestral: S1,S2, ano: numerico)

Formato do retorno
	CCC;III;G1;PPP;VVV
	CCC = c�digo de retorno da chamada ao Calculador
	III = c�digo do indicador retornado, em caixa baixa
	G1 = nome do gr�o retornado (string, pode estar acentuado 
		 e com letras ma�usculas e min�sculas)
	PPP = per�odo de refer�ncia do valor retornado
VVV = valor retornado
	
Exemplos de retorno:
	0;as2;CRAS;1;01/2010;13,2
	0;as2;CRAS;10;01/2010;10,2
	0;as2;CRAS Austin;11;01/2010;11
	
C�digos de Retorno:
	0 - Sucesso
	1 - N�o tenho valor
	2 - N�o sou eu
	3 - Um ou mais Par�metros obrigat�rios faltando
	4 - Um ou mais Par�metros fora do formato esperado
	5 - Granularidade invalida
*/

$indicador = $_GET["indicador"];
$granularidade = $_GET["granularidade"];
$periodo = $_GET["periodo"];

// obrigatoriedade dos par�metros
if(empty($indicador) || empty($granularidade) || empty($periodo))
{
    echo "3";
    exit;
}

// indicador correto
if(strtoupper($indicador) != "SA3")
{
    echo "2";
    exit;
}

$data_ini = null;
$data_fim = null;

// Anual?
if(is_numeric($periodo))
{
	$ano = $periodo;

	$data_ini = "$ano-01-01";
	$data_fim = "$ano-12-31";
}
else if($periodo[0] == 'S')
{
	list($semestre,$ano) = split('/',$periodo);

	if($semestre == 'S1')
	{
		$data_ini = "$ano-01-01";
		$data_fim = "$ano-06-30";
	}
	else if($semestre == 'S2')
	{
		$data_ini = "$ano-07-01";
		$data_fim = "$ano-12-31";
	}
	else
	{
		echo "4";
		exit;
	}
}
else
{
	echo "4";
	exit;
}

if($granularidade == 'faixaetaria')/*{{{*/
{
	$faixas = array('0 a 1' => array(0,0),
					'1' => array(1,1),
					'2 a 4' => array(2,4),
					'5 a 9' => array(5,9),
					'10 a 14' => array(10,14));

	$idfaixa = 0;
	$sql = 'select case';
	foreach($faixas as $limites)
	{
		$sql .= <<<EOT
			when extract(year from age(p.data_nascimento)) 
					between {$limites[0]} and {$limites[1]} then $idfaixa
EOT;
		++$idfaixa;
	}
	$sql .= <<<EOT
		else $idfaixa
		end as idfaixa,
		avg(pc.count)
		from (select p.id, count(c.*) 
			  from saude.pessoa as p
			  left join saude.comparecimento c on p.id = c.idpessoa 
			  where c.id is null or c.data between '$data_ini' and '$data_fim'
			  group by p.id) as pc
		inner join saude.pessoa as p on p.id = pc.id
		group by idfaixa
EOT;

	$infos = $doc->fetchAll($sql);

	$nome_faixas = array_keys($faixas);
	$valores = array();

	foreach($infos as $info)
		$valores[$info['idfaixa']] = $info['avg'];// / $info['count']*100.0;


	foreach($nome_faixas as $f => $nome)
	{
		$valor = isset($valores[$f]) ? $valores[$f] : 0;
		echo "0;$indicador;".$nome.";$periodo;".$valor."\n";
	}
}/*}}}*/
else if($granularidade == 'municipio')/*{{{*/
{
	$sql = <<<EOT
		select avg(pc.count)
		from (select p.id, count(c.*) 
			  from saude.pessoa as p
			  left join saude.comparecimento c on p.id = c.idpessoa 
			  where c.id is null or c.data between '$data_ini' and '$data_fim'
			  group by p.id) as pc
EOT;

	$info = $doc->fetchRow($sql);

	$valor = $info['avg'];

	echo "0;$indicador;Nova Igua�u;$periodo;".$valor;
}/*}}}*/
else if($granularidade == 'modalidade')/*{{{*/
{
	$sql = <<<EOT
		select m.nome, avg(pc.count)
		from saude.motivo as m
		left join (select mc.idmotivo, p.id, count(c.*) 
			  from saude.pessoa as p
			  left join saude.comparecimento c on p.id = c.idpessoa 
			  left join saude.motivo_comparecimento mc on c.id = mc.idcomparecimento
			  where c.id is null or c.data between '$data_ini' and '$data_fim'
			  group by mc.idmotivo,p.id) as pc on m.id = pc.idmotivo
		group by m.nome
EOT;

	$infos = $doc->fetchAll($sql);

	foreach($infos as $info)
	{
		$valor = $info['avg'] ? $info['avg'] : 0;
		echo "0;$indicador;".iconv('utf8','latin1',$info['nome'])
			.";$periodo;".$valor."\n";
	}
}/*}}}*/
else/*{{{*/
{
	echo "5";
	exit;
}/*}}}*/

?>
