unit ffacturas;

interface

uses
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Comp.Client, uFireDacHelper,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.DBGrids, Vcl.StdCtrls,
  Vcl.DBCtrls, Vcl.Mask, Vcl.ExtCtrls, Vcl.ComCtrls, Data.DB, math,
     frxClass, frxDBSet, datos,
  ComObj, Excel2000,
  frxExportPDF, frxExportBaseDialog, wincrypt;

type
  Tfacturas = class(TForm)
    pestaas: TPageControl;
    tabdetalles: TTabSheet;
    Panel8: TPanel;
    Panel9: TPanel;
    btfcancelar: TButton;
    btfmodificar: TButton;
    btfborrar: TButton;
    btfnuevo: TButton;
    btfguardar: TButton;
    btfimprimir: TButton;
    btfimportar: TButton;
    btfsiguiente: TButton;
    btfanterior: TButton;
    Panel10: TPanel;
    Label16: TLabel;
    Label17: TLabel;
    DBText1: TDBText;
    DBText2: TDBText;
    DBText16: TDBText;
    DBText17: TDBText;
    DBText18: TDBText;
    DBText19: TDBText;
    DBText20: TDBText;
    DBText21: TDBText;
    DBText22: TDBText;
    DBText23: TDBText;
    DBText24: TDBText;
    DBText25: TDBText;
    DBText26: TDBText;
    paneldatos: TPanel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    comboseries: TDBLookupComboBox;
    DBEdit10: TDBEdit;
    comboclientes: TDBLookupComboBox;
    combodestinos: TDBLookupComboBox;
    DBEdit11: TDBEdit;
    DBMemo4: TDBMemo;
    Panel12: TPanel;
    Label28: TLabel;
    Label29: TLabel;
    Label30: TLabel;
    Panel13: TPanel;
    DBGrid4: TDBGrid;
    DBEdit12: TDBEdit;
    DBEdit13: TDBEdit;
    DBEdit14: TDBEdit;
    DBEdit15: TDBEdit;
    DBEdit16: TDBEdit;
    DBEdit17: TDBEdit;
    DBEdit18: TDBEdit;
    DBGrid5: TDBGrid;
    Panel14: TPanel;
    Button16: TButton;
    tablistado: TTabSheet;
    DBGrid6: TDBGrid;
    infdetallefactura: TfrxDBDataset;
    inffactura: TfrxDBDataset;
    inffacturaivas: TfrxDBDataset;
    informe: TfrxReport;
    dsfacturas: TDataSource;
    facturas: TFDQuery;
    dsfacturasdetalle: TDataSource;
    facturasdetalle: TFDQuery;
    dsqseries: TDataSource;
    dsqclientes: TDataSource;
    qclientes: TFDQuery;
    qseries: TFDQuery;
    dsqdestinos: TDataSource;
    qdestinos: TFDQuery;
    qdestinoscodigo: TWideStringField;
    qdestinosidcliente: TIntegerField;
    qdestinosidempresa: TIntegerField;
    qdestinosdescripcion: TWideStringField;
    qdestinosseleccionado: TIntegerField;
    qdestinosactivo: TIntegerField;
    qdestinosdireccion: TWideStringField;
    qdestinospoblacion: TWideStringField;
    qdestinoscodpost: TWideStringField;
    qdestinosprovincia: TWideStringField;
    qdestinospais: TWideStringField;
    dsqfacturasiva: TDataSource;
    qfacturasiva: TFDQuery;
    qalbaranes: TFDQuery;
    qalbaranesdetalle: TFDQuery;
    dsqalbaranes: TDataSource;
    dsqalbaranesdetalle: TDataSource;
    facturasid: TIntegerField;
    facturasidempresa: TIntegerField;
    facturasidcliente: TIntegerField;
    facturasiddestino: TWideStringField;
    facturasnif: TWideStringField;
    facturasdireccion: TWideStringField;
    facturaspoblacion: TWideStringField;
    facturasprovincia: TWideStringField;
    facturascodpost: TWideStringField;
    facturasfecha: TDateField;
    facturasreferencia: TWideStringField;
    facturastelefono: TWideStringField;
    facturasnomcliente: TWideStringField;
    facturaspaiscliente: TWideStringField;
    facturasnomdestino: TWideStringField;
    facturasdirecciondestino: TWideStringField;
    facturaspoblaciondestino: TWideStringField;
    facturascodpostdestino: TWideStringField;
    facturasprovinciadestino: TWideStringField;
    facturaspaisdestino: TWideStringField;
    facturasneto: TFloatField;
    facturastotal: TFloatField;
    facturasdocumento: TWideStringField;
    facturasdescuento_lin: TFloatField;
    facturasdescuento_com: TFloatField;
    facturasdescuento_pp: TFloatField;
    facturasdescuento_total: TFloatField;
    facturastotaliva: TFloatField;
    facturasobservaciones: TWideStringField;
    facturasdetalleid: TIntegerField;
    facturasdetalleidempresa: TIntegerField;
    facturasdetalleidfactura: TIntegerField;
    facturasdetalleidarticulo: TWideStringField;
    facturasdetallecal: TWideStringField;
    facturasdetallelote: TWideStringField;
    facturasdetallecantidad: TFloatField;
    facturasdetalleprecio: TFloatField;
    facturasdetalledescuento: TFloatField;
    facturasdetalletotaldescuento: TFloatField;
    facturasdetallebase: TFloatField;
    facturasdetalletipoiva: TFloatField;
    facturasdetalleiva: TFloatField;
    facturasdetalletotal: TFloatField;
    qserieside: TIntegerField;
    qseriesid: TWideStringField;
    qseriesfechainicio: TDateField;
    qseriesfechafin: TDateField;
    qseriesnum_pedcliente: TIntegerField;
    qseriesnum_albaran: TIntegerField;
    qseriesnum_factura: TIntegerField;
    qseriesnum_expedicion: TIntegerField;
    qseriesnum_pedproveedor: TIntegerField;
    qclientesid: TIntegerField;
    qclientesIdempresa: TIntegerField;
    qclientesnif: TWideStringField;
    qclientesnombre: TWideStringField;
    qclientesnombre_corto: TWideStringField;
    qclientesdireccion: TWideStringField;
    qclientespoblacion: TWideStringField;
    qclientescodpost: TWideStringField;
    qclientesprovincia: TWideStringField;
    qclientestelefono: TWideStringField;
    qclientestelefono2: TWideStringField;
    qclientesmovil: TWideStringField;
    qclientesemail: TWideStringField;
    qclientespersonacontacto: TWideStringField;
    qclientescodigomercado: TIntegerField;
    qclientesactivo: TIntegerField;
    qclientesobservaciones: TWideStringField;
    qclientesccontable: TIntegerField;
    qclientesdescuento: TFloatField;
    qclientespais: TWideStringField;
    qalbaranesid: TIntegerField;
    qalbaranesidempresa: TIntegerField;
    qalbaranesidcliente: TIntegerField;
    qalbaranesiddestino: TWideStringField;
    qalbaranesnif: TWideStringField;
    qalbaranesdireccion: TWideStringField;
    qalbaranespoblacion: TWideStringField;
    qalbaranesprovincia: TWideStringField;
    qalbaranescodpost: TWideStringField;
    qalbaranesfecha: TDateField;
    qalbaranesreferencia: TWideStringField;
    qalbaranestelefono: TWideStringField;
    qalbaranesnomcliente: TWideStringField;
    qalbaranespaiscliente: TWideStringField;
    qalbaranesnomdestino: TWideStringField;
    qalbaranesdirecciondestino: TWideStringField;
    qalbaranespoblaciondestino: TWideStringField;
    qalbaranescodpostdestino: TWideStringField;
    qalbaranesprovinciadestino: TWideStringField;
    qalbaranespaisdestino: TWideStringField;
    qalbaranesneto: TFloatField;
    qalbaranestotal: TFloatField;
    qalbaranesfacturado: TIntegerField;
    qalbaranesdocumento: TWideStringField;
    qalbaranesdescuento_lin: TFloatField;
    qalbaranesdescuento_com: TFloatField;
    qalbaranesdescuento_pp: TFloatField;
    qalbaranesdescuento_total: TFloatField;
    qalbaranestotaliva: TFloatField;
    qalbaranesobservaciones: TWideStringField;
    qalbaranesidfactura: TIntegerField;
    qalbaranesdetalleid: TIntegerField;
    qalbaranesdetalleidempresa: TIntegerField;
    qalbaranesdetalleidalbaran: TIntegerField;
    qalbaranesdetalleidarticulo: TWideStringField;
    qalbaranesdetalledescripcion: TWideStringField;
    qalbaranesdetallecal: TWideStringField;
    qalbaranesdetallelote: TWideStringField;
    qalbaranesdetallecantidad: TFloatField;
    qalbaranesdetalleprecio: TFloatField;
    qalbaranesdetalledescuento: TFloatField;
    qalbaranesdetalletotaldescuento: TFloatField;
    qalbaranesdetallebase: TFloatField;
    qalbaranesdetalletipoiva: TFloatField;
    qalbaranesdetalleiva: TFloatField;
    qalbaranesdetalletotal: TFloatField;
    dsqalbaranes2: TDataSource;
    qalbaranes2: TFDQuery;
    dsqalbaranesdetalle2: TDataSource;
    qalbaranesdetalle2: TFDQuery;
    qfacturasivaidfactura: TIntegerField;
    qfacturasivaide: TIntegerField;
    qfacturasivabase: TFloatField;
    qfacturasivatipo: TFloatField;
    qfacturasivaiva: TFloatField;
    qalbaranes2id: TIntegerField;
    qalbaranes2idempresa: TIntegerField;
    qalbaranes2idcliente: TIntegerField;
    qalbaranes2iddestino: TWideStringField;
    qalbaranes2nif: TWideStringField;
    qalbaranes2direccion: TWideStringField;
    qalbaranes2poblacion: TWideStringField;
    qalbaranes2provincia: TWideStringField;
    qalbaranes2codpost: TWideStringField;
    qalbaranes2fecha: TDateField;
    qalbaranes2referencia: TWideStringField;
    qalbaranes2telefono: TWideStringField;
    qalbaranes2nomcliente: TWideStringField;
    qalbaranes2paiscliente: TWideStringField;
    qalbaranes2nomdestino: TWideStringField;
    qalbaranes2direcciondestino: TWideStringField;
    qalbaranes2poblaciondestino: TWideStringField;
    qalbaranes2codpostdestino: TWideStringField;
    qalbaranes2provinciadestino: TWideStringField;
    qalbaranes2paisdestino: TWideStringField;
    qalbaranes2neto: TFloatField;
    qalbaranes2total: TFloatField;
    qalbaranes2facturado: TIntegerField;
    qalbaranes2documento: TWideStringField;
    qalbaranes2descuento_lin: TFloatField;
    qalbaranes2descuento_com: TFloatField;
    qalbaranes2descuento_pp: TFloatField;
    qalbaranes2descuento_total: TFloatField;
    qalbaranes2totaliva: TFloatField;
    qalbaranes2observaciones: TWideStringField;
    qalbaranes2idfactura: TIntegerField;
    qalbaranesdetalle2id: TIntegerField;
    qalbaranesdetalle2idempresa: TIntegerField;
    qalbaranesdetalle2idalbaran: TIntegerField;
    qalbaranesdetalle2idarticulo: TWideStringField;
    qalbaranesdetalle2descripcion: TWideStringField;
    qalbaranesdetalle2cal: TWideStringField;
    qalbaranesdetalle2lote: TWideStringField;
    qalbaranesdetalle2cantidad: TFloatField;
    qalbaranesdetalle2precio: TFloatField;
    qalbaranesdetalle2descuento: TFloatField;
    qalbaranesdetalle2totaldescuento: TFloatField;
    qalbaranesdetalle2base: TFloatField;
    qalbaranesdetalle2tipoiva: TFloatField;
    qalbaranesdetalle2iva: TFloatField;
    qalbaranesdetalle2total: TFloatField;
    qaux: TFDQuery;
    facturasserie: TWideStringField;
    facturasdetalleserie: TWideStringField;
    qalbaranes2serie: TWideStringField;
    qalbaranesdetalle2serie: TWideStringField;
    qalbaranesserie: TWideStringField;
    qalbaranesdetalleserie: TWideStringField;
    qfacturasivaserie: TWideStringField;
    qseriesimp_albaran: TWideStringField;
    qseriesimp_factura: TWideStringField;
    facturasbultos: TFloatField;
    facturaskilos: TFloatField;
    facturasidformapago: TIntegerField;
    Label31: TLabel;
    comboformapago: TDBLookupComboBox;
    qformaspago: TFDQuery;
    dsqformaspago: TDataSource;
    qformaspagoide: TIntegerField;
    qformaspagoid: TIntegerField;
    qformaspagocodigo: TWideStringField;
    qformaspagodescripcion: TWideStringField;
    qformaspagodias: TIntegerField;
    qclientesidformapago: TIntegerField;
    qalbaranesdetallebultos: TFloatField;
    qalbaranesdetalle2bultos: TFloatField;
    dsqarticulos: TDataSource;
    qarticulos: TFDQuery;
    qtipos_iva: TFDQuery;
    DataSource1: TDataSource;
    qtipos_ivaid: TIntegerField;
    qtipos_ivadescripcion: TWideStringField;
    qtipos_ivatipo: TIntegerField;
    qtipos_ivatipo_req: TFloatField;
    qarticulosidempresa: TIntegerField;
    qarticulosid: TIntegerField;
    qarticuloscodigo: TWideStringField;
    qarticulosdescripcion: TWideStringField;
    qarticulosfamilia: TIntegerField;
    qarticulosprovhab: TIntegerField;
    qarticulostipoiva: TIntegerField;
    qarticulospreciocoste: TFloatField;
    qarticulosmargen: TFloatField;
    qarticulosbeneficio: TFloatField;
    qarticulospvp: TFloatField;
    qarticulosstock: TFloatField;
    qarticulosult_preciocompra: TFloatField;
    qarticulosfacturable: TIntegerField;
    qarticulosobservaciones: TWideStringField;
    qarticulosimagen: TBlobField;
    qarticulosactivo: TIntegerField;
    qarticulosvalor_almacen: TFloatField;
    qarticulosstock_minimo: TFloatField;
    qarticulosavisar_stock: TIntegerField;
    qarticuloscontrolar_traza: TIntegerField;
    qarticulospeso: TFloatField;
    listaimpresion: TComboBox;
    facturasdetallebultos: TFloatField;
    Panel11: TPanel;
    gridfacturasaexcel: TDBGrid;
    qfacturasclientes: TFDQuery;
    dsqfacturasclientes: TDataSource;
    SaveDialog1: TSaveDialog;
    qclientesexento_iva: TIntegerField;
    facturascobrado: TIntegerField;
    DBCheckBox2: TDBCheckBox;
    Panel15: TPanel;
    listaclientes: TFDQuery;
    listaclientesnif: TWideStringField;
    listaclientesnomcliente: TWideStringField;
    listadestinos: TFDQuery;
    dslistadestinos: TDataSource;
    dslistacliente: TDataSource;
    listadestinosnomdestino: TWideStringField;
    btfiltrar: TButton;
    frxPDFExport1: TfrxPDFExport;
    qconta_subcta: TFDQuery;
    qconta_subctacuenta: TWideStringField;
    qconta_subctatitulo: TWideStringField;
    qconta_subctanif: TWideStringField;
    qconta_subctadomicilio: TWideStringField;
    qconta_subctapoblacion: TWideStringField;
    qconta_subctaprovincia: TWideStringField;
    qconta_subctacodpost: TWideStringField;
    qconta_subctaint1: TWideStringField;
    qclientes_conta: TFDQuery;
    qclientes_contanif: TWideStringField;
    qclientes_contanombre: TWideStringField;
    qclientes_contadireccion: TWideStringField;
    qclientes_contapoblacion: TWideStringField;
    qclientes_contacodpost: TWideStringField;
    qclientes_contaprovincia: TWideStringField;
    qclientes_contaccontable: TIntegerField;
    qconta_diario: TFDQuery;
    qconta_diarioasiento: TWideStringField;
    qconta_diariofecha: TWideStringField;
    qconta_diariocuenta: TWideStringField;
    qconta_diariocontrapartida: TWideStringField;
    qconta_diarioconcepto: TWideStringField;
    qconta_diariofactura: TWideStringField;
    qconta_diariofecha_recep: TWideStringField;
    qconta_diarioiva: TWideStringField;
    qconta_diariorec_equiv: TWideStringField;
    qconta_diariodocumento: TWideStringField;
    qconta_diarioserie: TWideStringField;
    qconta_diarioaccion: TWideStringField;
    qconta_diariooperacioniva: TWideStringField;
    qconta_diarioorigen: TWideStringField;
    qconta_diariotipoapunte: TWideStringField;
    qconta_diarioimpdebe: TWideStringField;
    qconta_diarioimphaber: TWideStringField;
    qconta_diariobaseimpo: TWideStringField;
    qaux2: TFDQuery;
    qaux2serie: TWideStringField;
    qaux2idfactura: TIntegerField;
    qaux2ide: TIntegerField;
    qaux2base: TFloatField;
    qaux2tipo: TFloatField;
    qaux2iva: TFloatField;
    qclientes_contaid: TIntegerField;
    qconta_diariointerno1: TWideStringField;
    qconta_diariointerno2: TWideStringField;
    qconta_diariointerno3: TWideStringField;
    qconta_diariointerno4: TWideStringField;
    qconta_diariointerno5: TWideStringField;
    qconta_diariointerno6: TWideStringField;
    qconta_diariointerno7: TWideStringField;
    qconta_diariointerno8: TWideStringField;
    qconta_diariointerno9: TWideStringField;
    qconta_diariointerno10: TWideStringField;
    qconta_diariointerno11: TWideStringField;
    qconta_diariointerno12: TWideStringField;
    qconta_diariointerno13: TWideStringField;
    qaux3: TFDQuery;
    WideStringField1: TWideStringField;
    IntegerField1: TIntegerField;
    IntegerField2: TIntegerField;
    FloatField1: TFloatField;
    FloatField2: TFloatField;
    FloatField3: TFloatField;
    facturasdetalleidalbaran: TIntegerField;
    btacumulados: TButton;
    DBGridacumulados: TDBGrid;
    dsfacturasacumuladas: TDataSource;
    facturasacumuladas: TFDQuery;
    facturasacumuladasidempresa: TIntegerField;
    facturasacumuladasidcliente: TIntegerField;
    facturasacumuladasnif: TWideStringField;
    facturasacumuladasnomcliente: TWideStringField;
    facturasacumuladassumtotal: TFloatField;
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    facturascc_pago: TWideStringField;
    facturasccid: TIntegerField;
    facturascccuentabancaria: TWideStringField;
    Label9: TLabel;
    Label3: TLabel;
    Label8: TLabel;
    Label10: TLabel;
    combocuenta: TDBLookupComboBox;
    Label4: TLabel;
    DBText3: TDBText;
    Label5: TLabel;
    costetrans: TDBEdit;
    DBText4: TDBText;
    DBText5: TDBText;
    DBText6: TDBText;
    DBText7: TDBText;
    Label6: TLabel;
    comision: TDBEdit;
    Label7: TLabel;
    facturascomision: TFloatField;
    facturascoste_transporte: TFloatField;
    facturaspeso_bruto: TFloatField;
    facturasprov_transporte: TWideStringField;
    facturaskilosventa: TFloatField;
    facturasnumpalets: TFloatField;
    facturasdetallecoste_transporte: TFloatField;
    facturasdetallecoste_otros: TFloatField;
    facturasdetallecoste_comision: TFloatField;
    Button2: TButton;
    Button5: TButton;
    qcuentas: TFDQuery;
    qcuentaside: TIntegerField;
    qcuentasid: TIntegerField;
    qcuentasbanco: TWideStringField;
    qcuentascciban: TWideStringField;
    qcuentasccentidad: TWideStringField;
    qcuentasccoficina: TWideStringField;
    qcuentasccdc: TWideStringField;
    qcuentascccc: TWideStringField;
    dsqcuentas: TDataSource;
    qalbaranesdetallecoste_transporte: TFloatField;
    qalbaranesdetallecoste_otros: TFloatField;
    qalbaranesdetallecoste_comision: TFloatField;
    qalbaranesdetalle2coste_transporte: TFloatField;
    qalbaranesdetalle2coste_otros: TFloatField;
    qalbaranesdetalle2coste_comision: TFloatField;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Label11: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    comboserie2: TDBLookupComboBox;
    Label34: TLabel;
    Label35: TLabel;
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    Label32: TLabel;
    Label33: TLabel;
    combolistcliente: TDBLookupComboBox;
    Button8: TButton;
    combolistdestinos: TDBLookupComboBox;
    Button7: TButton;
    Button3: TButton;
    Button9: TButton;
    dsqseries2: TDataSource;
    qseries2: TFDQuery;
    qseries2ide: TIntegerField;
    qseries2id: TWideStringField;
    qseries2fechainicio: TDateField;
    qseries2fechafin: TDateField;
    qseries2num_pedcliente: TIntegerField;
    qseries2num_albaran: TIntegerField;
    qseries2num_factura: TIntegerField;
    qseries2num_expedicion: TIntegerField;
    qseries2num_pedproveedor: TIntegerField;
    qseries2imp_albaran: TWideStringField;
    qseries2imp_factura: TWideStringField;
    qseries2activo: TIntegerField;
    qseries2num_presupuesto: TIntegerField;
    facturasdetallepesobruto: TFloatField;
    facturasdetalledescripcion: TWideStringField;
    Button4: TButton;
    qfacturasclientesserie: TWideStringField;
    qfacturasclientesid: TIntegerField;
    qfacturasclientesidempresa: TIntegerField;
    qfacturasclientesidcliente: TIntegerField;
    qfacturasclientesiddestino: TWideStringField;
    qfacturasclientesnif: TWideStringField;
    qfacturasclientesdireccion: TWideStringField;
    qfacturasclientespoblacion: TWideStringField;
    qfacturasclientesprovincia: TWideStringField;
    qfacturasclientescodpost: TWideStringField;
    qfacturasclientesfecha: TDateField;
    qfacturasclientesreferencia: TWideStringField;
    qfacturasclientestelefono: TWideStringField;
    qfacturasclientesnomcliente: TWideStringField;
    qfacturasclientespaiscliente: TWideStringField;
    qfacturasclientesnomdestino: TWideStringField;
    qfacturasclientesdirecciondestino: TWideStringField;
    qfacturasclientespoblaciondestino: TWideStringField;
    qfacturasclientescodpostdestino: TWideStringField;
    qfacturasclientesprovinciadestino: TWideStringField;
    qfacturasclientespaisdestino: TWideStringField;
    qfacturasclientesneto: TFloatField;
    qfacturasclientestotal: TFloatField;
    qfacturasclientescobrado: TIntegerField;
    qfacturasclientesdocumento: TWideStringField;
    qfacturasclientesdescuento_lin: TFloatField;
    qfacturasclientesdescuento_com: TFloatField;
    qfacturasclientesdescuento_pp: TFloatField;
    qfacturasclientesdescuento_total: TFloatField;
    qfacturasclientestotaliva: TFloatField;
    qfacturasclientesobservaciones: TWideStringField;
    qfacturasclientesbultos: TFloatField;
    qfacturasclienteskilos: TFloatField;
    qfacturasclientesidformapago: TIntegerField;
    qfacturasclientescc_pago: TWideStringField;
    qfacturasclientesccid: TIntegerField;
    qfacturasclientescccuentabancaria: TWideStringField;
    qfacturasclientescomision: TFloatField;
    qfacturasclientescoste_transporte: TFloatField;
    qfacturasclientespeso_bruto: TFloatField;
    qfacturasclientesprov_transporte: TWideStringField;
    qfacturasclienteskilosventa: TFloatField;
    qfacturasclientesnumpalets: TFloatField;
    qfacturasclientesid_1: TIntegerField;
    qfacturasclientesidempresa_1: TIntegerField;
    qfacturasclientesserie_1: TWideStringField;
    qfacturasclientesidfactura: TIntegerField;
    qfacturasclientesidarticulo: TWideStringField;
    qfacturasclientesdescripcion: TWideStringField;
    qfacturasclientescal: TWideStringField;
    qfacturasclienteslote: TWideStringField;
    qfacturasclientesbultos_1: TFloatField;
    qfacturasclientescantidad: TFloatField;
    qfacturasclientesprecio: TFloatField;
    qfacturasclientesdescuento: TFloatField;
    qfacturasclientestotaldescuento: TFloatField;
    qfacturasclientesbase: TFloatField;
    qfacturasclientestipoiva: TFloatField;
    qfacturasclientesiva: TFloatField;
    qfacturasclientestotal_1: TFloatField;
    qfacturasclientesidalbaran: TIntegerField;
    qfacturasclientescoste_otros: TFloatField;
    qfacturasclientescoste_comision: TFloatField;
    qfacturasclientespesobruto: TFloatField;
    qfacturasclientesparcela: TWideStringField;
    qfacturasclientes2: TFDQuery;
    dsqfacturasclientes2: TDataSource;
    gridfacturasaexcel2: TDBGrid;
    qfacturasclientes2serie: TWideStringField;
    qfacturasclientes2id: TIntegerField;
    qfacturasclientes2idempresa: TIntegerField;
    qfacturasclientes2idcliente: TIntegerField;
    qfacturasclientes2iddestino: TWideStringField;
    qfacturasclientes2nif: TWideStringField;
    qfacturasclientes2direccion: TWideStringField;
    qfacturasclientes2poblacion: TWideStringField;
    qfacturasclientes2provincia: TWideStringField;
    qfacturasclientes2codpost: TWideStringField;
    qfacturasclientes2fecha: TDateField;
    qfacturasclientes2referencia: TWideStringField;
    qfacturasclientes2telefono: TWideStringField;
    qfacturasclientes2nomcliente: TWideStringField;
    qfacturasclientes2paiscliente: TWideStringField;
    qfacturasclientes2nomdestino: TWideStringField;
    qfacturasclientes2direcciondestino: TWideStringField;
    qfacturasclientes2poblaciondestino: TWideStringField;
    qfacturasclientes2codpostdestino: TWideStringField;
    qfacturasclientes2provinciadestino: TWideStringField;
    qfacturasclientes2paisdestino: TWideStringField;
    qfacturasclientes2neto: TFloatField;
    qfacturasclientes2total: TFloatField;
    qfacturasclientes2cobrado: TIntegerField;
    qfacturasclientes2documento: TWideStringField;
    qfacturasclientes2descuento_lin: TFloatField;
    qfacturasclientes2descuento_com: TFloatField;
    qfacturasclientes2descuento_pp: TFloatField;
    qfacturasclientes2descuento_total: TFloatField;
    qfacturasclientes2totaliva: TFloatField;
    qfacturasclientes2observaciones: TWideStringField;
    qfacturasclientes2bultos: TFloatField;
    qfacturasclientes2kilos: TFloatField;
    qfacturasclientes2idformapago: TIntegerField;
    qfacturasclientes2cc_pago: TWideStringField;
    qfacturasclientes2ccid: TIntegerField;
    qfacturasclientes2cccuentabancaria: TWideStringField;
    qfacturasclientes2comision: TFloatField;
    qfacturasclientes2coste_transporte: TFloatField;
    qfacturasclientes2peso_bruto: TFloatField;
    qfacturasclientes2prov_transporte: TWideStringField;
    qfacturasclientes2kilosventa: TFloatField;
    qfacturasclientes2numpalets: TFloatField;
    qfacturasclientes2serie_1: TWideStringField;
    qfacturasclientes2idfactura: TIntegerField;
    qfacturasclientes2ide: TIntegerField;
    qfacturasclientes2base: TFloatField;
    qfacturasclientes2tipo: TFloatField;
    qfacturasclientes2iva: TFloatField;
    Button6: TButton;
    comboformulario: TDBLookupComboBox;
    dsqformularios: TDataSource;
    qformularios: TFDQuery;
    qformularioside: TIntegerField;
    qformulariosid: TIntegerField;
    qformulariosformulario: TWideStringField;
    qformulariosdescripcion: TWideStringField;
    qformulariosaplicar_a: TWideStringField;
    qformulariospordefecto: TIntegerField;
    infformaspago: TfrxDBDataset;
    facturasdetalletipore: TFloatField;
    facturasdetallere: TFloatField;
    qfacturasivare: TFloatField;
    qfacturasivatipore: TFloatField;
    DBEdit1: TDBEdit;
    Label12: TLabel;
    facturastotalre: TFloatField;
    qfacturasclientes2transporte_kilo: TFloatField;
    qfacturasclientescoste_transporte_1: TFloatField;
    qalbaranesdetallepesobruto: TFloatField;
    qalbaranesdetalleidfactura: TIntegerField;
    qalbaranesdetalle2pesobruto: TFloatField;
    qalbaranesdetalle2idfactura: TIntegerField;
    facturasretencion: TFloatField;
    facturastotalretencion: TFloatField;
    Label13: TLabel;
    Label14: TLabel;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    qalbaranesbultos: TFloatField;
    qalbaraneskilos: TFloatField;
    qalbaranesidformapago: TIntegerField;
    qalbaranescc_pago: TWideStringField;
    qalbaranescoste_transporte: TFloatField;
    qalbaranespeso_bruto: TFloatField;
    qalbaranesprov_transporte: TWideStringField;
    qalbaranesccid: TIntegerField;
    qalbaranescccuentabancaria: TWideStringField;
    qalbaranescomision: TFloatField;
    qalbaraneskilosventa: TFloatField;
    qalbaranesnumpalets: TFloatField;
    facturasdetallepalets: TFloatField;
    facturasfacturarporbultos: TIntegerField;
    DBCheckBox1: TDBCheckBox;
    qcalcularporbultos: TFDQuery;
    WideStringField2: TWideStringField;
    IntegerField3: TIntegerField;
    IntegerField4: TIntegerField;
    FloatField4: TFloatField;
    FloatField5: TFloatField;
    FloatField6: TFloatField;
    qcalcularporcantidad: TFDQuery;
    WideStringField3: TWideStringField;
    IntegerField5: TIntegerField;
    IntegerField6: TIntegerField;
    FloatField7: TFloatField;
    FloatField8: TFloatField;
    FloatField9: TFloatField;
    facturasdetallegrupo: TFDQuery;
    facturasdetalleresumen: TFDQuery;
    facturasdetallegrupoidempresa: TIntegerField;
    facturasdetallegrupoidfactura: TIntegerField;
    facturasdetallegrupocantidad: TFloatField;
    facturasdetallegrupoprecio: TFloatField;
    facturasdetallegrupodescuento: TFloatField;
    facturasdetallegrupobase: TFloatField;
    facturasdetallegrupodescripcion: TWideStringField;
    facturasdetallegrupocal: TWideStringField;
    facturasdetallegrupobultos: TFloatField;
    facturasdetallegrupotipoiva: TFloatField;
    facturasdetallegrupoiva: TFloatField;
    facturasdetallegrupototal: TFloatField;
    facturasdetallegrupoid: TIntegerField;
    facturasdetallegrupoidarticulo: TWideStringField;
    facturasdetallegrupototaldescuento: TFloatField;
    facturasdetallegrupolote: TWideStringField;
    facturasdetallegruposerie: TWideStringField;
    facturasdetallegrupoidalbaran: TIntegerField;
    facturasdetallegrupocoste_transporte: TFloatField;
    facturasdetallegrupocoste_otros: TFloatField;
    facturasdetallegrupocoste_comision: TFloatField;
    facturasdetallegrupopesobruto: TFloatField;
    facturasdetallegrupotipore: TFloatField;
    facturasdetallegrupore: TFloatField;
    facturasdetallegrupopalets: TFloatField;
    facturasdetalleresumenid: TIntegerField;
    facturasdetalleresumenidempresa: TIntegerField;
    facturasdetalleresumenidfactura: TIntegerField;
    facturasdetalleresumencantidad: TFloatField;
    facturasdetalleresumenprecio: TFloatField;
    facturasdetalleresumendescuento: TFloatField;
    facturasdetalleresumenbase: TFloatField;
    facturasdetalleresumendescripcion: TWideStringField;
    facturasdetalleresumencal: TWideStringField;
    facturasdetalleresumenbultos: TFloatField;
    facturasdetalleresumentipoiva: TFloatField;
    facturasdetalleresumeniva: TFloatField;
    facturasdetalleresumentotal: TFloatField;
    facturasdetalleresumenidarticulo: TWideStringField;
    facturasdetalleresumentotaldescuento: TFloatField;
    facturasdetalleresumenlote: TWideStringField;
    facturasdetalleresumenserie: TWideStringField;
    facturasdetalleresumenidalbaran: TIntegerField;
    facturasdetalleresumencoste_transporte: TFloatField;
    facturasdetalleresumencoste_otros: TFloatField;
    facturasdetalleresumencoste_comision: TFloatField;
    facturasdetalleresumenpesobruto: TFloatField;
    facturasdetalleresumentipore: TFloatField;
    facturasdetalleresumenre: TFloatField;
    facturasdetalleresumenpalets: TFloatField;
    dsqfacturasdetalleresumen: TDataSource;
    inffacturasresumen: TfrxDBDataset;
    qactualizarids: TFDQuery;
    qborraridfacturaids: TFDQuery;
    Button10: TButton;
    qfacturasagrupado: TFDQuery;
    qfacturasagrupadoidempresa: TIntegerField;
    qfacturasagrupadoserie: TWideStringField;
    qfacturasagrupadoidfactura: TIntegerField;
    qfacturasagrupadoidcliente: TIntegerField;
    qfacturasagrupadocliente: TWideStringField;
    qfacturasagrupadodescripcion: TWideStringField;
    qfacturasagrupadolote: TWideStringField;
    qfacturasagrupadocajas: TFloatField;
    qfacturasagrupadoenvase: TWideStringField;
    qfacturasagrupadoreferencia: TWideStringField;
    qfacturasagrupadoformato: TWideStringField;
    qfacturasagrupadokilos: TFloatField;
    qfacturasagrupadopreciokilo: TFloatField;
    qfacturasagrupadopreciocaja: TFloatField;
    qfacturasagrupadototal: TFloatField;
    qfacturasagrupadovariedad: TWideStringField;
    qfacturasagrupadoorigen: TWideStringField;
    qfacturasagrupadoparcela: TWideStringField;
    dsqfacturasagrupado: TDataSource;
    gridagrupados: TDBGrid;
    Button11: TButton;
    Button12: TButton;
    procedure dsfacturasStateChange(Sender: TObject);
    procedure dsfacturasDataChange(Sender: TObject; Field: TField);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure btfimportarClick(Sender: TObject);
    procedure btfnuevoClick(Sender: TObject);
    procedure comboseriesCloseUp(Sender: TObject);
    procedure comboseriesEnter(Sender: TObject);
    procedure comboclientesCloseUp(Sender: TObject);
    procedure alba(Sender: TObject);
    procedure combodestinosCloseUp(Sender: TObject);
    procedure btfborrarClick(Sender: TObject);
    procedure btfmodificarClick(Sender: TObject);
    procedure btfguardarClick(Sender: TObject);
    procedure facturasdetalleBeforePost(DataSet: TDataSet);
    procedure facturasdetalleAfterPost(DataSet: TDataSet);
    procedure Button16Click(Sender: TObject);
    procedure DBGrid6TitleClick(Column: TColumn);
    procedure btfcancelarClick(Sender: TObject);
    procedure btfanteriorClick(Sender: TObject);
    procedure btfsiguienteClick(Sender: TObject);
    procedure btfimprimirClick(Sender: TObject);
    procedure DBGrid5KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBGrid5ColExit(Sender: TObject);
    procedure qarticulosBeforeOpen(DataSet: TDataSet);
    procedure Button3Click(Sender: TObject);
    procedure tablistadoShow(Sender: TObject);
    procedure btfiltrarClick(Sender: TObject);
    procedure DBGrid6DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure btacumuladosClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure dsqseries2DataChange(Sender: TObject; Field: TField);
    procedure Button4Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure qfacturasclientes2CalcFields(DataSet: TDataSet);
    procedure qfacturasclientesCalcFields(DataSet: TDataSet);
    procedure facturasBeforeDelete(DataSet: TDataSet);
    procedure facturasBeforePost(DataSet: TDataSet);
    procedure DBGrid6DblClick(Sender: TObject);
    procedure facturasdetalleBeforeDelete(DataSet: TDataSet);
    procedure Button10Click(Sender: TObject);
    procedure btncargarcertificadosClick(Sender: TObject);
  private
    { Private declarations }
    procedure CalcularYGuardarHuella;
  public
    { Public declarations }
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid;
      ProgressBarXls: TProgressBar = nil);


  end;

var
  facturas: Tfacturas;
  filtro, iddetalle: string;

implementation

{$R *.dfm}

uses fselectalbaranes, fbuscararticulos, ftraza_materiales2, certificatemanager;

procedure Tfacturas.ExportaraExcel(FileNameXLS, SheetName: String;
  DBGrid: TDBGrid; ProgressBarXls: TProgressBar);

  procedure ProgressBarInit;
  begin
    ProgressBarXls.Max := DBGrid.DataSource.DataSet.RecordCount;
    ProgressBarXls.Position := 0;
    ProgressBarXls.Visible := True;
  end;

const
  xlWBATworksheet = -4167;
var
  Excel, WorkBook, WorkSheet: OleVariant;
  I, J: Integer;
  PBookmark: TBookmark;
begin
  // Guardar la posicin en la DB y desactivar que se mueva el registro
  PBookmark := DBGrid.DataSource.DataSet.GetBookmark;
  DBGrid.DataSource.DataSet.DisableControls;
  DBGrid.DataSource.DataSet.First;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarInit;

  // Crear instancia de la aplicacin Excel
  Excel := CreateOleObject('Excel.Application');

  // Evitar que nos pregunte si deseamos sobreescribir el archivo
  Excel.DisplayAlerts := False;

  // Agregar libro de trabajo
  WorkBook := Excel.Workbooks.Add(xlWBATworksheet);

  // Tomar una referencia a la hoja creada
  WorkSheet := WorkBook.WorkSheets[1];

  // Se  describe el nombre de la hoja
  WorkSheet.Name := SheetName;

  // Llenamos las celdas
  // Toma en cuenta que las columnas y filas empiezan en 1, y que en el
  // WorkSheet.Cells[I, J], I es la fila y J es la columna.

  // Extrae los nombres de los campos del DBGrid y los coloca en el primer registro,
  // excluyendo los campos que estn ocultos
  for J := 0 to DBGrid.FieldCount - 1 do
    if DBGrid.Fields[J].Visible then
    begin
      // Poner la fuente de letra en Negrita
      WorkSheet.Cells[1, J + 1].Font.Bold := True;
      // Centrar la celda
      // WorkSheet.Cells[1, J +1].HorizontalAlignment := xlCenter;
      // Asignamos Valor del titulo del DBrid
      WorkSheet.Cells[1, J + 1] := DBGrid.Columns[J].Title.Caption;
    end;

  // Guardar los registros
  for I := 0 to DBGrid.DataSource.DataSet.RecordCount - 1 do
  begin
    // Identificamos los campos y lo grabamos segn su tipo
    for J := 0 to DBGrid.FieldCount - 1 do
      case DBGrid.Fields[J].DataType of
        ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numrico
          WorkSheet.Cells[I + 2, J + 1] := DBGrid.Fields[J].AsInteger;
        ftBCD, ftFloat, ftCurrency: // Numrico con decimales
          WorkSheet.Cells[I + 2, J + 1] := DBGrid.Fields[J].AsFloat;
        ftDateTime, ftDate, ftTime: // Fecha y Hora
          WorkSheet.Cells[I + 2, J + 1] := DBGrid.Fields[J].AsDateTime;
      else // Todo lo demas caracteres
        WorkSheet.Cells[I + 2, J + 1] := DBGrid.Fields[J].AsString;
      end;

    // Saltamos de registro
    DBGrid.DataSource.DataSet.Next;

    // Comprobar si existe el component TProgressBar
    if (ProgressBarXls <> nil) then
      ProgressBarXls.Position := ProgressBarXls.Position + 1;
  end;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarXls.Visible := False;

  // Redimensionar todas las celdas para que esten segn su tamao
  WorkSheet.Cells.Columns.AutoFit;

  // Guardar el archivo
  WorkBook.SaveAs(FileNameXLS);

  // Cierra el archivo
  WorkBook.Close(FileNameXLS);

  // Salir de Excel
  Excel.Quit;

  // posicionar el registro donde estaba
  DBGrid.DataSource.DataSet.GotoBookmark(PBookmark);
  DBGrid.DataSource.DataSet.FreeBookmark(PBookmark);
  DBGrid.DataSource.DataSet.EnableControls;
end;

procedure Tfacturas.btfcancelarClick(Sender: TObject);
begin
  facturas.Cancel;
  paneldatos.Enabled := False;
  pestaas.TabIndex := 0;
end;

procedure Tfacturas.btfguardarClick(Sender: TObject);
var
  empresa, serie, id: string;
begin
  empresa := facturasidempresa.AsString;
  serie := facturasserie.AsString;
  id := facturasid.AsString;
  qaux.sql.clear;
  facturas.Post;
  if facturasfacturarporbultos.asinteger=1 then
  begin
    qcalcularporbultos.prepare;
    qcalcularporbultos.ParamByName('FACTURA').AsInteger:=facturasid.AsInteger;
    qcalcularporbultos.ParamByName('EMPRESA').AsInteger:=facturasidempresa.AsInteger;
    qcalcularporbultos.ParamByName('SERIE').AsString:=facturasserie.AsString;
  qcalcularporbultos.ExecSQL;
  end;
  if facturasfacturarporbultos.asinteger=0 then
  begin
    qcalcularporcantidad.prepare;
    qcalcularporcantidad.ParamByName('FACTURA').AsInteger:=facturasid.AsInteger;
    qcalcularporcantidad.ParamByName('EMPRESA').AsInteger:=facturasidempresa.AsInteger;
    qcalcularporcantidad.ParamByName('SERIE').AsString:=facturasserie.AsString;
    qcalcularporcantidad.ExecSQL;
  end;
  comboserie2.KeyValue := facturasserie.AsString;
  qaux.sql.clear;
  qaux.sql.Add('select max(id) from facturas where idempresa=' + empresa +
    ' and serie=' + '''' + serie + '''');
  qaux.Open;
  qseries.edit;
  qseriesnum_factura.Value := qaux.Fields[0].AsInteger + 1;
  qseries.Post;

  facturasdetalle.Open;
  qfacturasiva.Open;
  facturas.Refresh;
  facturasdetalle.Refresh;
  facturas.Locate('serie,id', vararrayof([serie, id]), [locaseinsensitive]);

  qfacturasiva.Open;
  qfacturasiva.Refresh;
  Panel3.Enabled := False;
  comboserie2.KeyValue := qseriesid.AsString;
  facturas.Close;
  facturas.sql.clear;
  facturas.sql.Add('select * from facturas where serie=' + '''' + serie + '''' +
    ' order by serie desc,id desc');
  facturas.Open;
  facturas.Locate('serie,id', vararrayof([serie, id]), [locaseinsensitive]);

  qfacturasiva.Refresh;
  paneldatos.Enabled := False;
end;

procedure Tfacturas.btfimportarClick(Sender: TObject);
var
  empresa,idfactura,idalbaran:string;
  serie,pesobruto,pesoneto,pesonetoteorico,numpalets:string;
begin
  seleccionaralbaranes := Tseleccionaralbaranes.Create(nil);
  try
    seleccionaralbaranes.showmodal();
  finally
    seleccionaralbaranes.Free;
  end;
  empresa := facturasidempresa.AsString;
  idfactura := facturasid.AsString;
  serie := facturasserie.AsString;
  facturas.Refresh;
  facturas.Locate('serie;id', vararrayof([serie, idfactura]),
    [locaseinsensitive]);
  qfacturasiva.Refresh;
  qborraridfacturaids.Close;
  qborraridfacturaids.Prepare;
  qborraridfacturaids.ParamByName('EMPRESA').Asstring:=empresa;
  qborraridfacturaids.ParamByName('IDFACTURA').Asstring:=serie+'/'+idfactura;
  qborraridfacturaids.ExecSQL;
  qactualizarids.Close;
  qactualizarids.Prepare;
  qactualizarids.ParamByName('IDFACTURA').AsString:=serie+'/'+idfactura;
  qactualizarids.ParamByName('SERIE').Asstring:=serie;
  qactualizarids.ParamByName('EMPRESA').Asstring:=empresa;
  qactualizarids.ParamByName('FACTURA').Asstring:=idfactura;
  qactualizarids.ExecSQL;
  qaux.close;
  qaux.SQL.Clear;
  qaux.SQL.Add('select sum(peso_bruto-tara0),sum(peso_neto),sum(peso_neto_teorico),sum(num_palets) from  ea_pesadas where idfactura='+''''+serie+'/'+idfactura+''''+' and idempresa='+facturasidempresa.asstring);
  qaux.open;
  pesobruto:=qaux.fields[0].asstring;
  pesobruto:=stringreplace(pesobruto,',','.',[rfreplaceall]);
  pesoneto:=qaux.fields[1].asstring;
  pesoneto:=stringreplace(pesoneto,',','.',[rfreplaceall]);
  pesonetoteorico:=qaux.fields[2].asstring;
  pesonetoteorico:=stringreplace(pesonetoteorico,',','.',[rfreplaceall]);
  numpalets:=qaux.fields[3].asstring;
  numpalets:=stringreplace(numpalets,',','.',[rfreplaceall]);
  qaux.SQL.Clear;
  qaux.SQL.Add('update facturas set peso_bruto='+pesobruto+',kilos='+pesoneto+',kilosventa='+pesonetoteorico+',numpalets='+numpalets+' where serie='+''''+serie+''''+' and id='+idfactura+' and idempresa='+facturasidempresa.AsString);
  qaux.execsql;
  facturas.refresh;
  facturas.Locate('serie,id',vararrayof([serie,idfactura]),[locaseinsensitive])
end;

procedure Tfacturas.btfimprimirClick(Sender: TObject);
var
  filtro, documento, formapago, pesobruto: string;
  desg_ivas, tipo, tipore, base, iva, re: string;
  x: Integer;
  fecha: tdate;
begin
  pestaas.TabIndex := 1;
  facturasdetalleresumen.close;
  facturasdetalleresumen.prepare;
  facturasdetalleresumen.ParamByName('SERIE').AsString:=facturasserie.AsString;
  facturasdetalleresumen.ParamByName('IDFACTURA').AsInteger:=facturasid.Asinteger;
  facturasdetalleresumen.ParamByName('EMPRESA').AsInteger:=facturasidempresa.AsInteger;
  facturasdetalleresumen.Open;
  if listaimpresion.ItemIndex = 0 then
  begin

//    facturasdetalle.sql.clear;
//    facturasdetalle.sql.Add
//      ('select idempresa,idfactura,sum(cantidad) as cantidad,precio,descuento,sum(base) as base,descripcion,cal,sum(bultos) as bultos,tipoiva,sum(iva) as iva,sum(total) as total,id,'
//      + '''''' + ' as idarticulo,sum(totaldescuento) as totaldescuento,' +
//      '''''' + ' as lote,serie,idalbaran ');
//    facturasdetalle.sql.Add
//      (',coste_transporte,coste_otros,coste_comision,sum(pesobruto) as pesobruto,tipore,re,sum(palets) as palets from facturas_detalles group by idempresa,idfactura,descripcion,cal,precio,idalbaran order by id');
    facturasdetallegrupo.Close;
    facturasdetallegrupo.prepare;
    facturasdetallegrupo.ParamByName('SERIE').AsString:=facturasserie.AsString;
    facturasdetallegrupo.ParamByName('IDFACTURA').AsInteger:=facturasid.Asinteger;
    facturasdetallegrupo.ParamByName('EMPRESA').AsInteger:=facturasidempresa.AsInteger;
    facturasdetallegrupo.Open;
    dsfacturasdetalle.DataSet:=facturasdetallegrupo;
  end;
  if listaimpresion.ItemIndex = 1 then
  begin
    facturasdetalle.Close;
    facturasdetalle.prepare;
    facturasdetalle.ParamByName('SERIE').AsString:=facturasserie.AsString;
    facturasdetalle.ParamByName('IDFACTURA').AsInteger:=facturasid.Asinteger;
    facturasdetalle.ParamByName('EMPRESA').AsInteger:=facturasidempresa.AsInteger;
    facturasdetalle.Open;
    dsfacturasdetalle.DataSet:=facturasdetalle;
  end;

  filtro := 'id=';
  filtro := filtro + facturasid.AsString;
  filtro := filtro + ' and serie=' + '''' + facturasserie.AsString + '''';
  if comboformulario.KeyValue = null then
    documento := qseriesimp_factura.AsString
  else
  documento := qformulariosformulario.AsString;
  facturas.Filter := filtro;
  facturas.filtered := True;
  fecha := facturasfecha.AsDateTime;
  fecha := fecha + qformaspagodias.AsInteger;
  formapago := 'FORMA DE PAGO: ' + qformaspagodescripcion.AsString +
    ' FECHA DE VENCIMIENTO EL ' + DATETOSTR(fecha);
  pesobruto := 'PESO BRUTO: ' + facturaspeso_bruto.AsString;
  qfacturasiva.First;
  desg_ivas := '';
  while not qfacturasiva.Eof do
  begin
    if qfacturasivabase.AsFloat <> 0 then
    begin
      tipo := format('%2d', [qfacturasivatipo.AsInteger]);
      tipore := format('%4.2f', [qfacturasivatipore.AsFloat]);
      base := format('%10.2f', [qfacturasivabase.AsFloat]);
      iva := format('%8.2f', [qfacturasivaiva.AsFloat]);
      re := format('%8.2f', [qfacturasivare.AsFloat]);
      desg_ivas := desg_ivas + base + '   ' + tipo + ' ' + iva + ' ' + tipore
        + ' ' + re;
    end;
    qfacturasiva.Next;
  end;
  inffactura.DataSource := dsfacturas;
  infdetallefactura.DataSource := dsfacturasdetalle;
  inffacturasresumen.DataSource := dsqfacturasdetalleresumen;


  informe.Report.clear;
  informe.LoadFromFile('c:\agrigest\informes\' + documento + '.fr3');
  informe.Variables.Variables['FORMAPAGO'] := QUOTEDSTR(formapago);
  informe.Variables.Variables['DESGIVAS'] := QUOTEDSTR(desg_ivas);
  informe.Variables.Variables['PESOBRUTO'] := QUOTEDSTR(pesobruto);

  informe.ShowReport();
  informe.clear;
  // informe.Variables.Variables['TITULO']:=QUOTEDSTR(panel100.Caption);
  dsfacturasdetalle.DataSet:=facturasdetalle;
  facturas.filtered := false;
end;

procedure Tfacturas.btfmodificarClick(Sender: TObject);
begin
  pestaas.TabIndex := 0;
  paneldatos.Enabled := True;
  facturas.edit;
  qclientes.Close;
  qclientes.sql.clear;
  qclientes.sql.Add('select * from clientes order by nombre');
  qclientes.Open;
  qdestinos.Close;
  qdestinos.sql.clear;
  qdestinos.sql.Add('select * from clientes_destinos order by descripcion');
  qdestinos.Open;
end;

procedure Tfacturas.btacumuladosClick(Sender: TObject);
var
  dia, mes, anyo: Word;
  filtro, filtro2, tdesde, thasta: string;
begin
  decodedate(fdesde.Date, anyo, mes, dia);
  tdesde := '''' + floattostr(anyo) + '/' + floattostr(mes) + '/' +
    floattostr(dia) + '''';
  decodedate(fhasta.Date, anyo, mes, dia);
  thasta := '''' + floattostr(anyo) + '/' + floattostr(mes) + '/' +
    floattostr(dia) + '''';
  filtro := ' where fecha>=' + tdesde + ' and fecha<=' + thasta;
  if (combolistcliente.Text <> '') and (combolistcliente.Text <> ' TODOS') then
  begin
    filtro := filtro + ' and nif=' + '''' + listaclientesnif.AsString + '''';
  end;
  if (combolistdestinos.Text <> '') and (combolistdestinos.Text <> ' TODOS')
  then
  begin
    filtro := filtro + ' and nomdestino=' + '''' +
      listadestinosnomdestino.AsString + '''';
  end;
  filtro := filtro + ' group by idcliente order by nomcliente';
  facturasacumuladas.Close;
  facturasacumuladas.sql.clear;
  facturasacumuladas.sql.Add
    ('select idempresa,idcliente,nif,nomcliente,sum(total) from facturas '
    + filtro);
  facturasacumuladas.Open;
  DBGridacumulados.BringToFront;
  DBGrid6.Visible := False;
  DBGridacumulados.Visible := True;

end;

procedure Tfacturas.btfanteriorClick(Sender: TObject);
begin
  facturas.Next;
end;

procedure Tfacturas.btfborrarClick(Sender: TObject);
begin
  pestaas.TabIndex := 1;
  facturasdetalle.Open;
  if facturas.RecordCount > 0 then
  begin
    facturas.Delete;
    facturasdetalle.Refresh;
    qalbaranes.Refresh;
    qalbaranes2.Refresh;
    qalbaranesdetalle.Refresh;
    qalbaranesdetalle2.Refresh;
    qfacturasiva.Refresh;
  end;
end;

procedure Tfacturas.btfnuevoClick(Sender: TObject);
begin
  pestaas.TabIndex := 0;
  paneldatos.Enabled := True;
  comboseries.SetFocus;
  comboseries.KeyValue := qseriesid.AsString;
  // fechaalbaran.Date:=date;

  facturas.Append;
  qclientes.Close;
  qclientes.sql.clear;
  qclientes.sql.Add('select * from clientes order by nombre');
  qclientes.Open;
  qdestinos.Close;
  qdestinos.sql.clear;
  qdestinos.sql.Add('select * from clientes_destinos order by descripcion');
  qdestinos.Open;
  facturasdetalle.Close;
  qfacturasiva.Close;
  facturasfecha.Value := Date;
end;

procedure Tfacturas.btfsiguienteClick(Sender: TObject);
begin
  facturas.Prior;
end;

procedure Tfacturas.Button10Click(Sender: TObject);
var vserie,vidcliente,viddestino,archivo:string;
    vdesde,vhasta:tdate;
begin
    vserie:='%';
    vidcliente:='%';
    viddestino:='%';
    vdesde:=fdesde.Date;
    vhasta:=fhasta.Date;
    vserie:=comboserie2.KeyValue;
    if listaclientesnif.asstring<>' ' then vidcliente:=listaclientesnomcliente.asstring;
    if listadestinosnomdestino.asstring<>'' then viddestino:=listadestinosnomdestino.asstring;
    qfacturasagrupado.Prepare;
    qfacturasagrupado.ParamByName('SERIE').AsString:=vserie;
    qfacturasagrupado.ParamByName('IDCLIENTE').AsString:=vidcliente;
    qfacturasagrupado.ParamByName('IDDESTINO').AsString:=viddestino;
    qfacturasagrupado.ParamByName('DESDE').AsDate:=vdesde;
    qfacturasagrupado.ParamByName('HASTA').AsDate:=vhasta;
    qfacturasagrupado.Open;
  SaveDialog1.FileName := 'FACTURAS AGRUPADAS CLIENTES.xlsx';
  SaveDialog1.Execute();
  archivo := SaveDialog1.FileName;
  try
      ExportaraExcel(archivo, 'facturas', gridagrupados);
  finally
    showmessage('Los datos han sido exportados correctamente');
  end;

end;

procedure Tfacturas.btnCargarCertificadosClick(Sender: TObject); // O como se llame tu botn
var
  CertList: TList; // Usamos TList clsico, no TObjectList<>
  i: Integer;
  CertInfo: TCertificateInfo;
begin
{  // Primero, limpiamos el ComboBox de cualquier certificado anterior
  for i := 0 to cbCertificados.Items.Count - 1 do
  begin
    // Liberamos el contexto del certificado que guardamos en el ComboBox
    CertFreeCertificateContext(PCCERT_CONTEXT(cbCertificados.Items.Objects[i]));
  end;
  cbCertificados.Clear;

  // Llamamos a la funcin del CertificateManager!
  // Esta nos devuelve un TList que S es compatible con XE3
  CertList := TCertificateLoader.GetPersonalCertificates;
  try
    if CertList.Count = 0 then
    begin
      ShowMessage('No se encontraron certificados con clave privada.');
    end
    else
    begin
      // Llenamos el ComboBox usando un bucle FOR clsico
      for i := 0 to CertList.Count - 1 do
      begin
        CertInfo := TCertificateInfo(CertList[i]);
        // Guardamos el nombre y el puntero al contexto del certificado
        cbCertificados.Items.AddObject(CertInfo.FriendlyName, CertInfo.Context);
      end;
      cbCertificados.ItemIndex := 0;
    end;
  finally
    // MUY IMPORTANTE!
    // Liberamos la lista y TODOS los objetos TCertificateInfo que contiene.
    // Los "Context" ya estn a salvo en el ComboBox.
    while CertList.Count > 0 do
    begin
      TCertificateInfo(CertList[0]).Free;
      CertList.Delete(0);
    end;
    CertList.Free;
  end;}
end;

procedure Tfacturas.Button16Click(Sender: TObject);
var
  serie, id: string;
begin
  if facturasdetalle.RecordCount > 0 then
  begin
    serie := facturasserie.AsString;
    id := facturasid.AsString;
    facturasdetalle.Delete;
    // 1        facturas.Refresh;
    // facturas.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive,lopartialkey]);
    qfacturasiva.Refresh;
  end;
end;

procedure Tfacturas.Button1Click(Sender: TObject);
var
  precio, serie, id: string;
  I: Integer;
begin
  serie := facturasserie.AsString;
  id := facturasid.AsString;
  if facturasdetalle.RecordCount > 0 then
  begin
    precio := stringreplace((Edit1.Text), '.', ',', [rfreplaceall]);
    if DBGrid5.Selectedrows.Count > 0 then
    begin
      for I := 0 to DBGrid5.Selectedrows.Count - 1 do
      begin
        facturasdetalle.GotoBookmark((DBGrid5.Selectedrows[I]));
        facturasdetalle.edit;
        facturasdetalleprecio.Value := strtofloat(precio);
        facturasdetalle.Post;
      end;
    end
    else
    begin
      facturasdetalle.First;
      while not facturasdetalle.Eof do
      begin
        if facturasdetallecantidad.AsFloat > 0 then
        begin
          facturasdetalle.edit;
          facturasdetalleprecio.Value := strtofloat(precio);
          facturasdetalle.Post;
        end;
        facturasdetalle.Next;
      end;
    end;
  end;
  facturasdetalle.Refresh;
  facturas.Refresh;
  facturas.Locate('serie,id', vararrayof([serie, id]), [locaseinsensitive]);

end;

procedure Tfacturas.Button2Click(Sender: TObject);
var
  id, codcomision, empresa, serie: string;
  coste_trans, cantidad, comision: real;
begin
  codcomision := dm.tempresacodcomision.AsString;
  empresa := facturasidempresa.AsString;
  serie := facturasserie.AsString;
  id := facturasid.AsString;
  facturasdetalle.Append;
  DBGrid5.Fields[0].Value := codcomision;
  filtro := facturasdetalleidarticulo.AsString;
  qarticulos.Close;
  qarticulos.filtered := True;
  qarticulos.Open;
  if qarticulos.RecordCount > 0 then
  begin
    qtipos_iva.Open;
    facturasdetalledescripcion.Value := qarticulosdescripcion.AsString;
    if qclientesexento_iva.AsInteger = 0 then
      facturasdetalletipoiva.Value := qtipos_ivatipo.AsFloat
    else
      facturasdetalletipoiva.Value := 0;
  end;

  DBGrid5.Fields[7].Value := -1;
  DBGrid5.Fields[8].Value := facturasneto.AsFloat *
    (facturascomision.AsFloat / 100);
  facturasdetalle.Post;
  qaux.Close;
  qaux.sql.clear;
  qaux.sql.Add
    ('select sum(cantidad),sum(total) from facturas_detalles where lote is not null and idempresa='
    + empresa + ' and serie=' + '''' + serie + '''' + ' and idalbaran=' +
    facturasid.AsString);
  qaux.Open;
  cantidad := qaux.Fields[0].AsFloat;
  if (cantidad > 0) and (facturascoste_transporte.AsFloat > 0) then
  begin
    coste_trans := facturascoste_transporte.AsFloat / cantidad;
    qaux.Close;
    qaux.sql.clear;
    qaux.sql.Add('update facturas_detalles set coste_transporte=cantidad*' +
      stringreplace(floattostr(coste_trans), ',', '.', [rfreplaceall]) +
      ' where lote is not null and idempresa=' + empresa + ' and serie=' + ''''
      + serie + '''' + ' and idalbaran=' + facturasid.AsString +
      ' and idarticulo<>(select codcomision from empresa where id=' +
      facturasidempresa.AsString +
      ') and idarticulo<>(select codtransporte from empresa where id=' +
      facturasidempresa.AsString + ')');
    qaux.execsql;
  end;
  comision := facturascomision.AsFloat / 100;
  qaux.Close;
  qaux.sql.clear;
  qaux.sql.Add('update facturas_detalles set coste_comision=total*' +
    stringreplace(floattostr(comision), ',', '.', [rfreplaceall]) +
    ' where idempresa=' + empresa + ' and serie=' + '''' + serie + '''' +
    ' and idfactura=' + facturasid.AsString +
    ' and idarticulo<>(select codcomision from empresa where id=' +
    facturasidempresa.AsString +
    ') and idarticulo<>(select codtransporte from empresa where id=' +
    facturasidempresa.AsString + ')');
  qaux.execsql;

  facturas.Refresh;
  facturas.Locate('serie,id', vararrayof([serie, id]), [locaseinsensitive]);
  facturasdetalle.Refresh;
  facturasdetalle.Last;
  qfacturasiva.Refresh;

end;

procedure Tfacturas.Button3Click(Sender: TObject);
var
  archivo: string;
  dia, mes, anyo: Word;
  filtro, tdesde, thasta: string;
begin
  decodedate(fdesde.Date, anyo, mes, dia);
  tdesde := '''' + floattostr(anyo) + '/' + floattostr(mes) + '/' +
    floattostr(dia) + '''';
  decodedate(fhasta.Date, anyo, mes, dia);
  thasta := '''' + floattostr(anyo) + '/' + floattostr(mes) + '/' +
    floattostr(dia) + '''';
  filtro := ' where f.fecha>=' + tdesde + ' and f.fecha<=' + thasta;
  if (combolistcliente.Text <> '') and (combolistcliente.Text <> ' TODOS') then
  begin
    filtro := filtro + ' and nif=' + '''' + listaclientesnif.AsString + '''';
  end;
  if (combolistdestinos.Text <> '') and (combolistdestinos.Text <> ' TODOS')
  then
  begin
    filtro := filtro + ' and nomdestino=' + '''' +
      listadestinosnomdestino.AsString + '''';
  end;
  filtro := filtro +
    ' and f.idempresa=fi.ide and f.serie=fi.serie and f.id=fi.idfactura and fi.base>0';
  qfacturasclientes2.Close;
  qfacturasclientes2.sql.clear;
  qfacturasclientes2.sql.Add('select * from facturas f,facturas_iva fi  '
    + filtro);
  qfacturasclientes2.Open;
  SaveDialog1.FileName := 'FACTURAS CLIENTES.xlsx';
  SaveDialog1.Execute();
  archivo := SaveDialog1.FileName;
  try
    if DBGridacumulados.Visible then
      ExportaraExcel(archivo, 'Acumulados', DBGridacumulados)
    else
    begin
      ExportaraExcel(archivo, 'facturas', gridfacturasaexcel2);
    end;
  finally
    showmessage('Los datos han sido exportados correctamente');
  end;
end;

procedure Tfacturas.Button4Click(Sender: TObject);
var
  archivo: string;
  dia, mes, anyo: Word;
  filtro, tdesde, thasta: string;
begin
  decodedate(fdesde.Date, anyo, mes, dia);
  tdesde := '''' + floattostr(anyo) + '/' + floattostr(mes) + '/' +
    floattostr(dia) + '''';
  decodedate(fhasta.Date, anyo, mes, dia);
  thasta := '''' + floattostr(anyo) + '/' + floattostr(mes) + '/' +
    floattostr(dia) + '''';
  filtro := ' where f.fecha>=' + tdesde + ' and f.fecha<=' + thasta;
  if (combolistcliente.Text <> '') and (combolistcliente.Text <> ' TODOS') then
  begin
    filtro := filtro + ' and nif=' + '''' + listaclientesnif.AsString + '''';
  end;
  if (combolistdestinos.Text <> '') and (combolistdestinos.Text <> ' TODOS')
  then
  begin
    filtro := filtro + ' and nomdestino=' + '''' +
      listadestinosnomdestino.AsString + '''';
  end;
  filtro := filtro + ' ';
  qfacturasclientes.sql.clear;
  qfacturasclientes.sql.Add
    ('(select f.serie as s,f.id as numfact,f.*,fd.*,l.parcela from facturas f,facturas_detalles fd,lotes l '
    + filtro +
    ' and  l.idempresa=fd.idempresa and l.codigo=fd.lote and f.idempresa=fd.idempresa and f.serie=fd.serie and f.id=fd.idfactura ) ');
  qfacturasclientes.sql.Add(' union ALL ');
  qfacturasclientes.sql.Add('(select f.serie as s,f.id as numfact,f.*,fd.*,' +
    '''' + ' ' + '''' + ' as parcela from facturas f,facturas_detalles fd ' +
    filtro + ' and fd.lote is null and f.idempresa=fd.idempresa and f.serie=fd.serie and f.id=fd.idfactura) order by s,numfact desc');
  qfacturasclientes.Open;
  SaveDialog1.FileName := 'FACTURAS CLIENTES DETALLADO.xlsx';
  SaveDialog1.Execute();
  archivo := SaveDialog1.FileName;
  try
    // if dbgridacumulados.visible then     Exportaraexcel(archivo,'Acumulados',dbgridacumulados)
    // else
    ExportaraExcel(archivo, 'facturas', gridfacturasaexcel);
  finally
    showmessage('Los datos han sido exportados correctamente');
  end;

end;

procedure Tfacturas.Button5Click(Sender: TObject);
var
  id, codtransporte, empresa, serie: string;
  coste_trans, cantidad, comision: real;
begin
  id := facturasid.AsString;
  empresa := facturasidempresa.AsString;
  serie := facturasserie.AsString;
  codtransporte := dm.tempresacodtransporte.AsString;
  facturasdetalle.Append;
  DBGrid5.Fields[0].Value := codtransporte;
  filtro := facturasdetalleidarticulo.AsString;
  qarticulos.Close;
  qarticulos.Open;
  if qarticulos.RecordCount > 0 then
  begin
    qtipos_iva.Open;
    facturasdetalledescripcion.Value := qarticulosdescripcion.AsString;
    if qclientesexento_iva.AsInteger = 0 then
      facturasdetalletipoiva.Value := qtipos_ivatipo.AsFloat
    else
      facturasdetalletipoiva.Value := 0;
  end;
  DBGrid5.Fields[7].Value := -1;
  DBGrid5.Fields[8].Value := facturascoste_transporte.AsFloat;
  facturasdetalle.Post;
  qaux.Close;
  qaux.sql.clear;
  qaux.sql.Add
    ('select sum(cantidad),sum(total) from facturas_detalles where lote is not null and idempresa='
    + empresa + ' and serie=' + '''' + serie + '''' + ' and idalbaran=' +
    facturasid.AsString);
  qaux.Open;
  cantidad := qaux.Fields[0].AsFloat;

  if (cantidad > 0) and (facturascoste_transporte.AsFloat > 0) then
  begin
    coste_trans := facturascoste_transporte.AsFloat / cantidad;

    qaux.Close;
    qaux.sql.clear;
    qaux.sql.Add('update facturas_detalles set coste_transporte=cantidad*' +
      stringreplace(floattostr(coste_trans), ',', '.', [rfreplaceall]) +
      ' where lote is not null and idempresa=' + empresa + ' and serie=' + ''''
      + serie + '''' + ' and idalbaran=' + facturasid.AsString +
      ' and idarticulo<>(select codcomision from empresa where id=' +
      facturasidempresa.AsString +
      ') and idarticulo<>(select codtransporte from empresa where id=' +
      facturasidempresa.AsString + ')');
    qaux.execsql;

  end;
  comision := facturascomision.AsFloat / 100;
  qaux.Close;
  qaux.sql.clear;
  qaux.sql.Add('update facturas_detalles set coste_comision=total*' +
    stringreplace(floattostr(comision), ',', '.', [rfreplaceall]) +
    ' where idempresa=' + empresa + ' and serie=' + '''' + serie + '''' +
    ' and idalbaran=' + facturasid.AsString +
    ' and idarticulo<>(select codcomision from empresa where id=' +
    facturasidempresa.AsString +
    ') and idarticulo<>(select codtransporte from empresa where id=' +
    facturasidempresa.AsString + ')');
  qaux.execsql;

  facturas.Refresh;
  facturas.Locate('serie,id', vararrayof([serie, id]), [locaseinsensitive]);
  facturasdetalle.Refresh;
  facturasdetalle.Last;
  qfacturasiva.Refresh;

end;

procedure Tfacturas.Button6Click(Sender: TObject);
begin
  traza_materiales2 := Ttraza_materiales2.Create(nil);
  try
    traza_materiales2.qpesadas.Close;
    traza_materiales2.qpesadas.sql.clear;
    traza_materiales2.qpesadas.sql.Add
      ('select mat.idea,mat.idea2,mat.idaf,af.descripcion,mat.cantidad,mat.lote,e.documento as doc_compra,p.nombre as proveedor,:documento as documento from ea_materiales mat ,articulosf af,entradas_detalle ed,entradas e,proveedores p  where');
    traza_materiales2.qpesadas.sql.Add
      ('mat.idaf=af.id and mat.ide=af.idempresa and  mat.idaf=ed.id_propio and mat.lote=ed.lote and ed.identrada=e.id and mat.ide=e.idempresa and e.idproveedor=p.id and');
    traza_materiales2.qpesadas.sql.Add
      (' (ide,idea,idea2) in (select idempresa,id,idea from ea_pesadas where idfactura=:documento) order by idaf,idea,idea2');
    traza_materiales2.qpesadas.ParamByName('documento').AsString :=
      facturasserie.AsString + '/' + facturasid.AsString;
    traza_materiales2.qpesadas.prepare;
    traza_materiales2.qpesadas.Open;
    traza_materiales2.DBGrid2.Columns[0].Title.Caption := 'Factura';
    traza_materiales2.showmodal();
  finally
    traza_materiales2.Free;
  end;

end;

procedure Tfacturas.Button7Click(Sender: TObject);
begin
  combolistcliente.KeyValue := null;
  btfiltrar.click;
end;

procedure Tfacturas.Button8Click(Sender: TObject);
begin
  combolistdestinos.KeyValue := null;
  btfiltrar.click;
end;

procedure Tfacturas.Button9Click(Sender: TObject);
var
  clicuenta, clititulo, clinif, clidomicilio, clipoblacion, cliprovincia,
    clicodpost: string;
  dasiento, dfecha, dcuenta, dcontrapartida, dconcepto, dfactura, dfecha_recep,
    diva, drec_equiv, ddocumento, dserie, daccion, doperacioniva, dorigen,
    dtipoapunte, dimpdebe, dimphaber, dbaseimpo: string;
  archivo, tdia, tmes, tanyo, sconta: string;
  fichero: textfile;
  x: Integer;
  dia, mes, anyo: Word;
begin

  /// /////////////////   exportanto fichero subcuentas ////////////////////
  qclientes_conta.Open;
  qclientes_conta.First;
  qaux.Close;
  qaux.sql.clear;
  qaux.sql.Add('delete from conta_subcta');
  qaux.execsql;
  qconta_subcta.Close;
  qconta_subcta.Open;
  while not qclientes_conta.Eof do
  begin

    qconta_subcta.Append;
    clicuenta := qclientes_contaccontable.AsString;
    clicuenta := clicuenta + StringOfChar(' ', 12 - length(clicuenta));
    qconta_subctacuenta.Value := clicuenta;
    clititulo := qclientes_contanombre.AsString;
    clititulo := clititulo + StringOfChar(' ', 40 - length(clititulo));
    qconta_subctatitulo.Value := clititulo;
    clinif := qclientes_contanif.AsString;
    clinif := clinif + StringOfChar(' ', 15 - length(clinif));
    qconta_subctanif.Value := clinif;

    clidomicilio := qclientes_contadireccion.AsString;
    Delete(clidomicilio, 35, clidomicilio.length - 35);
    clidomicilio := clidomicilio + StringOfChar(' ', 35 - length(clidomicilio));
    qconta_subctadomicilio.Value := clidomicilio;
    clipoblacion := qclientes_contapoblacion.AsString;
    clipoblacion := clipoblacion + StringOfChar(' ', 25 - length(clipoblacion));
    qconta_subctapoblacion.Value := clipoblacion;
    cliprovincia := qclientes_contaprovincia.AsString;
    cliprovincia := cliprovincia + StringOfChar(' ', 20 - length(cliprovincia));
    qconta_subctaprovincia.Value := cliprovincia;
    clicodpost := qclientes_contacodpost.AsString;
    clicodpost := clicodpost + StringOfChar(' ', 7 - length(clicodpost));
    qconta_subctacodpost.Value := clicodpost;
    qconta_subcta.Post;
    qclientes_conta.Next;
  end;
  qconta_subcta.Append;
  clicuenta := '70000000';
  clicuenta := clicuenta + StringOfChar(' ', 12 - length(clicuenta));
  qconta_subctacuenta.Value := clicuenta;
  clititulo := '';
  clititulo := clititulo + StringOfChar(' ', 40 - length(clititulo));
  qconta_subctatitulo.Value := clititulo;
  clinif := '';
  clinif := clinif + StringOfChar(' ', 15 - length(clinif));
  qconta_subctanif.Value := clinif;
  clidomicilio := '';
  Delete(clidomicilio, 35, clidomicilio.length - 35);
  clidomicilio := clidomicilio + StringOfChar(' ', 35 - length(clidomicilio));
  qconta_subctadomicilio.Value := clidomicilio;
  clipoblacion := ''; // qclientes_contapoblacion.AsString;
  clipoblacion := clipoblacion + StringOfChar(' ', 25 - length(clipoblacion));
  qconta_subctapoblacion.Value := clipoblacion;
  cliprovincia := ''; // qclientes_contaprovincia.AsString;
  cliprovincia := cliprovincia + StringOfChar(' ', 20 - length(cliprovincia));
  qconta_subctaprovincia.Value := cliprovincia;
  clicodpost := ''; // qclientes_contacodpost.AsString;
  clicodpost := clicodpost + StringOfChar(' ', 7 - length(clicodpost));
  qconta_subctacodpost.Value := clicodpost;
  qconta_subcta.Post;
  qconta_subcta.Append;
  clicuenta := '47701000';
  clicuenta := clicuenta + StringOfChar(' ', 12 - length(clicuenta));
  qconta_subctacuenta.Value := clicuenta;
  clititulo := '';
  clititulo := clititulo + StringOfChar(' ', 40 - length(clititulo));
  qconta_subctatitulo.Value := clititulo;
  clinif := '';
  clinif := clinif + StringOfChar(' ', 15 - length(clinif));
  qconta_subctanif.Value := clinif;
  clidomicilio := '';
  Delete(clidomicilio, 35, clidomicilio.length - 35);
  clidomicilio := clidomicilio + StringOfChar(' ', 35 - length(clidomicilio));
  qconta_subctadomicilio.Value := clidomicilio;
  clipoblacion := ''; // qclientes_contapoblacion.AsString;
  clipoblacion := clipoblacion + StringOfChar(' ', 25 - length(clipoblacion));
  qconta_subctapoblacion.Value := clipoblacion;
  cliprovincia := ''; // qclientes_contaprovincia.AsString;
  cliprovincia := cliprovincia + StringOfChar(' ', 20 - length(cliprovincia));
  qconta_subctaprovincia.Value := cliprovincia;
  clicodpost := ''; // qclientes_contacodpost.AsString;
  clicodpost := clicodpost + StringOfChar(' ', 7 - length(clicodpost));
  qconta_subctacodpost.Value := clicodpost;
  qconta_subcta.Post;

  qconta_subcta.Append;
  clicuenta := '47700004';
  clicuenta := clicuenta + StringOfChar(' ', 12 - length(clicuenta));
  qconta_subctacuenta.Value := clicuenta;
  clititulo := '';
  clititulo := clititulo + StringOfChar(' ', 40 - length(clititulo));
  qconta_subctatitulo.Value := clititulo;
  clinif := '';
  clinif := clinif + StringOfChar(' ', 15 - length(clinif));
  qconta_subctanif.Value := clinif;
  clidomicilio := '';
  Delete(clidomicilio, 35, clidomicilio.length - 35);
  clidomicilio := clidomicilio + StringOfChar(' ', 35 - length(clidomicilio));
  qconta_subctadomicilio.Value := clidomicilio;
  clipoblacion := ''; // qclientes_contapoblacion.AsString;
  clipoblacion := clipoblacion + StringOfChar(' ', 25 - length(clipoblacion));
  qconta_subctapoblacion.Value := clipoblacion;
  cliprovincia := ''; // qclientes_contaprovincia.AsString;
  cliprovincia := cliprovincia + StringOfChar(' ', 20 - length(cliprovincia));
  qconta_subctaprovincia.Value := cliprovincia;
  clicodpost := ''; // qclientes_contacodpost.AsString;
  clicodpost := clicodpost + StringOfChar(' ', 7 - length(clicodpost));
  qconta_subctacodpost.Value := clicodpost;
  qconta_subcta.Post;
  qconta_subcta.Append;
  clicuenta := '47700010';
  clicuenta := clicuenta + StringOfChar(' ', 12 - length(clicuenta));
  qconta_subctacuenta.Value := clicuenta;
  clititulo := '';
  clititulo := clititulo + StringOfChar(' ', 40 - length(clititulo));
  qconta_subctatitulo.Value := clititulo;
  clinif := '';
  clinif := clinif + StringOfChar(' ', 15 - length(clinif));
  qconta_subctanif.Value := clinif;
  clidomicilio := '';
  Delete(clidomicilio, 35, clidomicilio.length - 35);
  clidomicilio := clidomicilio + StringOfChar(' ', 35 - length(clidomicilio));
  qconta_subctadomicilio.Value := clidomicilio;
  clipoblacion := ''; // qclientes_contapoblacion.AsString;
  clipoblacion := clipoblacion + StringOfChar(' ', 25 - length(clipoblacion));
  qconta_subctapoblacion.Value := clipoblacion;
  cliprovincia := ''; // qclientes_contaprovincia.AsString;
  cliprovincia := cliprovincia + StringOfChar(' ', 20 - length(cliprovincia));
  qconta_subctaprovincia.Value := cliprovincia;
  clicodpost := ''; // qclientes_contacodpost.AsString;
  clicodpost := clicodpost + StringOfChar(' ', 7 - length(clicodpost));
  qconta_subctacodpost.Value := clicodpost;
  qconta_subcta.Post;
  qconta_subcta.Append;
  clicuenta := '47700002';
  clicuenta := clicuenta + StringOfChar(' ', 12 - length(clicuenta));
  qconta_subctacuenta.Value := clicuenta;
  clititulo := '';
  clititulo := clititulo + StringOfChar(' ', 40 - length(clititulo));
  qconta_subctatitulo.Value := clititulo;
  clinif := '';
  clinif := clinif + StringOfChar(' ', 15 - length(clinif));
  qconta_subctanif.Value := clinif;
  clidomicilio := '';
  Delete(clidomicilio, 35, clidomicilio.length - 35);
  clidomicilio := clidomicilio + StringOfChar(' ', 35 - length(clidomicilio));
  qconta_subctadomicilio.Value := clidomicilio;
  clipoblacion := ''; // qclientes_contapoblacion.AsString;
  clipoblacion := clipoblacion + StringOfChar(' ', 25 - length(clipoblacion));
  qconta_subctapoblacion.Value := clipoblacion;
  cliprovincia := ''; // qclientes_contaprovincia.AsString;
  cliprovincia := cliprovincia + StringOfChar(' ', 20 - length(cliprovincia));
  qconta_subctaprovincia.Value := cliprovincia;
  clicodpost := ''; // qclientes_contacodpost.AsString;
  clicodpost := clicodpost + StringOfChar(' ', 7 - length(clicodpost));
  qconta_subctacodpost.Value := clicodpost;
  qconta_subcta.Post;
  qconta_subcta.Append;
  clicuenta := '47700021';
  clicuenta := clicuenta + StringOfChar(' ', 12 - length(clicuenta));
  qconta_subctacuenta.Value := clicuenta;
  clititulo := '';
  clititulo := clititulo + StringOfChar(' ', 40 - length(clititulo));
  qconta_subctatitulo.Value := clititulo;
  clinif := '';
  clinif := clinif + StringOfChar(' ', 15 - length(clinif));
  qconta_subctanif.Value := clinif;
  clidomicilio := '';
  Delete(clidomicilio, 35, clidomicilio.length - 35);
  clidomicilio := clidomicilio + StringOfChar(' ', 35 - length(clidomicilio));
  qconta_subctadomicilio.Value := clidomicilio;
  clipoblacion := ''; // qclientes_contapoblacion.AsString;
  clipoblacion := clipoblacion + StringOfChar(' ', 25 - length(clipoblacion));
  qconta_subctapoblacion.Value := clipoblacion;
  cliprovincia := ''; // qclientes_contaprovincia.AsString;
  cliprovincia := cliprovincia + StringOfChar(' ', 20 - length(cliprovincia));
  qconta_subctaprovincia.Value := cliprovincia;
  clicodpost := ''; // qclientes_contacodpost.AsString;
  clicodpost := clicodpost + StringOfChar(' ', 7 - length(clicodpost));
  qconta_subctacodpost.Value := clicodpost;
  qconta_subcta.Post;

  SaveDialog1.FileName := 'subcta.txt';
  SaveDialog1.Execute();
  archivo := SaveDialog1.FileName;
  try
    assignfile(fichero, archivo);
    rewrite(fichero);
    qconta_subcta.First;
    while not qconta_subcta.Eof do
    begin
      writeln(fichero, qconta_subctacuenta.AsString +
        qconta_subctatitulo.AsString + qconta_subctanif.AsString +
        qconta_subctadomicilio.AsString + qconta_subctapoblacion.AsString +
        qconta_subctaprovincia.AsString + qconta_subctacodpost.AsString +
        qconta_subctaint1.AsString);
      qconta_subcta.Next;
    end;
  finally
    closefile(fichero);
    showmessage('Los datos han sido exportados correctamente');
  end;
  /// /////////////////   exportanto fichero diario ////////////////////
  facturas.First;
  qaux.Close;
  qaux.sql.clear;
  qaux.sql.Add('delete from conta_diario');
  qaux.execsql;
  qconta_diario.Close;
  qconta_diario.Open;
  x := 1;
  while not facturas.Eof do
  begin
    qaux.Close;
    qaux.sql.clear;
    qaux.sql.Add('select seriecontable from series_numericas where id=' + '''' +
      facturasserie.AsString + '''' + ' and ide=' + facturasidempresa.AsString);
    qaux.Open;
    sconta := qaux.Fields[0].AsString;
    qaux.Close;
    qaux.sql.clear;
    qaux.sql.Add('select tipocliente from clientes where id=' +
      facturasidcliente.AsString);
    qaux.Open;

    if qaux.Fields[0].AsString = 'NACIONAL' then
      dorigen := 'N';
    if qaux.Fields[0].AsString = 'INTRACOMUNITARIO' then
      dorigen := 'I';
    if qaux.Fields[0].AsString = 'EXTRANJERO' then
      dorigen := 'E';
    qconta_diario.Append;
    dasiento := inttostr(x);
    dasiento := StringOfChar(' ', 6 - length(dasiento)) + dasiento;
    qconta_diarioasiento.Value := dasiento;
    decodedate(facturasfecha.AsDateTime, anyo, mes, dia);
    tdia := floattostr(dia);
    tdia := StringOfChar('0', 2 - length(tdia)) + tdia;
    tmes := floattostr(mes);
    tmes := StringOfChar('0', 2 - length(tmes)) + tmes;
    tanyo := floattostr(anyo);
    tanyo := StringOfChar('0', 4 - length(tanyo)) + tanyo;

    dfecha := tanyo + tmes + tdia;
    dfecha := dfecha + StringOfChar(' ', 8 - length(dfecha));
    qconta_diariofecha.Value := dfecha;

    qaux.Close;
    qaux.sql.clear;
    qaux.sql.Add('select ccontable from clientes where id=' +
      facturasidcliente.AsString);
    qaux.Open;

    dcuenta := qaux.Fields[0].AsString;
    dcuenta := dcuenta + StringOfChar(' ', 12 - length(dcuenta));
    qconta_diariocuenta.Value := dcuenta;

    dcontrapartida := '';
    dcontrapartida := dcontrapartida + StringOfChar(' ',
      12 - length(dcontrapartida));
    qconta_diariocontrapartida.Value := dcontrapartida;

    decodedate(facturasfecha.AsDateTime, anyo, mes, dia);
    tdia := floattostr(dia);
    tdia := StringOfChar('0', 2 - length(tdia)) + tdia;
    tmes := floattostr(mes);
    tmes := StringOfChar('0', 2 - length(tmes)) + tmes;
    tanyo := floattostr(anyo);
    tanyo := StringOfChar('0', 4 - length(tanyo)) + tanyo;

    dconcepto := 'F' + facturasserie.AsString + '' + facturasid.AsString + ' ' +
      tdia + '' + tmes + ' ' + qaux.Fields[0].AsString;
    dconcepto := dconcepto + StringOfChar(' ', 25 - length(dconcepto));
    dconcepto := Copy(dconcepto, 0, 25);
    qconta_diarioconcepto.Value := dconcepto;

    dfactura := facturasid.AsString;
    dfactura := StringOfChar(' ', 8 - length(dfactura)) + dfactura;
    qconta_diariofactura.Value := dfactura;

    dfecha_recep := '';
    dfecha_recep := dfecha_recep + StringOfChar(' ', 8 - length(dfecha_recep));
    qconta_diariofecha_recep.Value := dfecha_recep;

    diva := '0.00';
    diva := StringOfChar(' ', 5 - length(diva)) + diva;
    qconta_diarioiva.Value := diva;

    drec_equiv := '0.00';
    drec_equiv := StringOfChar(' ', 5 - length(drec_equiv)) + drec_equiv;
    qconta_diariorec_equiv.Value := drec_equiv;

    ddocumento := facturasid.AsString;
    ddocumento := StringOfChar('0', 10 - length(ddocumento)) + ddocumento;
    qconta_diariodocumento.Value := ddocumento;

    dserie := sconta;
    dserie := dserie + StringOfChar(' ', 1 - length(dserie));
    qconta_diarioserie.Value := dserie;

    daccion := 'A';
    daccion := daccion + StringOfChar(' ', 1 - length(daccion));
    qconta_diarioaccion.Value := daccion;

    doperacioniva := 'R';
    doperacioniva := doperacioniva + StringOfChar(' ',
      1 - length(doperacioniva));
    qconta_diariooperacioniva.Value := doperacioniva;

    dorigen := dorigen + StringOfChar(' ', 1 - length(dorigen));
    qconta_diarioorigen.Value := dorigen;

    dtipoapunte := ' ';
    dtipoapunte := dtipoapunte + StringOfChar(' ', 1 - length(dtipoapunte));
    qconta_diariotipoapunte.Value := dtipoapunte;

    dimpdebe := stringreplace(format('%5.2f', [facturastotal.AsFloat]), ',',
      '.', [rfreplaceall]);
    dimpdebe := StringOfChar(' ', 16 - length(dimpdebe)) + dimpdebe;
    qconta_diarioimpdebe.Value := dimpdebe;

    dimphaber := '0.00';
    dimphaber := StringOfChar(' ', 16 - length(dimphaber)) + dimphaber;
    qconta_diarioimphaber.Value := dimphaber;

    dbaseimpo := stringreplace(format('%5.2f', [facturasneto.AsFloat]), ',',
      '.', [rfreplaceall]); // '0.00';
    dbaseimpo := StringOfChar(' ', 16 - length(dbaseimpo)) + dbaseimpo;
    qconta_diariobaseimpo.Value := dbaseimpo;

    qconta_diario.Post;
    /// /  inserto la contrapartida
    qconta_diario.Append;

    dasiento := inttostr(x);
    dasiento := StringOfChar(' ', 6 - length(dasiento)) + dasiento;
    qconta_diarioasiento.Value := dasiento;
    decodedate(facturasfecha.AsDateTime, anyo, mes, dia);
    tdia := floattostr(dia);
    tdia := StringOfChar('0', 2 - length(tdia)) + tdia;
    tmes := floattostr(mes);
    tmes := StringOfChar('0', 2 - length(tmes)) + tmes;
    tanyo := floattostr(anyo);
    tanyo := StringOfChar('0', 4 - length(tanyo)) + tanyo;

    dfecha := tanyo + tmes + tdia;
    dfecha := dfecha + StringOfChar(' ', 8 - length(dfecha));
    qconta_diariofecha.Value := dfecha;

    qaux.Close;
    qaux.sql.clear;
    qaux.sql.Add('select ccontable from clientes where id=' +
      facturasidcliente.AsString);
    qaux.Open;

    dcuenta := '70000000'; // qaux.Fields[0].AsString;
    dcuenta := dcuenta + StringOfChar(' ', 12 - length(dcuenta));
    qconta_diariocuenta.Value := dcuenta;

    dcontrapartida := qaux.Fields[0].AsString;
    dcontrapartida := dcontrapartida + StringOfChar(' ',
      12 - length(dcontrapartida));
    qconta_diariocontrapartida.Value := dcontrapartida;

    decodedate(facturasfecha.AsDateTime, anyo, mes, dia);
    tdia := floattostr(dia);
    tdia := StringOfChar('0', 2 - length(tdia)) + tdia;
    tmes := floattostr(mes);
    tmes := StringOfChar('0', 2 - length(tmes)) + tmes;
    tanyo := floattostr(anyo);
    tanyo := StringOfChar('0', 4 - length(tanyo)) + tanyo;

    dconcepto := 'F' + facturasserie.AsString + '' + facturasid.AsString + ' ' +
      tdia + '' + tmes + ' ' + qaux.Fields[0].AsString;
    dconcepto := dconcepto + StringOfChar(' ', 25 - length(dconcepto));
    dconcepto := Copy(dconcepto, 0, 25);
    qconta_diarioconcepto.Value := dconcepto;

    dfactura := facturasid.AsString;
    dfactura := StringOfChar(' ', 8 - length(dfactura)) + dfactura;
    qconta_diariofactura.Value := dfactura;

    dfecha_recep := '';
    dfecha_recep := dfecha_recep + StringOfChar(' ', 8 - length(dfecha_recep));
    qconta_diariofecha_recep.Value := dfecha_recep;

    diva := '0.00';
    diva := StringOfChar(' ', 5 - length(diva)) + diva;
    qconta_diarioiva.Value := diva;

    drec_equiv := '0.00';
    drec_equiv := StringOfChar(' ', 5 - length(drec_equiv)) + drec_equiv;
    qconta_diariorec_equiv.Value := drec_equiv;

    ddocumento := facturasid.AsString;
    ddocumento := StringOfChar('0', 10 - length(ddocumento)) + ddocumento;
    qconta_diariodocumento.Value := ddocumento;

    dserie := sconta;
    dserie := dserie + StringOfChar(' ', 1 - length(dserie));
    qconta_diarioserie.Value := dserie;

    daccion := 'A';
    daccion := daccion + StringOfChar(' ', 1 - length(daccion));
    qconta_diarioaccion.Value := daccion;

    doperacioniva := 'R';
    doperacioniva := doperacioniva + StringOfChar(' ',
      1 - length(doperacioniva));
    qconta_diariooperacioniva.Value := doperacioniva;

    dorigen := dorigen + StringOfChar(' ', 1 - length(dorigen));
    qconta_diarioorigen.Value := dorigen;

    dtipoapunte := 'V';
    dtipoapunte := dtipoapunte + StringOfChar(' ', 1 - length(dtipoapunte));
    qconta_diariotipoapunte.Value := dtipoapunte;

    dimpdebe := '0.00'; // facturastotal.asstring;
    dimpdebe := StringOfChar(' ', 16 - length(dimpdebe)) + dimpdebe;
    qconta_diarioimpdebe.Value := dimpdebe;

    dimphaber := stringreplace(format('%16.2f',
      [(facturastotal.AsFloat - facturastotaliva.AsFloat)]), ',', '.',
      [rfreplaceall]); // '0.00';
    dimphaber := StringOfChar(' ', 16 - length(dimphaber)) + dimphaber;
    qconta_diarioimphaber.Value := dimphaber;

    dbaseimpo := stringreplace(format('%5.2f', [facturasneto.AsFloat]), ',',
      '.', [rfreplaceall]); // '0.00';
    dbaseimpo := StringOfChar(' ', 16 - length(dbaseimpo)) + dbaseimpo;
    qconta_diariobaseimpo.Value := dbaseimpo;

    qconta_diario.Post;
    /// / inserto los apuntes de iva

    qaux2.Close;
    qaux2.sql.clear;
    qaux2.sql.Add('select * from facturas_iva where ide=+' +
      facturasidempresa.AsString + ' and serie=' + '''' + facturasserie.AsString
      + '''' + ' and idfactura=' + facturasid.AsString + ' order by tipo');
    qaux2.Open;
    if qaux2.RecordCount > 0 then
    begin
      while not qaux2.Eof do
      begin
        if qaux2base.AsInteger > 0 then
        begin
          qconta_diario.Append;
          dasiento := inttostr(x);
          dasiento := StringOfChar(' ', 6 - length(dasiento)) + dasiento;
          qconta_diarioasiento.Value := dasiento;
          decodedate(facturasfecha.AsDateTime, anyo, mes, dia);
          tdia := floattostr(dia);
          tdia := StringOfChar('0', 2 - length(tdia)) + tdia;
          tmes := floattostr(mes);
          tmes := StringOfChar('0', 2 - length(tmes)) + tmes;
          tanyo := floattostr(anyo);
          tanyo := StringOfChar('0', 4 - length(tanyo)) + tanyo;

          dfecha := tanyo + tmes + tdia;
          dfecha := dfecha + StringOfChar(' ', 8 - length(dfecha));
          qconta_diariofecha.Value := dfecha;

          qaux.Close;
          qaux.sql.clear;
          qaux.sql.Add('select ccontable from clientes where id=' +
            facturasidcliente.AsString);
          qaux.Open;
          if qaux2tipo.AsInteger = 0 then
            dcuenta := '47701000'; // qaux.Fields[0].AsString;
          if qaux2tipo.AsInteger = 2 then
            dcuenta := '47700002'; // qaux.Fields[0].AsString;
          if qaux2tipo.AsInteger = 4then
            dcuenta := '47700004'; // qaux.Fields[0].AsString;
          if qaux2tipo.AsInteger = 10 then
            dcuenta := '47700010'; // qaux.Fields[0].AsString;
          if qaux2tipo.AsInteger = 21 then
            dcuenta := '47700021'; // qaux.Fields[0].AsString;
          if dorigen = 'E' then
            dcuenta := '47702000'; // qaux.Fields[0].AsString;

          dcuenta := dcuenta + StringOfChar(' ', 12 - length(dcuenta));
          qconta_diariocuenta.Value := dcuenta;

          dcontrapartida := qaux.Fields[0].AsString;
          dcontrapartida := dcontrapartida + StringOfChar(' ',
            12 - length(dcontrapartida));
          qconta_diariocontrapartida.Value := dcontrapartida;

          decodedate(facturasfecha.AsDateTime, anyo, mes, dia);
          tdia := floattostr(dia);
          tdia := StringOfChar('0', 2 - length(tdia)) + tdia;
          tmes := floattostr(mes);
          tmes := StringOfChar('0', 2 - length(tmes)) + tmes;
          tanyo := floattostr(anyo);
          tanyo := StringOfChar('0', 4 - length(tanyo)) + tanyo;

          dconcepto := 'F' + facturasserie.AsString + '' + facturasid.AsString +
            ' ' + tdia + '' + tmes + ' ' + qaux.Fields[0].AsString;
          dconcepto := dconcepto + StringOfChar(' ', 25 - length(dconcepto));
          dconcepto := Copy(dconcepto, 0, 25);
          qconta_diarioconcepto.Value := dconcepto;

          dfactura := facturasid.AsString;
          dfactura := StringOfChar(' ', 8 - length(dfactura)) + dfactura;
          qconta_diariofactura.Value := dfactura;

          dfecha_recep := '';
          dfecha_recep := dfecha_recep + StringOfChar(' ',
            8 - length(dfecha_recep));
          qconta_diariofecha_recep.Value := dfecha_recep;

          diva := stringreplace(format('%5.2f', [qaux2tipo.AsFloat]), ',', '.',
            [rfreplaceall]); // '0.00';
          diva := StringOfChar(' ', 5 - length(diva)) + diva;
          qconta_diarioiva.Value := diva;

          drec_equiv := '0.00';
          drec_equiv := StringOfChar(' ', 5 - length(drec_equiv)) + drec_equiv;
          qconta_diariorec_equiv.Value := drec_equiv;

          ddocumento := facturasid.AsString;
          ddocumento := StringOfChar('0', 10 - length(ddocumento)) + ddocumento;
          qconta_diariodocumento.Value := ddocumento;

          dserie := sconta;
          dserie := dserie + StringOfChar(' ', 1 - length(dserie));
          qconta_diarioserie.Value := dserie;

          daccion := 'A';
          daccion := daccion + StringOfChar(' ', 1 - length(daccion));
          qconta_diarioaccion.Value := daccion;

          doperacioniva := 'R';
          doperacioniva := doperacioniva + StringOfChar(' ',
            1 - length(doperacioniva));
          qconta_diariooperacioniva.Value := doperacioniva;

          dorigen := dorigen + StringOfChar(' ', 1 - length(dorigen));
          qconta_diarioorigen.Value := dorigen;

          dtipoapunte := 'I';
          dtipoapunte := dtipoapunte + StringOfChar(' ',
            1 - length(dtipoapunte));
          qconta_diariotipoapunte.Value := dtipoapunte;

          dimpdebe := '0.00'; // facturastotal.asstring;
          dimpdebe := StringOfChar(' ', 16 - length(dimpdebe)) + dimpdebe;
          qconta_diarioimpdebe.Value := dimpdebe;

          dimphaber := stringreplace(format('%16.2f', [qaux2iva.AsFloat]), ',',
            '.', [rfreplaceall]); // '0.00';
          dimphaber := StringOfChar(' ', 16 - length(dimphaber)) + dimphaber;
          qconta_diarioimphaber.Value := dimphaber;

          dbaseimpo := stringreplace(format('%16.2f', [qaux2base.AsFloat]), ',',
            '.', [rfreplaceall]); // '0.00';
          dbaseimpo := StringOfChar(' ', 16 - length(dbaseimpo)) + dbaseimpo;
          qconta_diariobaseimpo.Value := dbaseimpo;
          qconta_diario.Post;
        end;
        qaux2.Next;
      end;
    end;

    facturas.Next;
    x := x + 1;
  end;
  SaveDialog1.FileName := 'diario.txt';
  SaveDialog1.Execute();
  archivo := SaveDialog1.FileName;
  try
    Deletefile(archivo);
    assignfile(fichero, archivo);
    rewrite(fichero);
    qconta_diario.First;
    while not qconta_diario.Eof do
    begin
      writeln(fichero, qconta_diarioasiento.AsString,
        qconta_diariofecha.AsString, qconta_diariocuenta.AsString,
        qconta_diariocontrapartida.AsString, qconta_diariointerno1.AsString,
        qconta_diarioconcepto.AsString, qconta_diariointerno2.AsString,
        qconta_diariofactura.AsString, qconta_diariointerno3.AsString,
        qconta_diariofecha_recep.AsString, qconta_diariointerno4.AsString,
        qconta_diarioiva.AsString, qconta_diariorec_equiv.AsString,
        qconta_diariodocumento.AsString, qconta_diariointerno5.AsString,
        qconta_diariointerno6.AsString, qconta_diariointerno7.AsString,
        qconta_diariointerno8.AsString, qconta_diariointerno9.AsString,
        qconta_diarioserie.AsString, qconta_diarioaccion.AsString,
        qconta_diariooperacioniva.AsString, qconta_diarioorigen.AsString,
        qconta_diariotipoapunte.AsString, qconta_diariointerno10.AsString,
        qconta_diariointerno11.AsString, qconta_diariointerno12.AsString,
        qconta_diarioimpdebe.AsString, qconta_diarioimphaber.AsString,
        qconta_diariobaseimpo.AsString, qconta_diariointerno13.AsString);
      qconta_diario.Next;
    end;
  finally
    closefile(fichero);
    showmessage('Los datos han sido exportados correctamente');
  end;

end;

procedure Tfacturas.btfiltrarClick(Sender: TObject);
var
  dia, mes, anyo: Word;
  filtro, filtro2, tdesde, thasta: string;
begin
  decodedate(fdesde.Date, anyo, mes, dia);
  tdesde := '''' + floattostr(anyo) + '/' + floattostr(mes) + '/' +
    floattostr(dia) + '''';
  decodedate(fhasta.Date, anyo, mes, dia);
  thasta := '''' + floattostr(anyo) + '/' + floattostr(mes) + '/' +
    floattostr(dia) + '''';
  filtro := ' where fecha>=' + tdesde + ' and fecha<=' + thasta + ' and serie='
    + '''' + qseries2id.AsString + '''';
  if (combolistcliente.Text <> '') and (combolistcliente.Text <> ' TODOS') then
  begin
    filtro := filtro + ' and nif=' + '''' + listaclientesnif.AsString + '''';
  end;
  if (combolistdestinos.Text <> '') and (combolistdestinos.Text <> ' TODOS')
  then
  begin
    filtro := filtro + ' and nomdestino=' + '''' +
      listadestinosnomdestino.AsString + '''';
  end;
  filtro := filtro + ' order by serie desc,id desc';
  facturas.Close;
  facturas.sql.clear;
  facturas.sql.Add('select * from facturas ' + filtro);
  facturas.Open;
  DBGrid6.BringToFront;
  DBGrid6.Visible := True;
  DBGridacumulados.Visible := False;

end;

procedure Tfacturas.comboseriesCloseUp(Sender: TObject);
begin
  facturasid.Value := qseriesnum_factura.AsInteger;
end;

procedure Tfacturas.comboseriesEnter(Sender: TObject);
begin
  comboseries.DropDown;
end;

procedure Tfacturas.DBGrid5ColExit(Sender: TObject);
begin

  if facturasdetalle.State in [dsedit, dsinsert] then
  begin
    if DBGrid5.SelectedIndex = 0 then
    begin
      filtro := facturasdetalleidarticulo.AsString;
      qarticulos.Close;
      qarticulos.Open;
      if qarticulos.RecordCount > 0 then
      begin
        qtipos_iva.Open;
        facturasdetalledescripcion.Value := qarticulosdescripcion.AsString;
        if qclientesexento_iva.AsInteger = 0 then
          facturasdetalletipoiva.Value := qtipos_ivatipo.AsFloat
        else
          facturasdetalletipoiva.Value := 0;
        qtipos_ivatipo.AsFloat;
      end;
    end;
  end;

end;

procedure Tfacturas.DBGrid5KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = 115) then
  begin
    buscararticulos := Tbuscararticulos.Create(nil);
    try
      fbuscararticulos.padre := facturas.Name;
      fbuscararticulos.filtro := facturasdetalleidarticulo.AsString;
      buscararticulos.Edit1.Text := facturasdetalleidarticulo.AsString;
      buscararticulos.showmodal();
    finally
      if facturasdetalle.State in [dsbrowse] then
        facturasdetalle.edit;
      facturasdetalleidarticulo.Value :=
        buscararticulos.qarticuloscodigo.AsString;
      facturasdetalledescripcion.Value :=
        buscararticulos.qarticulosdescripcion.AsString;
      facturasdetalletipoiva.Value := buscararticulos.qtipos_ivatipo.AsFloat;
      buscararticulos.Free;
    end;
  end;

end;

procedure Tfacturas.DBGrid6DblClick(Sender: TObject);
begin
  pestaas.TabIndex := 0;
end;

procedure Tfacturas.DBGrid6DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if facturascobrado.AsInteger = 0 then
  begin
    DBGrid6.Canvas.brush.Color := rojo;
  end;
  if facturascobrado.AsInteger = 1 then
  begin
    DBGrid6.Canvas.brush.Color := verde;
  end;

  DBGrid6.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure Tfacturas.DBGrid6TitleClick(Column: TColumn);
var
  st: TFDQuerySortType;
begin
  st := facturas.SortType;
  facturas.SortedFields := Column.FieldName;
  If st = stAscending then
    facturas.SortType := stDescending
  else
    facturas.SortType := stAscending;
  dsfacturas.DataSet.First;

end;

procedure Tfacturas.comboclientesCloseUp(Sender: TObject);
begin
  facturasnomcliente.Value := qclientesnombre.AsString;
  facturasnif.Value := qclientesnif.AsString;
  facturasdireccion.Value := qclientesdireccion.AsString;
  facturasprovincia.Value := qclientesprovincia.AsString;
  facturaspoblacion.Value := qclientespoblacion.AsString;
  facturascodpost.Value := qclientescodpost.AsString;
  facturaspaiscliente.Value := qclientespais.AsString;
  facturasidformapago.Value := qclientesidformapago.AsInteger;
end;

procedure Tfacturas.combodestinosCloseUp(Sender: TObject);
begin
  facturasnomdestino.Value := qdestinosdescripcion.AsString;
  facturasdirecciondestino.Value := qdestinosdireccion.AsString;
  facturasprovinciadestino.Value := qdestinosprovincia.AsString;
  facturaspoblaciondestino.Value := qdestinospoblacion.AsString;
  facturascodpostdestino.Value := qdestinoscodpost.AsString;
  facturaspaisdestino.Value := qdestinospais.AsString;
end;

procedure Tfacturas.dsfacturasDataChange(Sender: TObject; Field: TField);
begin
  if (facturas.State in [dsbrowse]) and (facturas.RecordCount > 0) then
  begin
    qalbaranes2.Close;
    qalbaranes2.sql.clear;
    qalbaranes2.sql.Add
      ('select * from albaranes where (idempresa,serie,id) in (select idempresa,serie,idalbaran from albaranes_detalles where');
    qalbaranes2.sql.Add(' idfactura=' + facturasid.AsString + ' and serie=' +
      '''' + facturasserie.AsString + '''' + ' and idempresa=' +
      facturasidempresa.AsString + ') order by serie desc, id desc');
    qalbaranes2.Open;
    qalbaranesdetalle2.sql.clear;
    qalbaranesdetalle2.sql.Add('select * from albaranes_detalles where serie=' +
      '''' + facturasserie.AsString + '''' + ' and idfactura=' +
      facturasid.AsString + ' and idempresa=' + facturasidempresa.AsString +
      ' order by idarticulo');
    qalbaranesdetalle2.Open;
    qclientes.Close;
    qclientes.sql.clear;
    qclientes.sql.Add('select * from clientes where idempresa=' +
    facturasidempresa.AsString + ' and id=' + facturasidcliente.AsString);
    qclientes.Open;
    qdestinos.Close;
    qdestinos.sql.clear;
    qdestinos.sql.Add('select * from clientes_destinos where idempresa=' +
    facturasidempresa.AsString + ' and idcliente=' +
    facturasidcliente.AsString + ' and codigo=' + '''' +
    facturasiddestino.AsString + '''');
    qdestinos.Open;
    facturasdetalle.Close;
    facturasdetalle.prepare;
    facturasdetalle.ParamByName('SERIE').AsString:=facturasserie.AsString;
    facturasdetalle.ParamByName('IDFACTURA').AsInteger:=facturasid.Asinteger;
    facturasdetalle.ParamByName('EMPRESA').AsInteger:=facturasidempresa.AsInteger;
    facturasdetalle.Open;
    qfacturasiva.Close;
    qfacturasiva.Prepare;
    qfacturasiva.ParamByName('SERIE').AsString:=facturasserie.AsString;
    qfacturasiva.ParamByName('IDFACTURA').AsInteger:=facturasid.Asinteger;
    qfacturasiva.ParamByName('EMPRESA').AsInteger:=facturasidempresa.AsInteger;
    qfacturasiva.Open;
  end;
end;

procedure Tfacturas.dsfacturasStateChange(Sender: TObject);
begin
  if facturas.State in [dsedit, dsinsert] then
  begin
    btfnuevo.Enabled := False;
    btfmodificar.Enabled := False;
    btfborrar.Enabled := False;
    btfcancelar.Enabled := True;
    btfguardar.Enabled := True;
    btfanterior.Enabled := False;
    btfsiguiente.Enabled := False;
    btfimportar.Enabled := False;
    btfimprimir.Enabled := False;
    qdestinos.Close;
    qclientes.Close;
    qdestinos.LinkedFields := 'Idempresa;idcliente';
    qdestinos.MasterFields := 'Idempresa;id';
    qdestinos.Mastersource := dsqclientes;
    qclientes.Open;
    qdestinos.Open;
  end
  else
  begin
    btfnuevo.Enabled := True;
    btfmodificar.Enabled := True;
    btfborrar.Enabled := True;
    btfcancelar.Enabled := False;
    btfguardar.Enabled := False;
    btfanterior.Enabled := True;
    btfsiguiente.Enabled := True;
    btfimportar.Enabled := True;
    btfimprimir.Enabled := True;
    qclientes.Close;
    qdestinos.Close;
    qdestinos.LinkedFields := '';
    qdestinos.MasterFields := '';
    qdestinos.Mastersource := nil;
    qclientes.Open;
    qdestinos.Open;

  end;
end;

procedure Tfacturas.dsqseries2DataChange(Sender: TObject; Field: TField);
begin
  facturas.Close;
  facturas.sql.clear;
  facturas.sql.Add('select * from facturas where serie=' + '''' +
    qseries2id.AsString + '''' + ' order by serie desc,id desc');
  facturas.Open;
end;

procedure Tfacturas.facturasBeforeDelete(DataSet: TDataSet);
begin
  case dm.PedirConfirmacion('Confirma que desea borrar esta factura?', True,
    True, False) of
    mrno:
      Abort;
  end;
end;

procedure Tfacturas.facturasBeforePost(DataSet: TDataSet);
var cuenta:string;
begin
  if combocuenta.KeyValue = null then
  begin
    facturascccuentabancaria.Value := '';
  end
  else
  begin
  cuenta:= qcuentascciban.AsString +
      qcuentasccentidad.AsString + qcuentasccoficina.AsString +
      qcuentasccdc.AsString + qcuentascccc.AsString;
      if facturas.State in [dsedit,dsinsert] then facturascccuentabancaria.Value :=cuenta;
  end;
end;

procedure Tfacturas.facturasdetalleAfterPost(DataSet: TDataSet);
var
  serie, id, idfactura, pesobruto, pesoneto, pesonetoteorico, numpalets: string;
begin
  serie := facturasserie.AsString;
  id := facturasid.AsString;
  idfactura := serie + '/' + id;
  qfacturasiva.Refresh;
  if iddetalle <> '' then
    facturasdetalle.Locate('id', iddetalle, [locaseinsensitive])
  else
    facturasdetalle.Last;
  qaux.sql.clear;
  qaux.sql.Add('select * from  ea_pesadas where idfactura=' + '''' + idfactura +
    '''' + ' and idempresa=' + facturasidempresa.AsString);
  qaux.Open;
  if qaux.RecordCount > 0 then
  begin
    qaux.sql.clear;
    qaux.sql.Add
      ('select sum(peso_bruto-tara0),sum(peso_neto),sum(peso_neto_teorico),sum(num_palets) from  ea_pesadas where idfactura='
      + '''' + idfactura + '''' + ' and idempresa=' +
      facturasidempresa.AsString);
    qaux.Open;
    pesobruto := qaux.Fields[0].AsString;
    pesobruto := stringreplace(pesobruto, ',', '.', [rfreplaceall]);
    pesoneto := qaux.Fields[1].AsString;
    pesoneto := stringreplace(pesoneto, ',', '.', [rfreplaceall]);
    pesonetoteorico := qaux.Fields[2].AsString;
    pesonetoteorico := stringreplace(pesonetoteorico, ',', '.', [rfreplaceall]);
    numpalets := qaux.Fields[3].AsString;
    numpalets := stringreplace(numpalets, ',', '.', [rfreplaceall]);
    qaux.sql.clear;
    qaux.sql.Add('update facturas set peso_bruto=' + pesobruto + ',kilos=+' +
      pesoneto + ',kilosventa=' + pesonetoteorico + ',numpalets=+' + numpalets +
      ' where serie=' + '''' + serie + '''' + ' and id=' + id +
      ' and idempresa=' + facturasidempresa.AsString);
    qaux.execsql;

  end;
  facturas.Refresh;
  facturas.Locate('serie,id', vararrayof([serie, id]), [locaseinsensitive])

  {
    var serie,id:string;
    begin
    serie:=facturasserie.AsString;
    id:=facturasid.AsString;
    facturas.Refresh;
    facturas.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive]);
    qfacturasiva.Refresh;
    if iddetalle<>'' then facturasdetalle.Locate('id',iddetalle,[locaseinsensitive]) else facturasdetalle.Last;
  }
end;

procedure Tfacturas.facturasdetalleBeforeDelete(DataSet: TDataSet);
begin
   case dm.PedirConfirmacion('Confirma que desea borrar esta lnea de factura?',true,true,false) of
        mrno:Abort;
   end;
end;

procedure Tfacturas.facturasdetalleBeforePost(DataSet: TDataSet);
var
  iva, re, descuento: real;
begin
  facturasdetalleidempresa.value:=facturasidempresa.asinteger;
  facturasdetalleidfactura.value:=facturasid.asinteger;
  facturasdetalleserie.Value:=facturasserie.AsString;
  if facturasdetalletipoiva.AsString = '' then
    facturasdetalletipoiva.Value := 0;
  if facturasdetalledescuento.AsString = '' then
    facturasdetalledescuento.Value := 0;
  if facturasdetalletipore.AsString = '' then
    facturasdetalletipore.Value := 0;
  facturasdetalleserie.Value := facturasserie.AsString;
  if facturasfacturarporbultos.asinteger=0 then
  begin
    facturasdetallebase.Value := roundto(facturasdetalleprecio.AsFloat *
    facturasdetallecantidad.AsFloat, -2);
  end else
  begin
    facturasdetallebase.Value := roundto(facturasdetalleprecio.AsFloat *
    facturasdetallebultos.AsFloat, -2);
  end;

  descuento := roundto(facturasdetallebase.AsFloat *
    (facturasdetalledescuento.AsFloat / 100), -2);
  facturasdetalletotaldescuento.Value := descuento;
  facturasdetalletotal.Value :=
    roundto(facturasdetallebase.AsFloat - descuento, -2);
  iva := roundto(facturasdetalletotal.AsFloat * (facturasdetalletipoiva.AsFloat
    / 100), -2);
  re := roundto(facturasdetalletotal.AsFloat * (facturasdetalletipore.AsFloat
    / 100), -2);
  facturasdetalleiva.Value := iva;
  facturasdetallere.Value := re;
  if facturasdetalle.State in [dsedit] then
    iddetalle := facturasdetalleid.AsString
  else
    iddetalle := '';
end;

procedure Tfacturas.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (activecontrol is TDBGrid) then
  begin
    if Key = 13 then
      Key := 9;
  end;

end;

procedure Tfacturas.FormKeyPress(Sender: TObject; var Key: Char);
var
  formatos: tformatsettings;
  punto: string;
begin
  GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formatos);
  punto := formatos.DecimalSeparator;
  if punto = ',' then
  begin
    Key := upcase(Key);
    if (Key = '.') and (activecontrol is TDBEdit) then
    begin
      if (activecontrol as TDBEdit).Field.DataType
        in [ftFloat, ftCurrency, ftBCD, ftfmtbcd] then
        Key := ','
    end;
    if (Key = '.') and (activecontrol is TDBGrid) then
    begin
      Key := ',';
    end;
  end;
  if (activecontrol is TDBGrid) then
  begin
    if Key = #13 then
      Key := #9;
  end;

  if (Key = #13) then
  begin
    Perform(WM_NextDLGCtl, 0, 0);
    Key := #0;
  end;
end;

procedure Tfacturas.alba(Sender: TObject);
begin
  dm.tempresa.Open;
  qseries.Close;
  qseries2.Close;
  qdestinos.Close;
  qclientes.Close;
  qalbaranes.Close;
  qalbaranes2.Close;
  qalbaranesdetalle.Close;
  qalbaranesdetalle2.Close;
  facturas.Close;
  facturasdetalle.Close;
  qfacturasiva.Close;
  qformaspago.Close;
  qarticulos.Close;
  qtipos_iva.Close;
  qcuentas.Close;
  qfacturasiva.Close;
  qformularios.Close;

  qseries.Open;
  qseries2.Open;
  qdestinos.Open;
  qclientes.Open;
  qalbaranes.Open;
  qalbaranes2.Open;
  qalbaranesdetalle.Open;
  qalbaranesdetalle2.Open;
  facturas.Close;
  facturas.sql.clear;
  facturas.sql.Add('select * from facturas where serie=' + '''' +
    qseries2id.AsString + '''' + ' order by serie desc,id desc');
  facturas.Open;
  //facturasdetalle.Open;
  //qfacturasiva.Open;
  qformaspago.Open;
  qarticulos.Open;
  qtipos_iva.Open;
  qcuentas.Open;
  qformularios.Open;
  pestaas.TabIndex := 1;
  comboserie2.KeyValue := qseries2id.AsString;
  comboformulario.KeyValue := null;
end;

procedure Tfacturas.qarticulosBeforeOpen(DataSet: TDataSet);
var
  filtrolocal: string;
begin
  filtrolocal := '';
  filtrolocal := ' and (descripcion like(' + '''' + '%' + filtro + '%' + '''' +
    ') or codigo like(' + '''' + '%' + filtro + '%' + '''' + '))';
  qarticulos.sql.clear;
  qarticulos.sql.Add('select * from articulosf where activo=1 and facturable=1'
    + filtrolocal + ' order by descripcion');

end;

procedure Tfacturas.qfacturasclientes2CalcFields(DataSet: TDataSet);
begin
  if (qfacturasclientes2coste_transporte.AsFloat > 0) and
    (qfacturasclientes2kilosventa.AsFloat > 0) then
    qfacturasclientes2transporte_kilo.Value :=
      qfacturasclientes2coste_transporte.AsFloat /
      qfacturasclientes2kilosventa.AsFloat
  else
    qfacturasclientes2transporte_kilo.Value := 0;
end;

procedure Tfacturas.qfacturasclientesCalcFields(DataSet: TDataSet);
begin
  if (qfacturasclientescoste_transporte.AsFloat > 0) and
    (qfacturasclienteskilosventa.AsFloat > 0) then
    qfacturasclientescoste_transporte_1.Value :=
      (qfacturasclientescoste_transporte.AsFloat /
      qfacturasclienteskilosventa.AsFloat) * qfacturasclientescantidad.AsFloat
  else
    qfacturasclientescoste_transporte_1.Value := 0;
end;

procedure Tfacturas.tablistadoShow(Sender: TObject);
begin
  fdesde.Date := strtodate('01/01/2000');
  fhasta.Date := Date();
  listaclientes.Close;
  listadestinos.Close;
  listaclientes.Open;
  listadestinos.Open;
  // btfiltrar.click
end;
procedure TFacturas.CalcularYGuardarHuella;
var
 // DatosHash: TDatosFacturaHash;
  NuevaHuella: string;
  QueryAnterior: TDataSet; // Tu componente de conexin (FireDAC, UniDAC, ADO...)
begin
  // 1. Obtener la Huella Anterior (Chain) [cite: 135, 258]
  // IMPORTANTE: Debes buscar la ltima factura generada POR ESA EMPRESA
  // SELECT huella_verifactu FROM facturas WHERE idempresa = :empresa ORDER BY fecha DESC, id DESC LIMIT 1

  // Supongamos que recuperas ese valor en 'vHuellaAnterior'

  // 2. Rellenar estructura
  {DatosHash.NifEmisor := ObtenerNifEmpresa(dbeIdEmpresa.AsInteger); // Funcin auxiliar tuya
  DatosHash.Serie := dbeSerie.Text;
  DatosHash.Numero := dbeId.Text;
  DatosHash.FechaExpedicion := dbeFecha.Date;
  DatosHash.TipoFactura := 'F1'; // O lo que corresponda segn lgica
  DatosHash.BaseImponible := dbeNeto.Field.AsCurrency;
  DatosHash.ImporteTotal := dbeTotal.Field.AsCurrency;
  DatosHash.HuellaAnterior := vHuellaAnterior; // Si es la primera, pasar cadena vaca ''
   }
  // 3. Generar
  //NuevaHuella := TVeriFactuHasher.GenerarHuella(DatosHash);

  // 4. Asignar a la BD
  //dbeHuellaVeriFactu.Text := NuevaHuella;
  //dbeHuellaAnterior.Text := vHuellaAnterior;

  // Mostrar ayuda contextual si el usuario duda (Requerimiento de UI)
  // btnAyudaHuella.Hint := 'La huella garantiza la inalterabilidad...';
end;
end.
