<?php
//
// -- Verificar as tabelas locais e compara com as tabelas na web
function eCook_Sinc_Verificar_Web( $nCodigo_EmpSm, $sData_Inicial, $sData_Final ) {
  $nCodigo_BData = SQLVarConfig('CODIGO_CAD_ACESSO_FILIAL')+0;
  $nData_Inicial = ConvertDataSTR( $sData_Inicial );
  $nData_Final   = ConvertDataSTR( $sData_Final   );
  $sData_Inicial = DATE("Y-m-d",$nData_Inicial);
  $sData_Final   = DATE("Y-m-d",$nData_Final);
  //
  $sSQLQuery_FatItem =
    'SELECT '.
      'COUNT(*) AS Registros, '.
      'COALESCE( SUM( FAT_PRE_TOT ),0 ) AS FAT_PRE_TOT '.
    'FROM fat_item '.
    'WHERE DATE( FAT_DAT_HOR ) BETWEEN CAST( "'.$sData_Inicial.'" AS DATE ) '.
      'AND CAST( "'.$sData_Final.'" AS DATE ) '.
    ';';
  //
  $sSQLQuery_FatGeral =
    'SELECT '.
      'COUNT(*) AS Registros, '.
      'COALESCE( SUM( FAT_TOT_VAL ),0) AS FAT_TOT_VAL,'.
      'COALESCE( SUM( FAT_TOT_REC ),0) AS FAT_TOT_REC '.
    'FROM fat_geral '.
    'WHERE DATE( FAT_DAT_INI ) BETWEEN CAST( "'.$sData_Inicial.'" AS DATE ) '.
      'AND CAST( "'.$sData_Final.'" AS DATE ) '.
    ';';       
  //
  $aSQLRetor_FatItem  = MYSQL_QUERY($sSQLQuery_FatItem) or die ($sSQLQuery_FatItem.'<br>'.mysql_error());
  $aSQLRetor_FatItem  = MYSQL_FETCH_ARRAY($aSQLRetor_FatItem,MYSQL_ASSOC);
  $aSQLRetor_FatGeral = MYSQL_QUERY($sSQLQuery_FatGeral) or die ($sSQLQuery_FatItem.'<br>'.mysql_error());
  $aSQLRetor_FatGeral = MYSQL_FETCH_ARRAY($aSQLRetor_FatGeral,MYSQL_ASSOC);
  //
  $aRetorno = eCook_Sinc_ExeSQLWeb( $nCodigo_BData, $nCodigo_EmpSm, $sSQLQuery_FatItem );
  //$aRetorno = JSON_DECODE( $aRetorno[0] , True );
  $aSQLRetor_FatItem_Web = @$aRetorno['ResultSQL'][0];
  //
  $aRetorno = eCook_Sinc_ExeSQLWeb( $nCodigo_BData, $nCodigo_EmpSm, $sSQLQuery_FatGeral );
  //$aRetorno = JSON_DECODE( $aRetorno[0] , True );
  $aSQLRetor_FatGeral_Web = $aRetorno['ResultSQL'][0];
  //
  $aResultados =
    [ "FAT_ITENS" => [ "Web" => $aSQLRetor_FatItem_Web , "Local" => $aSQLRetor_FatItem  ] ,
      "FAT_GERAL" => [ "Web" => $aSQLRetor_FatGeral_Web, "Local" => $aSQLRetor_FatGeral ]
    ];
  //
  return $aResultados;
}
//
// -- Exportação de movimentos direto no modo forçado --
function eCook_Sinc_Exportacao_Forcada( $sData_Inicial, $sData_Final ) {
  Global $Dados_Empresa;
  $sTitulo_Mensagens   = 'eCook Local - eCook Web';
  $a_Retorno_Mensagens = [];                  // Retorno de mensagens de erro em matriz
  $nTamanho_Limite_Qry = 150*1000;            // Limite de tamanho do lote de querys (Tamanho em bytes). Valor equivalente á 150Kbytes
  $nQtd_Limite_Qry     = 200;                 // Limite de quantidade de querys no lote.
  //
  // -- Capturar configurações locais
  $nCodigo_BData = SQLVarConfig('CODIGO_CAD_ACESSO_FILIAL'  )+0;
  $nCodigo_EmpSm = @$Dados_Empresa['EMP_CODIGO']+0;
  $sChave_Inte_L = SQLVarConfig('CHAVE_ECOOK_WEB_INTEGRACAO');
  $sVersao_BDt_L = SQLVarConfig('VERSAO_BASE_DADOS');
  $aSQLQuery_Web = [];
  $aSQL_Tabelas  =
    [ "fat_item" =>
       [ "CAMPO_REF" => 'FAT_CODIGOI',
         "CAMPO_DAT" => 'FAT_DAT_HOR',
         "TIPO_OPER" => 'I'
       ] ,
      "fat_geral" =>
       [ "CAMPO_REF" => 'FAT_CODIGOI',
         "CAMPO_DAT" => 'FAT_DAT_INI',
         "TIPO_OPER" => 'I'
       ] ,
       "mov_caixa" =>
       [ "CAMPO_REF" => 'MVC_CODIGOI',
         "CAMPO_DAT" => 'MVC_DATAMOV',
         "TIPO_OPER" => 'I'
       ] ,
       "mov_modalidade_pag" =>
       [ "CAMPO_REF" => 'MOV_CODIGOI',
         "CAMPO_DAT" => 'MOV_REGDATA',
         "TIPO_OPER" => 'I'
       ]
    ];
  //
  Info_Evento( "Iniciou a exportação forçada : ".$sData_Inicial." - ".$sData_Final , 0 );
  eCook_Sinc_GArq_Posicao( '0,0' );
  

  //
  //
  //
  //
  // -- Verificar configurações locais
  //
  //
  //
  //  
  If ( STRLEN( SQLVarConfig('URL_COMUNICACAO_RETAGUARDA') ) < 10 ) {
    $a_Retorno_Mensagens[] = "A URL de Comunicação do eCook - Retaguarda não foi configurada no banco local";
  } ElseIf ( $nCodigo_BData < 1 ) {
    $a_Retorno_Mensagens[] = "Código da filial não configurado no banco de dados local";
  } ElseIf ( EMPTY( $sChave_Inte_L ) ) {
    $a_Retorno_Mensagens[] = "Chave de integração web não configurada no banco de dados local";
  }
  If ( ! EMPTY($a_Retorno_Mensagens) ) {
     Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $a_Retorno_Mensagens[0] );
     Return $a_Retorno_Mensagens;
  }
  //
  //
  //
  //
  // -- Capturar versão da base de dados na Web e verificar
  //
  //
  //
  //
  $sSQLQuery = "SELECT VAR_CONTEUDO FROM config WHERE VAR_NOME = 'VERSAO_BASE_DADOS'";
  $aRetorno = eCook_Sinc_ExeSQLWeb( $nCodigo_BData, $nCodigo_EmpSm, $sSQLQuery );
  If ( EMPTY($aRetorno['ResultSQL']) ) {
     $a_Retorno_Mensagens[] = "Houve falha na comunicação com o ECook na Web.";
     Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $a_Retorno_Mensagens[0] );
     Return $a_Retorno_Mensagens;
  }
  $sVersao_BDt_W = @$aRetorno['ResultSQL'][0]['VAR_CONTEUDO'];
  $bZLib_Compativel = (@$aRetorno['ZLIB_Compativel']+0) > 0;
  If ( $sVersao_BDt_L != $sVersao_BDt_W ) {
     $a_Retorno_Mensagens[] = "A versão do banco de dados local do cliente é divergente da versão do banco de dados na nuvem. Local: ".$sVersao_BDt_L." , Nuvem: ".$sVersao_BDt_W;
     Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $a_Retorno_Mensagens[0] );
     Return $a_Retorno_Mensagens;
  }

  //
  //
  //
  //
  //
  //
  //
  //
  //
  //
  


  //
  foreach ( $aSQL_Tabelas As $sNome_Tabela => $aDados_Tabela ) {
    $sCampo_Refer = $aDados_Tabela['CAMPO_REF'];     // Campo de referência
    $sCampo_Data_ = $aDados_Tabela['CAMPO_DAT'];
    $sTp_Operacao = $aDados_Tabela['TIPO_OPER'];     // Operação: I = Inserir , A = Alterar , D = Remover
    $sSQLQuery =
      'SELECT '.$sCampo_Refer.' '.
      'FROM '.$sNome_Tabela.' '.
      'WHERE DATE( '.$sCampo_Data_.' ) BETWEEN CAST( "'.$sData_Inicial.'" AS DATE ) '.
        'AND CAST( "'.$sData_Final.'" AS DATE ) '.
      ';';
    $vSQL_Regs = MYSQL_QUERY( $sSQLQuery );
    $nQtd_Regs = MYSQL_NUM_ROWS( $vSQL_Regs );
    Info_Evento( "Tabela '".$sNome_Tabela."' com ".$nQtd_Regs." registros á serem exportados." , 0 );
    while ( $aSQL_Reg = MYSQL_FETCH_ARRAY( $vSQL_Regs, MYSQL_ASSOC ) ) {
      $sValor_Refer = $aSQL_Reg[$sCampo_Refer];      // Valor do campo de referência
      $sSQLQuery_Web = eCook_Sinc_MontarQuery( $sNome_Tabela , $sCampo_Refer, $sValor_Refer, $sTp_Operacao );
      If ( ! EMPTY($sSQLQuery_Web) ) {
         $aSQLQuery_Web[] = $sSQLQuery_Web;
      }
    }
    eCook_Sinc_GArq_Posicao( '0,'.COUNT($aSQLQuery_Web) );
  }
  //
  //
  $aSQLQuery_Tmp = [];
  $nCnt_SQLQuerys_Web = 0;
  $nQtd_SQLQuerys_Web = COUNT($aSQLQuery_Web);
  $nCnt_Registros_Web = 0;
  $nQtd_Contag_Qry = 0;
  $nTamanho_Contag_Qry = 0;
  eCook_Sinc_GArq_Posicao( $nCnt_SQLQuerys_Web.','.$nQtd_SQLQuerys_Web );
  foreach ( $aSQLQuery_Web As $nIndice_SQLItem => $sSQLQuery_Item ) {
    $nCnt_SQLQuerys_Web++;
    $nQtd_Contag_Qry++;
    $nTamanho_Contag_Qry += STRLEN($sSQLQuery_Item);
    $aSQLQuery_Tmp[$nIndice_SQLItem] = $sSQLQuery_Item;
    //
    if (     $nTamanho_Contag_Qry >= $nTamanho_Limite_Qry
         OR  $nQtd_Contag_Qry     >= $nQtd_Limite_Qry
         OR  $nCnt_SQLQuerys_Web  == $nQtd_SQLQuerys_Web
       ) {
       If ( $nCnt_SQLQuerys_Web > 10 ) { eCook_Sinc_GArq_Posicao( ($nCnt_SQLQuerys_Web-10).','.$nQtd_SQLQuerys_Web ); }
       $nSinc_Tentativa = 0;
       While ( True ) {
          $aReposta = eCook_Sinc_ExeSQLWeb_Lote( $nCodigo_BData, $nCodigo_EmpSm, $aSQLQuery_Tmp , $bZLib_Compativel );
          $nSinc_Tentativa++;
          If ( ! EMPTY($aReposta['RetornosSQL']) ) {
             break;
          }
          If ( $nSinc_Tentativa > 2 ) {
             $a_Retorno_Mensagens[] = "Erro ao enviar o lote da exportação, sem comunicação com a internet.";
             Info_Evento( $a_Retorno_Mensagens[0] , 1 );
             Return $a_Retorno_Mensagens;
          }
       }
       foreach ( $aSQLQuery_Tmp As $vIndice => $sSQLQuery_Mt ) {
          $aResultado   = @$aRetornosSQL[$vIndice];
          If ( ! EMPTY($aResultado['Erro']) ) {
             $sErro_Mensagem =
              "Erro: ".$aResultado['Erro']." <br> ".
              "SQL: ".$sSQLQuery_Mt." <br> ".
              "";
             Info_Evento( $sErro_Mensagem , 1 );
          }
       }   
       eCook_Sinc_GArq_Posicao( $nCnt_SQLQuerys_Web.','.$nQtd_SQLQuerys_Web );
       $aSQLQuery_Tmp       = [];
       $nQtd_Contag_Qry     = 0;
       $nTamanho_Contag_Qry = 0;
    }
  }
  //
  Info_Evento( "Finalizou a exportação forçada : Quantidade de registros ".$nCnt_SQLQuerys_Web , 0 );
  //
  Return $a_Retorno_Mensagens;
  //
}






//
//
//
//
//
//
// -- Exportação de movimentos com referência da tabela "integrar_web" --
//
//
//
//
//
//
function eCook_Sinc_Exportacao() {
  Global $Dados_Empresa;
  $sTitulo_Mensagens   = 'eCook Local - eCook Web';
  $a_Retorno_Mensagens = [];                  // Retorno de mensagens de erro em matriz
  $nTamanho_Limite_Qry = 200*1000;            // Limite de tamanho do lote de querys (Tamanho em bytes). Valor equivalente á 200Kbytes
  $nQtd_Limite_Qry     = 350;                 // Limite de quantidade de querys no lote.
  //
  Info_Evento( "Iniciou a exportação" , 0 );
  eCook_Sinc_GArq_Posicao( 0 );
  // -- Capturar configurações locais
  $nCodigo_BData = SQLVarConfig('CODIGO_CAD_ACESSO_FILIAL'  )+0;
  $nCodigo_EmpSm = @$Dados_Empresa['EMP_CODIGO']+0;
  $sChave_Inte_L = SQLVarConfig('CHAVE_ECOOK_WEB_INTEGRACAO');
  $sVersao_BDt_L = SQLVarConfig('VERSAO_BASE_DADOS');
  // -- Verificar configurações locais
  If ( STRLEN( SQLVarConfig('URL_COMUNICACAO_RETAGUARDA') ) < 10 ) {
    $a_Retorno_Mensagens[] = "A URL de Comunicação do eCook - Retaguarda não foi configurada no banco local do cliente.";
  } ElseIf ( $nCodigo_BData < 1 ) {
    $a_Retorno_Mensagens[] = "Código da filial não configurado";
  } ElseIf ( EMPTY( $sChave_Inte_L ) ) {
    $a_Retorno_Mensagens[] = "Chave de integração web não configurada no banco de dados local do cliente.";
  }
  If ( ! EMPTY($a_Retorno_Mensagens) ) {
     Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $a_Retorno_Mensagens[0] );
     Return $a_Retorno_Mensagens;
  }
  // -- Capturar versão da base de dados na Web e verificar
  $sSQLQuery = "SELECT VAR_CONTEUDO FROM config WHERE VAR_NOME = 'VERSAO_BASE_DADOS'";
  $aRetorno = eCook_Sinc_ExeSQLWeb( $nCodigo_BData, $nCodigo_EmpSm, $sSQLQuery );
  If ( EMPTY($aRetorno['ResultSQL']) ) {
     $a_Retorno_Mensagens[] = "Houve falha na comunicação com o ECook na Web.";
     Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $a_Retorno_Mensagens[0] );
     Return $a_Retorno_Mensagens;
  }
  $sVersao_BDt_W = @$aRetorno['ResultSQL'][0]['VAR_CONTEUDO'];
  $bZLib_Compativel = (@$aRetorno['ZLIB_Compativel']+0) > 0;
  If ( $sVersao_BDt_L != $sVersao_BDt_W ) {
     $a_Retorno_Mensagens[] = "A versão do banco de dados local do cliente é divergente da versão do banco de dados na nuvem. Local: ".$sVersao_BDt_L." , Nuvem: ".$sVersao_BDt_W;
     Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $a_Retorno_Mensagens[0] );
     Return $a_Retorno_Mensagens;
  }
  // -- Capturar chave de integração e verificar
  $sSQLQuery = "SELECT VAR_CONTEUDO FROM config WHERE VAR_NOME = 'CHAVE_ECOOK_WEB_INTEGRACAO'";
  $aRetorno = eCook_Sinc_ExeSQLWeb( $nCodigo_BData, $nCodigo_EmpSm, $sSQLQuery );
  $sChave_Inte_W = @$aRetorno['ResultSQL'][0]['VAR_CONTEUDO'];
  If ( EMPTY( $sChave_Inte_W ) ) {
     $a_Retorno_Mensagens[] = "Chave de integração web não configurada no banco de dados na nuvem do cliente.";
  } ElseIf ( $sChave_Inte_L != $sChave_Inte_W ) {
     $a_Retorno_Mensagens[] = "A chave de integração do banco de dados local do cliente é divergente da chave de integração do banco na nuvem. Local: ".$sChave_Inte_L." , Nuvem: ".$sChave_Inte_W;
  }
  If ( ! EMPTY($a_Retorno_Mensagens) ) {
     Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $a_Retorno_Mensagens[0] );
     Return $a_Retorno_Mensagens;
  }
  //
  // -- Atualizar a data e hora da ultima integração
  SQLVarConfigG( "DATA_WEB_ULT_INTEGRACAO" , DATE('Y-m-d H:i:s') );
  //
  // -- Capturar as ultimas alterações na tabela 'integrar_web'
  //$sSQLQuery =
  // "SET GLOBAL max_allowed_packet=5000000;";
  //MYSQL_QUERY( $sSQLQuery );
  $sSQLQuery =
   "SELECT ".
      "GROUP_CONCAT(DISTINCT INT_CODIGOI) as CODIGOS, ".
      "COUNT(*) AS QTD_REGS,".
      "INT_TABELA, INT_OPERACAO, INT_CAMPOREF, INT_VLCAMPCHAVE ".
   "FROM integrar_web ".
   "WHERE ".
      "INT_STATUS = 0 ".
   "GROUP BY ".
      "INT_TABELA,".
      "INT_OPERACAO,".
      "INT_CAMPOREF,".
      "INT_VLCAMPCHAVE ".
   "ORDER BY INT_CODIGOI ASC ".
   ";";
  $aRegs_Integrar_Web = MYSQL_QUERY( $sSQLQuery );
  $nQtd_SQLQuerys_Web = MYSQL_NUM_ROWS($aRegs_Integrar_Web);
  $nQtd_Registros_Uni = 0;
  eCook_Sinc_GArq_Posicao( 1 );
  // -- Efetuar montagem das Querys a serem enviadas para o eCook na Web
  $aSQLQuery_Web = [];
  while ( $aReg_Integrar_Web = MYSQL_FETCH_ARRAY( $aRegs_Integrar_Web, MYSQL_ASSOC ) ) {
    $sNome_Tabela = $aReg_Integrar_Web['INT_TABELA'];       // Nome da tabela de alteração
    $sCampo_Refer = $aReg_Integrar_Web['INT_CAMPOREF'];     // Campo de referência
    $sValor_Refer = $aReg_Integrar_Web['INT_VLCAMPCHAVE'];  // Valor do campo de referência
    $sTp_Operacao = $aReg_Integrar_Web['INT_OPERACAO'];     // Operação: I = Inserir , A = Alterar , D = Remover
    $sTp_Operacao = STRTOUPPER($sTp_Operacao);
    $sListCodigos = $aReg_Integrar_Web['CODIGOS'];          // Códigos dos campos a alterar
    $nQuantidadeR = $aReg_Integrar_Web['QTD_REGS'];         // Quantidade de registros;
    //
    $sSQLQuery_Web = eCook_Sinc_MontarQuery( $sNome_Tabela , $sCampo_Refer, $sValor_Refer, $sTp_Operacao );
    //If ( ! EMPTY($sSQLQuery_Web) ) {
    $aSQLQuery_Web[] =
      [ "LISTA_CODIGOS" => $sListCodigos,
        "QTD"           => $nQuantidadeR,
        "TABELA"        => $sNome_Tabela,
        "SQLQUERY"      => $sSQLQuery_Web
      ];
    $nQtd_Registros_Uni += $nQuantidadeR;
    //}
    //
  }
  // -- Executar envio de todas as Querys para o eCook na Web
  $aSQLQuery_Tmp = [];
  $aListaCodigos = [];
  $nTamanho_Contag_Qry = 0;
  $nQtd_Contag_Qry     = 0;
  $nQtd_SQLQuerys_Web = COUNT($aSQLQuery_Web);
  $nCnt_SQLQuerys_Web = 0;
  $nCnt_Registros_Web = -1;
  foreach ( $aSQLQuery_Web As $nIndice_SQLItem => $aSQLQuery_Item ) {
    $nCnt_SQLQuerys_Web++;
    //
    $aListaCodigos[$nIndice_SQLItem] = $aSQLQuery_Item['LISTA_CODIGOS'];
    $aLista_Tabela[$nIndice_SQLItem] = $aSQLQuery_Item['TABELA'];
    $sSQLQuery    = $aSQLQuery_Item['SQLQUERY'];
    $aSQLQuery_Tmp[$nIndice_SQLItem] = $sSQLQuery;
    $nTamanho_Contag_Qry += STRLEN($sSQLQuery);
    $nQtd_Contag_Qry++;
    $nCnt_Registros_Web += $aSQLQuery_Item['QTD'];
    // -- Enviar lote de Query do SQL
    if (     $nTamanho_Contag_Qry >= $nTamanho_Limite_Qry
         OR  $nQtd_Contag_Qry     >= $nQtd_Limite_Qry
         OR  $nCnt_SQLQuerys_Web  == $nQtd_SQLQuerys_Web
       ) {
       $nSinc_Tentativa = 0;
       While ( True ) {
          $aReposta = eCook_Sinc_ExeSQLWeb_Lote( $nCodigo_BData, $nCodigo_EmpSm, $aSQLQuery_Tmp, $bZLib_Compativel );
          $nSinc_Tentativa++;
          If ( ! EMPTY($aReposta['RetornosSQL']) ) {
             break;
          }
          If ( $nSinc_Tentativa > 2 ) {
             $a_Retorno_Mensagens[] = "Erro ao enviar o lote da exportação, sem comunicação com a internet.";
             Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $a_Retorno_Mensagens[0] );
             Return $a_Retorno_Mensagens;
          }
       }
       $aRetornosSQL = @$aReposta['RetornosSQL'];
       If ( $nCnt_Registros_Web > 10 ) { eCook_Sinc_GArq_Posicao( $nCnt_Registros_Web-10 ); }
       // -- Verificar resultado de cada Query
       foreach ( $aSQLQuery_Tmp As $vIndice => $sSQLQuery_Mt ) {
          $sListCodigos = @$aListaCodigos[$vIndice];
          $sNome_Tabela = @$aLista_Tabela[$vIndice];
          $aL_Codigos = EXPLODE(",",$sListCodigos);
          $aResultado   = @$aRetornosSQL[$vIndice];
          //
          $sSQLQuery = '';
          If ( EMPTY($sSQLQuery_Mt) OR EMPTY($aResultado['Erro']) ) {
            If ( $sNome_Tabela != 'config' ) {
               $sSQLQuery = "UPDATE integrar_web SET INT_STATUS = 3 , INT_DATA = NOW() WHERE INT_CODIGOI IN (".$sListCodigos.")";
            }
            //
          } Else {
            $a_Retorno_Mensagens[] = "Houve erros nos registros das sequencias : ".$sListCodigos;
            $sErro_Mensagem =
              "Erro SQL - Códigos dos registros na tabela de integração: ".$sListCodigos." <br> ".
              "Erro: ".$aResultado['Erro']." <br> ".
              "SQL: ".$sSQLQuery_Mt." <br> ".
              "";
            Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagens, $sErro_Mensagem );
            $sSQLQuery = "UPDATE integrar_web SET INT_STATUS = 2 , INT_DATA = NOW() WHERE INT_CODIGOI IN (".$sListCodigos.")";
          }
          If ( ! EMPTY($sSQLQuery) ) {  MYSQL_QUERY($sSQLQuery);  }
          //
       }
       eCook_Sinc_GArq_Posicao( $nCnt_Registros_Web );
       $aSQLQuery_Tmp = [];
       $aListaCodigos = [];
       $nTamanho_Contag_Qry = 0;
       $nQtd_Contag_Qry     = 0;
    }
    //
  }
  //
  $sSQLQuery = "UPDATE integrar_web SET INT_STATUS = 3, INT_DATA = NOW() WHERE INT_TABELA='config' AND INT_STATUS < 2 ;";
  MYSQL_QUERY($sSQLQuery);
  //
  Info_Evento( "Finalizou a exportação" , 0 );
  //
  // -- Efetuar a limpeza de dados
  $sSQLQuery = "DELETE FROM integrar_web WHERE INT_STATUS = 3 AND INT_DATA_CADASTRO < '".DATE('Y-m-d',TIME() - (10*24*60*60) )."';";
  MYSQL_QUERY($sSQLQuery);
  //
  Return $a_Retorno_Mensagens;
}
//
// Função para montar a Query a ser enviada
function eCook_Sinc_MontarQuery( $sNome_Tabela , $sCampo_Refer, $sValor_Refer, $sTp_Operacao ) {
  $sSQLQuery_Web = '';
  //
  $bMontar_Script =
    (  ( $sNome_Tabela == "config" && (  $sValor_Refer == "DATA_WEB_ULT_INTEGRACAO"
                                      || $sValor_Refer == "DATA_DE_TRABALHO"  ||  $sValor_Refer == "DATA_ULT_BKP"
                                      || $sValor_Refer == "DESCRI_PROPRECO1"  ||  $sValor_Refer == "DESCRI_PROPRECO2"
                                      || $sValor_Refer == "DESCRI_PROPRECO3"  ||  $sValor_Refer == "DESCRI_PROPRECO4"
                                      || $sValor_Refer == "DESCRI_PROPRECOM"  ||  $sValor_Refer == "DESCRI_PROPRECON"
                                      || $sValor_Refer == "NEEMO_API_TOKEN"
                                      )
       )
    || ( $sNome_Tabela != "config" )
    );
  //
  If ( $bMontar_Script ) {
     $sSQLQuery_Parte1 = '';
     $sSQLQuery_Parte2 = '';
     $sSQLQuery_Parte3 = '';
     $bMont_SQL_Parte2 = True;
     $bMont_SQL_Parte3 = True;
     $bMont_UpdateDupl = False;
     // Capturar dados da tabela apontada
     $sSQLQuery_Capturar = "SELECT * FROM ".$sNome_Tabela." WHERE ".$sCampo_Refer." = '".$sValor_Refer."';";
     If ( $sNome_Tabela == "config" ) {
        $sSQLQuery_Capturar = "SELECT VAR_CONTEUDO FROM config WHERE VAR_NOME = '".$sValor_Refer."';";
     }
     // Montar 1º parte do Query do SQL - Operação na tabela
     switch ( $sTp_Operacao ) {
       case 'I':  // Operação de inclusão de registro
         $sSQLQuery_Parte1 = "INSERT IGNORE INTO ".$sNome_Tabela;
         $bMont_SQL_Parte3 = False;
         $bMont_UpdateDupl =
           (   $sNome_Tabela == 'fat_geral'  ||  $sNome_Tabela == 'fat_itens'
           );
         //
       break;
       case 'A':  // Operação de atualização do registro
         $sSQLQuery_Parte1 = "UPDATE "            .$sNome_Tabela;
         //
       break;
       case 'D':  // Operação de remocão do registro
         $sSQLQuery_Parte1 = "DELETE FROM "       .$sNome_Tabela;
         $bMont_SQL_Parte2 = False;
       break;
     }
     // Montar 2º parte do Query do SQL - Atribuição de valor dos campos
     If ( $bMont_SQL_Parte2 ) {
        $aDados_Capturar = MYSQL_QUERY( $sSQLQuery_Capturar );
        If ( (@MYSQL_NUM_ROWS($aDados_Capturar)+0) > 0 ) {
          $aDados_Capturar = MYSQL_FETCH_ARRAY( $aDados_Capturar, MYSQL_ASSOC );
          foreach ($aDados_Capturar As $sCampo => $sValorOrg) {
            $sValor = $sValorOrg;
            If ( (STRPOS( CHR(13), " ".$sValor )+STRPOS( CHR(0), " ".$sValor)) > 0 ) {
               $sValor = UTF8_ENCODE($sValor);
               $sValor = SQL_Bin($sValor);
            } Else {
               $sValor = STR_REPLACE("\\" , "\\\\" ,$sValor);
               $sValor = STR_REPLACE("'"  , "\\'"  ,$sValor);
               $sValor = "'".UTF8_ENCODE($sValor)."'";
            }
            $sSQLQuery_Parte2 .=
              ( EMPTY($sSQLQuery_Parte2) ? "SET " : ",").
              $sCampo.
              "=".
              $sValor;
          }
        } else {
          $bMontar_Script = false;
        }
     }
     // Montar 3º parte do Query do SQL - Referência de condição do registro
     If ( $bMont_SQL_Parte3 ) {
        $sSQLQuery_Parte3 = "WHERE ".$sCampo_Refer." = '".$sValor_Refer."' LIMIT 1";
     }
     //
     // União das parte do Query do SQL
     if ( $bMontar_Script ) {
        $sSQLQuery_Web = $sSQLQuery_Parte1." ".$sSQLQuery_Parte2." ".$sSQLQuery_Parte3;
        If ( $bMont_UpdateDupl ) {
          // Método para inserir registro ou atualizá-lo
          $sSQLQuery_Web =
            "INSERT INTO ".$sNome_Tabela." ".$sSQLQuery_Parte2.
            "ON DUPLICATE KEY UPDATE ".
            SUBSTR($sSQLQuery_Parte2,3);
        }
     }
     //
  }
  Return $sSQLQuery_Web;
}
//
function eCook_Sinc_GArq_Posicao( $nValor ) {
	$sCaminhoTemp = GETCWD().'/temporarios';
	If ( ! IS_DIR($sCaminhoTemp) ) {
     MKDIR( $sCaminhoTemp );
  }
  $hArquivo = FOPEN( $sCaminhoTemp."/exptotal.txt" ,"w" );
  FWRITE( $hArquivo, $nValor );
  FCLOSE( $hArquivo );
}
//
// --> Comunicação para executar lote querys no MySQL do eCook na Web <--
function eCook_Sinc_ExeSQLWeb_Lote( $nCodigo_BData, $nCodigo_EmpSm, $aSQLQuery, $b_ZLib = false ) {
  $sURL_ECookWeb = SQLVarConfig('URL_COMUNICACAO_RETAGUARDA').'callapp.php';
  //
  $aPostDados =
    [ "DBCod"  => $nCodigo_BData,
      "CodEmp" => $nCodigo_EmpSm,
      "Acao"   => "EXECUTAR_SQL_LOTE",
      "PmAcao" => 
        [ "CodApl"   => "25",
          "VerApl"   => Aplicativo_Versao,
          "SQLQUERY" => $aSQLQuery
        ]
    ];
  if ( $b_ZLib ) {
     $sPmAcao = $aPostDados['PmAcao'];
     $sPmAcao = BASE64_ENCODE( GZCOMPRESS( JSON_ENCODE($sPmAcao), 9 ) );
     $aPostDados['PmAcao_ZLIB'] = $sPmAcao;
     UNSET($aPostDados['PmAcao']);
  }
  $aResposta = Sinc_Comunica_Url( $sURL_ECookWeb, $aPostDados );
  $aRetorno  = NULL;
  If ( $aResposta[1] == 200 ) {
     $aRetorno = $aResposta[0];
     If ( ! EMPTY($aRetorno['ZLIB']) ) {
        $aRetorno = JSON_DECODE( gzuncompress( BASE64_DECODE($aRetorno['ZLIB']) ) , True );
     }
  }
  Return $aRetorno;
}
//
// --> Comunicação para executar uma query no MySQL do eCook na Web <--
function eCook_Sinc_ExeSQLWeb( $nCodigo_BData, $nCodigo_EmpSm, $sSQLQuery ) {
  $sURL_ECookWeb = SQLVarConfig('URL_COMUNICACAO_RETAGUARDA').'callapp.php';
  //
  $aPostDados =
    [ "DBCod"  => $nCodigo_BData,
      "CodEmp" => $nCodigo_EmpSm,
      "Acao"   => "EXECUTAR_SQL",
      "PmAcao" => 
        [ "CodApl"   => "25",
          "VerApl"   => Aplicativo_Versao,
          "SQLQUERY" => $sSQLQuery
        ]
    ];
  $aResposta = Sinc_Comunica_Url( $sURL_ECookWeb, $aPostDados );
  $aRetorno = $aResposta[0];
  Return $aRetorno;
}
//
// Funcão que faz comunicação via HTTP, posta dados e captura retorno
Function Sinc_Comunica_Url( $s_Endereco_URL="", $a_Dados_Post=ARRAY() ) {
  // Inicializa o objeto do componente
  $h_CURL = CURL_INIT();
  $b_Usar_Post = COUNT($a_Dados_Post);
  // Configura
  CURL_SETOPT($h_CURL, CURLOPT_URL           , $s_Endereco_URL );
  CURL_SETOPT($h_CURL, CURLOPT_TIMEOUT       , 60 ); 
  CURL_SETOPT($h_CURL, CURLOPT_POST          , $b_Usar_Post );
  CURL_SETOPT($h_CURL, CURLOPT_RETURNTRANSFER, True );
  CURL_SETOPT($h_CURL, CURLOPT_SSL_VERIFYPEER, False );
  //curl_setopt($ch, CURLOPT_BINARYTRANSFER    , True );
  //curl_setopt($ch, CURLOPT_HEADER            , True );
  If ( $b_Usar_Post ) {
     CURL_SETOPT($h_CURL, CURLOPT_POSTFIELDS     , JSON_ENCODE($a_Dados_Post) );
  }
  CURL_SETOPT($h_CURL, CURLOPT_HTTPHEADER    , array('Accept: charset=UTF-8'));
  CURL_SETOPT($h_CURL, CURLOPT_USERAGENT     , $_SERVER['HTTP_USER_AGENT']); 
  // Executa a consulta
  $sRet_Dados = CURL_EXEC($h_CURL);
  //
  $nRet_CodigoHttp = CURL_GETINFO($h_CURL, CURLINFO_HTTP_CODE    )+0;
  $nRet_TamanhoDwn = CURL_GETINFO($h_CURL, CURLINFO_SIZE_DOWNLOAD)+0;
  // Encerra o objeto
  CURL_CLOSE($h_CURL);
  //
  If ( $b_Usar_Post ) {
     $sRet_Dados = @JSON_DECODE( $sRet_Dados , True );
  }
  //
  Return ARRAY( $sRet_Dados, $nRet_CodigoHttp );
}
//
// Função para enviar notificação para o Simdesk
Function Sinc_Simdesk_REG_Notificar( $sTitulo_Mensagem, $sTexto ) {
  Global $Dados_Empresa;
  $nCodigo_EmpSm = @$Dados_Empresa['EMP_CODIGO']+0;
  Info_Evento( $sTexto , 1 );
  Reg_Ntf_Simdesk( $nCodigo_EmpSm, $sTexto, $sTitulo_Mensagem );
}
//
?>