unit fmActivarTarjeta2;

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
  TfmActivarTar2 = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    edtNoTarjeta: TEdit;
    lblTitulo: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    edtAMaterno: TEdit;
    edtTel: TEdit;
    Button1: TButton;
    Button2: TButton;
    dbNombreCli: TwwDBComboDlg;
    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;
    procedure dbNombreCliCustomDlg(Sender: TObject);
    procedure dbNombreCliExit(Sender: TObject);
    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;

    procedure BuscarClientePorNombre(Var ClaveCli:String; Var NombreCliente:String; Var ClienteId:Integer);
    procedure SepararNombreCliente(Var NombreCliente:String);
  end;

var
  fmActivarTar2: TfmActivarTar2;

implementation

uses Unit1, UnitBuscCliNom, Unit101;

{$R *.dfm}

procedure TfmActivarTar2.Button1Click(Sender: TObject);
var lGuardar:Boolean;
lSesion, lNombreCajero, lNoTarjeta, lNombre, lAPaterno, lAMaterno, lTelefono, lEmail, lSexo, lFNacimiento, lCP, lMensajeError:String;
lVersionWS:String;
lFechaNacimiento:TXSDateTime;
lRolNadro, lClaveClienteId:Integer;
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;
  if lGuardar then
  begin
    IBQuery1.Close;
    IBQuery1.SelectSQL.Clear;
    IBQuery1.SelectSQL.Add('SELECT A.CLAVE_CLIENTE_ID FROM CLAVES_CLIENTES A WHERE A.CLAVE_CLIENTE=:CLAVE_CLIENTE');
    IBQuery1.ParamByName('CLAVE_CLIENTE').AsString:=edtNoTarjeta.Text;
    IBQuery1.Open;
    lClaveClienteId:=IBQuery1.FieldByName('CLAVE_CLIENTE_ID').AsInteger;

    if lClaveClienteId=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:='';

      if Form1.IniciarSesion(lSesion) then
      begin
        if Form1.ActivarTarjeta(lSesion,lNombreCajero,lNoTarjeta,lNombre,lAPaterno,lAMaterno,lTelefono,lEmail,lSexo,lCP,lMensajeError,lFechaNacimiento) then
        begin
          {$REGION '//guardar datos de tarjeta'}
          {Se comenta por que se genera nueva sesión x cada orden de venta
          lVersionWS:=Form1.ObtenerVersionWS();
          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:=FClienteId;
          IBQuery1.ParamByName('SESION').AsString:=lSesion;
          IBQuery1.ParamByName('ESTATUS').AsString:='N'; //N-Normal T-Teminada
          IBQuery1.ParamByName('VERSION_WEB_SERVICE').AsString:=lVersionWS;
          IBQuery1.ParamByName('FECHA').AsDate:=Now;
          IBQuery1.Open;
          }
          IBQuery1.Close;
          IBQuery1.SelectSQL.Clear;
          IBQuery1.SelectSQL.Add('UPDATE LIBRES_CLIENTES');
          IBQuery1.SelectSQL.Add('SET NOMBRE = :NOMBRE, APATERNO = :APATERNO, AMATERNO = :AMATERNO, USUARIO = :USUARIO, SEXO = :SEXO, FECHA_NACIMIENTO = :FECHA_NACIMIENTO ');
          IBQuery1.SelectSQL.Add('WHERE (CLIENTE_ID = :CLIENTE_ID)');
          IBQuery1.ParamByName('NOMBRE').AsString:=lNombre;
          IBQuery1.ParamByName('APATERNO').AsString:=lAPaterno;
          IBQuery1.ParamByName('AMATERNO').AsString:=lAMaterno;
          IBQuery1.ParamByName('USUARIO').AsString:=lNombreCajero;
          IBQuery1.ParamByName('SEXO').AsString:=lSexo;
          IBQuery1.ParamByName('FECHA_NACIMIENTO').AsDate:=dtpFechaNac.Date;
          IBQuery1.ParamByName('CLIENTE_ID').AsInteger:=FClienteId;
          IBQuery1.Open;

          //buscar si existe rol Nadro circulo
          IBQuery1.Close;
          IBQuery1.SelectSQL.Clear;
          IBQuery1.SelectSQL.Add('SELECT A.ROL_CLAVE_CLI_ID FROM ROLES_CLAVES_CLIENTES A WHERE A.NOMBRE=''Nadro circulo'' ');
          IBQuery1.Open;
          lRolNadro:=IBQuery1.FieldByName('ROL_CLAVE_CLI_ID').AsInteger;
          if lRolNadro=0 then
          begin
            //crear rol
            IBQuery1.Close;
            IBQuery1.SelectSQL.Clear;
            IBQuery1.SelectSQL.Add('INSERT INTO ROLES_CLAVES_CLIENTES (ROL_CLAVE_CLI_ID, NOMBRE, ES_PPAL, ES_GLN, USUARIO_CREADOR, FECHA_HORA_CREACION, USUARIO_AUT_CREACION, USUARIO_ULT_MODIF, FECHA_HORA_ULT_MODIF, USUARIO_AUT_MODIF)');
            IBQuery1.SelectSQL.Add('VALUES (:ROL_CLAVE_CLI_ID, :NOMBRE, ''N'', ''N'', :USUARIO_CREADOR, ''NOW'', NULL, :USUARIO_ULT_MODIF, ''NOW'', NULL)');
            spCatId.ExecProc;
            lRolNadro:=spCatId.FieldByName('CATALOGO_ID').AsInteger;
            IBQuery1.ParamByName('ROL_CLAVE_CLI_ID').AsInteger:=lRolNadro;
            IBQuery1.ParamByName('NOMBRE').AsString:='Nadro circulo';
            IBQuery1.ParamByName('USUARIO_CREADOR').AsString:=fmConfigConexion.G_NomUsuario;
            IBQuery1.ParamByName('USUARIO_ULT_MODIF').AsString:=fmConfigConexion.G_NomUsuario;
            IBQuery1.Open;
          end;
          //guardar número de tarjeta
          spCatId.ExecProc;
          IBQuery1.Close;
          IBQuery1.SelectSQL.Clear;
          IBQuery1.SelectSQL.Add('INSERT INTO CLAVES_CLIENTES (CLAVE_CLIENTE_ID, CLAVE_CLIENTE, CLIENTE_ID, ROL_CLAVE_CLI_ID)');
          IBQuery1.SelectSQL.Add('VALUES (:CLAVE_CLIENTE_ID, :CLAVE_CLIENTE, :CLIENTE_ID, :ROL_CLAVE_CLI_ID)');
          IBQuery1.ParamByName('CLAVE_CLIENTE_ID').AsInteger:=spCatId.FieldByName('CATALOGO_ID').AsInteger;
          IBQuery1.ParamByName('CLAVE_CLIENTE').AsString:=lNoTarjeta;
          IBQuery1.ParamByName('CLIENTE_ID').AsInteger:=FClienteId;
          IBQuery1.ParamByName('ROL_CLAVE_CLI_ID').AsInteger:=lRolNadro;
          IBQuery1.Open;

          if trTrans.InTransaction then
            trTrans.Commit;

          MessageDlg('La tarjeta se activo correctamente.', mtInformation,  [mbOk], 0);
          close();
          {$ENDREGION}
        end
        else
        begin
          MessageDlg('Error:'+lMensajeError, mtInformation,  [mbOk], 0);
          Exit;
        end;
      end
      else
      begin
        MessageDlg('La sesión con el servicio web NO esta disponible.', 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.', 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 TfmActivarTar2.Button2Click(Sender: TObject);
begin
  if trTrans.InTransaction then trTrans.Rollback;
    trTrans.StartTransaction;
  Close;
end;

procedure TfmActivarTar2.dbNombreCliCustomDlg(Sender: TObject);
begin
  With fmBuscCliNom do
  begin
      eClave.Text := dbNombreCli.Text;
      Tipo := '1';
      Parametros();
      dsBusca.CloseOpen(false);
      ShowModal;
  end;
end;

procedure TfmActivarTar2.dbNombreCliExit(Sender: TObject);
Var ClaveCli, Nombre, Estatus, NombreCli:String;
ClienteId, RegCli:Integer;
begin
ClienteId:=0;
RegCli:=0;
Nombre := dbNombreCli.Text;
If Nombre <> '' then
Begin
   BuscarClientePorNombre(ClaveCli, Nombre, ClienteId);
   If ClienteId > 0 then
   Begin
     IBQuery1.Close;
     IBQuery1.SelectSQL.Clear;
     IBQuery1.SelectSQL.Add('SELECT A.ESTATUS, A.NOMBRE, B.TELEFONO1, B.EMAIL, B.CODIGO_POSTAL');
     IBQuery1.SelectSQL.Add('FROM CLIENTES A');
     IBQuery1.SelectSQL.Add('INNER JOIN DIRS_CLIENTES B ON (A.CLIENTE_ID=B.CLIENTE_ID AND B.ES_DIR_PPAL=''S'')');
     IBQuery1.SelectSQL.Add('WHERE A.CLIENTE_ID = :CLIENTE_ID');
     IBQuery1.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
     IBQuery1.Open;
     Estatus:=IBQuery1.FieldByName('ESTATUS').AsString;
     NombreCli:=IBQuery1.FieldByName('NOMBRE').AsString;
     FTelefono:=IBQuery1.FieldByName('TELEFONO1').AsString;
     FEmail:=IBQuery1.FieldByName('EMAIL').AsString;
     FCP:=IBQuery1.FieldByName('CODIGO_POSTAL').AsString;

     if (Estatus = 'A') or (Estatus = 'C') then
      RegCli := 1;

     if Estatus = 'B' then
     begin
      if dbNombreCli.CanFocus then
        dbNombreCli.SetFocus;
      MessageDlg('El cliente está dado de baja.', mtError,[mbOk], 0);
      Exit;
     end;

     if Estatus = 'V' then
     begin
        if dbNombreCli.CanFocus then
          dbNombreCli.SetFocus;
        MessageDlg('El cliente está suspendido de ventas.', mtError,[mbOk], 0);
        Exit;
     end;

     if RegCli = 1 then
     begin
      SepararNombreCliente(NombreCli);
      edtNombre.Text:=FNomCli;
      edtAPaterno.Text:=FAPaternoCli;
      edtAMaterno.Text:=FAMaternoCli;
      edtTel.Text:=FTelefono;
      edtEmail.Text:=FEmail;
      edtCP.Text:=FCP;
      FClienteId:=ClienteId;
     end;

   End Else
   Begin
      if dbNombreCli.CanFocus then
        dbNombreCli.SetFocus;
      MessageDlg('La clave del cliente no se encuentra registrada.' +Chr(10)+ 'Puede localizar el cliente por medio de la clave o del nombre.'+Chr(10)+'Para buscarlo oprima la tecla F4.', mtInformation,[mbOk], 0);
      Exit;
   End;

End Else
Begin
  dbNombreCli.Text:='';
  FNomCli:='';
  FAPaternoCli:='';
  FAMaternoCli:='';
  FTelefono:='';
  FEmail:='';
  FCP:='';
  FClienteId:=0;
End;

end;

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

   trTrans.StartTransaction;

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

procedure TfmActivarTar2.BuscarClientePorNombre(Var ClaveCli:String; Var NombreCliente:String; Var ClienteId:Integer);
begin
    IBQuery1.Close;
    IBQuery1.SelectSQL.Clear;
    IBQuery1.SelectSQL.Add('SELECT CLIENTE_ID FROM CLIENTES WHERE NOMBRE= :NOMBRE');
    IBQuery1.ParamByName('NOMBRE').AsString := NombreCliente;
    IBQuery1.Open;
    ClienteId := IBQuery1.Fieldbyname('CLIENTE_ID').AsInteger;

    IBQuery1.Close;
    IBQuery1.SelectSQL.Clear;
    IBQuery1.SelectSQL.Add('SELECT CLAVE_CLIENTE FROM CLAVES_CLIENTES WHERE CLIENTE_ID = :CLIENTE_ID');
    IBQuery1.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
    IBQuery1.Open;
    ClaveCli := IBQuery1.Fieldbyname('CLAVE_CLIENTE').AsString;
end;

procedure TfmActivarTar2.SepararNombreCliente(Var NombreCliente:String);
var I,J,K, lEspacios, lLonCad:Integer;
begin
  lEspacios:=0;
  lLonCad:=Length(NombreCliente);

  for I := 0 to lLonCad do
  begin
    if NombreCliente[i]='' then
      Inc(lEspacios);
  end;

  if lEspacios>0 then
  begin
    I:=0;
    J:=0;
    K:=0;

    I := Pos(' ', Trim(NombreCliente));
    FNomCli:=Copy(NombreCliente, 0,I-1);

    NombreCliente:=Copy(NombreCliente, I+1,lLonCad);
    J := Pos(' ', Trim(NombreCliente));
    FAPaternoCli:=Copy(NombreCliente, 0,J-1);

    FAMaternoCli:=Copy(NombreCliente, J+1,lLonCad); 
  end; 
end;

end.
