{
===============================================================================
  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.1.2
  Fecha versión actual: 18-03-2005
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    01-10-2001    Desactivar la posibilidad de ordenar las columnas del grid
                  para que no desaparezcan los datos no grabados en tablas.

    20-10-2001    Se ha ampliado el campo 'Domiciliación bancaria'
                  porque pasa a tener 100 caracteres.

    21-10-2001    Al pasar del modo Consultar/Eliminar a Añadir/Modificar no se
                  activaban algunos botones con lupa.

    04-11-2001    No se pueden eliminar clientes con almacenes u obras.

    07-04-2002    Se ha adaptado para la transacción única.

    09-04-2002    En las funciones 'CancelarAnadir', 'CancelarModificar',
                  'CancelarEliminar', 'AnadirDatos', 'ModificarDatos', y
                  'EliminarDatos' cerrar todas las tablas que se usen.

    09-04-2002    En el evento 'bCancelarClick' llamar a la función
                  'TratarCambios' en vez de 'DescartarOperacion'.

    06-05-2002    Adaptación al grid 'TdxDBGrid'.

    21-08-2002    P237. Revisar los botones de 'Eliminar' y 'Eliminar todo'
                  para que al pulsar 'Esc' cancele la operación y no la
                  ejecute como ahora.

    24-09-2002    Se producía una excepción si el cursos estaba en el código
                  del cliente, 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-10-2002    Activar p240. Se ha añadido el campo tipo de cliente

    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.

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

    18-03-2005    Establecer IVA por defecto al dar de alta un cliente 16%
===============================================================================
}

unit Cliente;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RdxBotones, StdCtrls, RdxMemo, RdxComboBox, RdxCampos, ExtCtrls,
  RdxTitulos, Tipos, ComCtrls,
  RdxCheckBox, Grids, DBGrids, RdxPaneles,
  RdxBarras, Db, RdxDBFrame, RdxFrameClientes, RXDBCtrl, RdxPageControl, IB,
  dxCntner, dxTL, dxDBCtrl, dxDBGrid, dxExEdtr, cxControls, cxContainer,
  cxEdit, cxTextEdit, cxMaskEdit, cxButtonEdit, cxDBEdit, cxCheckBox;

type
  TfrCliente = class(TRdxFrameClientes)
    pnlScroll: TRdxScrollPanel;
    pnlCliente: TRdxPanel;
    eCodigo: TLabel;
    eNombre: TLabel;
    eObservaciones: TLabel;
    cDatos: TRdxCabecera;
    eIVA: TLabel;
    eDto: TLabel;
    eDomiciliacion: TLabel;
    eNIFCIF: TLabel;
    cbxDomiciliacion: TRdxDBComboBox;
    NIF: TRdxDBEdit;
    Nombre: TRdxDBEdit;
    IVA: TRdxDBEdit;
    Dto: TRdxDBEdit;
    Observaciones: TRdxDBMemo;
    brDoble: TRdxBarraInferior;
    bGuardar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    dsCliente: TDataSource;
    pnlTitulo: TRdxPanelTituloOperacion;
    dsSucursales: TDataSource;
    PanelDirecciones: TRdxPanel;
    Paginas: TRdxPagesControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    pnlDireccion: TRdxPanel;
    eDireccion: TLabel;
    eNumero: TLabel;
    ePiso: TLabel;
    eCodigoPostal: TLabel;
    ePoblacion: TLabel;
    eProvincia: TLabel;
    eTelefono1: TLabel;
    eTelefono2: TLabel;
    eFax: TLabel;
    eCorreo: TLabel;
    ePersona: TLabel;
    Provincia: TRdxDBEdit;
    Poblacion: TRdxDBEdit;
    Telefono1: TRdxDBEdit;
    Telefono2: TRdxDBEdit;
    Fax: TRdxDBEdit;
    Calle: TRdxDBEdit;
    Numero: TRdxDBEdit;
    Piso: TRdxDBEdit;
    CodigoPostal: TRdxDBEdit;
    CorreoElectronico: TRdxDBEdit;
    PersonaContacto: TRdxDBEdit;
    pnlGridArticulos: TPanel;
    pnlBarraGrid: TRdxPanel;
    bAnadir: TRdxBoton;
    bEliminar: TRdxBoton;
    bEliminarTodo: TRdxBoton;
    gridSucursales: TdxDBGrid;
    cbxTipoCliente: TRdxDBComboBox;
    eTipo: TLabel;
    Codigo: TcxDBButtonEdit;
    cxEtiquetado: TcxDBCheckBox;
    procedure bSalirClick(Sender: TObject);
    procedure bAceptarClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure bAnadirClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure ProvinciaButtonClick(Sender: TObject);
    procedure PoblacionButtonClick(Sender: TObject);
    procedure IVAExit(Sender: TObject);
    procedure DtoExit(Sender: TObject);
    procedure bEliminarTodoClick(Sender: TObject);
    procedure CodigoPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodigoPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
  private
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FCodigoProvinciaDireccion : Variant;
    FCodigoPoblacionDireccion : Variant;
    FCodigoProvinciaSucursal : Variant;
    FCodigoPoblacionSucursal : Variant;
  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 SetCodigoProvinciaSucursal (Value : Variant); virtual;
    procedure SetCodigoPoblacionSucursal (Value : Variant); virtual;
    procedure FreeContenido; override;
    procedure BuscarCliente; 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;
    property CodigoProvinciaSucursal : Variant read FCodigoProvinciaSucursal write SetCodigoProvinciaSucursal;
    property CodigoPoblacionSucursal : Variant read FCodigoPoblacionSucursal write SetCodigoPoblacionSucursal;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaClientes;
    property TablaSucursales;
    property CodigoCliente;
    procedure SucursalAfterInsert(DataSet: TDataSet);
    procedure GridBotonPoblacionClick(Sender: TObject);
    procedure GridBotonProvinciaClick(Sender: TObject);
    procedure ProvinciaSucursalSetText(Sender: TField; const Text: String);
    procedure ProvinciaSetText(Sender: TField; const Text: String);
  end;

var
  frCliente: TfrCliente;

implementation
{$R *.DFM}

uses
  IBCustomDataSet, TablaClientes, Mensajes, Provincias,
  Poblaciones, Clientes, Colores, Configuracion, NumFunc, 
  BaseDatos, TablaSucursalesCliente, RdxFrameProvincias,
  RdxFramePoblaciones, TablaProvincias, TablaBancos, StrFunc,
  TablaPoblaciones, Excepciones, IBErrorCodes, dxDBTLCL, TablaTiposCliente,
  Literales, Constantes;


const
  eRegBloq = -901;

constructor TfrCliente.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;
  FCodigoProvinciaDireccion := NULL;
  FCodigoPoblacionDireccion := NULL;
  FCodigoProvinciaSucursal := NULL;
  FCodigoPoblacionSucursal := NULL;

  Entidad := entCliente;
  ConfigurarFrame(Self, Self.Entidad);

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;

  TablaClientes := TIBDataSet.Create(Self);
  TablaSucursales := TIBDataSet.Create(Self);
  TablaSucursales.AfterInsert := SucursalAfterInsert;
  dsCliente.DataSet := TablaClientes;
  dsSucursales.DataSet := TablaSucursales;
  with TablaClientes do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaClientes.sqlConsultar);
    InsertSQL.Assign(dmTablaClientes.sqlInsertar);
    ModifySQL.Assign(dmTablaClientes.sqlModificar);
    DeleteSQL.Assign(dmTablaClientes.sqlEliminar);
    RefreshSQL.Assign(dmTablaClientes.sqlConsultar);
  end;

  with TablaSucursales do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaSucursalesCliente.sqlGrid);
    InsertSQL.Assign(dmTablaSucursalesCliente.sqlInsertar);
    ModifySQL.Assign(dmTablaSucursalesCliente.sqlModificar);
    DeleteSQL.Assign(dmTablaSucursalesCliente.sqlEliminar);
    RefreshSQL.Assign(dmTablaSucursalesCliente.sqlConsultar);
  end;
  cbxDomiciliacion.Items := dmTablaBancos.DarBancos;
  cbxTipoCliente.Items := dmTablaTiposCliente.DarTiposCliente;
  dmTablaSucursalesCliente.InicializarGridSucursales(gridSucursales);
  Paginas.ActivePageIndex := 0;
end;

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

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

function TfrCliente.AnadirDatos : boolean;
var
  CodSucursal : Integer;
begin
  Result := False;
  try
    CodSucursal := 0;
    TablaClientes.Post;
    TablaSucursales.DisableControls;
    TablaSucursales.First;
    while not TablaSucursales.Eof do begin
      TablaSucursales.Edit;
      TablaSucursales.FieldByName('CODIGO').AsInteger := CodSucursal;
      TablaSucursales.FieldByName('CODIGOCLIENTE').AsString := Codigo.DataBinding.Field.AsString;
      CodSucursal := CodSucursal + 1;
      TablaSucursales.Next;
    end;
    TablaSucursales.EnableControls;
    TablaClientes.ApplyUpdates;
    TablaSucursales.ApplyUpdates;
    dmTablaClientes.incrementarCodigo;
    FCodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
    Commit;
    TablaClientes.CachedUpdates := False;
    TablaSucursales.CachedUpdates := False;
    TablaClientes.Close;
    TablaSucursales.Close;
    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        VerMensajeFmt(msgCliCodCliRepetido, [Codigo.DataBinding.Field.AsString]);
        TablaClientes.Edit;
      end
      else
        TratarExcepcion(E);
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrCliente.ModificarDatos : boolean;
var
  CodSucursal : Integer;
begin
  Result := False;
  try
    CodSucursal := 0;
    TablaClientes.Post;
    TablaSucursales.DisableControls;

    TablaSucursales.First;
    while not TablaSucursales.Eof do
    begin
      TablaSucursales.Edit;
      TablaSucursales.FieldByName('CODIGO').AsInteger := CodSucursal;
      CodSucursal := CodSucursal + 1;
      TablaSucursales.Post;
      TablaSucursales.Next;
    end;

    TablaSucursales.ApplyUpdates;
    TablaSucursales.EnableControls;
    Commit;
    TablaSucursales.CachedUpdates := False;
    TablaClientes.Close;
    TablaSucursales.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrCliente.EliminarDatos : boolean;
begin
  Result := False;
  try
    TablaClientes.Delete;
    Commit;
    TablaClientes.Close;
    TablaSucursales.Close;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgCliBloqueado, [Codigo.DataBinding.Field.AsString]);
        isc_foreign_key   : VerMensajeFmt(msgCliConAlmAso, [Codigo.DataBinding.Field.AsString]);
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrCliente.ActivarModoAnadir;
var
  CodNuevo : Variant;
begin
  dsCliente.AutoEdit := True;
  dsSucursales.AutoEdit := True;

  pnlBarraGrid.Visible := True;

  ActivarEdicionGridDetalles(gridSucursales);

  (gridSucursales.ColumnByFieldName('PROVINCIA')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonProvinciaClick;

  (gridSucursales.ColumnByFieldName('POBLACION')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonPoblacionClick;

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

  try
    { Antes de aplicar la caché hay que asegurarse de que la
      tabla está cerrada. }
    TablaClientes.Close;
    TablaSucursales.Close;
    CodNuevo := dmTablaClientes.darNuevoCodigo;
    TablaClientes.CachedUpdates := True;
    TablaSucursales.CachedUpdates := True;
    TablaClientes.Open;
    TablaClientes.FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
    TablaSucursales.Prepare;
    TablaSucursales.Params.ByName('CODIGOCLIENTE').AsString := CodNuevo;
    TablaSucursales.Open;
    TablaSucursales.FieldByName('PROVINCIA').OnSetText := ProvinciaSucursalSetText;
    TablaClientes.Insert;
    Codigo.DataBinding.Field.AsString := CodNuevo;
    cxEtiquetado.DataBinding.Field.AsInteger := 0;
    TablaClientes.FieldByName('IVA').AsString := CTE_IVA;    
    Visible := True;
    NIF.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrCliente.ActivarModoModificar;
begin
  dsCliente.AutoEdit := True;
  dsSucursales.AutoEdit := True;

  ActivarEdicionGridDetalles(gridSucursales);

  (gridSucursales.ColumnByFieldName('PROVINCIA')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonProvinciaClick;

  (gridSucursales.ColumnByFieldName('POBLACION')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonPoblacionClick;

  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
  FCodigoProvinciaDireccion := dmTablaProvincias.darCodigoProvincia(Provincia.Text);
  try
    TablaClientes.Open;
    TablaClientes.FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
    if TablaClientes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgCliNoExiste, [CodigoCliente]);
      CancelarModificar;
      CloseFrame;
      Exit;
    end;

    { Antes de aplicar la caché hay que asegurarse de que la
      tabla está cerrada. }
    TablaSucursales.Close;
    TablaSucursales.CachedUpdates := True;
    TablaSucursales.Params.ByName('CODIGOCLIENTE').AsString := Codigo.DataBinding.Field.AsString;
    TablaSucursales.Prepare;
    TablaSucursales.Open;
    TablaSucursales.FieldByName('PROVINCIA').OnSetText := ProvinciaSucursalSetText;
    TablaClientes.Edit;
    TablaClientes.Post;
    TablaClientes.Edit;
    Visible := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgCliBloqueado, [CodigoCliente]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrCliente.ActivarModoConsultar;
begin
  dsCliente.AutoEdit := False;
  dsSucursales.AutoEdit := False;
  pnlBarraGrid.Visible := False;
  DesactivarEdicionGridDetalles(gridSucursales);

  (gridSucursales.ColumnByFieldName('PROVINCIA')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;

  (gridSucursales.ColumnByFieldName('POBLACION')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;

  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.OnValidate := nil;
  Provincia.VerBoton := False;
  Poblacion.VerBoton := False;
  try
    TablaClientes.Open;

    if TablaClientes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgCliNoExiste, [CodigoCliente]);
      CloseFrame;
      Exit;
    end;
    
    TablaSucursales.Open;
    TablaSucursales.Params.ByName('CODIGOCLIENTE').AsString := Codigo.DataBinding.Field.AsString;
    TablaClientes.Cancel;
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrCliente.ActivarModoEliminar;
begin
  dsCliente.AutoEdit := False;
  dsSucursales.AutoEdit := False;
  pnlBarraGrid.Visible := False;

  DesactivarEdicionGridDetalles(gridSucursales);

  (gridSucursales.ColumnByFieldName('PROVINCIA')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;

  (gridSucursales.ColumnByFieldName('POBLACION')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;

  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.OnValidate := nil;
  Provincia.VerBoton := False;
  Poblacion.VerBoton := False;
  try
    TablaClientes.Open;
    
    if TablaClientes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgCliNoExiste, [CodigoCliente]);
      CancelarEliminar;
      CloseFrame;
      Exit;
    end;

    TablaSucursales.Open;
    TablaSucursales.Params.ByName('CODIGOCLIENTE').AsString := CodigoCliente;
    TablaClientes.Cancel;
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrCliente.BuscarCliente;
begin
  if Transaccion = NIL then
    exit;
  try
    TablaClientes.Close;

    // Buscar la fila a tratar si es necesario
    if not VarIsNull(CodigoCliente) then
    begin
        TablaClientes.Params.ByName('CODIGO').AsString := CodigoCliente;
        TablaSucursales.Params.ByName('CODIGOCLIENTE').AsString := CodigoCliente;
    end;
    TablaClientes.Prepare;
    TablaSucursales.Prepare;
    TablaClientes.Open;
    TablaSucursales.Open;    
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

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

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

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

destructor TfrCliente.Destroy;
begin
  TablaSucursales.Close;
  TablaSucursales.UnPrepare;
  TablaSucursales.Free;

  TablaClientes.Close;
  TablaClientes.UnPrepare;
  TablaClientes.Free;
  inherited;
end;

procedure TfrCliente.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameClientes) then begin
    CodigoCliente := (ContenidoModal as TRdxFrameClientes).CodigoCliente;
    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 TfrCliente.SetCodigoPoblacion(Value: Variant);
begin
  if FCodigoPoblacion <> Value then
    FCodigoPoblacion := Value;
end;

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

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

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

procedure TfrCliente.bAnadirClick(Sender: TObject);
begin
  try
    TablaSucursales.Append;
    Paginas.ActivePageIndex := 1;
    gridSucursales.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrCliente.bEliminarClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then
    Exit;

  if TablaSucursales.RecordCount = 0 then begin
    { Hacemos un cancel de la tabla por si el registro actual estuviera
      recien creado }
    TablaSucursales.Cancel;
    exit;
  end;
  try
    TablaSucursales.Delete;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrCliente.GridBotonPoblacionClick(Sender: TObject);
begin
  FCodigoProvinciaSucursal := dmTablaProvincias.darCodigoProvincia(TablaSucursales.FieldByName('PROVINCIA').AsString);
  if (VarIsNull(CodigoProvinciaSucursal)) then begin
    VerMensaje(msgSinProvincia);
    Exit;
  end;
  TablaSucursales.Edit;
  CodigoProvincia := CodigoProvinciaSucursal;
  CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]);
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrPoblaciones.Create(Self);
  CodigoPoblacionSucursal := CodigoPoblacion;
end;

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

procedure TfrCliente.PoblacionButtonClick(Sender: TObject);
begin
  if (VarIsNull(CodigoProvinciaDireccion)) then begin
    VerMensaje(msgSinProvincia);
    Paginas.ActivePageIndex := 0;    
    Provincia.SetFocus;
    Exit;
  end;
  CodigoProvincia := CodigoProvinciaDireccion;
  CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]);
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrPoblaciones.Create(Self);
  CodigoPoblacionDireccion := CodigoPoblacion;
end;

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

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

procedure TfrCliente.SetCodigoPoblacionSucursal(Value: Variant);
begin
  if (not VarIsNull(FCodigoPoblacionSucursal)) and (FCodigoPoblacionSucursal = Value) then
    exit;

  if (not VarIsNull(Value)) then
  begin
    FCodigoPoblacionSucursal := Value;
    TablaSucursales.FieldByName('POBLACION').AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvinciaSucursal, FCodigoPoblacionSucursal);
  end;
end;

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

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

procedure TfrCliente.SetCodigoProvinciaSucursal(Value: Variant);
begin
  if (not VarIsNull(FCodigoProvinciaSucursal)) and (FCodigoProvinciaSucursal = Value) then
    exit;

  if (not VarIsNull(Value)) then
  begin
    FCodigoProvinciaSucursal := Value;
    TablaSucursales.FieldByName('PROVINCIA').AsString := dmTablaProvincias.darNombreProvincia(FCodigoProvinciaSucursal);
  end;
end;

procedure TfrCliente.IVAExit(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;
  try
    validarIVA(IVA.Text);
  except
    on E : Exception do begin
      IVA.SetFocus;
      VerMensaje(E.Message);
    end;
  end;
end;

procedure TfrCliente.DtoExit(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;
  try
    validarDto(Dto.Text);
  except
    on E : Exception do begin
      Dto.SetFocus;
      VerMensaje(E.Message);
    end;
  end;
end;

procedure TfrCliente.SucursalAfterInsert(DataSet: TDataSet);
begin
    DataSet.FieldByName('CODIGOCLIENTE').AsString := Codigo.DataBinding.Field.AsString;
    DataSet.FieldByName('CODIGO').AsInteger := -1;
    DataSet.FieldByName('DB_KEY').AsString := '-';
end;

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

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

function TfrCliente.ComprobarDatos: Boolean;
begin
  Result := False;

  if EsCadenaVacia(Nombre.Text) then
  begin
    VerMensaje(msgCliFaltaNombreCli);
    Nombre.SetFocus;
    Exit;
  end;

  if EsCadenaVacia(Calle.Text) then
  begin
    VerMensaje(msgCliFaltaCalle);
    Paginas.ActivePageIndex := 0;    
    Calle.SetFocus;
    Exit;
  end;
  Result := True;
end;

procedure TfrCliente.ProvinciaSucursalSetText(Sender: TField;
  const Text: String);
var
  CampoProvincia : String;
begin
  CampoProvincia := AnsiUpperCase(Text);
  FCodigoProvinciaSucursal := dmTablaProvincias.darCodigoProvincia(CampoProvincia);
  Sender.AsString := CampoProvincia;
end;

procedure TfrCliente.GridBotonProvinciaClick(Sender: TObject);
begin
  TablaSucursales.Edit;
  CaptionModal := 'Lista de provincias';
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrProvincias.Create(Self);
  CodigoProvinciaSucursal := CodigoProvincia;
end;

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

procedure TfrCliente.CodigoPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  inherited;
  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, FCodigoCliente es NULL y da error al activar modo porque
    no se inicializa los parámetros de la sql. Lo hace BuscarCliente. }
  if not TablaClientes.Active then
    BuscarCliente;
  ContenidoModal := TfrClientes.Create(Self);
end;

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

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

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

end.
