{
===============================================================================
  Copyright (©) 2005. 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: 08-06-2005
  Versión actual: 1.0.0
  Fecha versión actual: 08-06-2005
===============================================================================
  Modificaciones:

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

unit Obra;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RdxFrameInformeTrimestral, Grids, DBGrids, ComCtrls, RdxBotones, ToolWin, ExtCtrls,
  Menus, RXDBCtrl, Configuracion, RdxFrame,
  Db, RdxPaneles, RdxBarras, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
  cxEdit, cxDBData, cxGridLevel, cxClasses, cxControls, cxGridCustomView,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid,
  am2000menuitem, am2000popupmenu, am2000, cxContainer, cxTextEdit,
  cxMaskEdit, cxDropDownEdit, StdCtrls, ActnList, StrUtils,

  Entidades, InformeTrimestralVentas, InformeTrimestralCompras, vistaPrevia,
  RdxTitulos, ImgList, RdxFrameObras, IBCustomDataSet, RxMemDS, InformeListadoPedidosObra,
  InformeListadoTareasObra,
  
  RdxEmpresaActiva, am2000utils, cxDataStorage, cxTL, cxInplaceContainer,
  cxTLData, cxDBTL, cxCalendar, cxDBEdit, cxMemo, cxButtonEdit, AdvPanel,
  cxCheckBox, cxCurrencyEdit;

type
  TfrObra = class(TRdxFrameObras)
    dsObras: TDataSource;
    Acciones: TActionList;
    actAnadirInstalador: TAction;
    actAceptar: TAction;
    brSalir: TRdxBarraInferior;
    bSalir: TRdxBoton;
    actCancelar: TAction;
    brDoble: TRdxBarraInferior;
    bGuardar: TRdxBoton;
    bCancelar: TRdxBoton;
    actEliminarInstalador: TAction;
    actAnadirGasto: TAction;
    actEliminarGasto: TAction;
    dsObrasInstaladores: TDataSource;
    dsObrasGastos: TDataSource;
    actEliminarTodoIns: TAction;
    actEliminarTodoGas: TAction;
    dsObrasPedidos: TDataSource;
    actAnadirPedido: TAction;
    dsTareasObras: TDataSource;
    actEliminarPedido: TAction;
    actAnadirTareaObra: TAction;
    actEliminarTareaObra: TAction;
    actEliminarTodoTareaObra: TAction;
    actSalir: TAction;
    pnlCuerpo: TRdxPanel;
    pnlTitulo: TRdxPanelTituloOperacion;
    pnlContenido: TRdxPanel;
    Splitter1: TSplitter;
    pnlDetalleOtro: TRdxPanel;
    pnlDatosOtro: TAdvPanel;
    Panel1: TPanel;
    pnlGridOtro: TPanel;
    gridTareasObras: TcxGrid;
    gridTareasObrasDBTableView1: TcxGridDBTableView;
    gridTareasObrasLevel1: TcxGridLevel;
    pnlBarraOtro: TPanel;
    bEliminarTareaObra: TRdxBoton;
    bAnadirTareaObra: TRdxBoton;
    bEliminarTodoTareaObra: TRdxBoton;
    pnlListaTrimestres: TRdxPanel;
    tlApartadosObra: TcxTreeList;
    ColPanel: TcxTreeListColumn;
    ColDescripcion: TcxTreeListColumn;
    ColCodigoPedido: TcxTreeListColumn;
    ColEstadoPedido: TcxTreeListColumn;
    pnlDetallePedidosOtros: TRdxPanel;
    pnlVistaPrevia: TPanel;
    pnlDetalleObra: TRdxPanel;
    pnlObra: TRdxPanel;
    pnlDatosObra: TAdvPanel;
    eCodigo: TLabel;
    eNombre: TLabel;
    eProcedencia: TLabel;
    eNIFCIF: TLabel;
    eObservaciones: TLabel;
    eProvincia: TLabel;
    ePoblacion: TLabel;
    eNumero: TLabel;
    ePiso: TLabel;
    Nombre: TcxDBTextEdit;
    Calle: TcxDBTextEdit;
    Observaciones: TcxDBMemo;
    Provincia: TcxDBButtonEdit;
    Poblacion: TcxDBButtonEdit;
    Numero: TcxDBTextEdit;
    Piso: TcxDBTextEdit;
    FechaFin: TcxDBDateEdit;
    CodigoContrato: TcxDBTextEdit;
    pnlDatosContacto: TAdvPanel;
    eTelefono1: TLabel;
    eTelefono2: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    eFax: TLabel;
    eCorreo: TLabel;
    Label1: TLabel;
    Telefono1: TcxDBTextEdit;
    Telefono2: TcxDBTextEdit;
    Movil1: TcxDBTextEdit;
    Movil2: TcxDBTextEdit;
    Fax: TcxDBTextEdit;
    PersonaContacto: TcxDBTextEdit;
    Correo: TcxDBTextEdit;
    pnlOtrosDatos: TAdvPanel;
    pnlInstaladores: TPanel;
    pnlBarraInstaladores: TPanel;
    bEliminar: TRdxBoton;
    bAnadir: TRdxBoton;
    bEliminarTodo: TRdxBoton;
    pnlGridInstaladores: TPanel;
    gridInstaladores: TcxGrid;
    gridInstaladoresDBTableView1: TcxGridDBTableView;
    gridInstaladoresLevel1: TcxGridLevel;
    pnlTituloInstaladores: TPanel;
    Label4: TLabel;
    pnlOtrosGastos: TPanel;
    pnlGridOtrosGastos: TPanel;
    gridOtrosGastos: TcxGrid;
    gridOtrosGastosDBTableView1: TcxGridDBTableView;
    gridOtrosGastosLevel1: TcxGridLevel;
    pnlBarraOtrosGastos: TPanel;
    RdxBoton1: TRdxBoton;
    RdxBoton2: TRdxBoton;
    RdxBoton3: TRdxBoton;
    pnlTituloOtrosGastos: TPanel;
    Label5: TLabel;
    pnlDetallePedido: TRdxScrollPanel;
    pnlDatosProveedor: TAdvPanel;
    Label9: TLabel;
    Label11: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    eTelefono1Prov: TLabel;
    eTelefono2Prov: TLabel;
    eMovil1Prov: TLabel;
    eMovil2Prov: TLabel;
    eFaxProv: TLabel;
    eCorreoProv: TLabel;
    ePersonaContactoProv: TLabel;
    NombreProv: TcxDBButtonEdit;
    CodigoProv: TcxDBTextEdit;
    pnlFasesPedido: TAdvPanel;
    pnlFase1: TPanel;
    Label6: TLabel;
    Label8: TLabel;
    Label7: TLabel;
    eNum: TLabel;
    ObservacionesPed: TcxMemo;
    FechaPed: TcxDateEdit;
    cxPed: TcxCheckBox;
    pnlFase4: TPanel;
    Label10: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label39: TLabel;
    cxTra: TcxCheckBox;
    FechaTra: TcxDateEdit;
    ObservacionesTra: TcxMemo;
    pnlFase3: TPanel;
    Label33: TLabel;
    Label34: TLabel;
    Label35: TLabel;
    Label36: TLabel;
    Label38: TLabel;
    ObservacionesEna: TcxMemo;
    FechaEnaIni: TcxDateEdit;
    cxEna: TcxCheckBox;
    FechaEnaFin: TcxDateEdit;
    pnlFase2: TPanel;
    Label14: TLabel;
    Label28: TLabel;
    Label29: TLabel;
    Label37: TLabel;
    ObservacionesCon: TcxMemo;
    FechaCon: TcxDateEdit;
    cxCon: TcxCheckBox;
    pnlFase5: TPanel;
    Label30: TLabel;
    Label31: TLabel;
    Label32: TLabel;
    Label40: TLabel;
    cxEnt: TcxCheckBox;
    FechaEnt: TcxDateEdit;
    ObservacionesEnt: TcxMemo;
    pnlDatosPedido: TAdvPanel;
    Label41: TLabel;
    Label48: TLabel;
    Label42: TLabel;
    DescripcionPed: TcxDBTextEdit;
    CodigoPed: TcxDBTextEdit;
    ReferenciaPed: TcxDBTextEdit;
    pnlExtra: TRdxBarraSuperior;
    RdxPanel1: TRdxPanel;
    bAnadirPedido: TRdxBoton;
    bEliminarPedido: TRdxBoton;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;

//General
    procedure actAceptarExecute(Sender: TObject);
    procedure actCancelarExecute(Sender: TObject);
    procedure actSalirExecute(Sender: TObject);
    procedure tlApartadosObraFocusedNodeChanged(Sender: TObject;
      APrevFocusedNode, AFocusedNode: TcxTreeListNode);
    procedure ActivarInforme(Panel: Integer);

//Obra, Instaladores, Gastos
    procedure actAnadirInstaladorExecute(Sender: TObject);
    procedure actAnadirGastoExecute(Sender: TObject);
    procedure actEliminarGastoExecute(Sender: TObject);
    procedure actEliminarInstaladorExecute(Sender: TObject);
    procedure actEliminarTodoGasExecute(Sender: TObject);
    procedure actEliminarTodoInsExecute(Sender: TObject);
    procedure ProvinciaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
    procedure NombreProvPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure PoblacionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);

//Pedido
    procedure actAnadirPedidoExecute(Sender: TObject);
    procedure actEliminarPedidoExecute(Sender: TObject);
    procedure pnlFasesPedidoExit(Sender: TObject);
    procedure FechaEnaFinPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure FechaEnaIniPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);

//Otras tareas obra
    procedure actAnadirTareaObraExecute(Sender: TObject);
    procedure actEliminarTareaObraExecute(Sender: TObject);
    procedure actEliminarTodoTareaObraExecute(Sender: TObject);
    procedure pnlOtrosDatosResize(Sender: TObject);
    procedure actEliminarTareaObraUpdate(Sender: TObject);
    procedure actEliminarTodoTareaObraUpdate(Sender: TObject);
    procedure NombreProvPropertiesChange(Sender: TObject);
    procedure DescripcionPedPropertiesChange(Sender: TObject);
    procedure gridTareasObrasDBTableView1CustomDrawCell(
      Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
      AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);

private
//Propiedades Obra
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FCodigoInstalador: Variant;
    FContadorGastosAux: Integer;
    FTablaObrasInstaladores : TIBDataSet;
    FTablaObrasInstaladoresMem : TRxMemoryData;
    FTablaObrasGastos : TIBDataSet;
    FTablaObrasGastosMem : TRxMemoryData;

//Propiedades Pedidos obra y sus fases
    FCodigoPedidoAux: Integer;
    FCodigoPedido: Variant;
    FCodigoProveedor: Variant;
    FTablaObrasPedidos : TIBDataSet;
    FTablaFases : TIBDataSet;
    FTablaFasesMem : TRxMemoryData;

//Propiedades Otras tareas obra
    FTipoTarea: Variant;
    FContadorTareaObraAux: Integer;
    FTablaTareasObras : TIBDataSet;
    FTablaTareasObrasMem : TRxMemoryData;

//Informes de resumen pedidos y otros
    FTablaInformePedidosMem : TRxMemoryData;
    FVistaPrevia : TfrVistaPrevia;
    FInformePedidos : TdmInformeListadoPedidosObra;
    FTablaInformeTareasMem : TRxMemoryData;
    FInformeOtros : TdmInformeListadoTareasObra;
    procedure crearTablaInfPedidos;
    procedure rellenarTablaInfPedidos;
    procedure crearTablaInfTareas;
    procedure rellenarTablaInfTareas;
    procedure crearInformes;
    procedure destruirInformes;
    procedure HabilitarPanelInforme;

//Métodos General
    procedure RefrescarListaApartadosObra;
    procedure ActivarBarrasGrids;
    procedure DesactivarBarrasGrids;

//Métodos Obra
    procedure HabilitarPanelObra;
    procedure crearTablasObra;
    procedure destruirTablasObra;
    procedure activarModoModificarTablasObra;
    procedure activarModoConsultarTablasObra;
    procedure CargarDatosInstaladores;
    procedure BorrarDatosInstaladoresIB;
    procedure SalvarDatosInstaladores;
    procedure CargarDatosGastos;
    procedure BorrarDatosGastosIB;
    procedure SalvarDatosGastos;
    procedure ProvinciaSetText(Sender: TField; const Text: String);
    procedure SetCodigoProvincia (Value : Variant); virtual;
    procedure SetCodigoPoblacion (Value : Variant); virtual;
    procedure SetCodigoInstalador(const Value: Variant);

//Métodos Pedidos obra y sus fases
    procedure HabilitarPanelPedido;
    procedure crearTablasPedidos;
    procedure destruirTablasPedidos;
    procedure activarModoTablasPedidos;
    procedure BuscarPedidoObra;
    procedure CargarDatosFases;
    procedure RefrescarDatosProveedor;
    procedure InicializarFases;
    procedure RefrescarFases;
    procedure VolcarDatosFases;
    procedure BorrarDatosFasesIB;
    procedure SalvarDatosFases;
    procedure EliminarPedido;
    procedure SetCodigoProveedor(const Value: Variant);
    procedure SetCodigoPedido(const Value: Variant);
    procedure ActivarCamposPedido;
    procedure DesactivarCamposPedido;
    procedure refrescarNombrePedido;

//Métodos Otras tareas obra
    procedure HabilitarPanelTareas;
    procedure crearTablasTareas;
    procedure destruirTablasTareas;
    procedure activarModoModificarTablasTareas;
    procedure activarModoConsultarTablasTareas;
    procedure CargarDatosTareasObras;
    procedure BorrarDatosTareasObrasIB;
    procedure SalvarDatosTareasObras;
    function existeInstaladorEnOtrasTareas: Boolean;
    procedure AplicarFiltroGridTareasObras;
    procedure SetTipoTarea(const Value: Variant);

protected
    procedure ActivarModoModificar; override;
    procedure ActivarModoConsultar; override;
    procedure ActivarModoEliminar; override;
    function ModificarDatos : Boolean; override;
    function CancelarModificar : Boolean; override;
    function EliminarDatos : Boolean; override;
    function CancelarEliminar : Boolean; override;
    function ComprobarDatos : Boolean; override;

    procedure VerModal; override;
    procedure FreeContenido; override;
    procedure BuscarObra; override;
    function CloseFrame : Boolean; override;
    function TratarCambios : integer; override;
  public
    property CodigoProveedor : Variant read FCodigoProveedor write SetCodigoProveedor;
    property CodigoPedido : Variant read FCodigoPedido write SetCodigoPedido;
    property CodigoInstalador : Variant read FCodigoInstalador write SetCodigoInstalador;
    property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
    property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;

    property TablaObrasInstaladores : TIBDataSet read FTablaObrasInstaladores write FTablaObrasInstaladores;
    property TablaObrasInstaladoresMem : TRxMemoryData read FTablaObrasInstaladoresMem write FTablaObrasInstaladoresMem;
    property TablaObrasGastos : TIBDataSet read FTablaObrasGastos write FTablaObrasGastos;
    property TablaObrasGastosMem : TRxMemoryData read FTablaObrasGastosMem write FTablaObrasGastosMem;

    property TablaObrasPedidos : TIBDataSet read FTablaObrasPedidos write FTablaObrasPedidos;
    property TablaFases : TIBDataSet read FTablaFases write FTablaFases;
    property TablaFasesMem : TRxMemoryData read FTablaFasesMem write FTablaFasesMem;

    property TablaTareasObras : TIBDataSet read FTablaTareasObras write FTablaTareasObras;
    property TablaTareasObrasMem : TRxMemoryData read FTablaTareasObrasMem write FTablaTareasObrasMem;
    property TipoTarea : Variant read FTipoTarea write SetTipoTarea;

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaObras;
    property CodigoObra;

  end;

var
  frObra: TfrObra;

implementation

{$R *.DFM}

uses
  BaseDatos, TablaFacturasCliente, TablaFacturasProveedor, IBDatabase, FacturaCliente,
  Literales, Mensajes, Variants, ImprimirFacturasCliente,
  Constantes, cxVariants, AsignarTrimestre, FacturaProveedor,
  ImprimirInformeTrimestral, StrFunc, TablaEmpresas, TrimestrePredeterminado,
  TablaObrasPedidos, TablaObras, IB, IBErrorCodes, Excepciones, TablaProvincias,
  TablaPoblaciones, RdxFrameProvincias, Provincias, RdxFramePoblaciones, Poblaciones,
  TablaSucursalesCliente, TablaObrasInstaladores, TablaObrasGastos, Instaladores, RdxFrameInstaladores,
  TablaInstaladores, Proveedores, RdxFrameProveedores, TablaProveedores, TablaTareas,
  DateUtils, cxDBLookupComboBox;


function GetDragSourceGridView(Source: TObject): TcxCustomGridView;
begin
  if (TDragControlObject(Source).Control is TcxGridSite) then
    Result := TcxGridSite(TDragControlObject(Source).Control).GridView
  else
    Result := nil;
end;

constructor TfrObra.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Entidad := entObraCliente;
  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;

  crearTablasObra;
  crearTablasPedidos;
  crearTablasTareas;
  crearInformes;
end;

destructor TfrObra.Destroy;
begin
  destruirTablasObra;
  destruirTablasPedidos;
  destruirTablasTareas;
  destruirInformes;

  inherited;
end;

procedure TfrObra.actAnadirInstaladorExecute(Sender: TObject);
begin
  ContenidoModal := TfrInstaladores.Create(Self);
  gridInstaladores.SetFocus;
end;

procedure TfrObra.actAceptarExecute(Sender: TObject);
begin
  if (RealizarOperacion) then
    CloseFrame;
end;

procedure TfrObra.refrescarListaApartadosObra;
var
  lista : TcxTreeListNode;
  listaAux : TcxTreeListNode;
  listaAux2 : TcxTreeListNode;
  ListaPedidos : TListaPedidos;
  i : integer;

begin
  tlApartadosObra.Clear;

  //PanelObra
  lista := tlApartadosObra.Add;
  lista.Texts[CTE_COL_PANEL] := IntToStr(CTE_PNL_OBRA);
  lista.Texts[CTE_COL_DESCRIPCION] := litObrObra + CodigoObra;

  //PanelPedidos
  listaAux := lista.AddChild;
  listaAux.Texts[CTE_COL_PANEL] := IntToStr(CTE_PNL_PEDIDOS);
  listaAux.Texts[CTE_COL_DESCRIPCION] := litObrPedidos;

  //PanelPedido
  //Rellenamos los pedidos de la obra
  ListaPedidos := dmTablaObrasPedidos.darListaPedidos(CodigoObra);
  for i:=0 to ListaPedidos.Count-1 do
  begin
    listaAux2 := listaAux.AddChild;
    listaAux2.Texts[CTE_COL_PANEL] := IntToStr(CTE_PNL_PEDIDO);
    listaAux2.Texts[CTE_COL_DESCRIPCION] := ListaPedidos.Pedido[i].Descripcion + ' - ' + ListaPedidos.Pedido[i].NombreProv;
    listaAux2.Texts[CTE_COL_CODPEDIDO] := ListaPedidos.Pedido[i].Codigo;
  end;
  FCodigoPedidoAux := ListaPedidos.Count + 1;
  FreeAndNil(ListaPedidos);

  //PanelOtros
  listaAux := lista.AddChild;
  listaAux.Texts[CTE_COL_PANEL] := IntToStr(CTE_PNL_OTROS);
  listaAux.Texts[CTE_COL_DESCRIPCION] := litObrOtros;

  //PanelOtro
  listaAux2 := listaAux.AddChild;
  listaAux2.Texts[CTE_COL_PANEL] := IntToStr(CTE_PNL_OTRO);
  listaAux2.Texts[CTE_COL_DESCRIPCION] := litObrEntregas;
  listaAux2.Texts[CTE_COL_TIPO] := CTE_ENTREGA;

  listaAux2 := listaAux.AddChild;
  listaAux2.Texts[CTE_COL_PANEL] := IntToStr(CTE_PNL_OTRO);
  listaAux2.Texts[CTE_COL_DESCRIPCION] := litObrMontajes;
  listaAux2.Texts[CTE_COL_TIPO] := CTE_MONTAJE;

  listaAux2 := listaAux.AddChild;
  listaAux2.Texts[CTE_COL_PANEL] := IntToStr(CTE_PNL_OTRO);
  listaAux2.Texts[CTE_COL_DESCRIPCION] := litObrRemates;
  listaAux2.Texts[CTE_COL_TIPO] := CTE_REMATE;

  tlApartadosObra.FullExpand;
  tlApartadosObra.SetFocusedNode(lista,[]);
end;

procedure TfrObra.BuscarObra;
begin
  RefrescarListaApartadosObra;
end;

procedure TfrObra.ActivarModoConsultar;
begin
  dsObras.AutoEdit := False;
  dsObrasInstaladores.AutoEdit := False;
  dsObrasGastos.AutoEdit := False;
  dsObrasPedidos.AutoEdit := False;
  dsTareasObras.AutoEdit := False;

  actAnadirPedido.Enabled := False;
  actEliminarPedido.Enabled := False;

  Provincia.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;
  NombreProv.Properties.Buttons[0].Visible := False;

  DesactivarBarrasGrids;
  DesactivarCamposPedido;

  try
    activarModoConsultarTablasObra;
    activarModoTablasPedidos;
    activarModoConsultarTablasTareas;
    Visible := True;
    FechaFin.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.ActivarModoModificar;
begin
  dsObras.AutoEdit := True;
  dsObrasInstaladores.AutoEdit := True;
  dsObrasGastos.AutoEdit := True;
  dsObrasPedidos.AutoEdit := True;
  dsTareasObras.AutoEdit := True;

  actAnadirPedido.Enabled := True;
  actEliminarPedido.Enabled := True;

  // Para que no haga dos accesos a la tabla cuando es consulta
  FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Provincia.Text);
  Provincia.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;
  NombreProv.Properties.Buttons[0].Visible := True;

  ActivarBarrasGrids;
  ActivarCamposPedido;

  try
    activarModoModificarTablasObra;
    activarModoTablasPedidos;
    activarModoModificarTablasTareas;
    Visible := True;
    FechaFin.SetFocus;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgObrObrBloqueado, [CodigoObra]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrObra.CancelarModificar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaObras.Close;

    TablaObrasInstaladores.Close;
    TablaObrasInstaladoresMem.Close;
    TablaObrasGastos.Close;
    TablaObrasGastosMem.Close;

    TablaObrasPedidos.Close;
    TablaFases.Close;
    TablaFasesMem.Close;

    TablaTareasObras.Close;
    TablaTareasObrasMem.Close;

    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrObra.ComprobarDatos: Boolean;
begin
  Result := True;
end;

function TfrObra.ModificarDatos: Boolean;
begin
  Result := False;
  try
    if (TablaObras.State in [dsEdit, dsInsert]) then
       TablaObras.Post;

    if (TablaObrasPedidos.State in [dsEdit, dsInsert]) then
       TablaObrasPedidos.Post;

    BorrarDatosInstaladoresIB;
    SalvarDatosInstaladores;
    BorrarDatosGastosIB;
    SalvarDatosGastos;

    BorrarDatosFasesIB;
    SalvarDatosFases;

    BorrarDatosTareasObrasIB;
    SalvarDatosTareasObras;

    Commit;

    TablaObras.Close;

    TablaObrasInstaladores.Close;
    TablaObrasInstaladoresMem.Close;
    TablaObrasGastos.Close;
    TablaObrasGastosMem.Close;

    TablaObrasPedidos.Close;
    TablaFases.Close;
    TablaFasesMem.Close;

    TablaTareasObras.Close;
    TablaTareasObrasMem.Close;

    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.ProvinciaPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  CaptionModal := msgListaProvincias;
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrProvincias.Create(Self);
end;

procedure TfrObra.PoblacionPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  if (EsCadenaVacia(CodigoProvincia)) then begin
    VerMensaje(msgSinProvincia);
    Provincia.SetFocus;
    Exit;
  end;
  CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.DarNombreProvincia(CodigoProvincia)]);
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrPoblaciones.Create(Self);
end;

procedure TfrObra.SetCodigoPoblacion(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoPoblacion := Value;
    Poblacion.DataBinding.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion);
  end;
end;

procedure TfrObra.SetCodigoProvincia(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoProvincia := Value;
    Provincia.DataBinding.Field.AsString := dmTablaProvincias.DarNombreProvincia(FCodigoProvincia);
  end;
end;

procedure TfrObra.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameProveedores) then
    CodigoProveedor := (ContenidoModal as TRdxFrameProveedores).CodigoProveedor;

  if (ContenidoModal is TRdxFrameInstaladores) then
    CodigoInstalador := (ContenidoModal as TRdxFrameInstaladores).CodigoInstalador;

  if (ContenidoModal is TRdxFrameProvincias) then
    CodigoProvincia := (ContenidoModal as TRdxFrameProvincias).CodigoProvincia;
  if (ContenidoModal is TRdxFramePoblaciones) then begin
    CodigoProvincia := (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia;
    CodigoPoblacion := (ContenidoModal as TRdxFramePoblaciones).CodigoPoblacion;
  end;

  inherited FreeContenido;
end;

procedure TfrObra.VerModal;
begin
  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := FCodigoProvincia;
  inherited;
end;

procedure TfrObra.ProvinciaSetText(Sender: TField; const Text: String);
begin
  FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(Text);
  Sender.AsString := Text;
end;

procedure TfrObra.actCancelarExecute(Sender: TObject);
begin
  if (TratarCambios = IDOK) then
    CloseFrame;
end;

procedure TfrObra.CargarDatosInstaladores;
var
  iContador : Integer;
begin
  with TablaObrasInstaladoresMem do
  begin
    if TablaObrasInstaladores.IsEmpty then
      exit;

    // Localizar la fila donde está la dirección principal
    DisableControls;
    TablaObrasInstaladores.First;
    while not TablaObrasInstaladores.EOF do
    begin
      Append;
      for iContador := 0 to TablaObrasInstaladores.FieldCount-1 do
        Fields[iContador].Value := TablaObrasInstaladores.Fields[iContador].Value;
      Post;
      TablaObrasInstaladores.Next;
    end;
    First;
    EnableControls;
  end;
end;

procedure TfrObra.CargarDatosGastos;
var
  iContador : Integer;
begin
  with TablaObrasGastosMem do
  begin
    if TablaObrasGastos.IsEmpty then
      exit;

    // Localizar la fila donde está la dirección principal
    DisableControls;
    TablaObrasGastos.First;
    while not TablaObrasGastos.EOF do
    begin
      Append;
      for iContador := 0 to TablaObrasGastos.FieldCount-1 do
        Fields[iContador].Value := TablaObrasGastos.Fields[iContador].Value;
      Post;
      TablaObrasGastos.Next;
    end;
    First;
    EnableControls;
  end;
end;

procedure TfrObra.actAnadirGastoExecute(Sender: TObject);
begin
  try
    with TablaObrasGastosMem do
    begin
      Next;
      if EOF then Append
      else begin
        Prior;
        Insert;
      end;
      TablaObrasGastosMem.FieldByName('CODIGOCONTRATO').AsString := CodigoObra;
      TablaObrasGastosMem.FieldByName('CODIGO').AsInteger := FContadorGastosAux;
      TablaObrasGastosMem.FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      TablaObrasGastosMem.FieldByName('USUARIO').AsString := dmBaseDatos.Usuario;
      TablaObrasGastosMem.FieldByName('FECHA').AsDateTime := dmBaseDatos.DarFecha;
      Inc(FContadorGastosAux);
    end;
    gridOtrosGastos.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.actEliminarGastoExecute(Sender: TObject);
begin
  if verMensajePregunta(msgObrEliminarDetalles) = mrYes then
  begin
    if TablaObrasGastos.RecordCount = 0 then begin
      { Hacemos un cancel de la tabla por si el registro actual estuviera
        recien creado }
      TablaObrasGastosMem.Cancel;
      Exit
    end;
    try
      TablaObrasGastosMem.Delete;
    except
      on E : EIBError do
        TratarExcepcion(E);
      on E : Exception do
        TratarExcepcion(E);
    end;
  end;
end;

procedure TfrObra.BorrarDatosGastosIB;
begin
  with TablaObrasGastos do
  begin
    if IsEmpty then
      Exit;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
  end;
end;

procedure TfrObra.SalvarDatosGastos;
var
  NumeroCampo : Integer;
  Valor : Variant;
  Contador : Integer;
begin
  try
    with TablaObrasGastosMem do
    begin
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      TablaObrasGastos.First;
      Contador := 0;
      while not EOF do
      begin
        TablaObrasGastos.Insert;

        for NumeroCampo := 0 to FieldCount-1 do
        begin
          Valor := Fields[NumeroCampo].AsVariant;

          if (TablaObrasGastos.Fields[NumeroCampo].FieldName = 'CODIGO') then
            Valor := Contador;

          TablaObrasGastos.Fields[NumeroCampo].AsVariant := Valor;
        end;
        TablaObrasGastos.Post;
        Inc(Contador);
        Next;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.SetCodigoInstalador(const Value: Variant);
var
  DatosInstalador : TDatosInstalador;
begin
  if (EsCadenaVacia(Value)) then
     Exit;

  FCodigoInstalador := Value;
  if not TablaObrasInstaladoresMem.Locate('CODIGOINSTALADOR', FCodigoInstalador,[]) then
  begin
    DatosInstalador := TDatosInstalador.Create;
    DatosInstalador.Codigo := FCodigoInstalador;
    dmTablaInstaladores.DarDatosInstalador(DatosInstalador); 
    with TablaObrasInstaladoresMem do
    begin
      Append;
      FieldByName('CODIGOCONTRATO').AsString := CodigoObra;
      FieldByName('CODIGOINSTALADOR').AsString := FCodigoInstalador;
      FieldByName('NOMBRE').AsString := DatosInstalador.Nombre;
      FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('USUARIO').AsString := dmBaseDatos.Usuario;
      Post;
      gridInstaladores.Refresh;
    end;
    FreeAndNil(DatosInstalador);
  end
  else verMensajeFmt(msgObrInsRepetido,[FCodigoInstalador]);
end;

procedure TfrObra.actEliminarInstaladorExecute(Sender: TObject);
begin
  if verMensajePregunta(msgObrEliminarDetalles) = mrYes then
  begin
    //Comprobamos si el instalador a eliminar tiene asociado algún entrega, montaje o remate
    if existeInstaladorEnOtrasTareas then
    begin
       VerMensaje(msgObrInsConOtrasTareas1);
       exit;
    end;

    if TablaObrasInstaladores.RecordCount = 0 then begin
      { Hacemos un cancel de la tabla por si el registro actual estuviera
        recien creado }
      TablaObrasInstaladoresMem.Cancel;
      Exit
    end;
    try
      TablaObrasInstaladoresMem.Delete;
    except
      on E : EIBError do
        TratarExcepcion(E);
      on E : Exception do
        TratarExcepcion(E);
    end;
  end;
end;

procedure TfrObra.actEliminarTodoGasExecute(Sender: TObject);
begin
  if verMensajePregunta(msgObrEliminarTodosDetalles) = mrYes then
  begin
    TablaObrasGastosMem.EmptyTable;
  end;
end;

procedure TfrObra.actEliminarTodoInsExecute(Sender: TObject);
begin
  if verMensajePregunta(msgObrEliminarTodosDetalles) = mrYes then
  begin
    with TablaObrasInstaladoresMem do
    begin
      if IsEmpty then
        Exit;
      Last;
      while not BOF do
      begin
        //Comprobamos si el instalador a eliminar tiene asociado algún entrega, montaje o remate
        if not existeInstaladorEnOtrasTareas then
           Delete;
        Prior;
      end;
      if not IsEmpty then
         //Comprobamos si el instalador a eliminar tiene asociado algún entrega, montaje o remate
         if not existeInstaladorEnOtrasTareas then
            Delete;
    end;

    if not TablaObrasInstaladoresMem.IsEmpty then
       VerMensaje(msgObrInsConOtrasTareas2);
  end;
end;

procedure TfrObra.tlApartadosObraFocusedNodeChanged(Sender: TObject;
  APrevFocusedNode, AFocusedNode: TcxTreeListNode);
begin
  if AFocusedNode = nil then
     exit;

  case StrToInt(AFocusedNode.Texts[0]) of
  //PanelObra
    CTE_PNL_OBRA: begin
                    HabilitarPanelObra;
                   end;
  //PanelPedidos
  CTE_PNL_PEDIDOS: begin
                    HabilitarPanelInforme;
                    rellenarTablaInfPedidos;
                    FInformePedidos.CodigoObra := CodigoObra;
                    FInformePedidos.NombreObra := TablaObras.FieldByName('NOMBRE').AsString;
                    FInformePedidos.setDatos(FTablaInformePedidosMem);
                    FInformePedidos.Previsualizar;
                   end;
  //PanelPedido
  CTE_PNL_PEDIDO:  begin
                    HabilitarPanelPedido;
                    CodigoPedido := AFocusedNode.Texts[CTE_COL_CODPEDIDO];
                   end;
  //PanelOtros
  CTE_PNL_OTROS:   begin
                    HabilitarPanelInforme;
                    rellenarTablaInfTareas;
                    FInformeOtros.CodigoObra := CodigoObra;
                    FInformeOtros.NombreObra := TablaObras.FieldByName('NOMBRE').AsString;
                    FInformeOtros.setDatos(FTablaInformeTareasMem);
                    FInformeOtros.Previsualizar;
                   end;
  //PanelOtro
  CTE_PNL_OTRO:    begin
                    HabilitarPanelTareas;
                    TipoTarea := AFocusedNode.Texts[CTE_COL_TIPO];
                   end;
  else
    showmessage('Error: No existe panel');
  end;
end;

procedure TfrObra.BorrarDatosInstaladoresIB;
begin
  with TablaObrasInstaladores do
  begin
    if IsEmpty then
      Exit;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
  end;
end;

procedure TfrObra.SalvarDatosInstaladores;
var
  NumeroCampo : Integer;
  Valor : Variant;
begin
  try
    with TablaObrasInstaladoresMem do
    begin
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      TablaObrasInstaladores.First;
      while not EOF do
      begin
        TablaObrasInstaladores.Insert;

        for NumeroCampo := 0 to FieldCount-1 do
        begin
          Valor := Fields[NumeroCampo].AsVariant;
          TablaObrasInstaladores.Fields[NumeroCampo].AsVariant := Valor;
        end;
        TablaObrasInstaladores.Post;
        Next;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.actAnadirPedidoExecute(Sender: TObject);
var
  Nodo : TcxTreeListNode;

begin
  //Pedidos
  Nodo := tlApartadosObra.FindNodeByText(IntToStr(CTE_PNL_PEDIDOS), tlApartadosObra.Columns[0]);
  Nodo := Nodo.AddChild;
  Nodo.Texts[CTE_COL_PANEL] := IntToStr(CTE_PNL_PEDIDO);
  Nodo.Texts[CTE_COL_DESCRIPCION] := 'Nuevo pedido' + '- ';
  Nodo.Texts[CTE_COL_CODPEDIDO] := IntToStr(FCodigoPedidoAux);
  Inc(FCodigoPedidoAux);
  tlApartadosObra.Refresh;
  Nodo.Focused := True;

  CodigoPedido := Nodo.Texts[CTE_COL_CODPEDIDO];
end;

procedure TfrObra.SetCodigoPedido(const Value: Variant);
begin
  if (EsCadenaVacia(Value)) then
     Exit;

  if (FCodigoPedido <> Value) then
  begin
    FCodigoPedido := Value;
    BuscarPedidoObra;
  end;
end;

procedure TfrObra.NombreProvPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  ContenidoModal := TfrProveedores.Create(Self);
end;

procedure TfrObra.SetCodigoProveedor(const Value: Variant);
var
  DatosProveedor : TDatosProveedor;

begin
  if (EsCadenaVacia(Value)) then
     Exit;

  if (FCodigoProveedor <> Value) then
  begin
    FCodigoProveedor := Value;
    DatosProveedor := TDatosProveedor.Create(FCodigoProveedor);
    with TablaObrasPedidos do
    begin
      if not (State in [dsEdit, dsInsert]) then
         Edit;
      FieldByName('CODIGOPROV').AsString := DatosProveedor.Codigo;
      FieldByName('NOMBREPROV').AsString := DatosProveedor.Nombre;
      FieldByName('TELEFONO1').AsString := DatosProveedor.Telefono1;
      FieldByName('TELEFONO2').AsString := DatosProveedor.Telefono2;
      FieldByName('MOVIL1').AsString := DatosProveedor.Movil1;
      FieldByName('MOVIL2').AsString := DatosProveedor.Movil2;
      FieldByName('FAX').AsString := DatosProveedor.Fax;
      FieldByName('CORREO').AsString := DatosProveedor.Correo;
      FieldByName('PERSONACONTACTO').AsString := DatosProveedor.PersonaContacto;
      RefrescarDatosProveedor;
   end;
   FreeAndNil(DatosProveedor);
  end;
end;

procedure TfrObra.BuscarPedidoObra;
begin
  if not TablaObrasPedidos.Locate('CODIGO', FCodigoPedido, []) then
  begin
  //En el caso de no encontrarse el codigo de pedido es porque es nuevo y añadimos los datos base
    TablaObrasPedidos.Insert;
    TablaObrasPedidos.FieldByName('CODIGOCONTRATO').AsString := CodigoObra;
    TablaObrasPedidos.FieldByName('CODIGO').AsString := FCodigoPedido;
    TablaObrasPedidos.FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
    TablaObrasPedidos.FieldByName('USUARIO').AsString := dmBaseDatos.Usuario;
    TablaObrasPedidos.FieldByName('DESCRIPCION').AsString := 'Nuevo pedido';

  //Insertamos en la tabla de memoria las fases correspondientes al nuevo pedido
    InicializarFases;
    DescripcionPed.SetFocus;
  end;

  //En caso de cambiar de pedido se refrescan los datos de proveedor y de las fases correspondientes
  RefrescarDatosProveedor;
  RefrescarFases;
end;

procedure TfrObra.RefrescarDatosProveedor;
begin
  eTelefono1Prov.Caption := TablaObrasPedidos.FieldByName('TELEFONO1').AsString;
  eTelefono2Prov.Caption := TablaObrasPedidos.FieldByName('TELEFONO2').AsString;
  eMovil1Prov.Caption := TablaObrasPedidos.FieldByName('MOVIL1').AsString;
  eMovil2Prov.Caption := TablaObrasPedidos.FieldByName('MOVIL2').AsString;
  eFaxProv.Caption := TablaObrasPedidos.FieldByName('FAX').AsString;
  eCorreoProv.Caption := TablaObrasPedidos.FieldByName('CORREO').AsString;
  ePersonaContactoProv.Caption := TablaObrasPedidos.FieldByName('PERSONACONTACTO').AsString;
end;

procedure TfrObra.RefrescarFases;
begin
  with TablaFasesMem do
  begin
    First;
    Locate('CODIGOPEDIDO', CodigoPedido, []);

    if (FieldByName('COMPLETADA').AsInteger = CTE_TRUE)
    then cxPed.Checked := True
    else cxPed.Checked := False;
    if FieldByName('FECHAINI').AsVariant = Null
    then FechaPed.Text := ''
    else FechaPed.Date := FieldByName('FECHAINI').AsDateTime;
    ObservacionesPed.Text := FieldByName('OBSERVACIONES').AsString;

    Next;
    if (FieldByName('COMPLETADA').AsInteger = CTE_TRUE)
    then cxCon.Checked := True
    else cxCon.Checked := False;
    if FieldByName('FECHAINI').AsVariant = Null
    then FechaCon.Text := ''
    else FechaCon.Date := FieldByName('FECHAINI').AsDateTime;
    ObservacionesCon.Text := FieldByName('OBSERVACIONES').AsString;

    Next;
    if (FieldByName('COMPLETADA').AsInteger = CTE_TRUE)
    then cxEna.Checked := True
    else cxEna.Checked := False;
    if FieldByName('FECHAINI').AsVariant = Null
    then FechaEnaIni.Text := ''
    else FechaEnaIni.Date := FieldByName('FECHAINI').AsDateTime;
    if FieldByName('FECHAFIN').AsVariant = Null
    then FechaEnaFin.Text := ''
    else FechaEnaFin.Date := FieldByName('FECHAFIN').AsDateTime;
    ObservacionesEna.Text := FieldByName('OBSERVACIONES').AsString;

    Next;
    if (FieldByName('COMPLETADA').AsInteger = CTE_TRUE)
    then cxTra.Checked := True
    else cxTra.Checked := False;
    if FieldByName('FECHAINI').AsVariant = Null
    then FechaTra.Text := ''
    else FechaTra.Date := FieldByName('FECHAINI').AsDateTime;
    ObservacionesTra.Text := FieldByName('OBSERVACIONES').AsString;

    Next;
    if (FieldByName('COMPLETADA').AsInteger = CTE_TRUE)
    then cxEnt.Checked := True
    else cxEnt.Checked := False;
    if FieldByName('FECHAINI').AsVariant = Null
    then FechaEnt.Text := ''
    else FechaEnt.Date := FieldByName('FECHAINI').AsDateTime;
    ObservacionesEnt.Text := FieldByName('OBSERVACIONES').AsString;
  end;
end;

procedure TfrObra.InicializarFases;
begin
  dmTablaTareas.rellenarTareasFase(TablaFasesMem, CodigoPedido);
  TablaFasesMem.Post;
end;

procedure TfrObra.CargarDatosFases;
var
  iContador : Integer;
begin
  with TablaFasesMem do
  begin
    if TablaFases.IsEmpty then
      exit;

    DisableControls;
    TablaFases.First;
    while not TablaFases.EOF do
    begin
      Append;
      for iContador := 0 to TablaFases.FieldCount-1 do
        Fields[iContador].Value := TablaFases.Fields[iContador].Value;
      Post;
      TablaFases.Next;
    end;
    First;
    EnableControls;
  end;
end;

procedure TfrObra.pnlFasesPedidoExit(Sender: TObject);
begin
  VolcarDatosFases;
end;

procedure TfrObra.FechaEnaFinPropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
  FechaEnaIni.Date := IncDay(FechaEnaFin.Date,-7);
end;

procedure TfrObra.FechaEnaIniPropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
  FechaEnaFin.Date := IncDay(FechaEnaIni.Date,7);
end;

procedure TfrObra.VolcarDatosFases;
begin
  //Salvamos los cambios realizados en tabla de memoria
  with TablaFasesMem do
  begin
    First;
    Locate('CODIGOPEDIDO', CodigoPedido, []);

    //Fase 1.Pedido
    Edit;
    if cxPed.Checked
    then FieldByName('COMPLETADA').AsInteger := CTE_TRUE
    else FieldByName('COMPLETADA').AsInteger := CTE_FALSE;
    if FechaPed.Text = ''
    then FieldByName('FECHAINI').AsVariant := Null
    else FieldByName('FECHAINI').AsDateTime := FechaPed.Date;
    FieldByName('OBSERVACIONES').AsString := ObservacionesPed.Text;
    FieldByName('FECHAFIN').AsString := FieldByName('FECHAINI').AsString;
    FieldByName('HORAINI').AsString := CTE_HORAINI;
    FieldByName('HORAFIN').AsString := CTE_HORAFIN;
    Post;

    //Fase 2.Confirmado
    Next;
    Edit;
    if cxCon.Checked
    then FieldByName('COMPLETADA').AsInteger := CTE_TRUE
    else FieldByName('COMPLETADA').AsInteger := CTE_FALSE;
    if FechaCon.Text = ''
    then FieldByName('FECHAINI').AsVariant := Null
    else FieldByName('FECHAINI').AsDateTime := FechaCon.Date;
    FieldByName('OBSERVACIONES').AsString := ObservacionesCon.Text;
    FieldByName('FECHAFIN').AsString := FieldByName('FECHAINI').AsString;
    FieldByName('HORAINI').AsString := CTE_HORAINI;
    FieldByName('HORAFIN').AsString := CTE_HORAFIN;
    Post;

    //Fase 3.En almacen
    Next;
    Edit;
    if cxEna.Checked
    then FieldByName('COMPLETADA').AsInteger := CTE_TRUE
    else FieldByName('COMPLETADA').AsInteger := CTE_FALSE;
    if FechaEnaIni.Text = ''
    then FieldByName('FECHAINI').AsVariant := Null
    else FieldByName('FECHAINI').AsDateTime := FechaEnaIni.Date;
    if FechaEnaFin.Text = ''
    then FieldByName('FECHAFIN').AsVariant := Null
    else FieldByName('FECHAFIN').AsDateTime := FechaEnaFin.Date;
    FieldByName('OBSERVACIONES').AsString := ObservacionesEna.Text;
    FieldByName('HORAINI').AsString := CTE_HORAINI;
    FieldByName('HORAFIN').AsString := CTE_HORAFIN;
    Post;

    //Fase 4.Aviso Trans.
    Next;
    Edit;
    if cxTra.Checked
    then FieldByName('COMPLETADA').AsInteger := CTE_TRUE
    else FieldByName('COMPLETADA').AsInteger := CTE_FALSE;
    if FechaTra.Text = ''
    then FieldByName('FECHAINI').AsVariant := Null
    else FieldByName('FECHAINI').AsDateTime := FechaTra.Date;
    FieldByName('OBSERVACIONES').AsString := ObservacionesTra.Text;
    FieldByName('FECHAFIN').AsString := FieldByName('FECHAINI').AsString;
    FieldByName('HORAINI').AsString := CTE_HORAINI;
    FieldByName('HORAFIN').AsString := CTE_HORAFIN;
    Post;

    //Fase 4.Entregado.
    Next;
    Edit;
    if cxEnt.Checked
    then FieldByName('COMPLETADA').AsInteger := CTE_TRUE
    else FieldByName('COMPLETADA').AsInteger := CTE_FALSE;
    if FechaEnt.Text = ''
    then FieldByName('FECHAINI').AsVariant := Null
    else FieldByName('FECHAINI').AsDateTime := FechaEnt.Date;
    FieldByName('OBSERVACIONES').AsString := ObservacionesEnt.Text;
    FieldByName('FECHAFIN').AsString := FieldByName('FECHAINI').AsString;
    FieldByName('HORAINI').AsString := CTE_HORAINI;
    FieldByName('HORAFIN').AsString := CTE_HORAFIN;
    Post;
  end;
end;

procedure TfrObra.BorrarDatosFasesIB;
begin
  dmTablaTareas.eliminarTareasPedidoObra(CodigoObra);
  with TablaFases do
  begin
    if IsEmpty then
      Exit;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
  end;
end;

procedure TfrObra.SalvarDatosFases;
var
  NumeroCampo : Integer;
  Valor : Variant;
  CodigoPedido : Variant;
  CodigoTarea : Variant;
begin
  try
    with TablaFasesMem do
    begin
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      TablaFases.First;
      while not EOF do
      begin
        TablaFases.Insert;

        for NumeroCampo := 0 to FieldCount-1 do
        begin
          Valor := Fields[NumeroCampo].AsVariant;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'CODIGOPEDIDO') then
          begin
            CodigoPedido := Valor;
            Continue;
          end;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'FECHAALTA') then
             Valor := dmBaseDatos.DarFecha;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'USUARIOALTA')
          or (TablaFases.Fields[NumeroCampo].FieldName = 'USUARIO') then
             Valor := dmBaseDatos.Usuario;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'CODIGO') then
          begin
            if Valor < 10 then
            begin
              Valor := dmTablaTareas.darNuevoCodigo;
              dmTablaTareas.IncrementarCodigo;
            end;
            CodigoTarea := Valor;
          end;

          TablaFases.Fields[NumeroCampo].AsVariant := Valor;
        end;
        TablaFases.Post;
        dmTablaTareas.insertarTareaPedidoObra(CodigoObra, CodigoPedido, CodigoTarea);
        Next;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.actEliminarPedidoExecute(Sender: TObject);
var
  Nodo : TcxTreeListNode;
begin
  Nodo := tlApartadosObra.FocusedNode;
  if (StrToInt(Nodo.Texts[CTE_COL_PANEL]) = CTE_PNL_PEDIDO) then
  begin
    if VerMensajePreguntaFmt(msgObrPrePedBorrar, [Nodo.Texts[CTE_COL_DESCRIPCION]]) = mrYES then
    begin
       EliminarPedido;
       RefrescarListaApartadosObra;
    end
  end
  else
    VerMensaje (msgObrPedSelec);
end;

procedure TfrObra.EliminarPedido;
begin
  TablaObrasPedidos.Delete;

  //Eliminamos tambien todas las fases correspondientes en la tabla de memoria de tareas
  TablaFasesMem.First;
  TablaFasesMem.Locate('CODIGOPEDIDO', CodigoPedido, []);
  while (TablaFasesMem.FieldByName('CodigoPedido').AsString = CodigoPedido) do
    TablaFasesMem.Delete;
end;

procedure TfrObra.CargarDatosTareasObras;
var
  iContador : Integer;
begin
  with TablaTareasObrasMem do
  begin
    if TablaTareasObras.IsEmpty then
      exit;

    DisableControls;
    TablaTareasObras.First;
    while not TablaTareasObras.EOF do
    begin
      Append;
      for iContador := 0 to TablaTareasObras.FieldCount-1 do
        Fields[iContador].Value := TablaTareasObras.Fields[iContador].Value;
      Post;
      TablaTareasObras.Next;
    end;
    First;
    EnableControls;
  end;
end;

function TfrObra.existeInstaladorEnOtrasTareas: Boolean;
begin
  TablaTareasObrasMem.First;
  Result := TablaTareasObrasMem.Locate('CODIGOINSTALADOR', TablaObrasInstaladoresMem.FieldByName('CODIGOINSTALADOR').AsString, []);
end;

procedure TfrObra.SetTipoTarea(const Value: Variant);
begin
  if (EsCadenaVacia(Value)) then
     Exit;

  if (FTipoTarea <> Value) then
  begin
    FTipoTarea := Value;
    if FTipoTarea = CTE_ENTREGA then
       pnlDatosOtro.Caption.Text := litObrEntregas
    else if FTipoTarea = CTE_MONTAJE then
       pnlDatosOtro.Caption.Text := litObrMontajes
    else if FTipoTarea = CTE_REMATE then
       pnlDatosOtro.Caption.Text := litObrRemates
    else VerMensaje('Error: Tipo no existente');

    AplicarFiltroGridTareasObras;
  end;
end;

procedure TfrObra.actAnadirTareaObraExecute(Sender: TObject);
begin
  try
    with TablaTareasObrasMem do
    begin
      Next;
      if EOF then Append
      else begin
        Prior;
        Insert;
      end;
      FieldByName('CODIGO').AsInteger := FContadorTareaObraAux;
      FieldByName('TIPO').AsString := FTipoTarea;
      FieldByName('COMPLETADA').AsInteger := 0;
      FieldByName('CODIGOINSTALADOR').AsString := TablaObrasInstaladoresMem.FieldByName('CODIGOINSTALADOR').AsString;
      FieldByName('FECHAINI').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('DESCRIPCION').AsString := FTipoTarea;
      Inc(FContadorTareaObraAux);
    end;

    gridTareasObrasDBTableView1.GetColumnByFieldName('DESCRIPCION').FocusWithSelection;
    gridTareasObras.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.actEliminarTareaObraExecute(Sender: TObject);
begin
  if verMensajePregunta(msgObrEliminarDetalles) = mrYes then
  begin
    if TablaTareasObrasMem.RecordCount = 0 then begin
      { Hacemos un cancel de la tabla por si el registro actual estuviera
        recien creado }
      TablaTareasObrasMem.Cancel;
      Exit
    end;
    try
      TablaTareasObrasMem.Delete;
      //Para que se posicione el el primer registro de la lista de tareas con el filtro determinado
      gridTareasObrasDBTableView1.DataController.GotoFirst;
    except
      on E : EIBError do
        TratarExcepcion(E);
      on E : Exception do
        TratarExcepcion(E);
    end;
  end;
end;

procedure TfrObra.actEliminarTodoTareaObraExecute(Sender: TObject);
begin
  if verMensajePregunta(msgObrEliminarTodosDetalles) = mrYes then
  begin
    try
      TablaTareasObrasMem.First;
      while not TablaTareasObrasMem.EOF do
      begin
        if (TablaTareasObrasMem.FieldByName('TIPO').AsVariant = TipoTarea) then
           TablaTareasObrasMem.Delete
        else
           TablaTareasObrasMem.Next;
      end;
    except
      on E : EIBError do
        TratarExcepcion(E);
      on E : Exception do
        TratarExcepcion(E);
    end;
  end;
end;

procedure TfrObra.BorrarDatosTareasObrasIB;
begin
  dmTablaTareas.eliminarTareasInstaladorObra(CodigoObra);
  with TablaTareasObras do
  begin
    if IsEmpty then
      Exit;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
  end;
end;

procedure TfrObra.SalvarDatosTareasObras;
var
  NumeroCampo : Integer;
  Valor : Variant;
  CodigoInstalador : Variant;
  CodigoTarea : Variant;
begin
  try
    with TablaTareasObrasMem do
    begin
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      TablaTareasObras.First;
      while not EOF do
      begin
        TablaTareasObras.Insert;

        for NumeroCampo := 0 to FieldCount-1 do
        begin
          Valor := Fields[NumeroCampo].AsVariant;

          if (TablaTareasObras.Fields[NumeroCampo].FieldName = 'CODIGOINSTALADOR') then
          begin
            CodigoInstalador := Valor;
            Continue;
          end;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'FECHAALTA') then
             Valor := dmBaseDatos.DarFecha;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'USUARIOALTA')
          or (TablaFases.Fields[NumeroCampo].FieldName = 'USUARIO') then
             Valor := dmBaseDatos.Usuario;

          if (TablaTareasObras.Fields[NumeroCampo].FieldName = 'CODIGO') then
          begin
            if Valor < 500000 then
            begin
              Valor := dmTablaTareas.darNuevoCodigo;
              dmTablaTareas.IncrementarCodigo;
            end;
            CodigoTarea := Valor;
          end;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'FECHAFIN') then
             Valor := TablaFases.FieldByName('FECHAINI').AsVariant;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'HORAINI') then
             Valor := CTE_HORAINI;

          if (TablaFases.Fields[NumeroCampo].FieldName = 'HORAFIN') then
             Valor := CTE_HORAFIN;

          TablaTareasObras.Fields[NumeroCampo].AsVariant := Valor;
        end;
        TablaTareasObras.Post;
        dmTablaTareas.insertarTareaInstaladorObra(CodigoObra, CodigoInstalador, CodigoTarea);
        Next;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.AplicarFiltroGridTareasObras;
begin
    with gridTareasObras.ActiveView.DataController.Filter do
    begin
      BeginUpdate;
      try
        Root.Clear;
        Root.AddItem((gridTareasObras.ActiveView as TcxGridDBTableView).GetColumnByFieldName('TIPO'), foLike, TipoTarea, 'Tipo');
        Active := True;
      finally
        EndUpdate;
      end;
    end;
end;

procedure TfrObra.crearTablaInfPedidos;
begin
//Creamos la tabla con los campos que vamos a tener el informe
  FTablaInformePedidosMem := TRxMemoryData.Create(Self);
  with FTablaInformePedidosMem do
  begin
    FieldDefs.Add('CODIGOCONTRATO',ftString,12);
    FieldDefs.Items[FieldDefs.IndexOf('CODIGOCONTRATO')].CreateField(Self);
    FieldDefs.Add('CODIGOPEDIDO',ftString,10);
    FieldDefs.Items[FieldDefs.IndexOf('CODIGOPEDIDO')].CreateField(Self);
    FieldDefs.Add('DESCRIPCIONPROVEEDOR',ftString,200);
    FieldDefs.Items[FieldDefs.IndexOf('DESCRIPCIONPROVEEDOR')].CreateField(Self);
    FieldDefs.Add('CODIGOTAREA',ftString,10);
    FieldDefs.Items[FieldDefs.IndexOf('CODIGOTAREA')].CreateField(Self);
    FieldDefs.Add('DESCRIPCIONTAREA',ftString,2000);
    FieldDefs.Items[FieldDefs.IndexOf('DESCRIPCIONTAREA')].CreateField(Self);
    FieldDefs.Add('COMPLETADA',ftString,1);
    FieldDefs.Items[FieldDefs.IndexOf('COMPLETADA')].CreateField(Self);
    FieldDefs.Add('FECHAINI',ftString,50);
    FieldDefs.Items[FieldDefs.IndexOf('FECHAINI')].CreateField(Self);
  end;
end;

procedure TfrObra.rellenarTablaInfPedidos;
var
  Nodo : TcxTreeListNode;

begin
  FTablaInformePedidosMem.EmptyTable;
  FTablaInformePedidosMem.Open;

  TablaFasesMem.SortOnFields('CODIGOPEDIDO;CODIGO');
  with TablaFasesMem do
  begin
    DisableControls;
    First;
    FTablaInformePedidosMem.First;
    while not Eof do
    begin
      FTablaInformePedidosMem.Append;
      FTablaInformePedidosMem.FieldByName('CODIGOCONTRATO').AsString := CodigoObra;
      FTablaInformePedidosMem.FieldByName('CODIGOPEDIDO').AsString := FieldByName('CODIGOPEDIDO').AsString;
      FTablaInformePedidosMem.FieldByName('CODIGOTAREA').AsString := FieldByName('CODIGO').AsString;
      FTablaInformePedidosMem.FieldByName('COMPLETADA').AsString := FieldByName('COMPLETADA').AsString;
      FTablaInformePedidosMem.FieldByName('FECHAINI').AsString := FieldByName('FECHAINI').AsString;
      FTablaInformePedidosMem.FieldByName('DESCRIPCIONTAREA').AsString := FieldByName('DESCRIPCION').AsString;
      //La descripción del pedido junto con el proveedor la sacamos de la lista desplegable
      Nodo := tlApartadosObra.FindNodeByText(FieldByName('CODIGOPEDIDO').AsString,ColCodigoPedido);
      if Nodo <> Nil
      then FTablaInformePedidosMem.FieldByName('DESCRIPCIONPROVEEDOR').AsString := Nodo.Texts[CTE_COL_DESCRIPCION]
      else FTablaInformePedidosMem.FieldByName('DESCRIPCIONPROVEEDOR').AsVariant := Null;
      FTablaInformePedidosMem.Post;
      FTablaInformePedidosMem.Next;
      Next;
    end;
    EnableControls;
  end;
end;

procedure TfrObra.crearTablaInfTareas;
begin
//Creamos la tabla con los campos que vamos a tener el informe
  FTablaInformeTareasMem := TRxMemoryData.Create(Self);
  with FTablaInformeTareasMem do
  begin
    FieldDefs.Add('CODIGOCONTRATO',ftString,12);
    FieldDefs.Items[FieldDefs.IndexOf('CODIGOCONTRATO')].CreateField(Self);
    FieldDefs.Add('CODIGOINSTALADOR',ftString,10);
    FieldDefs.Items[FieldDefs.IndexOf('CODIGOINSTALADOR')].CreateField(Self);
    FieldDefs.Add('INSTALADOR',ftString,200);
    FieldDefs.Items[FieldDefs.IndexOf('INSTALADOR')].CreateField(Self);
    FieldDefs.Add('CODIGOTAREA',ftString,10);
    FieldDefs.Items[FieldDefs.IndexOf('CODIGOTAREA')].CreateField(Self);
    FieldDefs.Add('TIPO',ftString,100);
    FieldDefs.Items[FieldDefs.IndexOf('TIPO')].CreateField(Self);
    FieldDefs.Add('DESCRIPCION',ftString,2000);
    FieldDefs.Items[FieldDefs.IndexOf('DESCRIPCION')].CreateField(Self);
    FieldDefs.Add('COMPLETADA',ftString,1);
    FieldDefs.Items[FieldDefs.IndexOf('COMPLETADA')].CreateField(Self);
    FieldDefs.Add('FECHAINI',ftString,50);
    FieldDefs.Items[FieldDefs.IndexOf('FECHAINI')].CreateField(Self);
  end;
end;

procedure TfrObra.rellenarTablaInfTareas;
begin
  FTablaInformeTareasMem.EmptyTable;
  FTablaInformeTareasMem.Open;

  TablaTareasObrasMem.SortOnFields('CODIGOINSTALADOR;TIPO;FECHAINI');
  with TablaTareasObrasMem do
  begin
    DisableControls;
    First;
    FTablaInformeTareasMem.First;
    while not Eof do
    begin
      FTablaInformeTareasMem.Append;
      FTablaInformeTareasMem.FieldByName('CODIGOCONTRATO').AsString := CodigoObra;
      FTablaInformeTareasMem.FieldByName('CODIGOINSTALADOR').AsString := FieldByName('CODIGOINSTALADOR').AsString;
      FTablaInformeTareasMem.FieldByName('INSTALADOR').AsString := FieldByName('CODIGOINSTALADOR').AsString;
      FTablaInformeTareasMem.FieldByName('CODIGOTAREA').AsString := FieldByName('CODIGO').AsString;
      FTablaInformeTareasMem.FieldByName('TIPO').AsString := FieldByName('TIPO').AsString;      
      FTablaInformeTareasMem.FieldByName('COMPLETADA').AsString := FieldByName('COMPLETADA').AsString;
      FTablaInformeTareasMem.FieldByName('FECHAINI').AsString := FieldByName('FECHAINI').AsString;
      FTablaInformeTareasMem.FieldByName('DESCRIPCION').AsString := FieldByName('DESCRIPCION').AsString;
      //La descripción del pedido junto con el proveedor la sacamos de la lista desplegable
//      FTablaInformePedidosMem.FieldByName('DESCRIPCIONPROVEEDOR').AsString := (tlApartadosObra.FindNodeByText(FieldByName('CODIGOPEDIDO').AsString,ColCodigoPedido)).Texts[CTE_COL_DESCRIPCION];
      FTablaInformeTareasMem.Post;
      FTablaInformeTareasMem.Next;
      Next;
    end;
    EnableControls;
  end;
end;

procedure TfrObra.activarModoModificarTablasObra;
begin
  with TablaObras do
  begin
    ParamByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
    FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
    if RecordCount = 0 then
    begin
      VerMensajeFmt(msgObrNoExisteObr, [CodigoObra]);
      CancelarModificar;
      CloseFrame;
      Exit;
    end;
    // Bloquear el Obra
    Edit;
    Post;
    Edit;
  end;

  with TablaObrasInstaladores do
  begin
    Close;
    Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
  end;

  with TablaObrasInstaladoresMem do
  begin
    Close;
    Open;
    CargarDatosInstaladores;
    if not IsEmpty then
      Edit;
  end;

  with TablaObrasGastos do
  begin
    Close;
    Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
  end;

  with TablaObrasGastosMem do
  begin
    Close;
    Open;
    CargarDatosGastos;
    if TablaObrasGastos.RecordCount = -1
    then FContadorGastosAux := 0
    else FContadorGastosAux := TablaObrasGastos.RecordCount;
    if not IsEmpty then
      Edit;
  end;
end;

procedure TfrObra.activarModoConsultarTablasObra;
begin
  with TablaObras do
  begin
    ParamByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
    FieldByName('PROVINCIA').OnSetText := Nil;
    if RecordCount = 0 then
    begin
      VerMensajeFmt(msgObrNoExisteObr, [CodigoObra]);
      CancelarModificar;
      CloseFrame;
      Exit;
    end;
  end;

  with TablaObrasInstaladores do
  begin
    Close;
    Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
  end;

  with TablaObrasInstaladoresMem do
  begin
    Close;
    Open;
    CargarDatosInstaladores;
  end;

  with TablaObrasGastos do
  begin
    Close;
    Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
  end;

  with TablaObrasGastosMem do
  begin
    Close;
    Open;
    CargarDatosGastos;
  end;
end;

procedure TfrObra.activarModoTablasPedidos;
begin
  with TablaObrasPedidos do
  begin
    Close;
    Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
  end;

  with TablaFases do
  begin
    Close;
    Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
  end;

  with TablaFasesMem do
  begin
    Close;
    Open;
    CargarDatosFases;
  end;
end;

procedure TfrObra.activarModoConsultarTablasTareas;
begin
  with TablaTareasObras do
  begin
    Close;
    Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
  end;

  with TablaTareasObrasMem do
  begin
    Close;
    Open;
    CargarDatosTareasObras;
    if TablaTareasObras.RecordCount = -1
    then FContadorTareaObraAux := 0
    else FContadorTareaObraAux := TablaTareasObras.RecordCount;
  end;
end;

procedure TfrObra.activarModoModificarTablasTareas;
begin
  with TablaTareasObras do
  begin
    Close;
    Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
  end;

  with TablaTareasObrasMem do
  begin
    Close;
    Open;
    CargarDatosTareasObras;
    if TablaTareasObras.RecordCount = -1
    then FContadorTareaObraAux := 0
    else FContadorTareaObraAux := TablaTareasObras.RecordCount;
    if not IsEmpty then
      Edit;
  end;
end;

procedure TfrObra.ActivarBarrasGrids;
begin
  pnlBarraInstaladores.Visible := True;
  pnlBarraOtrosGastos.Visible := True;
  pnlBarraOtro.Visible := True;
end;

procedure TfrObra.DesactivarBarrasGrids;
begin
  pnlBarraInstaladores.Visible := False;
  pnlBarraOtrosGastos.Visible := False;
  pnlBarraOtro.Visible := False;  
end;

procedure TfrObra.ActivarCamposPedido;
begin
  cxPed.Properties.ReadOnly := False;
  cxTra.Properties.ReadOnly := False;
  cxCon.Properties.ReadOnly := False;
  cxEnt.Properties.ReadOnly := False;
  cxEna.Properties.ReadOnly := False;

  FechaPed.Properties.ReadOnly := False;
  FechaTra.Properties.ReadOnly := False;
  FechaCon.Properties.ReadOnly := False;
  FechaEnt.Properties.ReadOnly := False;
  FechaEnaIni.Properties.ReadOnly := False;
  FechaEnaFin.Properties.ReadOnly := False;  

  ObservacionesPed.Properties.ReadOnly := False;
  ObservacionesTra.Properties.ReadOnly := False;
  ObservacionesCon.Properties.ReadOnly := False;
  ObservacionesEnt.Properties.ReadOnly := False;
  ObservacionesEna.Properties.ReadOnly := False;
end;

procedure TfrObra.DesactivarCamposPedido;
begin
  cxPed.Properties.ReadOnly := True;
  cxTra.Properties.ReadOnly := True;
  cxCon.Properties.ReadOnly := True;
  cxEnt.Properties.ReadOnly := True;
  cxEna.Properties.ReadOnly := True;

  FechaPed.Properties.ReadOnly := True;
  FechaTra.Properties.ReadOnly := True;
  FechaCon.Properties.ReadOnly := True;
  FechaEnt.Properties.ReadOnly := True;
  FechaEnaIni.Properties.ReadOnly := True;
  FechaEnaFin.Properties.ReadOnly := True;

  ObservacionesPed.Properties.ReadOnly := True;
  ObservacionesTra.Properties.ReadOnly := True;
  ObservacionesCon.Properties.ReadOnly := True;
  ObservacionesEnt.Properties.ReadOnly := True;
  ObservacionesEna.Properties.ReadOnly := True;
end;

procedure TfrObra.crearTablasObra;
begin
  TablaObras := TIBDataSet.Create(Self);
  dsObras.DataSet := TablaObras;
  with TablaObras do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaObras.sqlConsultar);
    ModifySQL.Assign(dmTablaObras.sqlModificar);
    DeleteSQL.Assign(dmTablaObras.sqlEliminar);
    RefreshSQL.Assign(dmTablaObras.sqlConsultar);
  end;

  TablaObrasInstaladores := TIBDataSet.Create(Self);
  TablaObrasInstaladoresMem := TRxMemoryData.Create(Self);
  dsObrasInstaladores.DataSet := TablaObrasInstaladoresMem;
  with TablaObrasInstaladores do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaObrasInstaladores.sqlGrid);
    InsertSQL.Assign(dmTablaObrasInstaladores.sqlInsertar);
    ModifySQL.Assign(dmTablaObrasInstaladores.sqlModificar);
    DeleteSQL.Assign(dmTablaObrasInstaladores.sqlEliminar);
    RefreshSQL.Assign(dmTablaObrasInstaladores.sqlConsultar);
  end;
  TablaObrasInstaladoresMem.CopyStructure(TablaObrasInstaladores);
  dmTablaObrasInstaladores.InicializarGrid(gridInstaladoresDBTableView1);

  TablaObrasGastos := TIBDataSet.Create(Self);
  TablaObrasGastosMem := TRxMemoryData.Create(Self);
  dsObrasGastos.DataSet := TablaObrasGastosMem;
  with TablaObrasGastos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaObrasGastos.sqlGrid);
    InsertSQL.Assign(dmTablaObrasGastos.sqlInsertar);
    ModifySQL.Assign(dmTablaObrasGastos.sqlModificar);
    DeleteSQL.Assign(dmTablaObrasGastos.sqlEliminar);
    RefreshSQL.Assign(dmTablaObrasGastos.sqlConsultar);
  end;
  TablaObrasGastosMem.CopyStructure(TablaObrasGastos);
  dmTablaObrasGastos.InicializarGrid(gridOtrosGastosDBTableView1);
end;

procedure TfrObra.crearTablasPedidos;
begin
  TablaObrasPedidos := TIBDataSet.Create(Self);
  dsObrasPedidos.DataSet := TablaObrasPedidos;
  with TablaObrasPedidos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaObrasPedidos.sqlGrid);
    InsertSQL.Assign(dmTablaObrasPedidos.sqlInsertar);
    ModifySQL.Assign(dmTablaObrasPedidos.sqlModificar);
    DeleteSQL.Assign(dmTablaObrasPedidos.sqlEliminar);
    RefreshSQL.Assign(dmTablaObrasPedidos.sqlConsultar);
  end;

  TablaFases := TIBDataSet.Create(Self);
  TablaFasesMem := TRxMemoryData.Create(Self);
  with TablaFases do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaTareas.sqlGrid);
    InsertSQL.Assign(dmTablaTareas.sqlInsertar);
    ModifySQL.Assign(dmTablaTareas.sqlModificar);
    DeleteSQL.Assign(dmTablaTareas.sqlEliminar);
    RefreshSQL.Assign(dmTablaTareas.sqlConsultar);
  end;
  TablaFasesMem.CopyStructure(TablaFases);

  DataSource1.DataSet := TablaFasesMem;

end;

procedure TfrObra.crearTablasTareas;
begin
  TablaTareasObras := TIBDataSet.Create(Self);
  TablaTareasObrasMem := TRxMemoryData.Create(Self);
  dsTareasObras.DataSet := TablaTareasObrasMem;
  with TablaTareasObras do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaTareas.sqlTareasObrasGrid);
    InsertSQL.Assign(dmTablaTareas.sqlInsertar);
    ModifySQL.Assign(dmTablaTareas.sqlModificar);
    DeleteSQL.Assign(dmTablaTareas.sqlEliminar);
    RefreshSQL.Assign(dmTablaTareas.sqlConsultar);
  end;
  TablaTareasObrasMem.CopyStructure(TablaTareasObras);
  dmTablaTareas.InicializarGridTareasObras(gridTareasObrasDBTableView1);
  with TcxLookupComboBoxProperties(gridTareasObrasDBTableView1.GetColumnByFieldName('CODIGOINSTALADOR').Properties) do
  begin
    ListSource := dsObrasInstaladores;
  end;
end;

procedure TfrObra.crearInformes;
begin
  FVistaPrevia := TfrVistaPrevia.Create(Self);
  FVistaPrevia.Parent := pnlVistaPrevia;
  FVistaPrevia.bCancelar.Visible := False;

  crearTablaInfPedidos;
  FInformePedidos := TdmInformeListadoPedidosObra.Create(Self);
  FInformePedidos.Preview := FVistaPrevia.Preview;

  crearTablaInfTareas;
  FInformeOtros := TdmInformeListadoTareasObra.Create(Self);
  FInformeOtros.Preview := FVistaPrevia.Preview;
end;

procedure TfrObra.destruirTablasObra;
begin
  TablaObras.Close;
  TablaObras.Unprepare;
  TablaObras.Free;
  TablaObras := Nil;  


  TablaObrasInstaladores.Close;
  TablaObrasInstaladores.UnPrepare;
  TablaObrasInstaladores.Free;
  TablaObrasInstaladores := Nil;
  TablaObrasInstaladoresMem.Free;
  TablaObrasInstaladoresMem := Nil;

  TablaObrasGastos.Close;
  TablaObrasGastos.UnPrepare;
  TablaObrasGastos.Free;
  TablaObrasGastos := Nil;
  TablaObrasGastosMem.Free;
  TablaObrasGastosMem := Nil;
end;

procedure TfrObra.destruirTablasPedidos;
begin
  TablaObrasPedidos.Close;
  TablaObrasPedidos.UnPrepare;
  TablaObrasPedidos.Free;
  TablaObrasPedidos := Nil;

  TablaFases.Close;
  TablaFases.UnPrepare;
  TablaFases.Free;
  TablaFases := Nil;
  TablaFasesMem.Free;
  TablaFasesMem := Nil;
end;

procedure TfrObra.destruirTablasTareas;
begin
  TablaTareasObras.Close;
  TablaTareasObras.UnPrepare;
  TablaTareasObras.Free;
  TablaTareasObras := Nil;  
  TablaTareasObrasMem.Free;
  TablaTareasObrasMem := Nil;
end;

procedure TfrObra.destruirInformes;
begin
  FTablaInformePedidosMem.Free;
  FTablaInformePedidosMem := Nil;
  FTablaInformeTareasMem.Free;
  FTablaInformeTareasMem := Nil;
  FreeAndNil(FInformePedidos);
  FreeAndNil(FInformeOtros);
end;

procedure TfrObra.ActivarModoEliminar;
begin
  dsObras.AutoEdit := False;
  dsObrasInstaladores.AutoEdit := False;
  dsObrasGastos.AutoEdit := False;
  dsObrasPedidos.AutoEdit := False;
  dsTareasObras.AutoEdit := False;

  actAnadirPedido.Enabled := False;
  actEliminarPedido.Enabled := False;

  Provincia.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;
  NombreProv.Properties.Buttons[0].Visible := False;

  DesactivarBarrasGrids;
  DesactivarCamposPedido;

  try
    activarModoConsultarTablasObra;
    activarModoTablasPedidos;
    activarModoConsultarTablasTareas;
    Visible := True;
    FechaFin.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrObra.CancelarEliminar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaObras.Close;

    TablaObrasInstaladores.Close;
    TablaObrasInstaladoresMem.Close;
    TablaObrasGastos.Close;
    TablaObrasGastosMem.Close;

    TablaObrasPedidos.Close;
    TablaFases.Close;
    TablaFasesMem.Close;

    TablaTareasObras.Close;
    TablaTareasObrasMem.Close;

    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrObra.EliminarDatos: Boolean;
begin
  Result := False;
  try
    TablaObras.Delete;
    BorrarDatosFasesIB;
    BorrarDatosTareasObrasIB;

    Commit;

    TablaObras.Close;
    TablaObrasInstaladores.Close;
    TablaObrasInstaladoresMem.Close;
    TablaObrasGastos.Close;
    TablaObrasGastosMem.Close;

    TablaObrasPedidos.Close;
    TablaFases.Close;
    TablaFasesMem.Close;

    TablaTareasObras.Close;
    TablaTareasObrasMem.Close;

    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra.actSalirExecute(Sender: TObject);
begin
  CloseFrame;
end;

function TfrObra.CloseFrame: Boolean;
begin
  FInformePedidos.Preview := NIL;
  FInformeOtros.Preview := NIL;
  (FVistaPrevia as TRdxFrame).CloseFrame;
  Result := inherited CloseFrame;
end;

function TfrObra.TratarCambios: integer;
begin
  HabilitarPanelObra;
  Result := inherited TratarCambios;
end;

procedure TfrObra.HabilitarPanelTareas;
begin
  pnlDetalleObra.Visible := False;
  pnlDetallePedidosOtros.Visible := False;
  pnlDetallePedido.Visible := False;
  pnlDetalleOtro.Visible := True;
end;

procedure TfrObra.HabilitarPanelPedido;
begin
  pnlDetalleObra.Visible := False;
  pnlDetallePedidosOtros.Visible := False;
  pnlDetallePedido.Visible := True;
  pnlDetalleOtro.Visible := False;
end;

procedure TfrObra.HabilitarPanelObra;
begin
  pnlDetalleObra.Visible := True;
  pnlDetallePedidosOtros.Visible := False;
  pnlDetallePedido.Visible := False;
  pnlDetalleOtro.Visible := False;
end;

procedure TfrObra.HabilitarPanelInforme;
begin
  pnlDetalleObra.Visible := False;
  pnlDetallePedidosOtros.Visible := True;
  pnlDetallePedido.Visible := False;
  pnlDetalleOtro.Visible := False;
end;

procedure TfrObra.pnlOtrosDatosResize(Sender: TObject);
begin
  pnlInstaladores.Width := pnlOtrosDatos.Width div 2;
  pnlOtrosGastos.Width := pnlOtrosDatos.Width div 2;  
end;

procedure TfrObra.actEliminarTareaObraUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (gridTareasObrasDBTableView1.ViewData.RowCount <> 0);
end;

procedure TfrObra.actEliminarTodoTareaObraUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (gridTareasObrasDBTableView1.ViewData.RowCount <> 0);
end;

procedure TfrObra.NombreProvPropertiesChange(Sender: TObject);
begin
  refrescarNombrePedido;
end;

procedure TfrObra.refrescarNombrePedido;
var
  Nodo : TcxTreeListNode;
begin
  Nodo := tlApartadosObra.FocusedNode;
  Nodo.Texts[CTE_COL_DESCRIPCION] := DescripcionPed.Text + '- ' + NombreProv.Text;
end;

procedure TfrObra.DescripcionPedPropertiesChange(Sender: TObject);
begin
  refrescarNombrePedido;
end;

procedure TfrObra.gridTareasObrasDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  IndiceCol : Integer;
begin
  if not AViewInfo.Selected then
  begin
    IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName('COMPLETADA').Index;
    if StrToBool(AViewInfo.GridRecord.DisplayTexts[IndiceCol]) then
    begin
       ACanvas.Canvas.Font.Color := clGray;
       ACanvas.Canvas.Font.Style := [fsStrikeOut];
    end
    else
    begin
       ACanvas.Canvas.Font.Color := clWindowText;
       ACanvas.Canvas.Font.Style := [];
    end;
  end;
end;

procedure TfrObra.ActivarInforme(Panel: Integer);
var
  Nodo : TcxTreeListNode;

begin
  Nodo := tlApartadosObra.FindNodeByText(IntToStr(Panel), ColPanel);
  if Nodo <> Nil then
     Nodo.Focused := True;
end;

end.
