VeFa32 - Verifactu

Post Reply
FiveWiDi
Posts: 1275
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 4 times
Been thanked: 12 times

VeFa32 - Verifactu

Post by FiveWiDi »

Hola a todos,

Bueno, aquí les dejo esta utilidad, VeFa32.

https://rebuts.cat/vefa32

(Enseguida se darán cuenta que las páginas web no son lo mío, y tampoco me apetece).

Ya lo dije hace semanas, no puedo compartir los fuentes para compilar directamente, por que forman parte de un software que hace muchas más cosas; sí que les puedo proporcionar funciones que utilizo o aclarar dudas al respecto, o explicar como lo hace VeFa32 o el por qué.

Si alguno de Ustedes hace mantenimiento de algún SIF, creo que VeFa32 le puede ir muy bien.

La idea es simple, un SIF alimenta 2 DBF de VeFa32, y VeFa32 enviará a Verifactu la información y grabará en estas 2 DBF el resultado del envío.

VeFa32 no interfiere en el SIF, sólo está a la espera de recibir la información que le proporcione el SIF.

Sobre cualquier necesidad que se detecte puede estudiarse su implantación.

Feliz Verifactu a todos!!!


Muchas gracias José Luís. Seguimos.
Un Saludo
Carlos G.

FiveWin 25.01 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 10
FiveWiDi
Posts: 1275
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 4 times
Been thanked: 12 times

Re: VeFa32 - Veri*factu - Verifactu

Post by FiveWiDi »

Hola a todos,

En la última versión que he subido de VeFa32 lleva la posibilidad de consultar a Hacienda (Veri*factu) los registros de datos de las facturas enviadas.

Lo puede utilizar cualquiera independientemente de que utilice VeFa32, un SIF u otra utilidad para enviar sus registros de datos de facturas a Veri*factu.

La respuesta recibida de Hacienda se deja en el porta-papeles así cada uno hará el uso de ella a su manera.

Le quedan cosas que pulir pero todo llegará.
Un Saludo
Carlos G.

FiveWin 25.01 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 10
paquitohm
Posts: 293
Joined: Fri Jan 14, 2022 8:37 am
Been thanked: 1 time

Re: VeFa32 - Verifactu

Post by paquitohm »

Magnífico trabajo Carlos !!
Se nota que te lo has currado !!

Felicidades !
FiveWiDi
Posts: 1275
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 4 times
Been thanked: 12 times

Re: VeFa32 - Verifactu

Post by FiveWiDi »

Muchas gracias.

Cualquier cosa rara/inexplicable que veais en vuestro desarrollo lo comentaís, con uno que lo sufra es suficiente.
Un Saludo
Carlos G.

FiveWin 25.01 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 10
paquitohm
Posts: 293
Joined: Fri Jan 14, 2022 8:37 am
Been thanked: 1 time

Re: VeFa32 - Verifactu

Post by paquitohm »

FiveWiDi wrote: Tue Apr 08, 2025 2:51 pm
Cualquier cosa rara/inexplicable que veais

Pues ahora que lo dices. Veo inexplicable que tu post tiene más de 2.400 visitas y nadie se haya dignado hacer un comentario.
FiveWiDi
Posts: 1275
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 4 times
Been thanked: 12 times

Re: VeFa32 - Verifactu

Post by FiveWiDi »

paquitohm wrote: Thu Apr 10, 2025 6:41 am
FiveWiDi wrote: Tue Apr 08, 2025 2:51 pm
Cualquier cosa rara/inexplicable que veais

Pues ahora que lo dices. Veo inexplicable que tu post tiene más de 2.400 visitas y nadie se haya dignado hacer un comentario.
Sinceramente no sé ni como se mira el número de visitas.

Estas cifra quiere decir que es un tema que interesa a muchísima gente, pues afectará a un porcentaje elevado de las pequeñas y medianas empresas, a los profesionales y a los autónomos, y de rebote a los que les dan servicio en los SIF que utilicen.
Y es por eso la gente entra a ver si hay algo interesante o que le aporte algo.

Que nadie dice nada? Pues tampoco lo espero ni lo busco, pero se agradece que te digan "esto funciona" e incluso que "esto se hace mejor de otra manera".

El caso es que yo en este foro he aprendido mucho, he tomado ideas, ejemplos y utilidades.
Y como este de Veri*factu es un tema que estoy trabajando, pues he pensado que una de las maneras de dar las gracias es compartir experiencia y conocimiento.

Pero si, me alegro de tener estas visitas.
Un Saludo
Carlos G.

FiveWin 25.01 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 10
paquitohm
Posts: 293
Joined: Fri Jan 14, 2022 8:37 am
Been thanked: 1 time

Re: VeFa32 - Verifactu

Post by paquitohm »

Carlos,

Me ha parecido que utilizas una tabla para las bases imponibles.
Yo habia pensado poner 6 tuplas de campos en la tabla superior (Tipo IVA, Base, Cuota)

Estoy en ese punto del diseño cuando las tareas me lo permiten. Ahora mismo es el caso.
Tu VeFa32, su existencia, me ha dado la idea de aislarlo todo bien aislado y asi quiza me ahorro pasar usuarios DOS a Win porque en algunos casos, en algunos clientes, el Verifactu no es una oportunidad sino una incomodiad.

Una sugerencia: La respuesta, ademas de en el portapapeles grabala en una carpeta c:\Respuesta\UltimaRespuesta.xml donde el programa llamador podrá encontrar ese archivo para hacer con el lo que quiera.

Pido perdon porque las vistas que conté son de todo el grupo y no de este hilo.

PD. El VF lo he enfocado desde el punto de vista de operaciones permitidas. Veremos como sale. Lo que mas me pone es el hecho de que se supone que la mayoria de dudas operacionales no tendrian que ser tales porque eso existe desde tiempo inmemoria en el reglamento de facturacion. Pero va a resultar que somos nosotros los que vamos a tener que dar asistencia para enseñar al usuario a hacer las operaciones correctas (altas, subsanaciones, anulaciones). Por cierto: Estas usando las anulaciones en tu programa

Salu2
FiveWiDi
Posts: 1275
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 4 times
Been thanked: 12 times

Re: VeFa32 - Verifactu

Post by FiveWiDi »

paquitohm wrote: Thu Apr 10, 2025 4:35 pm Me ha parecido que utilizas una tabla para las bases imponibles.
Yo habia pensado poner 6 tuplas de campos en la tabla superior (Tipo IVA, Base, Cuota)
No, lo que tengo es una tabla auxiliar de las facturas que entre otros tiene estos campos:

TIPUFACT <> Caràcter <> 1 <> 0 <> Tipus Factura (C-ompres V-endes)
IDFACTUR <> Caràcter <> 25 <> 0 <> Identificació factura
CODIPERS <> Caràcter <> 12 <> 0 <> Codi proveidor/client
TIPUIMPO <> Numèric <> 1 <> 0 <> Tipus Import (1-B.I., 2-Altres NO IVA, 3-IVA No Dedu., 4-IVA, 5-IRPF, 9-Total
IMPORT__ <> Numèric <> 10 <> 2 <> Import
PERCENTA <> Numèric <> 10 <> 4 <> Percentatge IVA/IRPF
BASECALC <> Numèric <> 10 <> 2 <> Base pel càlcul

De esta manera estoy desvinculado del tipo de IVA/IRPF que se vaya a utilizar. Es heredado de un sistema contable sencillo que hice. Me sirve para las declaraciones trimestrales/anuales, 340, etc. El inconveniente es que el usuario puede teclear el valor de IVA/IRPF que desee sin que se valide nada.
paquitohm wrote: Thu Apr 10, 2025 4:35 pm Tu VeFa32, su existencia, me ha dado la idea de aislarlo todo bien aislado y asi quiza me ahorro pasar usuarios DOS a Win porque en algunos casos, en algunos clientes, el Verifactu no es una oportunidad sino una incomodiad.
Si, esa era mi intención también, pero empecé integrándolo en un sistema que hace varias cosas, y por falta de tiempo no he sido capaz después de aislarlo. Lo he resuelto con una chapuza, VeFa32 tiene un menú específico para él y permite hacer lo que tiene el menú.
paquitohm wrote: Thu Apr 10, 2025 4:35 pm Una sugerencia: La respuesta, ademas de en el portapapeles grabala en una carpeta c:\Respuesta\UltimaRespuesta.xml donde el programa llamador podrá encontrar ese archivo para hacer con el lo que quiera.
Me parece buena idea, de hecho guardo los XML de envío/respuesta a/de Veri*factu.
paquitohm wrote: Thu Apr 10, 2025 4:35 pm PD. El VF lo he enfocado desde el punto de vista de operaciones permitidas. Veremos como sale. Lo que mas me pone es el hecho de que se supone que la mayoria de dudas operacionales no tendrian que ser tales porque eso existe desde tiempo inmemoria en el reglamento de facturacion. Pero va a resultar que somos nosotros los que vamos a tener que dar asistencia para enseñar al usuario a hacer las operaciones correctas (altas, subsanaciones, anulaciones). Por cierto: Estas usando las anulaciones en tu programa
Yo lo he enfocado de manera que sea el SIF que tenga sus controles/limitaciones adecuadas a la ley, y que VeFa32 sólo se dedique a enviar y gestionar lo que le provee el SIF.
'...dudas operacionales no tendrian ...', exacto, pero el mercado estaba como estaba y se permitía que el usuario pidiera la luna. Ahora tocará crear consciencia del cambio, por ejemplo para situaciones 'no permitidas' que aparezca un mensaje (y si es necesario 2 ó 3) indiándo que en el 2026 no se podrá hacer. Eso lo he visto en un SIF, han empezado con validaciones de datos de clientes y si no pasan el filtro avisa pero de momento permite continuar.

Seguimos,
Un Saludo
Carlos G.

FiveWin 25.01 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 10
paquitohm
Posts: 293
Joined: Fri Jan 14, 2022 8:37 am
Been thanked: 1 time

Re: VeFa32 - Verifactu

Post by paquitohm »

Yo lo he enfocado de manera que sea el SIF que tenga sus controles/limitaciones adecuadas a la ley, y que VeFa32 sólo se dedique a enviar y gestionar lo que le provee el SIF.
'...dudas operacionales no tendrian ...', exacto, pero el mercado estaba como estaba y se permitía que el usuario pidiera la luna. Ahora tocará crear consciencia del cambio, por ejemplo para situaciones 'no permitidas' que aparezca un mensaje (y si es necesario 2 ó 3) indiándo que en el 2026 no se podrá hacer. Eso lo he visto en un SIF, han empezado con validaciones de datos de clientes y si no pasan el filtro avisa pero de momento permite continuar.
Entiendo que unas minimas validaciones tendras que poner en el conector VeFa32 para evitar que otros SIFs lo alimenten erroneamente.


Otra:

Como te comentaba antes el lio lo tengo ahora mismo pensando en como el usuario va a responder. ¿ Dejar al usuario que manipule F1, F2, F3,R1,R2,R3,R4,R5 ? Pufff.... La verdad es que conforme se anda se van resolviendo los temas... o eso creo
paquitohm
Posts: 293
Joined: Fri Jan 14, 2022 8:37 am
Been thanked: 1 time

Re: VeFa32 - Verifactu

Post by paquitohm »

Carlos,

Pues a falta de implementa la operativa alimentacion de la tabla, la estructura que me queda es esta.
Ya ves que en mi caso las bases van en el mismo registro y tb. se utiliza para albergar la parte de respuesta del detalle.
Dime por favor si vieras algo raro.

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
   {"CMIDVers", "C", 3,   0},;  // RegistroAltaBase/RegistroAnulacion IDVersion
   {"CMSignat", "C", 250, 0},;  // RegistroAltaBase/RegistroAnulacion Signature
   {"CMRefExt", "C", 60,  0},;  // RegistroAltaBase/RegistroAnulacion RefExterna
   {"CMRecPre", "C", 1,   0},;  // RegistroAltaBase/RegistroAnulacion RechazoPrevio
   {"CMFHoReg", "C", 20,  0},;  // RegistroAltaBase/RegistroAnulacion FechaHoraHusoGenRegistro
   {"CMTipHue", "C", 2,   0},;  // RegistroAltaBase/RegistroAnulacion TipoHuella
   ;
   ; // RegistroAltaBase
   {"RANomRaz", "C", 120, 0},;  // NombreRazonEmisor
   {"RAOpeAlt", "C", 10,  0},;  // cOperacionAlta
   {"RASubSan", "C", 1,   0},;  // Subsanacion
   {"RATipFac", "C", 2,   0},;  // TipoFactura
   {"RATipRec", "C", 1,   0},;  // TipoRectificativa
   {"RAFecOpe", "D", 8,   0},;  // FechaOperacion
   {"RADesOpe", "C", 250, 0},;  // DescripcionOperacion
   {"RAFSimpl", "C", 1,   0},;  // FacturaSimplificadaArt7273
   {"RAFSinId", "C", 1,   0},;  // FacturaSinIdentifDestinatarioArt61d
   {"RAMacroD", "C", 1,   0},;  // Macrodato
   {"RAEmiTer", "C", 1,   0},;  // EmitidaPorTerceroODestinatario
   {"RACupon", "C", 250,  0},;  // Cupon
   {"RACuoTot", "N", 12,  2},;  // CuotaTotal
   {"RAImpTot", "N", 12,  2},;  // ImporteTotal
   {"RANumAcu", "C", 15,  0},;  // XX NumRegistroAcuerdoFacturacion
   {"RAIDSist", "C", 16,  0},;  // XX IdAcuerdoSistemaInformatico
   ;
   ; // RegistroAnulacion
   {"RNOpeAnu", "C", 10,  0},;  // cOperacionAnulacion
   {"RNSinReg", "C", 1,   0},;  // SinRegistroPrevio
   {"RNGenPor", "C", 1,   0},;  // GeneradoPor
   ;
   ; // IDFacturaExpedida
   {"IFIDEmis", "C", MAX_NIF, 0},;  // IDEmisorFactura
   {"IFNumSer", "C", 60,  0},;  // NumSerieFactura
   {"IFFecExp", "D", 8,   0},;  // FechaExpedicionFactura
   ;
   ; // RegistroAnterior
   {"RGIDEmis", "C", 9,   0},;  // IDEmisorFactura
   {"RGNumSer", "C", 60,  0},;  // NumSerieFactura
   {"RGFecExp", "D", 8,   0},;  // FechaExpedicionFactura
   {"RGHuelll", "C", 64,  0},;  // Huella
   ;
   ; // DesgloseRectificacion
   {"DRBasRec", "N", 12,  2},;  // BaseRectificada
   {"DRCuoRec", "N", 12,  2},;  // CuotaRectificada
   {"DRCuRRec", "N", 12,  2},;  // CuotaRecargoRectificado
   ;
   ; // DetalleDesglose
   {"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
   {"ENPriReg", "C", 1,   0},;  // PrimerRegistro
   ;
   ;
   ; // ** RESPUESTA ** //
   ;
   {"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
   {"RSCodErr", "N", 4,   0},;      // CodigoError
   {"RSDesErr", "C", 40,  0} ;      // DescripcionError
}
Salu2
FiveWiDi
Posts: 1275
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 4 times
Been thanked: 12 times

Re: VeFa32 - Verifactu

Post by FiveWiDi »

paquitohm wrote: Thu Apr 10, 2025 4:35 pmUna sugerencia: La respuesta, ademas de en el portapapeles grabala en una carpeta c:\Respuesta\UltimaRespuesta.xml donde el programa llamador podrá encontrar ese archivo para hacer con el lo que quiera.
Hecho, en la versión del 15/04/2025 estará disponible.
VeFa32 tiene una carpeta específica para los Xml enviados y los de respuesta; ahora además tendrá una subcarpeta para cada año.

Seguimos,
Un Saludo
Carlos G.

FiveWin 25.01 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 10
FiveWiDi
Posts: 1275
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 4 times
Been thanked: 12 times

Re: VeFa32 - Verifactu

Post by FiveWiDi »

paquitohm wrote: Fri Apr 11, 2025 11:51 amEntiendo que unas minimas validaciones tendras que poner en el conector VeFa32 para evitar que otros SIFs lo alimenten erroneamente.
Sólo hago 2 cosas:
-'limpio' el NIF (dejo sólo letras y cifras)
-busco si en VeFa32 ya existen datos de esa factura, si es así 'machaco' sus datos por lo que envía el SIF (dudo que el SIF guarde versiones de las facturas, VeFa32 tampoco), y serán éstos los que se enviaran a Veri*factu (1)

(1) si el SIF envía datos de una misma factura a VeFa32 más de una vez:
-Si es antes del envío de VeFa32 a Veri*factu (VeFa32 envia a Veri*factu cada 'n' segundos), se enviará la última información proporcionada por el SIF.
-Si VeFa32 ya ha enviado a Veri*factu en un momento anterior, se volverá a enviar-->>es responsabilidad del SIF indicar a VeFa32 que se trata de una subsanación. Si no lo indica Veri*factu lo rechazará y el usuario/SIF deberá reaccionar según convenga.

VeFa32 es una utilidad para enviar datos y recoger información. Si hiciera más cosas estaría limitando la libertad del programador del SIF para hacer o arreglar o adaptar lo que crea necesario. Si hay un error debe estar en el SIF, así la rapidez de respuesta recae en el desarrollador del SIF: facturar y Veri*factu son procesos críticos. Además así VeFa32 es transparente y da confianza al integrador del SIF, sabe que VeFa32 no hará cosas que no debe.

paquitohm wrote: Fri Apr 11, 2025 11:51 amComo te comentaba antes el lio lo tengo ahora mismo pensando en como el usuario va a responder. ¿ Dejar al usuario que manipule F1, F2, F3,R1,R2,R3,R4,R5 ? Pufff.... La verdad es que conforme se anda se van resolviendo los temas... o eso creo
No dejo que el usuario manipule (ahora que lo dices, permitiré que envíe a VeFa32 el tipo factura, y si no lo hace aplicaré la función que detallo).
De momento sólo contemplo los tipos F1, F2, R1, R5.

Utilizo esta función, creo que se corresponde de lo que se desprende de la documentación de Veri*factu:

Code: Select all | Expand

FUNCTION cTipuVFFactura( AMPAARRA, lESRECTIF, cSINDESTI, cSIMPLIFI )

// En base a los valores recibidos indicará que tipo de factura es.

Local cTipuFactura := ""

// He dejado el orden SINDESTIno, SIMPLIFIcada, el RESTO, porqué en Verifactu si se interpreta que es SIMPLIFICADA se entiende que es ¡¡¡CON!!! destinatario.

If cSINDESTI = "S"
    If lESRECTIF
	    cTipuFactura := "R5"
      Else
        cTipuFactura := "F2"
	EndIf
ElseIf cSIMPLIFI = "S"
    If lESRECTIF
	    cTipuFactura := "R1"
      Else
        cTipuFactura := "F1"
	EndIf
Else
    If lESRECTIF
        cTipuFactura := "R1"
      Else
        cTipuFactura := "F1"
	EndIf
EndIf

Return cTipuFactura
Seguimos
Un Saludo
Carlos G.

FiveWin 25.01 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 10
FiveWiDi
Posts: 1275
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 4 times
Been thanked: 12 times

Re: VeFa32 - Verifactu

Post by FiveWiDi »

paquitohm wrote: Fri Apr 11, 2025 6:34 pmDime por favor si vieras algo raro.
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.
En VeFa32 utilizo 3 tablas para gestionar el envío/respuesta a/de Veri*factu:

Code: Select all | Expand

Para los datos de los XML enviados.
===================================
Nombre base:     VERFAC
Descripción:     VF-XML Veri*Factu

Nombre campo <> Tipo     <> Lon <> Decim. <> Descripción
============ <> ======== <> === <> ====== <> ==========
*CODIVEFA*     <> Carácter <>  12 <>    0   <> Código VeFa32 Xml único
IDVERFAC     <> Carácter <>  25 <>    0   <> Identificación VeFa32 (referencia única; da nombre al XML)
VF_ESTAT     <> Numérico <>   3 <>    0   <> Estado Verifactu (5-En revisión, 10-Iniciado, 15-XML generado, 20-Acabado, 30-Acabado con error,...)
INCIDENC     <> Carácter <>   1 <>    0   <> Tiene Incidencia previa (Si, No)
ESTAENVI     <> Carácter <>  50 <>    0   <> Estado Envío (respuesta Veri*factu:Correcto, ParcialmenteCorrecto, Incorrecto)
TIPUENVI     <> Numérico <>   2 <>    0   <> Tipo Envío (10-Voluntario 20-Requerimiento)
TISTENVI     <> Carácter <>  30 <>    0   <> Time Stamp Envío
DATENVVF     <> Fecha    <>   8 <>    0   <> Fecha Envío
HORENVVF     <> Carácter <>   8 <>    0   <> Hora Envío
FITXENVI     <> Carácter <>  40 <>    0   <> Fichero Envío
DATRECVF     <> Fecha    <>   8 <>    0   <> Fecha recepción
HORRECVF     <> Carácter <>   8 <>    0   <> Hora recepción
FITXRESP     <> Carácter <>  50 <>    0   <> Fichero respuesta
CSVRESPO     <> Carácter <>  25 <>    0   <> CSV recibido respuesta
NUMEREGI     <> Numérico <>   5 <>    0   <> Registros tratados VFREGI


Para los registros con datos de las facturas.
=============================================
Nombre base:     VFREGI
Descripción:     VF-Reg. Verifactu

Nombre campo <> Tipo     <> Lon <> Decim. <> Descripción
============ <> ======== <> === <> ====== <> ==========
*CODIVFRE*     <> Carácter <>  12 <>    0   <> Código Regi.VeFa32 (código único)
IDVFREGI     <> Carácter <>  25 <>    0   <> Identif.Reg.VeFa32 (referencia única)

VFCODFAC     <> Carácter <>  20 <>    0   <> Código Fact.SIF (código factura enviado en XML)
NIF          <> Carácter <>  20 <>    0   <> N.I.F. destinatario factura
DATAFACT     <> Fecha    <>   8 <>    0   <> Fecha Factura
IMPOTOTA     <> Numérico <>  15 <>    6   <> Importe TOTAL factura

*CODIVEFA*     <> Carácter <>  12 <>    0   <> Código VeFa32    (código del registro DBF VERFAC)
IDPETICI     <> Carácter <>  40 <>    0   <> Id 'Petición' (se captura al consultar a Hacienda)
TIPUREGI     <> Numérico <>   3 <>    0   <> Tipo Registro (10-alta, 110-Anulación, ...)
ESTAREGI     <> Carácter <>  25 <>    0   <> Respuesta de Veri*factu (Correcto, AceptadoConErrores, Incorrecto,...)
SUBSANAC     <> Carácter <>   1 <>    0   <> Es Subsanación (Si, No)
REBUPREV     <> Carácter <>   1 <>    0   <> Es Rechazo previo (Si, No)
NOREGPRE     <> Carácter <>   1 <>    0   <> NO Tiene Reg. previo (Si, No)
SIMPLIFI     <> Carácter <>   1 <>    0   <> Simplificada (S-N)
SINDESTI     <> Carácter <>   1 <>    0   <> Sin destinatario (S-N)
VFCADHUE     <> Carácter <> 300 <>    0   <> Cadena cálculo Huella (para saber con que datos se ha calculado la huella)
VFHUELLA     <> Carácter <>  75 <>    0   <> Huella-Verifactu
AVFCODFA     <> Carácter <>  20 <>    0   <> Fact.Anterior.Código Fact.Completo
ADATAFAC     <> Fecha    <>   8 <>    0   <> Fact.Anterior.Fecha Factura
VFHUEANT     <> Carácter <>  75 <>    0   <> Reg.Fact.Anterior Huella
VF_ESTAT     <> Numérico <>   3 <>    0   <> Estado Verifactu (5-En revisión, 10-Iniciado, 15-XML generado, 20-Acabado, 30-Acabado con error,...)
INTENT__     <> Numérico <>   3 <>    0   <> Núm.Intento envío (VeFa32 puede hacer reenvíos automáticos)
IDFACTUR     <> Carácter <>  25 <>    0   <> Identificación única factura (del SIF)
ORIGEN__     <> Numérico <>   2 <>    0   <> Origen del registro. (manual, VeFA32, importado Hacienda, ...)
DATVERHI     <> Fecha    <>   8 <>    0   <> Fecha Verificación Hacienda (fecha de la consulta a Hacienda)


Para los errores recibidos de Veri*factu.
=========================================
Nombre base:     VFERRO
Descripción:     VF-Errores Reg.Verifactu

Nombre campo <> Tipo     <> Lon <> Decim. <> Descripción
============ <> ======== <> === <> ====== <> ==========
*CODIVEFA*     <> Carácter <>  12 <>    0   <> Código envío VeFa32
*CODIVFRE*     <> Carácter <>  12 <>    0   <> Código Registro VeFa32
VFCODFAC     <> Carácter <>  20 <>    0   <> Código Factura SIF
CODIERRO     <> Carácter <>  12 <>    0   <> Código Error
DESCERRO     <> Carácter <> 250 <>    0   <> Descr.Error

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.
Un Saludo
Carlos G.

FiveWin 25.01 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 10
Post Reply