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

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    08-10-2001    Se ha añadido en ActivarModoAñadir la comprobación de si es
                  entidad entAlmacen y si es asi sacar pantalla de elección de
                  tipo de almacén.

    27-11-2001    Se ha modificado CambiarEntidad para que cuando la entidad sea
                  obra los titulos correspondientes cambien.

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

    24-09-2002    Se producía una excepción si el cursos estaba en el código
                  del almacén, se pulsaba la tecla 'Esc' y se elegía 'No'.
                  El frame estaba oculto pero saltaba el evento OnExit del
                  campo de código de factura.

    21-12-2002    Se ha eliminado un error con el campo 'PROVINCIA'. Al estar
                  situado en ese campo y dar Esc para salir se puede producir
                  una excepción.

    06-03-2004    Se ha eliminado el tratamiento de perfiles de usuario.

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

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

    13-10-2004    Se añade la lista de presupuestos asociados                          
===============================================================================
}

unit Almacen;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Db, IBCustomDataSet, Mask, DBCtrls, Buttons, ToolEdit,
  IB, IBSQL, IBDatabase, RdxBarras, RdxBotones,  RdxCampos, RdxMemo, RdxComboBox,
  RdxCheckBox, RdxTitulos, RdxPaneles, Colores, Mensajes, Tipos,
  RdxFrameAlmacenes, cxControls, cxContainer, cxEdit, cxTextEdit, cxDBEdit,
  cxMaskEdit, cxButtonEdit, Entidades, cxStyles, cxCustomData, cxGraphics,
  cxFilter, cxData, cxDataStorage, cxDBData, cxGridLevel, cxClasses,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView,
  cxGridDBTableView, cxGrid;

type
  TfrAlmacen = class(TRdxFrameAlmacenes)
    pnlScroll: TRdxScrollPanel;
    pnlDatos: TRdxPanel;
    ePersona: TLabel;
    eTelefono: TLabel;
    eCodigoPostal: TLabel;
    eProvincia: TLabel;
    ePoblacion: TLabel;
    eNumero: TLabel;
    ePiso: TLabel;
    eCalle: TLabel;
    eCodigo: TLabel;
    cDatosAlmacen: TRdxCabecera;
    eNombre: TLabel;
    eNombreCliente: TLabel;
    eNifCifCliente: TLabel;
    eCodigoCliente: TLabel;
    Poblacion: TRdxDBEdit;
    Provincia: TRdxDBEdit;
    Piso: TRdxDBEdit;
    Numero: TRdxDBEdit;
    Calle: TRdxDBEdit;
    PersonaContacto: TRdxDBEdit;
    Nombre: TRdxDBEdit;
    CodigoPostal: TRdxDBEdit;
    Telefono: TRdxDBEdit;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    brDoble: TRdxBarraInferior;
    bGuardar: TRdxBoton;
    bCancelarGuardar: TRdxBoton;
    dsAlmacen: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    NomCliente: TRdxDBEdit;
    NifCifCliente: TRdxDBEdit;
    Codigo: TcxDBButtonEdit;
    CodCliente: TcxDBButtonEdit;
    pnlListaPresupuestos: TRdxPanel;
    bAgragar: TRdxBoton;
    pnlGridArticulos: TPanel;
    RdxPanel2: TRdxPanel;
    eListaProveedores: TLabel;
    dsObrasPresupuestos: TDataSource;
    pnlBarraGrid: TRdxPanel;
    bEliminar: TRdxBoton;
    bElminarTodo: TRdxBoton;
    bAnadir: TRdxBoton;
    eClienteAsociado: TLabel;
    gridDetallesView: TcxGridDBTableView;
    gridDetallesLevel1: TcxGridLevel;
    gridDetalles: TcxGrid;
    procedure CodigoPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure CodigoPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodClientePropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodClientePropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure ProvinciaButtonClick(Sender: TObject);
    procedure PoblacionButtonClick(Sender: TObject);
    procedure bAceptarClick(Sender: TObject);
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure ProvinciaSetText(Sender: TField; const Text: String);
    procedure bAnadirClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bElminarTodoClick(Sender: TObject);
  private
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FCodigoCliente : Variant;

    FTablaObrasPresupuestos : TIBDataSet;
    FCodigoPresupuesto: Variant;
    procedure SetCodigoPresupuesto(const Value: Variant);
    procedure limpiarCampos;
  protected
    procedure ActivarModoAnadir; override;
    procedure ActivarModoModificar; override;
    procedure ActivarModoConsultar; override;
    procedure ActivarModoEliminar; override;
    function AnadirDatos : Boolean; override;
    function ModificarDatos : Boolean; override;
    function EliminarDatos : Boolean; override;
    function CancelarAnadir : Boolean; override;
    function CancelarModificar : Boolean; override;
    function CancelarEliminar : Boolean; override;
    procedure SetCodigoProvincia (Value : Variant); virtual;
    procedure SetCodigoPoblacion (Value : Variant); virtual;
    procedure SetCodigoCliente (Value : Variant);
    procedure BuscarAlmacen; override;
    procedure BuscarCliente;
    procedure VerModal; override;
    procedure FreeContenido; override;
    function ComprobarDatos: Boolean; override;
    function CambiarEntidad (EntidadAnterior, Entidad : TRdxEntidad): Boolean; override;
  public
    property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
    property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;
    property CodigoCliente : Variant read FCodigoCliente write SetCodigoCliente;
    property CodigoPresupuesto : Variant read FCodigoPresupuesto write SetCodigoPresupuesto;

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;

    procedure GridBotonCodigoPresupuestoClick(Sender: TObject; AButtonIndex: Integer);
  published
    property TablaAlmacenes;
    property CodigoAlmacen;
  end;

var
  frAlmacen: TfrAlmacen;

implementation
{$R *.DFM}

uses
  BaseDatos, TablaAlmacenes, Almacenes, RdxFrameProvincias, Provincias,
  TablaProvincias, RdxFramePoblaciones, Poblaciones, RdxFrameClientes,
  Clientes, TablaClientes, TablaPoblaciones, TablaPedidosProveedor,
  ElegirTipoAlmacen, Excepciones, IBErrorCodes, Configuracion, NumFunc, 
  RdxEmpresaActiva, StrFunc, Literales, PresupuestosClientes, RdxFramePresupuestos,
  Variants, RdxFrame;

constructor TfrAlmacen.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;
  FCodigoCliente := NULL;

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

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

  FTablaObrasPresupuestos := TIBDataSet.Create(Self);
  dsObrasPresupuestos.DataSet := FTablaObrasPresupuestos;
  with FTablaObrasPresupuestos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaAlmacenes.sqlConsultarPresupuesto);
    InsertSQL.Assign(dmTablaAlmacenes.sqlInsertarPresupuesto);
    ModifySQL.Assign(dmTablaAlmacenes.sqlModificarPresupuesto);
    DeleteSQL.Assign(dmTablaAlmacenes.sqlEliminarPresupuesto);
    RefreshSQL.Assign(dmTablaAlmacenes.sqlConsultarPresupuesto);
  end;
  dmTablaAlmacenes.InicializarGridDetallesPresupuestos(gridDetalles);

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

destructor TfrAlmacen.Destroy;
begin
  TablaAlmacenes.Close;
  TablaAlmacenes.UnPrepare;
  TablaAlmacenes.Free;

  FTablaObrasPresupuestos.Close;
  FTablaObrasPresupuestos.UnPrepare;
  FTablaObrasPresupuestos.Free;

  inherited;
end;

procedure TfrAlmacen.BuscarAlmacen;
begin
  if Transaccion = NIL then
    exit;
  try
    TablaAlmacenes.Close;

    // Buscar la fila a tratar si es necesario
    if not VarIsNull(CodigoAlmacen) then
      TablaAlmacenes.Params.ByName('CODIGO').AsString := CodigoAlmacen;
    TablaAlmacenes.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    TablaAlmacenes.Prepare;
    TablaAlmacenes.Open;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlmacen.SetCodigoProvincia(Value: Variant);
begin
  if (not VarIsNull(FCodigoProvincia)) and (FCodigoProvincia = Value) then
    Exit;

  if (not VarIsNull(Value)) then
  begin
    FCodigoProvincia := Value;
    Provincia.Field.AsString := dmTablaProvincias.darNombreProvincia(FCodigoProvincia);
  end;
end;

procedure TfrAlmacen.SetCodigoPoblacion(Value: Variant);
begin
  if (not VarIsNull(FCodigoPoblacion)) and (FCodigoPoblacion = Value) then
    Exit;

  if (not VarIsNull(Value)) then
  begin
    FCodigoPoblacion := Value;
    Poblacion.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion);
  end;
end;

procedure TfrAlmacen.SetCodigoCliente(Value: Variant);
begin
  if (not VarIsNull(FCodigoCliente)) and (FCodigoCliente = Value) then
    Exit;

  if (not VarIsNull(Value)) then
  begin
    FCodigoCliente := Value;
    CodCliente.DataBinding.Field.AsString := Value;
    BuscarCliente;
  end
  else
    limpiarCampos;
end;

procedure TfrAlmacen.BuscarCliente;
var
  Datos: TDatosCliente;
begin
  if not dmTablaClientes.ExisteCodigo(CodigoCliente) then
  begin
    VerMensajeFmt(msgCliCodCliNoExiste, [CodCliente.Text]);
    CodCliente.SetFocus;
    exit;
  end;

  Datos := TDatosCliente.Create(CodigoCliente);
  try
    NifCifCliente.Field.asString := Datos.Nifcif;
    NomCliente.Field.asString := Datos.Nombre;

    if (VerMensajePregunta(msgAlmDeseaRellCli) = IDYES) then
    begin
      Calle.Field.asString := Datos.Calle;
      Numero.Field.asString := Datos.Numero;
      Piso.Field.asString := Datos.Piso;
      Provincia.Field.asString := Datos.Provincia;
      CodigoPostal.Field.asString := Datos.CodigoPostal;
      Poblacion.Field.asString := Datos.Poblacion;
      Telefono.Field.asString := Datos.Telefono1;
    end;
  finally
    Datos.Free;
  end;
end;

procedure TfrAlmacen.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameAlmacenes) then begin
    CodigoAlmacen := (ContenidoModal as TRdxFrameAlmacenes).CodigoAlmacen;
    ActivarModo;
  end;

  if (ContenidoModal is TRdxFrameProvincias) then
    CodigoProvincia := (ContenidoModal as TRdxFrameProvincias).CodigoProvincia;
  if (ContenidoModal is TRdxFramePoblaciones) then begin
    CodigoProvincia := (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia;
    CodigoPoblacion := (ContenidoModal as TRdxFramePoblaciones).CodigoPoblacion;
  end;

  if (ContenidoModal is TRdxFrameClientes) then begin
    CodigoCliente := (ContenidoModal as TRdxFrameClientes).CodigoCliente;
  end;

  if (ContenidoModal is TRdxFramePresupuestos) then begin
    CodigoPresupuesto := (ContenidoModal as TRdxFramePresupuestos).CodigoPresupuesto;
  end;

  if (ContenidoModal is TfrElegirTipoAlmacen) then begin
    if(ContenidoModal as TfrElegirTipoAlmacen).TipoFisico
    then Entidad := entAlmacenFisico
    else Entidad := entAlmacenObra;
  end;

  inherited FreeContenido;
end;

procedure TfrAlmacen.VerModal;
begin
  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia;
  inherited VerModal;
end;

function TfrAlmacen.AnadirDatos : Boolean;
begin
  Result := False;
  try
    TablaAlmacenes.Post;
    TablaAlmacenes.ApplyUpdates;
    FTablaObrasPresupuestos.ApplyUpdates;
    dmTablaAlmacenes.incrementarCodigo;
    FCodigoAlmacen := TablaAlmacenes.FieldByName('CODIGO').AsString;

    Commit;

    TablaAlmacenes.CachedUpdates := False;
    TablaAlmacenes.Close;
    FTablaObrasPresupuestos.CachedUpdates := False;
    FTablaObrasPresupuestos.Close;

    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then begin
        VerMensajeFmt(msgAlmCodAlmRepetido, [Codigo.DataBinding.Field.AsString]);
        TablaAlmacenes.Edit;
      end
      else
        TratarExcepcion(E);
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrAlmacen.ModificarDatos : Boolean;
begin
  Result := False;
  try
    TablaAlmacenes.Post;
    FTablaObrasPresupuestos.ApplyUpdates;
    Commit;
    TablaAlmacenes.Close;
    FTablaObrasPresupuestos.CachedUpdates := False;
    FTablaObrasPresupuestos.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrAlmacen.EliminarDatos : Boolean;
begin
  Result := False;
  try
    TablaAlmacenes.Delete;
    Commit;
    TablaAlmacenes.Close;
    FTablaObrasPresupuestos.Close;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgAlmBloqueado, [Codigo.DataBinding.Field.AsString]);
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlmacen.activarModoAnadir;
begin
{Si la entidad asignada es entAlmacenes,quiere decir que el frame ha sido llamado
desde el frame pedido de proveedor, y por tanto hay que exigir que tipo de
almacen desea dar de alta}
  if entidad = entAlmacen then
  begin
    CaptionModal := 'Añadir almacén';
    WidthModal := 350;
    HeightModal := 160;
    ModoModal := Emitir;
    ContenidoModal := TfrElegirTipoAlmacen.Create(Self);
  end;

  CodCliente.Properties.Buttons[0].Visible := True;
  CodCliente.Properties.ReadOnly := False;
  CodCliente.Properties.OnValidate := CodClientePropertiesValidate;

  dsAlmacen.AutoEdit := True;
  Codigo.Properties.Buttons[0].Visible := False;
  Codigo.Properties.ReadOnly := False;
  Codigo.Properties.OnValidate := CodigoPropertiesValidate;
  Provincia.VerBoton := True;
  Poblacion.VerBoton := True;
  try
    TablaAlmacenes.Close;
    TablaAlmacenes.CachedUpdates := True;
    TablaAlmacenes.Open;
    TablaAlmacenes.FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
    TablaAlmacenes.Insert;
    TablaAlmacenes.FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    //Para que no detecte que el campo not null Tipo esta vacio
    TablaAlmacenes.FieldByName('TIPO').asString := '-';
    Codigo.DataBinding.Field.asString := dmTablaAlmacenes.darNuevoCodigo;

    pnlBarraGrid.Visible := True;
    FTablaObrasPresupuestos.Close;
    FTablaObrasPresupuestos.CachedUpdates := True;
    FTablaObrasPresupuestos.Open;

    ActivarEdicionGridDetalles(gridDetalles);

    with gridDetallesView do
      TcxButtonEditProperties(GetColumnByFieldName('CODIGOPRESUPUESTO').Properties).OnButtonClick := GridBotonCodigoPresupuestoClick;

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

procedure TfrAlmacen.activarModoModificar;
begin
  CodCliente.Properties.Buttons[0].Visible := True;
  CodCliente.Properties.ReadOnly := False;
  CodCliente.Properties.OnValidate := CodClientePropertiesValidate;

  dsAlmacen.AutoEdit := True;
  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.ReadOnly := True;
  Codigo.Properties.OnValidate := nil;
  Provincia.VerBoton := True;
  Poblacion.VerBoton := True;
  // Para que no haga dos accesos a la tabla cuando es consulta
  FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(Provincia.Text);
  try
    TablaAlmacenes.Open;
    TablaAlmacenes.FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
    if TablaAlmacenes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgAlmNoExisteAlm, [CodigoAlmacen]);
      CancelarModificar;
      CloseFrame;
      Exit;
    end;
    TablaAlmacenes.Edit;
    TablaAlmacenes.Post;
    TablaAlmacenes.Edit;

    pnlBarraGrid.Visible := True;
    FTablaObrasPresupuestos.Close;
    FTablaObrasPresupuestos.CachedUpdates := True;
    FTablaObrasPresupuestos.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    FTablaObrasPresupuestos.ParamByName('CODIGOALMACEN').AsString := CodigoAlmacen;
    FTablaObrasPresupuestos.Prepare;
    FTablaObrasPresupuestos.Open;

    ActivarEdicionGridDetalles(gridDetalles);

    with gridDetallesView do
      TcxButtonEditProperties(GetColumnByFieldName('CODIGOPRESUPUESTO').Properties).OnButtonClick := GridBotonCodigoPresupuestoClick;

  Visible := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgAlmBloqueado, [CodigoAlmacen]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlmacen.activarModoConsultar;
begin
  CodCliente.Properties.Buttons[0].Visible := False;
  CodCliente.Properties.ReadOnly := True;
  CodCliente.Properties.OnValidate := Nil;

  dsAlmacen.AutoEdit := False;
  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.OnValidate := nil;

  Provincia.OnExit := nil;
  Provincia.VerBoton := False;
  Poblacion.VerBoton := False;
  try
    TablaAlmacenes.Open;
    if TablaAlmacenes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgAlmNoExisteAlm, [CodigoAlmacen]);
      CloseFrame;
      Exit;
    end;
    TablaAlmacenes.Cancel;

    pnlBarraGrid.Visible := False;
    FTablaObrasPresupuestos.Close;
    FTablaObrasPresupuestos.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    FTablaObrasPresupuestos.ParamByName('CODIGOALMACEN').AsString := CodigoAlmacen;
    FTablaObrasPresupuestos.Prepare;
    FTablaObrasPresupuestos.Open;

    DesactivarEdicionGridDetalles(gridDetalles);

    with gridDetallesView do
      TcxButtonEditProperties(GetColumnByFieldName('CODIGOPRESUPUESTO').Properties).OnButtonClick := nil;

    Visible := True;

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

procedure TfrAlmacen.activarModoEliminar;
begin
  CodCliente.Properties.Buttons[0].Visible := False;
  CodCliente.Properties.ReadOnly := True;
  CodCliente.Properties.OnValidate := Nil;

  dsAlmacen.AutoEdit := False;
  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.OnValidate := nil;

  Provincia.OnExit := nil;
  Provincia.VerBoton := False;
  Poblacion.VerBoton := False;
  try
    TablaAlmacenes.Open;
    if TablaAlmacenes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgAlmNoExisteAlm, [CodigoAlmacen]);
      CancelarEliminar;
      CloseFrame;
      Exit;
    end;
    TablaAlmacenes.Cancel;

    pnlBarraGrid.Visible := False;
    FTablaObrasPresupuestos.Close;
    FTablaObrasPresupuestos.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    FTablaObrasPresupuestos.ParamByName('CODIGOALMACEN').AsString := CodigoAlmacen;
    FTablaObrasPresupuestos.Prepare;
    FTablaObrasPresupuestos.Open;

    DesactivarEdicionGridDetalles(gridDetalles);

    with gridDetallesView do
      TcxButtonEditProperties(GetColumnByFieldName('CODIGOPRESUPUESTO').Properties).OnButtonClick := nil;

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

procedure TfrAlmacen.ProvinciaButtonClick(Sender: TObject);
begin
  CaptionModal := 'Lista de provincias';
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrProvincias.Create(Self);
end;

procedure TfrAlmacen.PoblacionButtonClick(Sender: TObject);
begin
  if (VarIsNull(CodigoProvincia)) then begin
    VerMensaje(msgSinProvincia);
    Provincia.SetFocus;
    Exit;
  end;

  CaptionModal := Format(msgListaPoblaciones, [Provincia.Text]);
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrPoblaciones.Create(Self);
end;

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

function TfrAlmacen.CancelarAnadir: Boolean;
begin
  Result := False;
  try
    TablaAlmacenes.CancelUpdates;
    FTablaObrasPresupuestos.CancelUpdates;
    RollBack;
    TablaAlmacenes.CachedUpdates := False;
    TablaAlmacenes.Close;
    FTablaObrasPresupuestos.CachedUpdates := False;
    FTablaObrasPresupuestos.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

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

function TfrAlmacen.CancelarModificar: Boolean;
begin
  Result := False;
  try
    FTablaObrasPresupuestos.CancelUpdates;
    RollBack;
    TablaAlmacenes.Close;
    FTablaObrasPresupuestos.CachedUpdates := False;
    FTablaObrasPresupuestos.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

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

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

function TfrAlmacen.CambiarEntidad(EntidadAnterior, Entidad: TRdxEntidad): Boolean;
begin
  { Si se realiza el cambio de entidad en carga del dfm o no se puede cambiar
    de entidad porque no se puede liberar el contenido del frame al que se
    cambia de entidad, no se hace nada}
  if not inherited CambiarEntidad(EntidadAnterior, Entidad) then
    Exit;

  ConfigurarFrame(Self, Self.Entidad);
      
  with TablaAlmacenes do
  begin
    Close;
    SelectSQL.Assign(dmTablaAlmacenes.sqlConsultar);
    ModifySQL.Assign(dmTablaAlmacenes.sqlModificar);
    DeleteSQL.Assign(dmTablaAlmacenes.sqlEliminar);
    RefreshSQL.Assign(dmTablaAlmacenes.sqlConsultar);

    case Entidad of
      entAlmacenFisico : begin
                          InsertSQL.Assign(dmTablaAlmacenes.sqlInsertarFisicos);
                          pnlListaPresupuestos.Visible := False;
                         end;

      entAlmacenObra   : begin
                          InsertSQL.Assign(dmTablaAlmacenes.sqlInsertarObras);
                          cDatosAlmacen.Caption := 'Datos de montaje';
                          //pnlListaPresupuestos.Visible := True;
                          pnlListaPresupuestos.Visible := False;
                         end;
    end;
  end;
end;

function TfrAlmacen.ComprobarDatos: Boolean;
var
  CodigoPedido : String;
  Situacion : String;
begin
  TablaAlmacenes.FieldByName('NOMBRECLIENTE').Required := False;

  Result := False;
  CodigoPedido := '';
  Situacion := '';

  if Length(Trim(Nombre.Text)) = 0 then
  begin
    VerMensaje(msgAlmFaltaNombre);
    Nombre.SetFocus;
    Exit;
  end;

  if (Modo = Eliminar) then
  begin
    if dmTablaAlmacenes.HayExistenciasEnAlmacen(EmpresaActiva.Codigo, CodigoAlmacen) then
    begin
      VerMensaje(msgAlmTieneExis);
      Exit;
    end;
    if dmTablaPedidosProveedor.ExisteAlmacenEnPedido(EmpresaActiva.Codigo, CodigoAlmacen, CodigoPedido, Situacion) then
    begin
      if Situacion = 'Totalmente recibido'
      then VerMensajeFmt(msgAlmCodAlmTienePedido,[CodigoPedido,Situacion])
      else VerMensajeFmt(msgAlmCodAlmTienePedidoPendiente,[CodigoPedido,Situacion]);
      Exit;
    end;
  end;
  Result := True;
end;

procedure TfrAlmacen.ProvinciaSetText(Sender: TField; const Text: String);
begin
  FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(Text);
  Sender.AsString := Text;
end;

procedure TfrAlmacen.CodigoPropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
var
  Valor : Variant;
begin
  if (Modo <> Anadir) or (Visible = false) then
    exit;

  if EsCadenaVacia(DisplayValue) then
    DisplayValue := dmTablaAlmacenes.darNuevoCodigo;

  if (dmTablaAlmacenes.ValidarCodigo(DisplayValue)) then
  begin

    //Comprueba que le numero es lo sufucientemente pequeño para ser un entero
    if not EsSmallInt(DisplayValue) then
    begin
      VerMensajeFmt(msgAlmCodAlmIncorrecto,[DisplayValue]);
      Codigo.SetFocus;
    end
    else if (dmTablaAlmacenes.ExisteAlmacen(EmpresaActiva.Codigo, DisplayValue)) then begin
      VerMensajeFmt(msgAlmCodAlmRepetido, [DisplayValue]);
      Codigo.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgAlmCodAlmIncorrecto, [DisplayValue]);
    Codigo.SetFocus;
  end;
end;

procedure TfrAlmacen.CodigoPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  if (TratarCambios = IDCANCEL) then
    exit;
  { Esto es porque en modo 'Modificar' hacemos un cambio y pulsamos
    este botón se cierra la tabla y si en el frame hijo (el del grid) damos
    a cancelar, FCodigoAlmacen es NULL y da error al activar modo porque
    no se inicializa los parámetros de la sql. Lo hace BuscarAlmacenes. }
  if not TablaAlmacenes.Active then
    BuscarAlmacen;
  EntidadModal := Entidad;
  ContenidoModal := TfrAlmacenes.Create(Self);
end;

procedure TfrAlmacen.CodClientePropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  inherited;
  ContenidoModal := TfrClientes.Create(Self);
end;

procedure TfrAlmacen.CodClientePropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
var
  Valor : String;
begin
  //Por si se deja vacio el campo
  if EsCadenaVacia(DisplayValue) then
  begin
    limpiarCampos;    
    exit
  end;

  if (dmTablaClientes.validarCodigo(DisplayValue)) then
    //Comprueba que le numero es lo sufucientemente pequeño para ser un entero
    if not EsInteger(DisplayValue) then
    begin
      VerMensajeFmt(msgCliCodCliIncorrecto,[DisplayValue]);
      CodCliente.Text:= '0';
      CodCliente.SetFocus;
    end
    else
      CodigoCliente := dmTablaClientes.formatearCodigo(DisplayValue)
  else
  begin
    VerMensajeFmt(msgCliCodCliIncorrecto, [DisplayValue]);
    CodCliente.SetFocus;
  end;
end;

procedure TfrAlmacen.bAnadirClick(Sender: TObject);
begin
  try
    with FTablaObrasPresupuestos do
    begin
      DisableControls;
      Next;
      if EOF then
        Append
      else
        Insert;
      EnableControls;
    end;
    gridDetalles.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlmacen.bEliminarClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then
    Exit;
  if FTablaObrasPresupuestos.RecordCount = 0 then begin
    { Hacemos un cancel de la tabla por si el registro actual estuviera
      recien creado }
    FTablaObrasPresupuestos.Cancel;
    exit
  end;
  try
    FTablaObrasPresupuestos.Delete;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlmacen.GridBotonCodigoPresupuestoClick(Sender: TObject; AButtonIndex: Integer);
begin
//  TablaDetallesMem.Edit;
  WidthModal := 900;
  HeightModal := 700;
  ContenidoModal := TfrPresupuestosClientes.Create(Self);
end;

procedure TfrAlmacen.SetCodigoPresupuesto(const Value: Variant);
begin
  FCodigoPresupuesto := Value;
  FTablaObrasPresupuestos.Edit;
  FTablaObrasPresupuestos.FieldByName('CODIGOPRESUPUESTO').AsString := FCodigoPresupuesto;
  FTablaObrasPresupuestos.FieldByName('CODIGOALMACEN').AsString := TablaAlmacenes.FieldByName('CODIGO').AsString;
  FTablaObrasPresupuestos.FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;   
end;

procedure TfrAlmacen.bElminarTodoClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgDeseaBorrarTodo) <> IDYES) then
    Exit;

  try
    FTablaObrasPresupuestos.DisableControls;
    FTablaObrasPresupuestos.Last;
    while FTablaObrasPresupuestos.RecordCount > 0 do begin
      FTablaObrasPresupuestos.Delete;
      FTablaObrasPresupuestos.Prior;
    end;
    FTablaObrasPresupuestos.EnableControls;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlmacen.limpiarCampos;
begin
    CodCliente.DataBinding.Field.asString := '';
    NifCifCliente.Field.asString := '';
    NomCliente.Field.asString := '';
    Calle.Field.asString := '';
    Numero.Field.asString := '';
    Piso.Field.asString := '';
    Provincia.Field.asString := '';
    CodigoPostal.Field.asString := '';
    Poblacion.Field.asString := '';
    Telefono.Field.asString := '';
end;

end.
