<?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';

$id = $_GET['id'];
$ano = isset($_GET['ano'])?$_GET['ano']:NULL;
$mes = isset($_GET['mes'])?$_GET['mes']:NULL;

$idunidade = isset($_GET['unidade'])?$_GET['unidade']:NULL;

$faixas = array('< 1' => array(0,0),
				'1 a 4' => array(1,4),
				'5 a 9' => array(5,9),
				'10 a 14' => array(10,14),
				'15 a 19' => array(15,19),
				'20 a 24' => array(20,24),
				'25 a 29' => array(25,29),
				'30 a 34' => array(30,34),
				'35 a 39' => array(35,39),
				'40 a 44' => array(40,44),
				'45 a 49' => array(45,49),
				'50 a 54' => array(50,54),
				'55 a 59' => array(55,59),
				'60 a 64' => array(60,64),
				'65 a 69' => array(65,69),
				'70 a 74' => array(70,74),
				'75 a 79' => array(75,79),
				'80+' => array(80,1000));



function periodos($ano, $mes)/*{{{*/
{
	if($ano)
	{
		if($mes)
		{
			$cur = mktime(0,0,0,$mes, 1, $ano);

			$maxdias = date('t',$cur);

			for($i=0; $i<5; ++$i, $cur += 7*24*60*60)
			{
				$beg = $i*7+1;
				if($beg > $maxdias)
					break;

				$end = min(($i+1)*7+1, $maxdias);

				$w = strftime('%V',$cur);
				$periodos[$w] = "dia $beg ao $end";
			}
		}
		else
		{
			$periodos = array(1 => 'Janeiro', 2 => 'Fevereiro', 
						 3 => 'Março', 4 => 'Abril', 5 => 'Maio',
						 6 => 'Junho', 7 => 'Julho', 8 => 'Agosto',
						 9 => 'Setembro', 10 => 'Outubro', 11 => 'Novembro',
						 12 => 'Dezembro');
		}
	}
	else
		$periodos = array(0 => 'Total');
	return $periodos;
}/*}}}*/
function select_periodo($ano, $mes)/*{{{*/
{
	if($ano)
	{
		$where = "where extract(year from c.data) = $ano";

		if($mes)
		{
			$campo_periodo = "extract(week from c.data) as periodo";
			$where .= " and extract(month from c.data) = $mes";
		}
		else
			$campo_periodo = "extract(month from c.data) as periodo";

		$joins="inner join comparecimento c on c.id = mc.idcomparecimento";
	}
	else
	{
		$campo_periodo = '0 as periodo';
		$where = 'where true';
	}

	return array($campo_periodo, $joins, $where);
}/*}}}*/

try
{
	$doc->execute("set search_path to saude");

	switch($id)
	{
	case 0: // {{{ Preenchimento do formulário
		// Freqüência de respostas em branco / preenchidas, por questão

		$campos_naopossui = array(
			'data_nascimento'=>array('Data de nascimento','p.data_nascimento'), 
			'email' => array('Email','p.email'),
			'telfixo' => array('Telefone fixo','tfix.id'),
			'telcel' => array('Telefone celular','tcel.id'),
			'telrecado' => array('Telefone para recados','trec.id'),

			'cns' => array('Número SUS','cns.id'),
			'nis' => array('Cartão NIS','nis.id'),
			'cpf' => array('CPF','cpf.id'),

			'rg' => array('Registro geral (RG)','rg.idpessoa'),

			'ctps' => array('Carteira de trabalho (CTPS)','ctps.id'),
			'titeleitor' => array('Título de eleitor','titulo_eleitor.id'),

			'certidao' => array('Certidão civil','certidao.idpessoa'),

			'cnh' => array('Carteira de Motorista (CNH)','cnh.id'),
		);

		$campos_branco = array(
			'escolaridade' => array('Escolaridade','p.idescolaridade')
		);

		$campos_naodeclarado = array(
			'raca' => array('Cor','p.idraca')
		);

		$campos_naoinformado = array(
			'nome_mae'=>array('Nome da mãe','p.nome_mae'), 
			'municipio' => array('Município de nascimento','p.idmunicipio_nascimento'),
			'pais' => array('País de nascimento','p.idpais_nascimento')
		);

		$fields = array();
		foreach(array_merge($campos_naopossui, $campos_branco, 
							$campos_naodeclarado, $campos_naoinformado,
						array('total'=>array('Total',1))) as $alias => $def)
		{
			$fields[] = "count($def[1]) as $alias";
		}

		
		$sql = 'select '.implode(', ', $fields).
<<<EOT
		from pessoa p
		left join cns on cns.idpessoa = p.id
		left join cnh on cnh.idpessoa = p.id
		left join cpf on cpf.idpessoa = p.id
		left join ctps on ctps.idpessoa = p.id
		left join nis on nis.idpessoa = p.id
		left join pis on pis.idpessoa = p.id
		left join (select idpessoa,min(data_emissao) as data_emissao, min(idorgao) as idorgao, min(idestado) as idestado, min(cast(apresentado as integer)) as apresentado, min(cast(digitalizado as integer)) as digitalizado from rg group by idpessoa) as rg on rg.idpessoa = p.id
		left join titulo_eleitor on titulo_eleitor.idpessoa = p.id
		left join (select idpessoa,min(cartorio) as cartorio,min(data_emissao) as data_emissao, min(cast(apresentado as integer)) as apresentado, min(cast(digitalizado as integer)) as digitalizado from certidao group by idpessoa) as certidao on certidao.idpessoa = p.id
		left join telefone tfix on tfix.idpessoa = p.id and tfix.idtipo = 1
		left join telefone tcel on tcel.idpessoa = p.id and tcel.idtipo = 2
		left join telefone trec on trec.idpessoa = p.id and trec.idtipo = 3
EOT;

		//throw new Exception();
		
		$info = $doc->fetchAll($sql);
		$info = $info[0];
		
		$rotulos_branco = array();
		foreach($campos_branco as $alias => $def)
			$rotulos_branco[$alias] = $def[0];

		$rotulos_naopossui = array();
		foreach($campos_naopossui as $alias => $def)
			$rotulos_naopossui[$alias] = $def[0];

		$rotulos_naodeclarado = array();
		foreach($campos_naodeclarado as $alias => $def)
			$rotulos_naodeclarado[$alias] = $def[0];

		$rotulos_naoinformado = array();
		foreach($campos_naoinformado as $alias => $def)
			$rotulos_naoinformado[$alias] = $def[0];

		$dados = array(
			'total' => 0,
			'data' => strftime('%d/%m/%Y %H:%M:%S'),
			'em_branco' =>
				array(
					'series' => array(),
					'abcissa' => array('rotulos' => array(0 =>'Preenchido',
														  1 => 'Em branco'),
									   'nome' => 'Preenchimento'),
					'ordenada' => array('rotulos' => $rotulos_branco,
					'nome' => 'Questões')),
			'nao_possui' =>
				array(
					'series' => array(),
					'abcissa' => array('rotulos' => array(0 =>'Preenchido',
														  1 => 'Não informado'),
									   'nome' => 'Preenchimento'),
					'ordenada' => array('rotulos' => $rotulos_naopossui,
					'nome' => 'Questões')),
			'nao_declarado' =>
				array(
					'series' => array(),
					'abcissa' => array('rotulos' => array(0 =>'Declarado',
														  1 => 'Não declarado'),
									   'nome' => 'Preenchimento'),
					'ordenada' => array('rotulos' => $rotulos_naodeclarado,
					'nome' => 'Questões')),
			'nao_informado' =>
				array(
					'series' => array(),
					'abcissa' => array('rotulos' => array(0 =>'Preenchido',
														  1 => 'Não informado'),
									   'nome' => 'Preenchimento'),
					'ordenada' => array('rotulos' => $rotulos_naoinformado,
					'nome' => 'Questões'))
		);

		foreach($info as $campo => $count)
		{
			if($campo == 'total')
			{
				$dados['em_branco']['total'] = $count;
				$dados['nao_possui']['total'] = $count;
				$dados['nao_declarado']['total'] = $count;
				$dados['nao_informado']['total'] = $count;
				$dados['total'] = $count;
			}
			else if(isset($campos_branco[$campo]))
			{
				$dados['em_branco']['series'][0][$campo]=(int)$count;
				$dados['em_branco']['series'][1][$campo]=$info['total']-$count;
			}
			else if(isset($campos_naopossui[$campo]))
			{
				$dados['nao_possui']['series'][0][$campo]=(int)$count;
				$dados['nao_possui']['series'][1][$campo]=$info['total']-$count;
			}
			else if(isset($campos_naodeclarado[$campo]))
			{
				$dados['nao_declarado']['series'][0][$campo]=(int)$count;
				$dados['nao_declarado']['series'][1][$campo]=$info['total']-$count;
			}
			else if(isset($campos_naoinformado[$campo]))
			{
				$dados['nao_informado']['series'][0][$campo]=(int)$count;
				$dados['nao_informado']['series'][1][$campo]=$info['total']-$count;
			}
			else
				assert(false);
		}

		break; // }}}
	case 1: // {{{ Sexo x Idade
		$sql = 'select case';
		$idfaixa = 0;
		foreach($faixas as $limite)
		{
			$sql .= <<<EOT
				when extract(year from age(data_nascimento)) 
						between {$limite[0]} and {$limite[1]} then $idfaixa
EOT;
			++$idfaixa;
		}
		$sql .= <<<EOT
			else $idfaixa
			end as idfaixa,
			idsexo,
			count(*)
			from pessoa 
			group by idfaixa,idsexo
EOT;

		$faixas['Ignorada'] = 0;

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

		$dados = array(
			'total' => 0, 
			'series' => array(),
			'abcissa' => array('rotulos' => array_keys($faixas),
			                   'nome' => 'Faixa Etária'),
			'ordenada' => array('rotulos' => array('M'=>'Masculino',
												   'F'=>'Feminino'),
								'cores' => array('M' => '#63CCFF',
								                 'F' => '#FFB1F8'),
								'nome' => 'Sexo'));

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idfaixa']][$info['idsexo']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 2: // {{{ Distribuição cor (idraca is null -> raca = 'Não Declarada')
		$sql = "select idraca,count(idraca) as count from pessoa p
				 group by idraca
				 order by idraca";

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

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array(0 => 'Indivíduos'),
										  'nome' => ''),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Documento'));

		$racas = $doc->getTable('Raca')->findAll();
		foreach($racas as $r)
			$dados['ordenada']['rotulos'][$r->id] = $r->nome;

		$dados['ordenada']['rotulos'][0] = "Não Definida";

		foreach($infos as $info)
		{
			if($info['idraca'] == null)
				$info['idraca'] = 0;

			$dados['total'] += $dados['series'][0][$info['idraca']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 3: // {{{ Escolaridade x Idade
		$idfaixa = 0;
		$sql = 'select case';
		foreach($faixas as $limites)
		{
			$sql .= <<<EOT
				when extract(year from age(data_nascimento)) 
						between {$limites[0]} and {$limites[1]} then $idfaixa
EOT;
			++$idfaixa;
		}
		$sql .= <<<EOT
			else $idfaixa
			end as idfaixa,
			coalesce(idescolaridade,0) as idescolaridade2,
			count(*)
			from pessoa 
			group by idfaixa,idescolaridade2
EOT;

		$faixas['N/D'] = 0;

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

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array_keys($faixas),
										  'nome' => 'Faixa Etária'),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Escolaridade'));

		$escolaridades = $doc->getTable('Escolaridade')->findAll();
		foreach($escolaridades as $e)
			$dados['ordenada']['rotulos'][$e->id] = $e->nome;
		$dados['ordenada']['rotulos'][0] = 'N/D';

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idfaixa']][$info['idescolaridade2']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 23: // {{{ Escolaridade x Sexo 
		$idfaixa = 0;
		$sql = <<<EOT
		    select
			idsexo,
			coalesce(idescolaridade,0) as idescolaridade2,
			count(*)
			from pessoa 
			group by idsexo,idescolaridade2
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
					   'abcissa' => array('rotulos' => array('M'=>'Masculino',
					                                         'F'=>'Feminino'),
										  'nome' => 'Sexo'),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Escolaridade'));

		$escolaridades = $doc->getTable('Escolaridade')->findAll();
		foreach($escolaridades as $e)
			$dados['ordenada']['rotulos'][$e->id] = $e->nome;
		$dados['ordenada']['rotulos'][0] = 'N/D';

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idsexo']][$info['idescolaridade2']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 24: // {{{ Escolaridade x Cor
		$idfaixa = 0;
		$sql = <<<EOT
		    select
			coalesce(idraca,0) as idraca2,
			coalesce(idescolaridade,0) as idescolaridade2,
			count(*)
			from pessoa 
			group by idraca2,idescolaridade2
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
					   'abcissa' => array('rotulos' => array(),
										  'nome' => 'Cor'),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Escolaridade'));

		$escolaridades = $doc->getTable('Escolaridade')->findAll();
		foreach($escolaridades as $e)
			$dados['ordenada']['rotulos'][$e->id] = $e->nome;
		$dados['ordenada']['rotulos'][0] = 'N/D';

		$racas = $doc->getTable('Raca')->findAll();
		foreach($racas as $r)
			$dados['abcissa']['rotulos'][$r->id] = $r->nome;
		$dados['abcissa']['rotulos'][0] = 'N/D';

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idraca2']][$info['idescolaridade2']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 4: // {{{ Sem documentos x Idade
		$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,
			case when coalesce(cnh.id,cpf.id,ctps.id,nis.id,pis.id,rg.idpessoa,titulo_eleitor.id,certidao.idpessoa) is null then 0 else 1 end
				as tem_documento,
			count(*)
			from pessoa p
			left join cns on cns.idpessoa = p.id
			left join cnh on cnh.idpessoa = p.id
			left join cpf on cpf.idpessoa = p.id
			left join ctps on ctps.idpessoa = p.id
			left join nis on nis.idpessoa = p.id
			left join pis on pis.idpessoa = p.id
			left join (select distinct idpessoa from rg) as rg on rg.idpessoa = p.id
			left join titulo_eleitor on titulo_eleitor.idpessoa = p.id
			left join (select distinct idpessoa from certidao) as certidao on certidao.idpessoa = p.id
			group by idfaixa,tem_documento
EOT;

		$faixas['N/D'] = 0;

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

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array_keys($faixas),
										  'nome' => 'Faixa Etária'),
					   'ordenada' => array('rotulos' => array(1=>'Com Documentos',
															  0=>'Sem Documentos'),
					                       'nome' => 'Posse de Documentos'));

		foreach($infos as $info)
		{
			$dados['total'] += 
				$dados['series'][$info['idfaixa']][$info['tem_documento']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 5: // {{{ Distribuição de Documentação
		$docs = array(
			'cnh' => 'Carteira de Motorista',
			'cpf' => 'CPF',
			'ctps' => 'Carteira de Trabalho',
			'nis' => 'Cartão NIS',
			'pis' => 'Cartão PIS',
			'rg' => 'RG',
			'titulo_eleitor' => 'Título de Eleitor',
			'certidao' => 'Certidão Civil');

		$fields = array();

		foreach($docs as $k => $d)
			$fields[] = "count($k.id) as $k";

		$sql = 'select '.implode(',',$fields).' from pessoa p';
		foreach($docs as $k => $d)
		{
			if($k == 'certidao' || $k == 'rg')
				$sql .= " left join (select distinct idpessoa as id from $k) as $k on $k.id = p.id";
			else
				$sql .= " left join $k on $k.idpessoa = p.id";
		}

		$info = $doc->fetchAll($sql);
		$info = $info[0];

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array(0 => 'Indivíduos'),
										  'nome' => ''),
					   'ordenada' => array('rotulos' => $docs,
					                       'nome' => 'Documento'));

		foreach($info as $campo => $count)
			$dados['total'] += $dados['series'][0][$campo] = (int)$count;

		break; // }}}
	case 6: // {{{ Residências fora do município
		$idnova_iguacu = ID_NOVA_IGUACU;
		$sql = 
<<<EOT
		select 
			case when e.idmunicipio = $idnova_iguacu then 1
                 when e.idmunicipio <> $idnova_iguacu then 2
				 else 3 end as local,
			count(*)
		from pessoa p
		left join endereco_pessoa ep on ep.idpessoa = p.id 
											and idtipo_endereco = 1
		left join endereco e on ep.idendereco = e.id
		where idtipo_endereco_variavel is null
		group by local
EOT;

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

		$dados = array(
			'total' => 0,
		    'series' => array(),
			'abcissa' => 
				array('rotulos' => array(0 => 'Pessoas'), 'nome' => ''),
			'ordenada' => 
				array('nome' => 'Domicílios',
					  'rotulos' => array('1' => 'Em Nova Iguaçu',
										 '2' => 'Fora de Nova Iguaçu',
										 '3' => 'Endereço não especificado')));

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][0][$info['local']] 
				= (int)$info['count'];
		}
		break; // }}}
	case 7: // {{{ Distribuição de domicílios não fixos
		$sql = 
<<<EOT
		select idtipo_endereco_variavel, count(*)
		from pessoa p 
		where idtipo_endereco_variavel is not null
		group by idtipo_endereco_variavel
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array(0 => 'Pessoas'),
										  'nome' => ''),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Domicílio não fixo'));

		$endvar = $doc->getTable('TipoEnderecoVariavel')->findAll();
		foreach($endvar as $e)
			$dados['ordenada']['rotulos'][$e->id] = $e->nome;

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][0][$info['idtipo_endereco_variavel']] 
				= (int)$info['count'];
		}

		break; // }}}

	case 8: // {{{ Inscrição em programas
		
		$campo_periodo = ''; $joins = ''; $where = '';

		$joins = " inner join comparecimento c on c.idpessoa = p.id";

		$groupby = 'group by i.idprograma';
		
		if($ano)
		{
			$where = "where extract(year from i.data) = $ano";
	
			if($mes)
			{
				$campo_periodo = "extract(month from i.data) as periodo";
				$where .= " and extract(month from i.data) = $mes";
			}
			else
				$campo_periodo = "extract(year from i.data) as periodo";
				
			$groupby = "group by periodo, i.idprograma";
							
		}
		else
		{
			$campo_periodo = '0 as periodo';
			$where = 'where true';
		}
		
		if($idunidade)
		{
			$campo_periodo .= ",c.idunidade";	
			
			if(strstr($joins,'comparecimento') === false)
				$joins .= " inner join comparecimento c on c.idpessoa = p.id";
							
			$where .= " and c.idunidade = $idunidade";
				
			$groupby = "group by c.idunidade, periodo, i.idprograma";
		}
		
		$sql = 
<<<EOT
		select 
			i.idprograma,
			count(*),
			$campo_periodo
			from ( select distinct idpessoa, idprograma, data 
			       from inscricao_programa
				   where data_desligamento is null ) i
			inner join pessoa p on p.id = i.idpessoa
			$joins
			$where
			$groupby
EOT;

		//throw new Exception();	
		
		$infos = $doc->fetchAll($sql);

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array(0 => 'Inscrições'),
										  'nome' => ''),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Programa'));

		$prog = $doc->getTable('Programa')->findAll();
		foreach($prog as $p)
			$dados['ordenada']['rotulos'][$p->id] = $p->nome;

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][0][$info['idprograma']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 9: // {{{ Comparecimento em programas
		if($idunidade)
		{
			$cond_unidade = "comp.idunidade = $idunidade";
			$joins = "inner join comparecimento comp on comp.id = c.idcomparecimento";
		}
		else
			$cond_unidade = 'true';

		$sql = 
<<<EOT
		select 
			i.idprograma as idprograma,
			count(*)
			from comparecimento_programa c
			inner join inscricao_programa i on c.idinscricao_programa = i.id
			$joins
			where $cond_unidade
			group by i.idprograma
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array(0 => 'Comparecimentos'),
										  'nome' => ''),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Programa'));

		$prog = $doc->getTable('Programa')->findAll();
		foreach($prog as $p)
			$dados['ordenada']['rotulos'][$p->id] = $p->nome;

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][0][$info['idprograma']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 22: // {{{ Indivíduos inscritos em programas

		$sql = <<<EOT
		select count(*) as total,
               count(case when num_inscricoes = 1 then 1 end) as um,
               count(case when num_inscricoes = 2 then 1 end) as dois,
               count(case when num_inscricoes >= 3 then 1 end) as tres_ou_mais
			   from (select p.id, count(idprograma) as num_inscricoes 
						from pessoa p 
						left join inscricao_programa ip on p.id = ip.idpessoa
						group by p.id
						having count(idprograma) > 0) subq;
EOT;

		$infos = $doc->fetchAll($sql);
		$info = $infos[0];

		$dados = array(
			'total' => $info['total'], 
			'series' => array('0' => array(
			                             '0' => $info['um'],
										 '1' => $info['dois'],
										 '2' => $info['tres_ou_mais'])),
			'abcissa' => array('rotulos' => array('0' => 'Indivíduos'),
			                   'nome' => 'Indivíduos'),
			'ordenada' => array('rotulos' => array('Uma','Duas','Três ou mais'),
								'nome' => 'Incrições'));

		break; // }}}
	case 10: // {{{ Não inscrito em programas x Idade
		$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,
			p.idsexo as idsexo,
			count(*)
			from pessoa as p
			left join inscricao_programa i on i.idpessoa = p.id
			where i.id is null
			group by idfaixa,idsexo
EOT;

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

		$faixas['N/D'] = 0;

		$dados = array(
			'total' => 0, 
			'series' => array(),
			'abcissa' => array('rotulos' => array_keys($faixas),
			                   'nome' => 'Faixa Etária'),
			'ordenada' => array('rotulos' => array('M'=>'Masculino',
												   'F'=>'Feminino'),
								'cores' => array('M' => '#63CCFF',
								                 'F' => '#FFB1F8'),
								'nome' => 'Sexo'));

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idfaixa']][$info['idsexo']] 
				= (int)$info['count'];
		}

		break; // }}}

	case 11: // {{{ Atendimento a pacientes
		// Frequencia de comparecimentos por tipo de atendimento
		$atendimento = array(
			1 => 'Marcar Procedimentos',
			2 => 'Consulta',
			3 => 'Tomar Vacinas',
			4 => 'Fazer Curativo',
			5 => 'Farmácia',
			6 => 'Fazer Exames',
			7 => 'Reclamações',
			8 => 'Doar Sangue');

		list($campo_periodo, $joins, $where) = select_periodo($ano,$mes);

		if($idunidade)
		{
			$where .= " and c.idunidade = $idunidade";
			if(strstr($joins,'comparecimento') === false)
				$joins .= " inner join comparecimento c on c.id = mc.idcomparecimento";
		}

		$sql = <<<EOT
			select 
				$campo_periodo,
				case when mc.idmotivo in (1,2,3,4) then 1
						 when mc.idmotivo in (5,6,7) then 2
						 when mc.idmotivo = 11 then 3
						 when mc.idmotivo = 12 then 4
						 when mc.idmotivo in (13,14,15) then 5
						 when mc.idmotivo in (16,17,18) then 6
						 when mc.idmotivo = 19 then 7
						 when mc.idmotivo = 21 then 8
				end as atendimento,
				count(*)
			from motivo_comparecimento mc
			$joins
			$where
			group by atendimento,periodo
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
					   'abcissa' => array('rotulos' => periodos($ano,$mes),
										  'nome' => 'Períodos'),
					   'ordenada' => array('rotulos' => $atendimento,
										   'nome'=>'Tipo de Atendimento'));

		foreach($infos as $info)
		{
			if($info['atendimento'] == NULL)
				continue;
			$dados['total'] 
				+= $dados['series'][$info['periodo']][$info['atendimento']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 12: // {{{ Marcação de procedimentos
		// Número de comparecimentos onde só foi feito marcação de procedimento
		// por tipo de procedimento
		
		list($campo_periodo, $joins, $where) = select_periodo($ano,$mes);

		if($idunidade)
		{
			$where .= " and c.idunidade = $idunidade";
			if(strstr($joins,'comparecimento') === false)
				$joins .= " inner join comparecimento c on c.id = mc.idcomparecimento";
		}

		$sql = 
<<<EOT
		select 
			$campo_periodo,
			mc.idmotivo as idmotivo,
			count(*)
			from motivo_comparecimento mc
			$joins
			$where
			and not exists (select 1 from motivo_comparecimento mc2 
								where mc2.idcomparecimento=mc.idcomparecimento 
										and mc2.idmotivo not in (1,2,3,4)
							 )
			group by idmotivo,periodo
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => periodos($ano,$mes),
										  'nome' => ''),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Procedimento'));

		$proc = Doctrine_Query::create()
			->from('Motivo')
			->where('id in (1,2,3,4)')
			->execute();
		foreach($proc as $p)
			$dados['ordenada']['rotulos'][$p->id] = $p->nome;


		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['periodo']][$info['idmotivo']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 25: // {{{ Consultas x Indivíduos

		if($idunidade)
			$where .= " and c.idunidade = $idunidade";

		$sql = <<<EOT
		select count(*) as total,
               count(case when num_inscricoes = 1 then 1 end) as um,
               count(case when num_inscricoes = 2 then 1 end) as dois,
               count(case when num_inscricoes >= 3 then 1 end) as tres_ou_mais
			   from (select p.id, count(idmotivo) as num_inscricoes 
						from pessoa p 
						left join comparecimento c on c.idpessoa=p.id
						left join motivo_comparecimento mc on mc.idcomparecimento = c.id
						where idmotivo in (5,6,7)
						group by p.id) subq;
EOT;

		$infos = $doc->fetchAll($sql);
		$info = $infos[0];

		$dados = array(
			'total' => $info['total'], 
			'series' => array('0' => array('0' => $info['um'],
										 '1' => $info['dois'],
										 '2' => $info['tres_ou_mais'])),
			'abcissa' => array('rotulos' => array('0' => 'Indivíduos'),
			                   'nome' => 'Indivíduos'),
			'ordenada' => array('rotulos' => array('Uma','Duas','Três ou mais'),
								'nome' => 'Consultas realizadas'));

		break; // }}}
	case 13: // {{{ Consultas x Idade
		// Número de consultas feito por tipo de consulta
		if($idunidade)
			$cond_unidade = " and c.idunidade = $idunidade";

		$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,
			coalesce(mc.idocupacao,0) as idocupacao,
			count(*)
			from motivo_comparecimento mc
			inner join comparecimento c on mc.idcomparecimento = c.id
			inner join pessoa p on p.id = c.idpessoa
			where mc.idmotivo in (5,6,7) $cond_unidade
			group by idfaixa, idocupacao
			having count(*) > 0
EOT;

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

		$faixas['N/D'] = 0;

		$dados = array('total' => 0,
					   'series' => array(),
					   'abcissa' => array('rotulos' => array_keys($faixas),
										  'nome' => 'Faixa Etária'),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Especialidade'));

		$idocupacoes = array();
		foreach($infos as $info)
			$idocupacoes[] = $info['idocupacao'];

		if(!empty($idocupacoes))
		{
			$ocup = Doctrine_Query::create()
				->from('Ocupacao')
				->whereIn('id', $idocupacoes)
				->execute();
			foreach($ocup as $o)
				$dados['ordenada']['rotulos'][$o->id] = $o->nome;
			$dados['ordenada']['rotulos'][0] = 'N/D';
		}

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idfaixa']][$info['idocupacao']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 20: // {{{ Consultas x Sexo
		if($idunidade)
			$cond_unidade = " and c.idunidade = $idunidade";

		$sql = <<<EOT
			select
			case p.idsexo when 'F' then 1 when 'M' then 0 end as idsexo,
			coalesce(mc.idocupacao,0) as idocupacao,
			count(*)
			from motivo_comparecimento mc
			inner join comparecimento c on mc.idcomparecimento = c.id
			inner join pessoa p on p.id = c.idpessoa
			where mc.idmotivo in (5,6,7) $cond_unidade
			group by idsexo, idocupacao
			having count(*) > 0
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
					   'abcissa' => array('rotulos' =>array('0'=>'Masculino',
															'1'=>'Feminino'),
										  'nome' => 'Sexo',
										  'cores' => array('0' => '#63CCFF',
														   '1' => '#FFB1F8')),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Especialidade'));

		$idocupacoes = array();
		foreach($infos as $info)
			$idocupacoes[] = $info['idocupacao'];

		if(!empty($idocupacoes) )
		{
			$ocup = Doctrine_Query::create()
				->from('Ocupacao')
				->whereIn('id', $idocupacoes)
				->execute();
			foreach($ocup as $o)
				$dados['ordenada']['rotulos'][$o->id] = $o->nome;
			$dados['ordenada']['rotulos'][0] = 'N/D';
		}

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idsexo']][$info['idocupacao']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 14: // {{{ Motivo de Consulta x Idade
		// Número de consultas feito por motivo de consulta
		if($idunidade)
			$cond_unidade = " and c.idunidade = $idunidade";

		$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,
			mc.idmotivo as idmotivo,
			count(*)
			from motivo_comparecimento mc
			inner join comparecimento c on mc.idcomparecimento = c.id
			inner join pessoa p on c.idpessoa = p.id
			where mc.idmotivo in (8,9,10) $cond_unidade
			group by idfaixa, idmotivo
EOT;

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

		$faixas['N/D'] = 0;

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array_keys($faixas),
										  'nome' => 'Faixa Etária'),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Motivo de Consulta'));

		$mot = Doctrine_Query::create()
			->from('Motivo')
			->where('id in (8,9,10)')
			->execute();
		foreach($mot as $m)
			$dados['ordenada']['rotulos'][$m->id] = $m->nome;

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idfaixa']][$info['idmotivo']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 21: // {{{ Motivo de Consultas x Sexo
		if($idunidade)
			$cond_unidade = " and c.idunidade = $idunidade";

		$sql = <<<EOT
			select
			case p.idsexo when 'F' then 1 when 'M' then 0 end as idsexo,
			mc.idmotivo as idmotivo,
			count(*)
			from motivo_comparecimento mc
			inner join comparecimento c on mc.idcomparecimento = c.id
			inner join pessoa p on p.id = c.idpessoa
			where mc.idmotivo in (8,9,10) $cond_unidade
			group by idsexo, idmotivo
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
					   'abcissa' => array('rotulos' =>array('0'=>'Masculino',
															'1'=>'Feminino'),
										  'nome' => 'Sexo',
										  'cores' => array('0' => '#63CCFF',
														   '1' => '#FFB1F8')),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Motivo de Consulta'));

		$mot = Doctrine_Query::create()
			->from('Motivo')
			->where('id in (8,9,10)')
			->execute();
		foreach($mot as $m)
			$dados['ordenada']['rotulos'][$m->id] = $m->nome;


		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idsexo']][$info['idmotivo']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 15: // {{{ Procedimentos x Idade
		if($idunidade)
			$cond_unidade = " and c.idunidade = $idunidade";

		$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,
			mc.idmotivo as idmotivo,
			count(*)
			from motivo_comparecimento mc
			inner join comparecimento c on mc.idcomparecimento = c.id
			inner join pessoa p on c.idpessoa = p.id
			where mc.idmotivo in (11,12,21) $cond_unidade
			group by idfaixa, idmotivo
EOT;

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

		$faixas['N/D'] = 0;

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array_keys($faixas),
										  'nome' => 'Faixa Etária'),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Procedimento'));

		$mot = Doctrine_Query::create()
			->from('Motivo')
			->whereIn('id',array(11,12,21))
			->execute();
		foreach($mot as $m)
			$dados['ordenada']['rotulos'][$m->id] = $m->nome;

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idfaixa']][$info['idmotivo']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 16: // {{{ Ida a farmácia x Idade
		if($idunidade)
			$cond_unidade = " and c.idunidade = $idunidade";

		$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,
			mc.idmotivo as idmotivo,
			count(*)
			from motivo_comparecimento mc
			inner join comparecimento c on mc.idcomparecimento = c.id
			inner join pessoa p on c.idpessoa = p.id
			where mc.idmotivo in (13,14,15) $cond_unidade
			group by idfaixa, idmotivo
EOT;

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

		$faixas['N/D'] = 0;

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array_keys($faixas),
										  'nome' => 'Faixa Etária'),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Motivos'));

		$mot = Doctrine_Query::create()
			->from('Motivo')
			->whereIn('id',array(13,14,15))
			->execute();
		foreach($mot as $m)
			$dados['ordenada']['rotulos'][$m->id] = $m->nome;

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idfaixa']][$info['idmotivo']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 17: // {{{ Tipos de exame
		// Número de consultas feito por motivo de consulta
		if($idunidade)
			$cond_unidade = " and c.idunidade = $idunidade";

		$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,
			mc.idmotivo as idmotivo,
			count(*)
			from motivo_comparecimento mc
			inner join comparecimento c on mc.idcomparecimento = c.id
			inner join pessoa p on c.idpessoa = p.id
			where mc.idmotivo in (16,17,18) $cond_unidade
			group by idfaixa, idmotivo
EOT;

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

		$faixas['N/D'] = 0;

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => array_keys($faixas),
										  'nome' => 'Faixa Etária'),
					   'ordenada' => array('rotulos' => array(),
					                       'nome' => 'Procedimento'));

		$mot = Doctrine_Query::create()
			->from('Motivo')
			->whereIn('id',array(16,17,18))
			->execute();
		foreach($mot as $m)
			$dados['ordenada']['rotulos'][$m->id] = $m->nome;

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['idfaixa']][$info['idmotivo']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 18: // {{{ Frequencia de consultas e retiradas de medicamentos no mesmo
		     // comparecimento

		list($campo_periodo, $joins, $where) = select_periodo($ano,$mes);

		if($idunidade)
		{
			$where .= " and c.idunidade = $idunidade";
			if(strstr($joins,'comparecimento') === false)
				$joins .= " inner join comparecimento c on c.id = mc.idcomparecimento";
		}

		$sql = <<<EOT
			select $campo_periodo, mc.idocupacao, count(*) 
			from motivo_comparecimento mc
			$joins
            $where and idocupacao is not null and idcomparecimento in (
				select idcomparecimento 
				from motivo_comparecimento
				group by idcomparecimento
				having sum(case when idmotivo in (5,6,7) then 1 else 0 end) > 0
							and
					   sum(case when idmotivo = 13 then 1 else 0 end) > 0)
			group by idocupacao,periodo
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
			           'ordenada' => array('rotulos' => array(),
										  'nome' => 'Ocupação'),
					   'abcissa' => array('rotulos' => periodos($ano,$mes),
					                       'nome' => ''));

		$idocupacoes = array();
		foreach($infos as $info)
			$idocupacoes[] = $info['idocupacao'];

		$ocup = Doctrine_Query::create()
			->from('Ocupacao')
			->whereIn('id', $idocupacoes)
			->execute();
		foreach($ocup as $o)
			$dados['ordenada']['rotulos'][$o->id] = $o->nome;

		foreach($infos as $info)
		{
			$dados['total'] 
				+= $dados['series'][$info['periodo']][$info['idocupacao']] 
				= (int)$info['count'];
		}

		break; // }}}
	case 19: // {{{ Reclamações
		list($campo_periodo, $joins, $where) = select_periodo($ano,$mes);

		if($idunidade)
		{
			$where .= " and c.idunidade = $idunidade";
			if(strstr($joins,'comparecimento') === false)
				$joins .= " inner join comparecimento c on c.id = mc.idcomparecimento";
		}


		$sql = <<<EOT
			select 
				$campo_periodo,	
				count(case when mc.idmotivo = 19 then 1 end) as count, 
				count(*) as total
			from motivo_comparecimento mc
			$joins
			$where
			group by periodo
EOT;

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

		$dados = array('total' => 0,
					   'series' => array(),
			           'abcissa' => array('rotulos' => periodos($ano,$mes),
										  'nome' => ''),
					   'ordenada' => array('rotulos' => array(19=>'Reclamações'),
					                       'nome' => ''));

		$dados['total'] = $infos[0]['total'];

		foreach($infos as $info)
		{
			$dados['total'] += $info['total'];
			$dados['series'][$info['periodo']][19] = (int)$info['count'];
			$dados['series'][$info['periodo']]['total'] = (int)$info['total'];
		}

		break; // }}}
	default:
		throw new Exception("Estatística inválida");
	}

	echo json_encode($dados);
}
catch(Exception $e)
{
	echo json_encode(array('error' => $e->getMessage()));
}





?>

