unit fmPromociones;

interface

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

type
  TfmPromos = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    dbgArticulos: TwwDBGrid;
    Panel2: TPanel;
    trTrans: TpFIBTransaction;
    dsDetPromo: TpFIBDataSet;
    dsoDetPromo: TDataSource;
    dsDetPromoNOMBRE: TFIBStringField;
    dsDetPromoCLAVE_ARTICULO: TFIBStringField;
    GroupBox2: TGroupBox;
    Label2: TLabel;
    Label5: TLabel;
    dblkpcmbNombreCli: TwwDBLookupCombo;
    Label3: TLabel;
    Label4: TLabel;
    dbdtpFecha: TwwDBDateTimePicker;
    dbeFolio: TwwDBEdit;
    Label6: TLabel;
    dbedtTarjeta: TwwDBEdit;
    dblkpcmbClaveCli: TwwDBLookupCombo;
    dsEncPromo: TpFIBDataSet;
    dsoEncPromo: TDataSource;
    dblkpcmbAlmacen: TwwDBLookupCombo;
    dsDetPromoPIEZASGRATIS: TFIBIntegerField;
    dsDetPromoPRECIOFIJO: TFIBBCDField;
    dsDetPromoMONTODESCUENTO: TFIBBCDField;
    dsDetPromoPORCENTAJEDESCUENTO: TFIBBCDField;
    dsEncPromoFOLIO: TFIBStringField;
    dsEncPromoFECHA: TFIBDateField;
    dsEncPromoCLIENTE: TFIBStringField;
    dsEncPromoCLAVE_CLIENTE: TFIBStringField;
    dsEncPromoALMACEN: TFIBStringField;
    dsEncPromoNO_TARJETA: TFIBStringField;
    IBQuery1: TpFIBDataSet;
    dsAlmacenes: TpFIBDataSet;
    dsAlmacenesALMACEN_ID: TFIBIntegerField;
    dsAlmacenesNOMBRE: TFIBStringField;
    dsClientes: TpFIBDataSet;
    dsClientesCLIENTE_ID: TFIBIntegerField;
    dsClientesNOMBRE: TFIBStringField;
    dsClavesCli: TpFIBDataSet;
    dsClavesCliCLIENTE_ID: TFIBIntegerField;
    dsClavesCliCLAVE_CLIENTE: TFIBStringField;
    dsEncPromoCLIENTE_ID: TFIBIntegerField;
    dsDetPromoDOCTO_PV_DET_ID: TFIBIntegerField;
    dsEncPromoALMACEN_ID: TFIBIntegerField;
    spDoctoId: TpFIBStoredProc;
    dsEncPromoDOCTO_PV_ID: TFIBIntegerField;
    dsDetPromoID_PROMO: TFIBIntegerField;
    dsDetPromoARTICULO_ID: TFIBIntegerField;
    dsDetPromoPIEZASPENDIENTES: TFIBIntegerField;
    dsDetPromoPRECIO_UNITARIO: TFIBFloatField;
    dsPfzer: TpFIBDataSet;
    dsDetPromoLINEA_ARTICULO_ID: TFIBIntegerField;
    dsDetPromoUNIDADES_VENDIDAS: TFIBFloatField;
    spPrecioImpto: TpFIBStoredProc;
    Label1: TLabel;
    Button2: TButton;
    Button3: TButton;
    dsPizasGratisPen: TpFIBDataSet;
    dsExistenciasArt: TpFIBDataSet;
    dsFechaServidor: TpFIBDataSet;
    dsDetPromoPIEZASPENDIENTESNADRO: TFIBIntegerField;
    dsDetPromoPIEZASPORCOMPRAR: TFIBFloatField;
    dsDetPromoPCTJE_DSCTO: TFIBFloatField;
    dsDetPromoPRECIO_UNITARIO_PV_DET: TFIBFloatField;
    dsDetPromoPRECIO_TOTAL_NETO: TFIBBCDField;
    spPrecioArt: TpFIBStoredProc;
    dsEncPromoVENDEDOR_ID: TFIBIntegerField;
    procedure FormShow(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    FOrdenVentaId, FSesionId, FVersion, FListaPVM, FVendedor:Integer;
    FPrecioUni, FPrecioUniImpto:Double;

    { Public declarations }
     procedure AplicarPromociones();
     procedure InsertRenglon(ClaveArt:String; DoctoPvId, ArtId, Unidades:Integer);
     procedure EliminaRenglon(DoctoPvDetId:Integer);
     procedure Inicio();
     procedure Precios(ArtId:Integer);
     function Existencia(lArtId:Integer; lUnidades:Integer; var TExistencia:Integer):Boolean;
  end;

var
  fmPromos: TfmPromos;

implementation

{$R *.dfm}
uses Unit1;

procedure TfmPromos.AplicarPromociones();
var lPzsGrastis, lPosicion, lLineaId, lTotalPzsComprar, lPzsNoEntregadas, lPzsEntregadas,
lPzsEntregarGra, lExistencia, lpzsDisponibles, lpzsDisponibles1, lPzsEntregar:Integer;
lMontoDescto, lPorcentajeDescto, lUniVen, lUniPfizer, lDsctoAct, lDsctoFin, lPrecioMostrador, lMontoDes, lMontoDes1, lMontoDes2:Double;
lPrecioUni:Double;
lConImpto:String;
lAplicarPzs, Registrar, RegistrarGra:Boolean;
AceptarSExi, lMsgError, lPzsPendxFalExi, lSNExistencia, lPrecioUniIncorrecto:String;
begin
try
begin
  lAplicarPzs := False;

  if dsPizasGratisPen.FieldByName('PIEZASPENDIENTESNADRO').AsInteger>0 then
  begin
    if MessageDlg('¿Desea aplicar únicamente sus piezas gratis pendientes? ' , mtConfirmation,  [mbYes, mbNo], 0) = mrYes then
    begin
      lAplicarPzs := True;
    end;
  end;

  FListaPVM := 0;
  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('SELECT A.ELEMENTO_ID, A.VALOR FROM MGNADRO_CONFIG A WHERE A.NOMBRE = ''LISTAPVM''');
  IBQuery1.Open;
  FListaPVM := IBQuery1.FieldByName('VALOR').AsInteger;
  if FListaPVM=0 then
    FListaPVM := 42; //Precio de lista

  //verificar existencias si esta seleccionada la opción de aceptar salidas sin existencia en preferencias de la empresa de inventarios
  {dsExistenciasArt.Close;
  dsExistenciasArt.SelectSQL.Clear;
  dsExistenciasArt.SelectSQL.Add('SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE=''ACEPTAR_SIN_EXIS''');
  dsExistenciasArt.Open;
  AceptarSExi :=  dsExistenciasArt.FieldByName('VALOR').AsString;
  if AceptarSExi='' then
    AceptarSExi := 'N';}

  dsExistenciasArt.Close;
  dsExistenciasArt.SelectSQL.Clear;
  dsExistenciasArt.SelectSQL.Add('SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE=''INTEG_IN_PV''');
  dsExistenciasArt.Open;
  if (dsExistenciasArt.FieldByName('VALOR').AsString = '') or (dsExistenciasArt.FieldByName('VALOR').AsString = 'N') then
  begin
    AceptarSExi := 'S';
  end
  else
  begin

  dsExistenciasArt.Close;
  dsExistenciasArt.SelectSQL.Clear;
  dsExistenciasArt.SelectSQL.Add('SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE=''VERIFICAR_EXISTENCIAS''');
  dsExistenciasArt.Open;
  AceptarSExi :=  dsExistenciasArt.FieldByName('VALOR').AsString;
  if AceptarSExi='X' then
    AceptarSExi := 'N'
  else AceptarSExi := 'S';

  end;

  lMsgError := '';
  lPzsPendxFalExi := '';

  //modificar orden de venta
  dsDetPromo.First;
  while not dsDetPromo.Eof do
  begin
    if not lAplicarPzs then
    begin
      {$REGION 'Normal'}
      lPzsGrastis:=dsDetPromo.FieldByName('PIEZASGRATIS').AsInteger;
      lMontoDescto:=dsDetPromo.FieldByName('MONTODESCUENTO').AsFloat;
      lPorcentajeDescto:=dsDetPromo.FieldByName('PORCENTAJEDESCUENTO').AsFloat;
      lUniVen:=dsDetPromo.FieldByName('UNIDADES_VENDIDAS').AsFloat;
      lDsctoAct:=dsDetPromo.FieldByName('PCTJE_DSCTO').AsFloat;
      lPrecioUni:=dsDetPromo.FieldByName('PRECIO_UNITARIO').AsFloat;
      lPrecioMostrador:=lPrecioUni*lUniVen;
      lTotalPzsComprar := dsDetPromo.FieldByName('PIEZASPORCOMPRAR').AsInteger;

      Registrar := True;
      lExistencia := 0;
      lSNExistencia := 'N';
      if AceptarSExi='N' then
      begin
        //revisar si se tiene existencia de las unidades a comprar
        if not Existencia(dsDetPromo.FieldByName('ARTICULO_ID').AsInteger, lTotalPzsComprar, lExistencia) then
        begin
          Registrar := False;
          lSNExistencia := 'S';
        end;
      end;

      Precios(dsDetPromo.FieldByName('ARTICULO_ID').AsInteger);

      lPrecioUniIncorrecto := 'N';
      if (FPrecioUni = 0) and (FPrecioUniImpto = 0) then
      begin
        Registrar := False;
        lPrecioUniIncorrecto := 'S';
      end;

      if Registrar then
      begin
        {$REGION 'MyRegion'}
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('UPDATE DOCTOS_PV_DET SET UNIDADES = :UNIDADES WHERE (DOCTO_PV_DET_ID = :DOCTO_PV_DET_ID);');
        IBQuery1.ParamByName('UNIDADES').AsFloat:=dsDetPromo.FieldByName('PIEZASPORCOMPRAR').AsFloat;   //LIZ 13/07/2016  lUniPfizer;
        IBQuery1.ParamByName('DOCTO_PV_DET_ID').AsInteger:=dsDetPromo.FieldByName('DOCTO_PV_DET_ID').AsInteger;
        IBQuery1.Open;

        if lPorcentajeDescto>0 then
        begin
          lMontoDes:=0;
          lMontoDes1:=0;
          lMontoDes2:=0;

          if lDsctoAct>0 then
          begin
            lMontoDes1:=((lPrecioMostrador*lDsctoAct)/100);
            lMontoDes2:=(((lPrecioMostrador-lMontoDes1)*lPorcentajeDescto)/100);
            lMontoDes:=lMontoDes1+lMontoDes2;
            lDsctoFin:=((lMontoDes*100)/lPrecioMostrador);
          end
          else
          begin
            lDsctoFin:=lPorcentajeDescto;
          end;

          IBQuery1.Close;
          IBQuery1.SelectSQL.Clear;
          IBQuery1.SelectSQL.Add('UPDATE DOCTOS_PV_DET SET PCTJE_DSCTO = :PCTJE_DSCTO WHERE (DOCTO_PV_DET_ID = :DOCTO_PV_DET_ID);');
          IBQuery1.ParamByName('PCTJE_DSCTO').AsFloat:=lDsctoFin;
          IBQuery1.ParamByName('DOCTO_PV_DET_ID').AsInteger:=dsDetPromo.FieldByName('DOCTO_PV_DET_ID').AsInteger;
          IBQuery1.Open;
        end;

        if lMontoDescto>0 then
        begin
          lPorcentajeDescto:=0;
          lMontoDes:=(lPrecioUni*(lDsctoAct/100))+lMontoDescto;
          lPorcentajeDescto:=((lMontoDes*100)/lPrecioUni);

          IBQuery1.Close;
          IBQuery1.SelectSQL.Clear;
          IBQuery1.SelectSQL.Add('UPDATE DOCTOS_PV_DET SET PCTJE_DSCTO = :PCTJE_DSCTO WHERE (DOCTO_PV_DET_ID = :DOCTO_PV_DET_ID);');
          IBQuery1.ParamByName('PCTJE_DSCTO').AsFloat:=lPorcentajeDescto;
          IBQuery1.ParamByName('DOCTO_PV_DET_ID').AsInteger:=dsDetPromo.FieldByName('DOCTO_PV_DET_ID').AsInteger;
          IBQuery1.Open;
        end;

        lPzsEntregarGra := 0;
        lPzsEntregarGra := dsDetPromo.FieldByName('PIEZASGRATIS').AsInteger + dsDetPromo.FieldByName('PIEZASPENDIENTESNADRO').AsInteger;
        if lPzsEntregarGra>0 then
        begin
          lPzsEntregar := 0;
          lPzsEntregar := lTotalPzsComprar+lPzsEntregarGra;

          RegistrarGra := True;
          lExistencia := 0;
          lPzsEntregadas := 0;
          lPzsNoEntregadas  := 0;
          if AceptarSExi='N' then
          begin
            //Revisar si se tiene existencia de piezas gratis + a comprar
            if not Existencia(dsDetPromo.FieldByName('ARTICULO_ID').AsInteger, lPzsEntregar, lExistencia) then
              RegistrarGra := False;
          end;

          if not RegistrarGra then //no se tiene toda la existencia ver cuantas piezas gratis se pueden dar y poner en pendiente para la proxima venta
          begin
            lpzsDisponibles := 0;
            lpzsDisponibles := lExistencia - lTotalPzsComprar;
            if lpzsDisponibles>0 then
            begin
              lpzsDisponibles1 := 0;
              lpzsDisponibles1 := lpzsDisponibles - lPzsEntregarGra;
              if lpzsDisponibles1 < 0 then
              begin
                lPzsEntregadas := lpzsDisponibles;
                lPzsNoEntregadas := lPzsEntregarGra - lpzsDisponibles;
              end
              else lPzsEntregadas := lPzsEntregarGra;
            end
            else
              lPzsNoEntregadas := lPzsEntregarGra;
          end
          else lPzsEntregadas := lPzsEntregarGra;

          if lPzsEntregadas>0 then
          begin
            InsertRenglon(dsDetPromo.FieldByName('CLAVE_ARTICULO').AsString, dsEncPromo.FieldByName('DOCTO_PV_ID').AsInteger, dsDetPromo.FieldByName('ARTICULO_ID').AsInteger, lPzsEntregadas);

            IBQuery1.Close;
            IBQuery1.SelectSQL.Clear;
            IBQuery1.SelectSQL.Add('UPDATE MGNADRO_PROMOCIONES SET AGREGADO_OV = ''S'' WHERE (ID_PROMO = :ID_PROMO);');
            IBQuery1.ParamByName('ID_PROMO').AsInteger:=dsDetPromo.FieldByName('ID_PROMO').AsInteger;
            IBQuery1.Open;
          end;

          if lPzsNoEntregadas>0 then
          begin
            lPzsPendxFalExi := lPzsPendxFalExi + dsDetPromo.FieldByName('NOMBRE').AsString+' - Piezas pendientes:'+IntToStr(lPzsNoEntregadas)+#13;
          end;

          IBQuery1.Close;
          IBQuery1.SelectSQL.Clear;
          IBQuery1.SelectSQL.Add('UPDATE MGNADRO_PROMOCIONES SET PIEZASGRATIS = :PIEZASGRATIS, PIEZASPENDIENTES = :PIEZASPENDIENTES WHERE (ID_PROMO = :ID_PROMO);');
          IBQuery1.ParamByName('ID_PROMO').AsInteger:=dsDetPromo.FieldByName('ID_PROMO').AsInteger;
          IBQuery1.ParamByName('PIEZASGRATIS').AsInteger:=lPzsEntregadas;
          IBQuery1.ParamByName('PIEZASPENDIENTES').AsInteger:=lPzsNoEntregadas;
          IBQuery1.Open;
        end;

        //actualiza estatus det
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('UPDATE MGNADRO_PROMOCIONES SET ESTATUS = ''A'' WHERE (ID_PROMO = :ID_PROMO);');
        IBQuery1.ParamByName('ID_PROMO').AsInteger:=dsDetPromo.FieldByName('ID_PROMO').AsInteger;
        IBQuery1.Open;
        {$ENDREGION}
      end
      else
      begin
        lMsgError := lMsgError + dsDetPromo.FieldByName('NOMBRE').AsString;
        if lSNExistencia = 'S' then
          lMsgError := lMsgError + ', no tiene suficiente existencia';
        if lPrecioUniIncorrecto = 'S' then
          lMsgError := lMsgError + ', el precio unitario debe ser mayor a 0';
        lMsgError := lMsgError + '.' +#13;
      end;
      {$ENDREGION}
    end
    else
    begin
      {$REGION 'Cobrar piezas pendientes gratis'}
      if dsDetPromo.FieldByName('PIEZASPENDIENTESNADRO').AsInteger>0 then
      begin
        EliminaRenglon(dsDetPromo.FieldByName('DOCTO_PV_DET_ID').AsInteger);

        Registrar := True;
        lExistencia := 0;

        lSNExistencia := 'N';
        if AceptarSExi='N' then
        begin
          if not Existencia(dsDetPromo.FieldByName('ARTICULO_ID').AsInteger, dsDetPromo.FieldByName('PIEZASPENDIENTESNADRO').AsInteger, lExistencia) then
          begin
            Registrar := False;
            lSNExistencia := 'S';
          end;
        end;

        Precios(dsDetPromo.FieldByName('ARTICULO_ID').AsInteger);

        lPrecioUniIncorrecto := 'N';
        if (FPrecioUni = 0) and (FPrecioUniImpto = 0) then
        begin
          Registrar := False;
          lPrecioUniIncorrecto := 'S';
        end;

        if Registrar then
        begin
          InsertRenglon(dsDetPromo.FieldByName('CLAVE_ARTICULO').AsString, dsEncPromo.FieldByName('DOCTO_PV_ID').AsInteger, dsDetPromo.FieldByName('ARTICULO_ID').AsInteger, dsDetPromo.FieldByName('PIEZASPENDIENTESNADRO').AsInteger);

          IBQuery1.Close;
          IBQuery1.SelectSQL.Clear;
          IBQuery1.SelectSQL.Add('UPDATE MGNADRO_PROMOCIONES SET ESTATUS = ''A'', PIEZASGRATIS = :PIEZASGRATIS, UNIDADES_VENDIDAS = 0, PIEZASPORCOMPRAR = 0, AGREGADO_OV = ''S'' WHERE (ID_PROMO = :ID_PROMO);');
          IBQuery1.ParamByName('ID_PROMO').AsInteger:=dsDetPromo.FieldByName('ID_PROMO').AsInteger;
          IBQuery1.ParamByName('PIEZASGRATIS').AsInteger:=dsDetPromo.FieldByName('PIEZASPENDIENTESNADRO').AsInteger;
          IBQuery1.Open;

        end
        else
        begin
          lMsgError := lMsgError + dsDetPromo.FieldByName('NOMBRE').AsString;
          if lSNExistencia = 'S' then
            lMsgError := lMsgError + ', no tiene suficiente existencia';
          if lPrecioUniIncorrecto = 'S' then
            lMsgError := lMsgError + ', el precio unitario debe ser mayor a 0';
          lMsgError := lMsgError + '.' + #13;
        end;
      end
      else
      begin
        EliminaRenglon(dsDetPromo.FieldByName('DOCTO_PV_DET_ID').AsInteger);
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('DELETE FROM MGNADRO_PROMOCIONES WHERE (ID_PROMO = :ID_PROMO);');
        IBQuery1.ParamByName('ID_PROMO').AsInteger:=dsDetPromo.FieldByName('ID_PROMO').AsInteger;
        IBQuery1.Open;
      end;
      {$ENDREGION}
    end;

    dsDetPromo.Next;
  end;

  if lMsgError<>'' then
  begin
    Inicio();
    MessageDlg('No es posible aplicar promociones los siguientes artículos no tienen existencia en almacén:'+#13+lMsgError, mtError, [mbOk], 0);
  end
  else
  begin
    if lAplicarPzs then
    begin
      IBQuery1.Close;
      IBQuery1.SelectSQL.Clear;
      IBQuery1.SelectSQL.Add('UPDATE MGNADRO_SESIONES SET SOLO_PENDIENTES = ''S'' WHERE (ID_SESION = :ID_SESION);');
      IBQuery1.ParamByName('ID_SESION').AsInteger:=FSesionId;
      IBQuery1.Open;
    end;

    //actualiza esatus enc
    IBQuery1.Close;
    IBQuery1.SelectSQL.Clear;
    IBQuery1.SelectSQL.Add('UPDATE MGNADRO_SESIONES SET ESTATUS = ''P'' WHERE (ID_SESION = :ID_SESION);');
    IBQuery1.ParamByName('ID_SESION').AsInteger:=FSesionId;
    IBQuery1.Open;

    if lPzsPendxFalExi<>'' then
    begin
      MessageDlg('Piezas gratis pendientes para su próxima compra, por falta de existencia en almacén:'+#13+lPzsPendxFalExi, mtInformation, [mbOk], 0);
    end;

    if trTrans.InTransaction then
      trTrans.Commit;
  end;
end;
except on e:exception do
begin
  if trTrans.InTransaction then trTrans.Rollback;
    trTrans.StartTransaction;
    Form1.Memo1.Lines.Add('Error al modificar orden de venta. ' + Chr(13) + e.Message);
end;
end;
end;

procedure TfmPromos.Button2Click(Sender: TObject);
begin
  AplicarPromociones();
  close();
end;

procedure TfmPromos.Button3Click(Sender: TObject);
begin
  close();
end;

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

procedure TfmPromos.Inicio();
begin
try
begin
  if trTrans.InTransaction then
    trTrans.Rollback;

  trTrans.StartTransaction;

  dsEncPromo.Close;
  dsEncPromo.ParamByName('DOCTO_PV_ID').AsInteger:=FOrdenVentaId;
  dsEncPromo.ParamByName('TIPO').AsInteger:=FVersion;
  dsEncPromo.Open;
  FVendedor := dsEncPromo.FieldByName('VENDEDOR_ID').AsInteger;

  dsDetPromo.Close;
  dsDetPromo.ParamByName('ID_SESION').AsInteger:=FSesionId;
  dsDetPromo.ParamByName('DOCTO_PV_ID').AsInteger:=FOrdenVentaId;
  dsDetPromo.Open;

  dsClavesCli.Close;
  dsClavesCli.ParamByName('CLIENTE_ID').AsInteger:=dsEncPromo.FieldByName('CLIENTE_ID').AsInteger;
  dsClavesCli.Open;

  dsClientes.Close;
  dsClientes.ParamByName('CLIENTE_ID').AsInteger:=dsEncPromo.FieldByName('CLIENTE_ID').AsInteger;
  dsClientes.Open;


  dsAlmacenes.CloseOpen(False);

  dsPizasGratisPen.Close;
  dsPizasGratisPen.ParamByName('ID_SESION').AsInteger:=FSesionId;
  dsPizasGratisPen.Open;
end;
except on e:exception do
begin
  if trTrans.InTransaction then trTrans.Rollback;
    trTrans.StartTransaction;
end;
end;
end;


procedure TfmPromos.InsertRenglon(ClaveArt:String; DoctoPvId, ArtId, Unidades:Integer);
var lPosicion, lVendedor:Integer;
begin
  lPosicion:=0;
  //última posición
  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('SELECT FIRST 1 A.POSICION FROM DOCTOS_PV_DET A WHERE A.DOCTO_PV_ID=:DOCTO_PV_ID ORDER BY A.DOCTO_PV_DET_ID DESC');
  IBQuery1.ParamByName('DOCTO_PV_ID').AsInteger:=DoctoPvId;
  IBQuery1.Open;
  lPosicion:=IBQuery1.FieldByName('POSICION').AsInteger;
  lPosicion:=lPosicion+1;

  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('INSERT INTO DOCTOS_PV_DET (DOCTO_PV_DET_ID, DOCTO_PV_ID, CLAVE_ARTICULO, ARTICULO_ID, UNIDADES, PRECIO_UNITARIO, PRECIO_UNITARIO_IMPTO, PCTJE_DSCTO, PRECIO_TOTAL_NETO, PRECIO_MODIFICADO, VENDEDOR_ID,  ROL, POSICION)');
  IBQuery1.SelectSQL.Add('VALUES(:DOCTO_PV_DET_ID, :DOCTO_PV_ID, :CLAVE_ARTICULO, :ARTICULO_ID, :UNIDADES, :PRECIO_UNITARIO, :PRECIO_UNITARIO_IMPTO, :PCTJE_DSCTO, :PRECIO_TOTAL_NETO, :PRECIO_MODIFICADO, :VENDEDOR_ID, :ROL, :POSICION);');
  spDoctoId.ExecProc;
  IBQuery1.ParamByName('DOCTO_PV_DET_ID').AsInteger:=spDoctoId.FieldByName('DOCTO_ID').AsInteger;
  IBQuery1.ParamByName('DOCTO_PV_ID').AsInteger:=DoctoPvId;
  IBQuery1.ParamByName('CLAVE_ARTICULO').AsString:=ClaveArt;
  IBQuery1.ParamByName('ARTICULO_ID').AsInteger:=ArtId;
  IBQuery1.ParamByName('UNIDADES').AsInteger:=Unidades;
  IBQuery1.ParamByName('PRECIO_UNITARIO').AsFloat:=FPrecioUni;
  IBQuery1.ParamByName('PRECIO_UNITARIO_IMPTO').AsFloat:=FPrecioUniImpto;
  IBQuery1.ParamByName('PCTJE_DSCTO').AsFloat:=100;
  IBQuery1.ParamByName('PRECIO_TOTAL_NETO').AsFloat:=0;//((Unidades * lPrecioUni) - ((Unidades * lPrecioUni) * 1));
  IBQuery1.ParamByName('PRECIO_MODIFICADO').AsString:='D';//Modificar descuento
  if FVendedor>0 then  
    IBQuery1.ParamByName('VENDEDOR_ID').AsInteger:=FVendedor
  else  IBQuery1.ParamByName('VENDEDOR_ID').Clear;
  IBQuery1.ParamByName('ROL').AsString:='N';
  IBQuery1.ParamByName('POSICION').AsInteger:=lPosicion;
  IBQuery1.Open;
end;

procedure TfmPromos.EliminaRenglon(DoctoPvDetId:Integer);
begin
  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('DELETE FROM DOCTOS_PV_DET  WHERE (DOCTO_PV_DET_ID = :DOCTO_PV_DET_ID);');
  IBQuery1.ParamByName('DOCTO_PV_DET_ID').AsInteger:=DoctoPvDetId;
  IBQuery1.Open;
end;

function TfmPromos.Existencia(lArtId:Integer; lUnidades:Integer; var TExistencia:Integer):Boolean;
var lEsAlmacenable:String;
lExistencia :Integer;
begin
  {$REGION 'agregar piezas gratis'}
  dsExistenciasArt.Close;
  dsExistenciasArt.SelectSQL.Clear;
  dsExistenciasArt.SelectSQL.Add('SELECT A.ES_ALMACENABLE, A.ESTATUS, A.NOMBRE, A.ES_JUEGO FROM ARTICULOS  A WHERE A.ARTICULO_ID = :ARTICULO_ID');
  dsExistenciasArt.ParamByName('ARTICULO_ID').AsInteger := lArtId;
  dsExistenciasArt.Open;

  lEsAlmacenable := dsExistenciasArt.FieldByName('ES_ALMACENABLE').AsString;

  if lEsAlmacenable = 'S' then
  begin
    {$REGION 'almacenable'}
      dsFechaServidor.CloseOpen(false);
      dsExistenciasArt.Close;

      dsExistenciasArt.SelectSQL.Clear;
      dsExistenciasArt.SelectSQL.Add('SELECT * FROM  EXIVAL_ART (:V_ARTICULO_ID,:V_ALMACEN_ID,:V_FECHA,''S'')');
      dsExistenciasArt.ParamByName('V_ARTICULO_ID').AsInteger := lArtId;
      dsExistenciasArt.ParamByName('V_ALMACEN_ID').AsInteger := dsEncPromo.FieldByName('ALMACEN_ID').AsInteger;
      dsExistenciasArt.ParamByName('V_FECHA').AsDateTime := dsFechaServidor.FieldByName('FECHA').AsDateTime;
      dsExistenciasArt.Open;
      lExistencia := dsExistenciasArt.FieldByName('EXISTENCIA').AsInteger;
      TExistencia := lExistencia;
      if lUnidades <= lExistencia then
        Result:=True
      else
        Result:=False;
    {$ENDREGION}
  end
  else Result:=True;
  {$ENDREGION}
end;

procedure TfmPromos.Precios(ArtId:Integer);
begin
  {$REGION 'Revisar que los precios unitarios sean mayor a 0'}
      FPrecioUni := 0;
      spPrecioArt.Close;
      spPrecioArt.ParamByName('ARTICULO_ID').AsInteger := ArtId;
      spPrecioArt.ParamByName('IMPTO_INCL').AsString := 'N';
      spPrecioArt.ParamByName('PRECIO_ID').AsInteger := FListaPVM;
      spPrecioArt.ExecProc;
      FPrecioUni := spPrecioArt.FieldByName('PRECIO1').AsFloat;
      if FPrecioUni<0 then
        FPrecioUni := 0;

      spPrecioArt.Close;
      spPrecioArt.ParamByName('ARTICULO_ID').AsInteger := ArtId;
      spPrecioArt.ParamByName('IMPTO_INCL').AsString := 'S';
      spPrecioArt.ParamByName('PRECIO_ID').AsInteger := FListaPVM;
      spPrecioArt.ExecProc;
      FPrecioUniImpto := spPrecioArt.FieldByName('PRECIO1').AsFloat;
      if FPrecioUniImpto<0 then
        FPrecioUniImpto := 0;
  {$ENDREGION}
end;

end.
