unit fmActivarTarjeta;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Mask, wwdbedit, Wwdotdot, StdCtrls, ExtCtrls, DB, FIBDataSet,
  pFIBDataSet, FIBDatabase, pFIBDatabase, wwdbdatetimepicker, XSBuiltIns,
  FIBQuery, pFIBQuery, pFIBStoredProc;

type
  TfmActivarTar = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    edtNoTarjeta: TEdit;
    lblTitulo: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    edtAMaterno: TEdit;
    edtTel: TEdit;
    Button1: TButton;
    Button2: TButton;
    trTrans: TpFIBTransaction;
    IBQuery1: TpFIBDataSet;
    Label5: TLabel;
    edtNombre: TEdit;
    Label6: TLabel;
    edtAPaterno: TEdit;
    Label7: TLabel;
    edtEmail: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    edtCP: TEdit;
    Label10: TLabel;
    dtpFechaNac: TwwDBDateTimePicker;
    Label11: TLabel;
    cbSexo: TComboBox;
    spCatId: TpFIBStoredProc;
    spDoctoId: TpFIBStoredProc;
    dsFechaServidor: TpFIBDataSet;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FNomCli, FAPaternoCli,  FAMaternoCli, FTelefono, FEmail, FCP:String;
    FClienteId:Integer;
    FRegistrar:String;
    procedure Registrar(AClienteId:Integer; ANoTarjeta, AReferencia, ACP, ATelefono, AEmail, AContacto, ANombreCajero, ASesion, AVersionWS, ATipoMov:String);
  end;

var
  fmActivarTar: TfmActivarTar;

implementation

uses Unit1, UnitBuscCliNom, Unit101, fmRegistrar;

{$R *.dfm}

procedure TfmActivarTar.Button1Click(Sender: TObject);
var lGuardar:Boolean;
lSesion, lNombreCajero, lNoTarjeta, lNombre, lAPaterno, lAMaterno, lTelefono, lEmail, lSexo, lFNacimiento, lCP, lMensajeError:String;
lVersionWS:String;
lFechaNacimiento:TXSDateTime;
lRolNadro, lDirCliId, lCiudadId, lEstadoId, lPaisId, lClienteId:Integer;
lFechaHora:TDateTime;
lFolioTarjeta, lMensajeErrorVT, lReferencia, lContacto, lTipoMov:String;
begin
try
begin
  lGuardar:=True;
  if edtNoTarjeta.Text='' then
  begin
    if edtNoTarjeta.CanFocus then edtNoTarjeta.SetFocus;
    MessageDlg('El número de tarjeta es incorrecto.', mtInformation,  [mbOk], 0);
    lGuardar:=False;
  end;
  if edtNombre.Text='' then
  begin
    if edtNombre.CanFocus then edtNombre.SetFocus;
    MessageDlg('El nombre del cliente es incorrecto.', mtInformation,  [mbOk], 0);
    lGuardar:=False;
  end;
  if edtAPaterno.Text='' then
  begin
    if edtAPaterno.CanFocus then edtAPaterno.SetFocus;
    MessageDlg('El apellido paterno del cliente es incorrecto.', mtInformation,  [mbOk], 0);
    lGuardar:=False;
  end;
  if edtAMaterno.Text='' then
  begin
    if edtAMaterno.CanFocus then edtAMaterno.SetFocus;
    MessageDlg('El apellido materno del cliente es incorrecto.', mtInformation,  [mbOk], 0);
    lGuardar:=False;
  end;
  if edtTel.Text='' then
  begin
    if edtTel.CanFocus then edtTel.SetFocus;
    MessageDlg('El teléfono del cliente es incorrecto.', mtInformation,  [mbOk], 0);
    lGuardar:=False;
  end;
  if cbSexo.Text='' then
  begin
    if cbSexo.CanFocus then cbSexo.SetFocus;
    MessageDlg('El sexo del cliente es incorrecto.', mtInformation,  [mbOk], 0);
    lGuardar:=False;
  end;
  if dtpFechaNac.Text='' then
  begin
    if dtpFechaNac.CanFocus then dtpFechaNac.SetFocus;
    MessageDlg('La fecha de nacimiento del cliente es incorrecto.', mtInformation,  [mbOk], 0);
    lGuardar:=False;
  end;
  if edtCP.Text='' then
  begin
    if edtCP.CanFocus then edtCP.SetFocus;
    MessageDlg('El código postal del cliente es incorrecto.', mtInformation,  [mbOk], 0);
    lGuardar:=False;
  end;
  lClienteId:=Form1.FClienteId;
  if lClienteId=0 then
  begin
    IBQuery1.Close;
    IBQuery1.SelectSQL.Clear;
    IBQuery1.SelectSQL.Add('SELECT A.VALOR FROM MGNADRO_CONFIG A WHERE A.NOMBRE=''CLIENTE_ID'' ');
    IBQuery1.Open;
    try
    begin
      lClienteId:=StrToInt(IBQuery1.FieldByName('VALOR').AsString);
    end;
    except
      lClienteId:=0;
    end;
    if lClienteId=0 then
    begin
      MessageDlg('El Id del cliente de círculo de la salud es incorrecto. ', mtInformation,  [mbOk], 0);
      lGuardar:=False;
    end;
  end;
  if lGuardar then
  begin
    IBQuery1.Close;
    IBQuery1.SelectSQL.Clear;
    IBQuery1.SelectSQL.Add('SELECT A.DIR_CLI_ID FROM DIRS_CLIENTES A WHERE A.NOMBRE_CONSIG=:NOMBRE_CONSIG AND A.CLIENTE_ID=:CLIENTE_ID');
    IBQuery1.ParamByName('NOMBRE_CONSIG').AsString:=edtNoTarjeta.Text;
    IBQuery1.ParamByName('CLIENTE_ID').AsInteger:=lClienteId;
    IBQuery1.Open;
    lDirCliId:=IBQuery1.FieldByName('DIR_CLI_ID').AsInteger;

    if lDirCliId=0 then
    begin
    {$REGION '//Tarjeta no registrada'}
    //Login+ActivateCardUser
    if Form1.VerificarConexionWS then
    begin
      {$REGION '//Web Service Conectado'}
      lSesion:='';
      lNombreCajero:=fmConfigConexion.G_NomUsuario;
      lNoTarjeta:=edtNoTarjeta.Text;
      lNombre:=edtNombre.Text;
      lAPaterno:=edtAPaterno.Text;
      lAMaterno:=edtAMaterno.Text;
      lTelefono:=edtTel.Text;
      if edtEmail.Text<>'' then lEmail:=edtEmail.Text
      else lEmail:='';
      if cbSexo.Text='Masculino' then lSexo:='M'
      else lSexo:='F';
      lFechaNacimiento := TXSDateTime.Create;
      lFechaNacimiento.AsDateTime:=dtpFechaNac.Date;
      lCP:=edtCP.Text;
      lMensajeError:='';
      lReferencia:=cbSexo.Text+' '+dtpFechaNac.Text;
      lContacto:=lNombre+' '+lAPaterno+' '+lAMaterno;
      FRegistrar:='N';
      lMensajeErrorVT:='';

      if Form1.IniciarSesion(lSesion) then
      begin
        {$REGION '//registro sesión'}
        lVersionWS:='';
        //Ya no se consulta por que ya no se registra nueva sesión lVersionWS:=Form1.ObtenerVersionWS();

        if Form1.ActivarTarjeta(lSesion,lNombreCajero,lNoTarjeta,lNombre,lAPaterno,lAMaterno,lTelefono,lEmail,lSexo,lCP,lMensajeError,lFechaNacimiento) then
        begin
          {$REGION '//guardar datos de tarjeta'}
          Registrar(lClienteId, lNoTarjeta, lReferencia, lCP, lTelefono, lEmail, lContacto, lNombreCajero, lSesion, lVersionWS, 'A');
          {$ENDREGION}
        end
        else
        begin
          {$REGION ''}
          //if 'Tarjeta ya se encuentra activada'=lMensajeError then
          if 'Número de Tarjeta ya se encuentra activada'=lMensajeError then //WS Pruebs
          begin
            if Form1.ValidarTarjeta(lSesion, lNoTarjeta, lMensajeErrorVT, lFolioTarjeta)=False then
            begin
              MessageDlg('Error al validar tarjeta:'+lMensajeErrorVT, mtInformation,  [mbOk], 0);
              Exit;
            end
            else
            begin
              frmRegistrar.ShowModal;
              if FRegistrar='S' then
              begin
                Registrar(lClienteId, lNoTarjeta, lReferencia, lCP, lTelefono, lEmail, lContacto, lNombreCajero, lSesion, lVersionWS, 'R');
              end
              else
              begin
                Exit;
              end;
            end;
          end
          else
          begin
            MessageDlg('Error:'+lMensajeError, mtInformation,  [mbOk], 0);
            Exit;
          end;
          {$ENDREGION}
        end;
        {$ENDREGION}
      end
      else
      begin
        MessageDlg('La sesión con el servicio web NO esta disponible.'+#13+lSesion, mtInformation,  [mbOk], 0);
        Exit;
      end;
    {$ENDREGION}
    end
    else
    begin
       MessageDlg('El servicio web NO esta disponible.', mtInformation,  [mbOk], 0);
       Exit;
    end;
    {$ENDREGION}
    end
    else
    begin
      MessageDlg('Número de tarjeta registrado en Microsip.', mtInformation,  [mbOk], 0);
      Exit;
    end;
  end;
end;
except on e:exception do
begin
  if trTrans.InTransaction then trTrans.Rollback;
    trTrans.StartTransaction;
  MessageDlg('Error general.'+e.Message, mtInformation,[mbOk], 0);
  lFechaNacimiento.Free;
end;
end;

end;

procedure TfmActivarTar.Button2Click(Sender: TObject);
begin
  if trTrans.InTransaction then trTrans.Rollback;
    trTrans.StartTransaction;
  Close;
end;

procedure TfmActivarTar.FormShow(Sender: TObject);
begin
  if trTrans.InTransaction then
        trTrans.Rollback;

   trTrans.StartTransaction;

   edtNoTarjeta.Text:='';
   edtNombre.Text:='';
   edtAPaterno.Text:='';
   edtAMaterno.Text:='';
   edtTel.Text:='';
   edtEmail.Text:='';
   cbSexo.Text:='';
   dtpFechaNac.Text:='';
   edtCP.Text:='';
end;

procedure TfmActivarTar.Registrar(AClienteId:Integer; ANoTarjeta, AReferencia, ACP, ATelefono, AEmail, AContacto, ANombreCajero, ASesion, AVersionWS, ATipoMov:String);
var lDirCliId, lCiudadId, lEstadoId, lPaisId:Integer;
lFechaHora:TDateTime;
lMov:String;
begin
  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('SELECT FIRST 1 A.CIUDAD_ID, A.ESTADO_ID, B.PAIS_ID');
  IBQuery1.SelectSQL.Add('FROM CIUDADES A');
  IBQuery1.SelectSQL.Add('INNER JOIN ESTADOS B ON (B.ESTADO_ID=A.ESTADO_ID)');
  IBQuery1.SelectSQL.Add('ORDER BY A.ES_PREDET DESC');
  IBQuery1.Open;
  lCiudadId:=IBQuery1.FieldByName('CIUDAD_ID').AsInteger;
  lEstadoId:=IBQuery1.FieldByName('ESTADO_ID').AsInteger;
  lPaisId:=IBQuery1.FieldByName('PAIS_ID').AsInteger;

  spCatId.ExecProc;
  lDirCliId:=spCatId.FieldByName('CATALOGO_ID').AsInteger;

  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('INSERT INTO DIRS_CLIENTES (DIR_CLI_ID, CLIENTE_ID, NOMBRE_CONSIG, CALLE, NOMBRE_CALLE, NUM_EXTERIOR, ');
  IBQuery1.SelectSQL.Add('NUM_INTERIOR, COLONIA, POBLACION, REFERENCIA, CIUDAD_ID, ESTADO_ID, CODIGO_POSTAL, PAIS_ID, TELEFONO1, ');
  IBQuery1.SelectSQL.Add('TELEFONO2, FAX, EMAIL, RFC_CURP, CONTACTO, VIA_EMBARQUE_ID, ES_DIR_PPAL, USAR_PARA_ENVIOS, USAR_PARA_FACTURAR, GLN)');
  IBQuery1.SelectSQL.Add('VALUES (:DIR_CLI_ID, :CLIENTE_ID, :NOMBRE_CONSIG, NULL, NULL, NULL,');
  IBQuery1.SelectSQL.Add('NULL, NULL, NULL, :REFERENCIA, :CIUDAD_ID, :ESTADO_ID, :CODIGO_POSTAL, :PAIS_ID, :TELEFONO1,');
  IBQuery1.SelectSQL.Add('NULL, NULL, :EMAIL, NULL, :CONTACTO, NULL, ''N'', ''N'', ''S'', NULL)');
  IBQuery1.ParamByName('DIR_CLI_ID').AsInteger:=lDirCliId;
  IBQuery1.ParamByName('CLIENTE_ID').AsInteger:=AClienteId;
  IBQuery1.ParamByName('NOMBRE_CONSIG').AsString:=ANoTarjeta;
  IBQuery1.ParamByName('REFERENCIA').AsString:=AReferencia;//cbSexo.Text+' '+dtpFechaNac.Text;
  IBQuery1.ParamByName('CIUDAD_ID').AsInteger:=lCiudadId;
  IBQuery1.ParamByName('ESTADO_ID').AsInteger:=lEstadoId;
  IBQuery1.ParamByName('CODIGO_POSTAL').AsString:=ACP;
  IBQuery1.ParamByName('PAIS_ID').AsInteger:=lPaisId;
  IBQuery1.ParamByName('TELEFONO1').AsString:=ATelefono;
  IBQuery1.ParamByName('EMAIL').AsString:=AEmail;
  IBQuery1.ParamByName('CONTACTO').AsString:=AContacto;//lNombre+' '+lAPaterno+' '+lAMaterno;
  IBQuery1.Open;

  //Actualizó fecha ultima modificación
  dsFechaServidor.CloseOpen(False);
  lFechaHora:=dsFechaServidor.FieldByName('FECHA').AsDateTime;
  lFechaHora:=lFechaHora+dsFechaServidor.FieldByName('HORA').AsDateTime;

  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('UPDATE CLIENTES ');
  IBQuery1.SelectSQL.Add('SET USUARIO_ULT_MODIF = :USUARIO_ULT_MODIF, ');
  IBQuery1.SelectSQL.Add('FECHA_HORA_ULT_MODIF = :FECHA_HORA_ULT_MODIF ');
  IBQuery1.SelectSQL.Add('WHERE (CLIENTE_ID = :CLIENTE_ID);');
  IBQuery1.ParamByName('USUARIO_ULT_MODIF').AsString:=ANombreCajero;
  IBQuery1.ParamByName('FECHA_HORA_ULT_MODIF').AsDateTime:=lFechaHora;
  IBQuery1.ParamByName('CLIENTE_ID').AsInteger:=AClienteId;
  IBQuery1.Open;

  {Se comenta por que se genera nueva sesión x cada orden de venta
  //Generó una sesión del consignatario
  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('INSERT INTO MGNADRO_SESIONES (ID_SESION, CLIENTE_ID, SESION, ESTATUS, VERSION_WEB_SERVICE, FECHA)');
  IBQuery1.SelectSQL.Add('VALUES (:ID_SESION, :CLIENTE_ID, :SESION, :ESTATUS, :VERSION_WEB_SERVICE, :FECHA)');
  spDoctoId.ExecProc;
  IBQuery1.ParamByName('ID_SESION').AsInteger:=spDoctoId.FieldByName('DOCTO_ID').AsInteger;
  IBQuery1.ParamByName('CLIENTE_ID').AsInteger:=lDirCliId;
  IBQuery1.ParamByName('SESION').AsString:=ASesion;
  IBQuery1.ParamByName('ESTATUS').AsString:='N'; //N-Normal T-Teminada
  IBQuery1.ParamByName('VERSION_WEB_SERVICE').AsString:=AVersionWS;
  IBQuery1.ParamByName('FECHA').AsDate:=Now;
  IBQuery1.Open;
  }
  if trTrans.InTransaction then
    trTrans.Commit;

  if ATipoMov='A' then
    lMov:='activo'
  else lMov:='registro';

  MessageDlg('La tarjeta se '+lMov+' correctamente.', mtInformation,  [mbOk], 0);
    close();
end;

end.
