{
===============================================================================
  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: 25-12-2002
  Versión actual: 1.0.3
  Fecha versión actual: 06-10-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    08-06-2003    Revisión del método 'EsUltimaFactura' porque no se tenía
                  en cuenta la serie a la que pertenece la factura.

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

    06-10-2004    p26. Se ha eliminado la tabla DETALLESFACTURASCLIPROPIEDADES.                  
===============================================================================
}

unit TablaFacturasCliente;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares
  IBCustomDataSet, cxGrid, StdCtrls, cxButtonEdit, cxEdit, cxMemo, cxCheckBox,

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

  // Contador
  Contadores, RdxGestorContadores;

type
  TDatosFacturaCliente = class(TObjeto)
  private
    //
  protected
    procedure ObtenerDatos; override;
    procedure AssignTo(Dest: TPersistent); override;
  public
    Codigo : String;
    FechaAlta : TDateTime;
    Usuario : String;
    FechaFactura : TDateTime;
    Situacion : String;
    ClaseFactura : String;
    CodigoCliente : 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;
    BaseImponible : double;
    Descuento : integer;
    ImporteDescuento : double;
    Iva : integer;
    ImporteIva : double;
    Re : integer;
    ImporteRe : double;
    ImporteTotal : double;
    FormaPago : String;
    Observaciones : String;
    TipoFactura : String;
    CodigoTrimestre : String;
    constructor Create(CodigoFactura : String); overload;
    constructor Create; overload; override;
    destructor Destroy; override;
  end;

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

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

  TdmTablaFacturasCliente = class(TDataModule)
  private
    procedure IniciarSQLFactura;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
  public
    sqlInsertarFactura : TStrings;
    sqlModificarFactura : TStrings;
    sqlConsultarFactura : TStrings;
    sqlEliminarFactura : TStrings;
    sqlConsultarGridFacturas : TStrings;
    sqlInsertarDetalles : TStrings;
    sqlModificarDetalles : TStrings;
    sqlConsultarDetalles : TStrings;
    sqlEliminarDetalles : TStrings;
    sqlConsultarGridDetalles : TStrings;
    sqlConsultarGridFacturasComisiones : TStrings;
    sqlConsultarGridFacturasTrimestre : TStrings;
    sqlConsultarGridFacturasCliente : TStrings;
    sqlConsultarGridFacturasCliContrato : TStrings;

    sqlInsertarPropiedades : TStrings;
    sqlModificarPropiedades : TStrings;
    sqlConsultarPropiedades : TStrings;
    sqlEliminarPropiedades : TStrings;
    sqlConsultarGridPropiedades : TStrings;
    sqlConsultarGridPropiedadesModal : TStrings;

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

    function CrearFactura(CodigoContrato, TipoFactura: String) : String;
    function ExisteFacturaConContrato(CodigoContrato : String) : Boolean;
    function ExisteFacturaConCliente(Codigo : Variant) : Boolean;
    function RecalcularPreciosFactura(CodigoFactura : String) : Boolean;
    function DarDatosFactura(Datos : TDatosFacturaCliente): Boolean;
    function FormatearNumConcepto(NumConcepto : String) : String;
    function ExisteCodigo(Codigo : String) : Boolean;
    procedure InicializarGridDetalles(var Grid: TcxGridDBTableView);
    procedure InicializarGridFacturas(var Grid: TcxGrid);
    procedure InicializarGridListadoFacturasCliente(var Grid: TcxGrid);
    procedure InicializarGridFacturasComisiones(var Grid: TcxGridDBTableView);
    procedure InicializarTablaFacturas(Tabla: TPTabla);
    procedure InicializarTablaDetalles(Tabla: TPTabla);
    procedure InicializarGridFacturasTrimestre(var Grid: TcxGrid);
    procedure InicializarGridFacturasCliContrato(var Grid: TcxGrid);
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    function DarSituaciones : TStrings;
    function ModificarSituacionFactura(Codigo, Situacion, FormaPago : String): Boolean;
    function ModificarSituacionFacturas(Codigos: TStrings; Situacion: String): Boolean;
    function EsUltimaFactura(Codigo : String): Boolean;
    function DarListaAnos: TStrings;
    function ExistenFacturas: Boolean;

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

var
  dmTablaFacturasCliente: TdmTablaFacturasCliente;

implementation
{$R *.DFM}

uses
  Variants, TablaContratos, TablaEmpresas, TablaTrimestres, TablaDocumentos, Literales;

{ TdmTablaFacturas }

constructor TdmTablaFacturasCliente.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;

  { Propiedades }
  sqlInsertarPropiedades := TStringList.Create;
  sqlModificarPropiedades := TStringList.Create;
  sqlConsultarPropiedades := TStringList.Create;
  sqlEliminarPropiedades := TStringList.Create;
  sqlConsultarGridPropiedades := TStringList.Create;
  sqlConsultarGridPropiedadesModal := TStringList.Create;

  { Grids }
  sqlConsultarGridFacturas := TStringList.Create;
  sqlConsultarGridDetalles := TStringList.Create;
  sqlConsultarGridFacturasComisiones := TStringList.Create;

  sqlConsultarGridFacturasTrimestre := TStringList.Create;
  sqlConsultarGridFacturasCliente := TStringList.Create;
  sqlConsultarGridFacturasCliContrato := TStringList.Create;

  IniciarSQLFactura;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

function TdmTablaFacturasCliente.DarNuevoCodigo: String;
begin
  Result := GestorContadores.darNuevoCodigo(contFacturasCliente);
end;

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

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

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

  { Propiedades }
  sqlInsertarPropiedades.Free;
  sqlModificarPropiedades.Free;
  sqlConsultarPropiedades.Free;
  sqlEliminarPropiedades.Free;
  sqlConsultarGridPropiedades.Free;
  sqlConsultarGridPropiedadesModal.Free;

  { Grids }
  sqlConsultarGridFacturas.Free;
  sqlConsultarGridDetalles.Free;
  sqlConsultarGridFacturasComisiones.Free;

  sqlConsultarGridFacturasTrimestre.Free;
  sqlConsultarGridFacturasCliente.Free;
  sqlConsultarGridFacturasCliContrato.Free;
  inherited;
end;

function TdmTablaFacturasCliente.ExisteCodigo(Codigo: String): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from FACTURASCLIENTE ');
    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 TdmTablaFacturasCliente.FormatearCodigo(Codigo: String): String;
begin
  Result := GestorContadores.formatearCodigo(contFacturasCliente, Codigo);
end;

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

function TdmTablaFacturasCliente.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contFacturasCliente);
end;

procedure TdmTablaFacturasCliente.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 NUMCONCEPTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NUMCONCEPTO';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    {Columna CODIGOARTICULO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOARTICULO';
    Columna.Caption := 'Cód. artículo';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxButtonEditProperties';
    with TcxButtonEditProperties(Columna.Properties) do
    begin
      Buttons[0].Kind := bkEllipsis;
    end;
    Columna.Visible := False;

    {Columna REFERENCIA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'REFERENCIA';
    Columna.Caption := 'Referencia';
    Columna.Width := tamColReferencia;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxButtonEditProperties';
    with TcxButtonEditProperties(Columna.Properties) do
    begin
      Buttons[0].Kind := bkEllipsis;
    end;

    {Columna DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Descripción servicio/artículo';
    Columna.Width := tamColDescripcion;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxMemoProperties';
    with TcxMemoProperties(Columna.Properties) do
      ScrollBars := ssVertical;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: #,0 conceptos';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna CANTIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CANTIDAD';
    Columna.Caption := 'Cantidad';
    Columna.Width := tamColCantidad;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxCalcEditProperties';

    {Columna IMPORTEUNIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTEUNIDAD';
    Columna.Caption := 'Importe unidad';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxCalcEditProperties';

    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;    
    Columna.Options.Editing := False;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := '#,0.00 €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

procedure TdmTablaFacturasCliente.InicializarGridFacturas(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;
    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 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 DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Documento';
    Columna.Width := tamColDocumentos;
    Columna.Options.Filtering := False;
    {Columna CODIGOCLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCLIENTE';
    Columna.Caption := 'Cód. cliente';
    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 := tamColNombre;
    Columna.Options.Filtering := False;
    {Columna SITUACION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'SITUACION';
    Columna.Caption := 'Situación';
    Columna.Width := tamColSituacion;
    Columna.Options.Filtering := False;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    {Columna CODIGOCONTRATO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCONTRATO';
    Columna.Caption := 'Contrato';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;

  end;
end;

procedure TdmTablaFacturasCliente.InicializarTablaDetalles(Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('CANTIDAD') <> NIL then
      with (FieldByName('CANTIDAD') as TNumericField) do begin
        DisplayFormat := DISPLAY_CANTIDAD;
        EditFormat := EDIT_CANTIDAD;
      end;

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

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

procedure TdmTablaFacturasCliente.InicializarTablaFacturas(
  Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    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_DTO;
        EditFormat := EDIT_DTO;
      end;

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

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

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

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

procedure TdmTablaFacturasCliente.IniciarSQLDetalles;
begin
  with sqlInsertarDetalles do
  begin
    Add('INSERT INTO DETALLESFACTURASCLIARTICULOS ( ');
    Add('CODIGOEMPRESA, CODIGOFACTURA, NUMCONCEPTO, ');
    Add('CODIGOARTICULO, REFERENCIA, ');
    Add('DESCRIPCION, CANTIDAD, ');
    Add('IMPORTEUNIDAD, IMPORTETOTAL) ');
    Add('VALUES ( ');
    Add(':CODIGOEMPRESA, :CODIGOFACTURA, :NUMCONCEPTO, ');
    Add(':CODIGOARTICULO, :REFERENCIA, ');
    Add(':DESCRIPCION, :CANTIDAD, ');
    Add(':IMPORTEUNIDAD, :IMPORTETOTAL) ');
  end;

  with sqlModificarDetalles do
  begin
    Add('UPDATE DETALLESFACTURASCLIARTICULOS SET  ');
    Add('CODIGOARTICULO = :CODIGOARTICULO, ');
    Add('REFERENCIA = :REFERENCIA, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('CANTIDAD = :CANTIDAD, ');
    Add('IMPORTEUNIDAD = :IMPORTEUNIDAD, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(CODIGOFACTURA = :CODIGOFACTURA) AND  ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) ');
  end;

  with sqlEliminarDetalles do
  begin
    Add('delete from DETALLESFACTURASCLIARTICULOS ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(CODIGOFACTURA = :CODIGOFACTURA) AND  ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) ');
  end;

  with sqlConsultarDetalles do
  begin
    Add('select CODIGOFACTURA, NUMCONCEPTO, CODIGOARTICULO, REFERENCIA, ');
    Add('DESCRIPCION, CANTIDAD, IMPORTEUNIDAD, IMPORTETOTAL ');
    Add('from DETALLESFACTURASCLIARTICULOS ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(CODIGOFACTURA = :CODIGOFACTURA) AND  ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) ');
  end;
end;

procedure TdmTablaFacturasCliente.IniciarSQLGrids;
begin
  with sqlConsultarGridFacturas do
  begin
    Add('select FAC.CODIGO, FAC.CLASEFACTURA, FAC.SITUACION, ');
    Add('FAC.FECHAALTA, FAC.FECHAFACTURA, FAC.CODIGOCLIENTE, FAC.NIFCIF, ');
    Add('FAC.NOMBRE, FAC.IMPORTETOTAL, FAC.CODIGODOCUMENTO, DOC.DESCRIPCION, ');
    Add('FAC.CODIGOCONTRATO ');
    Add('from FACTURASCLIENTE FAC, DOCUMENTOS DOC ');
    Add('WHERE (FAC.CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(DOC.CODIGO = FAC.CODIGODOCUMENTO)');
  end;

  with sqlConsultarGridDetalles do
  begin
    Add('select CODIGOEMPRESA, CODIGOFACTURA, NUMCONCEPTO, CODIGOARTICULO, REFERENCIA, ');
    Add('DESCRIPCION, CANTIDAD, IMPORTEUNIDAD, IMPORTETOTAL ');
    Add('from DETALLESFACTURASCLIARTICULOS ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(CODIGOFACTURA = :CODIGOFACTURA) ');
    Add('order by CODIGOFACTURA, NUMCONCEPTO');
  end;

  with sqlConsultarGridFacturasComisiones do
  begin
    Add('select 1 as SELECCION, CODIGO, SITUACION, FECHAALTA, FECHAFACTURA,');
    Add('CODIGOCLIENTE, NIFCIF, NOMBRE, IMPORTETOTAL, CLASEFACTURA ');
    Add('from FACTURASCLIENTE ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('AND (COMISION = 1)');
    Add('AND (FECHAFACTURA between :FECHAINI and :FECHAFIN)');
  end;

  with sqlConsultarGridFacturasTrimestre do
  begin
    Add('select FC.CODIGO, FC.SITUACION, FC.FECHAFACTURA, FC.CODIGOCLIENTE, ');
    Add('FC.TIPOFACTURA, FC.CLASEFACTURA, FC.NIFCIF, FC.NOMBRE, FC.BASEIMPONIBLE, ');
    Add('FC.IMPORTEDESCUENTO, FC.IMPORTEIVA, FC.IMPORTERE, ');
    Add('FC.IMPORTETOTAL, FC.CODIGOTRIMESTRE, T.SITUACION as SITUACIONTRIMESTRE ');
    Add('from FACTURASCLIENTE FC, TRIMESTRES T');
    Add('WHERE (FC.CODIGOEMPRESA = T.CODIGOEMPRESA) AND  ');
    Add('(FC.CODIGOTRIMESTRE = T.CODIGO) AND ');
    Add('(FC.CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

  with sqlConsultarGridFacturasCliente do
  begin
    Add('select CODIGO, CLASEFACTURA, SITUACION, FECHAALTA, FECHAFACTURA,');
    Add('CODIGOCLIENTE, NIFCIF, NOMBRE, IMPORTETOTAL ');
    Add('from FACTURASCLIENTE ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(CODIGOCLIENTE = :CODIGOCLIENTE)');
  end;

  with sqlConsultarGridFacturasCliContrato do
  begin
    Add('select codigo, fechafactura, nifcif, nombre, importetotal, codigocontrato ');
    Add('from facturascliente ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND ');
    Add('(codigocontrato = :CODIGOCONTRATO)');
    Add('order by CODIGO');
  end;

end;

procedure TdmTablaFacturasCliente.IniciarSQLFactura;
begin
  with sqlInsertarFactura do
  begin
    Add('INSERT INTO FACTURASCLIENTE ');
    Add('(CODIGOEMPRESA, CODIGO, FECHAALTA, FECHAFACTURA, ');
    Add('SITUACION, CLASEFACTURA, ');
    Add('CODIGOCLIENTE, NIFCIF, NOMBRE, ');
    Add('CALLE, NUMERO, PISO, ');
    Add('CODIGOPOSTAL, POBLACION, PROVINCIA, ');
    Add('TELEFONO1, TELEFONO2, MOVIL1, ');
    Add('MOVIL2, FAX, PERSONACONTACTO, ');
    Add('BASEIMPONIBLE, DESCUENTO, IMPORTEDESCUENTO, ');
    Add('IVA, IMPORTEIVA, IMPORTETOTAL, RE, IMPORTERE, ');
    Add('FORMAPAGO, OBSERVACIONES, ');
    Add('USUARIO, CODIGOTRIMESTRE, TIPOFACTURA, CODIGODOCUMENTO, COMISION) VALUES ');
    Add('(:CODIGOEMPRESA, :CODIGO, :FECHAALTA, ');
    Add(':FECHAFACTURA, ');
    Add(':SITUACION, :CLASEFACTURA, ');
    Add(':CODIGOCLIENTE, :NIFCIF, ');
    Add(':NOMBRE, :CALLE, :NUMERO, ');
    Add(':PISO, :CODIGOPOSTAL, ');
    Add(':POBLACION, :PROVINCIA, ');
    Add(':TELEFONO1, :TELEFONO2, ');
    Add(':MOVIL1, :MOVIL2, ');
    Add(':FAX, :PERSONACONTACTO, ');
    Add(':BASEIMPONIBLE, :DESCUENTO, ');
    Add(':IMPORTEDESCUENTO, :IVA, ');
    Add(':IMPORTEIVA, :IMPORTETOTAL, ');
    Add(':RE, :IMPORTERE, ');
    Add(':FORMAPAGO, :OBSERVACIONES, ');
    Add(':USUARIO, :CODIGOTRIMESTRE, :TIPOFACTURA, :CODIGODOCUMENTO, :COMISION) ');
  end;

  with sqlModificarFactura do
  begin
    Add('UPDATE FACTURASCLIENTE SET ');
    Add('FECHAFACTURA = :FECHAFACTURA, ');
    Add('SITUACION = :SITUACION, ');
    Add('CLASEFACTURA = :CLASEFACTURA, ');
    Add('CODIGOCLIENTE = :CODIGOCLIENTE, ');
    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('BASEIMPONIBLE = :BASEIMPONIBLE, ');
    Add('DESCUENTO = :DESCUENTO, ');
    Add('IMPORTEDESCUENTO = :IMPORTEDESCUENTO, ');
    Add('IVA = :IVA, ');
    Add('IMPORTEIVA = :IMPORTEIVA, ');
    Add('RE = :RE, ');
    Add('IMPORTERE = :IMPORTERE, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL, ');
    Add('FORMAPAGO = :FORMAPAGO, ');
    Add('OBSERVACIONES = :OBSERVACIONES, ');
    Add('CODIGOTRIMESTRE = :CODIGOTRIMESTRE, ');
    Add('CODIGODOCUMENTO = :CODIGODOCUMENTO, ');
    Add('COMISION = :COMISION ');
    Add('WHERE CODIGOEMPRESA = :CODIGOEMPRESA');
    Add(' AND (CODIGO = :CODIGO)');
  end;

  with sqlEliminarFactura do
  begin
    Add('delete from FACTURASCLIENTE ');
    Add('WHERE CODIGOEMPRESA = :CODIGOEMPRESA');
    Add(' AND CODIGO = :CODIGO');
  end;

  with sqlConsultarFactura do
  begin
    Add('SELECT * FROM FACTURASCLIENTE ');
    Add('WHERE CODIGOEMPRESA = :CODIGOEMPRESA');
    Add(' and CODIGO = :CODIGO');
  end;
end;

function TdmTablaFacturasCliente.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contFacturasCliente);
end;

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

function TdmTablaFacturasCliente.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 FACTURASCLIENTE ');
    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 TdmTablaFacturasCliente.DecrementarCodigo: boolean;
begin
  Result := GestorContadores.decrementarValor(contFacturasCliente);
end;

function TdmTablaFacturasCliente.DarDatosFactura(Datos: TDatosFacturaCliente): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  if EsCadenaVacia(Datos.Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from FACTURASCLIENTE ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGO = :CODIGO');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGO').AsString := Datos.Codigo;
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
      begin
        with Datos do
        begin
          FechaAlta := FieldByName('FECHAALTA').AsDateTime;
          Usuario := FieldByName('USUARIO').AsString;
          FechaFactura := FieldByName('FECHAFACTURA').AsDateTime;
          Situacion := FieldByName('SITUACION').AsString;
          ClaseFactura := FieldByName('CLASEFACTURA').AsString;
          CodigoCliente := FieldByName('CODIGOCLIENTE').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;
          BaseImponible := FieldByName('BASEIMPONIBLE').AsDouble;
          Descuento := FieldByName('DESCUENTO').AsInteger;
          ImporteDescuento := FieldByName('IMPORTEDESCUENTO').AsDouble;
          Iva := FieldByName('IVA').AsInteger;
          ImporteIva := FieldByName('IMPORTEIVA').AsDouble;
          Re := FieldByName('RE').AsInteger;
          ImporteRe := FieldByName('IMPORTERE').AsDouble;
          ImporteTotal := FieldByName('IMPORTETOTAL').AsDouble;
          FormaPago := FieldByName('FORMAPAGO').AsString;
          TipoFactura := FieldByName('TIPOFACTURA').AsString;
          CodigoTrimestre := FieldByName('CODIGOTRIMESTRE').AsString;
          Observaciones := FieldByName('OBSERVACIONES').AsString;
          Result := True;
        end;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasCliente.EsUltimaFactura(Codigo: 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('select count(*) ');
    SQL.Add('from FACTURASCLIENTE ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add(' and CODIGO > :CODIGO');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      if Fields[0].AsInteger = 0 then
        Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaFacturasCliente.InicializarGridFacturasComisiones(var Grid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with Grid do begin

    {Columna SELECCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'SELECCION';
    Columna.Caption := '     ';
    Columna.Width := 20;
    Columna.PropertiesClassName := 'TcxCheckBoxProperties';
    Columna.Options.Filtering := False;
    with TcxCheckBoxProperties(Columna.Properties) do begin
          DisplayUnchecked := 'False';
          ImmediatePost := True;
          ValueChecked := 1;
          ValueUnchecked := 0;
    end;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.Options.Editing := False;
    {Columna CLASEFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CLASEFACTURA';
    Columna.Caption := 'Clase factura';
    Columna.Options.Filtering := False;
    Columna.Visible := False;
    {Columna SITUACION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'SITUACION';
    Columna.Caption := 'Situación';
    Columna.Width := tamColSituacion;
    Columna.Options.Filtering := False;
    Columna.Options.Editing := False;
    {Columna FECHAFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAFACTURA';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    Columna.Options.Editing := False;
    Columna.SortOrder := soDescending;
    {Columna CODIGOCLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCLIENTE';
    Columna.Caption := 'Cód. cliente';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.Options.Editing := False;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    Columna.Options.Filtering := False;
    Columna.Options.Editing := False;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    Columna.Options.Editing := False;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Caption := 'Importe total';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Editing := False;
  end;
end;

function TdmTablaFacturasCliente.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 FACTURASCLIENTE ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add(' and IVA is not null ');
    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 TdmTablaFacturasCliente.DarIvasR: 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(RE) ');
    SQL.Add('from FACTURASCLIENTE ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add(' and RE is not null ');
    SQL.Add('order by RE 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 TdmTablaFacturasCliente.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 FACTURASCLIENTE ');
    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;

function TdmTablaFacturasCliente.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 FACTURASCLIENTE FC, TRIMESTRES TR ');
    SQL.Add('where FC.CODIGOEMPRESA = TR.CODIGOEMPRESA');
    SQL.Add(' and FC.CODIGOTRIMESTRE = TR.CODIGO');
    SQL.Add(' and FC.CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add(' and FC.CODIGO = :CODIGO ');
    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 TdmTablaFacturasCliente.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 DESCRIPCION ');
    SQL.Add('from TIPOSFACTURAS ');
    SQL.Add('where ENTIDAD = ''CLIENTE'' ');
    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;

procedure TdmTablaFacturasCliente.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 CODIGOCLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOTRIMESTRE';
    Columna.Caption := 'Cód. Trie';
    Columna.Width := tamColCodigo;
    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 TIPOFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TIPOFACTURA';
    Columna.Caption := 'Tipo 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 CODIGOCLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCLIENTE';
    Columna.Caption := 'Cód. cliente';
    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 IMPORTERE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTERE';
    Columna.Caption := 'Importe RE.';
    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;

{ TDatosFacturaCliente }

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

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

constructor TDatosFacturaCliente.Create;
begin
  inherited Create;
end;

destructor TDatosFacturaCliente.Destroy;
begin
  inherited;
end;

procedure TDatosFacturaCliente.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 FACTURASCLIENTE ');
    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
          FechaAlta := FieldByName('FECHAALTA').AsDateTime;
          FechaFactura := FieldByName('FECHAFACTURA').AsDateTime;
          FormaPago := FieldByName('FORMAPAGO').AsString;
          Situacion := FieldByName('SITUACION').AsString;
          Usuario := FieldByName('USUARIO').AsString;
          CodigoCliente := FieldByName('CODIGOCLIENTE').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;
          PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
          Telefono1 := FieldByName('TELEFONO1').AsString;
          Telefono2 := FieldByName('TELEFONO2').AsString;
          Movil1 := FieldByName('MOVIL1').AsString;
          Movil2 := FieldByName('MOVIL2').AsString;
          Fax := FieldByName('FAX').AsString;
          BaseImponible := FieldByName('BASEIMPONIBLE').AsFloat;
          Descuento := FieldByName('DESCUENTO').AsInteger;
          Iva := FieldByName('IVA').AsInteger;
          ImporteDescuento := FieldByName('IMPORTEDESCUENTO').AsFloat;
          ImporteIva := FieldByName('IMPORTEIVA').AsFloat;
          RE := FieldByName('RE').AsInteger;
          ImporteRE := FieldByName('IMPORTERE').AsFloat;
          ImporteTotal := FieldByName('IMPORTETOTAL').AsFloat;
          ClaseFactura := FieldByName('CLASEFACTURA').AsString;
          CodigoTrimestre := FieldByName('CODIGOTRIMESTRE').AsString;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaFacturasCliente }

procedure TListaFacturasCliente.AssignTo(Dest: TPersistent);
begin
  inherited;

end;

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

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

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

procedure TListaFacturasCliente.ObtenerLista;
var
  oSQL : TIBSQL;
  Factura : TDatosFacturaCliente;
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 := TDatosFacturaCliente.Create(FieldByName('CODIGO').AsString);
        FLista.Add(Factura);
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaFacturasCliente.InicializarGridListadoFacturasCliente(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := 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 SITUACION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'SITUACION';
    Columna.Caption := 'Situación';
    Columna.Width := tamColSituacion;
    Columna.Options.Filtering := False;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    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;

function TdmTablaFacturasCliente.CrearFactura(CodigoContrato, TipoFactura: String): String;
var
  oSQL : TIBSQL;
  oSQL2 : TIBSQL;
  CodigoAux : String;
  CodigoEmpAux : Integer;
  CodDoc : String;
  Cadena : String;
begin
  Result := '';

  CodigoAux := dmTablaFacturasCliente.DarNuevoCodigo;
  CodigoEmpAux := EmpresaActiva.Codigo;

  oSQL := TIBSQL.Create(Self);
  try
    with oSQL do
    begin
      Database := dmBaseDatos.BD;
      Transaction := dmBaseDatos.Transaccion;

      SQL.Add('insert into FACTURASCLIENTE (');
      SQL.Add('CODIGOEMPRESA, CODIGO, FECHAALTA,');
      SQL.Add('USUARIO, CODIGODOCUMENTO,');
      SQL.Add('FECHAFACTURA, SITUACION, CLASEFACTURA, COMISION,');
      SQL.Add('CODIGOCLIENTE, NIFCIF,');
      SQL.Add('NOMBRE, CALLE,');
      SQL.Add('NUMERO, PISO,');
      SQL.Add('CODIGOPOSTAL, POBLACION,');
      SQL.Add('PROVINCIA, PERSONACONTACTO,');
      SQL.Add('OBSERVACIONES, FORMAPAGO, ');
      SQL.Add('DESCUENTO, IVA,');
      SQL.Add('BASEIMPONIBLE, IMPORTEDESCUENTO, ');
      SQL.Add('IMPORTEIVA, IMPORTETOTAL, ');
      SQL.Add('TIPOFACTURA, CODIGOTRIMESTRE, CODIGOCONTRATO) ');
      SQL.Add('select ' + IntToStr(CodigoEmpAux) + ', ''' + CodigoAux + ''', current_date,');
      SQL.Add('''' + dmBaseDatos.Usuario + ''', CODIGODOCUMENTO,');
      SQL.Add('current_date, ''PENDIENTE'', ''' + TipoFactura + ''', 1,');
      SQL.Add('CODIGOCLIENTE,');
      SQL.Add('NIFCIF, NOMBRE,');
      SQL.Add('CALLE, NUMERO,');
      SQL.Add('PISO, CODIGOPOSTAL,');
      SQL.Add('POBLACION, PROVINCIA,');
      SQL.Add('PERSONACONTACTO, null, null, DESCUENTO, ' + EmpresaActiva.IvaDefecto + ', ');
      if TipoFactura = CTE_CF_ABONO then
        SQL.Add('BASEIMPONIBLE * (-1), IMPORTEDESCUENTO  * (-1), IMPORTEIVA  * (-1), IMPORTETOTAL  * (-1), ')
      else
        SQL.Add('BASEIMPONIBLE, IMPORTEDESCUENTO, IMPORTEIVA, IMPORTETOTAL, ');
      SQL.Add(IntToStr(CTE_TIPFAC_VENTA) + ', ''' + EmpresaActiva.CodigoTrimestre + ''', ');
      SQL.Add('''' + CODIGOCONTRATO + ''' ');
      SQL.Add('from CONTRATOSCLIENTE ');
      SQL.Add('where CODIGO = ''' + CodigoContrato + '''');

      Prepare;
      ExecQuery;
      Close;
    end;

    // Averiguar qué tipo de documento estamos tratando
    with oSQL do
    begin
      SQL.Clear;
      SQL.Add('select CODIGODOCUMENTO from FACTURASCLIENTE ');
      SQL.Add('where CODIGO = :CODIGO');
      ParamByName('CODIGO').AsString := CodigoAux;
      Prepare;
      ExecQuery;
      CodDoc := FieldByName('CODIGODOCUMENTO').AsString;
    end;


    oSQL2 := TIBSQL.Create(Self);
    oSQL2.Database := dmBaseDatos.BD;
    oSQL2.Transaction := dmBaseDatos.Transaccion;

    if dmTablaDocumentos.TienePropiedades(CodDoc) then
    begin
      with oSQL2 do
      begin
        // Insertar los registros de precio
        SQL.Add('insert into DETALLESFACTURASCLIARTICULOS (');
        SQL.Add('CODIGOEMPRESA, CODIGOFACTURA, NUMCONCEPTO,');
        SQL.Add('CODIGOARTICULO, REFERENCIA, ');
        SQL.Add('DESCRIPCION, CANTIDAD,');
        SQL.Add('IMPORTEUNIDAD, IMPORTETOTAL)');
        SQL.Add('select ' + IntToStr(CodigoEmpAux) + ', ''' + CodigoAux + ''', NUMCONCEPTO,');
        SQL.Add('CODIGOARTICULO, REFERENCIA, ');
        SQL.Add('DESCRIPCION, CANTIDAD,');
        if TipoFactura = CTE_CF_ABONO then
          SQL.Add('IMPORTEUNIDAD * (-1), IMPORTETOTAL * (-1) ')
        else
          SQL.Add('IMPORTEUNIDAD, IMPORTETOTAL ');
        SQL.Add('from DETALLESCONTRATOSARTICULOS ');
        SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO and ');
        SQL.Add('TIPOCONCEPTO = ''PRECIO''');
        ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
        Prepare;
        ExecQuery;
      end;

      // Insertar los conceptos que tienen propiedades
      with oSQL do
      begin
        Close;
        SQL.Clear;
        // Averiguar cuales son los conceptos con propiedades
        SQL.Add('select NUMCONCEPTO, TIPOCONCEPTO ');
        SQL.Add('from DETALLESCONTRATOSARTICULOS ');
        SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO and ');
        SQL.Add('TIPOCONCEPTO <> ''PRECIO'' and TIPOCONCEPTO is not null');
        ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
        Prepare;
        ExecQuery;
      end;

      // Construir una cadena con los textos de las propiedades
      while not oSQL.EOF do
      begin
        with oSQL2 do
        begin
          SQL.Clear;
          SQL.Add('select DESCRIPCION, VALOR ');
          SQL.Add('from DETALLESCONTRATOSPROPIEDADES, PROPIEDADES ');
          SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO and ');
          SQL.Add('NUMCONCEPTO = :NUMCONCEPTO and ');
          SQL.Add('CODIGO = CODIGOPROPIEDAD ');
          SQL.Add('order by NUMPROPIEDAD ');
          ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
          ParamByName('NUMCONCEPTO').AsInteger := oSQL.FieldByName('NUMCONCEPTO').AsInteger;
          Prepare;
          ExecQuery;

          Cadena := '';
          if oSQL.FieldByName('TIPOCONCEPTO').AsString = 'FRENTE' then
            Cadena := 'FRENTE DE ARMARIO' + #13;
          if oSQL.FieldByName('TIPOCONCEPTO').AsString = 'INTERIOR' then
            Cadena := 'INTERIOR DE ARMARIO' + #13;

          while not EOF do
          begin
            Cadena := Cadena + Fields[0].AsString + ': ' +
                      Fields[1].AsString + #13;
            Next;
          end;
          Close;
        end;

        // Insertar el concepto con la cadena de propiedades
        with oSQL2 do
        begin
          Close;
          SQL.Clear;
          SQL.Add('insert into DETALLESFACTURASCLIARTICULOS (');
          SQL.Add('CODIGOEMPRESA, CODIGOFACTURA, NUMCONCEPTO,');
          SQL.Add('CODIGOARTICULO, ');
          SQL.Add('DESCRIPCION, CANTIDAD,');
          SQL.Add('IMPORTEUNIDAD, IMPORTETOTAL)');
          SQL.Add('select ' + IntToStr(CodigoEmpAux) + ', ''' + CodigoAux + ''', NUMCONCEPTO,');
          SQL.Add('CODIGOARTICULO, ');
          SQL.Add('''' + Cadena + ''', CANTIDAD,');
          if TipoFactura = CTE_CF_ABONO then
            SQL.Add('IMPORTEUNIDAD * (-1), IMPORTETOTAL * (-1) ')
          else
            SQL.Add('IMPORTEUNIDAD, IMPORTETOTAL ');

          SQL.Add('from DETALLESCONTRATOSARTICULOS ');
          SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO and ');
          SQL.Add('TIPOCONCEPTO <> ''PRECIO'' and TIPOCONCEPTO is not null and ');
          SQL.Add('NUMCONCEPTO = :NUMCONCEPTO ');
          ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
          ParamByName('NUMCONCEPTO').AsInteger := oSQL.FieldByName('NUMCONCEPTO').AsInteger;
          Prepare;
          ExecQuery;
        end;
        oSQL.Next;
      end; // while not oSQL.EOF do
    end
    else begin
      // Insertar todos los registros
      with oSQL2 do
      begin
        SQL.Add('insert into DETALLESFACTURASCLIARTICULOS (');
        SQL.Add('CODIGOEMPRESA, CODIGOFACTURA, NUMCONCEPTO,');
        SQL.Add('CODIGOARTICULO, REFERENCIA, ');
        SQL.Add('DESCRIPCION, CANTIDAD,');
        SQL.Add('IMPORTEUNIDAD, IMPORTETOTAL)');
        SQL.Add('select ' + IntToStr(CodigoEmpAux) + ', ''' + CodigoAux + ''', NUMCONCEPTO,');
        SQL.Add('CODIGOARTICULO, REFERENCIA, ');
        SQL.Add('DESCRIPCION, CANTIDAD,');
        if TipoFactura = CTE_CF_ABONO then
          SQL.Add('IMPORTEUNIDAD * (-1), IMPORTETOTAL * (-1) ')
        else
          SQL.Add('IMPORTEUNIDAD, IMPORTETOTAL ');

        SQL.Add('from DETALLESCONTRATOSARTICULOS ');
        SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO');
        ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
        Prepare;
        ExecQuery;
      end;
    end;

    RecalcularPreciosFactura(CodigoAux);
    dmTablaFacturasCliente.IncrementarCodigo;
    Result := CodigoAux;
  finally
    oSQL.Close;
    oSQL.Transaction := NIL;
    oSQL.Free;

    oSQL2.Close;
    oSQL2.Transaction := NIL;
    oSQL2.Free;
  end;
end;

function TdmTablaFacturasCliente.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(CODIGO) ');
    SQL.Add('from FACTURASCLIENTE ');
    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 TdmTablaFacturasCliente.InicializarGridFacturasCliContrato(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;
    {Columna FECHAFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAFACTURA';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;
    {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 IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    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;

function TdmTablaFacturasCliente.RecalcularPreciosFactura(
  CodigoFactura: String): Boolean;
var
  oSQL : TIBSQL;

  RE,
  Dto,
  IVA : Integer;
  
  BaseImponible,
  ImporteRE,
  ImporteIVA,
  ImporteDto,
  ImporteTotal : Double;

  CodigoAux : String;
  CodigoEmpAux : String;
begin
  Result := False;
  BaseImponible := 0;
  ImporteTotal := 0;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    try
      // Calcular el total de los conceptos
      with SQL do
      begin
        Add('select sum(IMPORTETOTAL) as TOTAL ');
        Add('from DETALLESFACTURASCLIARTICULOS ');
        Add('where CODIGOFACTURA = :CODIGOFACTURA');
      end;
      ParamByName('CODIGOFACTURA').AsString := CodigoFactura;
      Prepare;
      ExecQuery;
      BaseImponible := FieldByName('TOTAL').AsDouble;

      // Recuperar el RE, dto, IVA y tipo de factura (normal o abono)
      Close;
      with SQL do
      begin
        Clear;
        Add('select RE, DESCUENTO, IVA ');
        Add('from FACTURASCLIENTE ');
        Add('where CODIGO = :CODIGO');
      end;
      ParamByName('CODIGO').AsString := CodigoFactura;
      Prepare;
      ExecQuery;

      RE := FieldByName('RE').AsInteger;
      Dto := FieldByName('DESCUENTO').AsInteger;
      IVA := FieldByName('IVA').AsInteger;

      ImporteRE := BaseImponible * (RE/100);
      ImporteDto := BaseImponible * (Dto/100);
      ImporteTotal := BaseImponible - ImporteDto;
      ImporteIVA := ImporteTotal * (IVA/100);
      ImporteTotal := ImporteTotal + ImporteIVA + ImporteRE;

      // Actualizar la factura
      Close;
      with SQL do
      begin
        Clear;
        Add('update FACTURASCLIENTE set ');
        Add('BASEIMPONIBLE = :BASEIMPONIBLE, ');
        Add('IMPORTERE = :IMPORTERE, ');
        Add('IMPORTEDESCUENTO = :IMPORTEDESCUENTO, ');
        Add('IMPORTEIVA = :IMPORTEIVA, ');
        Add('IMPORTETOTAL = :IMPORTETOTAL ');
        Add('where CODIGO = :CODIGO');
      end;
      ParamByName('CODIGO').AsString := CodigoFactura;
      ParamByName('BASEIMPONIBLE').AsDouble := BaseImponible;
      ParamByName('IMPORTERE').AsDouble :=  ImporteRE;
      ParamByName('IMPORTEDESCUENTO').AsDouble := ImporteDto;
      ParamByName('IMPORTEIVA').AsDouble := ImporteIVA;
      ParamByName('IMPORTETOTAL').AsDouble := ImporteTotal;
      Prepare;
      ExecQuery;

      Result := True;
    finally
      oSQL.Close;
      oSQL.Transaction := NIL;
      oSQL.Free;
    end;
  end;
end;

function TdmTablaFacturasCliente.ExisteFacturaConCliente(Codigo: Variant): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if VarIsNull(Codigo) then
     Exit;

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

function TdmTablaFacturasCliente.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 FACTURASCLIENTE ');
    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;

function TdmTablaFacturasCliente.DarTiposOpDesTrimestral(
  var ListaCodigos: TStrings): TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Result := NIL;
  oSQL := TIBSQL.Create(Self);
  ListaCodigos := TStringList.Create;
  Lista := TStringList.Create;
  //tipTodas
  Lista.Append(msgTipFacturas0);

  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, DESCRIPCION ');
    SQL.Add('from TIPOSFACTURAS ');
    SQL.Add('where ENTIDAD = ''CLIENTE'' ');
    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 TdmTablaFacturasCliente.DarListaAnos: 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(extract(year from FECHAFACTURA)) as ANO ');
    SQL.Add('from FACTURASCLIENTE ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('order by FECHAFACTURA');
    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 TdmTablaFacturasCliente.ExistenFacturas: 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(*) ');
    SQL.Add('from FACTURASCLIENTE ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    try
      Prepare;
      ExecQuery;
      Result := (Fields[0].AsInteger <> 0);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
