unit frmComprasPaciente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, FIBDataSet, pFIBDataSet, FIBDatabase, pFIBDatabase, StdCtrls,
  ExtCtrls, WSCirculodelasalud, FIBQuery, pFIBQuery, pFIBStoredProc;

type
  TfmComprasPaciente = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    Label2: TLabel;
    edtNoTarjeta: TEdit;
    Button1: TButton;
    Button2: TButton;
    trTrans: TpFIBTransaction;
    IBQuery1: TpFIBDataSet;
    spDoctoId: TpFIBStoredProc;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FVersion:Integer;
    procedure Inicio();
    procedure Eliminar();
    function ListaCompras(var ASesion, ANoTarjeta, AMensajeError:String):Boolean;
    function Insertar(lFecha:TDateTime; lFarmacia, lClaveArt, lArticulo, lPromocion, lSesion, lNoTarjeta:String; lPiezaCom, lPizasRegaladas, lPiezasPendEntregar:Integer; lImpteDscto, lPctajeDscto:Double):Boolean;
  end;

var
  fmComprasPaciente: TfmComprasPaciente;

implementation
uses Unit1, frmListCompras;

{$R *.dfm}
procedure TfmComprasPaciente.Inicio();
begin
  if trTrans.InTransaction then
        trTrans.Rollback;
  trTrans.StartTransaction;
  edtNoTarjeta.Text:='';
  if edtNoTarjeta.CanFocus then
    edtNoTarjeta.SetFocus;
end;

procedure TfmComprasPaciente.Button1Click(Sender: TObject);
var lGuardar:Boolean;
lClienteId, lDirCliId:Integer;
lSesion, lNoTarjeta, lMensajeError, lFolioTarjeta: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 FVersion=1 then
    begin
      {$REGION 'FVersion=1'}
      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;
      end;

      if lClienteId=0 then
      begin
          lGuardar:=False;
          MessageDlg('El Id del cliente de círculo de la salud es incorrecto. ', mtInformation,  [mbOk], 0);
      end
      else
      begin
        {$REGION BUSCAR CONSIGNATARIO DE CLIENTE CIRCULO}
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('SELECT A.DIR_CLI_ID, A.NOMBRE_CONSIG 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;
        lNoTarjeta:=IBQuery1.FieldByName('NOMBRE_CONSIG').AsString;
        if lDirCliId=0 then
        begin
          lGuardar:=False;
          MessageDlg('Número de tarjeta NO registrado en Microsip.', mtInformation,  [mbOk], 0);
        end;
        {$ENDREGION}
      end;
      {$ENDREGION}
    end
    else
    begin
      {$REGION 'FVersion=2'}
      IBQuery1.Close;
      IBQuery1.SelectSQL.Clear;
      IBQuery1.SelectSQL.Add('SELECT A.CLIENTE_ID, A.CLAVE_CLIENTE FROM CLAVES_CLIENTES A');
      IBQuery1.SelectSQL.Add('INNER JOIN ROLES_CLAVES_CLIENTES B ON (B.ROL_CLAVE_CLI_ID=A.ROL_CLAVE_CLI_ID AND B.NOMBRE=''Nadro circulo'')');
      IBQuery1.SelectSQL.Add('WHERE A.CLAVE_CLIENTE=:CLAVE_CLIENTE');
      IBQuery1.ParamByName('CLAVE_CLIENTE').AsString:=edtNoTarjeta.Text;
      IBQuery1.Open;
      lDirCliId:=IBQuery1.FieldByName('CLIENTE_ID').AsInteger;
      lNoTarjeta:=IBQuery1.FieldByName('CLAVE_CLIENTE').AsString;
      if lDirCliId=0 then
      begin
        lGuardar:=False;
        MessageDlg('Número de tarjeta NO registrado en Microsip.', mtInformation,  [mbOk], 0);
      end;
      {$ENDREGION}
    end;
    
    if lGuardar then
    begin
        lSesion:='';
        if Form1.IniciarSesion(lSesion) then
        begin
          lMensajeError:='';
          if Form1.ValidarTarjeta(lSesion, lNoTarjeta, lMensajeError, lFolioTarjeta)=False then
          begin
            MessageDlg('Error al validar tarjeta No:'+lNoTarjeta+#13+lMensajeError, mtInformation,  [mbOk], 0);
            Exit;
          end;
          if lFolioTarjeta<>'' then
          begin
            {$REGION 'Tarjeta valida'}
            lMensajeError:='';
            if ListaCompras(lSesion, lNoTarjeta, lMensajeError)=False then
            begin
              MessageDlg('Error al consultar histórico de compras:'+#13+lMensajeError, mtInformation,  [mbOk], 0);
              Exit;
            end
            else
            begin
              fmListCompras.FSesion:=lSesion;
              fmListCompras.FTarjeta:=lNoTarjeta;
              fmListCompras.ShowModal;
            end;
            {$ENDREGION}
          end;
        end
        else
        begin
          MessageDlg('La sesión con el servicio web NO esta disponible.'+#13+lSesion, 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);
  end;
  end;
end;

procedure TfmComprasPaciente.Button2Click(Sender: TObject);
begin
  Close;
end;

procedure TfmComprasPaciente.FormClose(Sender: TObject;
  var Action: TCloseAction);
var I:Integer;
begin
  Eliminar();
  if trTrans.InTransaction then
    trTrans.Rollback;

  for I := 0 to trTrans.FIBDataSetsCount - 1 do
    trTrans.FIBDataSets[I].Close;
  trTrans.CloseAllQueryHandles;
  trTrans.Active := False;
end;

procedure TfmComprasPaciente.FormShow(Sender: TObject);
begin
  Inicio();
end;

function TfmComprasPaciente.ListaCompras(var ASesion, ANoTarjeta, AMensajeError:String):Boolean;
var lRespuestaHistCompras:ResponseStatementPatientProducts;
lHuboError, HayDetalles, lHuboErrorList:Boolean;
lRespuestalLDetalles:ArrayOfDetalleCompras;
lFecha:TDateTime;
lFarmacia, lClaveArt, lArticulo, lPromocion, lFechaO, lPiezaComO, lPizasRegaladasO,
lPiezasPendEntregarO, lImpteDsctoO, lPctajeDsctoO:String;
I, lPiezaCom, lPizasRegaladas, lPiezasPendEntregar:Integer;
lImpteDscto, lPctajeDscto:Double;
begin
  sysutils.ShortDateFormat := 'mm/dd/yyyy';
  //sysutils.ShortDateFormat := 'dd/mm/yyyy';
  try
  lRespuestaHistCompras:=ResponseStatementPatientProducts.Create;
  lRespuestaHistCompras:=GetWSCirculodelaSaludSoap.GetStatementPatientProducts(ASesion, ANoTarjeta);
  lHuboError:=lRespuestaHistCompras.IsError;
  if lHuboError then
  begin
    AMensajeError:=lRespuestaHistCompras.Mensaje;
    Result:=False;
  end
  else
  begin
    AMensajeError:='';
    HayDetalles:=lRespuestaHistCompras.HayDetalles;
    if HayDetalles=True then
    begin
      Eliminar();

      lRespuestalLDetalles:=lRespuestaHistCompras.Detalles;
      for I := 0 to Length(lRespuestalLDetalles) - 1 do
      begin
        lFechaO:=lRespuestalLDetalles[I].Fecha;
        lFarmacia:=lRespuestalLDetalles[I].Farmacia;
        lClaveArt:=lRespuestalLDetalles[I].Codigo;
        lArticulo:=lRespuestalLDetalles[I].Presentacion;
        lPiezaComO:=lRespuestalLDetalles[I].PiezasCompradas;
        lPizasRegaladasO:=lRespuestalLDetalles[I].ObsequiosEntregados;
        lPiezasPendEntregarO:=lRespuestalLDetalles[I].ObsequiosPendientes;
        lImpteDsctoO:=lRespuestalLDetalles[I].DescuentosMonto;
        lPctajeDsctoO:=lRespuestalLDetalles[I].DescuentosPorcentaje;
        lPromocion:=lRespuestalLDetalles[I].Programa;
        try
          begin
            lFecha:=StrToDate(lFechaO);
            lPiezaCom:=StrToInt(lPiezaComO);
            lPizasRegaladas:=StrToInt(lPizasRegaladasO);
            lPiezasPendEntregar:=StrToInt(lPiezasPendEntregarO);
            lImpteDscto:=StrToFloat(lImpteDsctoO);
            lPctajeDscto:=StrToFloat(lPctajeDsctoO);
          end;
        except on e:exception do
        begin
          Result:=False;
          AMensajeError:='Error al insertar registro.'+e.Message;
          Exit;
        end;
        end;
            
        if Insertar(lFecha, lFarmacia, lClaveArt, lArticulo, lPromocion, ASesion, ANoTarjeta, lPiezaCom, lPizasRegaladas, lPiezasPendEntregar, lImpteDscto, lPctajeDscto)=False then
        begin
          Result:=False;
          AMensajeError:='Error al insertar registro.';
          Exit;
        end;
      end;
    end;
    if AMensajeError='' then
    begin
      Result:=True;
    end
    else
    begin
      Result:=False;
    end;
  end;
  finally
  begin
    lRespuestaHistCompras.Free;
  end;
  end;
end;

procedure TfmComprasPaciente.Eliminar();
begin
try
  begin
    IBQuery1.Close;
    IBQuery1.SelectSQL.Clear;
    IBQuery1.SelectSQL.Add('DELETE FROM MGNADRO_HIST_COMPRAS;');
    IBQuery1.Open;
  end;
  except on e:exception do
  begin
    if trTrans.InTransaction then trTrans.Rollback;
      trTrans.StartTransaction;
    MessageDlg('Error al eliminar registros.'+e.Message, mtInformation,[mbOk], 0);
  end;
  end;
end;

function TfmComprasPaciente.Insertar(lFecha:TDateTime; lFarmacia, lClaveArt, lArticulo, lPromocion, lSesion, lNoTarjeta:String; lPiezaCom, lPizasRegaladas, lPiezasPendEntregar:Integer; lImpteDscto, lPctajeDscto:Double):Boolean;
begin
try
  begin
    IBQuery1.Close;
    IBQuery1.SelectSQL.Clear;
    IBQuery1.SelectSQL.Add('INSERT INTO MGNADRO_HIST_COMPRAS (HIST_COMPRA_ID, FECHA, FARMACIA, CLAVE_ARTICULO, ARTICULO, PIEZAS_COMPRADAS, PIEZAS_REGALADAS, PIEZAS_PEND_ENTREGAR, IMPTE_DSCTO, PCTJE_DSCTO, PROMOCION, SESION, NO_TARJETA)');
    IBQuery1.SelectSQL.Add('VALUES (:HIST_COMPRA_ID, :FECHA, :FARMACIA, :CLAVE_ARTICULO, :ARTICULO, :PIEZAS_COMPRADAS, :PIEZAS_REGALADAS, :PIEZAS_PEND_ENTREGAR, :IMPTE_DSCTO, :PCTJE_DSCTO, :PROMOCION, :SESION, :NO_TARJETA);');
    spDoctoId.ExecProc;
    IBQuery1.ParamByName('HIST_COMPRA_ID').AsInteger:=spDoctoId.FieldByName('DOCTO_ID').AsInteger;
    IBQuery1.ParamByName('FECHA').AsDateTime:=lFecha;
    IBQuery1.ParamByName('FARMACIA').AsString:=lFarmacia;
    IBQuery1.ParamByName('CLAVE_ARTICULO').AsString:=lClaveArt;
    IBQuery1.ParamByName('ARTICULO').AsString:=lArticulo;
    IBQuery1.ParamByName('PIEZAS_COMPRADAS').AsInteger:=lPiezaCom;
    IBQuery1.ParamByName('PIEZAS_REGALADAS').AsInteger:=lPizasRegaladas;
    IBQuery1.ParamByName('PIEZAS_PEND_ENTREGAR').AsInteger:=lPiezasPendEntregar;
    IBQuery1.ParamByName('IMPTE_DSCTO').AsFloat:=lImpteDscto;
    IBQuery1.ParamByName('PCTJE_DSCTO').AsFloat:=lPctajeDscto;
    IBQuery1.ParamByName('PROMOCION').AsString:=lPromocion;
    IBQuery1.ParamByName('SESION').AsString:=lSesion;
    IBQuery1.ParamByName('NO_TARJETA').AsString:=lNoTarjeta;
    IBQuery1.Open;
    Result:=True;
  end;
  except on e:exception do
  begin
    Result:=False;
    if trTrans.InTransaction then trTrans.Rollback;
      trTrans.StartTransaction;
    MessageDlg('Error al insertar registros.'+e.Message, mtInformation,[mbOk], 0);
  end;
  end;
end;




end.
