<?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: 
	SA8. Assist�ncia ao Programa de Controle da Diabetes

Defini��o: 
	Distribui��o da popula��o de 30 a 69 anos com inscri��o em Programa de 
	Controle da Diabetes segundo n�mero de atendimentos realizados ao longo do 
	ano na rede municipal de servi�os de sa�de

C�lculo: 
	N�mero de atendimentos feitos por diab�tico (0, 1, 2-4, 4-6, mais de 6)

Unidade de medida: 
	%

Periodicidade de c�lculo: 
	Anual

Granularidade: 
	Para o atendimento e faixa et�ria (30-39, 40-49, 50-59, 60-69, 
	etc.)/atendimento

Estilo: 
	Maior, melhor

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

Observa��es: 
	N/D

*/

/* 

Parametros de entrada:
	indicador (SA8)
	granularidade (municipio, faixaetaria)
	periodo (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
	
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"];

$ID_DIABETES = 2;

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

// indicador correto
if(strtoupper($indicador) != "SA8")
{
    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
{
	echo "4";
	exit;
}

if($granularidade == 'faixaetariaatendimento')/*{{{*/
{
	$faixas = array('30 a 39' => array(39,39),
					'40 a 49' => array(40,49),
					'50 a 59' => array(50,59),
					'60 a 69' => array(60,69));

	$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,
		count(nullif(pc.cnt = 0, false)) as zero,
		count(nullif(pc.cnt = 1, false)) as um,
		count(nullif(pc.cnt between 2 and 3, false)) as dois_tres,
		count(nullif(pc.cnt between 4 and 6, false)) as quatro_seis,
		count(nullif(pc.cnt > 6, false)) as mais_de_seis

		from (select p.id, count(cp.*) as cnt
			  from saude.pessoa as p
			  left join (saude.comparecimento c
					inner join saude.comparecimento_programa cp 
						on cp.idcomparecimento=c.id 
					inner join saude.inscricao_programa ip 
						on cp.idinscricao_programa=ip.id 
							and ip.idprograma=$ID_DIABETES
			  ) on c.idpessoa=p.id
			  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);

	$valores = array();

	foreach($infos as $info)
		$valores[$info['idfaixa']] = $info;

	$nome_faixas = array_keys($faixas);

	foreach($nome_faixas as $f => $nome)
	{
		$valor = isset($valores[$f]) ? $valores[$f] : 0;

		foreach(array('zero'=>'nenhuma visita', 
					  'um'=>'uma visita', 
					  'dois_tres'=>'2 a 3 visitas',
					  'quatro_seis'=>'4 a 6 visitas', 
					  'mais_de_seis'=>'mais de 6 visitas') as $k=>$n)
		{
			echo "0;$indicador;$nome anos - $n;".$periodo.";".$valores[$f][$k]."\n";
		}
	}
}/*}}}*/
else if($granularidade == 'atendimento')/*{{{*/
{
	$sql = <<<EOT
		select
		count(nullif(pc.cnt = 0, false)) as zero,
		count(nullif(pc.cnt = 1, false)) as um,
		count(nullif(pc.cnt between 2 and 3, false)) as dois_tres,
		count(nullif(pc.cnt between 4 and 6, false)) as quatro_seis,
		count(nullif(pc.cnt > 6, false)) as mais_de_seis
		from (select p.id, count(c.*) as cnt
			  from saude.pessoa as p
			  left join (saude.comparecimento c
					inner join saude.comparecimento_programa cp 
						on cp.idcomparecimento=c.id 
					inner join saude.inscricao_programa ip 
						on cp.idinscricao_programa=ip.id 
							and ip.idprograma=$ID_DIABETES
			  ) on c.idpessoa=p.id
			  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'];

	foreach(array('zero'=>'nenhuma visita', 
				  'um'=>'uma visita', 
				  'dois_tres'=>'2 a 3 visitas',
				  'quatro_seis'=>'4 a 6 visitas', 
				  'mais_de_seis'=>'mais de 6 visitas') as $k=>$n)
	{
		echo "0;$indicador;"."Nova Igua�u - $n;".$periodo.";".$info[$k]."\n";
	}
}/*}}}*/
else/*{{{*/
{
	echo "5";
	exit;
}/*}}}*/


?>
