{
===============================================================================
  Copyright (©) 2002. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 02-12-2002
  Versión actual: 1.0.0
  Fecha versión actual: 02-12-2002
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit TablaPresupuestos;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares
  IBCustomDataSet, cxGrid, cxGridDBCardView, cxButtonEdit,
  StdCtrls, cxMemo, cxEdit, TablaPropiedades,

  //Aplicacion
  Framework, StrFunc, Entidades, Constantes, BaseDatos,

  // Contador
  Contadores, RdxGestorContadores;

type
  TListaDetallesPresupuesto = class;
  TDatosDetallePresupuesto = class;
  TListaPropiedadesPresupuesto = class;

  TDatosPresupuesto = class(TObjeto)
  private
    FListaDetallesPresupuesto : TListaDetallesPresupuesto;
  protected
    procedure ObtenerDatos; override;
    procedure AssignTo(Dest: TPersistent); override;
  public
		Codigo : string;
    FechaAlta : TDateTime;
    Usuario : string;
    FechaPresupuesto : TDateTime;
    CodigoDocumento : string;
    Situacion : string;
    FechaDecision : TDateTime;
    CodigoCliente : string;
    NIFCIF : string;
    Nombre : string;
    Calle : string;
    Numero : string;
    Piso : string;
    CodigoPostal : string;
    Poblacion : string;
    Provincia : string;
    Telefono1 : string;
    Telefono2 : string;
    Movil1 : string;
    Movil2 : string;
    Fax : string;            
    PersonaContacto : string;
    Observaciones : string;
    Vendedor : string;
    BaseImponible : double;
    Descuento : integer;
    ImporteDescuento : double;
    Iva : integer;
    ImporteIva : double;
    ImporteTotal : double;
    VigenciaPresupuesto : TDateTime;
    PlazoEntrega : String;
    FormaPago : String;
    Desgloses : String;
    Aumento : String;
    constructor Create(CodigoPresupuesto : String); overload;
    constructor Create; overload; override;
    destructor Destroy; override;
    property ListaDetallesPresupuesto : TListaDetallesPresupuesto read FListaDetallesPresupuesto;
  end;

  TListaDetallesPresupuesto = class(TListaObjetos)
  private
    FCodigoPresupuesto : String;
    function GetDetallePresupuesto(Index: Integer): TDatosDetallePresupuesto;
  protected
    procedure AssignTo(Dest: TPersistent); override;
    procedure ObtenerLista; override;
  public
    constructor Create(CodigoPresupuesto : String); overload;
    constructor Create; overload; override;
    property Items[Index: Integer] : TDatosDetallePresupuesto read GetDetallePresupuesto;
  end;

  TDatosDetallePresupuesto = class(TObjeto)
  private
    FListaPropiedades : TListaPropiedadesPresupuesto;
  protected
    procedure ObtenerDatos; override;
    procedure AssignTo(Dest: TPersistent); override;
  public
    NumConcepto : Integer;
    CodigoArticulo : string;
    TipoConcepto : string;
    Descripcion : String;
    Cantidad : integer;
    ImporteUnidad : double;
    ImporteTotal : double;
    constructor Create; override;
    destructor Destroy; override;
    property ListaPropiedades : TListaPropiedadesPresupuesto read FListaPropiedades;
  end;

  TListaPropiedadesPresupuesto = class(TListaObjetos)
  private
    FCodigoArticulo : String;
    function GetPropiedad(Index: Integer): TDatosPropiedad;
  protected
    procedure AssignTo(Dest: TPersistent); override;
    procedure ObtenerLista; override;
  public
    constructor Create(CodigoArticulo : String); overload;
    constructor Create; overload; override;
    property Items[Index: Integer] : TDatosPropiedad read GetPropiedad;
  end;

/////////////////////////////////////////////////////////////////////////////////

  TdmTablaPresupuestos = class(TDataModule)
  private
    procedure IniciarSQLPresupuesto;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
  public
    sqlConsultarGridPresupuestos : TStrings;
    sqlConsultarGridPresupuestosCli : TStrings;
    sqlConsultarGridPresupuestosContratar : TStrings;

    sqlInsertarPresupuesto : TStrings;
    sqlModificarPresupuesto : TStrings;
    sqlConsultarPresupuesto : TStrings;
    sqlEliminarPresupuesto : TStrings;

    sqlInsertarDetalles : TStrings;
    sqlModificarDetalles : TStrings;
    sqlConsultarDetalles : TStrings;
    sqlEliminarDetalles : TStrings;
    sqlConsultarGridDetalles : TStrings;

    sqlInsertarPropiedades : TStrings;
    sqlModificarPropiedades : TStrings;
    sqlConsultarPropiedades : TStrings;
    sqlEliminarPropiedades : TStrings;
    sqlConsultarGridPropiedades : TStrings;
    sqlConsultarGridPropiedadesModal : TStrings;

    //Metodos que llamaran a contador
    function DarNuevoCodigo : String;
    function InsertarContador : boolean;
    function IncrementarCodigo : boolean;
    function ValidarCodigo(Codigo : String) : Boolean;
    function FormatearCodigo(Codigo : String) : String;

    function FormatearNumConcepto(NumConcepto : String) : String;
    function AceptarPresupuesto(Codigo: String; FechaAceptacion: TDateTime): Boolean;
    function RechazarPresupuesto(Codigo: String; FechaAnulacion: TDateTime): Boolean;
    function DarContratoDelPresupuesto (CodigoPresupuesto: String): String;
    function DarSituacionPresupuesto(Codigo: String) : String;
    function DarSituaciones : TStrings;
    function AsignarContrato(CodigoPresupuesto, CodigoContrato : String): Boolean;
    function CopiarPresupuesto(CodigoPresupuesto : String) : String;
    procedure InicializarGridDetalles(var Grid: TcxGridDBTableView);
    procedure InicializarGridPrecios(var Grid: TcxGridDBTableView);
    procedure InicializarGridPropiedades(var vGrid: TcxGridDBCardView);
    procedure InicializarGridPresupuestos(var Grid: TcxGrid);
    procedure InicializarTablaPresupuestos(Tabla: TPTabla);
    procedure InicializarTablaDetalles(Tabla: TPTabla);
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  end;

var
  dmTablaPresupuestos: TdmTablaPresupuestos;

implementation

{$R *.DFM}


uses
  Literales;


{ TdmTablaPresupuestos }

function TdmTablaPresupuestos.RechazarPresupuesto(Codigo: String;
  FechaAnulacion: TDateTime): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PRESUPUESTOSCLIENTE set ');
    SQL.Add('SITUACION = ''RECHAZADO'', ');
    SQL.Add('FECHADECISION = :FECHADECISION ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('FECHADECISION').AsDate := FechaAnulacion;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

constructor TdmTablaPresupuestos.Create(AOwner: TComponent);
begin
  inherited;
  { Cabecera }
  sqlInsertarPresupuesto := TStringList.Create;
  sqlModificarPresupuesto := TStringList.Create;
  sqlConsultarPresupuesto := TStringList.Create;
  sqlEliminarPresupuesto := TStringList.Create;

  { Detalles }
  sqlInsertarDetalles := TStringList.Create;
  sqlModificarDetalles := TStringList.Create;
  sqlConsultarDetalles := TStringList.Create;
  sqlEliminarDetalles := TStringList.Create;
  sqlConsultarGridDetalles := TStringList.Create;

  { Propiedades }
  sqlInsertarPropiedades := TStringList.Create;
  sqlModificarPropiedades := TStringList.Create;
  sqlConsultarPropiedades := TStringList.Create;
  sqlEliminarPropiedades := TStringList.Create;
  sqlConsultarGridPropiedades := TStringList.Create;
  sqlConsultarGridPropiedadesModal := TStringList.Create;

  { Grids }
  sqlConsultarGridPresupuestos := TStringList.Create;
  sqlConsultarGridPresupuestosCli := TStringList.Create;
  sqlConsultarGridPresupuestosContratar := TStringList.Create;

  IniciarSQLPresupuesto;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

function TdmTablaPresupuestos.DarNuevoCodigo: String;
begin
  Result := GestorContadores.darNuevoCodigo(contPresupuestosCliente);
end;

function TdmTablaPresupuestos.DarSituaciones: TStrings;
var
  Lista : TStringList;
begin
  Result := NIL;
  Lista := TStringList.Create;
  with Lista do
  begin
    Clear;
    Append('PENDIENTE');
    Append('ACEPTADO');
    Append('RECHAZADO');
  end;
  Result := Lista;
end;

destructor TdmTablaPresupuestos.Destroy;
begin
  { Cabecera }
  sqlInsertarPresupuesto.Free;
  sqlModificarPresupuesto.Free;
  sqlConsultarPresupuesto.Free;
  sqlEliminarPresupuesto.Free;

  { Detalles }
  sqlInsertarDetalles.Free;
  sqlModificarDetalles.Free;
  sqlConsultarDetalles.Free;
  sqlEliminarDetalles.Free;
  sqlConsultarGridDetalles.Free;

  { Propiedades }
  sqlInsertarPropiedades.Free;
  sqlModificarPropiedades.Free;
  sqlConsultarPropiedades.Free;
  sqlEliminarPropiedades.Free;
  sqlConsultarGridPropiedades.Free;
  sqlConsultarGridPropiedadesModal.Free;

  { Grids }
  sqlConsultarGridPresupuestos.Free;
  sqlConsultarGridPresupuestosCli.Free;
  sqlConsultarGridPresupuestosContratar.Free;
  inherited;
end;

function TdmTablaPresupuestos.FormatearCodigo(Codigo: String): String;
begin
  Result := GestorContadores.formatearCodigo(contPresupuestosCliente, Codigo);
end;

function TdmTablaPresupuestos.FormatearNumConcepto(
  NumConcepto: String): String;
var
  Concepto : Integer;
begin
  Concepto := StrToInt(NumConcepto);
  Result :=  format('%.10d', [Concepto]);
end;

function TdmTablaPresupuestos.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contPresupuestosCliente);
end;

procedure TdmTablaPresupuestos.InicializarGridDetalles(var Grid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with Grid do
  begin
    ClearItems;
    OptionsView.Footer := True;
    {Columna CODIGOPRESUPUESTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOPRESUPUESTO';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    {Columna NUMCONCEPTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NUMCONCEPTO';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;

    {Columna TIPOCONCEPTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TIPOCONCEPTO';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;

    {Columna CODIGOARTICULO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOARTICULO';
    Columna.Caption := 'Cód. artículo';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxButtonEditProperties';
    with TcxButtonEditProperties(Columna.Properties) do
    begin
      Buttons[0].Kind := bkEllipsis;
    end;
    {Columna DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Descripción servicio/artículo';
    Columna.Width := tamColDescripcion;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxMemoProperties';
    with TcxMemoProperties(Columna.Properties) do
    begin
      ScrollBars := ssVertical;
    end;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: #,0 conceptos';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna CANTIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CANTIDAD';
    Columna.Caption := 'Cantidad';
    Columna.Width := tamColCantidad;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxCalcEditProperties';
    Columna.HeaderAlignmentHorz := taRightJustify;

    {Columna IMPORTEUNIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTEUNIDAD';
    Columna.Caption := 'Importe unidad';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxCalcEditProperties';
    Columna.HeaderAlignmentHorz := taRightJustify;

    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.Options.Editing := False;
    Columna.HeaderAlignmentHorz := taRightJustify;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '#,0.00 €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

procedure TdmTablaPresupuestos.InicializarGridPresupuestos(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 presupuestos';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna DESCRIPCION}
{    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Documento';
    Columna.Width := tamColDocumentos;
    Columna.Options.Filtering := False;
}    
    {Columna FECHAPRESUPUESTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAPRESUPUESTO';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    {Columna SITUACION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'SITUACION';
    Columna.Caption := 'Situación';
    Columna.Width := tamColSituacion;
    Columna.Options.Filtering := False;
    {Columna CODIGOCLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCLIENTE';
    Columna.Caption := 'Cód. cliente';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    Columna.Options.Filtering := False;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    {Columna CODIGOCONTRATO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCONTRATO';
    Columna.Caption := 'Contrato asociado';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
  end;
end;

procedure TdmTablaPresupuestos.InicializarTablaDetalles(Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('IMPORTEUNIDAD') <> NIL then
      with (FieldByName('IMPORTEUNIDAD') as TFloatField) do begin
        DisplayFormat := DISPLAY_EUROS4;
        EditFormat := EDIT_EUROS4;
      end;

    if FindField('IMPORTETOTAL') <> NIL then
      with (FieldByName('IMPORTETOTAL') as TFloatField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;
  end;
end;

procedure TdmTablaPresupuestos.InicializarTablaPresupuestos(
  Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('BASEIMPONIBLE') <> NIL then
      with (FieldByName('BASEIMPONIBLE') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS4;
        EditFormat := EDIT_EUROS4;
      end;

    if FindField('DESCUENTO') <> NIL then
      with (FieldByName('DESCUENTO') as TFloatField) do begin
        DisplayFormat := DISPLAY_DTO;
        EditFormat := EDIT_DTO;
      end;

    if FindField('IMPORTEDESCUENTO') <> NIL then
      with (FieldByName('IMPORTEDESCUENTO') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS4;
        EditFormat := EDIT_EUROS4;
      end;

    if FindField('IVA') <> NIL then
      with (FieldByName('IVA') as TFloatField) do begin
        DisplayFormat := DISPLAY_DTO;
        EditFormat := EDIT_DTO;
      end;

    if FindField('IMPORTEIVA') <> NIL then
      with (FieldByName('IMPORTEIVA') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS4;
        EditFormat := EDIT_EUROS4;
      end;

    if FindField('IMPORTETOTAL') <> NIL then
      with (FieldByName('IMPORTETOTAL') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;
  end;
end;

procedure TdmTablaPresupuestos.IniciarSQLDetalles;
begin
  with sqlInsertarDetalles do
  begin
    Add('insert into DETALLESPRESUPUESTOSARTICULOS ( ');
    Add('CODIGOPRESUPUESTO, NUMCONCEPTO, TIPOCONCEPTO, ');
    Add('CODIGOARTICULO, ');
    Add('DESCRIPCION, CANTIDAD, IMPORTEUNIDAD, ');
    Add('IMPORTETOTAL, OBSERVACIONES) values ( ');
    Add(':CODIGOPRESUPUESTO, :NUMCONCEPTO, :TIPOCONCEPTO, ');
    Add(':CODIGOARTICULO, ');
    Add(':DESCRIPCION, :CANTIDAD, ');
    Add(':IMPORTEUNIDAD, :IMPORTETOTAL, :OBSERVACIONES);');
  end;

  with sqlModificarDetalles do
  begin
    Add('update DETALLESPRESUPUESTOSARTICULOS set ');
    Add('CODIGOARTICULO = :CODIGOARTICULO, ');
    Add('TIPOCONCEPTO = :TIPOCONCEPTO, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('CANTIDAD = :CANTIDAD, ');
    Add('IMPORTEUNIDAD = :IMPORTEUNIDAD, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL, ');
    Add('OBSERVACIONES = :OBSERVACIONES ');
    Add('where (CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO) ');
    Add('and (NUMCONCEPTO = :NUMCONCEPTO);');
  end;

  with sqlEliminarDetalles do
  begin
    Add('delete from DETALLESPRESUPUESTOSARTICULOS ');
    Add('where (CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO)');
  end;

  with sqlConsultarDetalles do
  begin
    Add('select * from DETALLESPRESUPUESTOSARTICULOS ');
    Add('where (CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO)');
  end;


  with sqlInsertarPropiedades do
  begin
    Add('insert into DETALLESPRESUPUESTOSPROPIEDADES ( ');
    Add('CODIGOPRESUPUESTO, NUMCONCEPTO, NUMPROPIEDAD, CODIGOPROPIEDAD, ');
    Add('VALOR) ');
    Add('values ( ');
    Add(':CODIGOPRESUPUESTO, :NUMCONCEPTO, :NUMPROPIEDAD, ');
    Add(':CODIGOPROPIEDAD, :VALOR)');
  end;

  with sqlModificarPropiedades do
  begin
    Add('update DETALLESPRESUPUESTOSPROPIEDADES set ');
    Add('CODIGOPROPIEDAD = :CODIGOPROPIEDAD, ');
    Add('VALOR = :VALOR ');
    Add('where (CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) and ');
    Add('(NUMPROPIEDAD = :NUMPROPIEDAD)');
  end;

  with sqlEliminarPropiedades do
  begin
    Add('delete from DETALLESPRESUPUESTOSPROPIEDADES ');
    Add('where (CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) and ');
    Add('(NUMPROPIEDAD = :NUMPROPIEDAD);');
  end;

  with sqlConsultarPropiedades do
  begin
    Add('select * from DETALLESPRESUPUESTOSPROPIEDADES ');
    Add('where (CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) and ');
    Add('(NUMPROPIEDAD = :NUMPROPIEDAD);');
  end;
end;

procedure TdmTablaPresupuestos.IniciarSQLGrids;
begin
  with sqlConsultarGridPresupuestosContratar do
  begin
    Add('select PRE.CODIGO, PRE.SITUACION, PRE.FECHAPRESUPUESTO, ');
    Add('PRE.FECHADECISION, PRE.CODIGOCLIENTE, PRE.NIFCIF, PRE.NOMBRE, ');
    Add('PRE.IMPORTETOTAL, PRE.CODIGODOCUMENTO, DOC.DESCRIPCION');
    Add('from PRESUPUESTOSCLIENTE PRE, DOCUMENTOS DOC ');
    Add('where DOC.CODIGO = PRE.CODIGODOCUMENTO and ');
    Add('CODIGOCONTRATO is null and ');
    Add('UPPER(SITUACION) = ''ACEPTADO''');
    Add('order by PRE.FECHAPRESUPUESTO, PRE.CODIGO desc');
  end;

  with sqlConsultarGridPresupuestos do
  begin
    Add('select PRE.CODIGO, PRE.SITUACION, PRE.FECHAPRESUPUESTO, ');
    Add('PRE.FECHADECISION, PRE.CODIGOCLIENTE, PRE.NIFCIF, PRE.NOMBRE, ');
    Add('PRE.IMPORTETOTAL, PRE.CODIGODOCUMENTO, DOC.DESCRIPCION, PRE.CODIGOCONTRATO ');
    Add('from PRESUPUESTOSCLIENTE PRE, DOCUMENTOS DOC ');
    Add('where DOC.CODIGO = PRE.CODIGODOCUMENTO ');
    Add('order by PRE.FECHAPRESUPUESTO, PRE.CODIGO desc');
  end;

  with sqlConsultarGridDetalles do
  begin
    Add('select CODIGOPRESUPUESTO, NUMCONCEPTO, CODIGOARTICULO, TIPOCONCEPTO, ');
    Add('DESCRIPCION, CANTIDAD, IMPORTEUNIDAD, IMPORTETOTAL, OBSERVACIONES ');
    Add('from DETALLESPRESUPUESTOSARTICULOS ');
    Add('where CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO ');
    Add('order by CODIGOPRESUPUESTO, NUMCONCEPTO');
  end;

  with sqlConsultarGridPropiedades do
  begin
    Add('select CODIGOPRESUPUESTO, NUMCONCEPTO, NUMPROPIEDAD, ');
    Add('CODIGOPROPIEDAD, VALOR ');
    Add('from DETALLESPRESUPUESTOSPROPIEDADES ');
    Add('where CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO ');
    Add('order by NUMCONCEPTO, NUMPROPIEDAD');
  end;

  with sqlConsultarGridPropiedadesModal do
  begin
    Add('select CODIGOPRESUPUESTO, NUMCONCEPTO, NUMPROPIEDAD, ');
    Add('CODIGOPROPIEDAD, VALOR ');
    Add('from DETALLESPRESUPUESTOSPROPIEDADES ');
    Add('where CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO and ');
    Add('NUMCONCEPTO = :NUMCONCEPTO ');
    Add('order by CODIGOPRESUPUESTO, NUMCONCEPTO, NUMPROPIEDAD');
  end;
end;

procedure TdmTablaPresupuestos.IniciarSQLPresupuesto;
begin
  with sqlInsertarPresupuesto do
  begin
    Add('insert into PRESUPUESTOSCLIENTE ( ');
    Add('CODIGO, FECHAALTA, USUARIO, ');
    Add('FECHAPRESUPUESTO, SITUACION, FECHADECISION, ');
    Add('CODIGOCLIENTE, NIFCIF, NOMBRE, CALLE, ');
    Add('NUMERO, PISO, CODIGOPOSTAL, POBLACION, ');
    Add('PROVINCIA, TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, PERSONACONTACTO, VENDEDOR, ');
    Add('BASEIMPONIBLE, DESCUENTO, ');
    Add('IMPORTEDESCUENTO, IVA, IMPORTEIVA, ');
    Add('IMPORTETOTAL, CODIGODOCUMENTO, VIGENCIAPRESUPUESTO, ');
    Add('OBSERVACIONES, PLAZOENTREGA, FORMAPAGO, DESGLOSES, AUMENTO) values (');
    Add(':CODIGO, :FECHAALTA, :USUARIO, ');
    Add(':FECHAPRESUPUESTO, :SITUACION, ');
    Add(':FECHADECISION, :CODIGOCLIENTE, ');
    Add(':NIFCIF, :NOMBRE, :CALLE, :NUMERO, ');
    Add(':PISO, :CODIGOPOSTAL, :POBLACION, ');
    Add(':PROVINCIA, :TELEFONO1, :TELEFONO2, :MOVIL1, :MOVIL2, :FAX, :PERSONACONTACTO, :VENDEDOR, ');
    Add(':BASEIMPONIBLE, :DESCUENTO, ');
    Add(':IMPORTEDESCUENTO, :IVA, :IMPORTEIVA, ');
    Add(':IMPORTETOTAL, :CODIGODOCUMENTO, :VIGENCIAPRESUPUESTO, ');
    Add(':OBSERVACIONES, :PLAZOENTREGA, :FORMAPAGO, :DESGLOSES, :AUMENTO) ');
  end;

  with sqlModificarPresupuesto do
  begin
    Add('update PRESUPUESTOSCLIENTE set ');
    Add('CODIGODOCUMENTO = :CODIGODOCUMENTO, ');
    Add('FECHAPRESUPUESTO = :FECHAPRESUPUESTO, ');
    Add('SITUACION = :SITUACION, ');
    Add('FECHADECISION = :FECHADECISION, ');
    Add('CODIGOCLIENTE = :CODIGOCLIENTE, ');
    Add('NIFCIF = :NIFCIF, ');
    Add('NOMBRE = :NOMBRE, ');
    Add('CALLE = :CALLE, ');
    Add('NUMERO = :NUMERO, ');
    Add('PISO = :PISO, ');
    Add('CODIGOPOSTAL = :CODIGOPOSTAL, ');
    Add('POBLACION = :POBLACION, ');
    Add('PROVINCIA = :PROVINCIA, ');
    Add('VENDEDOR = :VENDEDOR, ');
    Add('TELEFONO1 = :TELEFONO1, ');
    Add('TELEFONO2 = :TELEFONO2, ');
    Add('MOVIL1 = :MOVIL1, ');
    Add('MOVIL2 = :MOVIL2, ');
    Add('FAX = :FAX, ');
    Add('PERSONACONTACTO = :PERSONACONTACTO, ');
    Add('BASEIMPONIBLE = :BASEIMPONIBLE, ');
    Add('DESCUENTO = :DESCUENTO, ');
    Add('IMPORTEDESCUENTO = :IMPORTEDESCUENTO, ');
    Add('IVA = :IVA, ');
    Add('IMPORTEIVA = :IMPORTEIVA, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL, ');
    Add('VIGENCIAPRESUPUESTO = :VIGENCIAPRESUPUESTO, ');
    Add('OBSERVACIONES = :OBSERVACIONES, ');
    Add('PLAZOENTREGA = :PLAZOENTREGA, ');
    Add('FORMAPAGO = :FORMAPAGO, ');
    Add('DESGLOSES = :DESGLOSES, ');
    Add('AUMENTO = :AUMENTO ');
    Add('where (CODIGO = :CODIGO)');
  end;

  with sqlEliminarPresupuesto do
  begin
    Add('delete from PRESUPUESTOSCLIENTE ');
    Add('where CODIGO = :CODIGO');
  end;

  with sqlConsultarPresupuesto do
  begin
    Add('SELECT * FROM PRESUPUESTOSCLIENTE ');
    Add('where CODIGO = :CODIGO');
  end;
end;

function TdmTablaPresupuestos.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contPresupuestosCliente);
end;

function TdmTablaPresupuestos.ValidarCodigo(Codigo: String): Boolean;
begin
  Result := GestorContadores.ValidarCodigo(contPresupuestosCliente, Codigo);
end;

function TdmTablaPresupuestos.DarSituacionPresupuesto(
  Codigo: String): String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select SITUACION ');
    SQL.Add('from PRESUPUESTOSCLIENTE ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      Result := UpperCase(FieldByName('SITUACION').AsString);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPresupuestos.DarContratoDelPresupuesto (CodigoPresupuesto: String): String;
var
  oSQL : TIBSQL;
begin
  Result := '';
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOCONTRATO ');
    SQL.Add('from PRESUPUESTOSCLIENTE ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := CodigoPresupuesto;
    try
      Prepare;
      ExecQuery;
      Result := FieldByName('CODIGOCONTRATO').AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaPresupuestos.InicializarGridPropiedades(var vGrid: TcxGridDBCardView);
var
  Columna : TcxGridDBCardViewRow;
begin
  with vGrid do
  begin
    {Columna CODIGOPRESUPUESTO}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'CODIGOPRESUPUESTO';
    Columna.Visible := False;
    {Columna NUMCONCEPTO}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'NUMCONCEPTO';
    Columna.Visible := False;
    Columna.SortOrder := soAscending;
    {Columna NUMPROPIEDAD}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'NUMPROPIEDAD';
    Columna.Visible := False;
    Columna.SortOrder := soAscending;
    {Columna CODIGOPROPIEDAD}
{    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'CODIGOPROPIEDAD';
    Columna.Caption := 'Codigo propiedad';
    Columna.PropertiesClassName := 'TcxComboBoxProperties';}
    {Columna VALOR}
{    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'VALOR';
    Columna.Caption := 'Valor';
    Columna.PropertiesClassName := 'TcxComboBoxProperties';}
  end;
end;

function TdmTablaPresupuestos.AsignarContrato(CodigoPresupuesto,
  CodigoContrato: String): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(CodigoPresupuesto) or EsCadenaVacia(CodigoContrato) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PRESUPUESTOSCLIENTE set ');
    SQL.Add('CODIGOCONTRATO = :CODIGOCONTRATO ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := CodigoPresupuesto;
    ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPresupuestos.AceptarPresupuesto(Codigo: String;
  FechaAceptacion: TDateTime): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PRESUPUESTOSCLIENTE set ');
    SQL.Add('SITUACION = ''ACEPTADO'', ');
    SQL.Add('FECHADECISION = :FECHADECISION ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('FECHADECISION').AsDate := FechaAceptacion;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaPresupuestos.InicializarGridPrecios(
  var Grid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with Grid do
  begin
    OptionsView.Footer := False;
    {Columna CODIGOPRESUPUESTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOPRESUPUESTO';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    {Columna NUMCONCEPTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NUMCONCEPTO';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;

    {Columna TIPOCONCEPTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TIPOCONCEPTO';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;

    {Columna DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Concepto';
    Columna.Width := tamColDescripcion;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxMemoProperties';
    with TcxMemoProperties(Columna.Properties) do
    begin
      ScrollBars := ssVertical;
    end;

    {Columna IMPORTEUNIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTEUNIDAD';
    Columna.Caption := 'Importe';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxCalcEditProperties';
    Columna.HeaderAlignmentHorz := taRightJustify;
  end;
end;

function TdmTablaPresupuestos.CopiarPresupuesto(
  CodigoPresupuesto: String): String;
var
  oSQL : TIBSQL;
  oSQL2 : TIBSQL;
  oSQL3 : TIBSQL;
  CodigoAux : String;
  CodConAux : String;
begin
  Result := '';

  CodigoAux := DarNuevoCodigo;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;

    with SQL do
    begin
      Add('INSERT INTO PRESUPUESTOSCLIENTE ( ');
      Add('CODIGO, FECHAALTA, ');
      Add('USUARIO, CODIGODOCUMENTO, ');
      Add('FECHAPRESUPUESTO, CODIGOCONTRATO, ');
      Add('SITUACION, FECHADECISION, ');
      Add('CODIGOCLIENTE, NIFCIF, ');
      Add('NOMBRE, CALLE, ');
      Add('NUMERO, PISO, ');
      Add('CODIGOPOSTAL, POBLACION, ');
      Add('PROVINCIA, TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, PERSONACONTACTO, ');
      Add('OBSERVACIONES, VENDEDOR, ');
      Add('BASEIMPONIBLE, DESCUENTO, ');
      Add('IMPORTEDESCUENTO, IVA, ');
      Add('IMPORTEIVA, IMPORTETOTAL, ');
      Add('VIGENCIAPRESUPUESTO, PLAZOENTREGA, ');
      Add('FORMAPAGO, DESGLOSES, AUMENTO) ');
      Add('SELECT ''' + CodigoAux + ''', current_date, ');
      Add('''' + dmBaseDatos.Usuario + ''', CODIGODOCUMENTO,');
      Add('current_date, NULL,');
      Add('''PENDIENTE'', NULL, ');
      Add('CODIGOCLIENTE,');
      Add('NIFCIF, NOMBRE,');
      Add('CALLE, NUMERO,');
      Add('PISO, CODIGOPOSTAL,');
      Add('POBLACION, PROVINCIA,');
      Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, PERSONACONTACTO, ');
      Add('OBSERVACIONES, VENDEDOR, ');
      Add('BASEIMPONIBLE, DESCUENTO, IMPORTEDESCUENTO,');
      Add('IVA, IMPORTEIVA,');
      Add('IMPORTETOTAL, VIGENCIAPRESUPUESTO, PLAZOENTREGA, FORMAPAGO, ');
      Add('DESGLOSES, AUMENTO ');
      Add('from PRESUPUESTOSCLIENTE ');
      Add('where CODIGO = :CODIGO');
    end;
    ParamByName('CODIGO').AsString := CodigoPresupuesto;
  end;

  oSQL2 := TIBSQL.Create(Self);
  with oSQL2 do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    with SQL do
    begin
      Add('  INSERT INTO DETALLESPRESUPUESTOSARTICULOS ( ');
      Add('    CODIGOPRESUPUESTO, ');
      Add('    NUMCONCEPTO, ');
      Add('    TIPOCONCEPTO, ');
      Add('    CODIGOARTICULO, ');
      Add('    DESCRIPCION, ');
      Add('    CANTIDAD, ');
      Add('    IMPORTEUNIDAD, ');
      Add('    IMPORTETOTAL, ');
      Add('    OBSERVACIONES) ');
      Add('select ''' + CodigoAux + ''', NUMCONCEPTO,');
      Add('TIPOCONCEPTO, CODIGOARTICULO, ');
      Add('DESCRIPCION, CANTIDAD,');
      Add('IMPORTEUNIDAD, IMPORTETOTAL, OBSERVACIONES ');
      Add('from DETALLESPRESUPUESTOSARTICULOS ');
      Add('where CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO');
    end;
    ParamByName('CODIGOPRESUPUESTO').AsString := CodigoPresupuesto;
  end;

  oSQL3 := TIBSQL.Create(Self);
  with oSQL3 do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;

    SQL.Add('insert into DETALLESPRESUPUESTOSPROPIEDADES (');
    SQL.Add('CODIGOPRESUPUESTO, NUMCONCEPTO, NUMPROPIEDAD, ');
    SQL.Add('CODIGOPROPIEDAD, VALOR) ');
    SQL.Add('select  ''' + CodigoAux + ''', NUMCONCEPTO, ');
    SQL.Add('NUMPROPIEDAD, CODIGOPROPIEDAD, VALOR ');
    SQL.Add('from DETALLESPRESUPUESTOSPROPIEDADES ');
    SQL.Add('where CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO');

    ParamByName('CODIGOPRESUPUESTO').AsString := CodigoPresupuesto;
  end;
    
  try
    oSQL.Prepare;
    oSQL2.Prepare;
    oSQL3.Prepare;

    oSQL.ExecQuery;
    oSQL2.ExecQuery;
    oSQL3.ExecQuery;

    IncrementarCodigo;
    Result := CodigoAux;
  finally
    oSQL.Close;
    oSQL.Transaction := NIL;
    oSQL.Free;

    oSQL2.Close;
    oSQL2.Transaction := NIL;
    oSQL2.Free;

    oSQL3.Close;
    oSQL3.Transaction := NIL;
    oSQL3.Free;
  end;
end;

{ TListaDetallesPresupuesto }

procedure TListaDetallesPresupuesto.AssignTo(Dest: TPersistent);
begin
  if not (Dest is TDatosDetallePresupuesto) then
    AssignError(Dest);
{  (Dest as TDatosDetallePresupusto).Codigo := Codigo;
  (Dest as TDatosDetallePresupusto).Descripcion := Descripcion;
  (Dest as TDatosDetallePresupusto).Familia := Familia;
  (Dest as TDatosDetallePresupusto).ListaPropiedades.Assign(ListaPropiedades);}
end;

constructor TListaDetallesPresupuesto.Create(CodigoPresupuesto: String);
begin
  inherited Create;
  FCodigoPresupuesto := CodigoPresupuesto;
  ObtenerLista;
end;

constructor TListaDetallesPresupuesto.Create;
begin
  inherited;
  FCodigoPresupuesto := '';
end;

function TListaDetallesPresupuesto.GetDetallePresupuesto(
  Index: Integer): TDatosDetallePresupuesto;
begin
  Result := TDatosDetallePresupuesto(FLista.Items[Index]);
end;

procedure TListaDetallesPresupuesto.ObtenerLista;
var
  oSQL1 : TIBSQL;
  oSQL2 : TIBSQL;
  Detalle : TDatosDetallePresupuesto;
  Propiedad : TDatosPropiedad;
begin
  oSQL1 := TIBSQL.Create(nil);
  oSQL2 := TIBSQL.Create(nil);

  with oSQL1 do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from DETALLESPRESUPUESTOSARTICULOS');
    SQL.Add('where CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO');
    SQL.Add('order by NUMCONCEPTO');
    ParamByName('CODIGOPRESUPUESTO').AsString := FCodigoPresupuesto;
  end;

  with oSQL2 do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from DETALLESPRESUPUESTOSPROPIEDADES');
    SQL.Add('where CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO');
    SQL.Add('order by NUMCONCEPTO');
    ParamByName('CODIGOPRESUPUESTO').AsString := FCodigoPresupuesto;
  end;

  try
    oSQL1.Prepare;
    oSQL1.ExecQuery;

    oSQL2.Prepare;
    oSQL2.ExecQuery;

    while not oSQL1.EOF do begin
      Detalle := TDatosDetallePresupuesto.Create;
      with Detalle do
      begin
        NumConcepto := oSQL1.FieldByName('NUMCONCEPTO').AsInteger;
        CodigoArticulo := oSQL1.FieldByName('CODIGOARTICULO').AsString;
        TipoConcepto := oSQL1.FieldByName('TIPOCONCEPTO').AsString;
        Descripcion := oSQL1.FieldByName('DESCRIPCION').AsString;
        Cantidad := oSQL1.FieldByName('CANTIDAD').AsInteger;
        ImporteUnidad := oSQL1.FieldByName('IMPORTEUNIDAD').AsInteger;
        ImporteTotal := oSQL1.FieldByName('IMPORTETOTAL').AsInteger;
      end;

      while (not oSQL2.EOF) and
            (oSQL2.FieldByName('NUMCONCEPTO').AsInteger = Detalle.NumConcepto) do
      begin
        Propiedad := TDatosPropiedad.Create;
        with Propiedad do
        begin
          CodigoPropiedad := oSQL2.FieldByName('CODIGOPROPIEDAD').AsInteger;
          Valor := oSQL2.FieldByName('VALOR').AsString;
        end;
        Detalle.ListaPropiedades.Add(Propiedad);
        oSQL2.Next;
      end;
      FLista.Add(Detalle);
      oSQL1.Next;
    end;
  finally
    with oSQL1 do
    begin
      Close;
      Transaction := NIL;
      Free;
    end;
    with oSQL2 do
    begin
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TDatosDetallePresupuesto }

procedure TDatosDetallePresupuesto.AssignTo(Dest: TPersistent);
begin
  inherited;

end;

constructor TDatosDetallePresupuesto.Create;
begin
  inherited;
  FListaPropiedades := TListaPropiedadesPresupuesto.Create;
end;

destructor TDatosDetallePresupuesto.Destroy;
begin
  FListaPropiedades.Free;
  FListaPropiedades := NIL;
  inherited;
end;

procedure TDatosDetallePresupuesto.ObtenerDatos;
begin
  inherited;

end;

{ TDatosPresupuesto }

procedure TDatosPresupuesto.AssignTo(Dest: TPersistent);
begin
  inherited;

end;

constructor TDatosPresupuesto.Create(CodigoPresupuesto: String);
begin
  inherited Create;
  Codigo := CodigoPresupuesto;
  ObtenerDatos;
  FListaDetallesPresupuesto := TListaDetallesPresupuesto.Create(Codigo);
end;

constructor TDatosPresupuesto.Create;
begin
  inherited Create;
  FListaDetallesPresupuesto := TListaDetallesPresupuesto.Create;
end;

destructor TDatosPresupuesto.Destroy;
begin
  FListaDetallesPresupuesto.Free;
  FListaDetallesPresupuesto := NIL;
  inherited;
end;

procedure TDatosPresupuesto.ObtenerDatos;
var
  oSQL : TIBSQL;
begin
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from PRESUPUESTOSCLIENTE ');
    SQL.Add('where CODIGO = :CODIGO');

    try
      ParamByName('CODIGO').AsString := Codigo;
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
      begin
        FechaAlta := FieldByName('FECHAALTA').AsDateTime;
        Usuario := FieldByName('USUARIO').AsString;
        FechaPresupuesto := FieldByName('FECHAPRESUPUESTO').AsDateTime;
        CodigoDocumento := FieldByName('CODIGODOCUMENTO').AsString;
        Situacion := FieldByName('SITUACION').AsString;
        FechaDecision := FieldByName('FECHADECISION').AsDateTime;
        CodigoCliente := FieldByName('CODIGOCLIENTE').AsString;
        NIFCIF := FieldByName('NIFCIF').AsString;
        Nombre := FieldByName('NOMBRE').AsString;
        Calle := FieldByName('CALLE').AsString;
        Numero := FieldByName('NUMERO').AsString;
        Piso := FieldByName('PISO').AsString;
        CodigoPostal := FieldByName('CODIGOPOSTAL').AsString;
        Poblacion := FieldByName('POBLACION').AsString;
        Provincia := FieldByName('PROVINCIA').AsString;
        Telefono1 := FieldByName('TELEFONO1').AsString;
        Telefono2 := FieldByName('TELEFONO2').AsString;
        Movil1 := FieldByName('MOVIL1').AsString;
        Movil2 := FieldByName('MOVIL2').AsString;
        Fax := FieldByName('FAX').AsString;
        PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
        Observaciones := FieldByName('OBSERVACIONES').AsString;
        Vendedor := FieldByName('VENDEDOR').AsString;
        BaseImponible := FieldByName('BASEIMPONIBLE').AsDouble;
        Descuento := FieldByName('DESCUENTO').AsInteger;
        ImporteDescuento := FieldByName('IMPORTEDESCUENTO').AsDouble;
        Iva := FieldByName('IVA').AsInteger;
        ImporteIva := FieldByName('IMPORTEIVA').AsDouble;
        ImporteTotal := FieldByName('IMPORTETOTAL').AsDouble;
        VigenciaPresupuesto := FieldByName('VIGENCIAPRESUPUESTO').AsDateTime;
        PlazoEntrega := FieldByName('PLAZOENTREGA').AsString;
        FormaPago := FieldByName('FORMAPAGO').AsString;
        Desgloses := FieldByName('DESGLOSES').AsString;
        Aumento := FieldByName('AUMENTO').AsString;
      end
      else begin
        raise Exception.CreateFmt(msgCliNoExistePre, [Codigo]);
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaPropiedadesPresupuesto }

procedure TListaPropiedadesPresupuesto.AssignTo(Dest: TPersistent);
begin
  inherited;

end;

constructor TListaPropiedadesPresupuesto.Create(CodigoArticulo: String);
begin

end;

constructor TListaPropiedadesPresupuesto.Create;
begin
  inherited;

end;

function TListaPropiedadesPresupuesto.GetPropiedad(
  Index: Integer): TDatosPropiedad;
begin

end;

procedure TListaPropiedadesPresupuesto.ObtenerLista;
begin
  inherited;

end;

end.
