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

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    02-02-2004    Se ha eliminado el atributo SERIE (P8 MULTIEMPRESA)
                  Se ha adaptado a los nuevos contadores

    31-05-2007    Se cambia sentencia sqlConsultarGridFacturasProvContrato para que en el beneficio por contrato salgan las facturas
                  de proveedor de todas las empresas (A y B) así podré calcular el beneficio en general
                  teniendo en cuenta facturación en A y en B

===============================================================================
}

unit TablaFacturasProveedor;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares
  IBCustomDataSet, cxGrid, cxGridCustomTableView, cxCurrencyEdit,

  //Aplicacion
  Framework, StrFunc, Entidades, Constantes, BaseDatos, RdxEmpresaActiva,

  //Contador
  Contadores, RdxGestorContadores;

type
  TTipoFacturaProveedor = (tipTodas, tipGeneral, tipInmovilizado);

  TDatosFacturaProveedor = class(TObjeto)
  private
    //
  protected
    procedure ObtenerDatos; override;
    procedure AssignTo(Dest: TPersistent); override;
  public
    Codigo : String;
    Referencia : String;
    FechaAlta : TDateTime;
    Usuario : String;
    FechaFactura : TDateTime;
    FechaVencimiento : TDateTime;
    Situacion : String;
    Observaciones : String;
    CodigoProveedor : String;
    NIFCIF : String;
    Nombre : String;
    Calle : String;
    Numero : String;
    Piso : String;
    CodigoPostal : String;
    Poblacion : String;
    Provincia : String;
    Telefono1 : String;
    Telefono2 : String;
    Movil1 : String;
    Movil2 : String;
    Fax : String;
    PersonaContacto : String;
    FormaPago : String;
    BaseImponible : double;
    Descuento : integer;
    ImporteDescuento : double;
    Iva : integer;
    ImporteIva : double;
    ImporteTotal : double;
    TipoFactura : String;
    ClaseFactura : String;
    CodigoTrimestre : String;
    constructor Create(CodigoFactura : String); overload;
    constructor Create; overload; override;
    destructor Destroy; override;
  end;

  TListaFacturasProveedor = class(TListaObjetos)
  private
    FSQL : String;
    function GetFactura(Index: Integer): TDatosFacturaProveedor;
  protected
    procedure AssignTo(Dest: TPersistent); override;
    procedure ObtenerLista; override;
  public
    constructor Create(oSQL : String); overload;
    constructor Create; overload; override;
    property Items[Index: Integer] : TDatosFacturaProveedor read GetFactura;
  end;

/////////////////////////////////////////////////////////////////////////////////

  TdmTablaFacturasProveedor = class(TComponent)
  private
    procedure IniciarSQLFactura;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
  public
    sqlInsertarFactura : TStrings;
    sqlModificarFactura : TStrings;
    sqlConsultarFactura : TStrings;
    sqlEliminarFactura : TStrings;
    sqlConsultarGridFacturas : TStrings;
    sqlConsultarGridFacturasProv : TStrings;
    sqlConsultarTiposFactura : TStrings;
    sqlConsultarGridFacturasTrimestre : TStrings;
    sqlConsultarGridFacturasProvContrato : TStrings;

    sqlInsertarDetalles : TStrings;
    sqlModificarDetalles : TStrings;
    sqlConsultarDetalles : TStrings;
    sqlEliminarDetalles : TStrings;
    sqlConsultarGridDetalles : TStrings;

    //Metodos que llamaran a contador
    function DarNuevoCodigo : String;
    function IncrementarCodigo : boolean;
    function InsertarContador : boolean;
    function ValidarCodigo(Codigo : String) : Boolean;
    function FormatearCodigo(Codigo : String) : String;

    function ExisteFacturaConContrato(CodigoContrato : String) : Boolean;

    function FormatearNumConcepto(NumConcepto : String) : String;
    function ExisteCodigo(Codigo : String) : Boolean;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure InicializarGridDetalles(var Grid: TcxGridDBTableView);
    procedure InicializarGridFacturas(var Grid: TcxGrid);
    procedure InicializarGridFacturasPendientes(var Grid: TcxGrid);
    procedure InicializarGridFacturasTrimestre(var Grid: TcxGrid);
    procedure InicializarGridFacturasProvContrato(var Grid: TcxGrid);
    procedure InicializarTablaFacturas(Tabla: TPTabla);
    procedure InicializarTablaDetalles(Tabla: TPTabla);
    function DarSituaciones : TStrings;
    function ModificarSituacionFactura(Codigo, Situacion, FormaPago : String): Boolean;

    //Trimestres
    function DarIvas : TStrings;
    function DarTiposOp : TStrings;
    function DarTiposOpDes : TStrings;
    function DarTiposOpDesTrimestral(var ListaCodigos: TStrings): TStrings;
    function ComprobarTrimestreFactura(CodigoFactura: String): Boolean;
    function AsignarTrimestre(CodigoFactura: String; CodigoTrimestre: String): Boolean;
    function ModificarSituacionFacturas(Codigos: TStrings; Situacion: String): Boolean;
  end;

var
  dmTablaFacturasProveedor: TdmTablaFacturasProveedor;

implementation

uses
  Literales, TablaEmpresas;

{ TdmTablaFacturasProveedor }

constructor TdmTablaFacturasProveedor.Create(AOwner: TComponent);
begin
  inherited;
  { Cabecera }
  sqlInsertarFactura := TStringList.Create;
  sqlModificarFactura := TStringList.Create;
  sqlConsultarFactura := TStringList.Create;
  sqlEliminarFactura := TStringList.Create;

  { Detalles }
  sqlInsertarDetalles := TStringList.Create;
  sqlModificarDetalles := TStringList.Create;
  sqlConsultarDetalles := TStringList.Create;
  sqlEliminarDetalles := TStringList.Create;

  { Grids }
  sqlConsultarGridFacturas := TStringList.Create;
  sqlConsultarGridFacturasProv := TStringList.Create;
  sqlConsultarGridDetalles := TStringList.Create;
  sqlConsultarTiposFactura := TStringList.Create;
  sqlConsultarGridFacturasTrimestre := TStringList.Create;
  sqlConsultarGridFacturasProvContrato := TStringList.Create;

  IniciarSQLFactura;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

destructor TdmTablaFacturasProveedor.Destroy;
begin
  { Cabecera }
  sqlInsertarFactura.Free;
  sqlModificarFactura.Free;
  sqlConsultarFactura.Free;
  sqlEliminarFactura.Free;

  { Detalles }
  sqlInsertarDetalles.Free;
  sqlModificarDetalles.Free;
  sqlConsultarDetalles.Free;
  sqlEliminarDetalles.Free;

  { Grids }
  sqlConsultarGridFacturas.Free;
  sqlConsultarGridFacturasProv.Free;
  sqlConsultarGridDetalles.Free;
  sqlConsultarTiposFactura.Free;
  sqlConsultarGridFacturasTrimestre.Free;
  sqlConsultarGridFacturasProvContrato.Free;
  inherited;
end;

function TdmTablaFacturasProveedor.DarNuevoCodigo: String;
begin
  Result := GestorContadores.darNuevoCodigo(contFacturasProveedor);
end;

function TdmTablaFacturasProveedor.DarSituaciones: TStrings;
var
  Lista : TStringList;
begin
  Result := NIL;
  Lista := TStringList.Create;
  with Lista do
  begin
    Clear;
    Append('PENDIENTE');
    Append('PAGADA');
  end;
  Result := Lista;
end;

function TdmTablaFacturasProveedor.ExisteCodigo(Codigo: String): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from FACTURASPROVEEDOR ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGO = :CODIGO');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      Contador := Fields[0].AsString;
      Result := (Codigo = Contador);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.FormatearCodigo(Codigo: String): String;
begin
  Result := GestorContadores.FormatearCodigo(contFacturasProveedor, Codigo);
end;

function TdmTablaFacturasProveedor.FormatearNumConcepto(
  NumConcepto: String): String;
var
  Concepto : Integer;
begin
  Concepto := StrToInt(NumConcepto);
  Result := format('%.10d', [Concepto]);
end;

function TdmTablaFacturasProveedor.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contFacturasProveedor);
end;

procedure TdmTablaFacturasProveedor.InicializarGridDetalles(var Grid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with Grid do
  begin
    OptionsView.Footer := True;
    {Columna CODIGOEMPRESA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOEMPRESA';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    {Columna CODIGOFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOFACTURA';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    {Columna CODIGOCONTRATO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCONTRATO';
    Columna.Caption := 'Cód. contrato';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.Options.Editing := False;
    {Columna.PropertiesClassName := 'TcxButtonEditProperties';
    with TcxButtonEditProperties(Columna.Properties) do
    begin
      Buttons[0].Kind := bkEllipsis;
    end;}

    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.Options.Editing := False;

    {Columna IMPORTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTE';
    Columna.Caption := 'Importe';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarGridFacturas(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 facturas';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
    {Columna FECHAFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAFACTURA';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;
    {Columna CLASEFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CLASEFACTURA';
    Columna.Caption := 'Clase factura';
    Columna.Options.Filtering := False;
    Columna.Visible := False;
    {Columna REFERENCIA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'REFERENCIA';
    Columna.Caption := 'Nº factura';
    Columna.Options.Filtering := False;
    Columna.Width := tamColCodigo;
    {Columna CODIGOPROVEEDOR}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOPROVEEDOR';
    Columna.Caption := 'Cód. proveedor';
    Columna.Options.Filtering := False;
    Columna.Width := tamColCodigo;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Options.Filtering := False;
    Columna.Width := tamColNIFCIF;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Options.Filtering := False;
    Columna.Width := tamColNombre;
    {Columna DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Tipo factura';
    Columna.Options.Filtering := False;
    Columna.Width := tamColNombre;
    {Columna SITUACION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'SITUACION';
    Columna.Caption := 'Situación';
    Columna.Options.Filtering := False;
    Columna.Width := tamColSituacion;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe';
    Columna.Options.Filtering := False;
    Columna.Width := tamColImporte;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarTablaDetalles(
  Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('IMPORTE') <> NIL then
      with (FieldByName('IMPORTE') as TFloatField) do begin
        DisplayFormat := DISPLAY_EUROS4;
        EditFormat := EDIT_EUROS4;
      end;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarTablaFacturas(Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('FECHAALTA') <> NIL then
      with (FieldByName('FECHAALTA') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;

    if FindField('FECHAFACTURA') <> NIL then
      with (FieldByName('FECHAFACTURA') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;

    if FindField('FECHAVENCIMIENTO') <> NIL then
      with (FieldByName('FECHAVENCIMIENTO') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;

    if FindField('BASEIMPONIBLE') <> NIL then
      with (FieldByName('BASEIMPONIBLE') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('DESCUENTO') <> NIL then
      with (FieldByName('DESCUENTO') as TFloatField) do begin
        DisplayFormat := DISPLAY_DTO;
        EditFormat := EDIT_DTO;
      end;

    if FindField('IMPORTEDESCUENTO') <> NIL then
      with (FieldByName('IMPORTEDESCUENTO') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('IVA') <> NIL then
      with (FieldByName('IVA') as TFloatField) do begin
        DisplayFormat := DISPLAY_IVA;
        EditFormat := EDIT_IVA;
      end;

    if FindField('IMPORTEIVA') <> NIL then
      with (FieldByName('IMPORTEIVA') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('IMPORTETOTAL') <> NIL then
      with (FieldByName('IMPORTETOTAL') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
        DisplayLabel := 'Importe total';
      end;

    if FindField('IMPORTE') <> NIL then
      with (FieldByName('IMPORTE') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
        DisplayLabel := 'Importe';
      end;
  end;
end;

procedure TdmTablaFacturasProveedor.IniciarSQLDetalles;
begin
  with sqlInsertarDetalles do
  begin
    Add('insert into DETALLESFACTURASPROVCONTRATOS ');
    Add('(CODIGOEMPRESA, CODIGOFACTURA, CODIGOCONTRATO, IMPORTE) values ');
    Add('(:CODIGOEMPRESA, :CODIGOFACTURA, :CODIGOCONTRATO, :IMPORTE)');
  end;

  with sqlModificarDetalles do
  begin
    Add('update DETALLESFACTURASPROVCONTRATOS set ');
    Add('IMPORTE = :IMPORTE ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('and (CODIGOFACTURA = :CODIGOFACTURA)');
    Add('and (CODIGOCONTRATO = :CODIGOCONTRATO)');
  end;

  with sqlEliminarDetalles do
  begin
    Add('delete from DETALLESFACTURASPROVCONTRATOS ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add(' and (CODIGOFACTURA = :CODIGOFACTURA)');
    Add(' and (CODIGOCONTRATO = :CODIGOCONTRATO)');
  end;

  with sqlConsultarDetalles do
  begin
    Add('select CODIGOFACTURA, CODIGOCONTRATO, IMPORTE ');
    Add('from DETALLESFACTURASPROVCONTRATOS ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add(' and (CODIGOFACTURA = :CODIGOFACTURA)');
    Add(' and (CODIGOCONTRATO = :CODIGOCONTRATO)');
  end;
end;

procedure TdmTablaFacturasProveedor.IniciarSQLFactura;
begin
  with sqlInsertarFactura do
  begin
    Add('insert into FACTURASPROVEEDOR ');
    Add('(CODIGOEMPRESA, CODIGO, CLASEFACTURA, REFERENCIA, FECHAALTA, FECHAFACTURA, FECHAVENCIMIENTO, ');
    Add('SITUACION, USUARIO, OBSERVACIONES, CODIGOPROVEEDOR, ');
    Add('NIFCIF, NOMBRE, CALLE, NUMERO, PISO, CODIGOPOSTAL, ');
    Add('POBLACION, PROVINCIA, TELEFONO1,  TELEFONO2, MOVIL1, MOVIL2, ');
    Add('FAX, PERSONACONTACTO, FORMAPAGO, BASEIMPONIBLE, DESCUENTO, ');
    Add('IMPORTEDESCUENTO, IVA, IMPORTEIVA, IMPORTETOTAL, TIPOFACTURA, ');
    Add('CODIGOTRIMESTRE) values ');
    Add('(:CODIGOEMPRESA, :CODIGO, :CLASEFACTURA, :REFERENCIA, :FECHAALTA, :FECHAFACTURA, :FECHAVENCIMIENTO, ');
    Add(':SITUACION, :USUARIO, :OBSERVACIONES, :CODIGOPROVEEDOR, ');
    Add(':NIFCIF, :NOMBRE, :CALLE, :NUMERO, :PISO, :CODIGOPOSTAL, ');
    Add(':POBLACION, :PROVINCIA, :TELEFONO1,  :TELEFONO2, :MOVIL1, :MOVIL2, ');
    Add(':FAX, :PERSONACONTACTO, :FORMAPAGO, :BASEIMPONIBLE, :DESCUENTO, ');
    Add(':IMPORTEDESCUENTO, :IVA, :IMPORTEIVA, :IMPORTETOTAL, :TIPOFACTURA, ');
    Add(':CODIGOTRIMESTRE)');
  end;

  with sqlModificarFactura do
  begin
    Add('update FACTURASPROVEEDOR set ');
    Add('CLASEFACTURA = :CLASEFACTURA, ');
    Add('REFERENCIA = :REFERENCIA, ');
    Add('TIPOFACTURA = :TIPOFACTURA, ');
    Add('FECHAFACTURA = :FECHAFACTURA, ');
    Add('FECHAVENCIMIENTO = :FECHAVENCIMIENTO, ');
    Add('SITUACION = :SITUACION, ');
    Add('OBSERVACIONES = :OBSERVACIONES, ');
    Add('CODIGOPROVEEDOR = :CODIGOPROVEEDOR, ');
    Add('NIFCIF = :NIFCIF, ');
    Add('NOMBRE = :NOMBRE, ');
    Add('CALLE = :CALLE, ');
    Add('NUMERO = :NUMERO, ');
    Add('PISO = :PISO, ');
    Add('CODIGOPOSTAL = :CODIGOPOSTAL, ');
    Add('POBLACION = :POBLACION, ');
    Add('PROVINCIA = :PROVINCIA, ');
    Add('TELEFONO1 = :TELEFONO1, ');
    Add('TELEFONO2 = :TELEFONO2, ');
    Add('MOVIL1 = :MOVIL1, ');
    Add('MOVIL2 = :MOVIL2, ');
    Add('FAX = :FAX, ');
    Add('PERSONACONTACTO = :PERSONACONTACTO, ');
    Add('FORMAPAGO = :FORMAPAGO, ');
    Add('BASEIMPONIBLE = :BASEIMPONIBLE, ');
    Add('DESCUENTO = :DESCUENTO, ');
    Add('IMPORTEDESCUENTO = :IMPORTEDESCUENTO, ');
    Add('IVA = :IVA, ');
    Add('IMPORTEIVA = :IMPORTEIVA, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL, ');
    Add('CODIGOTRIMESTRE = :CODIGOTRIMESTRE ');
    Add('WHERE CODIGOEMPRESA = :CODIGOEMPRESA ');
    Add(' AND CODIGO = :CODIGO ');
  end;

  with sqlEliminarFactura do
  begin
    Add('delete from FACTURASPROVEEDOR ');
    Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    Add(' and CODIGO = :CODIGO');
  end;

  with sqlConsultarFactura do
  begin
    Add('select * from FACTURASPROVEEDOR ');
    Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    Add(' and CODIGO = :CODIGO');
  end;
end;

procedure TdmTablaFacturasProveedor.IniciarSQLGrids;
begin
  with sqlConsultarGridFacturas do
  begin
    Add('select FP.CODIGO, CLASEFACTURA, FECHAFACTURA, REFERENCIA, CODIGOPROVEEDOR, ');
    Add('NIFCIF, NOMBRE, DESCRIPCION, FECHAVENCIMIENTO, SITUACION, IMPORTETOTAL ');
    Add('from FACTURASPROVEEDOR FP, TIPOSFACTURAS TF ');
    Add('where TIPOFACTURA = TF.CODIGO ');
    Add('and CODIGOEMPRESA = :CODIGOEMPRESA ');
    Add('order by FP.CODIGO');
  end;

  with sqlConsultarGridFacturasProv do
  begin
    Add('select CODIGO, CLASEFACTURA, FECHAALTA, TIPO, CODIGOFACTURA, CODIGOPROVEEDOR, ');
    Add('NIFCIF, NOMBRE, FECHAVENCIMIENTO, SITUACION, IMPORTETOTAL ');
    Add('from FACTURASPROVEEDOR ');
    Add(' where CODIGOEMPRESA = :CODIGOEMPRESA');
    Add(' and CODIGOPROVEEDOR = :CODIGOPROVEEDOR');
    Add(' order by CODIGO');
  end;

  with sqlConsultarGridDetalles do
  begin
    Add('select CODIGOEMPRESA, CODIGOFACTURA, CODIGOCONTRATO, IMPORTE ');
    Add('from DETALLESFACTURASPROVCONTRATOS ');
    Add(' where CODIGOEMPRESA = :CODIGOEMPRESA');
    Add(' and CODIGOFACTURA = :CODIGOFACTURA');
  end;

  with sqlConsultarTiposFactura do
  begin
    Add('select CODIGO, DESCRIPCION ');
    Add('from TIPOSFACTURAS ');
    Add('where ENTIDAD = ''PROVEEDOR'' order by DESCRIPCION ');
  end;

  with sqlConsultarGridFacturasTrimestre do
  begin
    Add('select FP.CODIGO, FP.SITUACION, FP.FECHAFACTURA, FP.TIPOFACTURA, FP.CLASEFACTURA, ');
    Add('FP.CODIGOPROVEEDOR, FP.NIFCIF, FP.NOMBRE, FP.BASEIMPONIBLE, FP.IMPORTEDESCUENTO, FP.IMPORTEIVA, ');
    Add('FP.IMPORTETOTAL, FP.CODIGOTRIMESTRE, T.SITUACION as SITUACIONTRIMESTRE ');
    Add('from FACTURASPROVEEDOR FP, TRIMESTRES T');
    Add(' where FP.CODIGOEMPRESA = T.CODIGOEMPRESA ');
    Add(' and FP.CODIGOTRIMESTRE = T.CODIGO ');
    Add(' and FP.CODIGOEMPRESA = :CODIGOEMPRESA');
  end;

  with sqlConsultarGridFacturasProvContrato do
  begin
    Add('select det.codigofactura, fac.fechafactura, fac.nifcif, fac.nombre,');
    Add('fac.importetotal, det.importe, det.codigocontrato');
    Add('from detallesfacturasprovcontratos det, facturasproveedor fac');
    Add('where fac.codigoempresa = det.codigoempresa');
    Add(' and fac.codigo = det.codigofactura');
    Add(' and det.codigocontrato = :CODIGOCONTRATO');
//Se cambia sentencia SQL para que en el beneficio por contrato salgan las facturas
//de proveedor de todas las empresas (A y B) así podré calcular el beneficio en general
//teniendo en cuenta facturación en A y en B
//    Add(' and fac.codigoempresa = :CODIGOEMPRESA');
  end;
end;

function TdmTablaFacturasProveedor.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contFacturasProveedor);
end;

function TdmTablaFacturasProveedor.ValidarCodigo(Codigo: String): Boolean;
begin
  Result := GestorContadores.validarCodigo(contFacturasProveedor, Codigo);
end;

function TdmTablaFacturasProveedor.ModificarSituacionFactura(Codigo,
  Situacion, FormaPago: String): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update FACTURASPROVEEDOR ');
    SQL.Add('set SITUACION = :SITUACION, ');
    SQL.Add('FORMAPAGO = :FORMAPAGO ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGO = :CODIGO');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('SITUACION').AsString := Situacion;
    ParamByName('FORMAPAGO').AsString := FormaPago;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.DarIvas: TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Result := NIL;
  oSQL := TIBSQL.Create(Self);
  Lista := TStringList.Create;
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select distinct(IVA) ');
    SQL.Add('from FACTURASPROVEEDOR ');
    SQL.Add('where IVA is not null ');
    SQL.Add('and CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('order by IVA descending');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      ExecQuery;
      while not EOF do begin
        Lista.Append(Fields[0].AsString);
        Next;
      end;
      Result := Lista;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.DarTiposOp: TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Result := NIL;
  oSQL := TIBSQL.Create(Self);
  Lista := TStringList.Create;
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from TIPOSFACTURAS ');
    SQL.Add('where ENTIDAD = ''PROVEEDOR'' ');
    SQL.Add('order by CODIGO');
    try
      Prepare;
      ExecQuery;
      while not EOF do begin
        Lista.Append(Fields[0].AsString);
        Next;
      end;
      Result := Lista;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.DarTiposOpDes: TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Result := NIL;
  oSQL := TIBSQL.Create(Self);
  Lista := TStringList.Create;
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select DESCRIPCION ');
    SQL.Add('from TIPOSFACTURAS ');
    SQL.Add('where ENTIDAD = ''PROVEEDOR'' ');
    SQL.Add('order by CODIGO');
    try
      Prepare;
      ExecQuery;
      while not EOF do begin
        Lista.Append(Fields[0].AsString);
        Next;
      end;
      Result := Lista;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.AsignarTrimestre(CodigoFactura, CodigoTrimestre: String): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(CodigoFactura) or EsCadenaVacia(CodigoTrimestre) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update FACTURASPROVEEDOR ');
    SQL.Add('set CODIGOTRIMESTRE = :CODIGOTRIMESTRE ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGO = :CODIGO');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := CodigoFactura;
    ParamByName('CODIGOTRIMESTRE').AsString := CodigoTrimestre;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarGridFacturasTrimestre(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 facturas';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna CODIGOTRIMESTRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOTRIMESTRE';
    Columna.Caption := 'Cód. Trim';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.Visible := False;
    {Columna TIPOFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TIPOFACTURA';
    Columna.Caption := 'Tipo factura';
    Columna.Options.Filtering := False;
    Columna.Visible := False;
    {Columna CLASEFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CLASEFACTURA';
    Columna.Caption := 'Clase factura';
    Columna.Options.Filtering := False;
    Columna.Visible := False;
    {Columna FECHAFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAFACTURA';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;
    {Columna CODIGOPROVEEDOR}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOPROVEEDOR';
    Columna.Caption := 'Cód. proveedor';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    Columna.Options.Filtering := False;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombreCorto;
    Columna.Options.Filtering := False;
    {Columna SITUACION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'SITUACION';
    Columna.Caption := 'Situación';
    Columna.Width := tamColSituacion;
    Columna.Options.Filtering := False;

    {Columna BASEIMPONIBLE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'BASEIMPONIBLE';
    Columna.Caption := 'Base imponible';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.PropertiesClassName := 'TcxCurrencyEdit';
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '0,0.00 €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna IMPORTEDESCUENTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTEDESCUENTO';
    Columna.Caption := 'Importe DTO.';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.PropertiesClassName := 'TcxCurrencyEdit';
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '0,0.00 €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna IMPORTEIVA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTEIVA';
    Columna.Caption := 'Importe IVA';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.PropertiesClassName := 'TcxCurrencyEdit';
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '0,0.00 €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.PropertiesClassName := 'TcxCurrencyEdit';
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '0,0.00 €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

function TdmTablaFacturasProveedor.ComprobarTrimestreFactura(CodigoFactura: String): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(CodigoFactura) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select TR.SITUACION ');
    SQL.Add('from FACTURASPROVEEDOR FC, TRIMESTRES TR ');
    SQL.Add('where FC.CODIGOEMPRESA = TR.CODIGOEMPRESA ');
    SQL.Add('and FC.CODIGOTRIMESTRE = TR.CODIGO ');
    SQL.Add('and FC.CODIGO = :CODIGO ');
    SQL.Add('and FC.CODIGOEMPRESA = :CODIGOEMPRESA ');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := CodigoFactura;
    try
      Prepare;
      ExecQuery;
      Result := (Fields[0].AsString = 'A');
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.ExisteFacturaConContrato(
  CodigoContrato: String): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select count(CODIGOFACTURA) ');
    SQL.Add('from DETALLESFACTURASPROVCONTRATOS ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and  CODIGOCONTRATO = :CODIGOCONTRATO');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
    try
      Prepare;
      ExecQuery;
      Result := not (Fields[0].AsInteger = 0);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarGridFacturasPendientes(
  var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    Columna.Visible := False;

    {Columna REFERENCIA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'REFERENCIA';
    Columna.Caption := 'Referencia';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '0 facturas';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Options.Filtering := False;
    Columna.Width := tamColNombreCorto;    
    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe';
    Columna.Options.Filtering := False;
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColNombre;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '0,0.00 €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

function TdmTablaFacturasProveedor.DarTiposOpDesTrimestral(var ListaCodigos: TStrings): TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Result := NIL;
  oSQL := TIBSQL.Create(Self);
  ListaCodigos := TStringList.Create;
  Lista := TStringList.Create;
  //tipTodas, tipGeneral, tipInmovilizado
  Lista.Append(msgTipFacturas0);
  Lista.Append(msgTipFacturas1);
  Lista.Append(msgTipFacturas2);

  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, DESCRIPCION ');
    SQL.Add('from TIPOSFACTURAS ');
    SQL.Add('where ENTIDAD = ''PROVEEDOR'' ');
    SQL.Add('order by CODIGO');
    try
      Prepare;
      ExecQuery;
      while not EOF do begin
        ListaCodigos.Append(Fields[0].AsString);
        Lista.Append(Fields[1].AsString);
        Next;
      end;
      Result := Lista;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.ModificarSituacionFacturas(Codigos: TStrings; Situacion: String): Boolean;
var
  oSQL : TIBSQL;
  Indice : Integer;
  Cadena : String;
begin
  Result := False;
  if Codigos.Count = 0 then
     Exit;

  //Formateamos los códigos para optimizar la sentencia SQL
  for Indice:=0 to Codigos.Count-1 do
  begin
    if (Indice <> 0) then
       Cadena := Cadena + ',';
    Cadena := Cadena + '''' + Codigos.Strings[Indice] + '''';
  end;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update FACTURASPROVEEDOR ');
    SQL.Add('set SITUACION = :SITUACION ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('and CODIGO IN (' + Cadena + ')');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('SITUACION').AsString := Situacion;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TDatosFacturaProveedor }

procedure TDatosFacturaProveedor.AssignTo(Dest: TPersistent);
begin
  inherited;
  //
end;

constructor TDatosFacturaProveedor.Create(CodigoFactura: String);
begin
  inherited Create;
  Codigo := CodigoFactura;
  ObtenerDatos;
end;

constructor TDatosFacturaProveedor.Create;
begin
  inherited Create;
end;

destructor TDatosFacturaProveedor.Destroy;
begin
  inherited;
end;

procedure TDatosFacturaProveedor.ObtenerDatos;
var
  oSQL : TIBSQL;
begin
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from FACTURASPROVEEDOR ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add(' and CODIGO = :CODIGO');

    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGO').AsString := Codigo;
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
      begin
        Referencia := FieldByName('REFERENCIA').AsString;
        FechaAlta := FieldByName('FECHAALTA').AsDateTime;
        Usuario := FieldByName('USUARIO').AsString;
        FechaFactura := FieldByName('FECHAFACTURA').AsDateTime;
        FechaVencimiento := FieldByName('FECHAVENCIMIENTO').AsDateTime;
        Situacion := FieldByName('SITUACION').AsString;
        Observaciones := FieldByName('OBSERVACIONES').AsString;
        CodigoProveedor := FieldByName('CODIGOPROVEEDOR').AsString;
        NIFCIF := FieldByName('NIFCIF').AsString;
        Nombre := FieldByName('NOMBRE').AsString;
        Calle := FieldByName('CALLE').AsString;
        Numero := FieldByName('NUMERO').AsString;
        Piso := FieldByName('PISO').AsString;
        CodigoPostal := FieldByName('CODIGOPOSTAL').AsString;
        Poblacion := FieldByName('POBLACION').AsString;
        Provincia := FieldByName('PROVINCIA').AsString;
        Telefono1 := FieldByName('TELEFONO1').AsString;
        Telefono2 := FieldByName('TELEFONO2').AsString;
        Movil1 := FieldByName('MOVIL1').AsString;
        Movil2 := FieldByName('MOVIL2').AsString;
        Fax := FieldByName('FAX').AsString;
        PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
        FormaPago := FieldByName('FORMAPAGO').AsString;
        BaseImponible := FieldByName('BASEIMPONIBLE').AsDouble;
        Descuento := FieldByName('DESCUENTO').AsInteger;
        ImporteDescuento := FieldByName('IMPORTEDESCUENTO').AsDouble;
        Iva := FieldByName('IVA').AsInteger;
        ImporteIva := FieldByName('IMPORTEIVA').AsDouble;
        ImporteTotal := FieldByName('IMPORTETOTAL').AsDouble;
        TipoFactura := FieldByName('TIPOFACTURA').AsString;
        ClaseFactura := FieldByName('CLASEFACTURA').AsString;
        CodigoTrimestre := FieldByName('CODIGOTRIMESTRE').AsString;
      end
      else begin
        raise Exception.CreateFmt(msgProvNoExisteFacProv, [Codigo]);
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaFacturasProveedor }

procedure TListaFacturasProveedor.AssignTo(Dest: TPersistent);
begin
  inherited;
  //
end;

constructor TListaFacturasProveedor.Create(oSQL: String);
begin
  inherited Create;
  FSQL := oSQL;
  ObtenerLista;
end;

constructor TListaFacturasProveedor.Create;
begin
  inherited Create;
  FSQL := 'select CODIGO from FACTURASPROVEEDOR';
  FSQL := FSQL + ' where CODIGOEMPRESA = :CODIGOEMPRESA';
  ObtenerLista;
end;

function TListaFacturasProveedor.GetFactura(
  Index: Integer): TDatosFacturaProveedor;
begin
  Result := TDatosFacturaProveedor(FLista.Items[Index]);
end;

procedure TListaFacturasProveedor.ObtenerLista;
var
  oSQL : TIBSQL;
  Factura : TDatosFacturaProveedor;
begin
  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Text := FSQL;
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      ExecQuery;
      while not EOF do begin
        Factura := TDatosFacturaProveedor.Create(FieldByName('CODIGO').AsString);
        FLista.Add(Factura);
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarGridFacturasProvContrato(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;
    {Columna CODIGOFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOFACTURA';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    {Columna FECHAFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAFACTURA';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    Columna.Options.Filtering := False;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombreCorto;    
    Columna.Options.Filtering := False;
    {Columna IMPORTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTE';
    Columna.Caption := 'Importe';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporteLargo;
    Columna.Options.Filtering := False;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: #,0.00# €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

end.
