{
===============================================================================
  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 TablaContratos;

interface

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

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

  //Contador
  Contadores, RdxGestorContadores;

type
  TListaDetallesContrato = class;
  TDatosDetalleContrato = class;
  TListaPropiedadesContrato = class;

  TDatosContrato = class(TObjeto)
  private
    FListaDetallesContrato : TListaDetallesContrato;
  protected
    procedure ObtenerDatos; override;
    procedure AssignTo(Dest: TPersistent); override;
  public
    Codigo : string;
    FechaAlta : TDateTime;
    Usuario : string;
    CodigoDocumento : string;
    FechaContrato : TDateTime;
    Situacion : string;
    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;
    BaseImponible : double;
    Descuento : integer;
    ImporteDescuento : double;
    IVA : Integer;
    ImporteIVA : double;
    ImporteTotal : double;
    Observaciones : string;
    PlazoEntrega : string;
    FormaPago : string;
    constructor Create(CodigoContrato : String); overload;
    constructor Create; overload; override;
    destructor Destroy; override;
    property ListaDetallesContrato : TListaDetallesContrato read FListaDetallesContrato;
  end;

  TListaDetallesContrato = class(TListaObjetos)
  private
    FCodigoContrato : String;
    function GetDetalleContrato(Index: Integer): TDatosDetalleContrato;
  protected
    procedure AssignTo(Dest: TPersistent); override;
    procedure ObtenerLista; override;
  public
    constructor Create(CodigoContrato: String); overload;
    constructor Create; overload; override;
    property Items[Index: Integer] : TDatosDetalleContrato read GetDetalleContrato;
  end;

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

  TListaPropiedadesContrato = 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;

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

  TdmTablaContratos = class(TDataModule)
  private
    procedure IniciarSQLContrato;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
    function NoFacturarPresupuesto(Codigo: String): boolean;
  public
    sqlConsultarGridContratos : TStrings;
    sqlConsultarGridContratosCli : TStrings;
    sqlConsultarGridContratosFacturar : TStrings;
    sqlConsultarGridBeneficios : TStrings;
    sqlConsultarGridContratosObra : TStrings;

    sqlInsertarContrato : TStrings;
    sqlModificarContrato : TStrings;
    sqlConsultarContrato : TStrings;
    sqlEliminarContrato : TStrings;

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

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

    sqlConsultarContratosCliente : 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 DarSituaciones : TStrings;

    function FormatearNumConcepto(NumConcepto : String) : String;
    function ExisteCodigo(Codigo : String) : Boolean;
    function ExistenContratos: Boolean;    

    function CopiarContrato(CodigoContrato : String) : String;
    function CrearContrato(CodigoPresupuesto : String) : String;
    procedure InicializarGridDetalles(var Grid: TcxGridDBTableView);
    procedure InicializarGridPropiedades(var vGrid: TcxGridDBCardView);
    procedure InicializarGridContratos(var Grid: TcxGrid);
    procedure InicializarGridBeneficios(var Grid: TcxGrid);
    procedure InicializarTablaContratos(Tabla: TPTabla);
    procedure InicializarTablaDetalles(Tabla: TPTabla);
    procedure InicializarTablaBeneficios(Tabla: TPTabla);
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;

    function DarListaAnos: TStrings;

    function DarRutaPlanos(CodigoContrato : String) : String;
  end;

var
  dmTablaContratos: TdmTablaContratos;

implementation

{$R *.DFM}

uses
  Mensajes, Literales, TablaPresupuestos;

{ TdmTablaContratos }

constructor TdmTablaContratos.Create(AOwner: TComponent);
begin
  inherited;
  { Cabecera }
  sqlInsertarContrato := TStringList.Create;
  sqlModificarContrato := TStringList.Create;
  sqlConsultarContrato := TStringList.Create;
  sqlEliminarContrato := 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;

  sqlConsultarContratosCliente := TStringList.Create;

  { Grids }
  sqlConsultarGridContratos := TStringList.Create;
  sqlConsultarGridContratosCli := TStringList.Create;
  sqlConsultarGridContratosFacturar := TStringList.Create;
  sqlConsultarGridBeneficios := TStringList.Create;
  sqlConsultarGridContratosObra := TStringList.Create;

  IniciarSQLContrato;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

function TdmTablaContratos.DarNuevoCodigo: String;
begin
  Result := GestorContadores.darNuevoCodigo(contContratosCliente);
end;

destructor TdmTablaContratos.Destroy;
begin
  { Cabecera }
  sqlInsertarContrato.Free;
  sqlModificarContrato.Free;
  sqlConsultarContrato.Free;
  sqlEliminarContrato.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;

  sqlConsultarContratosCliente.Free;

  { Grids }
  sqlConsultarGridContratos.Free;
  sqlConsultarGridContratosCli.Free;
  sqlConsultarGridContratosFacturar.Free;
  sqlConsultarGridBeneficios.Free;
  sqlConsultarGridContratosObra.Free;
  inherited;
end;

function TdmTablaContratos.ExisteCodigo(Codigo: String): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from CONTRATOSCLIENTE ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      Contador := Fields[0].AsString;
      Result := (Codigo = Contador);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

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

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

function TdmTablaContratos.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contContratosCliente);
end;

procedure TdmTablaContratos.InicializarGridDetalles(var Grid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with Grid do
  begin
    OptionsView.Footer := True;
    {Columna CODIGOCONTRATO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCONTRATO';
    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 FAMILIA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FAMILIA';
    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.Visible := False;

    {Columna REFERENCIA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'REFERENCIA';
    Columna.Caption := 'Referencia';
    Columna.Width := tamColReferencia;
    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 TdmTablaContratos.InicializarGridContratos(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    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 Contratos';
        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 FECHACONTRATO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHACONTRATO';
    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.Visible := 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 := 'Codigo Obra';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Visible := False;
  end;
end;

procedure TdmTablaContratos.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 TdmTablaContratos.InicializarTablaContratos(
  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 TdmTablaContratos.IniciarSQLDetalles;
begin
  with sqlInsertarDetalles do
  begin
    Add('insert into DETALLESCONTRATOSARTICULOS (');
    Add('CODIGOCONTRATO, NUMCONCEPTO, TIPOCONCEPTO, CODIGOARTICULO,');
    Add('REFERENCIA, DESCRIPCION, CANTIDAD,');
    Add('IMPORTEUNIDAD, IMPORTETOTAL, OBSERVACIONES) values (');
    Add(':CODIGOCONTRATO, :NUMCONCEPTO, :TIPOCONCEPTO, :CODIGOARTICULO,');
    Add(':REFERENCIA, :DESCRIPCION, :CANTIDAD,');
    Add(':IMPORTEUNIDAD, :IMPORTETOTAL, :OBSERVACIONES)');
  end;

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

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

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


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

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

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

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

procedure TdmTablaContratos.IniciarSQLGrids;
begin
  with sqlConsultarGridContratosFacturar do
  begin
    Add('select CON.CODIGO, CON.SITUACION, CON.FECHACONTRATO, ');
    Add('CON.CODIGOCLIENTE, CON.NIFCIF, CON.NOMBRE, ');
    Add('CON.IMPORTETOTAL, CON.CODIGODOCUMENTO, DOC.DESCRIPCION');
    Add('from DOCUMENTOS DOC, CONTRATOSCLIENTE CON ');
    Add('where DOC.CODIGO = CON.CODIGODOCUMENTO ');
  end;

  with sqlConsultarGridContratos do
  begin
    Add('select CON.CODIGO, CON.SITUACION, CON.FECHACONTRATO, ');
    Add('CON.CODIGOCLIENTE, CON.NIFCIF, CON.NOMBRE, ');
    Add('CON.IMPORTETOTAL, CON.CODIGODOCUMENTO, DOC.DESCRIPCION, OBR.CODIGOCONTRATO');
    Add('from CONTRATOSCLIENTE CON left join DOCUMENTOS DOC');
    Add('on DOC.CODIGO = CON.CODIGODOCUMENTO left outer join OBRAS OBR');
    Add('on CON.CODIGO = OBR.CODIGOCONTRATO');
  end;

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

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

  with sqlConsultarGridPropiedadesModal do
  begin
    Add('select CODIGOCONTRATO, NUMCONCEPTO, ');
    Add('CODIGOPROPIEDAD, GOVALOR ');
    Add('from DETALLESCONTRATOSPROPIEDADES ');
    Add('where CODIGOCONTRATO = :CODIGOCONTRATO and ');
    Add('NUMCONCEPTO = :NUMCONCEPTO ');
    Add('order by CODIGOCONTRATO, NUMCONCEPTO');
  end;

  with sqlConsultarContratosCliente do
  begin
    Add('select CODIGO, CODIGOCLIENTE ');
    Add('from CONTRATOSCLIENTE ');
    Add('where CODIGOCLIENTE = :CODIGOCLIENTE ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridBeneficios do
  begin
    Add('select cc.codigo, cc.fechacontrato, cc.NIFCIF, cc.nombre, cc.importetotal,');
    Add('(select sum(fpc.importe)');
    Add('from detallesfacturasprovcontratos fpc');
    Add('where fpc.codigocontrato = cc.codigo');
    Add('and fpc.codigoempresa = :CODIGOEMPRESA');
    Add('group by fpc.codigocontrato) as IMPPROV,');

    Add('(select sum(otg.importe)');
    Add('from obrasgastos otg');
    Add('where otg.codigocontrato = cc.codigo');
    Add('group by otg.codigocontrato) as IMPOTROS,');

    Add('(select sum(fcc.importetotal)');
    Add('from facturascliente fcc');
    Add('where fcc.codigocontrato = cc.codigo');
    Add('and fcc.codigoempresa = :CODIGOEMPRESA');
    Add('group by fcc.codigocontrato) as IMPCLI,');

    Add('0 as BENEFICIO, 0 as PORCENTAJE');
    Add('from contratoscliente cc');
    Add('order by cc.fechacontrato, cc.nombre');
  end;

  with sqlConsultarGridContratosObra do
  begin
    Add('select CON.CODIGO, CON.SITUACION, CON.FECHACONTRATO,');
    Add('CON.CODIGOCLIENTE, CON.NIFCIF, CON.NOMBRE,');
    Add('CON.IMPORTETOTAL, CON.CODIGODOCUMENTO, DOC.DESCRIPCION, OBR.CODIGOCONTRATO');
    Add('from CONTRATOSCLIENTE CON left join DOCUMENTOS DOC');
    Add('on DOC.CODIGO = CON.CODIGODOCUMENTO left outer join OBRAS OBR');
    Add('on CON.CODIGO = OBR.CODIGOCONTRATO');
    Add('where OBR.CODIGOCONTRATO is null');
  end;
end;

procedure TdmTablaContratos.IniciarSQLContrato;
begin
  with sqlInsertarContrato do
  begin
    Add('  INSERT INTO CONTRATOSCLIENTE ( ');
    Add('    CODIGO, FECHAALTA, ');
    Add('    USUARIO, CODIGODOCUMENTO, ');
    Add('    FECHACONTRATO, SITUACION, ');
    Add('    CODIGOCLIENTE, NIFCIF, ');
    Add('    NOMBRE, CALLE, NUMERO, ');
    Add('    PISO, CODIGOPOSTAL, ');
    Add('    POBLACION, PROVINCIA, ');
    Add('    TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, PERSONACONTACTO, ');
    Add('    BASEIMPONIBLE, DESCUENTO, ');
    Add('    IMPORTEDESCUENTO, ');
    Add('    IVA, IMPORTEIVA, ');
    Add('    IMPORTETOTAL, ');
    Add('    OBSERVACIONES, PLAZOENTREGA, ');
    Add('    FORMAPAGO) ');
    Add('  VALUES ( ');
    Add('    :CODIGO, :FECHAALTA, ');
    Add('    :USUARIO, :CODIGODOCUMENTO, ');
    Add('    :FECHACONTRATO, :SITUACION, ');
    Add('    :CODIGOCLIENTE, :NIFCIF, ');
    Add('    :NOMBRE, :CALLE, :NUMERO, ');
    Add('    :PISO, :CODIGOPOSTAL, ');
    Add('    :POBLACION, :PROVINCIA, ');
    Add('    :TELEFONO1, :TELEFONO2, :MOVIL1, :MOVIL2, :FAX, :PERSONACONTACTO, ');
    Add('    :BASEIMPONIBLE, :DESCUENTO, ');
    Add('    :IMPORTEDESCUENTO, ');
    Add('    :IVA, :IMPORTEIVA, ');
    Add('    :IMPORTETOTAL, ');
    Add('    :OBSERVACIONES, :PLAZOENTREGA, ');
    Add('    :FORMAPAGO) ');
  end;

  with sqlModificarContrato do
  begin
    Add('  UPDATE CONTRATOSCLIENTE ');
    Add('  SET FECHAALTA = :FECHAALTA, ');
    Add('      USUARIO = :USUARIO, ');
    Add('      CODIGODOCUMENTO = :CODIGODOCUMENTO, ');
    Add('      FECHACONTRATO = :FECHACONTRATO, ');
    Add('      SITUACION = :SITUACION, ');
    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('      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('      OBSERVACIONES = :OBSERVACIONES, ');
    Add('      PLAZOENTREGA = :PLAZOENTREGA, ');
    Add('      FORMAPAGO = :FORMAPAGO ');
    Add('  WHERE (CODIGO = :CODIGO) ');
  end;

  with sqlEliminarContrato do
  begin
    Add('delete from CONTRATOSCLIENTE ');
    Add('where CODIGO = :CODIGO');
  end;

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

function TdmTablaContratos.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contContratosCliente);
end;

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

function TdmTablaContratos.NoFacturarPresupuesto(
  Codigo: String): boolean;
var
  oSQL : TIBSQL;
begin
  { Ya no hace falta código en esta función por que Interbase pone el
    campo CODIGOFACTURA a NULL automáticamente cuando
    se elimina la factura de cliente. }
  Result := True;
end;

procedure TdmTablaContratos.InicializarGridPropiedades(var vGrid: TcxGridDBCardView);
var
  Columna : TcxGridDBCardViewRow;
begin
  with vGrid do
  begin
    {Columna CODIGOCONTRATO}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'CODIGOCONTRATO';
    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 TdmTablaContratos.CrearContrato(CodigoPresupuesto: String) : String;
var
  oSQL : TIBSQL;
  oSQL2 : TIBSQL;
  oSQL3 : TIBSQL;
  CodigoAux : String;
  CodConAux : String;
begin
  Result := '';

  CodConAux := dmTablaPresupuestos.DarContratoDelPresupuesto(CodigoPresupuesto);
  if not EsCadenaVacia(CodConAux) then
  begin
    VerMensaje('Este presupuesto ya tiene contrato (%s)');
    Exit;
  end;

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

    with SQL do
    begin
      Add('  INSERT INTO CONTRATOSCLIENTE ( ');
      Add('    CODIGO, FECHAALTA, ');
      Add('    USUARIO, CODIGODOCUMENTO, ');
      Add('    FECHACONTRATO, SITUACION, ');
      Add('    CODIGOCLIENTE, NIFCIF, ');
      Add('    NOMBRE, CALLE, NUMERO, ');
      Add('    PISO, CODIGOPOSTAL, ');
      Add('    POBLACION, PROVINCIA, ');
      Add('    TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, PERSONACONTACTO, ');
      Add('    BASEIMPONIBLE, DESCUENTO, ');
      Add('    IMPORTEDESCUENTO, ');
      Add('    IVA, IMPORTEIVA, ');
      Add('    IMPORTETOTAL, ');
      Add('    OBSERVACIONES, PLAZOENTREGA, ');
      Add('    FORMAPAGO) ');
      Add('select ''' + CodigoAux + ''', current_date,');
      Add('''' + dmBaseDatos.Usuario + ''', CODIGODOCUMENTO,');
      Add('current_date, ''PENDIENTE'',');
      Add('CODIGOCLIENTE,');
      Add('NIFCIF, NOMBRE,');
      Add('CALLE, NUMERO,');
      Add('PISO, CODIGOPOSTAL,');
      Add('POBLACION, PROVINCIA,');
      Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, PERSONACONTACTO, ');
      Add('BASEIMPONIBLE,');
      Add('DESCUENTO, IMPORTEDESCUENTO,');
      Add('IVA, IMPORTEIVA,');
      Add('IMPORTETOTAL, OBSERVACIONES, PLAZOENTREGA, FORMAPAGO ');
      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 DETALLESCONTRATOSARTICULOS ( ');
      Add('    CODIGOCONTRATO, ');
      Add('    NUMCONCEPTO, ');
      Add('    TIPOCONCEPTO, ');
      Add('    CODIGOARTICULO, ');
      Add('    REFERENCIA, ');      
      Add('    DESCRIPCION, ');
      Add('    CANTIDAD, ');
      Add('    IMPORTEUNIDAD, ');
      Add('    IMPORTETOTAL, ');
      Add('    OBSERVACIONES) ');
      Add('select ''' + CodigoAux + ''', NUMCONCEPTO,');
      Add('TIPOCONCEPTO, CODIGOARTICULO, REFERENCIA, ');
      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 DETALLESCONTRATOSPROPIEDADES (');
    SQL.Add('CODIGOCONTRATO, 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;

    dmTablaContratos.IncrementarCodigo;
    if dmTablaPresupuestos.AsignarContrato(CodigoPresupuesto, CodigoAux) then
      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;

function TdmTablaContratos.CopiarContrato(CodigoContrato: 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 CONTRATOSCLIENTE ( ');
      Add('    CODIGO, FECHAALTA, ');
      Add('    USUARIO, CODIGODOCUMENTO, ');
      Add('    FECHACONTRATO, SITUACION, ');
      Add('    CODIGOCLIENTE, NIFCIF, ');
      Add('    NOMBRE, CALLE, NUMERO, ');
      Add('    PISO, CODIGOPOSTAL, ');
      Add('    POBLACION, PROVINCIA, ');
      Add('    TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, PERSONACONTACTO, ');
      Add('    BASEIMPONIBLE, DESCUENTO, ');
      Add('    IMPORTEDESCUENTO, ');
      Add('    IVA, IMPORTEIVA, ');
      Add('    IMPORTETOTAL, ');
      Add('    OBSERVACIONES, PLAZOENTREGA, ');
      Add('    FORMAPAGO) ');
      Add('SELECT ''' + CodigoAux + ''', current_date, ');
      Add('''' + dmBaseDatos.Usuario + ''', CODIGODOCUMENTO,');
      Add('current_date, ''PENDIENTE'', ');
      Add('CODIGOCLIENTE, NIFCIF, NOMBRE,');
      Add('CALLE, NUMERO, PISO, CODIGOPOSTAL,');
      Add('POBLACION, PROVINCIA,');
      Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, PERSONACONTACTO, BASEIMPONIBLE, DESCUENTO, IMPORTEDESCUENTO,');
      Add('IVA, IMPORTEIVA, IMPORTETOTAL, OBSERVACIONES, PLAZOENTREGA, ');
      Add('FORMAPAGO from CONTRATOSCLIENTE ');
      Add('where CODIGO = :CODIGO');
    end;
    ParamByName('CODIGO').AsString := CodigoContrato;
  end;

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

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

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

    ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
  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;

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

function TdmTablaContratos.DarListaAnos: TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Result := NIL;
  oSQL := TIBSQL.Create(Self);
  Lista := TStringList.Create;
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select distinct(extract(year from FECHACONTRATO)) as ANO ');
    SQL.Add('from CONTRATOSCLIENTE ');
    SQL.Add('order by FECHACONTRATO');
    try
      Prepare;
      ExecQuery;
      while not EOF do begin
        Lista.Append(Fields[0].AsString);
        Next;
      end;
      Result := Lista;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaContratos.InicializarGridBeneficios(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
//    OptionsView.Footer := True;

    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 Contratos';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna FECHACONTRATO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHACONTRATO';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'Nif/Cif';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    Columna.Visible := 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 := 'Imp. contrato';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    {Columna IMPCLI}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPCLI';
    Columna.Caption := 'Cobros cli.';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    {Columna IMPPROV}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPPROV';
    Columna.Caption := 'Gastos prov.';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    {Columna IMPOTROS}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPOTROS';
    Columna.Caption := 'Otros gastos';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;

    {Columna BENEFICIO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'BENEFICIO';
    Columna.Caption := 'Beneficio';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '0 Beneficio total';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna PORCENTAJE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'PORCENTAJE';
    Columna.Caption := 'Porcentaje';
    Columna.HeaderAlignmentHorz := taRightJustify;    
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '0 % Beneficio total';
        Kind := skAverage;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

procedure TdmTablaContratos.InicializarTablaBeneficios(Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('IMPORTETOTAL') <> NIL then
      with (FieldByName('IMPORTETOTAL') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

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

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

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

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

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

function TdmTablaContratos.ExistenContratos: Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select count(*) ');
    SQL.Add('from CONTRATOSCLIENTE ');
    try
      Prepare;
      ExecQuery;
      Result := (Fields[0].AsInteger <> 0);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaContratos.DarRutaPlanos(CodigoContrato: String): String;
var
  oSQL : TIBSQL;
  CodigoAux : String;
begin
  Result := '';
  if EsCadenaVacia(CodigoContrato) then
    Exit;

  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('SELECT CODIGO ');
    SQL.Add('FROM PRESUPUESTOSCLIENTE ');
    SQL.Add('WHERE CODIGOCONTRATO = :CODIGOCONTRATO ');

    try
      ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
        CodigoAux := FieldByName('CODIGO').AsString
      else
        CodigoAux := CodigoContrato;

      Result := PathDelim + StringReplace(CodigoAux,'/','',[rfReplaceAll]);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaDetallesContrato }

procedure TListaDetallesContrato.AssignTo(Dest: TPersistent);
begin
  if not (Dest is TDatosDetalleContrato) 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 TListaDetallesContrato.Create(CodigoContrato: String);
begin

end;

constructor TListaDetallesContrato.Create;
begin
  inherited;

end;

function TListaDetallesContrato.GetDetalleContrato(
  Index: Integer): TDatosDetalleContrato;
begin

end;

procedure TListaDetallesContrato.ObtenerLista;
var
  oSQL1 : TIBSQL;
  oSQL2 : TIBSQL;
  Detalle : TDatosDetalleContrato;
  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 DETALLESCONTRATOSARTICULOS');
    SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO');
    SQL.Add('order by NUMCONCEPTO');
    ParamByName('CODIGOCONTRATO').AsString := FCodigoContrato;
  end;

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

  try
    oSQL1.Prepare;
    oSQL1.ExecQuery;

    oSQL2.Prepare;
    oSQL2.ExecQuery;

    while not oSQL1.EOF do begin
      Detalle := TDatosDetalleContrato.Create;
      with Detalle do
      begin
        NumConcepto := oSQL1.FieldByName('NUMCONCEPTO').AsInteger;
        TipoConcepto := oSQL1.FieldByName('TIPOCONCEPTO').AsString;
        CodigoArticulo := oSQL1.FieldByName('CODIGOARTICULO').AsString;
        Referencia := oSQL1.FieldByName('REFERENCIA').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;

{ TDatosDetalleContrato }

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

end;

constructor TDatosDetalleContrato.Create;
begin
  inherited;

end;

destructor TDatosDetalleContrato.Destroy;
begin

  inherited;
end;

procedure TDatosDetalleContrato.ObtenerDatos;
begin
  inherited;

end;

{ TDatosContrato }

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

end;

constructor TDatosContrato.Create(CodigoContrato: String);
begin
  inherited Create;
  Codigo := CodigoContrato;
  ObtenerDatos;
  FListaDetallesContrato := TListaDetallesContrato.Create(Codigo);
end;

constructor TDatosContrato.Create;
begin
  inherited Create;
  FListaDetallesContrato := TListaDetallesContrato.Create;
end;

destructor TDatosContrato.Destroy;
begin
  FListaDetallesContrato.Free;
  FListaDetallesContrato := NIL;
  inherited;
end;

procedure TDatosContrato.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 CONTRATOSCLIENTE ');
    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;
        FechaContrato := FieldByName('FECHACONTRATO').AsDateTime;
        CodigoDocumento := FieldByName('CODIGODOCUMENTO').AsString;
        Situacion := FieldByName('SITUACION').AsString;
        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;
        BaseImponible := FieldByName('BASEIMPONIBLE').AsDouble;
        Descuento := FieldByName('DESCUENTO').AsInteger;
        ImporteDescuento := FieldByName('IMPORTEDESCUENTO').AsDouble;
        Iva := FieldByName('IVA').AsInteger;
        ImporteIva := FieldByName('IMPORTEIVA').AsDouble;
        ImporteTotal := FieldByName('IMPORTETOTAL').AsDouble;
        PlazoEntrega := FieldByName('PLAZOENTREGA').AsString;
        FormaPago := FieldByName('FORMAPAGO').AsString;
      end
      else begin
        raise Exception.CreateFmt(msgCliNoExistePre, [Codigo]);
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaPropiedadesContrato }

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

end;

constructor TListaPropiedadesContrato.Create(CodigoArticulo: String);
begin

end;

constructor TListaPropiedadesContrato.Create;
begin
  inherited;

end;

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

end;

procedure TListaPropiedadesContrato.ObtenerLista;
begin
  inherited;

end;

end.
