Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Envío de registros y sus respuestas (https://www.clubdelphi.com/foros/forumdisplay.php?f=66)
-   -   Demo con código Verifactu.dll para (delphi 7) (https://www.clubdelphi.com/foros/showthread.php?t=97004)

bmfranky 09-04-2025 14:51:24

Cita:

Empezado por seccion_31 (Mensaje 563600)
gracias por las aclaraciones

En la proxima actualizacion sera posible enviar una factura con su huella original y anterior original. si han pasado mas de 2 minutos desde la huella proporcionada, marcara como incidencia ese envio. ¿ ese tiempo de 2 minutos esta bien ?

En principio la forma de trabajar con el componente sería, de forma simplificada.

INICIO

1) hago una factura
2) inmedatamente la envio, (con exito, o no, me da lo mismo, igual que imprimo la envio)
3) obtendre su huella, la archivo en la factura
4) proceso el envio (si es posible, podria ser que no, debido a causas externas, si es posible guardo el csv )

FIN

ADICIONALMENTE:

1) Crear una lista de facturas pendientes de envio
2) Enviarlas en cuanto sea posible, reutilizando esa huella y huella anterior almacenada


Creo que el proceso cumple. Para procesos de facturacion individuales.

Con este tema, creo que queda cerrado ya todos los flecos a falta de probarlo.

Su implementacion en los que lo esten usando sera muy simple.

gracias !

Hola lo único es que los puntos 2 y 3 están invertidos primero se halla la huella y luego se envia:D

seccion_31 09-04-2025 15:04:27

Cita:

Empezado por bmfranky (Mensaje 563601)
Hola lo único es que los puntos 2 y 3 están invertidos primero se halla la huella y luego se envia:D

bueno... a ver

la huella no puede ser calculada hasta finalizar la factura, o casi. Lo normal seria esperar a tenerla finalizada. (digo lo normal).

Aquí haces tu factura, y la envías inmediatamente, en el momento del envío, mientras compone el objeto SOAP el registro de Facturacion (x cada factura, antes de su envío), hay un evento que te indica la huella calculada, ahí ya se puede archivar, pero además cuando finalice, o no el envío, completo o no completo, con fallos o sin ellos, puedes todavía recoger las huellas: hablamos de 1 segundo como mucho entre un proceso u otro.

Se podría considerar como una parte del proceso de Facturacion la generación de las huellas, antes de su envío, que ocurre automáticamente al finalizar la factura. (en mi caso).

Evidentemente las huellas se calculan antes, o se recogen vía evento, o al finalizar el envío.

No creo que haya problemas ahí.

Tambien:

Se podría simular un envío, obtener las huellas y archivarlas ¿y después? enviarlas. no le veo sentido.

Estando en verifactu el envio debe ser inmediato. Creo que cumplimos.

bmfranky 09-04-2025 15:36:53

Cita:

Empezado por seccion_31 (Mensaje 563602)
bueno... a ver

la huella no puede ser calculada hasta finalizar la factura, o casi. Lo normal seria esperar a tenerla finalizada. (digo lo normal).

Aquí haces tu factura, y la envías inmediatamente, en el momento del envío, mientras compone el objeto SOAP el registro de Facturacion (x cada factura, antes de su envío), hay un evento que te indica la huella calculada, ahí ya se puede archivar, pero además cuando finalice, o no el envío, completo o no completo, con fallos o sin ellos, puedes todavía recoger las huellas: hablamos de 1 segundo como mucho entre un proceso u otro.

Se podría considerar como una parte del proceso de Facturacion la generación de las huellas, antes de su envío, que ocurre automáticamente al finalizar la factura. (en mi caso).

Evidentemente las huellas se calculan antes, o se recogen vía evento, o al finalizar el envío.

No creo que haya problemas ahí.

Tambien:

Se podría simular un envío, obtener las huellas y archivarlas ¿y después? enviarlas. no le veo sentido.

Estando en verifactu el envio debe ser inmediato. Creo que cumplimos.


Hola, en el momento que imprimes/guardas la factura la huella ya la has de tener, no puedes calcularla despues, puesto que los datos han de ser los mismos que van en el QR, por eso decia de calcular la huella antes.


Yo por mi parte , calculo la huella en el mismo evento de preimpresion de la factura, al mismo tiempo que genero el QR, asi me aseguro que todos los datos concuerden, al finalizar la impresion, justo despues de realizar el envio , si hay error de envio** , lo muestro y almaceno , en mi caso como una proforma, porque me resulta mas facil despues reeenviarla , al no tener implementado el servicio de envio separado.


Como no he impreso, guardado la factura, la genero de 0 creando todos los campos.

*A ver , lo de el error de envio , lo saco de la consulta a la aeat, para ver si el servicio esta activo, lo hago antes de preimprimir ni nada la factura, es que creo que no me he explicado correctamente.

*Este sistema solo lo uso si no se ha podido realizar el envio porque no hay conexion, en caso de error de otro tipo, imprimo y guardo todo de forma normal, para poder realizar la Subsanacion 0 reenvio como sea correcto, sea con una rectificativa o lo que sea menester.

seccion_31 09-04-2025 16:40:37

Cita:

Empezado por bmfranky (Mensaje 563606)
Hola, en el momento que imprimes/guardas la factura la huella ya la has de tener, no puedes calcularla despues, puesto que los datos han de ser los mismos que van en el QR, por eso decia de calcular la huella antes.


Yo por mi parte , calculo la huella en el mismo evento de preimpresion de la factura, al mismo tiempo que genero el QR, asi me aseguro que todos los datos concuerden, al finalizar la impresion, justo despues de realizar el envio , si hay error de envio** , lo muestro y almaceno , en mi caso como una proforma, porque me resulta mas facil despues reeenviarla , al no tener implementado el servicio de envio separado.


Como no he impreso, guardado la factura, la genero de 0 creando todos los campos.

*A ver , lo de el error de envio , lo saco de la consulta a la aeat, para ver si el servicio esta activo, lo hago antes de preimprimir ni nada la factura, es que creo que no me he explicado correctamente.

*Este sistema solo lo uso si no se ha podido realizar el envio porque no hay conexion, en caso de error de otro tipo, imprimo y guardo todo de forma normal, para poder realizar la Subsanacion 0 reenvio como sea correcto, sea con una rectificativa o lo que sea menester.

Por comentar temas, a ver....

Los datos que van en el QR son diferentes a la huella. La huella contiene algunos mas. NO es recomendable, pero puedes imprimir una factura con su QR sin tener la huella calculada. Yo no lo haria, pero se puede.

El servicio activo no te garantiza al 100% que se vaya a ejecutar el alta, pero esta bien. (El resto de procesos que haces ya depende de cada uno, hasta ahi)

Ya me he explicado, para aclarar un poco mas, para los que usan el componente:

1) Haces la factura
2) Aqui podrias calcular tu QR sin problemas
3) Añades la factura al componente
4) Se ordena el envio
5) (durante la preparacion del envio se genera la huella y se envia por evento, para guardarla en cada factura)
6) Se envia a la AEAT
7) (y aqui tambien se pueden recoger las huella/s generadas, para guardarlas en la factura)
8) Imprimes


Quizas incluya una funcion "libre de envio" que devuelva la huella en cualquier momento.

Personalmente En mi caso, siempre envio antes de imprimir. La factura se queda enviada, o pendiente. La pendiente, se reenviara cuando sea técnicamente posible: ahora con las huellas actuales y anteriores guardadas, no hay problema alguno. Envias y ya. Se marcara incidencia si el tiempo supera en 2 minutos el establecido en la huella.

Y Validar el NIF antes de empezar mejor
Y Validar si esta activa la AEAT mejor

Saludos !

seccion_31 09-04-2025 16:50:56

aun asi, y no os molesteis mucho todavia hay un caso sobre encadenamientos, no dudas del componente:



a ver si alguien tiene paciencia:


facturas


sesion 1:
Factura 4 fallida en el envio por fallo de internet encadena con 3



sesion 2: <- aqui ya funciona internet, nos ponemos a facturar

Factura 5 encadena con 4
Factura 6 encadena con 5
Factura 4 encadena con 3 <- reenvío la 4 cuando vemos que ya funciona internet, (hemos enviado 2 delante)

Factura 7 encadena con ?

rci 09-04-2025 16:56:49

Cita:

Empezado por seccion_31 (Mensaje 563610)
aun asi, y no os molesteis mucho todavia hay un caso sobre encadenamientos, no dudas del componente:



a ver si alguien tiene paciencia:


facturas


sesion 1:
Factura 4 fallida en el envio por fallo de internet encadena con 3



sesion 2: <- aqui ya funciona internet, nos ponemos a facturar

Factura 5 encadena con 4
Factura 6 encadena con 5
Factura 4 encadena con 3 <- reenvío la 4 cuando vemos que ya funciona internet, (hemos enviado 2 delante)

Factura 7 encadena con ?

Cuando se crea la factura 7, su registro de facturación tiene que estar encadenado con el último registro de facturación creado (del mismo obligado tributario y mismo SIF).
Probablemente será el registro de facturación de alta de la factura 6, pero podría no serlo, podría ser una eventual subsanación de la factura 1 por ejemplo.

El encadenamiento no tiene nada que ver con el envío.
Al crear una factura debes crear el registro de facturación de alta y guardar en algún sitio (una tabla por ejemplo) los datos del último registro de facturación creado.
Cuando se crea otro registro de facturación (ya sea de alta de una nueva factura, de anulación, de subsanación) se encadena con el último registro de facturación creado.

El envío de registros de facturación no afecta al encadenamiento. Los registros de facturación creados y no enviados, se van enviando cuando toque, siguiendo el control de flujo que indica la ley

rafa1963 09-04-2025 17:53:38

error el la fecha y hora del xml de envío
 
Buenas tardes compañeros estoy haciendo las pruebas con el proyecto del compañero sección31, y me encuentro con este error al realizar el envío de pruebas => CSV: A-8ZC67LVDU6WUPC. TimeStamp: 16:47:49 09/04/2025. He comprobado la fecha del ordenador y está correcta 17:47:50 al parecer no recoge la nueva hora.
Me podeis echar una manita.
Gracias

bmfranky 09-04-2025 17:54:46

Cita:

Empezado por rci (Mensaje 563611)
Cuando se crea la factura 7, su registro de facturación tiene que estar encadenado con el último registro de facturación creado (del mismo obligado tributario y mismo SIF).
Probablemente será el registro de facturación de alta de la factura 6, pero podría no serlo, podría ser una eventual subsanación de la factura 1 por ejemplo.

El encadenamiento no tiene nada que ver con el envío.
Al crear una factura debes crear el registro de facturación de alta y guardar en algún sitio (una tabla por ejemplo) los datos del último registro de facturación creado.
Cuando se crea otro registro de facturación (ya sea de alta de una nueva factura, de anulación, de subsanación) se encadena con el último registro de facturación creado.

El envío de registros de facturación no afecta al encadenamiento. Los registros de facturación creados y no enviados, se van enviando cuando toque, siguiendo el control de flujo que indica la ley

Cita:

Empezado por seccion_31 (Mensaje 563610)
aun asi, y no os molesteis mucho todavia hay un caso sobre encadenamientos, no dudas del componente:



a ver si alguien tiene paciencia:


facturas


sesion 1:
Factura 4 fallida en el envio por fallo de internet encadena con 3



sesion 2: <- aqui ya funciona internet, nos ponemos a facturar
<<<- La cola de envios empieza aqui, sino seguramnete dara error cuando estemos en produccion.

Factura 5 encadena con 4
Factura 6 encadena con 5
Factura 4 encadena con 3 <- reenvío la 4 cuando vemos que ya funciona internet, (hemos enviado 2 delante)<<<< MAL

Factura 7 encadena con 6 no ha de reencadenar nada


Hola, como bien dice @rci, lo que has de guardar son los registros ya encadenados, independientemente de si se enviaron o no, has de crear unas tablas, ya sea con el XML complero del registro de facturacion completo, creo que desde c# lo mas facil, o todos los datos para recrearlo al enviar, pero ya completado.


Deves hacer 2 cosas en ese supuesto, inmediatamente enviar lo pendiente , en este caso el registro de factura 4 que ya esta correctamente encadenado, indicando en la cabecera e el fallo en el envio, y esperar los x, segundos para empezar a enviar los registros encolados despues.


Aunque puedes esperar a enviar cuando tengas mas registros , no te lo recomiendo.

bmfranky 09-04-2025 17:57:57

Cita:

Empezado por rafa1963 (Mensaje 563612)
Buenas tardes compañeros estoy haciendo las pruebas con el proyecto del compañero sección31, y me encuentro con este error al realizar el envío de pruebas => CSV: A-8ZC67LVDU6WUPC. TimeStamp: 16:47:49 09/04/2025. He comprobado la fecha del ordenador y está correcta 17:47:50 al parecer no recoge la nueva hora.
Me podeis echar una manita.
Gracias

Hola, por favor habre un hilo nuevo, y postea el xml, del envio ,para poder verificar donde esta el error, simplemente modifique sus datos, en este casoi necesitamos ver el nodo FechaHoraUsoGenRegistro...

seccion_31 09-04-2025 18:02:33

Cita:

Empezado por bmfranky (Mensaje 563613)
Hola, como bien dice @rci, lo que has de guardar son los registros ya encadenados, independientemente de si se enviaron o no, has de crear unas tablas, ya sea con el XML complero del registro de facturacion completo, creo que desde c# lo mas facil, o todos los datos para recrearlo al enviar, pero ya completado.


Deves hacer 2 cosas en ese supuesto, inmediatamente enviar lo pendiente , en este caso el registro de factura 4 que ya esta correctamente encadenado, indicando en la cabecera e el fallo en el envio, y esperar los x, segundos para empezar a enviar los registros encolados despues.


Aunque puedes esperar a enviar cuando tengas mas registros , no te lo recomiendo.

Efectivamente,

Si, eso entraria en la logica del programa. Colocar los pendientes primero. (el componente no tiene base de datos) (la demo hace uso de una base de datos basica demostrativa, no entra en esta complicacion).

Aun asi, me asegurare que si en un paquete de envio hay varios pendientes, siempre se coloque la huella anterior correcta. Lo cual minoraria el problema, porque el envio seria correcto.

Basicamente ya esta echo. Me falta probarlo bien.

gracias a todos !

seccion_31 09-04-2025 18:05:30

Cita:

Empezado por rafa1963 (Mensaje 563612)
Buenas tardes compañeros estoy haciendo las pruebas con el proyecto del compañero sección31, y me encuentro con este error al realizar el envío de pruebas => CSV: A-8ZC67LVDU6WUPC. TimeStamp: 16:47:49 09/04/2025. He comprobado la fecha del ordenador y está correcta 17:47:50 al parecer no recoge la nueva hora.
Me podeis echar una manita.
Gracias

a ver si alguien puede ayudarle, nunca habia tenido problemas con la hora.

Slds !

bmfranky 09-04-2025 18:05:42

Cita:

Empezado por seccion_31 (Mensaje 563616)
Efectivamente,

Si, eso entraria en la logica del programa. Colocar los pendientes primero. (el componente no tiene base de datos) (la demo hace uso de una base de datos basica demostrativa, no entra en esta complicacion).

Aun asi, me asegurare que si en un paquete de envio hay varios pendientes, siempre se coloque la huella anterior correcta. Lo cual minoraria el problema, porque el envio seria correcto.

Basicamente ya esta echo. Me falta probarlo bien.

gracias a todos !

Una solucion patatera que se me ocurre es , al fallar el envio, generar en un directorio temporal, los registros pendientes de envio, con su xml completo, al comprobar que ya hay conexion, verificar si el directorio tiene contenido, y entonces automaticamente, antes de permitir empezar a factura, cargar todas las facturas pendientes en orden, y al cargar/enviar la ultima establecer esos datos como los correctos para el encadenamiento.

bmfranky 09-04-2025 18:06:29

Cita:

Empezado por seccion_31 (Mensaje 563617)
a ver si alguien puede ayudarle, nunca habia tenido problemas con la hora.

Slds !

Si, ya le he comentado que postee el xml del envio, para verificar, seguramente el uso horario no sea el correcto...

seccion_31 09-04-2025 18:17:10

Cita:

Empezado por bmfranky (Mensaje 563618)
Una solucion patatera que se me ocurre es , al fallar el envio, generar en un directorio temporal, los registros pendientes de envio, con su xml completo, al comprobar que ya hay conexion, verificar si el directorio tiene contenido, y entonces automaticamente, antes de permitir empezar a factura, cargar todas las facturas pendientes en orden, y al cargar/enviar la ultima establecer esos datos como los correctos para el encadenamiento.

gracias ! bueno, pero fuera del uso del componente.

personalmente, en mi aplicación antes de facturar sacare la lista de lo pendiente, para que envíe.

Saludos !

gracias por atender lo de la hora


En mi caso, este es mi timestamp:

2025-04-03T20:06:59+02:00

Y este es el codigo que lo genera:

Cita:

XSDatetime := TXSDatetime.Create;
XSDatetime.AsDateTime := Now;
XSDatetime.UseZeroMilliseconds := False;
XSDatetime.Millisecond := 0;
XSDatetime.UseZeroMilliseconds := False;
XSDatetime.FractionalSeconds := 0;

bmfranky 09-04-2025 18:22:38

Cita:

Empezado por seccion_31 (Mensaje 563616)
Efectivamente,

Si, eso entraria en la logica del programa. Colocar los pendientes primero. (el componente no tiene base de datos) (la demo hace uso de una base de datos basica demostrativa, no entra en esta complicacion).

Aun asi, me asegurare que si en un paquete de envio hay varios pendientes, siempre se coloque la huella anterior correcta. Lo cual minoraria el problema, porque el envio seria correcto.

Basicamente ya esta echo. Me falta probarlo bien.

gracias a todos !


Para dejarlo mas funcional, porque no añades en la base de datos donde guardas la configuracion, los datos del ultimo registro generado, asi siempre puedes cojer de alli los datos para generar el siguiente, sin preocuparte de si se envio o no, esa parte la puede atender el programa fuera del la DLL, la dl unicamente dedicarse a generar los registro y encadenarlos.

bmfranky 09-04-2025 18:27:11

Cita:

Empezado por seccion_31 (Mensaje 563620)
gracias ! bueno, pero fuera del uso del componente.

personalmente, en mi aplicación antes de facturar sacare la lista de lo pendiente, para que envíe.

Saludos !

gracias por atender lo de la hora


En mi caso, este es mi timestamp:

2025-04-03T20:06:59+02:00

Y este es el codigo que lo genera:

Como le indicas la zona horaria, el C#, le he de indicar , "DateTimeKind.Local", para que la establezca correctamente, sino siempre pone +1, aunque cambie la hora.

seccion_31 09-04-2025 20:34:02

Cita:

Empezado por bmfranky (Mensaje 563624)
Como le indicas la zona horaria, el C#, le he de indicar , "DateTimeKind.Local", para que la establezca correctamente, sino siempre pone +1, aunque cambie la hora.

ni idea, funcional tal cual.

seccion_31 10-04-2025 18:00:13

hola !

necesito un voluntario para probar la 4.0, porque esto ya necesita pruebas algo mas complicadas.

El que quiera participar seriamente en las pruebas que me envíe un privado con su mail.

gracias !

seccion_31 11-04-2025 08:59:48

Cita:

Empezado por seccion_31 (Mensaje 563715)
hola !

necesito un voluntario para probar la 4.0, porque esto ya necesita pruebas algo mas complicadas.

El que quiera participar seriamente en las pruebas que me envíe un privado con su mail.

gracias !

ya tenemos dos voluntarios.

En cuanto este validada la publicamos.

Espero que esta version sea la ultima.

Saludos !

jguso 12-04-2025 02:36:03

dudas
 
No entiendo en esta dll, lo del servidor B10 o algo así era. Para que sirve, donde está este servidor, si el servidor se cae o no funciona, como lo levanto para continuar con los envios ...


no se, alguien puede explicar algo al respecto ??

seccion_31 12-04-2025 09:27:02

Cita:

Empezado por jguso (Mensaje 563761)
No entiendo en esta dll, lo del servidor B10 o algo así era. Para que sirve, donde está este servidor, si el servidor se cae o no funciona, como lo levanto para continuar con los envios ...


no se, alguien puede explicar algo al respecto ??

El componente empezo como un aplicacion servidora (aplicacion que recibia mensajes y enviaba las facturas)

Desde hace mucho tiempo se convirtio a una DLL.

Bajate la ultima version, mira la ayuda.txt, ejecuta la excelente demo que lleva y ahi tienes toda la informacion.

slds

mqm 14-04-2025 10:00:18

Machacando el componente
 
Me he puesto el fin de semana a machacar el componente enviado sucesivamente paquetes de facturas.
Estoy trabajando con el Certificado de Prueba emitido por la aeat : 99999910G PRUEBAS CERTIFICADO .

- Si mando facturas de una en una.... guardando el tiempo especificado no hay problema.
- Si mando paquetes de factura 5-15 , cada dos por tres lar rechaza: "Error Al Enviar(ESOAPHTTPException)-Se requiere un certificado para completar la
autenticación de cliente"
- Si intento mandar más de 100 me las rechaza del tirón con el mismo error anterior.

Ya no se si es el componte, el certificado, o algún fallo mío.
He compilado toda la demo en delphi 10.1 y lo he adaptado para que trabaje sobre una base de datos MYSQL.

Otro tema.
Por un fallo mío ... me acepta con errores un factura: Error 2006- El campo CuotaTotal tiene un valor incorrecto para el valor de los campos CuotaRepercutida y CuotaRecargoEquivalencia suministrados.
Intento enviarla la subsanación y me devuelve: Error 3000 - Registro de facturación duplicado.
¿Como tengo que indicar la subsanación con el componente?

delphiGar 14-04-2025 22:22:45

Cita:

Empezado por mqm (Mensaje 563774)
Me he puesto el fin de semana a machacar el componente enviado sucesivamente paquetes de facturas.
Estoy trabajando con el Certificado de Prueba emitido por la aeat : 99999910G PRUEBAS CERTIFICADO .

- Si mando facturas de una en una.... guardando el tiempo especificado no hay problema.
- Si mando paquetes de factura 5-15 , cada dos por tres lar rechaza: "Error Al Enviar(ESOAPHTTPException)-Se requiere un certificado para completar la
autenticación de cliente"
- Si intento mandar más de 100 me las rechaza del tirón con el mismo error anterior.

Ya no se si es el componte, el certificado, o algún fallo mío.
He compilado toda la demo en delphi 10.1 y lo he adaptado para que trabaje sobre una base de datos MYSQL.

Otro tema.
Por un fallo mío ... me acepta con errores un factura: Error 2006- El campo CuotaTotal tiene un valor incorrecto para el valor de los campos CuotaRepercutida y CuotaRecargoEquivalencia suministrados.
Intento enviarla la subsanación y me devuelve: Error 3000 - Registro de facturación duplicado.
¿Como tengo que indicar la subsanación con el componente?

Código:

Subsanacion=S
RechazoPrevio=N


seccion_31 16-04-2025 14:30:08

Una pregunta:


El IRPF no va en verifactu, pero si pasas una factura con el total afectado por el IRPF verifactu la acepta con errores. (ya que no cuadra sumando bases)



He leido en el foro, que se debe colocar el total de factura como base imponible + iva y obviar el tema del irpf. de tal forma que el total de factura NO sera el real.



¿es correcto?


Saludos !

rci 16-04-2025 15:28:36

Cita:

Empezado por seccion_31 (Mensaje 563839)
Una pregunta:


El IRPF no va en verifactu, pero si pasas una factura con el total afectado por el IRPF verifactu la acepta con errores. (ya que no cuadra sumando bases)



He leído en el foro, que se debe colocar el total de factura como base imponible + iva y obviar el tema del irpf. de tal forma que el total de factura NO sera el real.



¿es correcto?


Saludos !

Revisa estas FAQs:

https://sede.agenciatributaria.gob.e...00dc381e0aRCRD

https: // sede.agenciatributaria.gob.es/Sede/iva/sistemas-informaticos-facturacion-verifactu/preguntas-frecuentes/registros-facturacion-alta.html?faqId=10da024ac9572910VgnVCM100000dc381e0aRCRD


Cita:

Cómo se tratan los suplidos, el recargo financiero u otras cantidades en el esquema de la norma? ¿Cómo incluir las retenciones a cuenta de los impuestos directos practicadas en factura?
Creo que puedes hacerlo como dices o incluyendo la retención (opcionalmente) de la forma que explica.


Edito:
Mirando nuestro código veo que lo hacemos así:
En una factura con Retención IRPF, para informar el ImporteTotal de la factura sumamos el importe de la retención, para indicar el importe total con iva de la factura antes de la retención. También al generar el QR.

seccion_31 17-04-2025 07:47:12

Cita:

Empezado por rci (Mensaje 563845)
Revisa estas FAQs:

https://sede.agenciatributaria.gob.e...00dc381e0aRCRD

https: // sede.agenciatributaria.gob.es/Sede/iva/sistemas-informaticos-facturacion-verifactu/preguntas-frecuentes/registros-facturacion-alta.html?faqId=10da024ac9572910VgnVCM100000dc381e0aRCRD




Creo que puedes hacerlo como dices o incluyendo la retención (opcionalmente) de la forma que explica.


Edito:
Mirando nuestro código veo que lo hacemos así:
En una factura con Retención IRPF, para informar el ImporteTotal de la factura sumamos el importe de la retención, para indicar el importe total con iva de la factura antes de la retención. También al generar el QR.

gracias por la respuesta, pero no soy muy bueno interpretando esas faq de la aeat. Tampoco me aclaro como lo haces, con el ejemplo que has puesto.

rci 17-04-2025 09:01:14

Diria que está bien lo que dijiste
Cita:

Empezado por seccion_31 (Mensaje 563839)
He leido en el foro, que se debe colocar el total de factura como base imponible + iva y obviar el tema del irpf.
¿es correcto?

Cita:

Empezado por seccion_31 (Mensaje 563839)
de tal forma que el total de factura NO sera el real.

Será total de la factura el real sin tener en cuenta la retención del IRPF

Cita:

Empezado por seccion_31 (Mensaje 563867)
Tampoco me aclaro como lo haces, con el ejemplo que has puesto.

En nuestro caso el campo que tenemos de total de factura es cuando ya les has aplicado la retención (se le ha restado el importe de la retención) por lo tanto, para conseguir el valor para informar en el registro de facturación, cogemos ese total y le sumamos el importe de la retención, para obtener el total de la factura sin tener en cuenta esa retención.
Pero cada uno lo tendrá montado a su manera.

delphiGar 17-04-2025 21:17:17

Hay que diferenciar con el tema del IRPF, lo que se cobra por la factura y el importe real de la misma:

Una factura normal SIN IRPF coincide el Importe Real con el que se va a cobrar:

Base Imponible + cuota iva = Importe Real, es el que se declara en verifactu

En el caso de una factura normal CON IRPF no coinicden los importes de cobro y el importe real:

Base Imponible + cuota iva - IRPF ( porcentaje aplicado IRPF * Base Imponible ) = Total a cobrar

Base Imponible + cuota iva = Importe real y a declarar en Verifactu.


Nota: El que no pagemos el IRPF o no lo cobremos de una factura es por que, o bien lo ingresamos en hacienda o nos lo deducimos, en ese orden.

seccion_31 20-04-2025 11:11:56

Cita:

Empezado por delphiGar (Mensaje 563883)
Hay que diferenciar con el tema del IRPF, lo que se cobra por la factura y el importe real de la misma:

Una factura normal SIN IRPF coincide el Importe Real con el que se va a cobrar:

Base Imponible + cuota iva = Importe Real, es el que se declara en verifactu

En el caso de una factura normal CON IRPF no coinicden los importes de cobro y el importe real:

Base Imponible + cuota iva - IRPF ( porcentaje aplicado IRPF * Base Imponible ) = Total a cobrar

Base Imponible + cuota iva = Importe real y a declarar en Verifactu.


Nota: El que no pagemos el IRPF o no lo cobremos de una factura es por que, o bien lo ingresamos en hacienda o nos lo deducimos, en ese orden.

gracias a ambos por las respuestas !

En cuanto probemos un poco mas la 4.2 la semana que viene, la publicare, y creo qua estas alturas ya no añadiremos mas funcionalidades mas.

Slds !

jguso 20-04-2025 13:40:54

ayuda
 
existe alguna forma de validar que el certificado con el que enviamos las facturas es correcto, es decir, está en vigor y todo eso

jguso 20-04-2025 13:43:26

ayuda
 
Otra cosa, hay alguna manera de validar los NIFs extranjeros y comunitarios antes de dar de alta algún cliente en el sistema de gestión, hacerlo a traves de esta librería. ?

seccion_31 24-04-2025 12:43:47

en la demo tienes un ejemplo para validar el nif con la aeat.

en la version 4.3 ademas se añade la validacion del vies para paises de la ue.

Saludos !

seccion_31 24-04-2025 12:45:56

Cita:

Empezado por jguso (Mensaje 563898)
existe alguna forma de validar que el certificado con el que enviamos las facturas es correcto, es decir, está en vigor y todo eso

en teoria que recuerde, los certificados que se obtienen de almacen, solo se muestran los vigentes.

el usado desde un archivo pfx o p12, ese no se valida antes de usarlo.

saludos

seccion_31 24-04-2025 12:47:43

El lunes se publicara la version 4.3, que incorpora bastantes cosas nuevas, y espero cerrar ya el ciclo de novedades, e ir arreglando posibles fallos.

saludos !

seccion_31 24-04-2025 13:05:06

esto no es parte del componente, pero por si no lo sabiais, respuesta de la AEAT:

(sobre integridad, inalterabilidad de los datos en sistemas verifactu)

Cita:

Buenos días:

En un sistema informático de facturación (SIF) que actúa en la modalidad VERI*FACTU, como el que cita, la integridad, inalterabilidad, conservación, accesibilidad y legibilidad se dan por garantizadas en cuanto se remite correctamente el registro de facturación (RF) a la AEAT. Por lo tanto, después ya "no importaría" que esos RF pudieran ser manipulados por otras aplicaciones y no habría obligación de hacer nada más (incluso podrían dejar de conservarse en el SIF, si así se desea). De hecho, los SIF VERI*FACTU no tienen obligación de detectar este tipo de anomalías.
Saludos !

: )

bmfranky 24-04-2025 16:25:49

Cita:

Empezado por seccion_31 (Mensaje 563993)
esto no es parte del componente, pero por si no lo sabiais, respuesta de la AEAT:

(sobre integridad, inalterabilidad de los datos en sistemas verifactu)



Saludos !

: )

Pus, mira , de un plumazo desaparece la la mitad de cosas a implementar...

seccion_31 24-04-2025 20:03:51

version 4.3

(ya enviada para su publicacion en el ftp del foro)

Leed atentamente ayuda.txt y cualquier duda, la posteais:

Cita:

version 4.3
----------------------------------------------------------------------------------------------------------------------------
valida el VIES, ademas del NIF. Para validar el VIES no es necesario un certificado.
Al añadir factura se comprueba que haya desgloses (de exenta o iva) en altas. Debe de haber al menos un desglose, aunque sea a cero.

version 4.2
----------------------------------------------------------------------------------------------------------------------------
corregidos encadenamientos, con facturas reenviadas y nuevas
corregidos tiempo 2 de minutos con facturas reeenviadas para marcar incidencia automaticamente al igualar o superar ese tiempo de reenvio.

version 4.1
----------------------------------------------------------------------------------------------------------------------------
se suprime soloRegistroAceptadas: boolean y pasan a guardarse todos los registros de facturacion, aceptados o no aceptados o incluso de envios fallidos.

a cambio se facilita el nombre del xml ya que si el sistema genera otro registro de facturacion existente por numserie, añadira _1 , _2 etc... al nombre del archivo para conservar todos los registros en la carpeta de ese numserie.

En el resultado (fallido o no) se envia el nombre (solo el nombre del archivo) dentro de la ruta programada en pathXML_RegistroFacturacion en TVeriFactu
en la variable: filenameXMLRegistro del resultado. Esto nos facilita archivar y encontrar el xml generado para una factura concreta.

En el evento del resultado (fallido o no) podremos acceder al nombre del archivo COMPLETO del xml con su ruta a traves del STATUS de cada factura remitida.Tambien recibiremos el XML via parametro.

AHORA:
cuando el envio no puede ser realizado, por fallos tecnicos de la AEAT o internet, etc... se devuelve "un resultado informativo" de la sesion fallida, donde se podran recoger las huellas y el error ocurrido:

resultado.errorDes

envioOk sera false
AceptadasOK :=0;
AceptadasError :=0;
ConErrores :=0;

cada factura del array de resultado contendra al menos los siguiente datos para indicar el error de transmision

facturas[n].ErrorCodigo:=-1;
facturas[n].error:=true;
facturas[n].aceptadoConErrores:=false;

ademas de las huellas y otros datos.

En resultado:

envioOK sera true cuando se haya podido enviar, por tanto los datos que regresen seran de la AEAT

envioOk sera false:

Cuando el envio NO puede ser realizado se guardan los registros de facturacion, exactamente de la misma forma que si hubieran sido aceptados, pero con algunos cambios como hemos visto arriba.

Todos los eventos tienen lugar con normalidad.

El evento que genera las huelllas a medida de calculo, no sabe si la transmision sera posible, por tanto genera las huellas sin mas
El evento que genera los registros de facturacion, ya conoce si el evento es (fallido o no) y se envia envioOK ademas del indice de la factura, el registro de facturacion (XML) y otros parametros.

El evento resultado ya conoce si ha sido fallido. el Componente TVerifactu devuelve false y resultado.envioOK devuelve false.
Las diferencias a cuanto a que encontraremos en el resultado devuelto dependen de si ha sido fallido o no.



version 4.0
----------------------------------------------------------------------------------------------------------------------------
Volvemos a las 10 sesiones

Vista la nueva informacion sobre encadenamientos hay que cambiar la forma en que se envian.

Explicaremos como se hacia, y despues como se hara desde la 4.0

Version 3 y anteriores:
Cuando se envia un registro SIEMPRE se calculaba una nueva huella:

Si la factura es nueva, no hay problema, huella nueva
Si se vuelve a enviar por error de datos de facturacion, un nif equivocado o algo asi, no hay problema, huella nueva
Si se vuelve a enviar por un error tecnico, fallo de internet, del equipo, (sin respuesta de la AEAT) etc... y el registro en principio es valido. HAY PROBLEMA, no deberiamos calcular una nueva huella deberiamos enviar la factura con la huella y encadenamiento originales. Y marcar como incidencia. Respetando el encadenamiento de la ultima factura añadida, para las siguientes. (eso ya pertences a la logica del programa).

La version 4 soluciona este problema
Se añaden tres campos en el registro de factura:

numeroSerieAnt[60]
huellaAnterior[64]
huellaFechaAnt[20]

estos tres campos junto a estos ya existentes:

huella[64]
huellaFechaHora[20]

Seran los que nos permitiran reenviar una factura fallida por fallo tecnico.

El Envio de una factura nueva, o factura modificada, huella nueva, por tanto no hay que indicar nada en estos valores

En el Re-Envio de una factura por fallo tecnico, hay que indicar esos valores, ya que tenemos un registro valido.

Por tanto siempre debemos guardar estos datos.

¿Como guardarlos?

Tras el envio y ocurra lo que ocurra, estan disponibles en el registro de factura:

Ejemplo: (sin el evento para recoger huellas) (ha sido escrito sin compilar, de memoria y es una aproximacion propia)

iniciamos sesion, cargamos datos , etc...

veriFactu.clearFactura( factura );
........
........
........ cargamos datos de la factura, cuotas, cif, totales, etc...
........
........ y añadimos:

// si hubo un fallo tecnico en la factura (ver mas abajo) tras el envio llevara marcado esto:
if dbFactura.feldbyName('fallotecnico').text='S' then
begin
factura.huella :=dbFactura.fieldbyName('huella').text; // cargamos la huella y anterior original
factura.huellafecha:=dbFactura.fieldbyName('Huellafecha').text; // debe contener espacio suficiente para la fecha y hora (string(20))

factura.numeroSerieAnt:=dbFactura.fieldbyname('antnumero').text;
factura.huellaFechaAnt:=dbFactura.fieldbyname('antfecha').text;
factura.huellaAnterior:=dbFactura.fieldbyname('anthuella').text;
end;

ok:=Verifactu.envio( resultado ); // enviamos

Verifactu.factura(1, factura); // seleccionamos la 1ª factura (puede ser un envio de 1)

dbFactura.edit; // la guardamos en la bd. (el registro de la bd. ya esta posicionada en ese registro)

dbFactura.fieldbyName('huella').text :=factura.huella; // 64 digitos
dbFactura.fieldbyName('Huellafecha').text:=factura.huellaFechaHora; // este campo deberia ser de 20 digitos. (contendra fecha y hora)

dbFactura.fieldbyname('antnumero').text :=factura.numeroSerieAnt;
dbFactura.fieldbyname('antfecha').text :=factura.huellaFechaAnt; // fecha
dbFactura.fieldbyname('anthuella').text :=factura.huellaAnterior; // 64 digitos

if not resultado.envioOk then // el envio ha sido fallido por causas tecnicas ( ha salido por el try... except )
begin
dbFactura.fieldbyname('fallotecnico').text:='S'; // lo indicamos en la factura

dbIncidencias.insert; // lo anotamos en el libro de incidencias (opcional)
dbIncidencias.fieldbyName('fecha').asdatetime:=time;
dbIncidencias.fieldbyName('hora').text :=timetostr(time);
dbIncidencias.fieldbyName('factura').text :=factura.numSerieFactura;
dbIncidencias.fieldbyName('texto').text :=resultado.error;
dbIncidencias.post;
end
else
dbFactura.fieldbyname('fallotecnico').text:='N'; // limpiamos esto si paso bien

dbFactura.post;

Y ahora procesariamos mas cosas....

Con esto ya tendriamos las huellas disponibles, y mas informacion si añadimos un bucle etc... podemos intervenir todas las facturas enviadas


Mas tarde podriamos volver a enviar la factura, y al haber sido marcada como fallotecnico se cargaran las huellas originales y no se generaran nuevas.


Nuevo: evento para recoger huellas

Sin esperar al resultado del envio:

El evento: onRegHue proporciona las huellas a medida que se va calculando el objeto SOAP antes de enviar, factura por factura.
Nos enviara la siguiente informacion:


TRegistroHueEvent = procedure( Sender: TObject; resultadoHuella:THuellaCallBack ) of object;

THuellaCallback=record
nifEmisor :string[9];
numserie :string[60];
FechaFactura :TDatetime;
TipoFactura :string[2]; ( F1 F2 etc... ó "B" si anulacion )
alta_baja :string[1]; (A o B)

Cuotatotal :currency;
ImporteTotal :currency;

Huella :string[64];
huellaFechaHora :string[20]; // guardaremos en un campo timestamp o de 20 digitos fecha y hora

numeroSerieAnt :string[60];
huellaAnterior :string[64];
huellaFechaAnt :string[20];

huellaSinCodificar:TMyString; // solo en altas o bajas ( no en reenvios con huella anterior)

indice :integer;
incidencia :boolean;
end;

Permitiendonos guardar esta informacion antes de su envio. (eso si, tenemos que llamar a la funcion enviar)



----------- enviamos la factura -------------------

Y procesamos resultado.

Y podria volver con algun fallo de nif, etc... pero al reenviar ya lo hariamos con huella nueva.

ontisoft 25-04-2025 12:08:39

Excelente el trabajo que están haciendo con esta DLL.

Yo en mi trabajo he propuesto usar esta DLL con Delphi, pero de momento están explorando otra solución.

Quieren hacer un REST webservice donde la aplicación Delphi envia la factura y certificado mediante JSON, y el webservice ya se encargue del resto generando huella, XML, envio a la administracion y devolviendo la respuesta.
Todo esto lo quieren implementar en Phyton que según me han dicho esta muy documentado y hay muchos recursos ya creados.

Veo 2 enfoques diferentes, pero la ventaja que me comentan es que el servicioweb se puede invocar desde varios programas, y la adaptación de los programas mas antiguos puede ser mas rápida.

Yo soy mas de Delphi de toda la vida, y vuestra DLL me gusta mas. Por lo que me surgen dudas.

¿De verdad veis que es una ventaja usar un webservice? ¿Podríamos integrar esta DLL en un webservice en delphi?

A ver que opinais.

seccion_31 25-04-2025 12:52:40

Cita:

Empezado por ontisoft (Mensaje 564043)
Excelente el trabajo que están haciendo con esta DLL.

Yo en mi trabajo he propuesto usar esta DLL con Delphi, pero de momento están explorando otra solución.

Quieren hacer un REST webservice donde la aplicación Delphi envia la factura y certificado mediante JSON, y el webservice ya se encargue del resto generando huella, XML, envio a la administracion y devolviendo la respuesta.
Todo esto lo quieren implementar en Phyton que según me han dicho esta muy documentado y hay muchos recursos ya creados.

Veo 2 enfoques diferentes, pero la ventaja que me comentan es que el servicioweb se puede invocar desde varios programas, y la adaptación de los programas mas antiguos puede ser mas rápida.

Yo soy mas de Delphi de toda la vida, y vuestra DLL me gusta mas. Por lo que me surgen dudas.

¿De verdad veis que es una ventaja usar un webservice? ¿Podríamos integrar esta DLL en un webservice en delphi?

A ver que opinais.

Sin salir de delphi, colocas unas cuantas lineas de codigo, envias la factura, recoges la respuesta y la procesas. Sin mas. Ya esta. FIN.

starlet 29-04-2025 13:14:54

No encuentro la nueva versión en el ftp.

Sólo me salen versiones antiguas.

Podéis compartir el enlace de la nueva versión?.

Muchas gracias


La franja horaria es GMT +2. Ahora son las 15:26:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi