unit unitLicencia;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, IniFiles, IdCoder, IdCoder3to4, IdCoderMIME,
  IdBaseComponent,ComObj, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZSequence, ZSqlMonitor,
  ZConnection,  ZSqlUpdate, base64, AES, ImgList, ComCtrls, ToolWin,
  FIBDatabase, pFIBDatabase, DateUtils, WinSock, Grids, SBSimpleSSL,
  SBHTTPSClient, SBUtils, SBX509, SBTypes, WinInet;

type
  TfrmLicencia = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Panel3: TPanel;
    btnEliminar: TButton;
    btnRegistrar: TButton;
    eNumLicencia: TEdit;
    eNombreCliente: TEdit;
    Label3: TLabel;
    Label2: TLabel;
    IBDatabase1: TpFIBDatabase;
    ToolBar1: TToolBar;
    btnGuardarySalir: TToolButton;
    ImageList1: TImageList;
    Panel5: TPanel;
    Label9: TLabel;
    GroupBox2: TGroupBox;
    Label4: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Panel4: TPanel;
    Label5: TLabel;
    ToolBar2: TToolBar;
    btnInfo: TToolButton;
    GroupBox3: TGroupBox;
    Panel6: TPanel;
    Label10: TLabel;
    sgResults: TStringGrid;
    Label11: TLabel;
    HTTPSClient: TElHTTPSClient;
    Label12: TLabel;
    procedure FormShow(Sender: TObject);
    procedure btnRegistrarClick(Sender: TObject);
    procedure btnEliminarClick(Sender: TObject);
    procedure btnGuardarySalirClick(Sender: TObject);
    procedure btnInfoClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure HTTPSClientCertificateValidate(Sender: TObject;
      X509Certificate: TElX509Certificate; var Validity: TSBCertificateValidity;
      var Reason: TSBCertificateValidityReason);
    procedure HTTPSClientData(Sender: TObject; Buffer: Pointer; Size: Integer);
  private
    { Private declarations }
  public
    { Public declarations }


    //Varibles Mysql
    gRespuesta:String;
    gVerifActualizacion:Integer;
    gLicenciaVigente,gTieneInternet,gActualizarFecha:String;
    gClaveEquipo,gFechaIniLic,gFechaFinalLic,gNumLic,
    gRazonSocial,gFechaVerif1per,gFechaVerif2per,gEstatusLic:String;
    gMemoria,gEsConcurrente:String;
    gVariableEjecucion:String;
    gAgrupadorID:Integer;
    gMuestraMensaje:String;


    gErrorAsociacion:String;
    gClaClienteMSP:String;
    FConnection: TZConnection;
    FDataset: TZQuery;
    FUpdateSQL: TZUpdateSQL;
    CONST  CLAVE = 'MICROSIP4856';
    
    //Propiedades para conexion a amazon
    property Connection: TZConnection read FConnection write FConnection;
    property Dataset: TZQuery read FDataset write FDataset;
    property UpdateSQL: TZUpdateSQL read FUpdateSQL write FUpdateSQL;

    procedure ValidaArchivoIni();
    function LeerLicencia(Evento:String; Opcion:Integer;var Respuesta, ResActualiza:String):Boolean;
    Function CompHD (Unidad : string) : string;
    Function GetMotherBoardSerial():string;
    procedure ConectarBDAWS();
    procedure GrabaIni(Cadena:string);
    function cifrarTexto(Str : String) : String;
    function descifrarTexto (Str : String): String;
    function RemplazaCad(StrSrc, StrDest, Str : string) : string;
    procedure LimpiaLabel();
    procedure VerificaRegistro();
    procedure EliminarLicencia();
    procedure RegistraLicencia();
    function ActualizarLicencia(Evento, Cliente,ClaveLic:String; var ResActualiza:String):Boolean;
   {function ValidacionesGenerales(ClaveLic,Cliente:String; var ID, DiasRestantes, NumUsuarios:Integer;
                                            var FechaInicial, FechaFinal,FechaVerif1, FechaVerif2,EstatusLic,
                                            Host, Base_datos, Usuario_db, Password_db, Error:String):Boolean;}
    function ValidacionesGenerales(Evento,ClaveLic,Cliente:String; var ID, DiasRestantes, NumUsuarios:Integer;
                                            var FechaInicial, FechaFinal,FechaVerif1, FechaVerif2,EstatusLic,
                                            ClaveClieMSP, Memoria, EsConcurrente, Error:String):Boolean;
    function ActualizacionAutomatica():Boolean;
    procedure ActualizaFechaAcceso();
    function ValidaEjecucion():Boolean;
    function EliminaEjecucion():Boolean;
    function GrabaLicenciaBD(Cliente,Licencia:String; var lError:String):Boolean;
    function CreaTableLicencia(var lError:String):Boolean;

    function ConexionAmazonGrid():Boolean;
    procedure ConsultaTabla(Factura,Agrupador, IDLicencia:String);
    function BuscaProducto(Clave:String; var Producto:String):Boolean;
    function RegistraEvento(Cuerpo:String):String;
    procedure VerificaRegistroConfig();
    function UsuarioWindows():String;
  end;

var
  frmLicencia: TfrmLicencia;

implementation
uses Unit1, ActiveX, ZClasses, ZDbcIntfs, ZCompatibility,ZDbcMySql, ZDbcInterbase6, ZDbcPostgreSql, ZDbcDBLib,
UnitValidaConcurrencia;

var
  ConnectionGrid: IZConnection;
  ResultSet: IZResultSet;

{$R *.dfm}

function TfrmLicencia.UsuarioWindows():String;
begin
    Result := GetEnvironmentVariable('USERNAME')
end;

procedure TfrmLicencia.VerificaRegistro();
var PathIni, ResLicencia, ResActualiza:String;
    Sem: THandle;
begin
try
  begin
  ResLicencia := '';
  ResActualiza := '';
  gErrorAsociacion := 'N';
  
  PathIni := ExtractFileDir(Application.ExeName)+'\Licencia.ini';
  If not fileExists(PathIni) then
  Begin
    MessageDlg('El equipo no se encuentra registrado, registre el equipo para continuar.', mtInformation,[mbOk], 0);
    ShowModal;
    MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
    EliminaEjecucion();
    Application.Terminate;
  End else
  begin
    ActualizacionAutomatica();
     //
    gVerifActualizacion := 0;
    if frmLicencia.LeerLicencia('A',2,ResLicencia,ResActualiza) then
    begin
       if gActualizarFecha = 'S' then
          ActualizaFechaAcceso();


       if ResLicencia <> '' then
         MessageDlg(ResLicencia, mtInformation,[mbOk], 0);

       if ResActualiza = 'N' then
       begin
          MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
          Application.Terminate;
       end;

    end
    else
    begin
      if gActualizarFecha = 'S' then
          ActualizaFechaAcceso();

      if (ResLicencia <> '') and (gTieneInternet <> 'S') then
        MessageDlg(ResLicencia, mtInformation,[mbOk], 0);

      gVerifActualizacion := 1;

      if gTieneInternet = 'S' then
        frmLicencia.ShowModal;

      MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
      EliminaEjecucion();
      Application.Terminate;
    end;
  end;
  //Verifica si tiene concurrencias activadas
  if frmLicencia.gEsConcurrente = 'S' then
  begin
    frmLicencia.gVariableEjecucion := frmLicencia.UsuarioWindows;
    frmLicencia.ValidaEjecucion();
    Form1.tTimerLicencia.Interval := 1800000;
    Form1.tTimerLicencia.Enabled := True;
    
  end else
  begin
    Form1.tTimerLicencia.Enabled := False;
    Sem := CreateSemaphore(nil, 0, 1, Form1.NOMBRE_PRODUCTO);
    if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
    begin
      CloseHandle(Sem);
      ShowMessage(Form1.NOMBRE_PRODUCTO+' actualmente ya se esta ejecutando.');
      Halt;
    end;
  end;

  end;
except
  begin
     MessageDlg('Ocurrió un error al validar su licencia.', mtInformation,[mbOk], 0); 
     MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
     Application.Terminate;
  end;
end;
end;

function TfrmLicencia.EliminaEjecucion():Boolean;
begin
try
  begin
     //if gTipoAcceso = 2 then
     //begin
       Result := false;

       try
         begin
            ConectarBDAWS();
         end;
       except
         begin

         end;
       end;

       dataset.SQL.Clear;
       dataset.SQL.Add('DELETE FROM Concurrencias '+
                       'WHERE Numero_licencia = "'+gNumLic+'" '+
                       'AND Maquina_ID = "'+gClaveEquipo+'"  '+
                       'AND Clave_Ejecucion = "'+gVariableEjecucion+'"  ');
       Dataset.ExecSQL;
       Result := True;
       Connection.Commit;
       Connection.Disconnect;
     //end;
  end;
except
  begin
    MessageDlg('Ocurrió un error al terminar su sesión.'+ Chr(13) +
               'Se requiere conexión a internet para ejecutar la aplicación. La sesión será liberada en una hora. ' + Chr(13) +
               'Si el problema persiste póngase en contacto con su distribuidor.', mtInformation,[mbOk], 0);
    Result := false;
  end;
end;

end;

function TfrmLicencia.ValidaEjecucion():Boolean;
var NumUsuarios, ConteoEje, Concurrencia_ID:Integer;
tFechaServidor:String;
HoraActual:TDateTime;
begin
////gClaveEquipo gNumLic
try
  begin
    Result := false;
    //gTipoAcceso := TipoAcceso;
    ConectarBDAWS();
    Concurrencia_ID := 0;

    dataset.SQL.Clear;
    dataset.SQL.Add('SELECT SYSDATE() AS FECHA_SERVIDOR  ');
    Dataset.Open;

    tFechaServidor := formatdatetime('Y-m-d hh:mm:ss', Dataset.FieldByName('FECHA_SERVIDOR').AsDateTime);
    dataset.SQL.Clear;
    dataset.SQL.Add('SELECT Concurrencia_ID FROM Concurrencias '+
                       'WHERE Numero_licencia = "'+gNumLic+'" '+
                       'AND Maquina_ID = "'+gClaveEquipo+'"  '+
                       'AND Clave_Ejecucion = "'+gVariableEjecucion+'"  ');
     Dataset.Open;
     Concurrencia_ID := Dataset.FieldByName('Concurrencia_ID').AsInteger;

     if Concurrencia_ID > 0 then
     begin
         dataset.SQL.Clear;
         dataset.SQL.Add('UPDATE Concurrencias '+
                       'SET Fecha_Hora = "'+tFechaServidor+'" '+
                       'WHERE Concurrencia_ID = "'+IntToStr(Concurrencia_ID)+'" ');
         Dataset.ExecSQL;
         Result := True;
         Connection.Commit;
     end
     else
     begin
       //registra concurrencia
       dataset.SQL.Clear;
        dataset.SQL.Add('SELECT Usuarios FROM Licencias WHERE Numero_licencia = "'+gNumLic+'" ');
        Dataset.Open;
        NumUsuarios := 0;
        NumUsuarios := Dataset.FieldByName('Usuarios').AsInteger;

        dataset.SQL.Clear;
        dataset.SQL.Add('SELECT Count(*) AS Conteo FROM DB_Exsim_Servicios.Concurrencias WHERE Numero_licencia = "'+gNumLic+'" ');
        Dataset.Open;
        ConteoEje := Dataset.FieldByName('Conteo').AsInteger;

        if NumUsuarios > ConteoEje then
        begin
          dataset.SQL.Clear;
          dataset.SQL.Add('INSERT INTO Concurrencias(Numero_licencia,Maquina_ID,Clave_Ejecucion, Fecha_Hora) '+
                          'VALUES ("'+gNumLic+'","'+gClaveEquipo+'","'+gVariableEjecucion+'","'+tFechaServidor+'")' );
          Dataset.ExecSQL;
          Result := True;
          Connection.Commit;
        end
        else
        begin
          {
          MessageDlg('Se han alcanzado el número máximo de ejecuciones permitidas para esta aplicación.' + Chr(13) +
                  'Cierre alguna otra sesión y vuelva a intentarlo.', mtInformation,[mbOk], 0);
          Application.Terminate;
          }
          fmValidaConcurrencia.Showmodal;
          Result := true;
        end;
     end;


    if Result = false then
    begin
      MessageDlg('No se pudo validar la licencia. Cierre todas las instancias e intente nuevamente. '+
                  'Si el problema persiste ponganse en contacto con su distribuidor.', mtInformation,[mbOk], 0);
      Application.Terminate;
    end;
    Connection.Disconnect;

    Form1.tTimerLicencia.Interval := 10000;
    Form1.tTimerLicencia.Enabled := True;

  end;
except
  begin
      if MessageDlg('Se requiere conexión a internet para ejecutar la aplicación. ' + Chr(13) +
                    'Si el problema persiste póngase en contacto con su distribuidor. ' + Chr(13) +
                    'Presione “Yes” para intentar validar nuevamente o “No” para cerrar la aplicación. ',
                    mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
      begin
         Form1.tTimerLicencia.Enabled := False;
         ValidaEjecucion();
      end else
      begin
        Application.Terminate;
      end;

    Result := false;
  end;
end;

end;

procedure TfrmLicencia.ActualizaFechaAcceso();
var MaquinaID,tFechaServidor:String;
begin

try
  begin

       try
         begin
            tFechaServidor := DateToStr(form1.IBDatabase1.GetServerTime);
         end;
       except
         begin
            tFechaServidor := DateToStr(Now);
         end;
       end;

       //MaquinaID := cifrarTexto(gClaveEquipo+'|'+gFechaIniLic+'|'+gFechaFinalLic+'|'+Trim(gNumLic)+'|'+Trim(gRazonSocial)+'|'+gFechaVerif1per+'|'+gFechaVerif2per+'|'+tFechaServidor+'|'+gEstatusLic);
       MaquinaID :='';
       if (gClaClienteMSP <> '') then
       begin
           MaquinaID := cifrarTexto(Trim(gClaveEquipo)+'|'+gFechaIniLic+'|'+gFechaFinalLic+'|'+Trim(gNumLic)+'|'+Trim(gRazonSocial)+
                                   '|'+gFechaVerif1per+'|'+gFechaVerif2per+'|'+tFechaServidor+'|'+gEstatusLic+'|'+gMemoria+'|'+gEsConcurrente+
                                   '|'+gClaClienteMSP);
       end else
       begin
           MaquinaID := cifrarTexto(Trim(gClaveEquipo)+'|'+gFechaIniLic+'|'+gFechaFinalLic+'|'+Trim(gNumLic)+'|'+Trim(gRazonSocial)+
                                   '|'+gFechaVerif1per+'|'+gFechaVerif2per+'|'+tFechaServidor+'|'+gEstatusLic+'|'+gMemoria+'|'+gEsConcurrente);
       end;
       
       MaquinaID := RemplazaCad('', #$D#$A, MaquinaID);
       MaquinaID := RemplazaCad('', #$D#$A#0, MaquinaID);
       MaquinaID := RemplazaCad('', #$D, MaquinaID);
       MaquinaID := RemplazaCad('', #$A, MaquinaID);
       MaquinaID := RemplazaCad('', #0, MaquinaID);
       MaquinaID := RemplazaCad('', #$D, MaquinaID);
       MaquinaID := RemplazaCad('', #$A, MaquinaID);
       GrabaIni(MaquinaID);
  end;
except
  begin

  end;
end;


end;
 
Function TfrmLicencia.CompHD (Unidad : string) : string;
Var
  VolumeNameBuffer : array [0..MAX_PATH] of Char;
  VolumeSerialNumber : DWord;
  MaximumComponentLength : DWord;
  FileSystemFlags : DWord;
Begin
try
  begin
    GetVolumeInformation( pchar(Unidad),VolumeNameBuffer,
    DWORD(sizeof(VolumeNameBuffer)),@VolumeSerialNumber,
    MaximumComponentLength,FileSystemFlags,nil,0);
    result := IntToHEX(VolumeSerialNumber,8);
  end;
except
  begin
     result := '';
  end;
end;

End;

Function TfrmLicencia.GetMotherBoardSerial():string;
var
  Server: string;
  Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
  AName: array[0..255] of Char;
  ASize: DWORD;


  sWbemLocator  : OLEVariant;
  sWMIService   : OLEVariant;
  sWbemObjectSet: OLEVariant;
  sWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  control1, control2,control3,Dato:STring;
  Cadena:String;
begin
try
  begin
  Cadena := '';
  if (ParamCount = 0) then
  begin
    Server := '';
    ASize  := SizeOf(AName) - 1;
    if GetComputerName(@AName, ASize) then
       Server := AName;
  end
  else
  begin
    Server := ParamStr(1);
  end;


  Result:='';

  sWbemLocator  := CreateOleObject ('WbemScripting.SWbemLocator');
  sWMIService   := sWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  sWbemObjectSet:= sWMIService.ExecQuery('SELECT * FROM Win32_Processor','WQL');
  oEnum         := IUnknown(sWbemObjectSet._NewEnum) as IEnumVariant;
  if oEnum.Next(1, sWbemObject, iValue) = 0 then
    control1:=sWbemObject.Properties_.Item('ProcessorId').Value;  //ProcessorId
  control1:= Trim(control1);


  sWbemLocator  := CreateOleObject ('WbemScripting.SWbemLocator');
  sWMIService   := sWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  sWbemObjectSet:= sWMIService.ExecQuery('SELECT * FROM Win32_BIOS','WQL');
  oEnum         := IUnknown(sWbemObjectSet._NewEnum) as IEnumVariant;
  if oEnum.Next(1, sWbemObject, iValue) = 0 then
    control2:=sWbemObject.Properties_.Item('SerialNumber').Value;  //SerialNumber
   control2:= Trim(control2);


  sWbemLocator  := CreateOleObject ('WbemScripting.SWbemLocator');
  sWMIService   := sWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  sWbemObjectSet:= sWMIService.ExecQuery('SELECT * FROM Win32_BaseBoard','WQL');
  oEnum         := IUnknown(sWbemObjectSet._NewEnum) as IEnumVariant;
  if oEnum.Next(1, sWbemObject, iValue) = 0 then
    control3:=sWbemObject.Properties_.Item('SerialNumber').Value;  //SerialNumber
  control3:= Trim(control3);

   Result := TRIM(control1)+TRIM( control2)+TRIM( control3);//CifrarTexto(Dato,CLAVE);
  end;
except
  begin
     Cadena := '';
  end;
end;



end;

procedure TfrmLicencia.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if frmLicencia.gLicenciaVigente = 'N' then
  begin
    MessageDlg('El equipo no se encuentra registrado, registre el equipo para continuar.', mtInformation,[mbOk], 0);
    MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
    Application.Terminate;
  end;

  if frmLicencia.gActualizarFecha = 'N' then
  begin
    MessageDlg('Se detecto un error en la fecha del servidor.', mtInformation,[mbOk], 0);
    MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
    Application.Terminate;
  end;

  if frmLicencia.gEstatusLic = 'S' then
	begin
     MessageDlg('La licencia está suspendida, pónganse en contacto con su distribuidor.', mtInformation,[mbOk], 0);
     MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
     Application.Terminate;
  end;

  if frmLicencia.gEstatusLic = 'B' then
  begin
      MessageDlg('La licencia está dada de baja, pónganse en contacto con su distribuidor.', mtInformation,[mbOk], 0);
      MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
      Application.Terminate;
  end;
end;

procedure TfrmLicencia.FormShow(Sender: TObject);
var ResActualiza, ResLic:String;
begin
  ResActualiza := '';
  ValidaArchivoIni();
      try
         begin
             if ConexionAmazonGrid() then
                 ConsultaTabla('000', '1', '');
         end;
       except
         begin

         end;
       end;
  LeerLicencia('A',1,ResLic, ResActualiza);
end;

procedure TfrmLicencia.LimpiaLabel();
begin
  Label4.Caption := '';
  Label6.Caption := '';
  Label7.Caption := '';
  Label8.Caption := '';
  Label12.Caption := '';
end;

procedure TfrmLicencia.ValidaArchivoIni();
var PathIni:String;
begin
  //Memo1.Clear;
  LimpiaLabel();
  PathIni := ExtractFileDir(Application.ExeName)+'\Licencia.ini';
  If fileExists(PathIni) then
  Begin
    btnRegistrar.Enabled := False;
    btnInfo.Enabled := True;
  End else
  begin
    btnRegistrar.Enabled := True;
    btnInfo.Enabled := False;
  end;
end;

function TfrmLicencia.ActualizacionAutomatica():Boolean;
var PathIni, Temp, ClaveEquipo, ClaveArt:String;
ArchivoIni:TIniFile;
slLinea : TStringList;
tFechaInicio, tFechaFin, ResActualiza:String;
FechaActual,FechaInicio,FechaFin,perFechaInicio,perFechaFin:TDateTime;
ContinuaActulizacion:Integer;
FechaUltimoAcceso:TDateTime;
begin
try
  begin
   Result := False;
   PathIni := ExtractFileDir(Application.ExeName)+'\Licencia.ini';//'C:\inetpub\wwwroot\MspWsConsolidador\Conexion.ini';
   If fileExists(PathIni) then
   Begin

         try
           begin
            ArchivoIni := TIniFile.Create(PathIni);
            Temp := ArchivoIni.ReadString('LICENCIA','CLAVE','');
            ArchivoIni.Free;

            slLinea := TStringList.Create;
            slLinea.StrictDelimiter:= True;
            slLinea.Delimiter:='|';
            slLinea.DelimitedText:=descifrarTexto(Temp);

            ClaveEquipo:= CompHD('C:/')+GetMotherBoardSerial();

            if (Trim(slLinea[0]) <> Trim(ClaveEquipo)) then
                  Raise Exception.Create('La licencia utilizada no pertenece al quipo, verifique su información.');

            ClaveArt:=copy(slLinea[3],11,2);
            if ClaveArt <> form1.CLAVE_PRODUCTO then
                 Raise Exception.Create('La licencia ingresada no pertenece a este sistema.');


            FechaInicio := StrToDate(slLinea[1]);
            FechaFin := StrToDate(slLinea[2]);

            perFechaInicio := StrToDate(slLinea[5]);
            perFechaFin := StrToDate(slLinea[6]);

            FechaUltimoAcceso := StrToDate(slLinea[7]);

            tFechaInicio := slLinea[1];
            tFechaFin := slLinea[2];
           end;
         except
           begin
             Raise Exception.Create('Ocurrió un error al leer la licencia local.'); 
           end;
         end;



            //FechaActual := form1.IBDatabase1.GetServerTime;
            try
              begin
                 FechaActual := form1.IBDatabase1.GetServerTime;
              end;
            except
              begin
                 FechaActual := Now();
              end;
            end;

            if FechaActual < FechaUltimoAcceso  then
            begin
               gActualizarFecha := 'N';
               Raise Exception.Create('Se detecto un error en la fecha del servidor.');
            end;



            {
            Cliente := slLinea[4];
            Licencia := slLinea[3];
            }
            ContinuaActulizacion:=0;
            try
              begin
                 ConectarBDAWS();
                 Connection.Disconnect;
                 ContinuaActulizacion := 1;
               end;
            Except
               begin
                 gTieneInternet := 'N';
                 ContinuaActulizacion:=0;
               end;
            end;


            if ContinuaActulizacion = 1 then
            begin
               ResActualiza := '';
               ActualizarLicencia('A',slLinea[4],slLinea[3],ResActualiza);
               if ResActualiza = 'S' then
                  Result := True;
            end;
                

   End;
  end;
except
  begin
       Result := False;
  end;
end;

end;

function TfrmLicencia.LeerLicencia(Evento:String;Opcion:Integer;var Respuesta, ResActualiza:String):Boolean;
Var ArchivoIni : TIniFile;
PathIni, Temp:String;
slLinea : TStringList;
FechaActual, FechaInicio,FechaFin:TDateTime;
tFechaInicio,tFechaFin:String;
perFechaInicio,perFechaFin:TDateTime;
ClaveEquipo:String;
ContinuaActulizacion,DiasRestantes:Integer;
ClaveArt:String;
Cliente, Licencia,EstatusLic:String;
IniPer, ConteoAgrpador, LicID:Integer;
FechaUltimoAcceso:TDateTime;
rcadena, ErrorBD, FolioMSP:String;
begin
   try
     begin
        gActualizarFecha := 'S';
        gLicenciaVigente := 'N';
        gTieneInternet := 'S';
        ContinuaActulizacion := 0;
        sysutils.ShortDateFormat := 'dd/mm/yyyy';
        ClaveEquipo:= '';
        ClaveArt := '';
        Cliente:='';
        Licencia:='';
        LimpiaLabel();
        Result := False;
        DiasRestantes := 0;
        IniPer := 0;
        rcadena := '';

        try
         begin
           ConectarBDAWS();
           Connection.Disconnect;
           ContinuaActulizacion := 1;
         end;
        Except
         begin
           gTieneInternet := 'N';
         end;
        end;

        PathIni := ExtractFileDir(Application.ExeName)+'\Licencia.ini';//'C:\inetpub\wwwroot\MspWsConsolidador\Conexion.ini';
        If fileExists(PathIni) then
        Begin

            ArchivoIni := TIniFile.Create(PathIni);
            Temp := ArchivoIni.ReadString('LICENCIA','CLAVE','');
            ArchivoIni.Free;

            slLinea := TStringList.Create;
            slLinea.StrictDelimiter:= True;
            slLinea.Delimiter:='|';
            slLinea.DelimitedText:=descifrarTexto(Temp);

            rcadena := descifrarTexto(Temp);

            ClaveEquipo:= CompHD('C:/')+GetMotherBoardSerial();

            try
              begin
                if (Trim(slLinea[0]) <> Trim(ClaveEquipo)) then
                    Raise Exception.Create('La licencia utilizada no pertenece al quipo, verifique su información.');

                ClaveArt:=copy(slLinea[3],11,2);
                if ClaveArt <> form1.CLAVE_PRODUCTO then
                   Raise Exception.Create('La licencia ingresada no pertenece a este sistema.');


                FechaInicio := StrToDate(slLinea[1]);
                FechaFin := StrToDate(slLinea[2]);

                perFechaInicio := StrToDate(slLinea[5]);
                perFechaFin := StrToDate(slLinea[6]);


                tFechaInicio := slLinea[1];
                tFechaFin := slLinea[2];

                FechaUltimoAcceso := StrToDate(slLinea[7]);

                LimpiaLabel();
                Label4.Caption := 'Razón social: '+slLinea[4];
                Label6.Caption := 'Licencia: '+slLinea[3];

                Cliente := slLinea[4];
                Licencia := slLinea[3];
                EstatusLic := slLinea[8];

                form1.lbInfoLicencia.Caption := slLinea[4]+' ';
                form1.lbPropietario.Caption := 'Propietario ';

              end;
            except
              begin
                 gActualizarFecha := 'N';
                 Raise Exception.Create('Ocurrió un error al leer la licencia local.');
              end;
            end;



            //FechaActual := form1.IBDatabase1.GetServerTime;
            try
              begin
                 FechaActual := form1.IBDatabase1.GetServerTime;
              end;
            except
              begin
                 FechaActual := Now();
              end;
            end;


            Label8.Caption := 'La licencia se ha validado correctamente vía internet el '+slLinea[5];

            Label12.Caption := 'Licencia válida del '+slLinea[1]+' al '+slLinea[6]+' .';

            gClaveEquipo := '';
            gFechaIniLic := '';
            gFechaFinalLic := '';
            gNumLic := '';
            gRazonSocial := '';
            gFechaVerif1per := '';
            gFechaVerif2per := '';
            gEstatusLic := '';
            
            gClaveEquipo := slLinea[0];
            gFechaIniLic := slLinea[1];
            gFechaFinalLic := slLinea[2];
            gNumLic := slLinea[3];
            gRazonSocial := slLinea[4];
            gFechaVerif1per := slLinea[5];
            gFechaVerif2per := slLinea[6];
            gEstatusLic := slLinea[8];
            gMemoria := slLinea[9];
            gEsConcurrente := slLinea[10];

            gClaClienteMSP := '';


            try
             begin
               gClaClienteMSP := slLinea[11];
              end;
            except
              begin
               gClaClienteMSP := '';
              end;
            end;


            if FechaActual < FechaUltimoAcceso  then
            begin
               gActualizarFecha := 'N';
               IniPer := 1;
               Raise Exception.Create('Se detecto un error en la fecha del servidor.');
            end;

            if EstatusLic = 'S' then
			      begin
              gActualizarFecha := 'N';
              IniPer := 1;
              Raise Exception.Create('La licencia está suspendida, pónganse en contacto con su distribuidor.');
     			  end;

     			 if EstatusLic = 'B' then
		       begin
              gActualizarFecha := 'N';
              IniPer := 1;
              Raise Exception.Create('La licencia está dada de baja, pónganse en contacto con su distribuidor.');
		       end;

            if FechaActual < FechaInicio  then
            begin
               IniPer := 1;
               Raise Exception.Create('La vigencia de la licencia comienza el día '+slLinea[1]+'.');
            end;


            if FechaActual <= perFechaFin  then
            begin
                DiasRestantes := DaysBetween(perFechaFin,FechaActual);
                if DiasRestantes = 0 then
                begin
                   if Opcion = 2 then
                   begin
                         Respuesta := 'Su licencia expira el día de hoy.'+ Chr(13)
                               +'Valídela desde la opción Herramientas -> Licencia para seguir teniendo acceso.'+slLinea[6];
                   end else
                      Respuesta := 'Su licencia expira el día de hoy.';
                   //Label8.Caption := 'Elimine el registró actual para agregar nuevamente el equipo';
                end
                else
                  Respuesta := 'La licencia esta vigente, debe de validar antes del '+slLinea[6]+' vía internet.';

                  // Respuesta  := 'Licencia vigente. Validar nuevamente antes del '+slLinea[6]+' ('+IntToStr(DiasRestantes)+' días).';

                Label7.Caption := Respuesta;
                Result := True;

                if DiasRestantes > 5 then
                   Respuesta  :=  '';

                gLicenciaVigente := 'S';

                ErrorBD := '';


                     //gNumLic   gRazonSocial
               try
         			  begin
			        	  ConectarBDAWS();

  			      	  dataset.SQL.Clear;
    	  				  dataset.SQL.Add('SELECT Licencia_ID, AgrupadorID, Folio_Microsip FROM Licencias where Numero_licencia = "'+Trim(gNumLic)+'"  and Nombre_cliente = "'+Trim(gRazonSocial)+'" ');
    	  				  Dataset.Open;
    	            gAgrupadorID := 0;
    	            gAgrupadorID := Dataset.FieldByName('AgrupadorID').AsInteger;
                  FolioMSP := '';
                  FolioMSP := Dataset.FieldByName('Folio_Microsip').AsString;
                  LicID := 0;
                  LicID := Dataset.FieldByName('Licencia_ID').AsInteger;

                  if gAgrupadorID > 0 then
                  begin
                   dataset.SQL.Clear;
                   dataset.SQL.Add('SELECT COUNT(*) conteo FROM Licencias WHERE AgrupadorID = '+IntToStr(gAgrupadorID));
                   dataset.Open;
                   ConteoAgrpador := Dataset.FieldByName('conteo').AsInteger;
                  end;

                  if (gAgrupadorID > 0) and (ConteoAgrpador > 5) then
                  begin
                      if ConexionAmazonGrid() then
                        ConsultaTabla(FolioMSP, IntToStr(gAgrupadorID), '');
                  end else
                  begin
                      if ConexionAmazonGrid() then
                        ConsultaTabla(FolioMSP,'', InTToStr(LicID));
                  end;


                 Connection.Disconnect;
        			  end;
       	  		 except
			           begin
        				  MessageDlg('No fue posible cargar los productos disponibles, intente más tarde.', mtInformation,[mbOk], 0);
				          exit;
        			   end;
        	  	 end;

                GrabaLicenciaBD(Cliente,Licencia,ErrorBD);
                if ErrorBD <> '' then
                begin
                   MessageDlg(ErrorBD, mtInformation,[mbOk], 0);
                   ResActualiza := 'N';
                end;

            end else
            begin
                //Label8.Caption := 'Elimine el registró actual para agregar nuevamente el equipo';
                try
                  begin
                     ConectarBDAWS();
                     Connection.Disconnect;
                     ContinuaActulizacion := 1;
                  end;
                Except
                  begin
                     Respuesta  := 'Es necesario verificar la licencia, conéctese a internet y vuelva a intentarlo.';//'La licencia ha caducado.';
                     Label7.Caption := Respuesta;
                     gTieneInternet := 'N';
                  end;
                end;

                if gVerifActualizacion = 0 then
                begin
                  if ContinuaActulizacion = 1 then
                  begin
                   ResActualiza := '';
                   ActualizarLicencia(Evento, Cliente,Licencia,ResActualiza);
                   if ResActualiza = 'S' then
                      Result := True;
                   Label7.Caption := ResActualiza;
                  end;
                end;
            end;

        End Else
        Begin
           Raise Exception.Create('El equipo no se encuentra registrado.'); //
        End;
     end;
   except on e : exception do 
     begin
        if IniPer =0 then
        begin
          LimpiaLabel();
          Label4.Caption := e.message;
          Respuesta  := e.message;
        end else
        begin
          Label7.Caption := e.message;
          Respuesta  := e.message;
        end;

     end;
   end;

   

end;

procedure TfrmLicencia.btnEliminarClick(Sender: TObject);
begin
  if MessageDlg('¿Está seguro de eliminar la licencia de este equipo?',
                    mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
  begin
    LimpiaLabel();
    EliminarLicencia();
  end;
end;

procedure TfrmLicencia.EliminarLicencia();
var PathIni, MaquinaID, FechaInicial,FechaFinal:String;
ID, AgrupadorID:Integer;
ResLic,ResActualiza,ClaveArt, Registro,TipoLicencia, lEstado:string;
begin

try
  begin
    if Trim(eNombreCliente.Text) = '' then
    begin
       MessageDlg('Ingrese el nombre del cliente.', mtInformation,[mbOk], 0);
       exit;
    end;

    if Trim(eNumLicencia.Text) = '' then
    begin
       MessageDlg('Ingrese el número de licencia.', mtInformation,[mbOk], 0);
       exit;
    end;

    try
      begin
        ConectarBDAWS();
      end;
    except
      begin
        MessageDlg('No fue posible conectarse al servidor, verifique que está conectado a internet.', mtInformation,[mbOk], 0);
        exit;
      end;
    end;


    dataset.SQL.Clear;
    dataset.SQL.Add('SELECT Licencia_ID, Usuarios, Fecha_inicial, Fecha_final, Estado, AgrupadorID FROM Licencias where Numero_licencia = "'+Trim(eNumLicencia.Text)+'"  and Nombre_cliente = "'+Trim(eNombreCliente.Text)+'" ');
    Dataset.Open;

    ID := 0;
    ID := Dataset.FieldByName('Licencia_ID').AsInteger;
    AgrupadorID := 0;
    AgrupadorID := Dataset.FieldByName('AgrupadorID').AsInteger;
    lEstado := '';
    lEstado := Dataset.FieldByName('Estado').AsString;
    FechaInicial := '';
    FechaInicial := Dataset.FieldByName('Fecha_inicial').AsString;
    FechaFinal := '';
    FechaFinal := Dataset.FieldByName('Fecha_final').AsString;


    if ID = 0  then
    begin
       MessageDlg('El nombre del cliente o el número de la licencia no es válido, verifique su información.', mtInformation,[mbOk], 0);
       Connection.Disconnect;
       exit;
    end;

    if AgrupadorID > 0 then
    begin
      dataset.SQL.Clear;
      dataset.SQL.Add('SELECT COUNT(*) conteo FROM Licencias WHERE AgrupadorID = '+IntToStr(AgrupadorID));
      Dataset.Open;

      if Dataset.FieldByName('conteo').AsInteger = 7 then
         TipoLicencia := 'Basics';

      if Dataset.FieldByName('conteo').AsInteger = 10 then
         TipoLicencia := 'Basics Plus';

      if Dataset.FieldByName('conteo').AsInteger = 12 then
         TipoLicencia := 'Basics Premium';

      if Dataset.FieldByName('conteo').AsInteger = 1 then
         TipoLicencia := 'Normal';
      
    end else
    begin
      TipoLicencia := 'Normal';
    end;

    ClaveArt := '';
    ClaveArt:=copy(Trim(eNumLicencia.Text),11,2);
    if ClaveArt <> form1.CLAVE_PRODUCTO then
    begin
       MessageDlg('La licencia ingresada no pertenece a este sistema.', mtInformation,[mbOk], 0);
       exit;
    end;



    //MaquinaID := GetPrimaryNicMacAddress+CompHD('C:/')+GetMotherBoardSerial()+'|'+FechaInicial+'|'+FechaFinal+'|'+Trim(eNumLicencia.Text)+'|'+Trim(eNombreCliente.Text);
    MaquinaID := CompHD('C:/')+GetMotherBoardSerial()+'|'+Trim(eNumLicencia.Text)+'|'+Trim(eNombreCliente.Text);
    MaquinaID := cifrarTexto(MaquinaID);
    MaquinaID := RemplazaCad('', #$D#$A, MaquinaID);
    MaquinaID := RemplazaCad('', #$D#$A#0, MaquinaID);
    MaquinaID := RemplazaCad('', #$D, MaquinaID);
    MaquinaID := RemplazaCad('', #$A, MaquinaID);
    MaquinaID := RemplazaCad('', #0, MaquinaID);
    MaquinaID := RemplazaCad('', #$D, MaquinaID);
    MaquinaID := RemplazaCad('', #$A, MaquinaID);

    dataset.SQL.Clear;
    dataset.SQL.Add('SELECT Licencia_Det_ID FROM Licencia_Det where Maquina_ID = "'+MaquinaID+'" ');
    Dataset.Open;

    ID := 0;
    ID := Dataset.FieldByName('Licencia_Det_ID').AsInteger;

    if ID > 0  then
    begin
       //MessageDlg('El equipo no se encuentra registrado, no es posible eliminarlo.', mtInformation,[mbOk], 0);
       //Connection.Disconnect;
       //exit;
       dataset.SQL.Clear;
       dataset.SQL.Add('DELETE FROM Licencia_Det WHERE Maquina_ID = "'+MaquinaID+'"');
       Dataset.ExecSQL;
       Connection.Commit;
    end;

      try
         begin
             Registro := '';
             Registro := Registro+'{';
             Registro := Registro+'	"Tipo_Evento": "D",';
             Registro := Registro+'  "Clave_Producto": "'+form1.CLAVE_PRODUCTO+'",';
             Registro := Registro+'  "Licencia": "'+Trim(eNumLicencia.Text)+'",';
             Registro := Registro+'  "Razon_Social": "'+Trim(eNombreCliente.Text)+'",';
             Registro := Registro+'  "Estado": "'+Trim(lEstado)+'",';
             Registro := Registro+'  "Tipo_Licencia": "'+Trim(TipoLicencia)+'",';
             Registro := Registro+'  "Fecha_Hora": "'+formatdatetime('yyyy-m-d hh:mm:ss', form1.IBDatabase1.GetServerTime)+'"';
             Registro := Registro+'}';
             RegistraEvento(Registro);
         end;
       except
         begin
            //Error := 'Error al validar la licencia';
         end;
       end;

     if ConexionAmazonGrid() then
         ConsultaTabla('000', '1', '');

    Connection.Disconnect;

    PathIni := ExtractFileDir(Application.ExeName)+'\Licencia.ini';
    If fileExists(PathIni) then
    Begin
      DeleteFile(PathIni);
    End;

    MessageDlg('El equipo se eliminó correctamente.', mtInformation,[mbOk], 0);

    ValidaArchivoIni();
    ResActualiza := '';
    LeerLicencia('D',1,ResLic,ResActualiza);
  end;
except on e : exception do 
  begin
     MessageDlg('Error general.', mtInformation,[mbOk], 0);
    //Memo1.Lines.Add(e.message);
  end;
end;

end; 

procedure TfrmLicencia.btnGuardarySalirClick(Sender: TObject);
begin
Close;
end;

procedure TfrmLicencia.btnRegistrarClick(Sender: TObject);
begin
  if MessageDlg('¿Está seguro de registrar este equipo?',
                 mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
  begin
    LimpiaLabel();
    RegistraLicencia();
  end;
end;

function TfrmLicencia.ValidacionesGenerales(Evento, ClaveLic,Cliente:String; var ID, DiasRestantes, NumUsuarios:Integer;
                                            var FechaInicial, FechaFinal,FechaVerif1, FechaVerif2,EstatusLic,
                                            ClaveClieMSP, Memoria, EsConcurrente, Error:String):Boolean;
var ClaveArt:String;
dFechaTerminoLic,dFechaServidor:TDateTime;
Consulta, Registro, TipoLicencia:String;
ConteoAgrpador:Integer;
CadenaAgrupador,FolioMSP,lCliente,lEstado,
lIDLicencia:String;
begin

  try
    begin
       try
			   begin
				  ConectarBDAWS();
			   end;
			 except
			   begin
				  MessageDlg('No fue posible consulta la licencia.'+Chr(13)+
							 'Verifique que esta conectado a internet o póngase en contacto con su distribuidor.', mtInformation,[mbOk], 0);
				  exit;
			   end;
			 end;
         //Base_datos
			 try
			   begin
          Consulta := 'SELECT Licencia_ID, Usuarios, Estatus, Fecha_inicial, Fecha_final, ClaveClienteMicrosip, Folio_Microsip, Memoria, EsConcurrente, AgrupadorID, '+
                      'Nombre_cliente, Estado '+
                      'FROM Licencias where Numero_licencia = "'+Trim(ClaveLic)+'"  and Nombre_cliente = "'+Trim(Cliente)+'" ';
  			  dataset.SQL.Clear;
				  dataset.SQL.Add(Consulta);
				  Dataset.Open;
			   end;
			 except
			   begin
				  MessageDlg('No fue posible consulta la licencia.'+Chr(13)+
							 'Verifique que esta conectado a internet o póngase en contacto con su distribuidor.', mtInformation,[mbOk], 0);
				  Connection.Disconnect;
				  exit;
			   end;
			 end;

       
       

       //if ConexionAmazonGrid() then
             //ConsultaTabla(Dataset.FieldByName('Folio_Microsip').AsString,IntToStr(gAgrupadorID));

			 ID := 0;
			 ID := Dataset.FieldByName('Licencia_ID').AsInteger;

       gAgrupadorID := 0;
       gAgrupadorID := Dataset.FieldByName('AgrupadorID').AsInteger;



			 EstatusLic := '';
			 EstatusLic := Dataset.FieldByName('Estatus').AsString;

			 NumUsuarios := 0;
			 NumUsuarios := Dataset.FieldByName('Usuarios').AsInteger;

			 FechaInicial := '';
			 FechaInicial := Dataset.FieldByName('Fecha_inicial').AsString;

			 FechaFinal := '';
			 FechaFinal := Dataset.FieldByName('Fecha_final').AsString;
			 //FechaVerif1 := DateToStr(form1.IBDatabase1.GetServerTime);
			 //FechaVerif2 := DateToStr(form1.IBDatabase1.GetServerTime+30);
       try
         begin
            FechaVerif1 := DateToStr(form1.IBDatabase1.GetServerTime);
       		  FechaVerif2 := DateToStr(form1.IBDatabase1.GetServerTime+30);
         end;
       except
         begin
            FechaVerif1 := DateToStr(Now());
       		  FechaVerif2 := DateToStr(Now()+30);
         end;
       end;


       ClaveClieMSP:= '';
       ClaveClieMSP := Dataset.FieldByName('ClaveClienteMicrosip').AsString;
       Memoria := '';
       Memoria := Dataset.FieldByName('Memoria').AsString;

       EsConcurrente := '';
       EsConcurrente := Dataset.FieldByName('EsConcurrente').AsString;

       

			 //form1.IBDatabase1.GetServerTime
			 if ID = 0  then
			 begin
				MessageDlg('El nombre del cliente o el número de la licencia no es válido.'+Chr(13)+
						   'Verifique su información o póngase en contacto con su distribuidor.', mtInformation,[mbOk], 0);
				Connection.Disconnect;
				exit;
			 end;



			 ClaveArt := '';
			 ClaveArt:=copy(Trim(ClaveLic),11,2);
			 if ClaveArt <> form1.CLAVE_PRODUCTO then
			 begin
				MessageDlg('La licencia ingresada no pertenece a este sistema.', mtInformation,[mbOk], 0);
				Connection.Disconnect;
				exit;
			 end;

       if EstatusLic = 'S' then
			 begin
				MessageDlg('La licencia está suspendida, pónganse en contacto con su distribuidor.', mtInformation,[mbOk], 0);
				Connection.Disconnect;
        Result:=True;
				exit;
			 end;

			 if EstatusLic = 'B' then
			 begin
				MessageDlg('La licencia está dada de baja, pónganse en contacto con su distribuidor.', mtInformation,[mbOk], 0);
        Result:=True;
				Connection.Disconnect;
				exit;
			 end;

			 try
			   begin
				  dFechaTerminoLic := StrToDate(FechaFinal);
			   end;
			 except
			   begin
				 MessageDlg('Error al consultar la vigencia de la licencia.', mtInformation,[mbOk], 0);
				 Connection.Disconnect;
				 exit;
			   end;
			 end;
			 //dFechaServidor := form1.IBDatabase1.GetServerTime;
       try
         begin
            dFechaServidor := form1.IBDatabase1.GetServerTime;
         end;
       except
         begin
            dFechaServidor := Now();
         end;
       end;



			 if dFechaServidor >= dFechaTerminoLic then
			 begin
				MessageDlg('Su licencia ha expirado, solicite una renovación con su distribuidor.'+Chr(13)+
						   'O ingrese una licencia valida.', mtInformation,[mbOk], 0);
				Connection.Disconnect;
				exit;
			 end;
			 DiasRestantes := 0;
			 DiasRestantes := DaysBetween(dFechaTerminoLic,dFechaServidor);


			 if DiasRestantes < 30 then
				FechaVerif2 := DateToStr(dFechaTerminoLic);



       FolioMSP := '';
       FolioMSP := Dataset.FieldByName('Folio_Microsip').AsString;
       lCliente := '';
       lCliente := Dataset.FieldByName('Nombre_cliente').AsString;
       lEstado := '';
       lEstado := Dataset.FieldByName('Estado').AsString;
       if gAgrupadorID > 0 then
       begin
        consulta := 'SELECT COUNT(*) conteo FROM Licencias WHERE AgrupadorID = '+IntToStr(gAgrupadorID);
        dataset.SQL.Clear;
        dataset.SQL.Add(consulta);
        dataset.Open;
        ConteoAgrpador := Dataset.FieldByName('conteo').AsInteger;
       end;


           if (gAgrupadorID > 0) and (ConteoAgrpador > 5) then
           begin
               if Evento = 'D' then
                 CadenaAgrupador := '100000'
               else
                 CadenaAgrupador := IntToStr(gAgrupadorID);
                 
               if ConexionAmazonGrid() then
                 ConsultaTabla(FolioMSP, CadenaAgrupador, '');

               if ConteoAgrpador = 7 then
                  TipoLicencia := 'Basics';

              if ConteoAgrpador = 10 then
                  TipoLicencia := 'Basics Plus';

              if ConteoAgrpador = 12 then
                  TipoLicencia := 'Basics Premium';


           end else
           begin
               lIDLicencia := '';
               if Evento = 'D' then
                 lIDLicencia := '100000'
               else
                 lIDLicencia := IntToStr(ID);
               if ConexionAmazonGrid() then
                 ConsultaTabla(FolioMSP,'', lIDLicencia );
               TipoLicencia := 'Normal';
           end;
       



       try
         begin
           if Evento <> 'N' then
           begin
             Registro := '';
             Registro := Registro+'{';
             Registro := Registro+'	"Tipo_Evento": "'+Trim(Evento)+'",';
             Registro := Registro+'  "Clave_Producto": "'+form1.CLAVE_PRODUCTO+'",';
             Registro := Registro+'  "Licencia": "'+Trim(ClaveLic)+'",';
             Registro := Registro+'  "Razon_Social": "'+lCliente+'",';
             Registro := Registro+'  "Estado": "'+Trim(lEstado)+'",';
             Registro := Registro+'  "Tipo_Licencia": "'+Trim(TipoLicencia)+'",';
             Registro := Registro+'  "Fecha_Hora": "'+formatdatetime('yyyy-m-d hh:mm:ss', form1.IBDatabase1.GetServerTime)+'"';
             Registro := Registro+'}';
             RegistraEvento(Registro);
           end;
         end;
       except
         begin
            //Error := 'Error al validar la licencia';
         end;
       end;

       Connection.Disconnect;
       Result:=True; 

    end;
  except on e : exception do
    begin
        Error := 'Error al validar la licencia.';
    end;
  end;

end;

procedure TfrmLicencia.RegistraLicencia();
var ID,NumUsuarios:Integer;
Query, FechaInicial, FechaFinal :String;
ExisteMaquina,LicUsadas:Integer;
qError, MaquinaID:String;
FechaVerif1,FechaVerif2:String;
ResLic:String;
dFechaServidor, dFechaTerminoLic:TDateTime;
DiasRestantes:Integer;
ResActualiza, ClaveArt:String;
tFechaServidor,EstatusLic:String;
ClaClienteMSP,Memoria, EsConcurrente:String;
begin

try
  begin

     if Trim(eNombreCliente.Text) = '' then
     begin
        MessageDlg('Ingrese el nombre del cliente.', mtInformation,[mbOk], 0);
        exit;
     end;

     if Trim(eNumLicencia.Text) = '' then
     begin
        MessageDlg('Ingrese el número de licencia.', mtInformation,[mbOk], 0);
        exit;
     end;
     qError := '';
     DiasRestantes := 0;
     if not ValidacionesGenerales('R',Trim(eNumLicencia.Text),Trim(eNombreCliente.Text),ID,DiasRestantes,
                                  NumUsuarios,FechaInicial,FechaFinal,FechaVerif1,FechaVerif2,EstatusLic,
                                  ClaClienteMSP,Memoria, EsConcurrente,qError) then
     begin
       if qError <> '' then
          MessageDlg(qError, mtInformation,[mbOk], 0);

       exit;
     end;
     {$REGION 'validación comentada'}
     
     {$ENDREGION}
     if ID > 0 then
     begin
       try
        begin
         qError := '';
         dataset.SQL.Clear;
         dataset.SQL.Add('SELECT COUNT(*) CONTEO FROM Licencia_Det where Licencia_ID = '+IntToStr(ID));
         Dataset.Open;
         LicUsadas := 0;
         LicUsadas := Dataset.FieldByName('CONTEO').AsInteger;
        end;
       except
        begin
         LicUsadas := 0;
         qError := 'Error de consulta';
         MessageDlg(qError, mtInformation,[mbOk], 0);
         Connection.Disconnect;
         exit;
        end;
       end;
       


       MaquinaID := '';
       MaquinaID := Trim(CompHD('C:/'))+Trim(GetMotherBoardSerial())+'|'+Trim(eNumLicencia.Text)+'|'+Trim(eNombreCliente.Text);
       MaquinaID := cifrarTexto(MaquinaID);

       MaquinaID := RemplazaCad('', #$D#$A, MaquinaID);
       MaquinaID := RemplazaCad('', #$D#$A#0, MaquinaID);
       MaquinaID := RemplazaCad('', #$D, MaquinaID);
       MaquinaID := RemplazaCad('', #$A, MaquinaID);
       MaquinaID := RemplazaCad('', #0, MaquinaID);
       MaquinaID := RemplazaCad('', #$D, MaquinaID);
       MaquinaID := RemplazaCad('', #$A, MaquinaID);



         try
          begin
           qError := '';
           dataset.SQL.Clear;
           dataset.SQL.Add('SELECT COUNT(*) CONTEO_MAQUINA FROM Licencia_Det where Maquina_ID = "'+MaquinaID+'" ');
           Dataset.Open;

           ExisteMaquina := 0;
           ExisteMaquina := Dataset.FieldByName('CONTEO_MAQUINA').AsInteger;

          end;
         except
          begin
           qError := 'Error al buscar equipo';
           MessageDlg(qError, mtInformation,[mbOk], 0);
           Connection.Disconnect;
           exit;
          end;
         end;

       if (LicUsadas < NumUsuarios) or (ExisteMaquina > 0) then
       begin

         try
          begin
           qError := '';
           if ExisteMaquina = 0 then
           begin
             dataset.SQL.Clear;
             dataset.SQL.Add('INSERT INTO Licencia_Det (Licencia_ID, Maquina_ID) values ('+IntToStr(ID)+',"'+MaquinaID+'")' );
             Dataset.ExecSQL;
           end;

           //tFechaServidor := DateToStr(form1.IBDatabase1.GetServerTime);
           try
             begin
              tFechaServidor := DateToStr(form1.IBDatabase1.GetServerTime);
             end;
           except
             begin
               tFechaServidor := DateToStr(Now());
             end;
           end;

           if (ClaClienteMSP <> '') then                         ////Memoria, EsConcurrente
           begin
              MaquinaID := cifrarTexto(CompHD('C:/')+GetMotherBoardSerial()+
                                       '|'+FechaInicial+'|'+FechaFinal+'|'+Trim(eNumLicencia.Text)+'|'+Trim(eNombreCliente.Text)+
                                       '|'+FechaVerif1+'|'+FechaVerif2+'|'+tFechaServidor+'|'+EstatusLic+'|'+Memoria+'|'+EsConcurrente+
                                       '|'+ClaClienteMSP);
           end else
           begin
              MaquinaID := cifrarTexto(CompHD('C:/')+GetMotherBoardSerial()+
                                       '|'+FechaInicial+'|'+FechaFinal+'|'+Trim(eNumLicencia.Text)+'|'+Trim(eNombreCliente.Text)+
                                       '|'+FechaVerif1+'|'+FechaVerif2+'|'+tFechaServidor+'|'+EstatusLic+'|'+Memoria+'|'+EsConcurrente);
           end;


           MaquinaID := RemplazaCad('', #$D#$A, MaquinaID);
           MaquinaID := RemplazaCad('', #$D#$A#0, MaquinaID);
           MaquinaID := RemplazaCad('', #$D, MaquinaID);
           MaquinaID := RemplazaCad('', #$A, MaquinaID);
           MaquinaID := RemplazaCad('', #0, MaquinaID);
           MaquinaID := RemplazaCad('', #$D, MaquinaID);
           MaquinaID := RemplazaCad('', #$A, MaquinaID);

           GrabaIni(MaquinaID);

          end;
         except
          begin
           qError := 'Error al registrar equipo';
           MessageDlg(qError, mtInformation,[mbOk], 0);
           Connection.Disconnect;
           exit;
          end;
         end;

         MessageDlg('La licencia se ha validado correctamente vía internet el '+FechaVerif1+'.', mtInformation,[mbOk], 0);

         if DiasRestantes = 0 then
         begin
             MessageDlg('Su licencia expira hoy. Realice su renovación para seguir utilizando la aplicación.', mtInformation,[mbOk], 0);
         end else
         begin
             if DiasRestantes < 30 then
               MessageDlg('Recuerde verificar nuevamente su licencia en '+IntToStr(DiasRestantes)+' días ('+FechaVerif2+').', mtInformation,[mbOk], 0)
             else
               MessageDlg('Recuerde verificar nuevamente su licencia en 30 días ('+FechaVerif2+').', mtInformation,[mbOk], 0)
         end;

         ValidaArchivoIni();
       end else
         MessageDlg('La licencia ingresada no cuenta con accesos disponibles.', mtInformation,[mbOk], 0);

       Connection.Commit;
     end;

     Connection.Disconnect;

     ValidaArchivoIni();
     ResActualiza := '';
     gVerifActualizacion := 0;
     LeerLicencia('N',1,ResLic,ResActualiza);

  end;
except
  begin
     MessageDlg('Error General.', mtInformation,[mbOk], 0);
  end;
end;

end;

function TfrmLicencia.ActualizarLicencia(Evento, Cliente,ClaveLic:String; var ResActualiza:String):Boolean;
var ID,NumUsuarios:Integer;
Query, FechaInicial, FechaFinal :String;
ExisteMaquina,LicUsadas:Integer;
qError, MaquinaID:String;
FechaVerif1,FechaVerif2:String;
ResLic, EstatusLic:String;
dFechaServidor, dFechaTerminoLic:TDateTime;
DiasRestantes:Integer;
ClaveArt, tFechaServidor:String;
ClaClienteMSP, PathIni,Memoria, EsConcurrente:String;
begin

try
  begin
     Result := False;
     ResActualiza := 'N';

     qError := '';
     DiasRestantes := 0;
     if not ValidacionesGenerales(Evento,Trim(ClaveLic),Trim(Cliente),ID, DiasRestantes, NumUsuarios,FechaInicial,FechaFinal,FechaVerif1,
                                  FechaVerif2,EstatusLic,ClaClienteMSP,Memoria, EsConcurrente,qError) then
     begin
       if qError <> '' then
          MessageDlg(qError, mtInformation,[mbOk], 0);

       exit;
     end;
     

     if ID > 0 then
     begin
         MaquinaID := '';
       //MaquinaID := Trim(GetPrimaryNicMacAddress)+Trim(CompHD('C:/'))+Trim(GetMotherBoardSerial())+'|'+Trim(FechaInicial)+'|'+Trim(FechaFinal)+'|'+Trim(ClaveLic)+'|'+Trim(Cliente);
         MaquinaID := Trim(CompHD('C:/'))+Trim(GetMotherBoardSerial())+'|'+Trim(ClaveLic)+'|'+Trim(Cliente);
         MaquinaID := cifrarTexto(MaquinaID);

         MaquinaID := RemplazaCad('', #$D#$A, MaquinaID);
         MaquinaID := RemplazaCad('', #$D#$A#0, MaquinaID);
         MaquinaID := RemplazaCad('', #$D, MaquinaID);
         MaquinaID := RemplazaCad('', #$A, MaquinaID);
         MaquinaID := RemplazaCad('', #0, MaquinaID);
         MaquinaID := RemplazaCad('', #$D, MaquinaID);
         MaquinaID := RemplazaCad('', #$A, MaquinaID);

         try
          begin
           qError := '';
           dataset.SQL.Clear;
           dataset.SQL.Add('SELECT COUNT(*) CONTEO_MAQUINA FROM Licencia_Det where Maquina_ID = "'+MaquinaID+'" ');
           Dataset.Open;

           ExisteMaquina := 0;
           ExisteMaquina := Dataset.FieldByName('CONTEO_MAQUINA').AsInteger;

          end;
         except
          begin
           qError := 'Error al buscar equipo';
           MessageDlg(qError, mtInformation,[mbOk], 0);
           Connection.Disconnect;
           exit;
          end;
         end;



         try
          begin
           qError := '';

           if ExisteMaquina > 0 then
           begin
             //tFechaServidor := DateToStr(form1.IBDatabase1.GetServerTime);

             try
               begin
                  tFechaServidor := DateToStr(form1.IBDatabase1.GetServerTime);
               end;
             except
               begin
                  tFechaServidor := DateToStr(Now());
               end;
             end;
                                           
             if (ClaClienteMSP <> '') then
             begin
              MaquinaID := cifrarTexto(CompHD('C:/')+GetMotherBoardSerial()+
                                       '|'+FechaInicial+'|'+FechaFinal+'|'+Trim(ClaveLic)+'|'+Trim(Cliente)+
                                       '|'+FechaVerif1+'|'+FechaVerif2+'|'+tFechaServidor+'|'+EstatusLic+'|'+Memoria+'|'+EsConcurrente+
                                       '|'+ClaClienteMSP);
             end else
             begin
              MaquinaID := cifrarTexto(CompHD('C:/')+GetMotherBoardSerial()+
                                       '|'+FechaInicial+'|'+FechaFinal+'|'+Trim(ClaveLic)+'|'+Trim(Cliente)+
                                       '|'+FechaVerif1+'|'+FechaVerif2+'|'+tFechaServidor+'|'+EstatusLic+'|'+Memoria+'|'+EsConcurrente);
             end;
             MaquinaID := RemplazaCad('', #$D#$A, MaquinaID);
             MaquinaID := RemplazaCad('', #$D#$A#0, MaquinaID);
             MaquinaID := RemplazaCad('', #$D, MaquinaID);
             MaquinaID := RemplazaCad('', #$A, MaquinaID);
             MaquinaID := RemplazaCad('', #0, MaquinaID);
             MaquinaID := RemplazaCad('', #$D, MaquinaID);
             MaquinaID := RemplazaCad('', #$A, MaquinaID);

             GrabaIni(MaquinaID);
             ResActualiza := 'S';
             Result := True;
           end else
           begin
             qError := 'El equipo no se encuentra asociado, asócielo para continuar.';
             MessageDlg(qError, mtInformation,[mbOk], 0);
             Connection.Disconnect;
             gErrorAsociacion := 'S';
             PathIni := ExtractFileDir(Application.ExeName)+'\Licencia.ini';
             If fileExists(PathIni) then
             Begin
                DeleteFile(PathIni);
             End;
             exit;
           end;

          end;
         except
          begin
           qError := 'Error al registrar equipo';
           MessageDlg(qError, mtInformation,[mbOk], 0);
           Connection.Disconnect;
           exit;
          end;
         end;

        // MessageDlg('El equipo se registró exitosamente.', mtInformation,[mbOk], 0);
        if EstatusLic = 'N' then
        begin
         if DiasRestantes = 0 then
         begin
             MessageDlg('Su licencia expira hoy. Realice su renovación para seguir utilizando la aplicación.', mtInformation,[mbOk], 0);
         end;
        end;



     end;

     Connection.Disconnect;

     //ValidaArchivoIni();
     //LeerLicencia(1,ResLic);

  end;
except
  begin
     MessageDlg('Error General.', mtInformation,[mbOk], 0);
  end;
end;

end;

procedure TfrmLicencia.ConectarBDAWS();
var
  Url, Protocolo, Host,
  Puerto, Db, Usuario, Pass: string;
begin
  Protocolo := 'mysql';
  Host := 'exsimservicios.cicc11mxl3bu.us-east-1.rds.amazonaws.com';
  Puerto := '3306';
  Db := 'DB_Exsim_Servicios';
  Usuario := 'ExsimAdmin';
  Pass := 'exsim_4040';

  Connection := TZConnection.Create(Self);
  Dataset := TZQuery.Create(Self);
  Dataset.Connection := FConnection;
  Connection.AutoCommit := False;

  Connection.Protocol := 'mysql';
  Connection.HostName := Host;//;'instanciaaurora.cyqhg54dl0q9.us-east-1.rds.amazonaws.com';
  Connection.Database := Db;
  Connection.User := Usuario;
  Connection.Password := Pass;
  Dataset.Fields.Clear;

  Connection.Connect;
  if Connection.Port = 0 then
  begin
     Label1.Caption := 'Conectado';
  end else
     Label1.Caption := 'Problemas';

end;

function TfrmLicencia.cifrarTexto(Str : String) : String;
var
  Src: TStringStream;
  Dst: TMemoryStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TStringStream.Create(Str);
  try
    Dst:= TMemoryStream.Create;
    try
      // Preparamos la clave, lo ideal es que tenga 32 caracteres
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AEsExpandKey(ExpandedKey,Key);
      // Guardamos el tamaño del texto original
      Size:= Src.Size;
      Dst.WriteBuffer(Size,Sizeof(Size));
      // Ciframos el texto
      AESEncryptStreamECB(Src,Dst,ExpandedKey);
      // Lo codificamos a base64
      Result:= BinToStr(Dst.Memory,Dst.Size);
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;

function TfrmLicencia.descifrarTexto (Str : String): String;
var
  Src: TMemoryStream;
  Dst: TStringStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TMemoryStream.Create;
  try
    Dst:= TStringStream.Create(Str);
    try
      StrToStream(Str,Src);
      Src.Position:= 0;
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AESExpandKey(ExpandedKey,Key);
      // Leemos el tamaño del texto
      Src.ReadBuffer(Size,Sizeof(Size));
      AESDecryptStreamECB(Src,Dst,ExpandedKey);
      Dst.Size:= Size;
      Result:= Dst.DataString;
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;

procedure TfrmLicencia.GrabaIni(Cadena:string);
var PathIni,Temp : String;
ArchivoIni : TIniFile;
begin

  PathIni := ExtractFileDir(Application.ExeName) + '\Licencia.ini';
  ArchivoIni := TIniFile.Create(PathIni);

  ArchivoIni.WriteString('LICENCIA','CLAVE',Cadena);
  ArchivoIni.Free;

end;

function TfrmLicencia.RemplazaCad(StrSrc, StrDest, Str : string) : string;
begin
	while Pos(StrDest,Str) > 0 do
	begin
		Insert(StrSrc,Str,Pos(StrDest,Str));
		Delete(Str,Pos(StrDest,Str),Length(StrDest));
	end;
	RemplazaCad := Str;
end;

procedure TfrmLicencia.btnInfoClick(Sender: TObject);
var ResActualiza, ResLic:String;
begin
  ResActualiza := '';
  ValidaArchivoIni();
  gVerifActualizacion := 0;
  LeerLicencia('N',1,ResLic,ResActualiza);
end;

function TfrmLicencia.GrabaLicenciaBD(Cliente,Licencia:String; var lError:String):Boolean;
begin
         {Guarda datos locales}
          try
            begin
             lError := '';
             Result := False;

             CreaTableLicencia(lError);
             if lError = '' then
             begin
                if form1.trTrans.InTransaction  then
                   form1.trTrans.Rollback;
                                 
                form1.trTrans.StartTransaction;

                form1.IBQuery1.Close;
                form1.IBQuery1.SelectSQL.Clear;
                form1.IBQuery1.SelectSQL.Add ('SELECT LICENCIA_ID FROM MG_EXSIM_LICENCIAS WHERE APLICACION = :APLICACION ');
                form1.IBQuery1.ParamByName('APLICACION').AsString := form1.CLAVE_PRODUCTO;
                form1.IBQuery1.Open;

                if form1.IBQuery1.FieldByName('LICENCIA_ID').AsInteger > 0 then
                begin

                    form1.IBQuery2.Close;
                    form1.IBQuery2.SelectSQL.Clear;
                    form1.IBQuery2.SelectSQL.Add ('UPDATE MG_EXSIM_LICENCIAS ');
                    form1.IBQuery2.SelectSQL.Add ('SET LICENCIA = :LICENCIA, ');
                    form1.IBQuery2.SelectSQL.Add ('    CLIENTE = :CLIENTE ');
                    form1.IBQuery2.SelectSQL.Add ('WHERE (LICENCIA_ID = :LICENCIA_ID); ');
                    form1.IBQuery2.ParamByName('LICENCIA_ID').AsInteger := form1.IBQuery1.FieldByName('LICENCIA_ID').AsInteger;
                    form1.IBQuery2.ParamByName('LICENCIA').AsString := Trim(Licencia);
                    form1.IBQuery2.ParamByName('CLIENTE').AsString := Trim(Cliente);
                    form1.IBQuery2.Open;

                end else
                begin
                    form1.spGendoctoid.ExecProc;
                    form1.IBQuery2.Close;
                    form1.IBQuery2.SelectSQL.Clear;
                    form1.IBQuery2.SelectSQL.Add ('INSERT INTO MG_EXSIM_LICENCIAS (LICENCIA_ID, APLICACION, LICENCIA, CLIENTE) ');
                    form1.IBQuery2.SelectSQL.Add ('VALUES (:LICENCIA_ID, :APLICACION, :LICENCIA, :CLIENTE); ');
                    form1.IBQuery2.ParamByName('LICENCIA_ID').AsInteger := form1.spGendoctoid.FieldByName('DOCTO_ID').ASinteger;
                    form1.IBQuery2.ParamByName('APLICACION').AsString := form1.CLAVE_PRODUCTO;
                    form1.IBQuery2.ParamByName('LICENCIA').AsString := Trim(Licencia);
                    form1.IBQuery2.ParamByName('CLIENTE').AsString := Trim(Cliente);
                    form1.IBQuery2.Open;
                end;

                if form1.trTrans.InTransaction then
                   form1.trTrans.Commit;

                Result := True;   
             end //if lError <> '' then
             else
             begin
                Result := False;
             end;

            end;
          except
            begin
               lError := 'Error al grabar datos de forma interna.';
               Result := False;
            end;
          end;
end;


procedure TfrmLicencia.HTTPSClientCertificateValidate(Sender: TObject;
  X509Certificate: TElX509Certificate; var Validity: TSBCertificateValidity;
  var Reason: TSBCertificateValidityReason);
begin
  Validity := cvOk;
  Reason := [];
end;

procedure TfrmLicencia.HTTPSClientData(Sender: TObject; Buffer: Pointer;
  Size: Integer);
var
  Bytes: ByteArray;
  Lines: TStringList;
  var S :AnsiString;
begin
  //Respuesta del servidor
  SetLength(S, Size);
  Move(Buffer^, S[1], Size);
  gRespuesta := gRespuesta + S;
end;

function TfrmLicencia.CreaTableLicencia(var lError:String):Boolean;
begin
  ///////////////////////Tabla Licnecia///////////////////////////////
Result:= False;
lError := '';
if form1.trTrans.InTransaction  then
   form1.trTrans.Rollback;

form1.trTrans.StartTransaction;
try
begin
form1.IBQuery1.Close;
form1.IBQuery1.SelectSQL.Clear;
form1.IBQuery1.SelectSQL.Add('SELECT LICENCIA_ID FROM MG_EXSIM_LICENCIAS WHERE LICENCIA_ID = 0');
form1.IBQuery1.Open;
end
except
begin
 try
 begin
    form1.IBQuery1.Close;
    form1.IBQuery1.SelectSQL.Clear;
    form1.IBQuery1.SelectSQL.Add('CREATE TABLE MG_EXSIM_LICENCIAS ( ');
    form1.IBQuery1.SelectSQL.Add('    LICENCIA_ID INTEGER NOT NULL, ');
    form1.IBQuery1.SelectSQL.Add('    APLICACION VARCHAR(20), ');
    form1.IBQuery1.SelectSQL.Add('    LICENCIA VARCHAR(100), ');
    form1.IBQuery1.SelectSQL.Add('    CLIENTE VARCHAR(350)); ');
    form1.IBQuery1.Open;

    form1.IBQuery1.Close;
    form1.IBQuery1.SelectSQL.Clear;
    form1.IBQuery1.SelectSQL.Add('ALTER TABLE MG_EXSIM_LICENCIAS ADD CONSTRAINT PK_MG_EXSIM_LICENCIAS PRIMARY KEY (LICENCIA_ID);');
    form1.IBQuery1.Open;

    form1.IBQuery1.Close;
    form1.IBQuery1.SelectSQL.Clear;
    form1.IBQuery1.SelectSQL.Add('GRANT ALL ON MG_EXSIM_LICENCIAS TO USUARIO_MICROSIP;');
    form1.IBQuery1.Open;


    if form1.trTrans.InTransaction then
        form1.trTrans.Commit;

    Result:= True;    

  end
  except
    Result:= False;
    lError := 'Es necesario actualizar sus metadatos. Ejecute la aplicación como administrador (SYSDBA), si el problema persiste comuníquese con su distribuidor Microsip.';
    //MessageDlg('No se pudo crear la tabla de licencia.'+#13+'Ejecute la aplicación como administrador (SYSDBA), si el problema persiste cree la tabla manualmente.', mtError, [mbOk], 0);
  end;//fin del seg try
end
end;//fin del try
////////////////////////////////////////////////////////////////////
end;


function TfrmLicencia.ConexionAmazonGrid():Boolean;
var
  Url: string;
begin
try
  begin
    Result := False;
    Url := 'zdbc:mysql-5://exsimservicios.cicc11mxl3bu.us-east-1.rds.amazonaws.com:3306/DB_Exsim_Servicios?UID=ExsimAdmin;PWD=exsim_4040';
   // Url := 'zdbc:mysql-5://db-exsim-servicios.cicc11mxl3bu.us-east-1.rds.amazonaws.com:3306/DB_EXSIM_SERVICIOS?UID=ExsimAdmin;PWD=exsim_4040';
    ConnectionGrid := DriverManager.GetConnectionWithParams(Url, nil);
    //Connection := DriverManager.GetConnectionWithParams(Url);
    ConnectionGrid.SetAutoCommit(False);
    ConnectionGrid.SetTransactionIsolation(tiReadCommitted);
    ConnectionGrid.Open;

    Result := True;
  end;
except
  begin
     MessageDlg('Error general al conectarse a la base de datos, inténtelo mas tarde.', mtInformation,[mbOk], 0);
  end;
end;
end;

procedure TfrmLicencia.ConsultaTabla(Factura,Agrupador,IDLicencia:String);
var
  Statement: IZStatement;
  I, W, WMax: Integer;
  Value: string;
  Consulta:string;
  NombreProducto:String;
begin
try
  begin


  Statement := ConnectionGrid.CreateStatement;
  if Agrupador <> '' then
  begin
      Consulta := 'SELECT Producto, Usuarios '+
                  'FROM Licencias where Folio_Microsip = '''+Factura+''' AND AgrupadorID = '+Agrupador+' order by Producto desc  ';
  end else
  begin
      Consulta := 'SELECT Producto, Usuarios '+
                  'FROM Licencias where Licencia_ID = '+IDLicencia+' order by Producto desc  ';
  end;
  Statement.SetResultSetConcurrency(rcUpdatable);
  ResultSet := Statement.ExecuteQuery(Consulta);
  //ResultSet := Statement.ExecuteQuery(memSQL.Text);


  sgResults.RowCount := 1;
  sgResults.ColCount := 1;
//Was any resultset returned?
  if Assigned(ResultSet) then
  begin
    sgResults.ColCount := ResultSet.GetMetadata.GetColumnCount;
    for I := 1 to ResultSet.GetMetadata.GetColumnCount do
    begin
      if ResultSet.GetMetadata.GetColumnName(I) = 'Producto' then
          sgResults.Cells[I - 1, 0] := 'Módulos incluidos en la licencia'
      else
      begin
         if ResultSet.GetMetadata.GetColumnName(I) = 'Usuarios' then
            sgResults.Cells[I - 1, 0] := 'Usuarios'
         else
            sgResults.Cells[I - 1, 0] := ResultSet.GetMetadata.GetColumnName(I);
      end;

    end;
//Make a cycle for each record in the resultset
    while ResultSet.Next do
    begin
      sgResults.RowCount := sgResults.RowCount + 1;
      sgResults.FixedRows := 1;
      for I := 1 to ResultSet.GetMetadata.GetColumnCount do
      begin
//read out the proper value for the column
        case ResultSet.GetMetadata.GetColumnType(I) of
          stBoolean: if ResultSet.GetBoolean(I) then Value := 'True' else Value := 'False';
          stByte: Value := IntToStr(ResultSet.GetByte(I));
          stShort: Value := IntToStr(ResultSet.GetShort(I));
          stInteger: Value := IntToStr(ResultSet.GetInt(I));
          stLong: Value := IntToStr(ResultSet.GetLong(I));
          stFloat: Value := FloatToStr(ResultSet.GetFloat(I));
          stDouble: Value := FloatToStr(ResultSet.GetDouble(I));
          stBigDecimal: Value := FloatToStr(ResultSet.GetBigDecimal(I));
          stBytes, stBinaryStream: Value := ResultSet.GetBlob(I).GetString;
          stDate: Value := DateToStr(ResultSet.GetDate(I));
          stTime: Value := TimeToStr(ResultSet.GetTime(I));
          stTimeStamp: Value := DateTimeToStr(ResultSet.GetTimeStamp(I));
          stAsciiStream, stUnicodeStream: Value := ResultSet.GetBlob(I).GetString;
        else
          Value := ResultSet.GetString(I);
        end;
        if ResultSet.IsNull(I) then
          Value := '';

        NombreProducto := '';
        BuscaProducto(Value, NombreProducto);
        if NombreProducto <> '' then
               Value := NombreProducto;

        sgResults.Cells[I - 1, sgResults.RowCount - 1] := Value;
      end;
    end;

    WMax := 0;
    for i := 0 to (sgResults.RowCount - 1) do begin
    W := sgResults.Canvas.TextWidth(sgResults.Cells[0, i]);
    if W > WMax then
      WMax := W;
    end;
    sgResults.ColWidths[0] := WMax + 20;

  end;
  
  end;
except on e : exception do
  begin
    MessageDlg('Error general al consultar datos. '+e.Message, mtInformation,[mbOk], 0);
  end;
end;
end;

function TfrmLicencia.BuscaProducto(Clave:String; var Producto:String):Boolean;
begin
Producto := '';
  if Clave = '01' then
     Producto := 'Adendas';

  if Clave = '02' then
     Producto := 'Administra';

  if Clave = '03' then
     Producto := 'Etiquetas';

  if Clave = '04' then
     Producto := 'Facturacíon en línea';

  if Clave = '05' then
     Producto := 'Gestión de Manufactura';

  if Clave = '06' then
     Producto := 'Inventario';

  if Clave = '07' then
     Producto := 'Nuup';

  if Clave = '08' then
     Producto := 'PAL';

  if Clave = '09' then
     Producto := 'Requisiciones';

  if Clave = '10' then
     Producto := 'Taller';

  if Clave = '11' then
     Producto := 'Yantar';

  if Clave = '12' then
     Producto := 'PasaCat - PasaMov';

  if Clave = '13' then
     Producto := 'Generador CFD';

  if Clave = '14' then
     Producto := 'Facturas Periódicas';

  if Clave = '15' then
     Producto := 'Verificador de Precios';

  if Clave = '00' then
     Producto := 'Control Interno';

  if Clave = '96' then
     Producto := 'Nube';

  if Clave = '24' then
     Producto := 'PAL Nube';

  if Clave = '25' then
     Producto := 'Mesa de Verificación';
     
  if Clave = '26' then
     Producto := '4Q Sinc';


end;

function TfrmLicencia.RegistraEvento(Cuerpo:String):String;
var Error2 :String;
respuesta: TElStringList;
ResServidor :TStream;
systems : TStrings;
URL, returnval: string;
RespuestaPost:Integer;
begin
try
  begin
           try
              begin
                Result:= '';
                Error2 := '';
                gRespuesta := '';
                respuesta := TElStringList.Create;
                ResServidor := TStream.Create;
                HttpsClient.RequestParameters.CustomHeaders.Clear;
                HttpsClient.RequestParameters.CustomHeaders.Add('Content-Type:application/json');
                URL := 'http://xslicencias.servicios4q.com:3030/data/';
                RespuestaPost := HttpsClient.Post(URL,Cuerpo);
                respuesta := HttpsClient.ResponseHeaders;
                Error2 := HttpsClient.GetHeaderByName(respuesta, 'Host-Header');
                if RespuestaPost <> 200 then
                begin
                   Error2  := gRespuesta
                end else
                begin
                     Result := gRespuesta
                end;                                    
           end;
           finally
              begin
                HttpsClient.Close(true);
              end;
            end;
  end;
except on E : Exception do
  begin
    //MessageDlg('Error1: '+e.Message, mtInformation,[mbOk], 0);
  end;
end;

end;

procedure TfrmLicencia.VerificaRegistroConfig();
var PathIni, ResLicencia, ResActualiza:String;
    Sem: THandle;
begin
try
  begin
  ResLicencia := '';
  ResActualiza := '';
  gErrorAsociacion := 'N';
  
  PathIni := ExtractFileDir(Application.ExeName)+'\Licencia.ini';
  If not fileExists(PathIni) then
  Begin
    MessageDlg('El equipo no se encuentra registrado, registre el equipo para continuar.', mtInformation,[mbOk], 0);
    ShowModal;
    MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
    Application.Terminate;
  End else
  begin
    ActualizacionAutomatica();
     //
    gVerifActualizacion := 0;
    if frmLicencia.LeerLicencia('A',2,ResLicencia,ResActualiza) then
    begin
       if gActualizarFecha = 'S' then
          ActualizaFechaAcceso();


       if ResLicencia <> '' then
         MessageDlg(ResLicencia, mtInformation,[mbOk], 0);

       if ResActualiza = 'N' then
       begin
          MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
          EliminaEjecucion();
          Application.Terminate;
       end;

    end
    else
    begin
      if gActualizarFecha = 'S' then
          ActualizaFechaAcceso();

      if (ResLicencia <> '') and (gTieneInternet <> 'S') then
        MessageDlg(ResLicencia, mtInformation,[mbOk], 0);

      gVerifActualizacion := 1;

      if gTieneInternet = 'S' then
        frmLicencia.ShowModal;

      MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
      EliminaEjecucion();
      Application.Terminate;
    end;
  end;
  //Verifica si tiene concurrencias activadas
  if frmLicencia.gEsConcurrente = 'S' then
  begin
    frmLicencia.gVariableEjecucion := frmLicencia.UsuarioWindows;
    frmLicencia.ValidaEjecucion();
    Form1.tTimerLicencia.Interval := 1800000;
    Form1.tTimerLicencia.Enabled := True;
    
  end else
  begin
    Form1.tTimerLicencia.Enabled := False;
    Sem := CreateSemaphore(nil, 0, 1, Form1.NOMBRE_PRODUCTO);
    if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
    begin
      CloseHandle(Sem);
      ShowMessage(Form1.NOMBRE_PRODUCTO+' actualmente ya se esta ejecutando.');
      Halt;
    end;
  end;

  end;
except
  begin
     MessageDlg('Ocurrió un error al validar su licencia.', mtInformation,[mbOk], 0); 
     MessageDlg('La aplicación se cerrará.' + Chr(13) + 'Inicie nuevamente la aplicación.', mtInformation,[mbOk], 0);
     Application.Terminate;
  end;
end;
end;


initialization

   SetLicenseKey('9F9E1396AE7F6332436EE0F25CAE2331F908FF2D3971253C694E193700D72101' +
'788FFB37BE9AED96D0F0B4F0A2D24A2C89DB92B7CD42F059B2B597747AB74FCD' +
'93E1D93FB8421C189BF362658820501B64A4DC8DBD6D59B72063C6170B975A5A' +
'1CCB55152541D1C4669F14978334BEABF75087981A202E9C61B0F82124C5D38D' + 
'BC1BDCE243E34CC6EBC5C6A6E94248E45EC4797AB3EC71D47E481EBF9126F9C0' + 
'B6872B77AD000591301E49F09C8B7E9FFF634665854891E37A236AC866DB066A' +
'95C03E0AC1D5CE04BD12BDEE5B2D62897B5C4F449CBEB6E331AB10D037B5DD74' +
'11A78A5E182C04E7844C78B1E5F83E899A4802F722FE99C34CDA6214CA0A9AA7');


end.
