{
===============================================================================
  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.3
  Fecha versión actual: 02-02-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    21-04-2003    p1. Abonos de facturas de proveedor.
    25-08-2003    Al dar de alta una factura, el proveedor debe estar también
                  dado de alta.
    01-01-2004    Quitado el botón de la celda de código de contrato. No se
                  pueden meter los códigos a mano. Se eligen cuando se dá a
                  'Añadir contrato'. Si no es correcto, se elimina.
                  
    02-02-2004    Se ha eliminado el atributo SERIE (P8 MULTIEMPRESA)
                  Se ha adaptado a los nuevos contadores
===============================================================================
}

unit FacturaProveedor;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, RdxMemo, RdxComboBox, RdxFrame, RdxFrameFacturasProveedor,
  RdxCampos, RdxTitulos, RdxPaneles, RdxBotones, RdxBarras, Grids, DBGrids,
  RXDBCtrl, Db, ComCtrls, RdxPageControl, RxMemDS, cxMemo, cxDBEdit, cxDropDownEdit,
  cxCalendar, cxControls, cxContainer, cxEdit, cxTextEdit, cxMaskEdit,
  cxButtonEdit, AdvPanel, cxSpinEdit, cxLookupEdit, cxDBLookupEdit,
  cxDBLookupComboBox, IBCustomDataSet, Configuracion, DBCtrls, Entidades,
  cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDBData,
  cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, cxGrid, IBQuery,

  TablaTrimestres,

  RdxEmpresaActiva, cxDataStorage;

type
  TfrFacturaProveedor = class(TRdxFrameFacturasProveedor)
    pnlTitulo: TRdxPanelTituloOperacion;
    pnlCuerpo: TPanel;
    dsFactura: TDataSource;
    dsDetallesFacturas: TDataSource;
    brDoble: TRdxBarraInferior;
    bGuardar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    pnlPaginas: TRdxPanel;
    paginas: TRdxPagesControl;
    pagProveedor: TTabSheet;
    pagContenido: TTabSheet;
    pnlGridArticulos: TPanel;
    pnlBarraGrid: TRdxPanel;
    bAnadir: TRdxBoton;
    bEliminar: TRdxBoton;
    bEliminarTodo: TRdxBoton;
    pnlDatosFactura: TAdvPanel;
    eCodigoFactura: TLabel;
    eFechaVto: TLabel;
    eDescripcion: TLabel;
    eSituacion: TLabel;
    eFormaPago: TLabel;
    eFecha: TLabel;
    eNumFacProve: TLabel;
    Codigo: TcxDBButtonEdit;
    FechaVencimiento: TcxDBDateEdit;
    Observaciones: TcxDBMemo;
    FechaFactura: TcxDBDateEdit;
    Referencia: TcxDBTextEdit;
    cbxSituacion: TcxDBComboBox;
    cbxFormaPago: TcxDBComboBox;
    CodProveedor: TcxDBButtonEdit;
    NIFCIF: TcxDBTextEdit;
    Nombre: TcxDBTextEdit;
    Calle: TcxDBTextEdit;
    Provincia: TcxDBButtonEdit;
    Poblacion: TcxDBButtonEdit;
    Telefono1: TcxDBTextEdit;
    Movil1: TcxDBTextEdit;
    PersonaContacto: TcxDBTextEdit;
    Telefono2: TcxDBTextEdit;
    Movil2: TcxDBTextEdit;
    Piso: TcxDBTextEdit;
    Numero: TcxDBTextEdit;
    CodigoPostal: TcxDBTextEdit;
    Fax: TcxDBTextEdit;
    ePersona: TLabel;
    eMovil1: TLabel;
    eTelefono1: TLabel;
    ePoblacion: TLabel;
    eProvincia: TLabel;
    eDireccion: TLabel;
    eNombre: TLabel;
    eCodigo: TLabel;
    eNIFCIF: TLabel;
    eNumero: TLabel;
    eCodigoPostal: TLabel;
    eFax: TLabel;
    ePiso: TLabel;
    eTelefono2: TLabel;
    eMovil2: TLabel;
    Label1: TLabel;
    dsTiposFactura: TDataSource;
    TipoFactura: TcxDBLookupComboBox;
    pnlImportes: TAdvPanel;
    Panel1: TPanel;
    RdxPanel1: TRdxPanel;
    Label5: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Shape2: TShape;
    BasImp: TcxDBTextEdit;
    ImporteDescuento: TcxDBTextEdit;
    ImporteIVA: TcxDBTextEdit;
    ImporteTotal: TcxDBTextEdit;
    Panel2: TPanel;
    Label7: TLabel;
    Label8: TLabel;
    Label2: TLabel;
    Descuento: TcxDBTextEdit;
    IVA: TcxDBTextEdit;
    BaseImponible: TcxDBTextEdit;
    gridDetalles: TcxGrid;
    VistaDetalles: TcxGridDBTableView;
    VistaPropiedades2: TcxGridDBTableView;
    gridDetallesLevel1: TcxGridLevel;
    TablaDetallesMem: TRxMemoryData;
    TablaDetallesMemCodigoContrato: TStringField;
    TablaDetallesMemCodigoInstalador: TStringField;
    TablaDetallesMemNombre: TStringField;
    TablaDetallesMemImporte: TFloatField;
    dsContratos: TDataSource;
    TablaContratos: TIBQuery;
    TablaDetallesMemCODIGOEMPRESA: TIntegerField;
    eTrimestre: TLabel;
    cbxTrimestres: TcxComboBox;
    eTrimestreCerrado: TLabel;
    procedure bSalirClick(Sender: TObject);
    procedure bGuardarClick(Sender: TObject);
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure CodProveedorExit(Sender: TObject);
    procedure bAnadirClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bEliminarTodoClick(Sender: TObject);
    procedure CodigoExit(Sender: TObject);
    procedure FechaExit(Sender: TObject);
    procedure FechaVencimientoExit(Sender: TObject);
    procedure CodigoPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodProveedorPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure ProvinciaPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure PoblacionPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
  private
    FListaTrimestres: TListaTrimestres;
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FCodigoProveedor : Variant;
    FCodigoContrato : Variant;
    FTablaTiposFactura : TIBDataSet;
    procedure ActivarEventosCampos;
    procedure DesactivarEventosCampos;
    procedure CalcularTotalFactura;
    procedure BorrarDetalles;
    procedure SalvarDetalles;
    procedure CargarDetalles;
    procedure BorrarDetallesIB;
    procedure GridBotonCodigoContratoClick(Sender: TObject; AButtonIndex: Integer);
    procedure DetallesNewRecord(DataSet: TDataSet);
    procedure DetalleAfterDelete (DataSet: TDataSet);
    procedure IVASetText(Sender: TField; const Text: String);
    procedure BaseImponibleSetText(Sender: TField; const Text: String);
    procedure DtoSetText(Sender: TField; const Text: String);
    procedure ProvinciaSetText(Sender: TField; const Text: String);
    procedure CodigoContratoDetalleSetText(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 SetCodigoProvincia (Value : Variant); virtual;
    procedure SetCodigoPoblacion (Value : Variant); virtual;
    procedure SetCodigoProveedor (Value : Variant);
    procedure SetCodigoContrato (Value : Variant);
    procedure FreeContenido; override;
    procedure BuscarFactura; override;
    procedure VerModal; override;
  public
    property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
    property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;
    property CodigoProveedor : Variant read FCodigoProveedor write SetCodigoProveedor;
    property CodigoContrato : Variant read FCodigoContrato write SetCodigoContrato;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaFacturasProveedor;
    property TablaDetallesFacturas;
    property CodigoFactura;
    procedure GridBotonCodigoPedidoClick(Sender: TObject);
    procedure PrecioDetalleSetText(Sender: TField; const Text: String);
  end;

var
  frFacturaProveedor: TfrFacturaProveedor;

implementation

uses
  BaseDatos, TablaFacturasProveedor, IB, Mensajes, StrFunc, Variants,
  TablaFormasPago, NumFunc, RdxFramePoblaciones,
  FacturasProveedores, Proveedores, TablaProveedores, RdxFrameProvincias,
  RdxFrameProveedores, IBErrorCodes, Excepciones, Constantes, RdxFrameContratos,
  TablaProvincias, Provincias, Poblaciones, TablaPoblaciones,
  Literales, TablaContratos, ContratosClientes, TablaEmpresas;

{$R *.DFM}

{ TfrFacturaProveedor }

procedure TfrFacturaProveedor.ActivarModoAnadir;
var
  CodNuevo : Variant;
begin
  case Entidad of
    entFacturaProveedor : pnlDatosFactura.Caption.Text := 'Datos de la ' + CaptionsEntidades[entFacturaProveedor];
    entAbonoProveedor : pnlDatosFactura.Caption.Text := 'Datos del ' + CaptionsEntidades[entAbonoProveedor];
  end;

  dsFactura.AutoEdit := True;
  dsDetallesFacturas.AutoEdit := True;
  pnlBarraGrid.Visible := True;

  Codigo.Properties.Buttons[0].Visible := False;
  Codigo.Properties.ReadOnly := False;
  CodProveedor.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;
  Provincia.Properties.Buttons[0].Visible := True;
  cbxTrimestres.Enabled  := True;
  cbxTrimestres.Properties.ReadOnly := False;
  
  ActivarEdicionGridDetalles(gridDetalles);

  try
    CodNuevo := dmTablaFacturasProveedor.DarNuevoCodigo;

    with TablaFacturasProveedor do
    begin
      Close;
      Prepare;
      Open;
      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
      Insert;
      Codigo.DataBinding.Field.AsString := CodNuevo;
      FechaFactura.DataBinding.Field.AsString := DateToStr(Date);
      FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('FECHAVENCIMIENTO').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('USUARIO').AsString := dmBaseDatos.Usuario;
      FieldByName('IVA').AsString := CTE_IVA_DEFECTO;
      FieldByName('TIPOFACTURA').AsInteger := 0; // Compras por defecto
      cbxSituacion.DataBinding.Field.AsString := cbxSituacion.Properties.Items[0];
    end;

    with TablaDetallesFacturas do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Params.ByName('CODIGOFACTURA').AsString := CodNuevo;
      Prepare;
      Open;
    end;

    TablaContratos.Close;
    TablaContratos.Open;

    with TablaDetallesMem do
    begin
      Close;
      Open;
    end;

    dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
    dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);
    ActivarEventosCampos;
    Visible := True;
    FechaFactura.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.ActivarModoConsultar;
var
  liResultado: Integer;

begin
  dsFactura.AutoEdit := False;
  dsDetallesFacturas.AutoEdit := False;
  pnlBarraGrid.Visible := False;

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

  DesactivarEdicionGridDetalles(gridDetalles);

  try
    with TablaFacturasProveedor do
    begin
      Prepare;
      Open;

      liResultado := FListaTrimestres.getNumItem(FieldByName('CODIGOTRIMESTRE').AsString);
      if (liResultado = -1) then
      begin
        cbxTrimestres.EditText := dmTablaTrimestres.darDescripcionCompletaTrimestre(FieldByName('CODIGOTRIMESTRE').AsString);
        cbxTrimestres.Enabled  := False;
        cbxTrimestres.Properties.ReadOnly := True;
        eTrimestreCerrado.Visible := True;
      end
      else begin
        cbxTrimestres.ItemIndex := liResultado;
        cbxTrimestres.Enabled  := True;
        cbxTrimestres.Properties.ReadOnly := True;
        eTrimestreCerrado.Visible := False;
      end;

      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgProvNoExisteFacProv, [CodigoFactura]);
        CloseFrame;
        Exit;
      end;

      Cancel;
    end;

    with TablaDetallesFacturas do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Params.ByName('CODIGOFACTURA').AsString := CodigoFactura;
      Prepare;
      Open;
      Cancel;
    end;

    TablaContratos.Close;
    TablaContratos.Open;

    TablaDetallesMem.Close;
    TablaDetallesMem.Open;
    CargarDetalles;

    dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
    dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);
    Visible := True;
    FechaFactura.SetFocus;    
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.ActivarModoEliminar;
var
  liResultado: Integer;
begin
  dsFactura.AutoEdit := False;
  dsDetallesFacturas.AutoEdit := False;
  pnlBarraGrid.Visible := False;

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

  DesactivarEdicionGridDetalles(gridDetalles);

  try
    with TablaFacturasProveedor do
    begin
      Prepare;
      Open;

      liResultado := FListaTrimestres.getNumItem(FieldByName('CODIGOTRIMESTRE').AsString);
      if (liResultado = -1) then
      begin
        cbxTrimestres.EditText := dmTablaTrimestres.darDescripcionCompletaTrimestre(FieldByName('CODIGOTRIMESTRE').AsString);
        cbxTrimestres.Enabled  := False;
        cbxTrimestres.Properties.ReadOnly := True;
        eTrimestreCerrado.Visible := True;
      end
      else begin
        cbxTrimestres.ItemIndex := liResultado;
        cbxTrimestres.Enabled  := True;
        cbxTrimestres.Properties.ReadOnly := True;
        eTrimestreCerrado.Visible := False;
      end;

      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgProvNoExisteFacProv, [CodigoFactura]);
        CancelarEliminar;
        CloseFrame;
        Exit;
      end;

      Cancel;
    end;

    with TablaDetallesFacturas do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Params.ByName('CODIGOFACTURA').AsString := CodigoFactura;
      Prepare;
      Open;
      Cancel;
    end;

    TablaContratos.Close;
    TablaContratos.Open;

    TablaDetallesMem.Close;
    TablaDetallesMem.Open;
    CargarDetalles;

    dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
    dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);
    Visible := True;
    FechaFactura.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.ActivarModoModificar;
var
  liResultado: Integer;
begin
  dsFactura.AutoEdit := True;
  dsDetallesFacturas.AutoEdit := True;
  pnlBarraGrid.Visible := True;

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

  ActivarEdicionGridDetalles(gridDetalles);

  try
    { Antes de aplicar la caché hay que asegurarse de que la
      tabla está cerrada. }
    with TablaFacturasProveedor do
    begin
      Prepare;
      Open;

      liResultado := FListaTrimestres.getNumItem(FieldByName('CODIGOTRIMESTRE').AsString);
      if (liResultado = -1) then
      begin
        cbxTrimestres.EditText := dmTablaTrimestres.darDescripcionCompletaTrimestre(FieldByName('CODIGOTRIMESTRE').AsString);
        cbxTrimestres.Enabled  := False;
        cbxTrimestres.Properties.ReadOnly := True;
        eTrimestreCerrado.Visible := True;
      end
      else begin
        cbxTrimestres.ItemIndex := liResultado;
        cbxTrimestres.Enabled  := True;
        cbxTrimestres.Properties.ReadOnly := False;
        eTrimestreCerrado.Visible := False;
      end;

      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgProvNoExisteFacProv, [CodigoFactura]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
      Edit;
      Post;
      Edit;
    end;

    with TablaDetallesFacturas do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Params.ByName('CODIGOFACTURA').AsString := CodigoFactura;
      Prepare;
      Open;
    end;

    TablaContratos.Close;
    TablaContratos.Open;

    TablaDetallesMem.Close;
    TablaDetallesMem.Open;
    CargarDetalles;
    ActivarEventosCampos;

    dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
    dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);

    CalcularTotalFactura;
    ActivarEventosCampos;
    Visible := True;
    FechaFactura.SetFocus;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgProvFacProvBloqueada, [CodigoFactura]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrFacturaProveedor.AnadirDatos: Boolean;
begin
  Result := False;
  try
    CalcularTotalFactura;
    case Entidad of
      entFacturaProveedor : TablaFacturasProveedor.FieldByName('CLASEFACTURA').AsString := CTE_CF_FACTURA;
      entAbonoProveedor : TablaFacturasProveedor.FieldByName('CLASEFACTURA').AsString := CTE_CF_ABONO;
    end;
    TablaFacturasProveedor.FieldByName('CODIGOTRIMESTRE').AsString := FListaTrimestres.getCodItem(cbxTrimestres.ItemIndex);
    TablaFacturasProveedor.Post;

    BorrarDetallesIB;
    SalvarDetalles;

    dmTablaFacturasProveedor.IncrementarCodigo;

    Commit;
    FCodigoFactura := TablaFacturasProveedor.FieldByName('CODIGO').AsString;

    TablaFacturasProveedor.Close;
    TablaDetallesFacturas.Close;
    TablaDetallesMem.Close;
    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        VerMensajeFmt(msgProvCodFacRepetido, [Codigo.DataBinding.Field.AsString]);
        TablaFacturasProveedor.Edit;
      end
      else
        TratarExcepcion(E);
      TablaFacturasProveedor.Edit;
    end;
    on E : Exception do begin
      TratarExcepcion(E);
      TablaFacturasProveedor.Edit;
    end;
  end;
end;

procedure TfrFacturaProveedor.BuscarFactura;
begin
  if Transaccion = NIL then
    exit;
  try
    TablaFacturasProveedor.DisableControls;
    TablaDetallesFacturas.DisableControls;
    TablaDetallesMem.DisableControls;

    DesactivarEventosCampos;
    
    TablaFacturasProveedor.Close;
    TablaDetallesFacturas.Close;
    FTablaTiposFactura.Close;
    TablaContratos.Close;


    // Buscar la fila a tratar si es necesario
    if not EsCadenaVacia(FCodigoFactura) then
    begin
      TablaFacturasProveedor.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      TablaFacturasProveedor.ParamByName('CODIGO').AsString := FCodigoFactura;
      TablaDetallesFacturas.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      TablaDetallesFacturas.ParamByName('CODIGOFACTURA').AsString := FCodigoFactura;
    end;
    TablaFacturasProveedor.Prepare;
    TablaFacturasProveedor.Open;

    TablaContratos.Open;

    with FTablaTiposFactura do
    begin
      Close;
      Prepare;
      Open;
    end;

    TablaDetallesFacturas.Prepare;
    TablaDetallesFacturas.Open;

    TablaDetallesMem.Close;
    TablaDetallesMem.Open;

    BorrarDetalles;
    CargarDetalles;

    dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
    dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);

    if not EsCadenaVacia(FCodigoFactura) then
    begin
      if UpperCase(TablaFacturasProveedor.FieldByName('CLASEFACTURA').AsString) = CTE_CF_FACTURA then
      begin
        pnlDatosFactura.Caption.Text := 'Datos de la ' + CaptionsEntidades[entFacturaProveedor];
        Entidad := entFacturaProveedor;
      end
      else begin
        pnlDatosFactura.Caption.Text := 'Datos del ' + CaptionsEntidades[entAbonoProveedor];
        Entidad := entAbonoProveedor;
      end;
    end;

    ActivarEventosCampos;

    TablaFacturasProveedor.EnableControls;
    TablaDetallesFacturas.EnableControls;
    TablaDetallesMem.EnableControls;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.CalcularTotalFactura;
var
  ImporteBaseImponible,
  ImporteDto,
  ImporteIVA,
  ImporteTotal : Double;
begin
  with TablaFacturasProveedor do
  begin
    ImporteBaseImponible := FieldByName('BASEIMPONIBLE').AsFloat;
    ImporteDto := (ImporteBaseImponible * FieldByName('DESCUENTO').AsFloat) / 100;
    ImporteTotal := ImporteBaseImponible - ImporteDto;
    ImporteIVA := (ImporteTotal * FieldByName('IVA').AsFloat) / 100;
    ImporteTotal := ImporteTotal + ImporteIVA;
    Edit;
    FieldByName('IMPORTEDESCUENTO').AsFloat := ImporteDto;
    FieldByName('IMPORTEIVA').AsFloat := ImporteIVA;
    FieldByName('IMPORTETOTAL').AsFloat := ImporteTotal;
  end;
end;

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

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

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

function TfrFacturaProveedor.ComprobarDatos: Boolean;
var
  Situacion : string;
  CodPedAux : string;
  CodProvPed : string;
begin
  Result := False;

  if not (Modo in [Anadir, Modificar]) then
  begin
    Result := True;
    exit;
  end;

  if EsCadenaVacia(TipoFactura.DataBinding.Field.AsString) then
  begin
    VerMensaje(msgProvFaltaTipoFac);
    TipoFactura.SetFocus;
    Exit;
  end;

  if EsCadenaVacia(FechaFactura.DataBinding.Field.AsString) then
  begin
    VerMensaje(msgProvFaltaFechaAltaFac);
    FechaFactura.SetFocus;
    Exit;
  end;

  if EsCadenaVacia(FechaVencimiento.DataBinding.Field.AsString) then
  begin
    VerMensaje(msgProvFaltaFechaVtoFac);
    FechaVencimiento.SetFocus;
    Exit;
  end
  else
    if (FechaVencimiento.DataBinding.Field.AsDateTime < FechaFactura.DataBinding.Field.AsDateTime) then
    begin
      VerMensaje(msgProvFechaVtoAnteriorFac);
      FechaVencimiento.SetFocus;
      Exit;
    end;

  if Modo = Anadir then
  begin
    if EsCadenaVacia(CodProveedor.DataBinding.Field.AsString) then
    begin
      VerMensaje(msgProvFaltaCodProv);
      Paginas.ActivePageIndex := 0;
      CodProveedor.SetFocus;
      Exit;
    end
  end
  else
  begin
    if EsCadenaVacia(Nombre.DataBinding.Field.AsString) then
    begin
      VerMensaje(msgProvFaltaNombreProvFac);
      Paginas.ActivePage := pagProveedor;
      Nombre.SetFocus;
      Exit;
    end;
  end;
  Result := True;
end;

constructor TfrFacturaProveedor.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Entidad := entFacturaProveedor;

  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;
  FCodigoProveedor := NULL;
  FCodigoContrato := NULL;

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaFacturasProveedor := TIBDataSet.Create(Self);
  TablaDetallesFacturas := TIBDataSet.Create(Self);
  FTablaTiposFactura := TIBDataSet.Create(Self);

  dsFactura.DataSet := TablaFacturasProveedor;
  dsTiposFactura.DataSet := FTablaTiposFactura;
  dsDetallesFacturas.DataSet := TablaDetallesMem;

  with TablaFacturasProveedor do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaFacturasProveedor.sqlConsultarFactura);
    InsertSQL.Assign(dmTablaFacturasProveedor.sqlInsertarFactura);
    ModifySQL.Assign(dmTablaFacturasProveedor.sqlModificarFactura);
    DeleteSQL.Assign(dmTablaFacturasProveedor.sqlEliminarFactura);
  end;

  with FTablaTiposFactura do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaFacturasProveedor.sqlConsultarTiposFactura);
  end;

  with TablaDetallesFacturas do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaFacturasProveedor.sqlConsultarGridDetalles);
    InsertSQL.Assign(dmTablaFacturasProveedor.sqlInsertarDetalles);
    ModifySQL.Assign(dmTablaFacturasProveedor.sqlModificarDetalles);
    DeleteSQL.Assign(dmTablaFacturasProveedor.sqlEliminarDetalles);
  end;

  with TablaContratos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
  end;

  {TablaDetallesMem.CopyStructure(TablaDetallesFacturas);
  TablaDetallesMem.FieldByName('CODIGOFACTURA').Required := False;
  TablaDetallesMem.FieldByName('CODIGOCONTRATO').Required := False;}

  FListaTrimestres := TListaTrimestres.Create(tlcTriAbiertos);
  cbxTrimestres.ItemIndex := FListaTrimestres.cargarLista(cbxTrimestres.Properties.Items);

  dmTablaFacturasProveedor.InicializarGridDetalles(VistaDetalles);
  cbxFormaPago.Properties.Items := dmTablaFormasPago.DarFormasPago;
  cbxSituacion.Properties.Items := dmTablaFacturasProveedor.DarSituaciones;
  Paginas.ActivePage := pagProveedor;
end;

destructor TfrFacturaProveedor.Destroy;
begin
  VistaDetalles.DataController.DataSource := NIL;

  TablaContratos.Close;

  TablaDetallesMem.Close;

  TablaFacturasProveedor.Close;
  TablaFacturasProveedor.UnPrepare;
  TablaFacturasProveedor.Free;

  TablaDetallesFacturas.Close;
  TablaDetallesFacturas.UnPrepare;
  TablaDetallesFacturas.Free;

  FTablaTiposFactura.Close;
  FTablaTiposFactura.UnPrepare;
  FTablaTiposFactura.Free;

  FListaTrimestres.Free;
  FListaTrimestres := Nil;

  inherited;
end;

function TfrFacturaProveedor.EliminarDatos: Boolean;
begin
  Result := False;
  try
    TablaFacturasProveedor.Delete;
    Commit;

    TablaFacturasProveedor.Close;
    TablaDetallesFacturas.Close;
    TablaDetallesMem.Close;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgProvFacProvBloqueada, [Codigo.DataBinding.Field.AsString]);
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameFacturasProveedor) then begin
    CodigoFactura := (ContenidoModal as TRdxFrameFacturasProveedor).CodigoFactura;
    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;
  if (ContenidoModal is TRdxFrameProveedores) then
    CodigoProveedor := (ContenidoModal as TRdxFrameProveedores).CodigoProveedor;

  if (ContenidoModal is TRdxFrameContratos) then
    CodigoContrato := (ContenidoModal as TRdxFrameContratos).CodigoContrato;

  inherited FreeContenido;
end;

procedure TfrFacturaProveedor.GridBotonCodigoPedidoClick(Sender: TObject);
begin
{  if EsCadenaVacia(CodProveedor.DataBinding.Field.AsString) then
  begin
    VerMensaje(msgProvFaltaNombreProvFac);
    paginas.ActivePage := pagProveedor;
    CodProveedor.SetFocus;
    Exit;
  end;
  TablaDetallesMem.Edit;
  ModoModal := Facturar;
  ContenidoModal := TfrPedidosProveedores.Create(Self);}
end;

function TfrFacturaProveedor.ModificarDatos: Boolean;
begin
  Result := False;
  try
    if (cbxTrimestres.Enabled) then
      TablaFacturasProveedor.FieldByName('CODIGOTRIMESTRE').AsString := FListaTrimestres.getCodItem(cbxTrimestres.ItemIndex);
    CalcularTotalFactura;
    TablaFacturasProveedor.Post;
    BorrarDetallesIB;
    SalvarDetalles;
    Commit;

    TablaFacturasProveedor.Close;
    TablaDetallesFacturas.Close;
    TablaDetallesMem.Close;

    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.PrecioDetalleSetText(Sender: TField;
  const Text: String);
begin
  try
    if Length(Text) = 0 then
      Sender.AsString := '0'
    else
      Sender.AsString := Text;
    CalcularTotalFactura;
  except
    on E : EConvertError do
      VerMensaje(msgProvPrecioNoValido);
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.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;
    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;
    PersonaContacto.DataBinding.Field.AsString := DatosProveedor.PersonaContacto;
    CalcularTotalFactura;
  finally
    DatosProveedor.Free;
  end;
end;

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

procedure TfrFacturaProveedor.bGuardarClick(Sender: TObject);
begin
  if (RealizarOperacion) then
    CloseFrame;
end;

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

procedure TfrFacturaProveedor.SetCodigoContrato(Value: Variant);
var
  CodigoAux : String;
  FDetallesBookmark : string;
begin
  if (EsCadenaVacia(Value)) then
  begin
    FCodigoContrato := CodigoAux;
    Exit;
  end;

  CodigoAux := Trim(Value);
  if (dmTablaContratos.ValidarCodigo(CodigoAux)) then
  begin
    CodigoAux := dmTablaContratos.FormatearCodigo(CodigoAux);
    if not (dmTablaContratos.ExisteCodigo(CodigoAux)) then
      raise Exception.CreateFmt(msgCliCodConNoExiste, [CodigoAux]);
  end
  else begin
    raise Exception.CreateFmt(msgCliCodConIncorrecto, [CodigoAux]);
    Exit;
  end;

  // Hay que comprobar si el contrato elegido ya está en la lista.
  with TablaDetallesMem do
  begin
    Edit;
    FieldByName('CODIGOCONTRATO').AsString := '-';
    Post;
    FDetallesBookmark := Bookmark;
    DisableControls;
    First;
    while not EOF do begin
      if FieldByName('CODIGOCONTRATO').AsString = CodigoAux then
      begin
        EnableControls;
        Bookmark := FDetallesBookmark;
        Delete;
        VerMensajeFmt(msgProvContratoRepetido, [CodigoAux]);
        Exit;
      end
      else
        Next;
    end;
    EnableControls;
    Bookmark := FDetallesBookmark;
  end;

  FCodigoContrato := CodigoAux;

  with TablaDetallesMem do
  begin
    Edit;
    FieldByName('CODIGOCONTRATO').AsString := FCodigoContrato;
  end;
end;

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

  if (Length(CodProveedor.Text) = 0) 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]);
      Paginas.ActivePage := pagProveedor;
      CodProveedor.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgProvCodProvIncorrecto, [CodProveedor.Text]);
    Paginas.ActivePage := pagProveedor;
    CodProveedor.SetFocus;
  end;
end;

procedure TfrFacturaProveedor.bAnadirClick(Sender: TObject);
begin
  try
    with TablaDetallesMem do
    begin
      DisableControls;
      Next;
      if EOF then
        Append
      else begin
        Prior;
        Insert;
      end;
      EnableControls;
      GridBotonCodigoContratoClick(Self, 0);
    end;
    Paginas.ActivePage := pagContenido;
    gridDetalles.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.bEliminarClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then
    Exit;
  if TablaDetallesMem.RecordCount = 0 then begin
    { Hacemos un cancel de la tabla por si el registro actual estuviera
      recien creado }
    TablaDetallesMem.Cancel;
    Exit
  end;
  try
    TablaDetallesMem.Delete;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrFacturaProveedor.BorrarDetalles;
begin
 with TablaDetallesMem do
  begin
    DisableControls;
    EmptyTable;
    EnableControls;
  end;
end;

procedure TfrFacturaProveedor.CodigoExit(Sender: TObject);
begin
  if (Modo <> Anadir) or (Visible = false) then
    Exit;

  if not EsCadenaVacia(Codigo.Text) then
  begin
    if (dmTablaFacturasProveedor.validarCodigo(Codigo.Text)) then
    begin
      Codigo.DataBinding.Field.AsString := dmTablaFacturasProveedor.FormatearCodigo(Codigo.Text);
      if (dmTablaFacturasProveedor.ExisteCodigo(Codigo.Text)) then begin
        VerMensajeFmt(msgProvCodFacRepetido, [Codigo.Text]);
        Codigo.SetFocus;
      end;
    end
    else begin
      VerMensajeFmt(msgProvCodFacIncorrecto, [Codigo.Text]);
      Codigo.SetFocus;
    end
  end
  else
    Codigo.DataBinding.Field.AsString := dmTablaFacturasProveedor.darNuevoCodigo;
end;

procedure TfrFacturaProveedor.FechaExit(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    exit;
  if EsCadenaVacia(FechaFactura.Text) then
  begin
    VerMensaje(msgProvFaltaFechaAltaFac);
    FechaFactura.DataBinding.Field.AsString := DateToStr(Date);
    FechaFactura.SetFocus;
  end;
end;

procedure TfrFacturaProveedor.FechaVencimientoExit(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    exit;
  if EsCadenaVacia(FechaVencimiento.Text) then
  begin
    VerMensaje(msgProvFaltaFechaVtoFac);
    FechaVencimiento.SetFocus;
  end;
end;

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

procedure TfrFacturaProveedor.BorrarDetallesIB;
var
  CodPedAux : string;
begin
  with TablaDetallesFacturas do
  begin
    if IsEmpty then
      Exit;
    DisableControls;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
    EnableControls;
  end;
end;

procedure TfrFacturaProveedor.CargarDetalles;
begin
  with TablaDetallesMem do
  begin
    if TablaDetallesFacturas.IsEmpty then
      Exit;
    DisableControls;
    TablaDetallesFacturas.First;
    while not TablaDetallesFacturas.EOF do
    begin
      Append;
      FieldByName('CODIGOEMPRESA').AsInteger := TablaDetallesFacturas.FieldByName('CODIGOEMPRESA').AsInteger;
      FieldByName('CODIGOFACTURA').AsString := TablaDetallesFacturas.FieldByName('CODIGOFACTURA').AsString;
      FieldByName('CODIGOCONTRATO').AsString := TablaDetallesFacturas.FieldByName('CODIGOCONTRATO').AsString;
      FieldByName('IMPORTE').AsFloat := TablaDetallesFacturas.FieldByName('IMPORTE').AsFloat;
      Post;
      TablaDetallesFacturas.Next;
    end;
    EnableControls;
  end;
end;

procedure TfrFacturaProveedor.SalvarDetalles;
begin
  try
    with TablaDetallesMem do
    begin
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      while not EOF do
      begin
        TablaDetallesFacturas.Append;
        TablaDetallesFacturas.FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
        TablaDetallesFacturas.FieldByName('CODIGOFACTURA').AsString := Codigo.DataBinding.Field.AsString;
        TablaDetallesFacturas.FieldByName('CODIGOCONTRATO').AsString := FieldByName('CODIGOCONTRATO').AsString;
        TablaDetallesFacturas.FieldByName('IMPORTE').AsFloat := FieldByName('IMPORTE').AsFloat;
        TablaDetallesFacturas.Post;
        Next;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        TablaDetallesFacturas.Delete;
        TablaDetallesMem.EnableControls;
        raise Exception.CreateFmt(msgCodPedRepetido, [TablaDetallesMem.FieldByName('CODIGOPEDIDO').AsString]);
      end
      else
        raise EIBError.Create(E.SQLCode, E.IBErrorCode, E.Message);
    end;
  end;
end;

procedure TfrFacturaProveedor.VerModal;
begin
  if (ContenidoModal is TRdxFrameProveedores) then
    (ContenidoModal as TRdxFrameProveedores).CodigoProveedor := CodigoProveedor;

  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia;
  inherited;
end;

procedure TfrFacturaProveedor.ActivarEventosCampos;
begin
  with TablaFacturasProveedor do
  begin
    FieldByName('IVA').OnSetText := IVASetText;
    FieldByName('DESCUENTO').OnSetText := DtoSetText;
    FieldByName('BASEIMPONIBLE').OnSetText := BaseImponibleSetText;
  end;

  with TablaDetallesMem do
  begin
    FieldByName('CODIGOCONTRATO').OnSetText := CodigoContratoDetalleSetText;
    OnNewRecord := DetallesNewRecord;
  end;

  {with VistaDetalles do
  begin
    TcxButtonEditProperties(GetColumnByFieldName('CODIGOCONTRATO').Properties).OnButtonClick := GridBotonCodigoContratoClick;
  end;}
end;

procedure TfrFacturaProveedor.DetalleAfterDelete(DataSet: TDataSet);
begin
  CalcularTotalFactura;
end;

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

procedure TfrFacturaProveedor.IVASetText(Sender: TField;
  const Text: String);
begin
  if EsCadenaVacia(Text) then
    Sender.AsString := '0'
  else begin
    ValidarIVA(Text);
    Sender.AsString := Text;
  end;
  CalcularTotalFactura;
end;

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

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

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

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

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

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

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

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

  if Entidad = entAbonoProveedor then
  begin
    try
      if StrToFloat(Text) > 0
      then begin
        VerMensaje (msgImporteNegativo);
        Sender.AsFloat := (-1) * StrToFloat(Text)
      end
      else Sender.AsString := Text;
    except
      on E : EConvertError do begin
        Sender.AsString := '0'
      end;
    end;
  end
  else
    Sender.AsString := Text;
  CalcularTotalFactura;
end;


procedure TfrFacturaProveedor.DetallesNewRecord(DataSet: TDataSet);
begin
  DataSet.FieldByName('CODIGOFACTURA').AsString := Codigo.DataBinding.Field.AsString;
end;

procedure TfrFacturaProveedor.DesactivarEventosCampos;
begin
  with TablaFacturasProveedor do
  begin
    if FindField('IVA') <> NIL then
      FieldByName('IVA').OnSetText := NIL;
    if FindField('DESCUENTO') <> NIL then
      FieldByName('DESCUENTO').OnSetText := NIL;
    if FindField('BASEIMPONIBLE') <> NIL then
      FieldByName('BASEIMPONIBLE').OnSetText := NIL;
  end;

  with TablaDetallesMem do
  begin
    if FindField('CODIGOCONTRATO') <> NIL then
      FieldByName('CODIGOCONTRATO').OnSetText := NIL;
    AfterInsert := NIL;
  end;
end;

procedure TfrFacturaProveedor.CodigoContratoDetalleSetText(Sender: TField;
  const Text: String);
begin
  CodigoContrato := Text;
end;

procedure TfrFacturaProveedor.GridBotonCodigoContratoClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  TablaDetallesMem.Edit;
  ContenidoModal := TfrContratosClientes.Create(Self);
  gridDetalles.SetFocus;
end;

end.
