unit fmCerrarVentas;

interface

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

type
  TfmCerrarVM = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    Button2: TButton;
    trTrans: TpFIBTransaction;
    IBQuery1: TpFIBDataSet;
    dsVMPendientes: TpFIBDataSet;
    dsObtenerArticulosVM: TpFIBDataSet;
    spPrecioImpto: TpFIBStoredProc;
    GroupBox3: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    dtpFechaI: TwwDBDateTimePicker;
    dtpFechaF: TwwDBDateTimePicker;
    dsFechaServidor: TpFIBDataSet;
    dsFechaServidorFECHA: TFIBDateField;
    dsFechaServidorHORA: TFIBTimeField;
    mmError: TMemo;
    trModifica: TpFIBTransaction;
    dsAgruparArt: TpFIBDataSet;
    dsModArt: TpFIBDataSet;
    dsArticulos: TpFIBDataSet;
    procedure Button2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function ValidarTarjeta(var ASesion, ANoTarjeta, AMensajeError, AFolioTarjeta:String):Boolean;
    function AgruparArticulos(ADoctoId:Integer; var Error:String):Boolean;
  end;

var
  fmCerrarVM: TfmCerrarVM;

implementation

uses fmErrores, unit1;
{$R *.dfm}

procedure TfmCerrarVM.Button2Click(Sender: TObject);
var
lPedido:Pedido;
lListaArticulos:ArrayOfPedidoArticulos;
lRenglonListaArticulos:PedidoArticulos;
lRespuestaSales:ResponseSales;
lTotalArt, I:Integer;
lPrecioMaximo,lPrecioMostrador:Double;
lHuboError, lContinuar:Boolean;
lMTotal, lPMP, lPM, lPFijo, lPDescto, lMDesc, lIva:TXSDecimal;
lCPVM, lCPMP, lPzsGratis:Integer;
lFolioVM, lMensajeError, lNoTarjeta, lSesion, lResPedido, lEstatus, lConImpto, lFolioTarjeta:String;
lLineaId:Integer;
UnidadesPagadas, IntentosCierre, lpos, lTotalTArt1, lTotalArt1, lPosicion:Integer;
ErrorAg, lFolioPedido, lFolioPedidoF:String;
begin
try
begin
  {$REGION 'datos configuración'}
  //PMP(precio máximo público)
  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add ('SELECT A.VALOR FROM MGNADRO_CONFIG A WHERE A.NOMBRE = ''LISTAPMP'' ');
  IBQuery1.Open;
  lCPMP:=IBQuery1.FieldByName('VALOR').AsInteger;
  //PVM(precio venta mostrador)
  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add ('SELECT A.VALOR FROM MGNADRO_CONFIG A WHERE A.NOMBRE = ''LISTAPVM'' ');
  IBQuery1.Open;
  lCPVM:=IBQuery1.FieldByName('VALOR').AsInteger;
  {$ENDREGION}

  {LIZ 13/07/2016
  IBQuery1.Close;
  IBQuery1.SelectSQL.Clear;
  IBQuery1.SelectSQL.Add('SELECT A.LINEA_ARTICULO_ID FROM LINEAS_ARTICULOS A WHERE A.NOMBRE=''Pfizer'' ');
  IBQuery1.Open;
  lLineaId:=IBQuery1.FieldByName('LINEA_ARTICULO_ID').AsInteger;
   }
   fmLog.Memo1.Lines.Clear;
  dsVMPendientes.Close;
  dsVMPendientes.ParamByName('FECHA_INI').AsDate := dtpFechaI.Date;
  dsVMPendientes.ParamByName('FECHA_FIN').AsDate := dtpFechaF.Date;
  dsVMPendientes.Open;
  while not dsVMPendientes.Eof do
  begin
    {$REGION 'cerrar venta'}
    try
    begin
      mmError.Lines.Clear;
      lSesion:=dsVMPendientes.FieldByName('SESION').AsString;
      IntentosCierre:=dsVMPendientes.FieldByName('INTENTOS_CIERRE').AsInteger;
      if IntentosCierre = 0 then
        IntentosCierre := 1
      else if IntentosCierre > 0  then
        IntentosCierre := IntentosCierre + 1;

      if Form1.FVersion = 1 then
      begin
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('SELECT X.NOMBRE_CONSIG FROM DIRS_CLIENTES X WHERE X.DIR_CLI_ID=:DIR_CLI_ID');
        IBQuery1.ParamByName('DIR_CLI_ID').AsInteger:=dsVMPendientes.FieldByName('DIR_CLI_ID').AsInteger;
        IBQuery1.Open;
        lNoTarjeta:=IBQuery1.FieldByName('NOMBRE_CONSIG').AsString;
      end
      else
      begin
        {LIZ 12/07/16
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('SELECT 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.CLIENTE_ID=:CLIENTE_ID');
        IBQuery1.ParamByName('CLIENTE_ID').AsInteger:=dsVMPendientes.FieldByName('CLIENTE_ID').AsInteger;
        IBQuery1.Open;
        lNoTarjeta:=IBQuery1.FieldByName('CLAVE_CLIENTE').AsString;
        }
        lNoTarjeta:=dsVMPendientes.FieldByName('CLAVE_CLIENTE').AsString;
      end;

      if (lNoTarjeta<>'') and (lSesion<>'') then
      begin
        lMensajeError:='';
        if ValidarTarjeta(lSesion, lNoTarjeta, lMensajeError, lFolioTarjeta)=False then
        begin
          lpos:=0;
          lpos:=Pos('Cadena de sesión no válida', lMensajeError);
          if lpos=0 then
          begin
            lContinuar:=False;
            fmLog.Memo1.Lines.Add('Error al cerrar venta mostrador: '+dsVMPendientes.FieldByName('FOLIO_VM').AsString+Chr(10)+' '+lMensajeError);
            mmError.Lines.Add('Error al cerrar venta mostrador: '+dsVMPendientes.FieldByName('FOLIO_VM').AsString+Chr(10)+' '+lMensajeError);
          end;
        end;
      end;

      {if lFolioTarjeta<>'' then
      begin}
      {$REGION 'Agrupar artículos VM'}
            lTotalTArt1:=0;
            IBQuery1.Close;
            IBQuery1.SelectSQL.Clear;
            IBQuery1.SelectSQL.Add('SELECT COUNT(*) TTARTICULOS FROM');
            IBQuery1.SelectSQL.Add('(SELECT DISTINCT A.ARTICULO_ID');
            IBQuery1.SelectSQL.Add('FROM DOCTOS_PV_DET A');
            IBQuery1.SelectSQL.Add('WHERE A.DOCTO_PV_ID=:DOCTO_PV_ID');
            IBQuery1.SelectSQL.Add('AND A.PRECIO_UNITARIO>0)');
            IBQuery1.ParamByName('DOCTO_PV_ID').AsInteger:=dsVMPendientes.FieldByName('DOCTO_PV_ID').AsInteger;
            IBQuery1.Open;
            lTotalTArt1:= IBQuery1.FieldByName('TTARTICULOS').AsInteger;

            lTotalArt1:=0;
            IBQuery1.Close;
            IBQuery1.SelectSQL.Clear;
            IBQuery1.SelectSQL.Add('SELECT COUNT(*)TARTICULOS FROM DOCTOS_PV_DET A WHERE A.DOCTO_PV_ID=:DOCTO_PV_ID AND A.PRECIO_UNITARIO>0');
            IBQuery1.ParamByName('DOCTO_PV_ID').AsInteger:=dsVMPendientes.FieldByName('DOCTO_PV_ID').AsInteger;
            IBQuery1.Open;
            lTotalArt1:=IBQuery1.FieldByName('TARTICULOS').AsInteger;

            if lTotalTArt1 <> lTotalArt1 then
            begin
              ErrorAg:='';
              if AgruparArticulos(dsVMPendientes.FieldByName('DOCTO_PV_ID').AsInteger, ErrorAg)=False then
              begin
                lContinuar:=False;
                fmLog.Memo1.Lines.Add('Error al agrupar artículos.'+#13+ErrorAg);
                mmError.Lines.Add('Error al agrupar artículos.'+#13+ErrorAg);
              end;
            end;
        {$ENDREGION}

        lTotalArt:=0;
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('SELECT COUNT(*)TARTICULOS FROM MGNADRO_PROMOCIONES A WHERE A.ID_SESION=:ID_SESION AND A.ESTATUS=''A'' ');
        IBQuery1.ParamByName('ID_SESION').AsInteger:=dsVMPendientes.FieldByName('ID_SESION').AsInteger;
        IBQuery1.Open;
        lTotalArt:=IBQuery1.FieldByName('TARTICULOS').AsInteger;
        if (lTotalArt>0) and (lNoTarjeta<>'') then
        begin
          {$REGION 'artículos con promoción'}
          //verificar si esta seleccionada la opción de incluir el impuesto en los precios al registrar las ventas de punto de venta
          IBQuery1.Close;
          IBQuery1.SelectSQL.Clear;
          IBQuery1.SelectSQL.Add('SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE=''IMPUESTO_INCLUIDO''');
          IBQuery1.Open;
          lConImpto :=  IBQuery1.FieldByName('VALOR').AsString;

          //declarar longitud de Array 1 a N
          SetLength(lListaArticulos,lTotalArt);
          //inicializar el array 1..N
          I := 0;

          lPedido:=Pedido.Create;
          lPedido.NoTarjeta:=lNoTarjeta;
          lPedido.CedulaProfesionalMedico:='';
          lPedido.Usuario:=dsVMPendientes.FieldByName('NOMBRE_CAJEROVM').AsString;

          lMTotal:=TXSDecimal.Create;
          lMTotal.AsBcd:=dsVMPendientes.FieldByName('TOTAL_VM').AsBCD;
          lPedido.Total:=lMTotal;

          lPedido.NoTicket:=dsVMPendientes.FieldByName('FOLIO_VM').AsString;

          lRenglonListaArticulos:=PedidoArticulos.Create;

          dsObtenerArticulosVM.Close;
          dsObtenerArticulosVM.ParamByName('ID_SESION').AsInteger:=dsVMPendientes.FieldByName('ID_SESION').AsInteger;
          dsObtenerArticulosVM.ParamByName('DOCTO_PV_ID').AsInteger:=dsVMPendientes.FieldByName('DOCTO_PV_ID').AsInteger;
          dsObtenerArticulosVM.Open;

          while not dsObtenerArticulosVM.Eof do
          begin
            lEstatus:=dsObtenerArticulosVM.FieldByName('ESTATUS').AsString;
            if lCPMP>0 then
            begin
              IBQuery1.Close;
              IBQuery1.SelectSQL.Clear;
              IBQuery1.SelectSQL.Add('SELECT A.PRECIO FROM PRECIOS_ARTICULOS A');
              IBQuery1.SelectSQL.Add('WHERE A.ARTICULO_ID=:ARTICULO_ID AND A.PRECIO_EMPRESA_ID=:PRECIO_EMPRESA_ID');
              IBQuery1.ParamByName('ARTICULO_ID').AsInteger:=dsObtenerArticulosVM.FieldByName('ARTICULO_ID').AsInteger;
              IBQuery1.ParamByName('PRECIO_EMPRESA_ID').AsInteger:=lCPMP;
              IBQuery1.Open;
              if lConImpto='N' then
                lPrecioMaximo:=IBQuery1.FieldByName('PRECIO').AsFloat
              else
              begin
                spPrecioImpto.Close;
                spPrecioImpto.ParamByName('ARTICULO_ID').AsInteger:=dsObtenerArticulosVM.FieldByName('ARTICULO_ID').AsInteger;
                spPrecioImpto.ParamByName('PRECIO').AsFloat:=IBQuery1.FieldByName('PRECIO').AsFloat;
                spPrecioImpto.ExecProc;
                lPrecioMaximo:=spPrecioImpto.FieldByName('PRECIO').AsFloat;
              end;
            end
            else
            begin
              lPrecioMaximo:=0;
            end;
            lPMP:=TXSDecimal.Create;
            lPMP.AsBcd:=DoubleToBcd(lPrecioMaximo);

            {if lCPVM>0 then
            begin
              IBQuery1.Close;
              IBQuery1.SelectSQL.Clear;
              IBQuery1.SelectSQL.Add('SELECT A.PRECIO FROM PRECIOS_ARTICULOS A');
              IBQuery1.SelectSQL.Add('WHERE A.ARTICULO_ID=:ARTICULO_ID AND A.PRECIO_EMPRESA_ID=:PRECIO_EMPRESA_ID');
              IBQuery1.ParamByName('ARTICULO_ID').AsInteger:=dsObtenerArticulosVM.FieldByName('ARTICULO_ID').AsInteger;
              IBQuery1.ParamByName('PRECIO_EMPRESA_ID').AsInteger:=lCPVM;
              IBQuery1.Open;
              if lConImpto='N' then
                lPrecioMostrador:=IBQuery1.FieldByName('PRECIO').AsFloat
              else
              begin
                spPrecioImpto.Close;
                spPrecioImpto.ParamByName('ARTICULO_ID').AsInteger:=dsObtenerArticulosVM.FieldByName('ARTICULO_ID').AsInteger;
                spPrecioImpto.ParamByName('PRECIO').AsFloat:=IBQuery1.FieldByName('PRECIO').AsFloat;
                spPrecioImpto.ExecProc;
                lPrecioMostrador:=spPrecioImpto.FieldByName('PRECIO').AsFloat;
              end;
            end
            else
            begin
              lPrecioMostrador:=0;
            end;
            }
            lPrecioMostrador := dsObtenerArticulosVM.FieldByName('PRECIO_MSP').AsFloat;

            lPM:=TXSDecimal.Create;
            lPM.AsBcd:=DoubleToBcd(lPrecioMostrador);

            lPFijo:=TXSDecimal.Create;
            lPDescto:=TXSDecimal.Create;
            lMDesc:=TXSDecimal.Create;

             if lEstatus='A' then
            begin
              lPFijo.AsBcd:=dsObtenerArticulosVM.FieldByName('PRECIOFIJO').AsBCD;
              lPDescto.AsBcd:=dsObtenerArticulosVM.FieldByName('PORCENTAJEDESCUENTO').AsBCD;
              lMDesc.AsBcd:=dsObtenerArticulosVM.FieldByName('MONTODESCUENTO').AsBCD;
              lPzsGratis:=dsObtenerArticulosVM.FieldByName('PIEZASGRATIS').AsInteger;
            end
            else
            begin
              lPFijo.AsBcd:=DoubleToBcd(0);
              lPDescto.AsBcd:=DoubleToBcd(0);
              lMDesc.AsBcd:=DoubleToBcd(0);
              lPzsGratis:=0;
            end;
            {LIZ 13/07/2016
            if dsObtenerArticulosVM.FieldByName('LINEA_ARTICULO_ID').AsInteger=lLineaId then
            begin
              //Productos Pfizer
              UnidadesPagadas:=dsObtenerArticulosVM.FieldByName('UNIDADES_VENDIDAS').AsInteger-lPzsGratis;
            end
            else
              UnidadesPagadas:=dsObtenerArticulosVM.FieldByName('UNIDADES_VENDIDAS').AsInteger;
            }
            UnidadesPagadas:=dsObtenerArticulosVM.FieldByName('UNIDADES').AsInteger;
            lIva:=TXSDecimal.Create;
            lIva.AsBcd:=DoubleToBcd(0);

            lListaArticulos[I]:=PedidoArticulos.Create;
            lListaArticulos[I].Sku:=dsObtenerArticulosVM.FieldByName('CLAVE_ARTICULO').AsString;
            lListaArticulos[I].Precio:=lPMP;
            lListaArticulos[I].PrecioPOS:=lPM;
            lListaArticulos[I].PrecioFijo:=lPFijo;
            lListaArticulos[I].PorcentajeDescuento:=lPDescto;
            lListaArticulos[I].MontoDescuento:=lMDesc;
            lListaArticulos[I].PiezasPagadas:=UnidadesPagadas;
            lListaArticulos[I].PiezasGratis:=lPzsGratis;
            lListaArticulos[I].IVA:=lIva;
            lListaArticulos[I].PorcentajeIVA:=0;

            I:=I+1;
            dsObtenerArticulosVM.Next;
          end;

          lMensajeError:='';

          //Invocar WS
          lRespuestaSales:=GetWSCirculodelaSaludSoap.Create_Sales_Folio_Receta(lSesion,lPedido,lListaArticulos,'');
          lHuboError:=lRespuestaSales.HuboError;
          if lHuboError then
          begin
            lMensajeError:=lRespuestaSales.MensajeError;
            lPosicion:=0;
            lPosicion:= pos('La sesión se cerró con el id de venta:',lMensajeError);
            if lPosicion=0 then
            begin
              fmLog.Memo1.Lines.Add('Error al cerrar venta mostrador: '+dsVMPendientes.FieldByName('FOLIO_VM').AsString+Chr(10)+' '+lMensajeError);
              mmError.Lines.Add('Error al cerrar venta mostrador: '+dsVMPendientes.FieldByName('FOLIO_VM').AsString+Chr(10)+' '+lMensajeError);
            end
            else
            begin
              mmError.Lines.Add(lMensajeError);
              lFolioPedido:='';
              lFolioPedidoF:='';
              lFolioPedido:=StringReplace(lMensajeError, 'La sesión se cerró con el id de venta:', '',
                          [rfReplaceAll, rfIgnoreCase]);
              lFolioPedido:=Trim(lFolioPedido);
              lPosicion:=Length(lFolioPedido);

              for I := 0 to lPosicion - 1 do
              begin
                if lFolioPedido[I]<>' ' then
                  lFolioPedidoF:=lFolioPedidoF+lFolioPedido[I]
                else
                  Break;
              end; 
            end;
          end
          else
          begin
            lResPedido:=lRespuestaSales.Pedido;
            IBQuery1.Close;
            IBQuery1.SelectSQL.Clear;
            IBQuery1.SelectSQL.Add('UPDATE MGNADRO_SESIONES SET ESTATUS = :ESTATUS, FOLIO_PEDIDO = :FOLIO_PEDIDO, INTENTOS_CIERRE = :INTENTOS_CIERRE');
            IBQuery1.SelectSQL.Add('WHERE (ID_SESION = :ID_SESION);');
            IBQuery1.ParamByName('ESTATUS').AsString:='T'; //Terminada
            IBQuery1.ParamByName('FOLIO_PEDIDO').AsString:=lResPedido;
            IBQuery1.ParamByName('INTENTOS_CIERRE').AsInteger:=IntentosCierre;
            IBQuery1.ParamByName('ID_SESION').AsInteger:=dsVMPendientes.FieldByName('ID_SESION').AsInteger;
            IBQuery1.Open;
            fmLog.Memo1.Lines.Add('El cierre de venta mostrador '+dsVMPendientes.FieldByName('FOLIO_VM').AsString+' con el web service círculo de la salud fue exitosa. Folio de respuesta: '+lResPedido);
          end;
        {$ENDREGION}
        end;
      end;
    //end;
    finally
      {for I := 0 to lTotalArt - 1 do
      begin
        lListaArticulos[I].Free;
      end;}
      lIva.Free;
      lMDesc.Free;
      lPDescto.Free;
      lPFijo.Free;
      lPM.Free;
      lPMP.Free;
      lRenglonListaArticulos.Free;
      lMTotal.Free;
      //lPedido.Free;
    end;
    {$ENDREGION}

    if mmError.Text<>'' then
    begin
      lFolioPedidoF:=Trim(lFolioPedidoF);
      if lFolioPedidoF<>'' then
      begin
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('UPDATE MGNADRO_SESIONES SET ESTATUS = :ESTATUS, FOLIO_PEDIDO = :FOLIO_PEDIDO, INTENTOS_CIERRE = :INTENTOS_CIERRE');
        IBQuery1.SelectSQL.Add('WHERE (ID_SESION = :ID_SESION);');
        IBQuery1.ParamByName('ESTATUS').AsString:='T'; //Terminada
        IBQuery1.ParamByName('FOLIO_PEDIDO').AsString:=lFolioPedidoF;
        IBQuery1.ParamByName('INTENTOS_CIERRE').AsInteger:=IntentosCierre;
        IBQuery1.ParamByName('ID_SESION').AsInteger:=dsVMPendientes.FieldByName('ID_SESION').AsInteger;
        IBQuery1.Open;
        fmLog.Memo1.Lines.Add('El cierre de venta mostrador '+dsVMPendientes.FieldByName('FOLIO_VM').AsString+' con el web service círculo de la salud fue exitosa. Folio de respuesta: '+lFolioPedidoF);
      end
      else
      begin
        IBQuery1.Close;
        IBQuery1.SelectSQL.Clear;
        IBQuery1.SelectSQL.Add('UPDATE MGNADRO_SESIONES SET INTENTOS_CIERRE = :INTENTOS_CIERRE, LOG_ERRORES = :LOG_ERRORES');
        IBQuery1.SelectSQL.Add('WHERE (ID_SESION = :ID_SESION);');
        IBQuery1.ParamByName('INTENTOS_CIERRE').AsInteger:=IntentosCierre;
        IBQuery1.ParamByName('LOG_ERRORES').AsString:='Error al cerrar venta mostrador: '+dsVMPendientes.FieldByName('FOLIO_VM').AsString+'Intento '+IntToStr(IntentosCierre)+'.'+Chr(10)+mmError.Text;
        IBQuery1.ParamByName('ID_SESION').AsInteger:=dsVMPendientes.FieldByName('ID_SESION').AsInteger;
        IBQuery1.Open;
      end;
    end;

    dsVMPendientes.Next;
  end;

  if trTrans.InTransaction then
    trTrans.Commit;
  MessageDlg('El proceso termino correctamente.', mtInformation,  [mbOk], 0);
  fmLog.ShowModal;
end
except on e:exception do
begin
  if trTrans.InTransaction then trTrans.Rollback;
    trTrans.StartTransaction;
  MessageDlg('Error en cerrar ventas pendientes.'+e.Message, mtInformation,  [mbOk], 0);
end;
end;
end;

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

  dsFechaServidor.CloseOpen(False);

  dtpFechaI.Date := dsFechaServidor.FieldByName('FECHA').AsDateTime;
  dtpFechaF.Date := dsFechaServidor.FieldByName('FECHA').AsDateTime;
end;

function TfmCerrarVM.ValidarTarjeta(var ASesion, ANoTarjeta, AMensajeError, AFolioTarjeta:String):Boolean;
var lRepuestaLogin:ResponseLogin;
lHuboError:Boolean;
lInfoCard:Tarjeta;
begin
  try
  lInfoCard:=Tarjeta.Create;
  lInfoCard:=GetWSCirculodelaSaludSoap.GetInfoCard(ASesion,ANoTarjeta);
  lHuboError:=lInfoCard.HuboError;
  if lHuboError then
  begin
    AFolioTarjeta:='';
    AMensajeError:=lInfoCard.MensajeError;
    Result:=False;
  end
  else
  begin
    AFolioTarjeta:=lInfoCard.folio;
    AMensajeError:='';
    Result:=True;
  end;
  finally
    lInfoCard.Free;
  end;
end;

function TfmCerrarVM.AgruparArticulos(ADoctoId:Integer; var Error:String):Boolean;
var lUnidadesAgr:Double;
lArtAgr, lDoctoVeDetId:Integer;
begin
try
begin
  if trModifica.InTransaction then trModifica.Rollback;
    trModifica.StartTransaction;

  Result:=False;

  dsAgruparArt.Close;
  dsAgruparArt.SelectSQL.Clear;
  dsAgruparArt.SelectSQL.Add('SELECT A.ARTICULO_ID, SUM(A.UNIDADES) TUNIDADES');
  dsAgruparArt.SelectSQL.Add('FROM DOCTOS_PV_DET A');
  dsAgruparArt.SelectSQL.Add('WHERE A.DOCTO_PV_ID=:DOCTO_PV_ID');
  dsAgruparArt.SelectSQL.Add('AND A.PRECIO_UNITARIO>0');
  dsAgruparArt.SelectSQL.Add('GROUP BY A.ARTICULO_ID');
  dsAgruparArt.ParamByName('DOCTO_PV_ID').AsInteger:=ADoctoId;
  dsAgruparArt.Open;
  while not dsAgruparArt.Eof do
  begin
    lArtAgr:=dsAgruparArt.FieldByName('ARTICULO_ID').AsInteger;
    lUnidadesAgr:=dsAgruparArt.FieldByName('TUNIDADES').AsFloat;

    dsArticulos.Close;
    dsArticulos.SelectSQL.Clear;
    dsArticulos.SelectSQL.Add('SELECT FIRST 1 A.DOCTO_PV_DET_ID, A.ARTICULO_ID');
    dsArticulos.SelectSQL.Add('FROM DOCTOS_PV_DET A');
    dsArticulos.SelectSQL.Add('WHERE A.DOCTO_PV_ID=:DOCTO_PV_ID');
    dsArticulos.SelectSQL.Add('AND A.ARTICULO_ID=:ARTICULO_ID');
    dsArticulos.SelectSQL.Add('AND A.PRECIO_UNITARIO>0');
    dsArticulos.SelectSQL.Add('ORDER BY A.DOCTO_PV_DET_ID');
    dsArticulos.ParamByName('DOCTO_PV_ID').AsInteger:=ADoctoId;
    dsArticulos.ParamByName('ARTICULO_ID').AsInteger:=lArtAgr;
    dsArticulos.Open;
    lDoctoVeDetId:=dsArticulos.FieldByName('DOCTO_PV_DET_ID').AsInteger;
    if lDoctoVeDetId>0 then
    begin
        dsModArt.Close;
        dsModArt.SelectSQL.Clear;
        dsModArt.SelectSQL.Add('UPDATE DOCTOS_PV_DET SET UNIDADES = :UNIDADES,');
        dsModArt.SelectSQL.Add('POSICION = :POSICION');
        dsModArt.SelectSQL.Add('WHERE (DOCTO_PV_DET_ID = :DOCTO_PV_DET_ID);');
        dsModArt.ParamByName('UNIDADES').AsFloat:=lUnidadesAgr;
        dsModArt.ParamByName('POSICION').AsInteger:=-1;
        dsModArt.ParamByName('DOCTO_PV_DET_ID').AsInteger:=lDoctoVeDetId;
        dsModArt.Open;
    end;

    dsArticulos.Close;
    dsArticulos.SelectSQL.Clear;
    dsArticulos.SelectSQL.Add('SELECT A.DOCTO_PV_DET_ID, A.ARTICULO_ID');
    dsArticulos.SelectSQL.Add('FROM DOCTOS_PV_DET A');
    dsArticulos.SelectSQL.Add('WHERE A.DOCTO_PV_ID=:DOCTO_PV_ID');
    dsArticulos.SelectSQL.Add('AND A.ARTICULO_ID=:ARTICULO_ID');
    dsArticulos.SelectSQL.Add('AND A.DOCTO_PV_DET_ID<>:DOCTO_PV_DET_ID');
    dsArticulos.SelectSQL.Add('AND A.PRECIO_UNITARIO>0');
    dsArticulos.SelectSQL.Add('ORDER BY A.DOCTO_PV_DET_ID');
    dsArticulos.ParamByName('DOCTO_PV_ID').AsInteger:=ADoctoId;
    dsArticulos.ParamByName('ARTICULO_ID').AsInteger:=lArtAgr;
    dsArticulos.ParamByName('DOCTO_PV_DET_ID').AsInteger:=lDoctoVeDetId;
    dsArticulos.Open;
    while not dsArticulos.Eof do
    begin
        dsModArt.Close;
        dsModArt.SelectSQL.Clear;
        dsModArt.SelectSQL.Add('DELETE FROM DOCTOS_PV_DET A');
        dsModArt.SelectSQL.Add('WHERE A.DOCTO_PV_DET_ID=:DOCTO_PV_DET_ID');
        dsModArt.ParamByName('DOCTO_PV_DET_ID').AsInteger:=dsArticulos.FieldByName('DOCTO_PV_DET_ID').AsInteger;
        dsModArt.Open;

      dsArticulos.Next;
    end;

    dsAgruparArt.Next;
  end;

  if trModifica.InTransaction then trModifica.Commit;

  Result:=True;
  Error:='';
end;
except on e:exception do
begin
  if trModifica.InTransaction then trModifica.Rollback;
  Result:=False;
  Error:=e.Message;
end;
end;
end;

end.
