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

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

unit PresupuestosClientes;

interface

uses
  Windows, Db, Menus, am2000menuitem, am2000popupmenu, am2000, RdxBarras,
  RdxBotones, Grids, DBGrids, RXDBCtrl, Classes, Controls, RdxFrame,
  ExtCtrls, RdxPaneles, RdxFramePresupuestos, Dialogs, Configuracion,
  Graphics, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxEdit, cxDBData,
  cxGridLevel, cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, cxGrid, Entidades,
  ActnList, cxContainer, cxTextEdit, cxMaskEdit, cxDropDownEdit, StdCtrls,
  am2000utils, cxDataStorage;

type
  TfrPresupuestosClientes = class(TRdxFramePresupuestos)
    pnlCuerpo: TRdxPanel;
    pnlGrid: TRdxPanel;
    pnlCabecera: TRdxBarraSuperior;
    bModificar: TRdxBotonSuperior;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    dsPresupuestos: TDataSource;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    gridPresupuestos: TcxGrid;
    gridPresupuestosDBTableView1: TcxGridDBTableView;
    gridPresupuestosLevel1: TcxGridLevel;
    bSeparador1: TShape;
    bBuscar: TRdxBotonSuperior;
    MenuOpciones: TPopupMenu2000;
    Empresa: TMenuItem2000;
    MenuItem20002: TMenuItem2000;
    Contadores: TMenuItem2000;
    MenuItem1: TMenuItem2000;
    menuAnadir: TPopupMenu2000;
    mnNuevo: TMenuItem2000;
    MenuItem20004: TMenuItem2000;
    mnCopiar: TMenuItem2000;
    Acciones: TActionList;
    actModificar: TAction;
    actEliminar: TAction;
    actConsultar: TAction;
    MenuItem2: TMenuItem2000;
    MenuItem3: TMenuItem2000;
    bImprimir: TRdxBotonSuperior;
    actImprimir: TAction;
    actSeleccionar: TAction;
    actCancelar: TAction;
    actAceptar: TAction;
    MenuItem4: TMenuItem2000;
    MenuItem5: TMenuItem2000;
    pnlExtra: TRdxBarraSuperior;
    bAceptar: TRdxBoton;
    bAnular: TRdxBoton;
    MenuItem6: TMenuItem2000;
    MenuItem7: TMenuItem2000;
    MenuItem8: TMenuItem2000;
    MenuItem9: TMenuItem2000;
    actAnadir: TAction;
    MenuItem10: TMenuItem2000;
    MenuItem11: TMenuItem2000;
    MenuItem12: TMenuItem2000;
    MenuItem13: TMenuItem2000;
    MenuItem14: TMenuItem2000;
    bAnadir: TRdxBotonMenu;
    MenuItem15: TMenuItem2000;
    MenuItem16: TMenuItem2000;
    Panel1: TPanel;
    bSeparador2: TShape;
    eFamilia: TLabel;
    cbxDocumento: TcxComboBox;
    actAceptarPresupuesto: TAction;
    actRechazarPresupuesto: TAction;
    imgSombra: TImage;
    bRefrescar: TRdxBoton;
    Shape1: TShape;
    actRefrescarDatos: TAction;
    Panel2: TPanel;
    eNombre: TLabel;
    Buscar: TcxTextEdit;
    bLimpiar: TRdxBoton;
    procedure bSeleccionarClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure RdxFramePresupuestosShow(Sender: TObject);
    procedure gridPresupuestosDBTableView1DblClick(Sender: TObject);
    procedure actSeleccionarExecute(Sender: TObject);
    procedure actCancelarExecute(Sender: TObject);
    procedure actAceptarExecute(Sender: TObject);
    procedure actModificarExecute(Sender: TObject);
    procedure actEliminarExecute(Sender: TObject);
    procedure actConsultarExecute(Sender: TObject);
    procedure actAnadirExecute(Sender: TObject);
    procedure cbxFamiliaPropertiesEditValueChanged(
      Sender: TObject);
    procedure actAnadirCocinaExecute(Sender: TObject);
    procedure actImprimirExecute(Sender: TObject);
    procedure actAnadirBanoExecute(Sender: TObject);
    procedure actAnadirArmariosExecute(Sender: TObject);
    procedure actAnadirElectroExecute(Sender: TObject);
    procedure gridPresupuestosDBTableView1CustomDrawCell(
      Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
      AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
    procedure actAceptarPresupuestoUpdate(Sender: TObject);
    procedure actRechazarPresupuestoUpdate(Sender: TObject);
    procedure actAceptarPresupuestoExecute(Sender: TObject);
    procedure actRechazarPresupuestoExecute(Sender: TObject);
    procedure actAnadirCopiaExecute(Sender: TObject);
    procedure actRefrescarDatosExecute(Sender: TObject);
    procedure BuscarPropertiesChange(Sender: TObject);
    procedure bLimpiarClick(Sender: TObject);
  private
    FCodContrato : String;
    procedure ActualizarBotones;
  protected
    procedure FreeContenido; override;
    procedure BuscarPresupuesto; override;
    procedure ActualizarBarras; override;
    procedure SetContenido (NuevoFrame : TRdxFrame); override;
    procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override;
    procedure VerModal; override;    
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  end;

var
  frPresupuestosClientes: TfrPresupuestosClientes;

implementation

{$R *.DFM}

uses
  Variants, TablaPresupuestos, BaseDatos, IBCustomDataSet, TablaDocumentos,
  Mensajes, Sysutils, PresupuestoCliente, Literales, RechazarPresupuestoCliente,
  ImprimirPresupuestosCliente, AceptarPresupuestoCliente, RdxDBFrame,
  TablaContratos, StrFunc, ContratoCliente, SysFunc;

{ TfrPresupuestosClientes }

procedure TfrPresupuestosClientes.BuscarPresupuesto;
begin
  with TablaPresupuestos do
  begin
    DisableControls;
    Close;
    Open;
    dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos);
    ActualizarBotones;

    EnableControls;
    if not Locate('CODIGO', CodigoPresupuesto, []) then
      gridPresupuestosDBTableView1.Controller.GoToFirst
    else
      gridPresupuestosDBTableView1.Controller.TopRowIndex := gridPresupuestosDBTableView1.Controller.FocusedRowIndex;
  end;
end;

constructor TfrPresupuestosClientes.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Entidad := entPresupuestoCliente;
  
  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaPresupuestos := TIBDataSet.Create(Self);
  dsPresupuestos.DataSet := TablaPresupuestos;

  with TablaPresupuestos do
  begin
    DisableControls;
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPresupuestos);
    RefreshSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPresupuestos);
    Prepare;
    Open;
    ActualizarBotones;
    EnableControls;
  end;

  dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos);
  dmTablaPresupuestos.InicializarGridPresupuestos(gridPresupuestos);
  gridPresupuestosDBTableView1.Controller.GoToFirst;

  cbxDocumento.Properties.Items.Add('Todos');
  cbxDocumento.Properties.Items.AddStrings(dmTablaDocumentos.DarDocumentos);
  cbxDocumento.ItemIndex := 0;
end;

destructor TfrPresupuestosClientes.Destroy;
begin
  TablaPresupuestos.Close;
  TablaPresupuestos.UnPrepare;
  TablaPresupuestos.Free;
  inherited;
end;

procedure TfrPresupuestosClientes.FreeContenido;
begin
  if (Contenido is TRdxFramePresupuestos) then
    CodigoPresupuesto := (Contenido as TRdxFramePresupuestos).CodigoPresupuesto;
  inherited FreeContenido;
  //gridPresupuestos.SetFocus;  
end;

procedure TfrPresupuestosClientes.bSeleccionarClick(Sender: TObject);
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  CloseFrame;
end;

procedure TfrPresupuestosClientes.bCancelarClick(Sender: TObject);
begin
  FCodigoPresupuesto := NULL;
  CloseFrame;
end;

procedure TfrPresupuestosClientes.bSalirClick(Sender: TObject);
begin
  CloseFrame;
end;

procedure TfrPresupuestosClientes.ActualizarBarras;
begin
  inherited;
  case Modo of
    Consultar : begin
                  if BarraSeleccion <> NIL then BarraSeleccion.Visible := False;
                  if BarraSalir <> NIL then BarraSalir.Visible := True;
                  if BarraOperacion <> NIL then BarraOperacion.Visible := False;
                end;
{    Facturar  : begin
                  if BarraSeleccion <> NIL then BarraSeleccion.Visible := True;
                  if BarraSalir <> NIL then BarraSalir.Visible := False;
                  if BarraOperacion <> NIL then BarraOperacion.Visible := False;
                end;}
  end;
end;

procedure TfrPresupuestosClientes.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    actAnadir.Enabled := False;
    actModificar.Enabled := False;
    actEliminar.Enabled := False;
    actConsultar.Enabled := True;
    actImprimir.Enabled := True;
    actAceptarPresupuesto.Enabled := False;
    actRechazarPresupuesto.Enabled := False;
    Exit;
  end;

  if TablaPresupuestos.RecordCount = 0 then
  begin
    actAnadir.Enabled := True;
    actModificar.Enabled := False;
    actEliminar.Enabled := False;
    actConsultar.Enabled := False;
    actImprimir.Enabled := False;
    actAceptarPresupuesto.Enabled := False;
    actRechazarPresupuesto.Enabled := False;
  end
  else begin
    actAnadir.Enabled := True;
    actModificar.Enabled := True;
    actEliminar.Enabled := True;
    actConsultar.Enabled := True;
    actImprimir.Enabled := True;
    actAceptarPresupuesto.Enabled := True;
    actRechazarPresupuesto.Enabled := True;
  end;
end;

procedure TfrPresupuestosClientes.RdxFramePresupuestosShow(
  Sender: TObject);
begin
  Buscar.SetFocus
end;

procedure TfrPresupuestosClientes.gridPresupuestosDBTableView1DblClick(
  Sender: TObject);
begin
  if Modo in [Seleccionar, Contratar] then
    actSeleccionar.Execute
  else
    actModificar.Execute;
end;

procedure TfrPresupuestosClientes.actSeleccionarExecute(Sender: TObject);
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  CloseFrame;
end;

procedure TfrPresupuestosClientes.actCancelarExecute(Sender: TObject);
begin
  FCodigoPresupuesto := NULL;
  CloseFrame;
end;

procedure TfrPresupuestosClientes.actAceptarExecute(Sender: TObject);
begin
  CloseFrame;
end;

procedure TfrPresupuestosClientes.actModificarExecute(Sender: TObject);
begin
  if TablaPresupuestos.FieldByName('SITUACION').AsString = 'ACEPTADO' then
  begin
    VerMensaje('No se puede modificar este presupuesto porque está aceptado.');
    Exit;
  end;

  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Modo := Modificar;
end;

procedure TfrPresupuestosClientes.actEliminarExecute(Sender: TObject);
begin
  if TablaPresupuestos.FieldByName('SITUACION').AsString = 'ACEPTADO' then
  begin
    VerMensaje('No se puede eliminar este presupuesto porque está aceptado.');
    Exit;
  end;

  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Modo := Eliminar;
end;

procedure TfrPresupuestosClientes.actConsultarExecute(Sender: TObject);
begin
  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Modo := Consultar;
end;

procedure TfrPresupuestosClientes.actAnadirExecute(Sender: TObject);
begin
  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Entidad := entPresupuestoVarios;
  Contenido.Modo := Anadir;
end;

procedure TfrPresupuestosClientes.cbxFamiliaPropertiesEditValueChanged(
  Sender: TObject);
var
  Columna : TcxGridDBColumn;
  TextoDocumento : String;
begin
  TextoDocumento := cbxDocumento.Text;
  with gridPresupuestos.ActiveView.DataController.Filter do
  begin
    BeginUpdate;
    try
      Columna := (gridPresupuestos.ActiveView as TcxGridDBTableView).GetColumnByFieldName('DESCRIPCION');
      if UpperCase(TextoDocumento) = 'TODOS' then
      begin
        Columna.Visible := True;
        Entidad := entPresupuestoCliente;
        Clear;
      end
      else begin
        Columna.Visible := False;
        Root.Clear;
        Root.AddItem(Columna, foEqual, TextoDocumento, 'DESCRIPCION');
        Active := True;
        Entidad := dmTablaDocumentos.DarEntidadDocumento(entPresupuestoCliente,TablaPresupuestos.FieldByName('CODIGODOCUMENTO').AsString);
      end;
    finally
      EndUpdate;
      gridPresupuestos.ActiveView.DataController.GotoFirst;
    end;
  end;
end;

procedure TfrPresupuestosClientes.actAnadirCocinaExecute(Sender: TObject);
begin
  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Entidad := entPresupuestoCocina;
  Contenido.Modo := Anadir;
end;

procedure TfrPresupuestosClientes.actImprimirExecute(Sender: TObject);
begin
  Contenido := TfrImprimirPresupuestosCliente.Create(Self);
  Contenido.Modo := Imprimir;
end;

procedure TfrPresupuestosClientes.actAnadirBanoExecute(Sender: TObject);
begin
  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Entidad := entPresupuestoBano;
  Contenido.Modo := Anadir;
end;

procedure TfrPresupuestosClientes.actAnadirArmariosExecute(
  Sender: TObject);
begin
  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Entidad := entPresupuestoArmarios;
  Contenido.Modo := Anadir;
end;

procedure TfrPresupuestosClientes.actAnadirElectroExecute(Sender: TObject);
begin
  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Entidad := entPresupuestoElectro;
  Contenido.Modo := Anadir;
end;

procedure TfrPresupuestosClientes.SetContenido(NuevoFrame: TRdxFrame);
begin
  inherited;
  if (Contenido is TfrImprimirPresupuestosCliente) then
    (Contenido as TfrImprimirPresupuestosCliente).CodigoPresupuesto := FCodigoPresupuesto;
end;

procedure TfrPresupuestosClientes.gridPresupuestosDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  IndiceCol : Integer;
begin
  if not AViewInfo.Selected then
  begin
    IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName('SITUACION').Index;
    if UpperCase(AViewInfo.GridRecord.DisplayTexts[IndiceCol]) = 'RECHAZADO' then
      ACanvas.Canvas.Font.Color := clGray;
    if UpperCase(AViewInfo.GridRecord.DisplayTexts[IndiceCol]) = 'ACEPTADO' then
      ACanvas.Canvas.Font.Color := clNavy;
  end;
end;

procedure TfrPresupuestosClientes.actAceptarPresupuestoUpdate(
  Sender: TObject);
begin
  if (TablaPresupuestos.RecordCount > 0) then
  begin
    if (UpperCase(TablaPresupuestos.FieldByName('SITUACION').AsString) = 'ACEPTADO') then
      (Sender as TAction).Enabled := False
    else
      (Sender as TAction).Enabled := True;
  end
  else
    (Sender as TAction).Enabled := False;
end;

procedure TfrPresupuestosClientes.actRechazarPresupuestoUpdate(
  Sender: TObject);
begin
  if (TablaPresupuestos.RecordCount > 0) then
  begin
    if (UpperCase(TablaPresupuestos.FieldByName('SITUACION').AsString) = 'RECHAZADO') then
      (Sender as TAction).Enabled := False
    else
      (Sender as TAction).Enabled := True;
  end
  else
    (Sender as TAction).Enabled := False;
end;

procedure TfrPresupuestosClientes.actAceptarPresupuestoExecute(
  Sender: TObject);
var
  SituacionAux : String;
  ContenidoAux : TfrContratoCliente;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  SituacionAux := UpperCase(TablaPresupuestos.FieldByName('SITUACION').AsString);

  if SituacionAux = 'ACEPTADO' then
  begin
    VerMensajeFmt(msgCliPreYaAceptado, [FCodigoPresupuesto]);
    exit;
  end;

  if SituacionAux = 'RECHAZADO' then
  begin
    case VerMensajePreguntaFmt(msgCliCambiarAAceptar, [FCodigoPresupuesto]) of
      IDNO : Exit;
    end
  end;

  frAceptarPresupuestoCliente := TfrAceptarPresupuestoCliente.Create(Self);
  with frAceptarPresupuestoCliente do
  begin
    try
      frAceptarPresupuestoCliente.CodigoPresupuesto := Self.CodigoPresupuesto;
      ShowModal;

      if ModalResult in [mrCancel] then
        Rollback
      else begin
        BuscarPresupuesto;
        if ModalResult = mrYes then // Dar de alta el contrato del presupuesto
        begin
          FCodContrato := dmTablaContratos.CrearContrato(CodigoPresupuesto);
          if EsCadenaVacia(FCodContrato) then
          begin
            Rollback;
            VerMensaje('No se ha podido crear el contrato')
          end
          else begin
            Commit;
            VerMensajeFmt('El contrato asociado a este presupuesto es %s.', [FCodContrato])
          end;
        end
        else // NO dar de alta el contrato del presupuesto
          Commit;
      end;
    finally
      Free;
      BuscarPresupuesto;
    end;
  end;
end;

procedure TfrPresupuestosClientes.actRechazarPresupuestoExecute(
  Sender: TObject);
var
  SituacionAux : String;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  SituacionAux := UpperCase(TablaPresupuestos.FieldByName('SITUACION').AsString);

  if SituacionAux = 'RECHAZADO' then
  begin
    VerMensajeFmt(msgCliPreYaRechazado, [FCodigoPresupuesto]);
    Exit;
  end;

  if SituacionAux = 'ACEPTADO' then
  begin
    if not EsCadenaVacia(dmTablaPresupuestos.DarContratoDelPresupuesto(CodigoPresupuesto)) then
    begin
      VerMensajeFmt(msgCliPreConContrato, [CodigoPresupuesto]);
      Exit;
    end
    else
      case VerMensajePreguntaFmt(msgCliCambiarARechazar, [FCodigoPresupuesto]) of
        IDNO : Exit;
      end
  end;

  frRechazarPresupuestoCliente := TfrRechazarPresupuestoCliente.Create(Self);
  with frRechazarPresupuestoCliente do
  begin
    try
      frRechazarPresupuestoCliente.CodigoPresupuesto := Self.CodigoPresupuesto;
      ShowModal;

      if ModalResult = mrOK then
        Commit
      else
        Rollback;
      BuscarPresupuesto;
    finally
      Free;
    end;
  end;
end;

procedure TfrPresupuestosClientes.CambiarModo(ModoAnterior,
  Modo: TRdxModo);
begin
  with TablaPresupuestos do
  begin
    Close;
    case Modo of
      Contratar  : begin
                    SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPresupuestosContratar);
                    BarraExtra.Visible := False;
                   end
    else
      BarraExtra.Visible := True;
    end;
  end;
  inherited;
  dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos);  
end;

procedure TfrPresupuestosClientes.VerModal;
begin
  if (ContenidoModal is TfrContratoCliente) then
    (ContenidoModal as TfrContratoCliente).CodigoContrato := FCodContrato;
  inherited;
end;

procedure TfrPresupuestosClientes.actAnadirCopiaExecute(Sender: TObject);
var
  FCodAux : String;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  FCodAux := dmTablaPresupuestos.CopiarPresupuesto(CodigoPresupuesto);
  if EsCadenaVacia(FCodAux) then
  begin
    Rollback;
    VerMensaje('No se ha podido copiar el presupuesto')
  end
  else begin
    FCodigoPresupuesto := FCodAux;
    Commit;
    VerMensajeFmt('El presupuesto nuevo es el %s', [FCodAux])
  end;
  BuscarPresupuesto;
end;

procedure TfrPresupuestosClientes.actRefrescarDatosExecute(
  Sender: TObject);
begin
  FCodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  BuscarPresupuesto;
end;

procedure TfrPresupuestosClientes.BuscarPropertiesChange(Sender: TObject);
begin
  FiltrarGrid(gridPresupuestos, Buscar.Text);
end;

procedure TfrPresupuestosClientes.bLimpiarClick(Sender: TObject);
begin
  Buscar.Text := '';
end;

end.
