{
===============================================================================
  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 PagoProveedor;

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, TablaPagosProveedor, Entidades,

  RdxEmpresaActiva;  

type
  TfrPagoProveedor = class(TRdxFramePagos)
    dsPago: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    pnlCuerpo: TPanel;
    pnlDatosProveedor: TAdvPanel;
    pnlDatosPago: TAdvPanel;
    eFecha: TLabel;
    eCodigo: TLabel;
    Fecha: TcxDBDateEdit;
    Codigo: TcxDBButtonEdit;
    Label1: TLabel;
    CodProveedor: 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 CodProveedorExit(Sender: TObject);
    procedure CodProveedorPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
    procedure ProvinciaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
    procedure PoblacionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
  private
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FCodigoProveedor : Variant;
    FCodigoLibro: Variant;
    FDatosPago : TDatosPagoProveedor;
    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 SetCodigoProveedor (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 CodigoProveedor : Variant read FCodigoProveedor write SetCodigoProveedor;

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

var
  frPagoProveedor: TfrPagoProveedor;

implementation
{$R *.DFM}

uses
  Mensajes, IB, Colores, IBDatabase, BaseDatos, StrFunc, Excepciones,
  IBErrorCodes, Variants, NumFunc, TablaFamilias, Literales, configuracion,
  TablaPropiedadesArticulo, TablaPropiedades, TablaLibros, TablaFormasPago,
  TablaProveedores, TablaProvincias, TablaPoblaciones, Proveedores, Provincias,
  Poblaciones, RdxFrameProvincias, RdxFramePoblaciones, RdxFrameProveedores,
  PagosProveedores, Constantes, TablaEmpresas;


////////////////////////////////////////////////////////////////////////////////
// PUBLIC
////////////////////////////////////////////////////////////////////////////////
constructor TfrPagoProveedor.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;
  FCodigoProveedor := 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(dmTablaPagosProveedor.sqlConsultar);
    InsertSQL.Assign(dmTablaPagosProveedor.sqlInsertar);
    ModifySQL.Assign(dmTablaPagosProveedor.sqlModificar);
    DeleteSQL.Assign(dmTablaPagosProveedor.sqlEliminar);
    RefreshSQL.Assign(dmTablaPagosProveedor.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 TfrPagoProveedor.Destroy;
begin
  TablaPagos.Close;
  TablaPagos.UnPrepare;
  TablaPagos.Free;

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

  if FDatosPago <> nil then FDatosPago.Free;

  inherited;
end;

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

begin
  Result := False;
  try
    //Pago
    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
      entPagoProveedor : TablaPagos.FieldByName('TIPOPAGO').AsString := CTE_PAGO;
      entAbonoProveedor : 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
      dmTablaPagosProveedor.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(msgProvCodPagRepetido, [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 TfrPagoProveedor.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(msgProvPagBloqueado, [Codigo.DataBinding.Field.AsString]);
        else begin
          Rollback;
          TratarExcepcion(E);
        end;
      end;
    end;
    on E : Exception do begin
      Rollback;
      TratarExcepcion(E);
    end;
  end;
end;

function TfrPagoProveedor.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 TfrPagoProveedor.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 TfrPagoProveedor.ComprobarDatos: Boolean;
begin
  Result := False;
  if (Modo in [Anadir, Modificar]) then
  begin
    if EsCadenaVacia(Descripcion.Text) then
    begin
      VerMensaje(msgProvFaltaDescPag);
      Descripcion.SetFocus;
      Exit;
    end;
    if EsCadenaVacia(CodProveedor.Text) then
    begin
      VerMensaje(msgProvFaltaProPag);
      CodProveedor.SetFocus;
      Exit;
    end;
  end;
  Result := True;
end;

procedure TfrPagoProveedor.VerModal;
begin
  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia;
  if (ContenidoModal is TRdxFrameProveedores) then
    (ContenidoModal as TRdxFrameProveedores).CodigoProveedor := CodigoProveedor;
  if (ContenidoModal is TRdxFramePagos) then
    (ContenidoModal as TRdxFramePagos).CodigoPago := CodigoPago;
  inherited;
end;

procedure TfrPagoProveedor.FreeContenido;
begin
  if (ContenidoModal is TRdxFramePagos) then
  begin
    CodigoPago := (ContenidoModal as TRdxFramePagos).CodigoPago;
    ActivarModo;
  end;
  if (ContenidoModal is TRdxFrameProveedores) then
    FCodigoProveedor := (ContenidoModal as TRdxFrameProveedores).CodigoProveedor;
  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 TfrPagoProveedor.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 TfrPagoProveedor.SetCodigoProvincia(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoProvincia := Value;
    Provincia.DataBinding.Field.AsString := dmTablaProvincias.DarNombreProvincia(FCodigoProvincia);
  end;
end;

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

procedure TfrPagoProveedor.SetCodigoProveedor(Value: Variant);
var
  DatosProveedor : TDatosProveedor;
begin
  if EsCadenaVacia(Value) then
    exit;

  FCodigoProveedor := Value;
  DatosProveedor := TDatosProveedor.Create(FCodigoProveedor);
  try
    CodProveedor.DataBinding.Field.AsString := DatosProveedor.Codigo;
    NIFCIF.DataBinding.Field.AsString := DatosProveedor.Nifcif;
    Nombre.DataBinding.Field.AsString := DatosProveedor.Nombre;
    Calle.DataBinding.Field.AsString := DatosProveedor.Calle;
    Numero.DataBinding.Field.AsString := DatosProveedor.Numero;
    Piso.DataBinding.Field.AsString := DatosProveedor.Piso;
    Provincia.DataBinding.Field.AsString := DatosProveedor.Provincia;
    FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(DatosProveedor.Provincia);
    Poblacion.DataBinding.Field.AsString := DatosProveedor.Poblacion;
    CodigoPostal.DataBinding.Field.AsString := DatosProveedor.CodigoPostal;
    Telefono1.DataBinding.Field.AsString := DatosProveedor.Telefono1;
    Telefono2.DataBinding.Field.AsString := DatosProveedor.Telefono2;
    Movil1.DataBinding.Field.AsString := DatosProveedor.Movil1;
    Movil2.DataBinding.Field.AsString := DatosProveedor.Movil2;
    Fax.DataBinding.Field.AsString := DatosProveedor.Fax;
  finally
    DatosProveedor.Free;
  end;
end;

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

  try
    if (Entidad = entAbonoProveedor) then
    begin
       if (StrToFloat(Text) < 0)
       then Sender.AsFloat := (-1) * StrToFloat(Text)
       else Sender.AsString := Text
    end
    else if (Entidad = entPagoProveedor) 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 TfrPagoProveedor.bAceptarClick(Sender: TObject);
begin
  if (RealizarOperacion) then
    CloseFrame;
end;

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

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

procedure TfrPagoProveedor.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 := TfrPagosProveedores.Create(Self);
end;

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

  if EsCadenaVacia(CodProveedor.Text) then
    exit;

  if (dmTablaProveedores.validarCodigo(CodProveedor.Text)) then begin
    CodProveedor.DataBinding.Field.AsString := dmTablaProveedores.formatearCodigo(CodProveedor.Text);
    if (dmTablaProveedores.existeCodigo(CodProveedor.Text)) then
      CodigoProveedor := CodProveedor.Text
    else begin
      VerMensajeFmt(msgProvCodProvNoExiste, [CodProveedor.Text]);
      CodProveedor.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgProvCodProvIncorrecto, [CodProveedor.Text]);
    CodProveedor.SetFocus;
  end;
end;

procedure TfrPagoProveedor.CodProveedorPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
begin
  ContenidoModal := TfrProveedores.Create(Self);
  CodigoProveedor := FCodigoProveedor;
end;

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

procedure TfrPagoProveedor.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
////////////////////////////////////////////////////////////////////////////////


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

  try
    CodNuevo := dmTablaPagosProveedor.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
        entPagoProveedor : FieldByName('TIPOPAGO').AsString := CTE_PAGO;
        entAbonoProveedor : FieldByName('TIPOPAGO').AsString := CTE_ABONO;
        else verMensaje('LOG: error entidad erronea');
      end;
      FieldByName('IMPORTE').AsFloat := 0;
      FieldByName('IMPORTE').OnSetText := ImporteSetText;
    end;

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

procedure TfrPagoProveedor.ActivarModoConsultar;
begin
  dsPago.AutoEdit := False;
  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Enabled := True;
  CodProveedor.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(msgProvNoExistePag, [CodigoPago]);
        CloseFrame;
        Exit;
      end;
      Cancel;
    end;

    dmTablaPagosProveedor.InicializarTablaPagosProveedores(@TablaPagos);

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

procedure TfrPagoProveedor.ActivarModoEliminar;
begin
  dsPago.AutoEdit := False;
  Codigo.Properties.Buttons[0].Visible := True;
  Codigo.Enabled := True;
  CodProveedor.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(msgProvNoExistePag, [CodigoPago]);
        CancelarEliminar;
        CloseFrame;
        Exit;
      end;
      Cancel;
    end;

    dmTablaPagosProveedor.InicializarTablaPagosProveedores(@TablaPagos);

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

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

  FDatosPago := TDatosPagoProveedor.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.CodigoProveedor := TablaPagos.FieldByName('CODIGOPROVEEDOR').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;

procedure TfrPagoProveedor.ActivarModoModificar;
begin
  dsPago.AutoEdit := True;
  Codigo.Properties.Buttons[0].Visible := False;
  Codigo.Enabled := False;
  CodProveedor.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(msgProvNoExistePag, [CodigoPago]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
      Edit;
      Post;
      Edit;
      FieldByName('IMPORTE').OnSetText := ImporteSetText;
    end;
    dmTablaPagosProveedor.InicializarTablaPagosProveedores(@TablaPagos);

{
    if (CTE_PAGO = TablaPagos.FieldByName('TIPOPAGO').AsString)
    then Entidad := entPagoProveedor
    else Entidad := entAbonoProveedor;
}
    //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(msgProvPagBloqueado, [CodigoPago]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrPagoProveedor.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;

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

      TablaPagos.Edit;
      TablaPagos.FieldByName('NUMENTRADA').AsString := FDatosPago.NumEntrada;
      TablaPagos.Post;
    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 TfrPagoProveedor.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 TfrPagoProveedor.SetCodigoPago(Value: Variant);
begin
  inherited;
  if not EsCadenaVacia(Value) then
  begin
    if (Modo <> Anadir) then begin
      if (CTE_PAGO = TablaPagos.FieldByName('TIPOPAGO').AsString)
      then Entidad := entPagoProveedor
      else Entidad := entAbonoProveedor;

      rellenarDatosPago;
    end;
  end;
end;

end.
