{
===============================================================================
  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.7
  Fecha versión actual: 04-10-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    02-11-2001    En CambiarEntidad tengo que cambiar manualmante la entidad de
                  la barra de titulo ArticulosAlmacen, ya que no está incluida
                  dentro del frame y no se entera de la entidad en la que está,
                  que puede ser ArticulosAlmacen, ArticulosAlmacenFisico o
                  ArticulosAlmacenObra, 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.

                  Añadir el botón finalizar obra que solo será visible cuando
                  la entidad en la que nos encontremos sea
                  entArticulosAlmacenObra.

    02-03-2002    En el contenido se pueden añadir muchos materiales a la vez.

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

    11-08-2002    p223. Se ha modificado finalizar obra para la ampliacion de
                  historico de obras.

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

    15-04-2004    Al hacer doble click sobre el grid, se pasará a modificar el
                  registro o se seleccionará, dependiendo del modo en el que
                  se encuentre la pantalla.

    15-04-2004    p272. Adaptación a multiempresa.

    04-10-2004    Se ha añadido el metodo cambiarEntidad para que cambie de color
                  en funcion del modulo desde el que se la llame                  
===============================================================================
}

unit ListadoArticulosAlmacen;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, RdxTitulos, RdxPaneles, RdxCampos, 
  cxControls, cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxButtonEdit,
  cxDropDownEdit, RdxRadioButton, RdxShape, TablaArticulos, Tipos,
  RdxFrame, cxGraphics, Entidades, InformeEstadoAlmacen, VistaPrevia;

type
  TfrListadoArticulosAlmacen = class(TRdxFrame)
    eAlmacen: TLabel;
    CodAlmacen: TcxButtonEdit;
    NombreAlmacen: TRdxEdit;
    Separador: TRdxShape;
    pnlVistaPrevia: TPanel;
    eInfoCriterios: TLabel;
    rbTodos: TRdxRadioButton;
    rbArticulos: TRdxRadioButton;
    DescripcionIni: TcxButtonEdit;
    DescripcionFin: TcxButtonEdit;
    rbFamilias: TRdxRadioButton;
    cbFamiliaIni: TcxComboBox;
    Label1: TLabel;
    eInformacion: TLabel;
    cDatos: TRdxCabecera;
    cbFamiliaFin: TcxComboBox;
    pnlTitulo: TRdxPanelTituloOperacion;
    pnlCuerpo: TPanel;
    procedure DescripcionIniPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodAlmacenPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure rbTodosClick(Sender: TObject);
    procedure rbArticulosClick(Sender: TObject);
    procedure rbFamiliasClick(Sender: TObject);
    procedure RdxFrameShow(Sender: TObject);
    procedure DescripcionIniPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure DescripcionFinPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure DescripcionFinPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure cbFamiliaIniPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure cbFamiliaFinPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure CodAlmacenPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
  private
    FVistaPrevia : TfrVistaPrevia;
    FCodigoAlmacen: Variant;
    FCodigoArticuloAux : Variant;
    FArticuloIni : TDatosArticulo;
    FArticuloFin : TDatosArticulo;
    FInforme : TdmInformeEstadoAlmacen;
    procedure ActivarNombres;
    procedure ActivarFamilias;
    procedure DesactivarNombres;
    procedure DesactivarFamilias;
    procedure SetCodigoAlmacen(const Value: Variant);
    procedure RefrescarInforme;
  protected
    procedure ActualizarEstado; override;
    procedure FreeContenido; override;
    procedure VerModal; override;
    function CloseFrame : Boolean; override;
    function CambiarEntidad (EntidadAnterior, Entidad : TRdxEntidad): Boolean; override;
  public
    { Public declarations }
    property CodigoAlmacen : Variant read FCodigoAlmacen write SetCodigoAlmacen;
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  end;

var
  frListadoArticulosAlmacen: TfrListadoArticulosAlmacen;

implementation

uses
  Configuracion, Almacenes, TablaAlmacenes, StrFunc, RdxEmpresaActiva, Mensajes,
  RdxFrameAlmacenes, RdxFrameArticulos,
  TablaFamilias, ArticulosAlmacen, Literales, Variants;

{$R *.DFM}

procedure TfrListadoArticulosAlmacen.DescripcionIniPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  Case Entidad of
    entAlmacen        : EntidadModal := entArticulosAlmacen;
    entAlmacenFisico  : EntidadModal := entArticulosAlmacenFisico;
    entAlmacenObra    : EntidadModal := entArticulosAlmacenObra;
  end;

  ContenidoModal := TfrArticulosAlmacen.Create(Self);
  if not VarIsNull(FCodigoArticuloAux) then
  begin
    FArticuloIni.Codigo := FCodigoArticuloAux;
    dmTablaArticulos.DarDatosArticulo(FArticuloIni);
    DescripcionIni.EditingText := FArticuloIni.Descripcion;
    PostMessage(DescripcionIni.Handle, WM_KEYDOWN, VK_RETURN, 0);
  end;
end;

procedure TfrListadoArticulosAlmacen.SetCodigoAlmacen(const Value: Variant);
var
  DatosAlmacen : TDatosAlmacen;
begin
  if Value = Null then
     Exit;
     
  if FCodigoAlmacen <> Value then
  begin
    FCodigoAlmacen := Value;
    DatosAlmacen := TDatosAlmacen.Create;
    try
      DatosAlmacen.CodigoEmpresa := EmpresaActiva.Codigo;
      DatosAlmacen.Codigo := FCodigoAlmacen;
      if dmTablaAlmacenes.DarDatosAlmacen(DatosAlmacen) then
      begin
        CodAlmacen.Text := FCodigoAlmacen;
        NombreAlmacen.Text := DatosAlmacen.Nombre
      end
      else
        raise Exception.CreateFmt(msgAlmCodAlmNoExiste, [CodigoAlmacen]);
    finally
      DatosAlmacen.Free;
    end;
    RefrescarInforme;
  end;
end;

procedure TfrListadoArticulosAlmacen.CodAlmacenPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if EsCadenaVacia (DisplayValue) then
  begin
    Error := True;
    ErrorText := msgInfFaltaAlmacen;
    Exit;
  end;

  try
    StrToInt(DisplayValue);
  except
    Error := True;
    ErrorText := Format(msgAlmCodAlmIncorrecto, [DisplayValue]);
    Exit;
  end;

  if (dmTablaAlmacenes.ValidarCodigo(DisplayValue)) then
  begin
    if (not dmTablaAlmacenes.ExisteAlmacen(EmpresaActiva.Codigo, StrToInt(DisplayValue))) then
    begin
      Error := True;
      ErrorText := Format(msgAlmCodAlmNoExiste, [DisplayValue]);
      Exit;
    end;
  end
  else begin
    Error := True;
    ErrorText := Format(msgAlmCodAlmIncorrecto, [DisplayValue]);
    Exit;
  end;

  CodigoAlmacen := StrToInt(DisplayValue);
end;

constructor TfrListadoArticulosAlmacen.Create(AOwner: TComponent);
var
  DescripcionAux : String;
begin
  inherited;
  ConfigurarFrame(Self, Self.Entidad);
  dmTablaArticulos.ArtModelo := entArticulo;

  FCodigoAlmacen := NULL;
  FArticuloIni := TDatosArticulo.Create;
  FArticuloFin := TDatosArticulo.Create;
  FCodigoArticuloAux := NULL;

  DescripcionAux := dmTablaArticulos.DarArticuloMin;
  FArticuloIni.Codigo := '';
  FArticuloIni.Descripcion := DescripcionAux;
  DescripcionIni.EditingText := FArticuloIni.Descripcion;

  DescripcionAux := dmTablaArticulos.DarArticuloMax;
  FArticuloFin.Codigo := '';
  FArticuloFin.Descripcion := DescripcionAux;
  DescripcionFin.EditingText := FArticuloFin.Descripcion;

  cbFamiliaIni.Properties.Items := dmTablaFamilias.darFamilias;
  cbFamiliaIni.Properties.Items.Delete(0); //Borro el item en blanco.
  cbFamiliaIni.ItemIndex := 0;
  cbFamiliaFin.Properties.Items := dmTablaFamilias.darFamilias;
  cbFamiliaFin.Properties.Items.Delete(0); //Borro el item en blanco.
  cbFamiliaFin.ItemIndex := cbFamiliaFin.Properties.Items.Count - 1;

  FVistaPrevia := TfrVistaPrevia.Create(Self);
  FVistaPrevia.Parent := pnlVistaPrevia;
  FInforme := TdmInformeEstadoAlmacen.Create(Self);
  FInforme.Preview := FVistaPrevia.Preview;
  RefrescarInforme;
end;

destructor TfrListadoArticulosAlmacen.Destroy;
begin
  FInforme.Free;
  FArticuloIni.Free;
  FArticuloFin.Free;
  inherited;
end;

procedure TfrListadoArticulosAlmacen.RefrescarInforme;
begin
  if VarIsNull(FCodigoAlmacen) then
     Exit;

  with (FInforme as TdmInformeEstadoAlmacen) do
  begin
    CodigoAlmacen := FCodigoAlmacen;
    NombreAlmacen := Self.NombreAlmacen.Text;

    if rbTodos.Checked then
      Tipo := tiTodo
    else begin
      if rbArticulos.Checked then
      begin
        Tipo := tiPorDescripcion;
        DescripcionIni := FArticuloIni.Descripcion;
        DescripcionFin := FArticuloFin.Descripcion;
      end
      else begin
        Tipo := tiPorFamilias;
        FamiliaIni := cbFamiliaIni.Text;
        FamiliaFin := cbFamiliaFin.Text;
      end;
    end;
    Previsualizar;
  end;
end;

procedure TfrListadoArticulosAlmacen.FreeContenido;
begin
  if (ContenidoModal is TfrArticulosAlmacen) then
    FCodigoArticuloAux := (ContenidoModal as TfrArticulosAlmacen).CodigoArticulo;
  if (ContenidoModal is TRdxFrameAlmacenes) then
    CodigoAlmacen := (ContenidoModal as TRdxFrameAlmacenes).CodigoAlmacen;
  inherited FreeContenido;
end;

procedure TfrListadoArticulosAlmacen.ActualizarEstado;
var
  CadenaAux : string;
begin
  CadenaAux := DarNombreEntidad(Entidad);
  eAlmacen.Caption := CadenaAux + ':';

  CadenaAux := AnsiLowerCase(CadenaAux);
  cDatos.Caption := 'Parámetros para el listado de material de ' + CadenaAux;

  eInformacion.Caption := 'Elija ';
  if CadenaAux = 'almacen' then
    eInformacion.Caption := eInformacion.Caption + 'el ' + CadenaAux + ' en el cual '
  else
    eInformacion.Caption := eInformacion.Caption + 'la ' + CadenaAux + ' en la cual ';
  eInformacion.Caption := eInformacion.Caption + 'se generará el listado de su estado:';
end;

procedure TfrListadoArticulosAlmacen.ActivarFamilias;
begin
  cbFamiliaIni.Enabled := True;
  cbFamiliaIni.SetFocus;
  cbFamiliaFin.Enabled := True;
end;

procedure TfrListadoArticulosAlmacen.ActivarNombres;
begin
  DescripcionIni.Enabled := True;
  DescripcionIni.SetFocus;
  DescripcionFin.Enabled := True;
end;

procedure TfrListadoArticulosAlmacen.DesactivarFamilias;
begin
  cbFamiliaIni.Enabled := False;
  cbFamiliaFin.Enabled := False;
end;

procedure TfrListadoArticulosAlmacen.DesactivarNombres;
begin
  DescripcionIni.Enabled := False;
  DescripcionFin.Enabled := False;
end;

procedure TfrListadoArticulosAlmacen.rbTodosClick(Sender: TObject);
begin
  DesactivarNombres;
  DesactivarFamilias;
  RefrescarInforme;
end;

procedure TfrListadoArticulosAlmacen.rbArticulosClick(Sender: TObject);
begin
  ActivarNombres;
  DesactivarFamilias;
  RefrescarInforme;
end;

procedure TfrListadoArticulosAlmacen.rbFamiliasClick(Sender: TObject);
begin
  ActivarFamilias;
  DesactivarNombres;
  RefrescarInforme;  
end;

procedure TfrListadoArticulosAlmacen.RdxFrameShow(Sender: TObject);
begin
  DesactivarNombres;
  DesactivarFamilias;
  CodAlmacen.SetFocus;
end;

procedure TfrListadoArticulosAlmacen.DescripcionIniPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if EsCadenaVacia(DisplayValue) then
    DisplayValue := dmTablaArticulos.DarArticuloMin
  else
    if AnsiCompareText(DisplayValue, DescripcionFin.Text) > 0 then
    begin
      ErrorText := msgInfArticuloIniMayor;
      Error := True;
      Exit;
    end;
  FArticuloIni.Descripcion := DisplayValue;
  FArticuloIni.Codigo := '';
  RefrescarInforme;
end;

procedure TfrListadoArticulosAlmacen.DescripcionFinPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  case Entidad of
    entAlmacen        : EntidadModal := entArticulosAlmacen;
    entAlmacenFisico  : EntidadModal := entArticulosAlmacenFisico;
    entAlmacenObra    : EntidadModal := entArticulosAlmacenObra;
  end;

  ContenidoModal := TfrArticulosAlmacen.Create(Self);
  if not VarIsNull(FCodigoArticuloAux) then
  begin
    FArticuloFin.Codigo := FCodigoArticuloAux;
    dmTablaArticulos.DarDatosArticulo(FArticuloFin);
    DescripcionFin.EditingText := FArticuloFin.Descripcion;
    PostMessage(DescripcionFin.Handle, WM_KEYDOWN, VK_RETURN, 0);
  end;
end;

procedure TfrListadoArticulosAlmacen.DescripcionFinPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if EsCadenaVacia(DisplayValue) then
    DisplayValue := dmTablaArticulos.DarArticuloMax
  else
    if AnsiCompareText(DisplayValue, DescripcionIni.Text) < 0 then
    begin
      ErrorText := msgInfArticuloIniMayor;
      Error := True;
      Exit;
    end;
  FArticuloFin.Descripcion := DisplayValue;
  FArticuloFin.Codigo := '';
  RefrescarInforme;
end;

procedure TfrListadoArticulosAlmacen.cbFamiliaIniPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if AnsiCompareText(DisplayValue, cbFamiliaFin.Text) > 0 then
  begin
    ErrorText := msgInfFamiliaIniMayor;
    Error := True;
    Exit;
  end;
  RefrescarInforme;
end;

procedure TfrListadoArticulosAlmacen.cbFamiliaFinPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if AnsiCompareText(DisplayValue, cbFamiliaIni.Text) < 0 then
  begin
    ErrorText := msgInfFamiliaIniMayor;
    Error := True;
    Exit;
  end;
  RefrescarInforme;
end;

procedure TfrListadoArticulosAlmacen.VerModal;
begin
  if (ContenidoModal is TfrArticulosAlmacen) then
  begin
    (ContenidoModal as TfrArticulosAlmacen).CodigoAlmacen := CodigoAlmacen;
    //Aunque desactive Almacen no se asegura que pueda darse un cambio de almacen
    (ContenidoModal as TfrArticulosAlmacen).cbxAlmacen.Enabled := False;
    (ContenidoModal as TfrArticulosAlmacen).bFinalizar.Visible := False;
  end;    
  inherited;
end;

procedure TfrListadoArticulosAlmacen.CodAlmacenPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  EntidadModal := Entidad;
  ContenidoModal := TfrAlmacenes.Create(Self);
end;

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

  ConfigurarFrame(Self, Self.Entidad);
end;

function TfrListadoArticulosAlmacen.CloseFrame: Boolean;
begin
  FInforme.Preview := NIL;
  (FVistaPrevia as TRdxFrame).CloseFrame;
  Result := inherited CloseFrame;
end;

end.
