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

<?
header("Content-Type: text/html; charset=UTF-8",true);

/* ------------------------------------------------------------------------------

              Script para exporta��o de dados das tabelas do semed
                               para o formato xml
    
    Basicamente o programa define um vetor contendo todosos atributos das tabelas
    do sistema semed. O detalhamento dos atributos permite formatar os mesmos, assim
    como tamb�m recuperar os dados existentes em tabelas de refer�ncia, tornando mais
    claro o entendimento, evitando c�digos sem sentido � leitura humana.
    
    Em seguida, s�o definidos os ineps corespondentes aos Usuarios matriculados. No caso
    � construido um vetor contendo todos os ineps, que tem que ser referenciados no
    documento xml.
    
    Para cada um desses ineps, s�o recuperados os dados em cada uma das tabelas do
    sistema, de modo a tornar um todo l�gico a cada Usuario, definindo dados pessoais,
    de responsaveis, de matr�cula atual, matr�cula antiga, etc.
    
    A sequencia l�gica � mostrada nos coment�rios locais.
    
-------------------------------------------------------------------------------*/

// Define vetor contendo caracteristicas de atributos

$nomeAtributoXml = array(

       'CARTAO-SUS.cartaosus.c.',
       'INEP.inepUsuario.c.',
       'NOME-Usuario.nomeUsuario.c.',
       'SEXO-Usuario.sexoUsuario.sexo.sexo.nomesexo.',
       'DATA-NASCIMENTO.datanascimentoUsuario.d.',
       'UF-NASCIMENTO.ufnascimentoUsuario.estado.codigoestado.nomeestado.',
       'MUNICIPIO-NASCIMENTO.codigomunicipionascimentoUsuario.municipio.codigomunicipio.nomemunicipio.',
       'CERTIDAO-CARTORIO.certidaonascimentocartorio.c.',
       'CERTIDAO-TERMO.certidaonascimentotermo.c.',
       'CERTIDAO-FOLHA.certidaonascimentofolha.c.',
       'CERTIDAO-LIVRO.certidaonascimentolivro.c.',
       'CERTIDAO-EMISSAO.certidaonascimentoemissao.d...',
       'CERTIDAO-ESTADO.certidaonascimentoestado.estado.codigoestado.nomeestado.',
       'CERTIDAO-APRESENTADA.certidaoapresentada.b.',
       'CERTIDAO-DIGITALIZADA.certidaodigitalizada.b.',
       'REGISTRO-PAI.existeregistropai.b.',
       'REGISTRO-MAE.existeregistromae.b.',
       'CPF.cpfUsuario.c.',
       'CPF-COMPROVADO.cpfcomprovado.b.',
       'CPF-DIGITALIZADO.cpfdigitalizado.b.',
       'ESPECIAL.especialUsuario.b.',
       'COMPROVADO-ESPECIAL.comprovadoespecial.b.',
       'DIGITALIZADO-ESPECIAL.digitalizadoespecial.b.',
       'NIS.nisUsuario.c.',
       'NACIONALIDADE.nacionalidadeUsuario.nacionalidade.nacionalidade.descricaonacionalidade.',
       'PAIS.codigopaisUsuario.pais.codigopais.nomepais.',
       'COR-RACA.corracaUsuario.corracaUsuario.corraca.descricaocorraca.',
       'GRUPO-SANGUINEO.gruposanguineoUsuario.gruposanguineo.gruposanguineo.descricaogruposanguineo.',
       'IRMAO-ESCOLA-MUNICIPAL.possuiirmaoescolamunicipal.b.',
       'LOGRADOURO.logradouroUsuario.c.',
       'NUMERO.logradouronumeroUsuario.c.',
       'COMPLEMENTO.logradourocomplementoUsuario.c.',
       'BAIRRO.logradourobairroUsuario.c.',
       'CIDADE.logradourocidadeUsuario.municipio.codigomunicipio.nomemunicipio.',
       'UF.logradouroufUsuario.estado.codigoestado.nomeestado.',
       'CEP.logradourocepUsuario.c.',
       'GEOIGUACU.logradourogeoiguacuUsuario.c.',
       'LOGRADOURO-NAO-CADASTRADO.logradouronaocadastrado.b.',
       'PONTO-REFERENCIA.logradouropontoreferenciaUsuario.c.',
       'TELEFONE-FIXO.telefonefixoUsuario.c.',
       'TELEFONE-CELULAR.telefonecelularUsuario.c.',
       'TELEFONE-RECADO.telefonerecadoUsuario.c.',
       'EMAIL.emailUsuario.c.',
       'DATA-RECADASTRAMENTO.datarecadastramento.d.',
       'POSSUI-TELEFONE-FIXO.possuitelefonefixo.b.',
       'POSSUI-TELEFONE-CELULAR.possuitelefonecelular.b.',
       'POSSUI-TELEFONE-RECADO.possuitelefonerecado.b.',
       'POSSUI-EMAIL.possuiemail.b.',

       'GRAU-PARENTESCO.grauparentescoresponsavel.parentesco.grauparentesco.descricaograuparentesco.',
       'DOCUMENTO-RESPONSAVEL.tipodocidresponsavel.tiposdocumento.tipodocumento.descricaotipodocumento.',
       'OUTRO-DOCUMENTO-RESPONSAVEL.outrodocidresponsavel.c.',
       'NUMERO-DOCUMENTO-RESPONSAVEL.numdocidresponsavel.c.',
       'DOCUMENTO-RESPONSAVEL-COMPROVADO.docresponsavelcomprovado.b.',
       'DOCUMENTO-RESPONSAVEL-DIGITALIZADO.docresponsaveldigitalizado.b.',
       'NOME-RESPONSAVEL.nomeresponsavel.c.',
       
       'CODIGO-ESCOLA-MATRICULA.codigoescolamatricula.escola.codigoescola.nomeescola.',
       'RESPONSAVEL-MATRICULA.responsavelmatricula.responsavelmatricula.responsavelmatricula.descricaoresponsavelmatricula.',
       'DATA-MATRICULA.datamatricula.d.',
       'ESCOLARIDADE-MATRICULA.escolaridadematricula.escolaridadeUsuario.codigoescolaridade.descricaoescolaridade.',
       'TIPO-DOCUMENTO-RESPONSAVEL-MATRICULA.tipodocidresponsavelmatricula.tiposdocumento.tipodocumento.descricaotipodocumento.',
       'NUMERO-DOCUMENTO-RESPONSAVEL-MATRICULA.numdocidresponsavelmatricula.c.',
       'DATA-INGRESSO-ESCOLA.dataingressoUsuarioescola.d.',
       'PRIMEIRA-MATRICULA.primeiramatricula.b.',
       
       'CODIGO-ESCOLA-ANTERIOR.codigoescolaanterior.escola.codigoescola.nomeescola.',
       'NOME-ESCOLA-ANTERIOR.nomeescolaanterior.c.',
       'BAIRRO-ESCOLA-ANTERIOR.bairroescolaanterior.c.',
       'TIPO-ESCOLA-ANTERIOR.tipoescolaanterior.tiposescola.tipoescola.descricaotipoescola.',
       'ANO-ESCOLA-ANTERIOR.escolaridadeanterior.escolaridadeUsuario.codigoescolaridade.descricaoescolaridade.',
       'TURNO-ANTERIOR.turnoanterior.turnoescolar.turnoescolar.descricaoturnoescolar.',
       'TURMA-ANTERIOR.turmaanterior.c.',
       'APROVADO-ANTERIOR.aprovadoanterior.b.',
       'COMPROVADO-ANTERIOR.comprovadoanterior.b.',
       'HORARIO-INTEGRAL.horariointegralanterior.b.',
       
       'ESCOLA-PREFERENCIA.codigoescolapreferencia.escola.codigoescola.nomeescola.',
       'TURNO-PREFERENCIA.turnopreferencia.turnoescolar.turnoescolar.descricaoturnoescolar.',
       'DESEJA-HORARIO-INTEGRAL.desejahorariointegral.b.',
       'PASSE-ESCOLAR-Usuario.Usuarionecessitapasseescolar.b.',
       'PASSE-ESCOLAR-RESPONSAVEL.responsavelnecessitapasseescolar.b.',
       'Usuario-TRANSFERIDO.Usuariotransferido.b.',
       'TIPO-ESCOLA-ORIGEM.tipoescolaorigem.tiposescola.tipoescola.descricaotipoescola.',
       'OUTRO-TIPO-ESCOLA-ORIGEM.outrostiposescolaorigem.c.',
       'NOME-ESCOLA-ORIGEM.codigoescolaorigem.escola.codigoescola.nomeescola.',
       'BOLSA-FAMILIA.bolsafamilia.b.',
       
       'TIPO-NECESSIDADE-ESPECIAL.tiponecessidadeespecial.necessidadesespeciais.tiponecessidadeespecial.descricaotiponecessidadeespecial.',
       'COMPROVADO-ESPECIAL.comprovadoespecial.b.',
       'DIGITALIZADO-ESPECIAL.digitalizadoespecial.b.',
       
       'NOME-IRMAO.nomeirmao.c.',
       'NOME-ESCOLA-IRMAO.codigoescolairmao.escola.codigoescola.nomeescola.',
       'ANO-ESCOLAR-IRMAO.escolaridadeirmao.escolaridadeUsuario.codigoescolaridade.descricaoescolaridade.'
       
       );

// Abre arquivo xml e o banco

$arq = fopen("./dbxml.xml", "w");
if ($arq == NULL) {
	die ("Erro na abertura do arquivo.");
}

$conn = pg_connect("host=localhost port=5432 dbname=semed user=postgres password=postgres");
if (!$conn) {
     die ("Erro na connex�o: " . pg_last_error());
}

// Define linhas iniciais arquivo xml

$linha0_1 = "<?xml version=\"1.0\" ?";
$linha0_2 = "> \n";
$linha0 = $linha0_1 . $linha0_2;
$linha1 = "<SEMED> \n";
fprintf($arq, $linha0);
fprintf($arq, $linha1);

// Acessa a tabela de Usuarios. Define vetor de ineps

$sql = "select * from Usuario";
$result = pg_query($conn, $sql);
if (!$result)
{
   die("Erro: Tabela de Usuarios vazia");
}
$indiceInep = 0;
while ($UsuariosSelecionados = pg_fetch_array($result))
{
 $inepToXml[$indiceInep] = $UsuariosSelecionados["inepUsuario"];
 $indiceInep+=1;
}

// Inicia formatacao xml

$indiceInep = 0;
$indiceAtributos = 0;
$indiceTabelas = 1;
$totalTabelas = 7;

// Inicia a recupera��o de dados da base

while ($indiceInep != sizeof($inepToXml))
{

// Para Usuarios

   if ($indiceTabelas == 1)
   {
     $indiceInicial = 0;
     $indiceFinal = 48;
     $inep = $inepToXml[$indiceInep];
     $sql = "select * from Usuario where inepUsuario = '$inep'";
     $result = pg_query($conn, $sql);
     if (!$result)
     {
       die("Erro Grave: N�o selecionou nenhum Usuario para inep $inep <br>");
     }
   }
   
// Para responsaveis
   
   if ($indiceTabelas == 2)
   {
     $indiceInicial = 48;
     $indiceFinal = 55;
     $inep = $inepToXml[$indiceInep];
     $sql = "select * from responsavel where inepUsuario = '$inep'";
     $result = pg_query($conn, $sql);
     if (!$result)
     {
       echo "Warning: N�o selecionado nenhum respons�vel para inep $inep <br>";
     }
   }
   
// Para matricula atual

   if ($indiceTabelas == 3)
   {
     $indiceInicial = 55;
     $indiceFinal = 63;
     $inep = $inepToXml[$indiceInep];
     $sql = "select * from matriculaatual where inepUsuario = '$inep'";
     $result = pg_query($conn, $sql);
     if (!$result)
     {
       echo "Warning: N�o selecionada nenhuma matr�cula atual para inep $inep <br>";
     }
   }
   
// Para matricula anterior

   if ($indiceTabelas == 4)
   {
     $indiceInicial = 63;
     $indiceFinal = 73;
     $inep = $inepToXml[$indiceInep];
     $sql = "select * from matriculaanterior where inepUsuario = '$inep'";
     $result = pg_query($conn, $sql);
     if (!$result)
     {
       echo "Warning: N�o selecionada nenhuma Matr�cula Anterior para inep $inep <br>";
     }
   }
   
// Para informa��es complementares

   if ($indiceTabelas == 5)
   {
     $indiceInicial = 73;
     $indiceFinal = 83;
     $inep = $inepToXml[$indiceInep];
     $sql = "select * from infocomplementar where inepUsuario = '$inep'";
     $result = pg_query($conn, $sql);
     if (!$result)
     {
       echo "Warning: N�o selecionada nenhuma Informa��o complementar para inep $inep <br>";
     }
   }
   
// Para especiais

   if ($indiceTabelas == 6)
   {
     $indiceInicial = 83;
     $indiceFinal = 86;
     $inep = $inepToXml[$indiceInep];
     $sql = "select * from especial where inepUsuario = '$inep'";
     $result = pg_query($conn, $sql);
     if (!$result)
     {
       echo "Warning: N�o selecionado nenhum especial para inep $inep <br>";
     }
   }
   
// Para irm�os em escola municipal

   if ($indiceTabelas == 7)
   {
     $indiceInicial = 86;
     $indiceFinal = 89;
     $inep = $inepToXml[$indiceInep];
     $sql = "select * from irmaosUsuario where inepUsuario = '$inep'";
     $result = pg_query($conn, $sql);
     if (!$result)
     {
       echo "Warning: N�o selecionado nenhum irm�o para inep $inep <br>";
     }
   }
   
// A cada uma das tabelas corresponde um indice de tabela

// Recupera todas as instancias existentes para um inep

   while ($linhaResultado = pg_fetch_array($result))
   {

// Define limite de Usuario no arquivo xml

       if ($indiceTabelas == '1')
       {
          $linhaTabela = "      <Usuario> \n";
          fprintf($arq, $linhaTabela);
       }
       
// Define limite de responsaveis no xml
       
       if ($indiceTabelas == '2')
       {
         $linhaTabela = "      <RESPONSAVEIS> \n";
         fprintf($arq, $linhaTabela);
       }
       
// Define limite de matricula atual no xml

       if ($indiceTabelas == '3')
       {
         $linhaTabela = "      <MATRICULA-ATUAL> \n";
         fprintf($arq, $linhaTabela);
       }
       
// Define limite de matricula atual no xml

       if ($indiceTabelas == '4')
       {
         $linhaTabela = "      <MATRICULA-ANTERIOR> \n";
         fprintf($arq, $linhaTabela);
       }
       
// Define limite de informa��es complementares no xml

       if ($indiceTabelas == '5')
       {
         $linhaTabela = "      <INFORMACOES-COMPLEMENTARES> \n";
         fprintf($arq, $linhaTabela);
       }
       
// Define limite de informa��es sobre especiais no xml

       if ($indiceTabelas == '6')
       {
         $linhaTabela = "      <ESPECIAL> \n";
         fprintf($arq, $linhaTabela);
       }
       
// Define limite de informa��es sobre irm�os em escola municipal

       if ($indiceTabelas == '7')
       {
         $linhaTabela = "      <IRMAO> \n";
         fprintf($arq, $linhaTabela);
       }
       
// Varre todos os atibutos definidos no vetor
       
       $indice = $indiceInicial;
       while ($indice != $indiceFinal)
       {
          $atributoXml = $nomeAtributoXml[$indice];
          $tamanhoAtributoXml = strlen($atributoXml);
       
// Pega o nome do atributo para o xml
       
          $labelXml = "";
          $posicao = 0;
          while ( $atributoXml[$posicao] != '.')
          {
              $labelXml = $labelXml . $atributoXml[$posicao];
              $posicao+=1;
          }
       
// Pega o nome da variavel na tabela
       
          $posicao+=1;
          $nomeAtributoTabela = "";
          while ($atributoXml[$posicao] != '.')
          {
              $nomeAtributoTabela = $nomeAtributoTabela . $atributoXml[$posicao];
              $posicao+=1;
          }
          $posicao+=1;
          $atributoProcessado = '0';
          
// Verifica se tipo caracter puro
          
          if ( strcmp(substr($atributoXml, $posicao, 2), "c.") == 0)
          {
             $atributoTabela =  $linhaResultado[$nomeAtributoTabela];
             if (strlen(trim($atributoTabela)) == 0)
             {
                $atributoTabela = "''";
             }
             $atributoProcessado = '1';
          }

// Verifica se booleano
          
          elseif ( strcmp(substr($atributoXml, $posicao, 2), "b.") == 0)
          {
             $atributoTabela =  $linhaResultado[$nomeAtributoTabela];
             if ($atributoTabela == '1')
             {
                $atributoTabela = "SIM";
             }
             else
             {
                if ($atributoTabela == '0')
                {
                    $atributoTabela = "NAO";
                }
                else
                {
                    $atributoTabela = "''";
                }
             }
             $atributoProcessado = '1';
          }
          
// Verifica se tipo date
          
          elseif ( strcmp(substr($atributoXml, $posicao, 2), "d.") == 0)
          {
             $atributoTabela =  $linhaResultado[$nomeAtributoTabela];
             if (strlen($atributoTabela) != 0)
             {
                $dataInverter = "";
                $dataInverter = $dataInverter . substr($atributoTabela, 8, 2) . "/";
                $dataInverter = $dataInverter . substr($atributoTabela, 5, 2) . "/";
                $dataInverter = $dataInverter . substr($atributoTabela, 0, 4);
                $atributoTabela = $dataInverter;
             }
             else
             {
                $atributoTabela = "''";
             }
             if ( strcmp($atributoTabela, "01/01/0001") == 0)
             {
                $atributoTabela = "''";
             }
             $atributoProcessado = '1';
          }
          
// Se n�o � algum anterior ent�o recupera de uma tabela
          
          elseif ($atributoProcessado == '0')
          {
             $atributoTabela =  $linhaResultado[$nomeAtributoTabela];
             if (strlen(trim($atributoTabela)) != 0)
             {
                $tabela = "";
                while ($atributoXml[$posicao] != '.')
                {
                    $tabela = $tabela . $atributoXml[$posicao];
                    $posicao+=1;
                }
                $posicao+=1;
                $atributoPesquisa = "";
                while ($atributoXml[$posicao] != '.')
                {
                   $atributoPesquisa = $atributoPesquisa . $atributoXml[$posicao];
                   $posicao+=1;
                }
                $posicao+=1;
                $atributoAlvo = "";
                while ($atributoXml[$posicao] != '.')
                {
                    $atributoAlvo = $atributoAlvo . $atributoXml[$posicao];
                    $posicao+=1;
                }
                $posicao+=1;
                $sqlTab = "select $atributoAlvo from $tabela where $atributoPesquisa = '$atributoTabela'";
                $resultTab = pg_query($conn, $sqlTab);
                if (!$resultTab)
                {
                   die("Erro Grave: Atualizar Tabelas de Refer�ncia");
                }
                $atributoRecuperado = pg_fetch_array($resultTab);
                $atributoTabela = $atributoRecuperado["$atributoAlvo"];
             }
             else
             {
                $atributoTabela = "''";
             }
          }
// Controi linha para o presente atributo
          
          $linhaAtributo = "             <$labelXml> $atributoTabela </$labelXml> \n";
          fprintf($arq, $linhaAtributo);

          
          $atributoProcessado ='0';
          $indice+=1;
       }
       
// Fecha atributos de um Usuario
       
       if ($indiceTabelas == '1')
       {
          $linhaTabela = "      </Usuario> \n";
          fprintf($arq, $linhaTabela);
       }
       
// Fecha atributos de responsaveis
       
       if ($indiceTabelas == '2')
       {
          $linhaTabela = "      </RESPONSAVEIS> \n";
          fprintf($arq, $linhaTabela);
       }
       
// Fecha atributos de matricula atual

       if ($indiceTabelas == '3')
       {
          $linhaTabela = "      </MATRICULA-ATUAL> \n";
          fprintf($arq, $linhaTabela);
       }

// Fecha atributos de matricula anterior

       if ($indiceTabelas == '4')
       {
          $linhaTabela = "      </MATRICULA-ANTERIOR> \n";
          fprintf($arq, $linhaTabela);
       }
       
// Fecha atributos de informacoes complementares

       if ($indiceTabelas == '5')
       {
          $linhaTabela = "      </INFORMACOES-COMPLEMENTARES> \n";
          fprintf($arq, $linhaTabela);
       }
       
// Fecha atributos para portador de necessidades especiais

       if ($indiceTabelas == '6')
       {
          $linhaTabela = "      </ESPECIAL> \n";
          fprintf($arq, $linhaTabela);
       }
       
// Fecha atributos de irm�os em escola municipal

       if ($indiceTabelas == '7')
       {
          $linhaTabela = "      </IRMAO> \n";
          fprintf($arq, $linhaTabela);
       }

// Controla atributos e tabelas em foco

   }
   if ($indiceTabelas == $totalTabelas)
   {
     $indiceTabelas = 1;
     $indiceInep+=1;
   }
   else
   {
     $indiceTabelas+=1;
   }
}

// encerra programa

$linhaFinal = "</SEMED> \n";
fprintf($arq, $linhaFinal);
fclose($arq);
pg_close($conn);
echo "Arquivo XML Gerado !!!";

?>




