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

<?
include "includes/cabecalho.php"; //carrega arquivo de cabe�alho
?>
<table width="100%" border="0" cellspacing="0" cellpadding="0">

<tr>
    <td >
                <div align="center" class="tituloFundo">
                    Processamento do Arquivo
                </div>
    </td>
</tr>

<tr>
    <td  bgcolor="#EFEFEF" >
    <br>

<?

/**
 * Carga de s&eacute;rie hist�rica de um indicador
 *
 * Este programa foi criado apenas para demonstrar a tecnologia do upload e a sua carga 
 * na tabela de s&eacute;rie hist�rica do Painel. Ele &eacute; chamado por uploadFormulario.php.
 *
 * PHP version 5
 *
 * @author    Redes e Sistemas de Informa��o <rsi@rsi.com.br>
 * @copyright 2010 Redes e Sistemas de Informa��o
 */

//
// carrega arquivo de conex�o do BD
//
include "includes/pg_begin.php";
 
//
// verifica se houve algum erro, identificado pelo PHP, no upload do arquivo
// os poss�veis erros encontram-se em http://php.net/manual/en/features.file-upload.errors.php
//
if ($_FILES["file"]["error"] > 0) {
	echo "Error: " . $_FILES["file"]["error"] . "<br />";
	exit;
}

//
// apenas para teste, mostra os principais atributos do arquivo carregado
//
//echo "Upload: "    . $_FILES["file"]["name"]          . "<br />";
//echo "Type: "      . $_FILES["file"]["type"]          . "<br />";
//echo "Size: "      . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
//echo "Stored in: " . $_FILES["file"]["tmp_name"]      . "<br />";;

//
// le o conte�do do arquivo carregado
// usa uma fun��o chamada fgetcsv
// http://php.net/manual/en/function.fgetcsv.php
//
$tmp_file = $_FILES["file"]["tmp_name"];
$row = 1;

$houve_algum_erro = false;

if (($handle = fopen($tmp_file, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        
        $houve_critica = false;
        
        $num = count($data);

		// a primeira linha, de cabe�alho, tem campos com delimitador " - "
		// pen�ltimo campo &eacute; a periodicidade
		// �ltimo campo &eacute; a granularidade
		if ($row == 1) {
			$row++;
			$campo = split (' - ', $data[0]);
			$quantos = count($campo);
			$csv_periodicidade = $campo[$quantos - 2];

			// formato: "do xxxx" ou "por xxxx" onde xxxx &eacute; a granularidade
			$aux_granularidade = $campo[$quantos - 1];
			$campo = split (' ', $aux_granularidade);
			$csv_granularidade = $campo[1];

			//echo '[periodicidade=' . $csv_periodicidade . ']';
			//echo "<br \>\n";
			//echo '[granularidade=' . $csv_granularidade . ']';
			//echo "<br \>\n";
			
			// recupera o c�digo da periodicidade 
			// para poder gravar uma linha na tabela de s&eacute;rie hist�rica
			$sql = "select codigoperiodicidade from periodicidade
					where nomeperiodicidade  = '" . utf8_encode($csv_periodicidade) . "'  ";
			$result = pg_query($dbh, $sql);
			$rows = pg_num_rows ($result);
			if ($rows <= 0) { // periodicidade n&atilde;o encontrada
				echo 'Upload: periodicidade ' . $csv_periodicidade . ' n&atilde;o encontrada<br>';
                $houve_critica = true;				
                break;
			}
			$nt=pg_fetch_array($result);
			$db_codigoperiodicidade = trim(pg_escape_string($nt['codigoperiodicidade']));
			//echo '[c�digoperiodicidade=' . $db_codigoperiodicidade . ']';
			//echo "<br \>\n";

			// recupera o c�digo da granularidade 
			// para poder gravar uma linha na tabela de s&eacute;rie hist�rica
			$sql = "select codigogranularidade from granularidade
					where nomegranularidade  = '" . utf8_encode($csv_granularidade) . "'  ";
			$result = pg_query($dbh, $sql);
			$rows = pg_num_rows ($result);
			if ($rows <= 0) { // granularidade n&atilde;o encontrada
				echo 'Upload: granularidade ' . $csv_granularidade . ' n&atilde;o encontrada';
				$houve_critica = true;  // ATEN��O!! &eacute; necess�rio decidir se um erro cancela tudo ou n&atilde;o, aqui cancelo tudo
                break;
			}
			$nt=pg_fetch_array($result);
			$db_codigogranularidade = trim(pg_escape_string($nt['codigogranularidade']));
			//echo '[c�digogranularidade=' . $db_codigogranularidade . ']';
			//echo "<br \>\n";
		}
		
		// as linhas de 4 campos &eacute; que t�m os valores de s&eacute;rie hist�rica
		if ($num == 4) {
			//echo "$row:";
			$row++;
			$csv_indicador = $data[0];
			$csv_periodo   = $data[1];
			$csv_grao      = $data[2];
			$csv_valor     = $data[3];
			
			// mostra o que leu e extraiu com a fgetcsv
			//echo '(' . $csv_indicador . ')';
			//echo '(' . $csv_periodo . ')';
			//echo '(' . $csv_grao . ')';
			//echo '(' . $csv_valor . ')';
			//echo "<br />\n";
		
			// cr�tica do indicador
			$sql = "select * from indicador where codigoindicador = '" . $csv_indicador . "'  ";
			$result = pg_query($dbh, $sql);
			$rows = pg_num_rows ($result);
			if ($rows <= 0) { // indicador n&atilde;o encontrado
				echo "Upload: indicador " . $csv_indicador . " n&atilde;o encontrado (Linha $row)";
				$houve_critica = true;  // ATEN��O!! &eacute; necess�rio decidir se um erro cancela tudo ou n&atilde;o, aqui cancelo tudo
			}

			// cr�tica do per�odo
			// ATEN��O!! abaixo est� implementada apenas a cr�tica do formato para periodicidade mensal e anual
			// ATEN��O!! &eacute; necess�rio decidir se um erro cancela tudo ou n&atilde;o, aqui cancelo tudo
			switch ($csv_periodicidade) {
				case 'mensal': // formato: aaaa/mm
					list ($ano, $mes) = split ('/',$csv_periodo);
					if (!is_numeric($ano)) {echo "Ano " . $ano . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; $houve_critica = true;}
					if (!is_numeric($mes)) {echo "M�s " . $mes . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; $houve_critica = true;}
                    
                    $data_aux = date_create("$mes/01/$ano"); //formato do date_create (mes/dia/ano)            
                    if (!$data_aux)
                    {
                        echo "Per�odo $csv_periodo inv�lido (Linha $row)<br \>"; 
                        $houve_critica = true;
                    };
                    
					break;
				case 'bimestral': // formato: aaaa/Bn
                    list ($ano, $bimestre) = split ('/',$csv_periodo);
                    if (!is_numeric($ano)) {echo "Ano " . $ano . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; $houve_critica = true;}
                    if (($bimestre!="B1") && ($bimestre!="B2") && ($bimestre!="B3") && ($bimestre!="B4") && ($bimestre!="B5") && ($bimestre!="B6"))
                    {
                         echo "Bimestre " . $bimestre . " n&atilde;o &eacute; v�lido (Linha $row)<br \>"; 
                         $houve_critica = true;
                    }                    
					break;
				case 'trimestral': // formato: aaaa/Tn
                    list ($ano, $trimestre) = split ('/',$csv_periodo);
                    if (!is_numeric($ano)) {echo "Ano " . $ano . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; $houve_critica = true;}
                    if (($trimestre!="T1") && ($trimestre!="T2") && ($trimestre!="T3") && ($trimestre!="T4"))
                    {
                         echo "Trimestre " . $trimestre . " n&atilde;o &eacute; v�lido (Linha $row)<br \>"; 
                         $houve_critica = true;
                    }
					break;
				case 'semestral': // formato: aaaa/Sn
                    list ($ano, $semestre) = split ('/',$csv_periodo);
                    if (!is_numeric($ano)) {echo "Ano " . $ano . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; $houve_critica = true;}
                    if (($semestre!="S1") && ($semestre!="S2") )
                    {
                         echo "Semestre " . $semestre . " n&atilde;o &eacute; v�lido (Linha $row)<br \>"; 
                         $houve_critica = true;
                    }
					break;
				case 'anual':  // formato: aaaa
					$ano = $csv_periodo;
					if (!is_numeric($ano)) {echo "Ano " . $ano . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; $houve_critica = true;}
					break;
				case 'bianual': // formato: aa/aa
                    list ($ano1, $ano2) = split ('/',$csv_periodo);
                    if (!is_numeric($ano1)) {echo "Ano " . $ano1 . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; $houve_critica = true;}
                    if (!is_numeric($ano2)) {echo "Ano " . $ano2 . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; $houve_critica = true;}
					break;
			}

			// cr�tica do gr�o
			// n&atilde;o h�, pois n&atilde;o h� uma tabela de poss�veis gr�os para uma dada granularidade

			// cr�tica do valor
			// ATEN��O!! &eacute; necess�rio decidir se um erro cancela tudo ou n&atilde;o, aqui cancelo tudo
			$csv_valor = str_replace ("," , "." , $csv_valor);
			if (!is_numeric($csv_valor)) 
            {
                    echo "valor " . $csv_valor . " n&atilde;o &eacute; num&eacute;rico (Linha $row)<br \>"; 
                    $houve_critica = true;
            }
            
            if (!$houve_critica)
            {
			    // verifica se valor existe na s&eacute;rie hist�rica
			    $sql="
				    select *
				    from seriehistorica S
				    where S.codigoindicador   = '" . $csv_indicador            . "'  
				    and S.codigoperiodicidade =  " . $db_codigoperiodicidade   . "
				    and S.valorperiodo        = '" . utf8_encode($csv_periodo) . "'  
				    and S.codigogranularidade =  " . $db_codigogranularidade   . "
				    and S.valorgranularidade  = '" . utf8_encode($csv_grao)    . "'  
				    and S.status = 0
				    ";
			    $result = pg_query($dbh, $sql);
			    $rows = pg_num_rows ($result);

			    if ($rows <= 0) {

				    // se o valor n&atilde;o existe, inclui
				    //echo 'n&atilde;o est� no BD, ent�o inclui';
				    //echo "<br />\n";
				    
				    $sql = "
					    insert into seriehistorica (
						    codigoindicador,
						    codigogranularidade,
						    valorperiodo,
						    valorindicador,
						    valorgranularidade,
						    status,
						    codigoperiodicidade
					    )
					    values (
						    '" . $csv_indicador . "', 
						     " . $db_codigogranularidade . ", 
						    '" . utf8_encode($csv_periodo) . "', 
						    '" . $csv_valor . "', 
						    '" . utf8_encode($csv_grao) . "', 
						     " . '0' . ", 
						     " . $db_codigoperiodicidade . " 
					    )";
				    $result = pg_query($dbh, $sql);
			    
			    } else {
			    
				    // se o valor existe, atualiza
				    //echo 'sim, est� no BD, ent�o atualiza';
				    //echo "<br />\n";

				    $sql = "
					    update seriehistorica S
					    set valorindicador        = " . $csv_valor . "
					    where S.codigoindicador   = '" . $csv_indicador            . "'  
					    and S.codigoperiodicidade =  " . $db_codigoperiodicidade   . "
					    and S.valorperiodo        = '" . utf8_encode($csv_periodo) . "'  
					    and S.codigogranularidade =  " . $db_codigogranularidade   . "
					    and S.valorgranularidade  = '" . utf8_encode($csv_grao)    . "'  
					    and S.status = 0
					    ";
				    $result = pg_query($dbh, $sql);

			    }
            }
            else
            {
                $houve_algum_erro = true;
            }
		}
    }
    fclose($handle);
}

//
// remove o arquivo que foi carregado
//
unlink ($_FILES["file"]["tmp_name"]);

?>
    </td>
</tr>

<tr>
    <td bgcolor="#EFEFEF" valign="center">
    
    <?
        if (!$houve_algum_erro)
        {
            echo "<p align='center'><b>O arquivo foi processado com sucesso.</b></p>";
        }
        else
        {
            echo "<p align='center'><b>1 ou mais erros foram encontrados.</b></p>";
        }
    ?>
    
        <p align="center">
            <input type="button" onclick="history.back(-1);" name="submit" value="Voltar" />
            &nbsp;
            <input type="button" onclick="window.close();" name="submit" value="Fechar" />
        </p>
    </td>
</tr>

<tr>
          <td colspan="3" bgcolor="#E77817" height="10"></td>
        </tr>
</table>

</body> 
</html> 