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

<?
/*********************************************************************

Programa: cobrador.php
Criado em: 25/02/2010
Autor: Gustavo Moreira

Definição:
    Esse script verifica as séries históricas que estão pendentes e chama o respectivo Calculador.
    No caso de retorno, a série histórica que estiver pendente é removida e a série histórica é criada de
    acordo com o retorno do Calculador. 


Descrição:    
    0.    Grava no log o início da execução do programa
    1.    Para cada indicador identificado com valor pendente em seriehistorica (staus 1), verifica que programa Calculador (atributo urlcalculador) deve ser chamado para calcular
    2.    Grava no log os parâmetros e o programa CalculadorXYZ a ser chamado (URL de chamada)
    3.    Aciona o Calculador necessários informando os parâmetros de Indicador, Período e Granularidade
    7.    Grava no log a linha de dados recebida 
    8.    Para cada linha recebida
    8.1   Processa a linha, validando os dados recebidos. 
    8.2     Se OK, verifica todos os dados recebidos e atualiza registros na tabela seriehistorica, com status = 0 (valor ok)
    8.3     Caso contrário, grava no log o erro encontrado.
    9.    Grava no log o término da execução do programa (quantas séries estavam pendentes e quantas foram atualizadas)

    
    
Parâmetros de Entrada:

    Nenhum
    
Saída:
    Nenhum
        
*********************************************************************/
set_time_limit  ( 600  );


include "includes/pg_begin.php";     //carrega arquivo de conexao

function retira_acentos( $texto )
{
  $array1 = array(   "á", "à", "â", "ã", "ä", "é", "è", "ê", "ë", "í", "ì", "î", "ï", "ó", "ò", "ô", "õ", "ö", "ú", "ù", "û", "ü", "ç"
                     , "Á", "À", "Â", "Ã", "Ä", "É", "È", "Ê", "Ë", "Í", "Ì", "Î", "Ï", "Ó", "Ò", "Ô", "Õ", "Ö", "Ú", "Ù", "Û", "Ü", "Ç" );
  $array2 = array(   "a", "a", "a", "a", "a", "e", "e", "e", "e", "i", "i", "i", "i", "o", "o", "o", "o", "o", "u", "u", "u", "u", "c"
                     , "A", "A", "A", "A", "A", "E", "E", "E", "E", "I", "I", "I", "I", "O", "O", "O", "O", "O", "U", "U", "U", "U", "C" );
  return str_replace( $array1, $array2, $texto );
} 


function inverte_periodo($p)
{
    $aux = split("/",$p);
    if (count($aux) == 2)    
        return $aux[1] . "/" . $aux[0];
    else
        return $p;
}
   
//pg_query($dbh, "ROLLBACK");
//exit;


/*
   * @return string
   * @param string $url
   * @desc Return string content from a remote file
   * @author Luiz Miguel Axcar (lmaxcar@yahoo.com.br)
*/

function get_content($url)
{
    
    $ch = curl_init();
    
    if (!$ch)
    {
        GravarLog("COBRADOR","Erro no comando \"curl_init()\"",1, $dbh);
    }
   
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_HEADER, 0);

    ob_start();

    curl_exec ($ch);
    curl_close ($ch);
    $string = ob_get_contents();

    ob_end_clean();
   
    return $string;    
}


include "includes/functions.php";     //carrega arquivo de funcoes

GravarLog("COBRADOR","Inicio da Execucao",0, $dbh);

// Seleciona séries pendentes
$sql="
	Select sh.*, i.urlcalculador, g.nomegranularidadeurl
	From seriehistorica sh
    Inner join indicador i on i.codigoindicador = sh.codigoindicador
    Inner join granularidade g on g.codigogranularidade = sh.codigogranularidade
	Where sh.status = 1	";


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

if (!$result) {
   GravarLog("COBRADOR","Nao foi possivel realizar a busca pelas series pendentes",1, $dbh);
   exit;
}

$qt_serie_pendente = pg_num_rows($result);
$qt_serie_atualizada = 0;

//loop para cada valor pendente
while ($row = pg_fetch_array($result))
{
    //inverte a data pois os calculadores esperam formato como MM/AAAA
    $periodo_inv = inverte_periodo(trim($row["valorperiodo"]));
    
    //chama o calculador correspondente 
    $url = trim($row["urlcalculador"]) . "?indicador=". strtolower($row["codigoindicador"]) . "&granularidade=".  trim($row["nomegranularidadeurl"]) ."&periodo=" . $periodo_inv;
    
    GravarLog("COBRADOR","Chamando URL: $url",0, $dbh);
    
    //acessa o programa    
    $linhas = get_content($url);
    //$linhas = file( $url );
    
    //cria array
    $linhas = split("\n",$linhas);
    
    if ((!$linhas) || (count($linhas) == 1 && (trim($linhas[0]) == "")))
    {
      GravarLog("COBRADOR","Erro ao acessar a URL: $url",2, $dbh);
      continue;
    }
    
    GravarLog("COBRADOR","URL: $url Retorno: " . implode("", $linhas),0, $dbh);
    
    $houve_erro = false;
    $qt_linha = 0;
    
    //verificar se todas as linhas do retorno estão ok
    foreach($linhas as $linha)
    {
        $qt_linha++;
        /************************************
        Formato da linha
        CCC;III;G1;G2;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         
         
        ************************************/
        //retirar caracter "\n"
        $linha = str_replace("\n","",$linha);
        
        if (trim($linha) == "")
            continue;
        
        $campos = split(";",$linha);
        
        
        if ((count($campos) == 1) && ($linha != ""))
        {
            GravarLog("COBRADOR","Calculador retornou codigo de erro: $linha",4, $dbh);
            $houve_erro = true;
            break;
        }
        
        if (count($campos) != 5)
        {
            GravarLog("COBRADOR","Quantidade de campos invalida ao processar a linha $qt_linha de retorno: $linha",3, $dbh);
            $houve_erro = true;
            break;
        }
        
        if ($campos[0] != "0")
        {
            GravarLog("COBRADOR","Calculador retornou codigo de erro o processar a linha $qt_linha de retorno: $linha",4, $dbh);
            $houve_erro = true;
            break;            
        }
        
        if (!is_numeric( str_replace(",",".",$campos[4]) ))
        {
            GravarLog("COBRADOR","Campo <Valor> (".str_replace(",",".",$campos[4]).") nao eh numerico na linha $qt_linha de retorno: $linha",3, $dbh);
            $houve_erro = true;
            break;            
        }
        
    } // fim - loop validação das linhas de retorno
    
    
    //se todas as linhas estão ok, atualizar série histórica
    if (!$houve_erro)
    {
        //iniciar transação
        pg_query($dbh, "BEGIN");
        
        
        
        //apagar a série histórica que está pendente
        $sql = "delete from seriehistorica where codigoindicador = '". strtoupper($row["codigoindicador"])."' and valorperiodo = '".$row["valorperiodo"]."' and codigogranularidade = ".$row["codigogranularidade"]." and valorgranularidade = '".$row["valorgranularidade"]."' ";
        $ret = pg_query($dbh, $sql);        
        
        
        if (!$ret)
        {
            $erro = pg_last_error();            
            pg_query($dbh, "ROLLBACK");
            GravarLog("COBRADOR","Erro ao remover serie historica. Erro: $erro Sql: $sql",5, $dbh);
            $houve_erro = true;
            continue; //pula para o proximo Calculador
        }
        
        foreach($linhas as $linha)
        {
            if (trim($linha) == "")
                continue;
                
            //retirar caracter "\n"
            $linha = str_replace("\n","",$linha);
            $campos = split(";",$linha);
            
            //inverter campo de data
            $aux = split("/",$campos[3]);
            $periodo_invertido = "";
            
            for ( $i=count($aux)-1; $i >= 0; $i-- )
            {
                if ($periodo_invertido != "")
                    $periodo_invertido = $periodo_invertido . "/";
                    
                $periodo_invertido = $periodo_invertido . $aux[$i];
            }
                        
            
            $sql = "Insert into seriehistorica (
                    codigoindicador,
                    codigogranularidade,
                    valorperiodo,
                    valorindicador,
                    valorgranularidade,
                    status,
                    codigoperiodicidade )
                    values (upper('".$campos[1]."'), ".$row["codigogranularidade"].", '".$periodo_invertido."', ". str_replace(",",".",$campos[4]) .", '".$campos[2]."', 0,".$row["codigoperiodicidade"]." )";
                    
            $ret = pg_query($dbh, utf8_encode($sql));
            
            $msg_erro = "";
            
            if (!$ret)
            {
                $erro = pg_last_error();
                $houve_erro = true;
                break;
            }
        }
        
        //finalizar ou desfazer a transação
        if (!$houve_erro)
        {
            pg_query($dbh, "COMMIT");
            $qt_serie_atualizada++;
        }
        else
        {
            pg_query($dbh, "ROLLBACK");
            GravarLog("COBRADOR","Erro ao inserir serie historica. Erro: $erro Sql: $sql",5, $dbh);
        }
        
    }//fim - se nao houve erro
   
    
}//fim - loop de cada série histórica pendente

GravarLog("COBRADOR","Termino da Execucao - Num Series Pendentes: $qt_serie_pendente Num Series Atualizadas: $qt_serie_atualizada",0, $dbh);

include "includes/pg_end.php"; 
?>