unit Obra2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RdxDBFrame, RdxFrame, cxStyles, cxCustomData, cxGraphics,
  cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData, cxGridLevel,
  cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView,
  cxGridCardView, cxGridDBCardView, cxGrid, RdxBotones, RdxPaneles,
  ExtCtrls, cxMaskEdit, cxButtonEdit, cxDBEdit, cxContainer, cxTextEdit,
  StdCtrls, ComCtrls, RdxPageControl, cxDropDownEdit, cxCalendar, cxMemo,
  AdvPanel, RdxFrameObras, ActnList, RdxBarras, Grids, DBGrids,
  JvExExtCtrls, JvComponent, JvItemsPanel, JvExComCtrls, JvHeaderControl,
  JvExControls, JvArrayButton, IBCustomDataSet, cxSchedulerStorage,
  cxSchedulerDBStorage, Menus, cxScheduler, cxSchedulerCustomControls,
  cxSchedulerCustomResourceView, cxSchedulerDayView, RxMemDS,
  cxSchedulerDateNavigator, cxSchedulerWeekView, JvExGrids, JvStringGrid,
  cxGridTableView, cxGridDBTableView, TablaCitas, IBDatabase, InformeEstadoObra,
  cxDBLookupComboBox, IBSQLMonitor, cxLookupEdit, cxDBLookupEdit, IBQuery;

type
  TfrObra2 = class(TRdxFrameObras)
    Paginas: TRdxPagesControl;
    pagPedidos: TTabSheet;
    pnlDatosObra: TPanel;
    eCodigo: TLabel;
    eNIFCIF: TLabel;
    eObservaciones: TLabel;
    Observaciones: TcxDBMemo;
    CodigoContrato: TcxDBTextEdit;
    pagGastos: TTabSheet;
    Label20: TLabel;
    dsObras: TDataSource;
    brDoble: TRdxBarraInferior;
    bGuardar: TRdxBoton;
    bCancelar: TRdxBoton;
    DatosCliente: TcxMemo;
    Label1: TLabel;
    Shape1: TShape;
    JvItemsPanel1: TJvItemsPanel;
    JvHeaderControl1: TJvHeaderControl;
    JvArrayButton1: TJvArrayButton;
    dsCitas: TDataSource;
    TablaCitas: TIBDataSet;
    DBGrid1: TDBGrid;
    Splitter1: TSplitter;
    cxSchedulerDBStorage: TcxSchedulerDBStorage;
    pagEntregas: TTabSheet;
    Panel1: TPanel;
    JvStringGrid1: TJvStringGrid;
    pagMontajes: TTabSheet;
    pagRemates: TTabSheet;
    pnlOtrosDatos: TPanel;
    pnlInstaladores: TPanel;
    bEliminar: TRdxBoton;
    bAnadir: TRdxBoton;
    bEliminarTodo: TRdxBoton;
    gridInstaladores: TcxGrid;
    gridInstaladoresVista: TcxGridDBTableView;
    gridInstaladoresLevel1: TcxGridLevel;
    Label4: TLabel;
    pnlOtrosGastos: TPanel;
    gridOtrosGastos: TcxGrid;
    gridOtrosGastosVista: TcxGridDBTableView;
    gridOtrosGastosLevel1: TcxGridLevel;
    RdxBoton1: TRdxBoton;
    RdxBoton2: TRdxBoton;
    RdxBoton3: TRdxBoton;
    Label5: TLabel;
    Splitter2: TSplitter;
    pnlDetalleOtro: TRdxPanel;
    pnlDatosOtro: TPanel;
    Panel2: TPanel;
    pnlGridOtro: TPanel;
    gridEntregas: TcxGrid;
    gridEntregasVista: TcxGridDBTableView;
    gridEntregasLevel1: TcxGridLevel;
    pnlBarraOtro: TPanel;
    bEliminarTareaObra: TRdxBoton;
    bAnadirTareaObra: TRdxBoton;
    ActionList1: TActionList;
    actAceptar: TAction;
    actCancelar: TAction;
    actAnadirInstalador: TAction;
    actEliminarInstalador: TAction;
    actAnadirGasto: TAction;
    actEliminarGasto: TAction;
    actEliminarTodoIns: TAction;
    actEliminarTodoGas: TAction;
    actAnadirPedido: TAction;
    actEliminarPedido: TAction;
    actAnadirTareaObra: TAction;
    actEliminarEntrega: TAction;
    actSalir: TAction;
    dsObrasInstaladores: TDataSource;
    dsGastos: TDataSource;
    Panel3: TPanel;
    actAnadirEntrega: TAction;
    TablaInstaladores: TIBDataSet;
    Panel4: TPanel;
    RdxBoton4: TRdxBoton;
    RdxBoton5: TRdxBoton;
    Panel5: TPanel;
    gridMontajes: TcxGrid;
    gridMontajesVista: TcxGridDBTableView;
    cxGridLevel1: TcxGridLevel;
    Panel6: TPanel;
    RdxBoton6: TRdxBoton;
    RdxBoton7: TRdxBoton;
    Panel7: TPanel;
    gridRemates: TcxGrid;
    gridRematesVista: TcxGridDBTableView;
    cxGridLevel2: TcxGridLevel;
    actEliminarMontaje: TAction;
    actEliminarRemate: TAction;
    RdxBoton8: TRdxBoton;
    actPrevisualizar: TAction;
    dsInstaladores: TDataSource;
    FechaFin: TcxDBTextEdit;
    lblObraCerrada: TLabel;
    Label2: TLabel;
    cbxDocumento: TcxDBLookupComboBox;
    dsDocumentos: TDataSource;
    TablaDocumentos: TIBQuery;
    procedure JvArrayButton1ArrayButtonClicked(ACol, ARow: Integer);
    procedure JvItemsPanel1Resize(Sender: TObject);
    procedure pagPedidosResize(Sender: TObject);
    procedure actCancelarExecute(Sender: TObject);
    procedure actAceptarExecute(Sender: TObject);
    procedure actAnadirInstaladorExecute(Sender: TObject);
    procedure actEliminarInstaladorExecute(Sender: TObject);
    procedure actEliminarTodoInsExecute(Sender: TObject);
    procedure actEliminarTodoGasExecute(Sender: TObject);
    procedure actEliminarGastoExecute(Sender: TObject);
    procedure actAnadirGastoExecute(Sender: TObject);
    procedure pagEntregasShow(Sender: TObject);
    procedure pagMontajesShow(Sender: TObject);
    procedure pagRematesShow(Sender: TObject);
    procedure actAnadirEntregaExecute(Sender: TObject);
    procedure gridEntregasVistaDblClick(Sender: TObject);
    procedure actEliminarEntregaExecute(Sender: TObject);
    procedure actEliminarEntregaUpdate(Sender: TObject);
    procedure actEliminarRemateUpdate(Sender: TObject);
    procedure actEliminarMontajeUpdate(Sender: TObject);
    procedure actPrevisualizarExecute(Sender: TObject);
    procedure gridMontajesVistaDblClick(Sender: TObject);
    procedure gridRematesVistaDblClick(Sender: TObject);
    procedure cxSchedulerDBStorageEventModified(Sender: TObject;
      AEvent: TcxSchedulerEvent; var AHandled: Boolean);
    procedure actAnadirInstaladorUpdate(Sender: TObject);
    procedure actEliminarInstaladorUpdate(Sender: TObject);
    procedure actEliminarTodoInsUpdate(Sender: TObject);
    procedure actAnadirGastoUpdate(Sender: TObject);
    procedure actEliminarGastoUpdate(Sender: TObject);
    procedure actEliminarTodoGasUpdate(Sender: TObject);
    procedure actAnadirEntregaUpdate(Sender: TObject);
    procedure JvStringGrid1ExitCell(Sender: TJvStringGrid; AColumn,
      ARow: Integer; const EditText: String);
  private
    FTablaObrasInstaladores : TIBDataSet;
    FTablaObrasGastos: TIBDataSet;
    FTablaObrasGastosMem : TRxMemoryData;
    FCodigoInstalador: Variant;
    FInformeEstadoObra : TdmInformeEstadoObra;
    procedure InicializarPantalla;
    procedure RellenarArrayBotones;
    procedure CrearTablasObra;
    procedure CrearTablaCitas;
    procedure DestruirTablasObra;
    procedure DestruirTablaCitas;
    procedure InicializarCampos;
    procedure AjustarCabeceras;
    procedure TablaCitasBeforePost(DataSet: TDataSet);
    procedure TablaCitasAfterPost(DataSet: TDataSet);
    procedure SetCodigoInstalador(const Value: Variant);
    procedure SalvarDatosGastos;
    procedure SalvarProveedores;
    function ExisteInstaladorEnOtrasTareas : Boolean;
    procedure AplicarFiltroTipoAGrid(aVista : TcxGridDBTableView; aTipo : TTipoCitas);
    procedure EditarCita(ID : Variant; bSoloLectura:Boolean); overload;
    procedure InsertarCitaEntrega(Const Opcion: Integer);
    procedure InsertarCitaFase(Const Tipo: Integer;Const Col: Integer);
    procedure DeshabilitarModificar;
    procedure HabilitarModificar;
  protected
    procedure ActivarModoModificarTablasObra;
    procedure ActivarModoModificar; override;
    procedure ActivarModoConsultar; override;
    procedure ActivarModoEliminar; override;
    function ModificarDatos : Boolean; override;
    function CancelarModificar : 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
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure Imprimir;
    procedure VistaPrevia;
    function EliminarDatos : Boolean; override;
  published
    property TablaObras;
    property CodigoObra;
    property CodigoInstalador : Variant read FCodigoInstalador write SetCodigoInstalador;
    property TablaObrasInstaladores : TIBDataSet read FTablaObrasInstaladores write FTablaObrasInstaladores;
    property TablaObrasGastos : TIBDataSet read FTablaObrasGastos write FTablaObrasGastos;
  end;

var
  frObra2: TfrObra2;

implementation

uses
  cxSchedulerDialogs, RdxFrameInstaladores, Instaladores,
  IBErrorCodes, Mensajes, Literales,
  IB, Configuracion, BaseDatos, Entidades, TablaObras,
  StrFunc, Excepciones, DateUtils, TablaObrasInstaladores,
  TablaObrasGastos, TablaInstaladores, TablaTareas, TablaDocumentos;

{$R *.dfm}

{ TfrObra2 }

procedure TfrObra2.ActivarModoConsultar;
begin
  inherited;

end;

procedure TfrObra2.ActivarModoEliminar;
begin
  inherited;

end;

procedure TfrObra2.ActivarModoModificar;
begin
  dsObras.AutoEdit := True;

  try
    ActivarModoModificarTablasObra;
    Visible := True;
  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;

procedure TfrObra2.ActivarModoModificarTablasObra;
begin
  with TablaObras do
  begin
    ParamByName('CODIGOCONTRATO').AsString := CodigoObra;
    Prepare;
    Open;
    if RecordCount = 0 then
    begin
      VerMensajeFmt(msgObrNoExisteObr, [CodigoObra]);
      CancelarModificar;
      CloseFrame;
      Exit;
    end;
  end;
end;

procedure TfrObra2.BuscarObra;
begin
  if Transaccion = NIL then
    exit;
  try
    if TablaObras.Active then
      ModificarDatos;
    TablaObras.Close;
    TablaCitas.Close;
    TablaObrasInstaladores.Close;
    TablaObrasGastos.Close;
    FTablaObrasGastosMem.Close;
    TablaInstaladores.Close;
    TablaDocumentos.Close;

    // Buscar la fila a tratar si es necesario
    if not esCadenaVacia(CodigoObra) then
    begin
      TablaObras.Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
      TablaCitas.Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
      TablaObrasInstaladores.Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
      TablaObrasGastos.Params.ByName('CODIGOCONTRATO').AsString := CodigoObra;
      TablaObras.Prepare;
      TablaObras.Open;

      TablaCitas.Prepare;
      TablaCitas.Open;

      TablaObrasInstaladores.Prepare;
      TablaObrasInstaladores.Open;

      TablaObrasGastos.Prepare;
      TablaObrasGastos.Open;

      FTablaObrasGastosMem.LoadFromDataSet(TablaObrasGastos, -1, lmCopy);
      FTablaObrasGastosMem.Open;

      TablaInstaladores.Open;
      TablaDocumentos.Open;

      cxSchedulerDBStorage.FullRefresh;

      RellenarArrayBotones;

      //Si la obra esta cerrada no se puede modificar ni fecha de finalización ni observaciones
      if VarIsNull(TablaObras.FieldByName('FECHAFIN').AsVariant) then
        HabilitarModificar
      else
        DeshabilitarModificar;

      DatosCliente.Text := TablaObras.FieldByName('NOMBRE').AsString + #10 +
        TablaObras.FieldByName('DIR1').AsString + #10 +
        TablaObras.FieldByName('DIR2').AsString + #10 +
        TablaObras.FieldByName('TELF').AsString;
    end
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrObra2.CancelarEliminar: Boolean;
begin

end;

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

    TablaObrasInstaladores.Close;
    TablaObrasGastos.Close;
    FTablaObrasGastosMem.Close;

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

function TfrObra2.CloseFrame: Boolean;
begin
  ModificarDatos;
end;

function TfrObra2.ComprobarDatos: Boolean;
begin

end;

procedure TfrObra2.CrearTablasObra;
begin
  TablaObras := TIBDataSet.Create(Self);
  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;
  dsObras.DataSet := TablaObras;

  TablaObrasInstaladores := TIBDataSet.Create(Self);
  dsObrasInstaladores.DataSet := TablaObrasInstaladores;
  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;
  dmTablaObrasInstaladores.InicializarGrid(gridInstaladoresVista);

  TablaObrasGastos := TIBDataSet.Create(Self);
  FTablaObrasGastosMem := TRxMemoryData.Create(Self);
  dsGastos.DataSet := FTablaObrasGastosMem;
  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;
  FTablaObrasGastosMem.CopyStructure(TablaObrasGastos);
  FTablaObrasGastosMem.FieldByName('CODIGO').Required := False;

  with TablaDocumentos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
  end;

  dmTablaObrasGastos.InicializarGrid(gridOtrosGastosVista);
end;

constructor TfrObra2.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Entidad := entObraCliente;
  ConfigurarFrame(Self, Self.Entidad);

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

  CrearTablasObra;
  CrearTablaCitas;

  InicializarCampos;
  InicializarPantalla;

  {CrearTablasPedidos;
  CrearTablasTareas;
  CrearInformes;}

  FInformeEstadoObra := TdmInformeEstadoObra.Create(Self);
  with FInformeEstadoObra do
  begin
    frxTablaCitas.DataSource := dsCitas;
    frxTablaInstaladores.DataSource := dsObrasInstaladores;
    frxTablaObras.DataSource := dsObras;
  end;

  Paginas.ActivePageIndex := 0;
end;

destructor TfrObra2.Destroy;
begin
  FreeAndNIL(FInformeEstadoObra);
  
  DestruirTablasObra;
  DestruirTablaCitas;
{  destruirTablasPedidos;
  destruirTablasTareas;
  destruirInformes;}

  inherited;
end;

procedure TfrObra2.DestruirTablasObra;
begin
  TablaObras.Close;
  TablaObras.Unprepare;
  TablaObras.Free;
  TablaObras := Nil;

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

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

  FTablaObrasGastosMem.Close;
  FTablaObrasGastosMem.Free;
  FTablaObrasGastosMem := Nil;

end;

function TfrObra2.EliminarDatos: Boolean;
begin
  Result := False;
  try
    cxSchedulerDBStorage.Clear;
    TablaObras.Delete;
    Commit;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrObra2.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameInstaladores) then
    CodigoInstalador := (ContenidoModal as TRdxFrameInstaladores).CodigoInstalador;

  inherited FreeContenido;
end;

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

    BorrarTabla(TablaObrasGastos);
    SalvarDatosGastos;
    SalvarProveedores;
    
    Commit;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrObra2.TratarCambios: integer;
begin

end;

procedure TfrObra2.VerModal;
begin
  inherited;

end;

procedure TfrObra2.CrearTablaCitas;
begin
  dsCitas.DataSet := TablaCitas;

  with TablaCitas do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SelectSQL.Assign(dmTablaCitas.sqlConsultar);
    SelectSQL.Add('WHERE CITAS.CODIGOCONTRATO = :CODIGOCONTRATO');

    InsertSQL.Assign(dmTablaCitas.sqlInsertar);
    ModifySQL.Assign(dmTablaCitas.sqlModificar);
    DeleteSQL.Assign(dmTablaCitas.sqlEliminar);

    RefreshSQL.Assign(dmTablaCitas.sqlRefrescar);
    RefreshSQL.Add(' AND CITAS.CODIGOCONTRATO = :CODIGOCONTRATO');

    BeforePost := TablaCitasBeforePost;
    AfterPost := TablaCitasAfterPost;
    Prepare;
  end;
  dmTablaTareas.InicializarGridTareasObras(gridEntregasVista);
  with TcxLookupComboBoxProperties(gridEntregasVista.GetColumnByFieldName('RESOURCEID').Properties) do
    ListSource := dsInstaladores;

  dmTablaTareas.InicializarGridTareasObras(gridMontajesVista);
  with TcxLookupComboBoxProperties(gridMontajesVista.GetColumnByFieldName('RESOURCEID').Properties) do
    ListSource := dsInstaladores;

  dmTablaTareas.InicializarGridTareasObras(gridRematesVista);
  with TcxLookupComboBoxProperties(gridRematesVista.GetColumnByFieldName('RESOURCEID').Properties) do
    ListSource := dsInstaladores;


  dsInstaladores.DataSet := TablaInstaladores;
  with TablaInstaladores do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SelectSQL.Add('select * from INSTALADORES order by CODIGO');
    Prepare;
  end;

end;

procedure TfrObra2.DestruirTablaCitas;
begin
  TablaCitas.Close;
  //TablaInstaladores.Close;
end;

procedure TfrObra2.InicializarPantalla;
var
  i : integer;
  Inicio, Final : Integer;
begin
  Inicio := Ord(tcPedido);
  Final := Ord(tcEntregaCliente);

  with JvItemsPanel1 do
  begin
    Items.Clear;
    for i := Inicio to Final do
      Items.Add(LiteralTipoCita[i]);
  end;
  JvArrayButton1.Rows := Final - Inicio + 1;
  JvArrayButton1.Cols := 4;

  for i := 1 to JvArrayButton1.Cols do
    JvHeaderControl1.Sections[i].Text := LiteralPartidasObra[i-1];

  JvArrayButton1.Colors.Clear;
  for i := 0 to (JvArrayButton1.Cols * JvArrayButton1.Rows) do
    JvArrayButton1.Colors.Append('$00F9FEFF');

  AjustarCabeceras;
end;

procedure TfrObra2.JvArrayButton1ArrayButtonClicked(ACol, ARow: Integer);
var
  i : integer;
  AModified : Boolean;
  ATipo : Cardinal;
  ObraCerrada : boolean;
begin
  ATipo := ARow + Ord(tcPedido);
  ObraCerrada := not VarIsNull(TablaObras.FieldByName('FECHAFIN').AsVariant);

  with TablaCitas do
  begin
    try
      First;
      if Locate('TIPOTAREA;PARTIDA',
        VarArrayOf([TextoTipoCita[ATipo], TextoPartidasObra[ACol]]),
        [loCaseInsensitive]) then
      begin
        EditarCita(FieldByName('ID').AsVariant, ObraCerrada);
      end
      else begin
        //Si la obra esta cerrada y al cuadro no contiene información no se muestra nada
        if not ObraCerrada then
        begin
          InsertarCitaFase(ATipo, ACol);
        end;
      end;
    finally
      SalvarProveedores;
      RellenarArrayBotones;
    end;
  end;
  
end;

procedure TfrObra2.InicializarCampos;
var
  aField : TcxSchedulerDBStorageField;
begin
  inherited;
  with cxSchedulerDBStorage.CustomFields do
  begin
    try
      BeginUpdate;
      Clear;

      aField := Add;
      aField.FieldName := 'TIPOTAREA';

      aField := Add;
      aField.FieldName := 'CODIGOCONTRATO';

      aField := Add;
      aField.FieldName := 'NOMBRECLIENTE';

      aField := Add;
      aField.FieldName := 'PARTIDA';

      aField := Add;
      aField.FieldName := 'COMPLETADA';

      aField := Add;
      aField.FieldName := 'NOMBREPROVEEDOR';
    finally
      EndUpdate;
    end;
  end;
end;

procedure TfrObra2.TablaCitasAfterPost(DataSet: TDataSet);
begin
  dmBaseDatos.Transaccion.CommitRetaining;
///  RellenarArrayBotones;
end;

procedure TfrObra2.TablaCitasBeforePost(DataSet: TDataSet);
begin
  if (DataSet.FieldByName('ID').AsVariant = -1) or
     (VarIsNull(DataSet.FieldByName('ID').AsVariant)) then
  begin
    DataSet.Edit;
    DataSet.FieldByName('ID').AsVariant := dmTablaCitas.DarNuevoCodigo;
  end;
end;

procedure TfrObra2.RellenarArrayBotones;
var
  I, ACol, ARow : integer;
  ATipo, APartida : String;
  AEvent : TcxSchedulerEvent;
  AControlEvent : TcxSchedulerControlEvent;
  ATipos : TStringList;
  APartidas : TStringList;
  ACaptions : TStringList;
  AColors : TStringList;
  ACompletada : Boolean;
  AProveedor : String;
  AFecIni, AFecFin : TDate;
begin
  JvArrayButton1.Captions.Clear;
  JvArrayButton1.Colors.Clear;

  JvStringGrid1.Cells[0, 0] := 'Proveedores';
  for i := 0 to JvArrayButton1.Cols - 1 do
    JvStringGrid1.Cells[i + 1, 0] := '';

  ATipos := TStringList.Create;
  APartidas := TStringList.Create;
  ACaptions := TStringList.Create;
  AColors := TStringList.Create;
  try
    for i := Ord(tcPedido) to Ord(tcEntregaCliente) do
      ATipos.Add(TextoTipoCita[i]);

    for i := Ord(poCocina) to Ord(poVarios) do
      APartidas.Add(TextoPartidasObra[i]);

    for i := 0 to (JvArrayButton1.Rows * JvArrayButton1.Cols) - 1 do
      ACaptions.Add('');

    for i := 0 to (JvArrayButton1.Cols * JvArrayButton1.Rows) do
      AColors.Add('$00F9FEFF');

    with TablaCitas do
    begin
      DisableControls;
      First;
      while not EOF do
      begin
        ARow := ATipos.IndexOf(FieldByName('TIPOTAREA').AsString);
        ACol := APartidas.IndexOf(FieldByName('PARTIDA').AsString);
        ACompletada := not VarIsNull(FieldByName('COMPLETADA').AsVariant);
        AProveedor := FieldByName('NOMBREPROVEEDOR').AsString;
        if (ARow >= 0) and (ACol >= 0) then
        begin
            AFecIni := FieldByName('START').AsDateTime;
            AFecFin := FieldByName('FINISH').AsDateTime;

            if DateOf(AFecIni) <> DateOf(AFecFin) then
              ACaptions[(ARow*JvArrayButton1.Cols)+ACol] := 'Del ' + DateToStr(AFecIni) + ' al ' + DateToStr(AFecFin)
            else
              ACaptions[(ARow*JvArrayButton1.Cols)+ACol] := DateToStr(AFecIni);
            //ACaptions[(ARow*JvArrayButton1.Cols)+ACol] := FieldByName('CAPTION').AsString;
            if ACompletada then
            begin
              AColors[(ARow*JvArrayButton1.Cols)+ACol] := ColorToString(dmConfiguracion.cxContentOdd.Color);

              ACaptions[(ARow*JvArrayButton1.Cols)+ACol] := ACaptions[(ARow*JvArrayButton1.Cols)+ACol] + ' (Completada)'
            end;
            JvStringGrid1.Cells[ACol+1, 0] := AProveedor;
          end;

        Next;
      end;
      EnableControls;
    end;

    for i := 0 to (JvArrayButton1.Rows * JvArrayButton1.Cols) - 1 do
      JvArrayButton1.Captions.Add(ACaptions.Strings[i]);

    for i := 0 to (JvArrayButton1.Rows * JvArrayButton1.Cols) - 1 do
      JvArrayButton1.Colors.Add(AColors.Strings[i]);

  finally
    FreeAndNil(ATipos);
    FreeAndNil(APartidas);
    FreeAndNil(ACaptions);
    FreeAndNil(AColors);
    JvArrayButton1.Invalidate;
  end;
end;

procedure TfrObra2.JvItemsPanel1Resize(Sender: TObject);
begin
  AjustarCabeceras;
end;

procedure TfrObra2.AjustarCabeceras;
var
  i : integer;
  Ancho : Integer;
begin
  with JvHeaderControl1 do
  begin
    for i := 0 to (Sections.Count - 1) do
    begin
      if i = 0 then
        Ancho := JvItemsPanel1.Width
      else
        Ancho := JvArrayButton1.Width div JvArrayButton1.Cols;

      Sections[i].MaxWidth := Ancho;
      Sections[i].MinWidth := Ancho;
      Sections[i].Width := Ancho;
      Panel1.Width := JvArrayButton1.Width;
      JvStringGrid1.ColWidths[i] := Ancho;
    end;
  end;
end;

procedure TfrObra2.pagPedidosResize(Sender: TObject);
begin
  AjustarCabeceras;
end;

procedure TfrObra2.actCancelarExecute(Sender: TObject);
begin
  CancelarModificar;
end;

procedure TfrObra2.actAceptarExecute(Sender: TObject);
begin
  ModificarDatos;
end;

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

  FCodigoInstalador := Value;
  if not TablaObrasInstaladores.Locate('CODIGOINSTALADOR', FCodigoInstalador,[]) then
  begin
    DatosInstalador := TDatosInstalador.Create;
    DatosInstalador.Codigo := FCodigoInstalador;
    dmTablaInstaladores.DarDatosInstalador(DatosInstalador); 
    with TablaObrasInstaladores 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 TfrObra2.actAnadirInstaladorExecute(Sender: TObject);
begin
  ContenidoModal := TfrInstaladores.Create(Self);
  gridInstaladores.SetFocus;
end;

procedure TfrObra2.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 }
      TablaObrasInstaladores.Cancel;
      Exit
    end;
    try
      TablaObrasInstaladores.Delete;
    except
      on E : EIBError do
        TratarExcepcion(E);
      on E : Exception do
        TratarExcepcion(E);
    end;
  end;
end;

procedure TfrObra2.actEliminarTodoInsExecute(Sender: TObject);
begin
  if verMensajePregunta(msgObrEliminarTodosDetalles) = mrYes then
  begin
    with TablaObrasInstaladores 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 TablaObrasInstaladores.IsEmpty then
       VerMensaje(msgObrInsConOtrasTareas2);
  end;
end;

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

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

function TfrObra2.ExisteInstaladorEnOtrasTareas: Boolean;
begin
  //
end;

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

procedure TfrObra2.SalvarDatosGastos;
var
  NumeroCampo : Integer;
  Valor : Variant;
  Contador : Integer;
begin
  try
    with FTablaObrasGastosMem 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 TfrObra2.SalvarProveedores;
var
  I, ACol : integer;
  APartida : String;
  AEvent : TcxSchedulerEvent;
  APartidas : TStringList;
  AProveedor : String;
begin
  APartidas := TStringList.Create;
  try
    for i := Ord(poCocina) to Ord(poVarios) do
      APartidas.Add(TextoPartidasObra[i]);

    with cxSchedulerDBStorage do
    begin
      FullRefresh;
      for i := 0 to (EventCount - 1) do
      begin
        AEvent := Events[i];
        APartida := VarToStr(AEvent.GetCustomFieldValueByName('PARTIDA'));

        ACol := APartidas.IndexOf(APartida);
        if (ACol >= 0) then
        begin
          AProveedor := JvStringGrid1.Cells[ACol+1, 0];
          AEvent.SetCustomFieldValueByName('NOMBREPROVEEDOR', AProveedor);
        end;
      end;
    end;
  finally
    FreeAndNil(APartidas);
  end;
end;

procedure TfrObra2.AplicarFiltroTipoAGrid(aVista : TcxGridDBTableView; aTipo : TTipoCitas);
var
  AItemList : TcxFilterCriteriaItemList;
begin
  with aVista.DataController.Filter do
  begin
    BeginUpdate;
    try
      Root.Clear;
      Root.BoolOperatorKind := fboAnd;
      Root.AddItem(aVista.GetColumnByFieldName('TIPOTAREA'), foLike, TextoTipoCita[Ord(aTipo)], 'Tipo');
      Root.AddItem(aVista.GetColumnByFieldName('CODIGOCONTRATO'), foLike, FCodigoObra, 'Obra');
      Active := True;
    finally
      EndUpdate;
    end;
  end;
end;

procedure TfrObra2.pagEntregasShow(Sender: TObject);
begin
  AplicarFiltroTipoAGrid(gridEntregasVista, tcEntrega);
end;

procedure TfrObra2.pagMontajesShow(Sender: TObject);
begin
  AplicarFiltroTipoAGrid(gridMontajesVista, tcMontaje);
end;

procedure TfrObra2.pagRematesShow(Sender: TObject);
begin
  AplicarFiltroTipoAGrid(gridRematesVista, tcRemate);
end;

procedure TfrObra2.actAnadirEntregaExecute(Sender: TObject);
var
  AOpcion : Cardinal;
begin
  if pagEntregas.Visible then
    AOpcion := Ord(tcEntrega);

  if pagMontajes.Visible then
    AOpcion := Ord(tcMontaje);

  if pagRemates.Visible then
    AOpcion := Ord(tcRemate);

  InsertarCitaEntrega(AOpcion);
end;

procedure TfrObra2.gridEntregasVistaDblClick(Sender: TObject);
begin
  if gridEntregasVista.ViewData.RowCount > 0 then
  begin
    with TablaCitas do
    begin
      DisableControls;
      EditarCita(FieldByName('ID').AsVariant, False);
      gridEntregasVista.DataController.RefreshExternalData;
      EnableControls;
    end;
  end;
end;

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

procedure TfrObra2.actEliminarEntregaUpdate(Sender: TObject);
begin
  if VarIsNull(TablaObras.FieldByName('FECHAFIN').AsVariant) then
    (Sender as TAction).Enabled := (gridEntregasVista.Controller.SelectedRowCount > 0)
  else
    (Sender as TAction).Enabled := VarIsNull(TablaObras.FieldByName('FECHAFIN').AsVariant);
end;

procedure TfrObra2.actEliminarRemateUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (gridRematesVista.Controller.SelectedRowCount > 0);
end;

procedure TfrObra2.actEliminarMontajeUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (gridMontajesVista.Controller.SelectedRowCount > 0);
end;

procedure TfrObra2.actPrevisualizarExecute(Sender: TObject);
begin
  Imprimir;
end;


procedure TfrObra2.Imprimir;
var
  APartida : TPartidasObra;
  ATipoCita : TTipoCitas;
  Col, Row : Integer;
  i : Integer;
  Cadena : String;
begin
  with FInformeEstadoObra do
  begin
    CodigoContrato := Self.FCodigoObra;
    for APartida := poCocina to poVarios do
    begin
      Proveedores[APartida] := JvStringGrid1.Cells[Ord(APartida)+1, 0];
      for ATipoCita := tcPedido to tcEntregaCliente do
      begin
        Col := Ord(APartida);
        Row := Ord(ATipoCita) - Ord(tcPedido);

        Cadena := JvArrayButton1.Captions[(Row*JvArrayButton1.Cols)+Col];
        if JvArrayButton1.Colors[(Row*JvArrayButton1.Cols)+Col] = ColorToString(dmConfiguracion.cxContentOdd.Color) then
          Cadena := '#' + Cadena;
        EstadoObra[APartida, ATipoCita] := Cadena;
      end;
    end;
    Imprimir;
  end;
end;

procedure TfrObra2.EditarCita(ID: Variant; bSoloLectura: Boolean);
var
  AEvent : TcxSchedulerEvent;
  AControlEvent : TcxSchedulerControlEvent;
  AModified : Boolean;
  TareaFase: Boolean;
  dsAux : TDataSource;
  
begin
  AEvent := cxSchedulerDBStorage.GetEventByID(ID);
  AControlEvent := TcxSchedulerControlEvent.Create(AEvent);
  try
    TareaFase := esCitaFase(AEvent.GetCustomFieldValueByName('TIPOTAREA'));
    if TareaFase then
    begin
      dsAux := cxSchedulerDBStorage.Resources.DataSource;
      cxSchedulerDBStorage.Resources.DataSource := NIL;
    end;

    if bSoloLectura then
      cxShowEventEditor(AControlEvent, CodigoContrato.Style.LookAndFeel, False, AModified, True, False)
    else
      cxShowEventEditor(AControlEvent, CodigoContrato.Style.LookAndFeel, False, AModified);

    if AModified then
    begin
        AEvent.Assign(AControlEvent);
    end;
  finally
    if TareaFase then
       cxSchedulerDBStorage.Resources.DataSource := dsAux;
    AControlEvent.Free;
  end;
end;

procedure TfrObra2.gridMontajesVistaDblClick(Sender: TObject);
begin
  if gridMontajesVista.ViewData.RowCount > 0 then
  begin
    with TablaCitas do
    begin
      DisableControls;
      EditarCita(FieldByName('ID').AsVariant, False);
      gridMontajesVista.DataController.RefreshExternalData;
      EnableControls;
    end;
  end;
end;

procedure TfrObra2.gridRematesVistaDblClick(Sender: TObject);
begin
  if gridRematesVista.ViewData.RowCount > 0 then
  begin
    with TablaCitas do
    begin
      DisableControls;
      EditarCita(FieldByName('ID').AsVariant, False);
      gridRematesVista.DataController.RefreshExternalData;
      EnableControls;
    end;
  end;
end;

{procedure TfrObra2.EditarCita(AEvent : TcxSchedulerEvent);
var
  AControlEvent : TcxSchedulerControlEvent;
  AModified : Boolean;
begin
  AControlEvent := TcxSchedulerControlEvent.Create(AEvent);

  try
    cxShowEventEditor(AControlEvent, CodigoContrato.Style.LookAndFeel,
        False, AModified);
    if AModified then
    begin
        AEvent.Assign(AControlEvent);
        AEvent.Post;
    end;
  finally
    AControlEvent.Free;
  end;
end;
}

procedure TfrObra2.cxSchedulerDBStorageEventModified(Sender: TObject;
  AEvent: TcxSchedulerEvent; var AHandled: Boolean);
begin
//  ShowMessage('Cambios');
end;

procedure TfrObra2.DeshabilitarModificar;
begin
//  FechaFin.Properties.ReadOnly := True;
  lblObraCerrada.Visible := True;
  Observaciones.Properties.ReadOnly := True;
  dsObrasInstaladores.Enabled := False;
  dsGastos.Enabled := False;
  JvStringGrid1.Enabled := False;
end;

procedure TfrObra2.HabilitarModificar;
begin
//  FechaFin.Properties.ReadOnly := False;
  lblObraCerrada.Visible := False;
  Observaciones.Properties.ReadOnly := False;
  dsObrasInstaladores.Enabled := True;
  dsGastos.Enabled := True;
  JvStringGrid1.Enabled := True;
end;

procedure TfrObra2.actAnadirInstaladorUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := dsObrasInstaladores.Enabled;
end;

procedure TfrObra2.actEliminarInstaladorUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := dsObrasInstaladores.Enabled;
end;

procedure TfrObra2.actEliminarTodoInsUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := dsObrasInstaladores.Enabled;
end;

procedure TfrObra2.actAnadirGastoUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := dsGastos.Enabled;
end;

procedure TfrObra2.actEliminarGastoUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := dsGastos.Enabled;
end;

procedure TfrObra2.actEliminarTodoGasUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := dsGastos.Enabled;
end;

procedure TfrObra2.actAnadirEntregaUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := VarIsNull(TablaObras.FieldByName('FECHAFIN').AsVariant);
end;

procedure TfrObra2.InsertarCitaEntrega(const Opcion: Integer);
var
  AControlEvent : TcxSchedulerControlEvent;
  AModified : Boolean;

begin
  AControlEvent := TcxSchedulerControlEvent.Create(cxSchedulerDBStorage);
  with AControlEvent do
  begin
    BeginEditing;
    Start := Now;
    Finish := IncHour(Now);
    SetCustomFieldValueByName('TIPOTAREA', TextoTipoCita[Opcion]);
    SetCustomFieldValueByName('CODIGOCONTRATO', CodigoObra);
    EndEditing;
  end;

  try
    cxSchedulerDBStorage.Resources.DataSource := dsInstaladores;
    cxShowEventEditor(AControlEvent, CodigoContrato.Style.LookAndFeel,
      False, AModified);
    if AModified then
      AControlEvent.Post;
  finally
    AControlEvent.Free;
  end;
end;

procedure TfrObra2.InsertarCitaFase(Const Tipo:Integer; Const Col: Integer);
var
  AControlEvent : TcxSchedulerControlEvent;
  AModified : Boolean;
  dsAux : TDataSource;

begin
  AControlEvent := TcxSchedulerControlEvent.Create(cxSchedulerDBStorage);
  with AControlEvent do
  begin
    BeginEditing;
    Start := Now;
    Finish := IncHour(Now);
    Caption := LiteralPartidasObra[Col] + ' - ' + LiteralTipoCita[Tipo];
    SetCustomFieldValueByName('TIPOTAREA', TextoTipoCita[Tipo]);
    SetCustomFieldValueByName('PARTIDA', TextoPartidasObra[Col]);
    SetCustomFieldValueByName('CODIGOCONTRATO', CodigoObra);
    EndEditing;
  end;

  try
    dsAux := cxSchedulerDBStorage.Resources.DataSource;
    cxSchedulerDBStorage.Resources.DataSource := NIL;
    cxShowEventEditor(AControlEvent, CodigoContrato.Style.LookAndFeel, False, AModified);
    if AModified then
      AControlEvent.Post;
  finally
    cxSchedulerDBStorage.Resources.DataSource := dsAux;
    AControlEvent.Free;
  end;
end;

procedure TfrObra2.JvStringGrid1ExitCell(Sender: TJvStringGrid; AColumn,
  ARow: Integer; const EditText: String);
var
  Col : Integer;
  Row : integer;
  ConTexto : Boolean;
begin
  if (JvArrayButton1.Captions.Count <> 0) then
  begin
    ConTexto := False;
    Col := AColumn - 1;
    for Row := 0 to (Ord(tcEntregaCliente) - Ord(tcPedido)) do
        ConTexto := ConTexto or not EsCadenaVacia(JvArrayButton1.Captions[(Row*JvArrayButton1.Cols)+Col]);
    if not ConTexto then
    begin
       Sender.Cells[AColumn, 0] := 'Antes debe hacer un pedido';
    end;
  end;
end;

procedure TfrObra2.VistaPrevia;
var
  APartida : TPartidasObra;
  ATipoCita : TTipoCitas;
  Col, Row : Integer;
  i : Integer;
  Cadena : String;
begin
  with FInformeEstadoObra do
  begin
    CodigoContrato := Self.FCodigoObra;
    for APartida := poCocina to poVarios do
    begin
      Proveedores[APartida] := JvStringGrid1.Cells[Ord(APartida)+1, 0];
      for ATipoCita := tcPedido to tcEntregaCliente do
      begin
        Col := Ord(APartida);
        Row := Ord(ATipoCita) - Ord(tcPedido);

        Cadena := JvArrayButton1.Captions[(Row*JvArrayButton1.Cols)+Col];
        if JvArrayButton1.Colors[(Row*JvArrayButton1.Cols)+Col] = ColorToString(dmConfiguracion.cxContentOdd.Color) then
          Cadena := '#' + Cadena;
        EstadoObra[APartida, ATipoCita] := Cadena;
      end;
    end;
    Previsualizar;
  end;
end;

end.
