{
===============================================================================
  Copyright (©) 2001. 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: 01-10-2001
  Versión actual: 1.0.6
  Fecha versión actual: 10-01-2005
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    02-11-2001    En CambiarEntidad tengo que cambiar manualmante la entidad de
                  la barra de titulo Almacen, ya que no está incluida dentro del
                  frame y no se entera de la entidad en la que está, que
                  puede ser Almacen, AlmacenFisico o AlmacenObra, y en cada uno
                  tendrá un titulo diferente. El no estar incluido en el panel
                  era por un problema de barras en ciertos casos, que salian las
                  dos barras a la vez.

    07-04-2002    Se ha adaptado a una unica transacción.

    09-05-2002    Cambio de grid en lugar de utilizar UltimDBGrid,
                  utilizaremos dxDBGrid.

    07-09-2002    Adaptada la función 'CambiarEntidad'.

    07-03-2004    P272. Adaptación a multiempresa.

    04-10-2004    Cambio CambiarEntidad para que soporte otro color.

    10-01-2005    Añadimos una entidad más entObrasCerradas
===============================================================================
}

unit Almacenes;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, IB, IBSQL, IBDatabase, DBTables, Grids, DBGrids, ComCtrls,
  ToolWin, ExtCtrls, IBCustomDataSet, IBQuery, RdxPaneles, RdxBarras,
  RdxBotones, Tipos, RdxFrameAlmacenes, rxDBCtrl, Mensajes,
  cxGrid, cxStyles, cxCustomData, cxGraphics,
  cxFilter, cxData, cxDataStorage, cxEdit, cxDBData, cxGridLevel,
  cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, Entidades, cxContainer, cxTextEdit,
  StdCtrls;

type
  TfrAlmacenes = class(TRdxFrameAlmacenes)
    dsAlmacenes: TDataSource;
    BarraAlmacenes: TRdxBarraSuperior;
    bAnadir: TRdxBotonSuperior;
    bModificar: TRdxBotonSuperior;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelarGuardar: TRdxBoton;
    imgSombra: TImage;
    PanelPrincipal: TPanel;
    gridAlmacenes: TcxGrid;
    gridAlmacenesDBTableView1: TcxGridDBTableView;
    gridAlmacenesLevel1: TcxGridLevel;
    pnlExtra: TRdxBarraSuperior;
    bRefrescar: TRdxBoton;
    Panel1: TPanel;
    eNombre: TLabel;
    Buscar: TcxTextEdit;
    bLimpiar: TRdxBoton;
    Panel2: TPanel;
    procedure bAnadirClick(Sender: TObject);
    procedure bModificarClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bConsultarClick(Sender: TObject);
    procedure bSeleccionarClick(Sender: TObject);
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure gridAlmacenesRefreshButton(Sender: TObject);
    procedure gridAlmacenesDblClick(Sender: TObject);
    procedure bRefrescarClick(Sender: TObject);
    procedure BuscarPropertiesChange(Sender: TObject);
    procedure bLimpiarClick(Sender: TObject);
  private
    FFechaCierre: TDateTime;
    FObraCierre: Variant;
    procedure ActualizarBotones;
    procedure VisualizarBotones;
    procedure NoVisualizarBotones;
  protected
    function CloseFrame : boolean; override;
    procedure BuscarAlmacen; override;
    function CambiarEntidad (EntidadAnterior, Entidad : TRdxEntidad): Boolean; override;
    procedure FreeContenido; override;
  public
    property FechaCierre: TDateTime read FFechaCierre write FFechaCierre;
    property ObraCierre: Variant read FObraCierre write FObraCierre;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  end;

var
  frAlmacenes: TfrAlmacenes;

implementation
{$R *.DFM}

uses
  BaseDatos, Almacen, TablaAlmacenes, Excepciones, 
  Configuracion, RdxEmpresaActiva, Literales, TablaArticulosObraHistorica,
  RdxFrame, Variants;

constructor TfrAlmacenes.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaAlmacenes := TIBDataSet.Create(Self);
  dsAlmacenes.DataSet := TablaAlmacenes;

  // No asignamos ninguna sentencia sql hasta que no se le asigna una entidad
  with TablaAlmacenes do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
  end;

  Entidad := entAlmacen;
  ConfigurarFrame(Self, Self.Entidad);
end;

destructor TfrAlmacenes.Destroy;
begin
  TablaAlmacenes.Close;
  TablaAlmacenes.UnPrepare;
  TablaAlmacenes.Free;
  inherited;
end;

procedure TfrAlmacenes.BuscarAlmacen;
begin
  with TablaAlmacenes do
  begin
    DisableControls;
    Close;
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    Prepare;
    Open;
    ActualizarBotones;
    EnableControls;
  end;
  TablaAlmacenes.Locate('ALMACENES.CODIGO',CodigoAlmacen,[]);
end;

procedure TfrAlmacenes.FreeContenido;
begin
  if (Contenido is TRdxFrameAlmacenes) then
    CodigoAlmacen := (Contenido as TRdxFrameAlmacenes).CodigoAlmacen;
  inherited;
end;

procedure TfrAlmacenes.bAnadirClick(Sender: TObject);
begin
  Contenido := TfrAlmacen.Create(Self);
  Contenido.Entidad := Entidad;
  Contenido.Modo := Anadir;
end;

procedure TfrAlmacenes.bModificarClick(Sender: TObject);
begin
  CodigoAlmacen := TablaAlmacenes.FieldByName('ALMACENES.CODIGO').AsString;
  Contenido := TfrAlmacen.Create(Self);
  Contenido.Entidad := Entidad;
  Contenido.Modo := Modificar;
end;

procedure TfrAlmacenes.bEliminarClick(Sender: TObject);
begin
  CodigoAlmacen := TablaAlmacenes.FieldByName('ALMACENES.CODIGO').AsString;
  Contenido := TfrAlmacen.Create(Self);
  Contenido.Entidad := Entidad;
  Contenido.Modo := Eliminar;
end;

procedure TfrAlmacenes.bConsultarClick(Sender: TObject);
begin
  CodigoAlmacen := TablaAlmacenes.FieldByName('ALMACENES.CODIGO').AsString;
  Contenido := TfrAlmacen.Create(Self);
  Contenido.Entidad := Entidad;
  Contenido.Modo := Consultar;
end;

procedure TfrAlmacenes.bSeleccionarClick(Sender: TObject);
begin
  if TablaAlmacenes.RecordCount = 0 then
  begin
    VerMensaje(msgAlmNoHayAlm);
    exit;
  end;
  {El close frame por defecto lee el codigo del almacen seleccionado en el
   grid para asi al cambiar a estado almacen se haga el cambio de almacen}
  CloseFrame;
end;

procedure TfrAlmacenes.bCancelarGuardarClick(Sender: TObject);
begin
  FCodigoAlmacen := Null;
  {Llama al close frame padre el cual no realiza lectura del codigo del
   almacen seleccionado}
  inherited CloseFrame;
end;

function TfrAlmacenes.CloseFrame: boolean;
begin
  // Para no hacer un BuscarAlmacen que no es necesario
  FCodigoAlmacen := TablaAlmacenes.FieldByName('ALMACENES.CODIGO').Value;
  if Entidad = entObraCerrada then
  begin
     FechaCierre := TablaAlmacenes.FieldByName('FECHACIERRE').AsDateTime;
     ObraCierre := TablaAlmacenes.FieldByName('ALMACENES.NOMBRE').AsString;
  end;
  Result := inherited CloseFrame;
end;

function TfrAlmacenes.CambiarEntidad(EntidadAnterior, Entidad: TRdxEntidad): Boolean;
begin
  if not inherited CambiarEntidad(EntidadAnterior, Entidad) then
    Exit;

  ConfigurarFrame(Self, Self.Entidad);

  if Transaccion = NIL then
    exit;

  try
    with TablaAlmacenes do
    begin
      Close;
      case Entidad of
        entAlmacen       : begin
                            BarraAlmacenes.Caption := Entidades.darNombreEntidad(entAlmacen);
                            VisualizarBotones;
                            SelectSQL.Assign(dmTablaAlmacenes.sqlGrid);
                            dmTablaAlmacenes.InicializarGridAlmacenes(gridAlmacenes);
                           end;
        entAlmacenFisico : begin
                            BarraAlmacenes.Caption := Entidades.darNombreEntidad(entAlmacenFisico);
                            VisualizarBotones;
                            SelectSQL.Assign(dmTablaAlmacenes.sqlGridFisicos);
                            dmTablaAlmacenes.InicializarGridAlmacenes(gridAlmacenes);
                           end;
        entAlmacenObra   : begin
                            BarraAlmacenes.Caption := Entidades.darNombreEntidad(entAlmacenObra);
                            VisualizarBotones;
                            SelectSQL.Assign(dmTablaAlmacenes.sqlGridObras);
                            dmTablaAlmacenes.InicializarGridAlmacenes(gridAlmacenes);
                           end;
        entObraCerrada   : begin
                            BarraAlmacenes.Caption := Entidades.darNombreEntidad(entObraCerrada);
                            NoVisualizarBotones;
                            SelectSQL.Assign(dmTablaArticulosObraHistorica.sqlGridObrasCerradas);
                            dmTablaArticulosObraHistorica.InicializarGridObrasCerradas(gridAlmacenes);
                           end;
      end;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      BuscarAlmacen;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlmacenes.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    bAnadir.Enabled := False;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := True;
    Exit;
  end;

  if TablaAlmacenes.RecordCount = 0 then
  begin
    bAnadir.Enabled := True;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := False;
  end
  else begin
    bAnadir.Enabled := True;
    bModificar.Enabled := True;
    bEliminar.Enabled := True;
    bConsultar.Enabled := True;
  end;
end;

procedure TfrAlmacenes.gridAlmacenesRefreshButton(Sender: TObject);
begin
  BuscarAlmacen;
end;

procedure TfrAlmacenes.gridAlmacenesDblClick(Sender: TObject);
begin
  if Modo = Seleccionar then
    bSeleccionar.Click
  else
    bModificar.Click;
end;

procedure TfrAlmacenes.NoVisualizarBotones;
begin
  bAnadir.Visible := False;
  bModificar.Visible := False;
  bEliminar.Visible := False;
  bConsultar.Visible := False;
end;

procedure TfrAlmacenes.VisualizarBotones;
begin
  bAnadir.Visible := True;
  bModificar.Visible := True;
  bEliminar.Visible := True;
  bConsultar.Visible := True;
end;

procedure TfrAlmacenes.bRefrescarClick(Sender: TObject);
begin
  BuscarAlmacen;
end;

procedure TfrAlmacenes.BuscarPropertiesChange(Sender: TObject);
begin
  FiltrarGrid(gridAlmacenes, Buscar.Text);
end;

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

end.
