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

Programa: AS11.PHP
Criado em: 27/02/2010
Autor: Gustavo Moreira

Definição:
    Esse script calcula o indicador AS11 - Taxa de retorno

    
Cálculo:
    (Número de famílias com registro de uma visita ao CRAS a cada três meses, a partir da última data de atendimento) 
    / 
    (Número acumulado de famílias atendidas nos CRAS) 
    x 100
    
Periodicidade:
     Trimestral e anual
     
Granularidade:
    Município (todos os CRAS)  e por CRAS
    
OBS:

    O período de 3 meses é estabelecido, automaticamente,  a partir da última visita ao CRAS daquela família registrada 
    na Ficha de Cadastramento do Usuário do CRAS.


Parâmetros de Entrada (via GET):

    ...?indicador=III&granularidade=GGG&periodo=PPP
    III = no indicador, em caixa baixa, é informado o seu código
    GGG = na granularidade, em caixa baixa e sem acentuação, é informada o nome da granularidade desejada
    PPP = no periodo, em se tratando de um indicador mensal, é informado o mês e ano, no formato MM/AAAA (exs: 01/2010, 02/2010 etc)
    
    Exemplo de Entrada:
    ...?indicador=as2&granularidade=cras&periodo=01/2010
    
Saída:
    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

*********************************************************************/


/* PARÂMETROS DE ENTRADA */
$indicador = $_GET["indicador"];
$granularidade = $_GET["granularidade"];
$periodo = $_GET["periodo"];

/* VALIDAR A ENTRADA DE DADOS */

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

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

if (($granularidade != "município") && ($granularidade != "municipio") && ($granularidade != "cras"))
{
    echo "5";
    exit;
}

//verificar se é o período válido

//verifica se é anual
if (!strpos($periodo,"/"))
{   
    $tipo_periodo = "anual";
    if (!is_numeric($periodo))
    {
        echo "4";
        exit;
    }
    $data_ini = "$periodo-01-01 00:00:00";
    $data_fim = "$periodo-12-31 23:59:59";
}
else
{   
    //deveria ser Trimestral. Se não, acusa erro
    if ($periodo[0] != "T")
    {        
       echo "4";
       exit;            
    }
    else
    {   //trimestral
        list($trimestre,$ano) = split("/",$periodo);
        
        $tipo_periodo = "trimestral";
        
        if (($trimestre!="T1") && ($trimestre!="T2") && ($trimestre!="T3") && ($trimestre!="T4"))
        {
             echo "4";
             exit;
        }
        
        if ($trimestre=="T1")
        {
            $data_ini = "$ano-01-01 00:00:00";
            $data_fim = "$ano-03-31 23:59:59";    
        }
        
        if ($trimestre=="T2")
        {
            $data_ini = "$ano-04-01 00:00:00";
            $data_fim = "$ano-06-30 23:59:59";    
        }
        
        if ($trimestre=="T3")
        {
            $data_ini = "$ano-07-01 00:00:00";
            $data_fim = "$ano-09-30 23:59:59";
        }
        
        if ($trimestre=="T4")
        {
            $data_ini = "$ano-10-01 00:00:00";
            $data_fim = "$ano-12-31 23:59:59";
        }
        
    }
}


/* INICIAR CONEXÃO COM BANCO DE DADOS (CRAS) */
include "../includes/begin.php";


function CalculaTrimestreAgrupado($data_ini,$data_fim,$dbh)
{
    /* Calculo Total de familias que voltaram em 3 meses */
    $sql = "
       Select count(*) as valor From 
       (
        Select  numerocras, datacadastrousuario, max(datavisita) as ultvisita
            From visita v
            Where DATAVISITA  >= '$data_ini' and DATAVISITA  <= '$data_fim' 
            Group by numerocras, datacadastrousuario
        )  aux
        where exists ( select 1 from visita v2 where v2.numerocras = aux.numerocras and v2.datacadastrousuario = aux.datacadastrousuario 
            And v2.datavisita >= (aux.ultvisita - cast('90 days' as interval)) and v2.datavisita < aux.ultvisita ) ";
                
    $result=pg_query($dbh, $sql);    
    
    if (pg_num_rows($result) == 0 )
    {   
        return 0;
    }    
    
    $row = pg_fetch_array($result);
    return $row["valor"];
}


if ($granularidade != "cras")
{

    /* Calculo Número acumulado de famílias atendidas nos CRAS */
    $sql = "select count(*) as valor from
            (
            SELECT numerocras, datacadastrousuario, COUNT(*) as valor 
            FROM VISITA 
            WHERE DATAVISITA  >= '$data_ini' and DATAVISITA  <= '$data_fim' 
            group by numerocras, datacadastrousuario 
            ) aux ";

    $result=pg_query($dbh, $sql);    

    if (pg_num_rows($result) == 0 )
    {
        echo "1";
        exit;
    }

    $row = pg_fetch_array($result);
    $tot_atendimentos = $row["valor"];

    //evitar divisão por zero
    if ($tot_atendimentos == 0)
    {
        echo "1";
        exit;
    }
    
    if ($tipo_periodo == "anual")
    {
        //calcular separadamente 1o, 2o, 3o e 4o trimestre
        $T1 = CalculaTrimestreAgrupado("$periodo-01-01 00:00:00","$periodo-03-31 23:59:59",$dbh);
        $T2 = CalculaTrimestreAgrupado("$periodo-04-01 00:00:00","$periodo-06-30 23:59:59",$dbh);
        $T3 = CalculaTrimestreAgrupado("$periodo-07-01 00:00:00","$periodo-09-30 23:59:59",$dbh);
        $T4 = CalculaTrimestreAgrupado("$periodo-10-01 00:00:00","$periodo-12-31 23:59:59",$dbh);
        
        $tot_trimestres = $T1 + $T2 + $T3 + $T4;        
    }
    else
    {
        $tot_trimestres = CalculaTrimestreAgrupado($data_ini,$data_fim,$dbh);        
    }       

    $valor = round(($tot_trimestres/$tot_atendimentos)*100,4);
    $valor = str_replace(".",",",$valor);
            
    //Escrever a resposta
    echo "0;$indicador;Nova Iguaçu;$periodo;$valor";

}
else
{
    //agrupar por CRAS
    
    if ($tipo_periodo == "anual")
    {   $ano = $periodo;
        $sql = "Select 
            c.numerocras as numerocras, c.nomefantasiacras,
            coalesce(Round(cast((Cast(coalesce(T1.valor,0.0) as float) +  Cast(coalesce(T2.valor,0.0) as float) + Cast(coalesce(T3.valor,0.0) as float)+ Cast(coalesce(T4.valor,0.0) as float))/ cast(B.valor as float) as numeric) *100.0,4),0) as valor
            From
            (
                     Select numerocras,count(*) as valor From 
                       (
                            Select  numerocras, datacadastrousuario, max(datavisita) as ultvisita
                                From visita v
                                Where DATAVISITA  >= '$ano-01-01 00:00' and DATAVISITA  <= '$ano-03-31 23:59:59' 
                                Group by numerocras, datacadastrousuario
                        )  aux
                        where exists ( select 1 from visita v2 where v2.numerocras = aux.numerocras and v2.datacadastrousuario = aux.datacadastrousuario 
                            And v2.datavisita >= (aux.ultvisita - cast('90 days' as interval)) and v2.datavisita < aux.ultvisita )
                       group by numerocras
            ) T1
            Full Outer Join
        (
                     Select numerocras,count(*) as valor From 
                       (
                            Select  numerocras, datacadastrousuario, max(datavisita) as ultvisita
                                From visita v
                                Where DATAVISITA  >= '$ano-01-04 00:00' and DATAVISITA  <= '$ano-06-30 23:59:59' 
                                Group by numerocras, datacadastrousuario
                        )  aux
                        where exists ( select 1 from visita v2 where v2.numerocras = aux.numerocras and v2.datacadastrousuario = aux.datacadastrousuario 
                            And v2.datavisita >= (aux.ultvisita - cast('90 days' as interval)) and v2.datavisita < aux.ultvisita )
                       group by numerocras
            ) T2 on T1.numerocras = T2.numerocras
            Full Outer Join
        (
                     Select numerocras,count(*) as valor From 
                       (
                            Select  numerocras, datacadastrousuario, max(datavisita) as ultvisita
                                From visita v
                                Where DATAVISITA  >= '$ano-07-01 00:00' and DATAVISITA  <= '$ano-09-30 23:59:59' 
                                Group by numerocras, datacadastrousuario
                        )  aux
                        where exists ( select 1 from visita v2 where v2.numerocras = aux.numerocras and v2.datacadastrousuario = aux.datacadastrousuario 
                            And v2.datavisita >= (aux.ultvisita - cast('90 days' as interval)) and v2.datavisita < aux.ultvisita )
                       group by numerocras
            ) T3 on T3.numerocras = T2.numerocras
            Full Outer Join
        (
                     Select numerocras,count(*) as valor From 
                       (
                            Select  numerocras, datacadastrousuario, max(datavisita) as ultvisita
                                From visita v
                                Where DATAVISITA  >= '$ano-10-01 00:00' and DATAVISITA  <= '$ano-12-31 23:59:59'
                                Group by numerocras, datacadastrousuario
                        )  aux
                        where exists ( select 1 from visita v2 where v2.numerocras = aux.numerocras and v2.datacadastrousuario = aux.datacadastrousuario 
                            And v2.datavisita >= (aux.ultvisita - cast('90 days' as interval)) and v2.datavisita < aux.ultvisita )
                       group by numerocras
            ) T4 on T4.numerocras = T3.numerocras
            Full Outer Join
            
            (
                Select numerocras, count(*) as valor From
                (
                  SELECT numerocras, datacadastrousuario, COUNT(*) as valor 
                  FROM VISITA 
                  WHERE DATAVISITA  >= '$data_ini' and DATAVISITA  <= '$data_fim' 
                  Group by numerocras, datacadastrousuario 
                ) aux group by numerocras
                
            ) B on (T1.numerocras = B.numerocras or T2.numerocras = B.numerocras or T3.numerocras = B.numerocras or T4.numerocras = B.numerocras)
            Inner join cras c on  c.numerocras = b.numerocras";
        
    }
    else
    {
        
        $sql = "Select 
            Case when a.numerocras is null then b.numerocras else a.numerocras end as numerocras, c.nomefantasiacras,
            coalesce(Round(cast(Cast(coalesce(A.valor,0.0) as float) / cast(B.valor as float) as numeric) *100.0,4),0) as valor
            From
            (
                     Select numerocras,count(*) as valor From 
                       (
                            Select  numerocras, datacadastrousuario, max(datavisita) as ultvisita
                                From visita v
                                Where DATAVISITA  >= '$data_ini' and DATAVISITA  <= '$data_fim' 
                                Group by numerocras, datacadastrousuario
                        )  aux
                        where exists ( select 1 from visita v2 where v2.numerocras = aux.numerocras and v2.datacadastrousuario = aux.datacadastrousuario 
                            And v2.datavisita >= (aux.ultvisita - cast('90 days' as interval)) and v2.datavisita < aux.ultvisita )
                       group by numerocras
            ) A
            Full Outer Join
            (
                Select numerocras, count(*) as valor From
                (
                  SELECT numerocras, datacadastrousuario, COUNT(*) as valor 
                  FROM VISITA 
                  WHERE DATAVISITA  >= '$data_ini' and DATAVISITA  <= '$data_fim' 
                  Group by numerocras, datacadastrousuario 
                ) aux group by numerocras
                
            ) B on a.numerocras = b.numerocras
            inner join cras c on  c.numerocras = b.numerocras " ;
        
    }
    
   
    
    $result=pg_query($dbh, $sql);    

    if (pg_num_rows($result) == 0 )
    {
        echo "1";
        exit;
    }

    while ($row = pg_fetch_array($result))
    {
        $nome = trim($row["nomefantasiacras"]);
        $valor = str_replace(".",",",$row["valor"]);
        
        //Escrever a resposta
        if ($retorno!="")
        {
            $retorno = $retorno . "\n";            
        }        
        $retorno = $retorno . "0;$indicador;$nome;$periodo;$valor";
    }    
    echo $retorno;   
    
}


/* ENCERRAR CONEXÃO COM BANCO DE DADOS */
include "../includes/end.php";
?>