El caso es que yo intento tener en tablas lo necesario y poco más y parto de que Hacienda una vez se le envíe el registro y responda el OK, le dará igual que yo guarde o no información del REGISTRO enviado. Se puede obtener la información enviada consultando a Hacienda. Por tanto incluso me podria permitir eliminar la tabla de lo enviado y empezar de cero, sólo necesitaría el último registro enviado para el tema de datos del registro anterior. Tal como suena.
Ojo, sólo trabajo Veri*factu On line, es decir envío a Veri*factu al 'momento' (con un margen de segundos y/o minutos).
En algún Webinar se ha dicho sobre el tema y además respondido en mail de consultas a Veri*factu: una vez enviado el registro es Hacienda quién lo tiene en custodia y ya no me pedirá información al respecto de ese registro. Por tanto, la conservación de los datos es prescindible.
En su lugar, los datos que si conservaré (con copias y lo que haga falta, como cualquier SIF) ya están en las tablas de facturas, y los conservaré ni que sea para reimprimirlas o calcular informaciones/liquidaciones trimestrales/anuales.
Dicho esto.
Los campos entre asteriscos permiten vincular las tablas entre si.
El resto de información que no esté en estas tablas estará a piñon o calculada en el XML (por ejemplo IDVERSION o tipo factura), o estará en las de facturas (por ejemplo si es rectificativa, los tipos IVA/IRPF, bases de cálculo, cuotas IVA/IRPF, etc).
Se debe tener en cuenta que si se modifica una factura ya enviada a Veri*factu, se debe generar un registro y enviarlo a Veri*factu.
Code: Select all | Expand
// Las marcadas con XX probablemente son prescindibles porque son datos generales de Verifactu o del SIF
aStruct := {;
;
; // ** ENVIO ALTA o ANULACION ** //
;
; // Comunes
No lo guardo {"CMIDVers", "C", 3, 0},; // RegistroAltaBase/RegistroAnulacion IDVersion
No lo guardo {"CMSignat", "C", 250, 0},; // RegistroAltaBase/RegistroAnulacion Signature
{"CMRefExt", "C", 60, 0},; // RegistroAltaBase/RegistroAnulacion RefExterna
{"CMRecPre", "C", 1, 0},; // RegistroAltaBase/RegistroAnulacion RechazoPrevio
Lo cojo de la factura {"CMFHoReg", "C", 20, 0},; // RegistroAltaBase/RegistroAnulacion FechaHoraHusoGenRegistro
No lo guardo {"CMTipHue", "C", 2, 0},; // RegistroAltaBase/RegistroAnulacion TipoHuella
;
; // RegistroAltaBase
Está en el sistema {"RANomRaz", "C", 120, 0},; // NombreRazonEmisor
¿? {"RAOpeAlt", "C", 10, 0},; // cOperacionAlta
{"RASubSan", "C", 1, 0},; // Subsanacion
Lo calculo {"RATipFac", "C", 2, 0},; // TipoFactura
Está en factura {"RATipRec", "C", 1, 0},; // TipoRectificativa
¿? {"RAFecOpe", "D", 8, 0},; // FechaOperacion
La pongo a piñon {"RADesOpe", "C", 250, 0},; // DescripcionOperacion
{"RAFSimpl", "C", 1, 0},; // FacturaSimplificadaArt7273
{"RAFSinId", "C", 1, 0},; // FacturaSinIdentifDestinatarioArt61d
Lo pongo a piñon {"RAMacroD", "C", 1, 0},; // Macrodato
No lo contemplo {"RAEmiTer", "C", 1, 0},; // EmitidaPorTerceroODestinatario
Lo pongo a piñon{"RACupon", "C", 250, 0},; // Cupon
{"RACuoTot", "N", 12, 2},; // CuotaTotal
{"RAImpTot", "N", 12, 2},; // ImporteTotal
No lo contemplo {"RANumAcu", "C", 15, 0},; // XX NumRegistroAcuerdoFacturacion
No lo contemplo{"RAIDSist", "C", 16, 0},; // XX IdAcuerdoSistemaInformatico
;
; // RegistroAnulacion
¿? {"RNOpeAnu", "C", 10, 0},; // cOperacionAnulacion
{"RNSinReg", "C", 1, 0},; // SinRegistroPrevio
{"RNGenPor", "C", 1, 0},; // GeneradoPor
;
; // IDFacturaExpedida
Está en el sistema {"IFIDEmis", "C", MAX_NIF, 0},; // IDEmisorFactura
{"IFNumSer", "C", 60, 0},; // NumSerieFactura
{"IFFecExp", "D", 8, 0},; // FechaExpedicionFactura
;
; // RegistroAnterior
Está en el sistema {"RGIDEmis", "C", 9, 0},; // IDEmisorFactura
{"RGNumSer", "C", 60, 0},; // NumSerieFactura
{"RGFecExp", "D", 8, 0},; // FechaExpedicionFactura
{"RGHuelll", "C", 64, 0},; // Huella
;
; // DesgloseRectificacion
Hoy por hoy sólo permito rectificativas por diferencia
No permito rectificativas por substitución
No lo contemplo {"DRBasRec", "N", 12, 2},; // BaseRectificada
No lo contemplo {"DRCuoRec", "N", 12, 2},; // CuotaRectificada
No lo contemplo {"DRCuRRec", "N", 12, 2},; // CuotaRecargoRectificado
;
; // DetalleDesglose
Lo tengo en facturas
{"DDTipImp1", "C", 10, 0},; // Impuesto (1)
{"DDTipImp2", "C", 10, 0},; // Impuesto (2)
{"DDTipImp3", "C", 10, 0},; // Impuesto (3)
{"DDTipImp4", "C", 10, 0},; // Impuesto (4)
{"DDTipImp5", "C", 10, 0},; // Impuesto (5)
{"DDTipImp6", "C", 10, 0},; // Impuesto (6)
{"DDClaReg1", "C", 2, 0},; // ClaveRegimen (1)
{"DDClaReg2", "C", 2, 0},; // ClaveRegimen (2)
{"DDClaReg3", "C", 2, 0},; // ClaveRegimen (3)
{"DDClaReg4", "C", 2, 0},; // ClaveRegimen (4)
{"DDClaReg5", "C", 2, 0},; // ClaveRegimen (5)
{"DDClaReg6", "C", 2, 0},; // ClaveRegimen (6)
{"DDCalOpe1", "C", 2, 0},; // CalificacionOperacion (1)
{"DDCalOpe2", "C", 2, 0},; // CalificacionOperacion (2)
{"DDCalOpe3", "C", 2, 0},; // CalificacionOperacion (3)
{"DDCalOpe4", "C", 2, 0},; // CalificacionOperacion (4)
{"DDCalOpe5", "C", 2, 0},; // CalificacionOperacion (5)
{"DDCalOpe6", "C", 2, 0},; // CalificacionOperacion (6)
{"DDExenta1", "C", 2, 0},; // OperacionExenta (1)
{"DDExenta2", "C", 2, 0},; // OperacionExenta (2)
{"DDExenta3", "C", 2, 0},; // OperacionExenta (3)
{"DDExenta4", "C", 2, 0},; // OperacionExenta (4)
{"DDExenta5", "C", 2, 0},; // OperacionExenta (5)
{"DDExenta6", "C", 2, 0},; // OperacionExenta (6)
{"DDTipImp1", "N", 5, 2},; // TipoImpositivo (1)
{"DDTipImp2", "N", 5, 2},; // TipoImpositivo (2)
{"DDTipImp3", "N", 5, 2},; // TipoImpositivo (3)
{"DDTipImp4", "N", 5, 2},; // TipoImpositivo (4)
{"DDTipImp5", "N", 5, 2},; // TipoImpositivo (5)
{"DDTipImp6", "N", 5, 2},; // TipoImpositivo (6)
{"DDBasImp1", "N", 12, 2},; // BaseImponible (1)
{"DDBasImp2", "N", 12, 2},; // BaseImponible (2)
{"DDBasImp3", "N", 12, 2},; // BaseImponible (3)
{"DDBasImp4", "N", 12, 2},; // BaseImponible (4)
{"DDBasImp5", "N", 12, 2},; // BaseImponible (5)
{"DDBasImp6", "N", 12, 2},; // BaseImponible (6)
{"DDBImACo1", "N", 12, 2},; // BaseImponibleACoste (1)
{"DDBImACo2", "N", 12, 2},; // BaseImponibleACoste (2)
{"DDBImACo3", "N", 12, 2},; // BaseImponibleACoste (3)
{"DDBImACo4", "N", 12, 2},; // BaseImponibleACoste (4)
{"DDBImACo5", "N", 12, 2},; // BaseImponibleACoste (5)
{"DDBImACo6", "N", 12, 2},; // BaseImponibleACoste (6)
{"DDCuoRep1", "N", 12, 2},; // CuotaRepercutida (1)
{"DDCuoRep2", "N", 12, 2},; // CuotaRepercutida (2)
{"DDCuoRep3", "N", 12, 2},; // CuotaRepercutida (3)
{"DDCuoRep4", "N", 12, 2},; // CuotaRepercutida (4)
{"DDCuoRep5", "N", 12, 2},; // CuotaRepercutida (5)
{"DDCuoRep6", "N", 12, 2},; // CuotaRepercutida (6)
{"DDTipRec1", "N", 5, 2},; // TipoRecargoEquivalencia (1)
{"DDTipRec2", "N", 5, 2},; // TipoRecargoEquivalencia (2)
{"DDTipRec3", "N", 5, 2},; // TipoRecargoEquivalencia (3)
{"DDTipRec4", "N", 5, 2},; // TipoRecargoEquivalencia (4)
{"DDTipRec5", "N", 5, 2},; // TipoRecargoEquivalencia (5)
{"DDTipRec6", "N", 5, 2},; // TipoRecargoEquivalencia (6)
{"DDCuoRec1", "N", 12, 2},; // CuotaRecargoEquivalencia (1)
{"DDCuoRec2", "N", 12, 2},; // CuotaRecargoEquivalencia (2)
{"DDCuoRec3", "N", 12, 2},; // CuotaRecargoEquivalencia (3)
{"DDCuoRec4", "N", 12, 2},; // CuotaRecargoEquivalencia (4)
{"DDCuoRec5", "N", 12, 2},; // CuotaRecargoEquivalencia (5)
{"DDCuoRec6", "N", 12, 2},; // CuotaRecargoEquivalencia (6)
;
; // Encadenamiento
Lo calculo al momento de generar el XML.
{"ENPriReg", "C", 1, 0},; // PrimerRegistro
;
;
; // ** RESPUESTA ** //
;
Prefiero capturar la Referencia Externa que se corresponderá a un registro enviado.
{"RSIDEmis", "C", MAX_NIF, 0},; // IDEmisorFactura
{"RSNumSer", "C", 10, 0},; // NumSerieFactura
{"RSFecExp", "D", 8, 0},; // FechaExpedicionFactura
{"RSTipOpe", "C", 10, 0},; // TipoOperacion
{"RSEstado", "C", 20, 0},; // Estado
No es correcto, puede haber más de un error por factura en la respuesta (en teoría).
{"RSCodErr", "N", 4, 0},; // CodigoError
{"RSDesErr", "C", 40, 0} ; // DescripcionError
}
Lo que para ti es una estructura de muchos campos, para mi es VFREGI + las tablas con datos de facturas.
Después cuando se genera el XML se crea un registro en VERFAC y se vincula a los registros VFREGI que contiene el XML.
Cuando Veri*factu responde se actualiza VERFAC, VFREGI y si es el caso VFERRO.