{
===============================================================================
  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: 05-12-2002
  Versión actual: 1.0.1
  Fecha versión actual: 28-06-2003
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    28-06-2003    Arreglada precisión en campo 'Porcentaje'.
===============================================================================
}

unit Instalador;

interface

uses
  Windows, Db, StdCtrls, RdxMemo, RdxCampos, RdxTitulos, Forms, RdxPaneles,
  RdxBotones, Controls, ExtCtrls, RdxBarras, Classes, RdxFrameInstaladores,
  RdxFrame, RXDBCtrl, ComCtrls, cxDBEdit, cxMaskEdit, cxButtonEdit,
  cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, AdvPanel, Configuracion,
  cxSpinEdit;

type
  TfrInstalador = class(TRdxFrameInstaladores)
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    dsInstalador: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    pnlCuerpo: TPanel;
    pnlDatos: TAdvPanel;
    eObservaciones: TLabel;
    eCodigo: TLabel;
    eNIFCIF: TLabel;
    eDescuento: TLabel;
    eNombre: TLabel;
    Observaciones: TcxDBMemo;
    Codigo: TcxDBButtonEdit;
    NIFCIF: TcxDBTextEdit;
    Nombre: TcxDBTextEdit;
    pnlDireccion: TAdvPanel;
    eTelefono2: TLabel;
    eTelefono1: TLabel;
    eCalle: TLabel;
    ePiso: TLabel;
    eNumero: TLabel;
    eProvincia: TLabel;
    eCodigoProtal: TLabel;
    ePoblacion: TLabel;
    eMovil1: TLabel;
    eMovil2: TLabel;
    Movil1: TcxDBTextEdit;
    Telefono2: TcxDBTextEdit;
    Telefono1: TcxDBTextEdit;
    CodigoPostal: TcxDBTextEdit;
    Calle: TcxDBTextEdit;
    Numero: TcxDBTextEdit;
    Piso: TcxDBTextEdit;
    Provincia: TcxDBButtonEdit;
    Poblacion: TcxDBButtonEdit;
    Movil2: TcxDBTextEdit;
    Porcentaje: TcxDBTextEdit;
    procedure bSalirClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure bAceptarClick(Sender: TObject);
    procedure ProvinciaPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure PoblacionPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodigoPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
  private
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FCodigoProvinciaDireccion : Variant;
    FCodigoPoblacionDireccion : Variant;
    procedure ProvinciaSetText(Sender: TField; const Text: String);
    procedure PorcentajeSetText(Sender: TField; const Text: String);
  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;
    function ComprobarDatos : Boolean; override;
    procedure VerModal; override;
    procedure SetCodigoProvincia (Value : Variant); virtual;
    procedure SetCodigoPoblacion (Value : Variant); virtual;
    procedure SetCodigoProvinciaDireccion (Value : Variant); virtual;
    procedure SetCodigoPoblacionDireccion (Value : Variant); virtual;
    procedure FreeContenido; override;
    procedure BuscarInstalador; override;
  public
    property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
    property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;
    property CodigoProvinciaDireccion : Variant read FCodigoProvinciaDireccion write SetCodigoProvinciaDireccion;
    property CodigoPoblacionDireccion : Variant read FCodigoPoblacionDireccion write SetCodigoPoblacionDireccion;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaInstaladores;
    property CodigoInstalador;
  end;

var
  frInstalador: TfrInstalador;

implementation
{$R *.DFM}

uses
  TablaInstaladores, Mensajes, IB, Colores, IBDatabase, Instaladores,
  Provincias, RdxFrameProvincias, Poblaciones, RdxFramePoblaciones,
  TablaProvincias, BaseDatos, IBCustomDataSet, Sysutils,
  StrFunc, TablaPoblaciones, Excepciones, IBErrorCodes,
  Variants, Entidades, NumFunc, Literales;

constructor TfrInstalador.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  Entidad := entInstalador;

  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;
  FCodigoProvinciaDireccion := NULL;
  FCodigoPoblacionDireccion := NULL;

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaInstaladores := TIBDataSet.Create(Self);
  dsInstalador.DataSet := TablaInstaladores;

  with TablaInstaladores do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaInstaladores.sqlConsultar);
    InsertSQL.Assign(dmTablaInstaladores.sqlInsertar);
    ModifySQL.Assign(dmTablaInstaladores.sqlModificar);
    DeleteSQL.Assign(dmTablaInstaladores.sqlEliminar);
    RefreshSQL.Assign(dmTablaInstaladores.sqlConsultar);
  end;

  bCancelar.Cancel := True;
  bSalir.Cancel := True;
end;

procedure TfrInstalador.SetCodigoProvincia(Value: Variant);
begin
  if FCodigoProvincia <> Value then
    FCodigoProvincia := Value;
end;

procedure TfrInstalador.SetCodigoPoblacion(Value: Variant);
begin
  if FCodigoPoblacion <> Value then
    FCodigoPoblacion := Value;
end;

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

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

function TfrInstalador.AnadirDatos : Boolean;
begin
  Result := False;
  try
    TablaInstaladores.Post;
    TablaInstaladores.ApplyUpdates;
//    dmTablaInstaladores.IncrementarCodigo;
    CodigoInstalador := TablaInstaladores.FieldByName('CODIGO').AsString;
    Commit;
    TablaInstaladores.CachedUpdates := False;
    TablaInstaladores.Close;
    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        VerMensajeFmt(msgDatosCodInstRepetido, [Codigo.DataBinding.Field.AsString]);
        TablaInstaladores.Edit;
      end
      else
        TratarExcepcion(E);
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrInstalador.ModificarDatos : Boolean;
begin
  Result := False;
  try
    TablaInstaladores.Post;
    Commit;
    TablaInstaladores.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

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

procedure TfrInstalador.ActivarModoAnadir;
var
  CodNuevo : Variant;
begin

  dsInstalador.AutoEdit := True;

  Codigo.Properties.Buttons[0].Visible := False;
  Provincia.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;

  try
    with TablaInstaladores do
    begin
      Close;
      Prepare;
      CachedUpdates := True;
      Open;
      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
      FieldByName('PORCENTAJE').OnSetText := PorcentajeSetText;
      Insert;
      FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('USUARIO').AsString := dmBaseDatos.Usuario;
    end;
    dmTablaInstaladores.InicializarTablaInstaladores(@TablaInstaladores);
    CodNuevo := dmTablaInstaladores.DarNuevoCodigo;
    Codigo.DataBinding.Field.asString := CodNuevo;
    Visible := True;
    NIFCIF.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrInstalador.ActivarModoModificar;
begin
  dsInstalador.AutoEdit := True;

  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.ReadOnly := True;
  Provincia.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;

  // Para que no haga dos accesos a la tabla cuando es consulta
  FCodigoProvinciaDireccion := dmTablaProvincias.darCodigoProvincia(Provincia.Text);
  try
    with TablaInstaladores do
    begin
      Open;
      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
      FieldByName('PORCENTAJE').OnSetText := PorcentajeSetText;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgDatosNoExisteInst, [CodigoInstalador]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
      Edit;
      Post;
      Edit;
    end;
    dmTablaInstaladores.InicializarTablaInstaladores(@TablaInstaladores);
    Visible := True;
    NIFCIF.SetFocus;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgDatosInstBloqueado, [CodigoInstalador]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrInstalador.ActivarModoConsultar;
begin
  dsInstalador.AutoEdit := False;

  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.ReadOnly := True;
  Provincia.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;

  try
    TablaInstaladores.Open;
    if TablaInstaladores.RecordCount = 0 then
    begin
      VerMensajeFmt(msgDatosNoExisteInst, [CodigoInstalador]);
      CloseFrame;
      Exit;
    end;
    TablaInstaladores.Cancel;
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrInstalador.ActivarModoEliminar;
begin
  dsInstalador.AutoEdit := False;

  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.ReadOnly := True;
  Provincia.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;

  try
    TablaInstaladores.Open;
    if TablaInstaladores.RecordCount = 0 then
    begin
      VerMensajeFmt(msgDatosNoExisteInst, [CodigoInstalador]);
      CancelarEliminar;
      CloseFrame;
      Exit;
    end;
    TablaInstaladores.Cancel;
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

destructor TfrInstalador.Destroy;
begin
  TablaInstaladores.Close;
  TablaInstaladores.UnPrepare;
  TablaInstaladores.Free;
  inherited;
end;

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

procedure TfrInstalador.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameInstaladores) then
  begin
    CodigoInstalador := (ContenidoModal as TRdxFrameInstaladores).CodigoInstalador;
    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;
  inherited FreeContenido;
end;

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

procedure TfrInstalador.BuscarInstalador;
begin
  if Transaccion = NIL then
    Exit;
  try
    TablaInstaladores.DisableControls;
    TablaInstaladores.Close;

    // Buscar la fila a tratar si es necesario
    if not EsCadenaVacia(CodigoInstalador) then
        TablaInstaladores.Params.ByName('CODIGO').AsString := CodigoInstalador;

    TablaInstaladores.Prepare;
    TablaInstaladores.Open;
    TablaInstaladores.EnableControls;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

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

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

function TfrInstalador.CancelarModificar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaInstaladores.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrInstalador.ComprobarDatos: Boolean;
begin
  Result := False;
  if EsCadenaVacia(Nombre.Text) then
  begin
    VerMensaje(msgDatosFaltaNombreInst);
    Nombre.SetFocus;
    Exit;
  end;
  Result := True;
end;

procedure TfrInstalador.SetCodigoPoblacionDireccion(Value: Variant);
begin
  if (not EsCadenaVacia(FCodigoPoblacionDireccion)) and (FCodigoPoblacionDireccion = Value) then
    exit;

  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoPoblacionDireccion := Value;
    Poblacion.DataBinding.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvinciaDireccion, FCodigoPoblacionDireccion);
  end;
end;

procedure TfrInstalador.SetCodigoProvinciaDireccion(Value: Variant);
begin
  if (not EsCadenaVacia(FCodigoProvinciaDireccion)) and (FCodigoProvinciaDireccion = Value) then
    exit;

  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoProvinciaDireccion := Value;
    Provincia.DataBinding.Field.AsString := dmTablaProvincias.darNombreProvincia(FCodigoProvinciaDireccion);
  end;
end;

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

procedure TfrInstalador.ProvinciaPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  CaptionModal := msgListaProvincias;
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrProvincias.Create(Self);
  CodigoProvinciaDireccion := CodigoProvincia;
end;

procedure TfrInstalador.PoblacionPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  if (EsCadenaVacia(CodigoProvinciaDireccion)) then begin
    VerMensaje(msgSinProvincia);
    Provincia.SetFocus;
    Exit;
  end;
  CodigoProvincia := CodigoProvinciaDireccion;
  CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]);
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrPoblaciones.Create(Self);
  CodigoPoblacionDireccion := CodigoPoblacion;
end;

procedure TfrInstalador.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, FCodigoInstalador es NULL y da error al activar modo porque
    no se inicializa los parámetros de la sql. Lo hace BuscarInstalador. }
  if not TablaInstaladores.Active then
    BuscarInstalador;
  ContenidoModal := TfrInstaladores.Create(Self);
end;

procedure TfrInstalador.PorcentajeSetText(Sender: TField;
  const Text: String);
begin
  if EsCadenaVacia(Text) then
    Sender.AsString := '0'
  else begin
    ValidarDto(Text);
    Sender.AsString := Text;
  end;
end;

end.
