{
===============================================================================
  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: 16-11-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 Vendedor;

interface

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

type
  TfrVendedor = class(TRdxFrameVendedores)
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    dsVendedor: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    pnlDatos: TAdvPanel;
    eObservaciones: TLabel;
    Observaciones: TcxDBMemo;
    Codigo: TcxDBButtonEdit;
    eCodigo: TLabel;
    NIFCIF: TcxDBTextEdit;
    eNIFCIF: TLabel;
    eDescuento: TLabel;
    eNombre: TLabel;
    Nombre: TcxDBTextEdit;
    pnlDireccion: TAdvPanel;
    eCalle: TLabel;
    Numero: TcxDBTextEdit;
    Piso: TcxDBTextEdit;
    Calle: TcxDBTextEdit;
    ePiso: TLabel;
    eNumero: TLabel;
    eProvincia: TLabel;
    eCodigoProtal: TLabel;
    Provincia: TcxDBButtonEdit;
    CodigoPostal: TcxDBTextEdit;
    ePoblacion: TLabel;
    Poblacion: TcxDBButtonEdit;
    eTelefono1: TLabel;
    eTelefono2: TLabel;
    Telefono1: TcxDBTextEdit;
    Telefono2: TcxDBTextEdit;
    eMovil1: TLabel;
    eMovil2: TLabel;
    Movil1: TcxDBTextEdit;
    Movil2: TcxDBTextEdit;
    pnlCuerpo: TPanel;
    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 BuscarVendedor; 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 TablaVendedores;
    property CodigoVendedor;
  end;

var
  frVendedor: TfrVendedor;

implementation
{$R *.DFM}

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

constructor TfrVendedor.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  Entidad := entVendedor;

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

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaVendedores := TIBDataSet.Create(Self);
  dsVendedor.DataSet := TablaVendedores;

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

  dmTablaVendedores.InicializarTablaVendedores(@TablaVendedores); 
  bCancelar.Cancel := True;
  bSalir.Cancel := True;
end;

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

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

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

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

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

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

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

procedure TfrVendedor.ActivarModoAnadir;
var
  CodNuevo : Variant;
begin
  dsVendedor.AutoEdit := True;

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

  try
    with TablaVendedores 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;
      FieldByName('PORCENTAJE').AsString := '0';
    end;
    dmTablaVendedores.InicializarTablaVendedores(@TablaVendedores); 
    CodNuevo := dmTablaVendedores.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 TfrVendedor.ActivarModoModificar;
begin
  dsVendedor.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 TablaVendedores do
    begin
      Open;
      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;      
      FieldByName('PORCENTAJE').OnSetText := PorcentajeSetText;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgDatosNoExisteVend, [CodigoVendedor]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
      Edit;
      Post;
      Edit;
    end;
    dmTablaVendedores.InicializarTablaVendedores(@TablaVendedores);
    Visible := True;
    NIFCIF.SetFocus;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgDatosVendBloqueado, [CodigoVendedor]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrVendedor.ActivarModoConsultar;
begin
  dsVendedor.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
    TablaVendedores.Open;
    if TablaVendedores.RecordCount = 0 then
    begin
      VerMensajeFmt(msgDatosNoExisteVend, [CodigoVendedor]);
      CloseFrame;
      Exit;
    end;
    TablaVendedores.Cancel;
    dmTablaVendedores.InicializarTablaVendedores(@TablaVendedores);
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrVendedor.ActivarModoEliminar;
begin
  dsVendedor.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
    TablaVendedores.Open;
    if TablaVendedores.RecordCount = 0 then
    begin
      VerMensajeFmt(msgDatosNoExisteVend, [CodigoVendedor]);
      CancelarEliminar;
      CloseFrame;
      Exit;
    end;
    TablaVendedores.Cancel;
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

destructor TfrVendedor.Destroy;
begin
  TablaVendedores.Close;
  TablaVendedores.UnPrepare;
  TablaVendedores.Free;
  inherited;
end;

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

procedure TfrVendedor.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameVendedores) then
  begin
    CodigoVendedor := (ContenidoModal as TRdxFrameVendedores).CodigoVendedor;
    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 TfrVendedor.VerModal;
begin
  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := FCodigoProvincia;
  inherited;
end;

procedure TfrVendedor.BuscarVendedor;
begin
  if Transaccion = NIL then
    Exit;
  try
    TablaVendedores.DisableControls;
    TablaVendedores.Close;

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

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

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

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

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

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

procedure TfrVendedor.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 TfrVendedor.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 TfrVendedor.ProvinciaSetText(Sender: TField; const Text: String);
begin
  FCodigoProvinciaDireccion := dmTablaProvincias.darCodigoProvincia(Text);
  Sender.AsString := Text;
end;

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

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

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

end.
