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

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    27-11-2001    Cambio de los titulos respectivos a obra y almacenes en el
                  procedimiento CambiarEntidad.

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

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

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

unit ArticuloAlmacen;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Db, IBCustomDataSet, Mask, DBCtrls, Buttons, ToolEdit,
  IB, IBDatabase, RdxBarras, RdxBotones,  RdxCampos, RdxMemo, RdxComboBox,
  RdxCheckBox, RdxTitulos, RdxPaneles, Mensajes, Tipos,
  RdxFrameArticulosAlmacen, Entidades;

type
  TfrArticuloAlmacen = class(TRdxFrameArticulosAlmacen)
    pnlScroll: TRdxScrollPanel;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    pnlAlmacen: TRdxPanel;
    eAlmacen: TLabel;
    cAlmacen: TRdxCabecera;
    pnlStock: TRdxPanel;
    cStock: TRdxCabecera;
    Existencias: TRdxDBEdit;
    eStockActual: TLabel;
    eStockMax: TLabel;
    StockMaximo: TRdxDBEdit;
    ePendRecibir: TLabel;
    eStockMin: TLabel;
    StockMinimo: TRdxDBEdit;
    pnlMaterial: TRdxPanel;
    RdxCabecera1: TRdxCabecera;
    Codigo: TRdxDBEdit;
    eCodigo: TLabel;
    cbxFamilia: TRdxDBComboBox;
    eFamilia: TLabel;
    Precio: TRdxDBEdit;
    ePrecioEuros: TLabel;
    cbxUnidadesMedida: TRdxDBComboBox;
    eUnidades: TLabel;
    eDescripcion: TLabel;
    Descripcion: TRdxDBEdit;
    eObservaciones: TLabel;
    Observaciones: TRdxDBMemo;
    dsArticulosAlmacen: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    cbxAlmacen: TRdxDBComboBox;
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    PendRecibir: TRdxEdit;
    procedure bAceptarClick(Sender: TObject);
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure CodigoButtonClick(Sender: TObject);
  protected
    function CambiarEntidad (EntidadAnterior, Entidad : TRdxEntidad): Boolean; override;
    procedure ActivarModoConsultar; override;
    procedure ActivarModoEliminar; override;
    function EliminarDatos : Boolean; override;
    function CancelarEliminar : Boolean; override;
    procedure VerModal; override;
    procedure FreeContenido; override;
    procedure BuscarAlmacen; override;
    procedure BuscarArticulo; override;
    function ComprobarDatos: Boolean; override;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaArticulosAlmacen;
    property CodigoAlmacen;
    property CodigoArticulo;
  end;

var
  frArticuloAlmacen: TfrArticuloAlmacen;

implementation

{$R *.DFM}

uses
  BaseDatos, TablaArticulos, Articulos, TablaArticulosAlmacen, ArticulosAlmacen,
  TablaAlmacenes, Excepciones, Configuracion, RdxEmpresaActiva, Literales,
  Variants, RdxFrame;

constructor TfrArticuloAlmacen.Create(AOwner : TComponent);
var
 i : Integer;
begin
  inherited Create(AOwner);
  ConfigurarFrame(Self, Self.Entidad);
  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaArticulosAlmacen := TIBDataSet.Create(Self);
  dsArticulosAlmacen.DataSet := TablaArticulosAlmacen;
  with TablaArticulosAlmacen do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaArticulosAlmacen.sqlConsultar);
    DeleteSQL.Assign(dmTablaArticulosAlmacen.sqlEliminar);
    RefreshSQL.Assign(dmTablaArticulosAlmacen.sqlConsultar);
  end;

  {Carga todos los almacenes en el combox, como no habra posibilidad de cambio,
   da igual la entidad que sea}
  dmTablaAlmacenes.DarAlmacenes(EmpresaActiva.Codigo, FListaAlmacenesCodigo,FListaCodigosAlmacen);
  for i:=0 to FListaAlmacenesCodigo.Count-1 do
    cbxAlmacen.Items.Add(FListaAlmacenesCodigo.Names[i]);
end;

destructor TfrArticuloAlmacen.Destroy;
begin
  TablaArticulosAlmacen.Close;
  TablaArticulosAlmacen.UnPrepare;
  TablaArticulosAlmacen.Free;
  inherited;
end;

procedure TfrArticuloAlmacen.bAceptarClick(Sender: TObject);
begin
  if (RealizarOperacion) then
    CloseFrame;
end;

procedure TfrArticuloAlmacen.BuscarAlmacen;
begin
  cbxAlmacen.ItemIndex := cbxAlmacen.Items.IndexOf(FListaCodigosAlmacen.Values[CodigoAlmacen]);
end;

procedure TfrArticuloAlmacen.BuscarArticulo;
begin
  if Transaccion = NIL then
    exit;
  try
    with TablaArticulosAlmacen do
    begin
      Close;

      // Buscar la fila a tratar si es necesario
      if (not VarIsNull(CodigoAlmacen)) and (not VarIsNull(CodigoArticulo)) then
      begin
          Params.ByName('CODIGOALMACEN').AsString := CodigoAlmacen;
          Params.ByName('CODIGOARTICULO').AsString := CodigoArticulo;
      end;
      Params.ByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      Open;
    end;
    dmTablaArticulos.InicializarTablaArticulos(@TablaArticulosAlmacen);
    if (not VarIsNull(CodigoAlmacen)) and (not VarIsNull(CodigoArticulo)) then
      PendRecibir.Text := dmTablaArticulosAlmacen.DarUnidadesPendRecibirArticuloAlmacen(EmpresaActiva.Codigo, CodigoAlmacen,CodigoArticulo);
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrArticuloAlmacen.ActivarModoConsultar;
begin
  dsArticulosAlmacen.AutoEdit := False;
  Codigo.VerBoton := True;
  try
    TablaArticulosAlmacen.Open;
    if TablaArticulosAlmacen.RecordCount = 0 then
    begin
      VerMensajeFmt(msgArtNoExisteArtAlm, [CodigoArticulo]);
      CloseFrame;
      Exit;
    end;
    TablaArticulosAlmacen.Cancel;
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrArticuloAlmacen.ActivarModoEliminar;
begin
  dsArticulosAlmacen.AutoEdit := False;
  Codigo.VerBoton := True;
  try
    TablaArticulosAlmacen.Open;
    if TablaArticulosAlmacen.RecordCount = 0 then
    begin
      VerMensajeFmt(msgArtNoExisteArtAlm, [CodigoArticulo]);
      CancelarEliminar;
      CloseFrame;
      Exit;
    end;
    TablaArticulosAlmacen.Cancel;
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrArticuloAlmacen.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameArticulosAlmacen) then begin
    CodigoAlmacen := (ContenidoModal as TRdxFrameArticulosAlmacen).CodigoAlmacen;
    CodigoArticulo := (ContenidoModal as TRdxFrameArticulosAlmacen).CodigoArticulo;
  end;
  inherited FreeContenido;
end;

procedure TfrArticuloAlmacen.CodigoButtonClick(Sender: TObject);
begin
  inherited;
  if (TratarCambios = IDCANCEL) then
    exit;

  Case Entidad of
    entArticuloAlmacen : EntidadModal := entArticulosAlmacen;
    entArticuloAlmacenFisico : EntidadModal := entArticulosAlmacenFisico;
    entArticuloAlmacenObra : EntidadModal := entArticulosAlmacenObra;
  end;
  ContenidoModal := TfrArticulosAlmacen.Create(Self);
end;

procedure TfrArticuloAlmacen.VerModal;
begin
  if (ContenidoModal is TRdxFrameArticulosAlmacen) then
    (ContenidoModal as TRdxFrameArticulosAlmacen).CodigoAlmacen := FCodigoAlmacen;
  inherited VerModal;
end;

function TfrArticuloAlmacen.EliminarDatos: Boolean;
begin
  Result := False;
  try
    TablaArticulosAlmacen.Delete;
    Commit;
    TablaArticulosAlmacen.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrArticuloAlmacen.CancelarEliminar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaArticulosAlmacen.Close;    
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

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

procedure TfrArticuloAlmacen.bSalirClick(Sender: TObject);
begin
  try
    Rollback;
    CloseFrame;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrArticuloAlmacen.ComprobarDatos: Boolean;
begin
  Result := False;
  Case Modo of
    Eliminar : if dmTablaArticulosAlmacen.ArticuloAlmacenTieneExistencias(EmpresaActiva.Codigo, CodigoAlmacen,CodigoArticulo) then
               begin
                 VerMensaje(msgArtTieneExistencias);
                 Exit;
               end;
  end;
  Result := True;
end;

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

  ConfigurarFrame(Self, Self.Entidad);
      
  Case Entidad of
    //entArticuloAlmacénFisico no lo ponemos porque por defecto el frame tiene los
    //titulos adaptados para él.
    entArticuloAlmacenObra : begin
                              cAlmacen.Caption := 'Montaje';
                              eAlmacen.Caption := 'Montaje:';
                              cStock.Caption := 'Stock del material en el montaje'
                             end;
    entArticuloAlmacen     : begin
                              cAlmacen.Caption := 'Almacén/Montaje';
                              eAlmacen.Caption := 'Almacén/Montaje:';
                              cStock.Caption := 'Stock del material en el almacén o montaje'
                             end;
  end;
end;

end.
