unit DataModulo;

interface

uses
  Windows, system.UItypes, IB_Access,  Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Registry, IB_Components, IB_SessionProps,
  IB_Process, IB_Script, IB_Session, IBODataset, FireDAC.Stan.Intf,
  FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
  FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
  FireDAC.UI.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Phys,
  FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef, FireDAC.VCLUI.Wait, Data.DB,
  FireDAC.Comp.Client, FireDAC.Comp.DataSet;

type
  TDados = class(TDataModule)
    IB_Conexao: TIB_Connection;
    qrUsuario: TIB_Query;
    tbConfig: TIB_Query;
    dsrConfig: TIB_DataSource;
    dsrUsuario: TIB_DataSource;
    transacao: TIB_Transaction;
    qrRelatorioNoSistema: TIB_Query;
    script: TIB_Script;
    tbCompromisso: TIB_Query;
    dsrCompromisso: TIB_DataSource;
    tbBackup: TIB_Query;
    dsrBackup: TIB_DataSource;
    qrParamRelatorio: TIB_Query;
    qrVersao: TIB_Query;
    qrRegistro: TIB_Query;
    dsrRegistro: TIB_DataSource;
    ConexaoUserControl: TIBODatabase;
    qrTabelasExportacao: TIB_Query;
    qrImportaExpotaDados: TIB_Query;
    dsrImportaExpotaDados: TIB_DataSource;
    tbParametro_Pedido: TIB_Query;
    dsrParametro_Pedido: TIB_DataSource;
    tbParametro_Cliente: TIB_Query;
    dsrParametro_Cliente: TIB_DataSource;
    qrCep: TIB_Query;
    IB_Cep: TIB_Connection;
    qrRegimeTributacao: TIB_Query;
    dtRegimeTributacao: TIB_DataSource;
    qrFilial: TIB_Query;
    dsrFilial: TIB_DataSource;
    tbParametro_Fornecedor: TIB_Query;
    dtParametro_Fornecedor: TIB_DataSource;
    qrComissao_Produtos: TIB_Query;
    dtComissao_Produtos: TIB_DataSource;
    dtStatusCliente: TIB_DataSource;
    qryStatusCliente: TIB_Query;
    qryDadosBancarios: TIB_Query;
    dtDados_Bancarios: TIB_DataSource;
    qrUF: TIB_Query;
    dsrUF: TIB_DataSource;
    qryParametro_NF: TIB_Query;
    dtParametro_NF: TIB_DataSource;
    qryPesquisa: TIB_Query;
    qrDatasComemorativas: TIB_Query;
    qryParametroCobranca: TIB_Query;
    dtParametroCobranca: TIB_DataSource;
    qryEtiquetasEnvelopes: TIB_Query;
    dtEtiquetasEnvelopes: TIB_DataSource;
    qryMVA: TIB_Query;
    qryRelatoriosEmitidos: TIB_Query;
    qryConvenioCobranca: TIB_Query;
    dtConvenioCobranca: TIB_DataSource;
    qrScriptProcessado: TIB_Query;
    tbParametro_Manifesto: TIB_Query;
    dsrParametro_Manifesto: TIB_DataSource;
    qrConfigEmail: TIB_Query;
    dsrconfigEmail: TIB_DataSource;
    qryFrases: TIB_Query;
    dtFrases: TIB_DataSource;
    qrParametro_Produto: TIB_Query;
    dtParametro_Produto: TIB_DataSource;
    qrPesquisaCidade: TIB_Query;
    QueryMYSQL: TFDQuery;
    ConexaoMYSQL: TFDConnection;
    FDPhysMySQLDriverLink1: TFDPhysMySQLDriverLink;
    qrLicenca: TIB_Query;
    procedure DataModuleCreate(Sender: TObject);
    function VerificaVersao: Boolean;
    procedure PegaCNPJ_Codinterno_Da_Chave(var CNPJ,COD_INTERNO : string);
    procedure scriptAfterExecute(Sender: TObject);
    procedure BuscaCodigoIBGEPorCEP(var cep,cod_cidade_IBGE,cod_UF_IBGE:string);
    function BuscaCodigoIBGEPorCidade(cidade,uf:string):string;
    function ConectarMYSQL(HostName, DataBase, User_Name, Password : string ):Boolean;
    procedure Desconectar_Mysql;

  private
    { Private declarations }
  public
    { Public declarations }
    digitou_senha_manutencao : Boolean;
    Status_NF:String;

  end;

var
  Dados: TDados;

implementation

uses DefineBD, Rotinas, Senha, EmManutencao, AvisoControleSistema,
  ConfigacaoSistema, ufrmStatus, DataModuloRelatorio;

{$R *.dfm}

procedure TDados.DataModuleCreate(Sender: TObject);
var ArqIni : TextFile;
    CaminhoDados,
    CaminhoCep,
    Conexao,
    Protocolo,
    Servidor : string;
begin
   digitou_senha_manutencao  := False;

    //==================== Se o arquivo de configuracao nao existir chama a tela de configuracao dos dados  ============
   if not ExisteArquivo(CaminhoEXE+'Ini.conf') then
   begin
      FrDefineBD := TFrDefineBD.Create(Application);
      if FrDefineBD.ShowModal = mrOk then
      begin
         FrDefineBD.Destroy;
         Application.Terminate;
      end
      else
      begin
         MessageDlg('Não foi  possível  configurar o  acesso a  base  de dados  do  sistema.' + #13 +
                    'Execute o sistema  novamente e verifique se os dados  estão corretos.' + #13 +
                    'Se necessário, entre em contato com a equipe de desenvolvimento do' + #13 +
                    'Sistema.', mtError, [MbOk], 0);
         FrDefineBD.Destroy;
         Application.Terminate;
         Exit;
      end;
   end;

   if ExisteArquivo(CaminhoEXE+'Ini.conf') then
   begin
      AssignFile(ArqIni,CaminhoEXE+'Ini.conf');
      Reset(ArqIni);
      Readln(ArqIni,CaminhoDados);
      Readln(ArqIni,CaminhoCep);
      Readln(ArqIni,Conexao);
      Readln(ArqIni,Protocolo);
      Readln(ArqIni,Servidor);
      closefile(ArqIni);

      IB_Conexao.Connected := False;
      IB_Conexao.Path := CaminhoDados;

      if trim(servidor) = '' then
        IB_Conexao.Server := 'localhost'
      else
         IB_Conexao.Server := Servidor;


       //================= Configura o acesso a base de dados de cep ==============

      IB_Cep.Connected := False;
      IB_Cep.Path      := CaminhoCep;
      IB_Cep.Protocol  := IB_Conexao.Protocol;
      IB_Cep.Server    := IB_Conexao.Server;

   end;

   digitou_senha_manutencao := False;
   try
      IB_Conexao.Connected := True;
      tbConfig.Open;

      if tbConfig.FieldByName('EM_MANUTENCAO').AsString = 'T' then
      begin
         IB_Conexao.Connected  := False;
         frmManutencao := TfrmManutencao.Create(Application);
         frmManutencao.ShowModal;
         if frmManutencao.senha <> '22097475' then
         begin
            Application.Terminate;
         end
         else
         begin
            frmManutencao.Destroy;
            IB_Conexao.Connected := True;
            digitou_senha_manutencao := True;
         end;
      end;

      if FileExists(CaminhoEXE+'script execute.sql') then
      begin
         script.AfterExecute := nil;
         script.SQL.Clear;
         script.SQL.LoadFromFile(CaminhoEXE+'script execute.sql');
         DeleteFile(CaminhoEXE+'script execute.sql');
         try
            script.Execute;
            except
         end;
      end;

      script.AfterExecute := scriptAfterExecute;
      tbConfig.Open;
      qrRegistro.Open;
      qrUsuario.Open;
      qrVersao.Open;
      qrConfigEmail.Open;
      qrRelatorioNoSistema.Open;
      qrTabelasExportacao.Open;
      qrFilial.Open;
      tbParametro_Pedido.Open;
      qryParametro_NF.Open;
      qrParametro_Produto.Open;
      qryParametroCobranca.Open;
      qryEtiquetasEnvelopes.Open;
      qryMVA.Open;
      qryConvenioCobranca.Open;
      tbParametro_Manifesto.Open;
      qryFrases.Open;
      tbParametro_Cliente.Open;
      except

         FrDefineBD := TFrDefineBD.Create(Application);
         FrDefineBD.ShowModal;
         FrDefineBD.Destroy;

         Application.Terminate;
         Exit;

   end;


   PastaTemporaria:=CaminhoEXE+'TMP';
   if NOT (DirectoryExists(PastaTemporaria))then
      MkDir(PastaTemporaria);

   PastaTemporaria:=PastaTemporaria+'\'+NomeDaMaquina;
   if NOT (DirectoryExists(PastaTemporaria))then
      MkDir(PastaTemporaria);

   if not DirectoryExists(CaminhoEXE+'FOTOS') then
      MkDir(CaminhoEXE+'FOTOS');



   ConexaoUserControl.Path     := IB_Conexao.Path;
   ConexaoUserControl.Server   := IB_Conexao.Server;
   ConexaoUserControl.Protocol := IB_Conexao.Protocol;
   ConexaoUserControl.Username := IB_Conexao.Username;
   ConexaoUserControl.Password := IB_Conexao.Password;
   ConexaoUserControl.Connect;


end;

procedure TDados.PegaCNPJ_Codinterno_Da_Chave(var CNPJ, COD_INTERNO: string);
var
  ChavePrincipal, Linha, LinhaTemp, ChaveCodificada: string;
  Contador, i: Integer;
begin
   //=============== Decodifica a chave de registro e recupera o CNPj e Cod_interno ================
   Contador := 0;
   Linha := qrVersao.FieldByName('CHAVE').AsString;
   linha := Trim(linha) ;
   ChaveCodificada := Linha;

   //=============== Decodifica usando a chave fixa ================
   try
      linha := Crypt('D',linha ,ChaveCriptografia);
      except
        MessageDlg('A chave não é válida', mtWarning, [mbOK], 0);
        Exit;
   end;

   //=============== Encontra a chave variavel para Decodificar os dados ================
   for i := 1 to Length (linha) do
   begin
      if linha[i]<> '#' then
         ChavePrincipal := ChavePrincipal + linha[i]
      else
      begin
         Contador := i;
         Break;
      end
   end;

   try
      linha := Copy(linha,Contador+1,Length(linha));
      linha := Crypt('D',linha ,ChavePrincipal);
      except
        MessageDlg('A chave não é válida', mtWarning, [mbOK], 0);
        Exit;
   end;

   Contador := 0;
   LinhaTemp := '';

   for i := 1 to Length(linha) do
   begin
      if linha[i] <> ';' then
         LinhaTemp := LinhaTemp + linha[i];

      if linha[i]= ';' then
      begin
         case Contador of
            2 : COD_INTERNO := LinhaTemp;
            3 : CNPJ        := LinhaTemp;
         end;
         Inc(Contador);
         LinhaTemp := '';
      end;
   end;
end;

function TDados.VerificaVersao: Boolean;
var
SerialHD: string;
ValidadeSistema ,
    Acao,
    VersaoSistema,
    codigoInterno,
    Cnpj : string;
    DiasParaExpirar : Real  ;
begin
   Result       := False;

   //=============== Verifica o sistema.. esta liberado.. demo.. bloqueado.. ================
   qrVersao.Open;
   qrVersao.Last;
   qrRegistro.first;

   if (qrRegistro.FieldByName('cnpj').AsString = '') or (qrRegistro.FieldByName('CODIGO_INTERNO').AsString = '') then
   begin
      MessageDlg('Na tela de configuração informe o CNPJ / CPF da pessoa Juridica ou Física'+#13+#10+'Informe também o código de cadastro do cliente', mtWarning, [mbOK], 0);
      frmConfiguracao := TfrmConfiguracao.Create(Application);
      frmConfiguracao.ShowModal;
      frmConfiguracao.Destroy;
      Application.Terminate;
   end;

   ValidadeSistema := Crypt('D', qrVersao.FieldByName('VALIDADE_DO_SISTEMA').AsString , ChaveCriptografia );
   Acao            := Crypt('D', qrVersao.FieldByName('ACAO_DA_CHAVE').AsString       , ChaveCriptografia );
   VersaoSistema   := Crypt('D', qrVersao.FieldByName('VERSAO_DO_SISTEMA').AsString   , ChaveCriptografia );
   SerialHD        := Crypt('D', qrVersao.FieldByName('SERIAL_HD').AsString           , ChaveCriptografia );

   if UpperCase(VersaoSistema) = 'DEMO' then
   begin
      frmAvisoControleSistema := TfrmAvisoControleSistema.Create(Application);
      frmAvisoControleSistema.pagina.ActivePage := frmAvisoControleSistema.tabDemo;
      frmAvisoControleSistema.ShowModal;
      frmAvisoControleSistema.Destroy;
      Result := true;
      Exit;
   end;

   if SerialHD <> SerialNumServidor('C') then
   begin
      frmAvisoControleSistema := TfrmAvisoControleSistema.Create(Application);
      frmAvisoControleSistema.pagina.ActivePage := frmAvisoControleSistema.tabBloqueado;
      frmAvisoControleSistema.ShowModal;
      frmAvisoControleSistema.Destroy;
      Exit;
   end;

    //=============== Pega o Cnpj e o codigo interno da chave codificada ================
   PegaCNPJ_Codinterno_Da_Chave(Cnpj,codigoInterno);

   if (Cnpj <> Dados.qrRegistro.FieldByName('CNPJ').AsString) or (codigoInterno <> Dados.qrRegistro.FieldByName('CODIGO_INTERNO').AsString ) then
   begin
      frmAvisoControleSistema := TfrmAvisoControleSistema.Create(Application);
      frmAvisoControleSistema.pagina.ActivePage := frmAvisoControleSistema.tabBloqueado;
      frmAvisoControleSistema.ShowModal;
      frmAvisoControleSistema.Destroy;

      Exit;
   end;

   try
      strtodate(ValidadeSistema);
      except
         frmAvisoControleSistema := TfrmAvisoControleSistema.Create(Application);
         frmAvisoControleSistema.pagina.ActivePage := frmAvisoControleSistema.tabBloqueado;
         frmAvisoControleSistema.ShowModal;
         frmAvisoControleSistema.Destroy;

         Exit;
   end;

   if (Acao = '') or (VersaoSistema = '') then
   begin
      frmAvisoControleSistema := TfrmAvisoControleSistema.Create(Application);
      frmAvisoControleSistema.pagina.ActivePage := frmAvisoControleSistema.tabBloqueado;
      frmAvisoControleSistema.ShowModal;
      frmAvisoControleSistema.Destroy;

      Exit;
   end;

   if  strtodate(ValidadeSistema) < Date then
   begin
      frmAvisoControleSistema := TfrmAvisoControleSistema.Create(Application);
      frmAvisoControleSistema.pagina.ActivePage := frmAvisoControleSistema.tabBloqueado;
      frmAvisoControleSistema.ShowModal;
      frmAvisoControleSistema.Destroy;

      Exit;
   end;

   if UpperCase(Acao) = 'BLOQUEAR' then
   begin
      IB_Conexao.Disconnect;
      frmAvisoControleSistema := TfrmAvisoControleSistema.Create(Application);
      frmAvisoControleSistema.pagina.ActivePage := frmAvisoControleSistema.tabBloqueado;
      frmAvisoControleSistema.ShowModal;
      frmAvisoControleSistema.Destroy;

      Exit;
   end;

   DiasParaExpirar := abs(Date - strtodate(ValidadeSistema));

   if DiasParaExpirar <= 7 then
   begin
      frmAvisoControleSistema := TfrmAvisoControleSistema.Create(Application);
      frmAvisoControleSistema.pagina.ActivePage := frmAvisoControleSistema.TabVencendo;
      frmAvisoControleSistema.lblDias.Caption := 'Faltam '+ FloatToStr(DiasParaExpirar) +' dias para o sistema';
      frmAvisoControleSistema.ShowModal;
      frmAvisoControleSistema.Destroy;
      Result := True;
      Exit;
   end;

   Result := True;
end;


procedure TDados.scriptAfterExecute(Sender: TObject);
var
  TipoComando, NomeTabela: string;
  qrTEMP: TIB_Query;
begin
   {============================================
      Se o script executado for em uma tabela
      que estiver na lista de tabela a ser exportada
      grava o Script de exportacao
   ============================================}

   if script.ExecutingFailed = False then
   begin
      NomeTabela := NomeTabelaDoScriptSQl(script.SQL.Text, TipoComando);
      if not qrTabelasExportacao.Locate('NOME_TABELA' , NomeTabela , []) then
         Exit;

      qrTEMP := TIB_Query.Create(Application);
      qrTEMP.IB_Connection  := IB_Conexao;
      qrTEMP.IB_Transaction := transacao;

      qrTEMP.Close;
      qrTEMP.SQL.Clear;
      qrTEMP.SQL.Add('INSERT INTO SCRIPT_EXPORTACAO (SCRIPT, TABELA, DATA_GERACAO, HORA_GERACAO, TIPO_SCRIPT, PC_GERACAO,');
      qrTEMP.SQL.Add('                               FILIAL_GERACAO, USUARIO_GERACAO, JA_EXPORTADO)');
      qrTEMP.SQL.Add(' Values ( :SCRIPT, :TABELA, :DATA, :HORA, :TIPO_SCRIPT, :PC_GERACAO, :FILIAL_GERACAO, :USUARIO, :JA_EXPORTADO )');
      qrTEMP.ParamByName('SCRIPT').Value        :=  script.SQL.Text;
      qrTEMP.ParamByName('TABELA').Value        := nomeTabela ;
      qrTEMP.ParamByName('DATA').Value          := Date;
      qrTEMP.ParamByName('HORA').Value          := Time;
      qrTEMP.ParamByName('TIPO_SCRIPT').Value   := TipoComando;
      qrTEMP.ParamByName('PC_GERACAO').Value    := NomeDaMaquina;
      qrTEMP.ParamByName('USUARIO').Value       := Dados.qrUsuario.FieldByName('COD_USUARIO').Value;
      qrTEMP.ParamByName('JA_EXPORTADO').Value  := 'F';
      qrTEMP.Execute;
      qrTEMP.Close;

   end;
end;

procedure TDados.BuscaCodigoIBGEPorCEP(var cep,cod_cidade_IBGE,cod_UF_IBGE:string);
begin
   try
      Dados.qrCep.Close;
      Dados.qrCep.ParamByName('CEP').Value := QuotedSTR(LimpaTexto(CEP));
      Dados.qrCep.Open;
      if Dados.qrCep.IsEmpty then
         Exit;

      cod_cidade_IBGE   := Dados.qrCep.FieldByName('COD_CIDADE_IBGE').AsString;
      cod_UF_IBGE       := Dados.qrCep.FieldByName('cod_UF_IBGE').AsString;
   except
   end;
end;

function TDados.BuscaCodigoIBGEPorCidade(cidade,uf:string):string;
begin
   try
      Dados.qrCep.Close;
      Dados.qrCep.ParamByName('cep').Value   := '';
      Dados.qrCep.ParamByName('Rua').Value   := '';
      Dados.qrCep.ParamByName('Cidade').Value:= quotedStr(cidade);
      Dados.qrCep.ParamByName('UF').Value    := QuotedStr(uf);
      Dados.qrCep.Open;

      if Dados.qrCep.IsEmpty then
      begin
        Result:='';
        Exit;
      end
      else
          Result := Dados.qrCep.FieldByName('COD_CIDADE_IBGE').AsString;
   except
        Result:='';
   end;
end;

function TDados.ConectarMYSQL(HostName, DataBase, User_Name, Password : string ):Boolean;
begin
  if ((HostName = '') or (DataBase = '') or (User_Name = '') or (Password = '')) then
  begin
    Result:=False;
    MessageDlg('Não existem parâmetros para conexão com a base de dados MYSQL', mtError, [mbOK], 0);
    Exit;
  end;

  ConexaoMYSQL.Connected   := False;

  ConexaoMYSQL.Params.Clear;
  ConexaoMYSQL.Params.Add('DriverID=MySQL');
  ConexaoMYSQL.Params.Add('Server='   + HostName);
  ConexaoMYSQL.Params.Add('Database=' + DataBase );
  //ConexaoMYSQL.Params.Add('Port='     + User_Name);
  ConexaoMYSQL.Params.Add('User_Name='+ User_Name);
  ConexaoMYSQL.Params.Add('Password=' + Password);


  try
    ConexaoMYSQL.Connected := True;
    Result:=True;
  except
    Result:=False;
  end;

end;

procedure TDados.Desconectar_Mysql;
begin
  //=========== desconecta da base de dados mysql ====
  ConexaoMYSQL.Connected := false;
end;

end.
