{
===============================================================================
  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.0
  Fecha versión actual: 05-12-2002
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit PagoCliente;

interface

uses
  Windows, Db, StdCtrls, SysUtils, RdxMemo, RdxCampos, RdxTitulos, Forms, RdxPaneles,
  RdxBotones, Controls, ExtCtrls, RdxBarras, Classes, RdxFramePagos,
  RdxFrame, RXDBCtrl, ComCtrls, RdxComboBox, RxMemDS, cxStyles, cxCustomData,
  cxGraphics, cxFilter, cxData, cxEdit, cxDBData, cxClasses,
  cxControls, cxCalendar, cxDBEdit, cxContainer, cxTextEdit,
  cxMaskEdit, cxButtonEdit, AdvPanel, cxMemo, cxDropDownEdit, Menus, am2000menuitem, am2000popupmenu, am2000,
  cxSpinEdit, IBCustomDataSet, cxLookupEdit, cxDBLookupEdit,
  cxDBLookupComboBox, TablaPagosCliente, Entidades,

  RdxEmpresaActiva, am2000utils;

type
  TfrPagoCliente = class(TRdxFramePagos)
    dsPago: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    pnlCuerpo: TPanel;
    pnlDatosCliente: TAdvPanel;
    MenuOpciones: TPopupMenu2000;
    mnuAnadir: TMenuItem2000;
    mnuEliminar: TMenuItem2000;
    mnuEliminarTodo: TMenuItem2000;
    MenuItem1: TMenuItem2000;
    MenuItem2: TMenuItem2000;
    pnlDatosPago: TAdvPanel;
    eFecha: TLabel;
    eCodigo: TLabel;
    Fecha: TcxDBDateEdit;
    Codigo: TcxDBButtonEdit;
    Label1: TLabel;
    CodCliente: TcxDBButtonEdit;
    eNIFCIF: TLabel;
    NIFCIF: TcxDBTextEdit;
    eNombre: TLabel;
    Nombre: TcxDBTextEdit;
    eDireccion: TLabel;
    Calle: TcxDBTextEdit;
    eProvincia: TLabel;
    Provincia: TcxDBButtonEdit;
    ePoblacion: TLabel;
    Poblacion: TcxDBButtonEdit;
    eTelefono1: TLabel;
    Telefono1: TcxDBTextEdit;
    eMovil1: TLabel;
    Movil1: TcxDBTextEdit;
    Movil2: TcxDBTextEdit;
    eMovil2: TLabel;
    eTelefono2: TLabel;
    Telefono2: TcxDBTextEdit;
    eFax: TLabel;
    Fax: TcxDBTextEdit;
    eCodigoPostal: TLabel;
    CodigoPostal: TcxDBTextEdit;
    eNumero: TLabel;
    Numero: TcxDBTextEdit;
    ePiso: TLabel;
    Piso: TcxDBTextEdit;
    eFormaPago: TLabel;
    cbxFormaPago: TcxDBComboBox;
    eImporte: TLabel;
    eCaja: TLabel;
    eDescripcion: TLabel;
    Descripcion: TcxDBMemo;
    cbxCaja: TcxDBLookupComboBox;
    dsLibros: TDataSource;
    Importe: TcxDBTextEdit;
    procedure bAceptarClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
    procedure CodClienteExit(Sender: TObject);
    procedure CodClientePropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
    procedure ProvinciaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
    procedure PoblacionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
  private
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FCodigoCliente : Variant;
    FDatosPago : TDatosPagoCliente;
    FTablaLibros : TIBDataSet;

    procedure rellenarDatosPago;

  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 FreeContenido; override;
    procedure BuscarPago; override;
    procedure SetCodigoPago (Value : Variant); override;
    procedure SetCodigoProvincia (Value : Variant);
    procedure SetCodigoPoblacion (Value : Variant);
    procedure SetCodigoCliente (Value : Variant);
    procedure ImporteSetText(Sender: TField; const Text: String);
  public
    property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
    property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;
    property CodigoCliente : Variant read FCodigoCliente write SetCodigoCliente;

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

var
  frPagoCliente: TfrPagoCliente;

implementation
{$R *.DFM}

uses
  Mensajes, IB, Colores, IBDatabase, BaseDatos, StrFunc, Excepciones,
  IBErrorCodes, Variants, NumFunc, TablaFamilias, Literales, configuracion,
  TablaPropiedadesArticulo, TablaPropiedades, TablaLibros, TablaFormasPago, TablaClientes,
  TablaProvincias, TablaPoblaciones, Clientes, Provincias, Poblaciones,
  RdxFrameProvincias, RdxFramePoblaciones, RdxFrameClientes, PagosClientes, Constantes,
  ElegirDireccionCliente, TablaEmpresas, TablaPagosProveedor;


////////////////////////////////////////////////////////////////////////////////
// PUBLIC
////////////////////////////////////////////////////////////////////////////////
constructor TfrPagoCliente.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;
  FCodigoCliente := NULL;
  FDatosPago := Nil;

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

  TablaPagos := TIBDataSet.Create(Self);
  dsPago.DataSet := TablaPagos;

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

  FTablaLibros := TIBDataSet.Create(Self);
  dsLibros.DataSet := FTablaLibros;
  with FTablaLibros do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaLibros.sqlConsultarLibros);
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    Prepare;
    Open;
  end;
  cbxFormaPago.Properties.Items := dmTablaFormasPago.darFormasPago;

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

destructor TfrPagoCliente.Destroy;
begin
  TablaPagos.Close;
  TablaPagos.UnPrepare;
  TablaPagos.Free;

  FTablaLibros.Close;
  FTablaLibros.UnPrepare;
  FTablaLibros.Free;

  if FDatosPago <> nil then FDatosPago.Free;

  inherited;
end;

function TfrPagoCliente.AnadirDatos : Boolean;
var
  lsNumEntrada : Variant;

begin
  Result := False;
  try
    lsNumEntrada := dmTablaLibros.darNumEntrada(TablaPagos.FieldByName('TIPOLIBRO').AsString);
    if (esCadenaVacia(lsNumEntrada)) then begin
      Rollback;
      VerMensaje(msgCliErrorOp);
      TablaPagos.Edit;
    end;

    TablaPagos.FieldByName('NUMENTRADA').AsString := lsNumEntrada;

    case Entidad of
      entCobroCliente : TablaPagos.FieldByName('TIPOPAGO').AsString := CTE_COBRO;
      entAbonoCliente : TablaPagos.FieldByName('TIPOPAGO').AsString := CTE_ABONO;
      else begin
        VerMensaje('Log: la entidad no se corresponde con ningun tipo de pago');
        Rollback;
        VerMensaje(msgCliErrorOp);
        TablaPagos.Edit;
      end;
    end;

    rellenarDatosPago;
    if dmTablaLibros.anadirEntradaLibro(Entidad, Modo, FDatosPago) then
    begin
      dmTablaPagosCliente.IncrementarCodigo;
      TablaPagos.Post;
      Commit;
      FCodigoPago := TablaPagos.FieldByName('CODIGO').AsString;
      TablaPagos.Close;
      Result := True;
    end
    else
    begin
        Rollback;
        VerMensaje(msgCliErrorOp);
        TablaPagos.Edit;
    end;

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

function TfrPagoCliente.EliminarDatos : Boolean;
begin
  Result := False;
  try

    rellenarDatosPago;
    if not dmTablaLibros.anularEntradaLibro(Entidad, Modo, FDatosPago) then begin
      VerMensaje(msgCliErrorOp);
      Rollback;
      Exit;
    end;

    TablaPagos.Delete;
    Commit;
    TablaPagos.Close;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgCliPagBloqueado, [Codigo.DataBinding.Field.AsString]);
        else begin
          Rollback;
          TratarExcepcion(E);
        end;
      end;
    end;
    on E : Exception do begin
      Rollback;
      TratarExcepcion(E);
    end;
  end;
end;

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

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

function TfrPagoCliente.ComprobarDatos: Boolean;
begin
  Result := False;
  if (Modo in [Anadir, Modificar]) then
  begin
    if EsCadenaVacia(Descripcion.Text) then
    begin
      VerMensaje(msgCliFaltaDescPag);
      Descripcion.SetFocus;
      Exit;
    end;
    if EsCadenaVacia(CodCliente.Text) then
    begin
      VerMensaje(msgCliFaltaCliPag);
      CodCliente.SetFocus;
      Exit;
    end;
  end;
  Result := True;
end;

procedure TfrPagoCliente.VerModal;
begin
  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia;
  if (ContenidoModal is TRdxFrameClientes) then
    (ContenidoModal as TRdxFrameClientes).CodigoCliente := CodigoCliente;
  if (ContenidoModal is TRdxFramePagos) then begin
//    (ContenidoModal as TRdxFramePagos).Serie := Serie;
    (ContenidoModal as TRdxFramePagos).CodigoPago := CodigoPago;
  end;
  inherited;
end;

procedure TfrPagoCliente.FreeContenido;
begin
  if (ContenidoModal is TRdxFramePagos) then
  begin
    CodigoPago := (ContenidoModal as TRdxFramePagos).CodigoPago;
    ActivarModo;
  end;
  if (ContenidoModal is TRdxFrameClientes) then
    FCodigoCliente := (ContenidoModal as TRdxFrameClientes).CodigoCliente;
  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 TfrPagoCliente.BuscarPago;
begin
  if Transaccion = NIL then
    Exit;
  try
    TablaPagos.DisableControls;
    TablaPagos.Close;

    // Buscar la fila a tratar si es necesario
    if not EsCadenaVacia(CodigoPago) then begin
      TablaPagos.ParamByName('CODIGO').AsString := CodigoPago;
      TablaPagos.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    end;
    TablaPagos.Prepare;
    TablaPagos.Open;
    TablaPagos.EnableControls;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrPagoCliente.SetCodigoProvincia(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoProvincia := Value;
    Provincia.DataBinding.Field.AsString := dmTablaProvincias.DarNombreProvincia(FCodigoProvincia);
  end;
end;

procedure TfrPagoCliente.SetCodigoPoblacion(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoPoblacion := Value;
    Poblacion.DataBinding.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion);
  end;
end;

procedure TfrPagoCliente.SetCodigoCliente(Value: Variant);
var
  CodAux : Variant;
  DatosCliente : TDatosCliente;
  DireccionElegida : TDireccionElegida;
  NumSucursal : Integer;
begin
  if EsCadenaVacia(Value) then
    exit;

  CodAux := Trim(Value);
  if (dmTablaClientes.ValidarCodigo(CodAux)) then begin
    CodAux := dmTablaClientes.FormatearCodigo(CodAux);
    if (dmTablaClientes.ExisteCodigo(CodAux)) then
      FCodigoCliente := CodAux
    else begin
      raise Exception.CreateFmt(msgCliCodCliNoExiste, [CodAux]);
    end;
  end
  else begin
    raise Exception.CreateFmt(msgCliCodCliIncorrecto, [CodAux]);
  end;

  DatosCliente := TDatosCliente.Create(FCodigoCliente);
  try
    CodCliente.DataBinding.Field.AsString := DatosCliente.Codigo;
    if DatosCliente.Sucursales.Count > 0 then
    begin
      frElegirDireccionCliente := TfrElegirDireccionCliente.Create(Self);
      try
        frElegirDireccionCliente.Cliente := DatosCliente;
        frElegirDireccionCliente.ShowModal;
        DireccionElegida := frElegirDireccionCliente.DireccionSeleccionada;
        NumSucursal := frElegirDireccionCliente.NumSucursal;
      finally
        frElegirDireccionCliente.Free;
      end;
    end
    else
      DireccionElegida := dePrincipal;

    CodCliente.DataBinding.Field.AsString := DatosCliente.Codigo;
    if DireccionElegida = dePrincipal then
    begin
      NIFCIF.DataBinding.Field.AsString := DatosCliente.Nifcif;
      Nombre.DataBinding.Field.AsString := DatosCliente.Nombre;
      Calle.DataBinding.Field.AsString := DatosCliente.Calle;
      Numero.DataBinding.Field.AsString := DatosCliente.Numero;
      Piso.DataBinding.Field.AsString := DatosCliente.Piso;
      Provincia.DataBinding.Field.AsString := DatosCliente.Provincia;
      FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(DatosCliente.Provincia);
      Poblacion.DataBinding.Field.AsString := DatosCliente.Poblacion;
      CodigoPostal.DataBinding.Field.AsString := DatosCliente.CodigoPostal;
      Telefono1.DataBinding.Field.AsString := DatosCliente.Telefono1;
      Telefono2.DataBinding.Field.AsString := DatosCliente.Telefono2;
      Movil1.DataBinding.Field.AsString := DatosCliente.Movil1;
      Movil2.DataBinding.Field.AsString := DatosCliente.Movil2;
      Fax.DataBinding.Field.AsString := DatosCliente.Fax;
    end
    else begin
      with DatosCliente.Sucursales do
      begin
        NIFCIF.DataBinding.Field.AsString := Sucursal[NumSucursal].Nifcif;
        Nombre.DataBinding.Field.AsString := Sucursal[NumSucursal].Nombre;
        Calle.DataBinding.Field.AsString := Sucursal[NumSucursal].Calle;
        Numero.DataBinding.Field.AsString := Sucursal[NumSucursal].Numero;
        Piso.DataBinding.Field.AsString := Sucursal[NumSucursal].Piso;
        Provincia.DataBinding.Field.AsString := Sucursal[NumSucursal].Provincia;
        FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Sucursal[NumSucursal].Provincia);
        Poblacion.DataBinding.Field.AsString := Sucursal[NumSucursal].Poblacion;
        CodigoPostal.DataBinding.Field.AsString := Sucursal[NumSucursal].CodigoPostal;
        Telefono1.DataBinding.Field.AsString := Sucursal[NumSucursal].Telefono1;
        Telefono2.DataBinding.Field.AsString := Sucursal[NumSucursal].Telefono2;
        Movil1.DataBinding.Field.AsString := Sucursal[NumSucursal].Movil1;
        Movil2.DataBinding.Field.AsString := Sucursal[NumSucursal].Movil2;
        Fax.DataBinding.Field.AsString := Sucursal[NumSucursal].Fax;
      end;
    end;
  finally
    DatosCliente.Free;
  end;
end;

{
procedure TfrPagoCliente.SetCodigoLibro(Value: Variant);
begin
  if not EsCadenaVacia(Value) then
  begin
    FCodigoLibro := Value;
  end
end;
}

procedure TfrPagoCliente.ImporteSetText(Sender: TField; const Text: String);
begin
  if EsCadenaVacia(Text) then begin
    Sender.AsString := '0';
    exit;
  end;

  try
    if (Entidad = entCobroCliente) then
    begin
       if (StrToFloat(Text) < 0)
       then Sender.AsFloat := (-1) * StrToFloat(Text)
       else Sender.AsString := Text
    end
    else if (Entidad = entAbonoCliente) then
    begin
       if (StrToFloat(Text) < 0)
       then Sender.AsString := Text
       else Sender.AsFloat := (-1) * StrToFloat(Text)
    end;
  except
    on E : EConvertError do begin
      Sender.AsString := '0'
    end;
  end;
end;

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

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

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

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

procedure TfrPagoCliente.CodClienteExit(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;

  if EsCadenaVacia(CodCliente.Text) then
    exit;

  if (dmTablaClientes.validarCodigo(CodCliente.Text)) then begin
    CodCliente.DataBinding.Field.AsString := dmTablaClientes.formatearCodigo(CodCliente.Text);
    if (dmTablaClientes.existeCodigo(CodCliente.Text)) then
      CodigoCliente := CodCliente.Text
    else begin
      VerMensajeFmt(msgCliCodCliNoExiste, [CodCliente.Text]);
      CodCliente.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgCliCodCliIncorrecto, [CodCliente.Text]);
    CodCliente.SetFocus;
  end;
end;

procedure TfrPagoCliente.CodClientePropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
begin
  ContenidoModal := TfrClientes.Create(Self);
  CodigoCliente := FCodigoCliente;
end;

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

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

////////////////////////////////////////////////////////////////////////////////
// PRIVATE
////////////////////////////////////////////////////////////////////////////////

procedure TfrPagoCliente.rellenarDatosPago;
begin
  if FDatosPago <> nil then FDatosPago.Free;

  FDatosPago := TDatosPagoCliente.Create;
  FDatosPago.Codigo := TablaPagos.FieldByName('CODIGO').AsString;
  FDatosPago.FechaAlta := TablaPagos.FieldByName('FECHAALTA').AsString;
  FDatosPago.Usuario := TablaPagos.FieldByName('USUARIO').AsString;
  FDatosPago.FechaPago := TablaPagos.FieldByName('FECHAPAGO').AsString;
  FDatosPago.TipoLibro := TablaPagos.FieldByName('TIPOLIBRO').AsString;
  FDatosPago.NumEntrada := TablaPagos.FieldByName('NUMENTRADA').AsString;
  FDatosPago.TipoPago := TablaPagos.FieldByName('TIPOPAGO').AsString;
  FDatosPago.Importe := TablaPagos.FieldByName('IMPORTE').AsFloat;
  FDatosPago.FormaPago := TablaPagos.FieldByName('FORMAPAGO').AsString;
  FDatosPago.Descripcion := TablaPagos.FieldByName('DESCRIPCION').AsString;
  FDatosPago.CodigoCliente := TablaPagos.FieldByName('CODIGOCLIENTE').AsString;
  FDatosPago.NIFCIF := TablaPagos.FieldByName('NIFCIF').AsString;
  FDatosPago.Nombre := TablaPagos.FieldByName('NOMBRE').AsString;
  FDatosPago.Calle := TablaPagos.FieldByName('CALLE').AsString;
  FDatosPago.Numero := TablaPagos.FieldByName('NUMERO').AsString;
  FDatosPago.Piso := TablaPagos.FieldByName('PISO').AsString;
  FDatosPago.CodigoPostal := TablaPagos.FieldByName('CODIGOPOSTAL').AsString;
  FDatosPago.Poblacion := TablaPagos.FieldByName('POBLACION').AsString;
  FDatosPago.Provincia := TablaPagos.FieldByName('PROVINCIA').AsString;
  FDatosPago.Telefono1 := TablaPagos.FieldByName('TELEFONO1').AsString;
  FDatosPago.Telefono2 := TablaPagos.FieldByName('TELEFONO2').AsString;
  FDatosPago.Movil1 := TablaPagos.FieldByName('MOVIL1').AsString;
  FDatosPago.Movil2 := TablaPagos.FieldByName('MOVIL2').AsString;
  FDatosPago.Fax := TablaPagos.FieldByName('FAX').AsString;
  FDatosPago.Correo := TablaPagos.FieldByName('CORREO').AsString;
end;


////////////////////////////////////////////////////////////////////////////////
// PROTECTED
////////////////////////////////////////////////////////////////////////////////
procedure TfrPagoCliente.ActivarModoAnadir;
var
  CodNuevo : Variant;
  i : Integer;
begin
  dsPago.AutoEdit := True;
  Codigo.Properties.Buttons[0].Visible := False;
  Codigo.Enabled := False;
  CodCliente.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;
  Provincia.Properties.Buttons[0].Visible := True;

  try
    CodNuevo := dmTablaPagosCliente.DarNuevoCodigo;

    with TablaPagos do
    begin
      Close;
      Prepare;
      Open;
      Insert;
      FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      FieldByName('CODIGO').AsString := CodNuevo;
      FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('USUARIO').AsString := dmBaseDatos.Usuario;
      FieldByName('FECHAPAGO').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('TIPOLIBRO').AsString := EmpresaActiva.LibroDefecto;

      case Entidad of
        entCobroCliente : FieldByName('TIPOPAGO').AsString := CTE_COBRO;
        entAbonoCliente : FieldByName('TIPOPAGO').AsString := CTE_ABONO;
        else verMensaje('LOG: error entidad erronea');
      end;
      FieldByName('IMPORTE').AsFloat := 0;
      FieldByName('IMPORTE').OnSetText := ImporteSetText;
    end;

    dmTablaPagosCliente.InicializarTablaPagosClientes(@TablaPagos);
    Visible := True;
    Importe.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrPagoCliente.ActivarModoConsultar;
begin
  dsPago.AutoEdit := False;
  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Enabled := True;
  CodCliente.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;
  Provincia.Properties.Buttons[0].Visible := False;

  try
    with TablaPagos do
    begin
      Prepare;
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgCliNoExistePag, [CodigoPago]);
        CloseFrame;
        Exit;
      end;
      Cancel;
    end;

    dmTablaPagosCliente.InicializarTablaPagosClientes(@TablaPagos);

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

procedure TfrPagoCliente.ActivarModoEliminar;
begin
  dsPago.AutoEdit := False;
  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Enabled := True;
  CodCliente.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;
  Provincia.Properties.Buttons[0].Visible := False;

  try
    with TablaPagos do
    begin
      Prepare;
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgCliNoExistePag, [CodigoPago]);
        CancelarEliminar;
        CloseFrame;
        Exit;
      end;
      Cancel;
    end;

    dmTablaPagosCliente.InicializarTablaPagosClientes(@TablaPagos);

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

procedure TfrPagoCliente.ActivarModoModificar;
begin
  dsPago.AutoEdit := True;
  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Properties.ReadOnly := True;
  Codigo.Enabled := True;
  CodCliente.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;
  Provincia.Properties.Buttons[0].Visible := True;

  try
    with TablaPagos do
    begin
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgCliNoExistePag, [CodigoPago]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
      Edit;
      Post;
      Edit;
      FieldByName('IMPORTE').OnSetText := ImporteSetText;
    end;
    dmTablaPagosCliente.InicializarTablaPagosClientes(@TablaPagos);

    //Guardamos los datos del pago origen
//    rellenarDatosPago;
    Visible := True;
    Importe.SetFocus;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgCliPagBloqueado, [CodigoPago]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrPagoCliente.ModificarDatos: Boolean;
begin
  Result := False;
  try
    TablaPagos.Post;

    if (FDatosPago.Importe <> TablaPagos.FieldByName('IMPORTE').AsFloat)
    or (FDatosPago.TipoLibro <> TablaPagos.FieldByName('TIPOLIBRO').AsString) then
    begin

      if not dmTablaLibros.anularEntradaLibro(Entidad, Modo, FDatosPago) then begin
        Rollback;
        VerMensaje(msgCliErrorOp);
        TablaPagos.Edit;
        exit;
      end;


      rellenarDatosPago;
      FDatosPago.NumEntrada := dmTablaLibros.darNumEntrada(FDatosPago.TipoLibro);
      if (esCadenaVacia(FDatosPago.NumEntrada)) then begin
        Rollback;
        VerMensaje(msgCliErrorOp);
        TablaPagos.Edit;
        exit;
      end;

      TablaPagos.Edit;
      TablaPagos.FieldByName('NUMENTRADA').AsString := FDatosPago.NumEntrada;
      TablaPagos.Post;

      if not dmTablaLibros.anadirEntradaLibro(Entidad, Modo, FDatosPago) then
      begin
        Rollback;
        VerMensaje(msgCliErrorOp);
        TablaPagos.Edit;
        exit;
      end;
    end;

    Commit;
    TablaPagos.Close;
    Result := True;

  except
    on E : EIBError do begin
      Rollback;
      TratarExcepcion(E);
      TablaPagos.Edit;
    end;
    on E : Exception do begin
      Rollback;
      TratarExcepcion(E);
      TablaPagos.Edit;
    end;
  end;
end;

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

procedure TfrPagoCliente.SetCodigoPago(Value: Variant);
begin
  inherited;
  if not EsCadenaVacia(Value) then
  begin
    if (Modo <> Anadir) then begin
      if (CTE_COBRO = TablaPagos.FieldByName('TIPOPAGO').AsString)
      then Entidad := entCobroCliente
      else Entidad := entAbonoCliente;

      rellenarDatosPago;
    end;
  end;
end;

end.
