Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[16.0][ADD] l10n_es_aeat_verifactu #3579

Open
wants to merge 10 commits into
base: 16.0
Choose a base branch
from

Conversation

zamberjo
Copy link
Member

@zamberjo zamberjo commented May 10, 2024

Movemos a este PR el nuevo módulo l10n_es_aeat_verifactu

Depends on:

@zamberjo zamberjo marked this pull request as ready for review May 10, 2024 06:09
@almumu
Copy link
Member

almumu commented Jun 28, 2024

Añadido la lógica que generará el hash de las facturas. Basado en la documentación de la aeat
https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Veri-Factu_especificaciones_huella_hash_registros.pdf
De momento son campos compute y sin store True para poder ir avanzando.

  • Pendiente decidir de qué modo se va a saber cuál es la factura anterior enviada, ya que el hash de una factura a su vez está compuesto por el hash de la anterior factura enviada.

  • Pendiente decidir en qué momento generaremos el hash y que se guarde en la factura.

  • El tipo de documento de verifactu, de momento es un selection, si esos son los tipos definitivos podríamos convertirlo a un modelo y un data

@pedrobaeza pedrobaeza added this to the 16.0 milestone Sep 3, 2024
@pedrobaeza
Copy link
Member

Se puede ya hacer rebase.

@zamberjo zamberjo force-pushed the ADD/l10n_es_aeat_verifactu branch from 46637e3 to db76bac Compare September 3, 2024 07:22
@zamberjo
Copy link
Member Author

zamberjo commented Sep 3, 2024

Se puede ya hacer rebase.

Hecho y he añadido los últimos cambios para setear el campo aeat_sending_enabled

return self.amount_total

def _get_verifactu_previous_hash(self):
# TODO store it? search it by some kind of sequence?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but the problem in this case is that the previous record is not the previous one from the same journal. A possible solution is to implement a unique sequence for all invoices, but we also need to know if they have been sent and received by the AEAT.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lo que se me ocurre es una especie de cola, así se elimina el problema de la concurrencia (y se puede tener tantas secuencias como diarios). La cola FIFO guarda la referencia o hash de la última factura en un campo global por orden de inserción.

Faltaría decidir cuando meter la factura en la cola que generará el hash y la enviará a AEAT. No sé si por la ley hay obligatoriedad de hacerlo cuando se le da a enviar factura o solamente al guardar, o pasa como el SII que puede ser manual. En cualquier caso sería meterlo en la cola desde cualquier diario y encadenar facturas de diferentes diarios, validadas por diferentes usuarios, o demás concurrencias, gracias a la cola no supondrían un problema.

es por dar ideas.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Me resulta muy extraño que esa factura anterior tenga que ser global en lugar de por diario. La AEAT es muy consciente de las cuestiones técnicas asociadas a tener más de una secuencia de numeración (como múltiples canales de venta).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Según mi interpretación de la documentación, el encadenamiento es por SIF (Sistema Informático de Facturación).

imagen

Caso 2: registro de facturación –en este caso de alta–
con registro de facturación anterior existente en el SIF
(siendo, por tanto, el segundo registro o sucesivo)

Lo interpreto de ese modo porque dice factura anterior existente en el SIF.

En caso de ser mi interpretación correcta, entiendo que habría que crear un SIF para la facturación de Odoo y uno por TPV, si no recuerdo mal así es como funciona en TicketBAI.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Si por eso interpretamos que el encadenamiento era con el anterior enviado y eso excluye el orden por diario pero realmente tampoco habla de series en ningun lado que yo haya visto...

@SoniaViciana
Copy link

Hola @zamberjo @almumu

Veo que falta la parte del hash:

image

La documentación técnica de la AEAT está disponible (en "Borrador"), y en cuanto al tema de controlar la factura anterior enviada a Verifactu, si no me equivoco, es algo que ya requiere y está disponible dentro de TicketBai, así que seguramente lo podremos aprovechar.

¿Os parece bien si trabajamos de nuestro lado en la parte del Hash? ¿Veis necesario reunirnos antes? lo comento por no trabajar en paralelo en lo mismo y que nos repartamos la carga de trabajo.

Quedo a la espera de vuestros comentarios.
Gracias!


Fuente: https://www.agenciatributaria.es/AEAT.desarrolladores/Desarrolladores/_menu_/Documentacion/IVA/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU.html

@anmarmo1
Copy link

anmarmo1 commented Oct 1, 2024

Hola @zamberjo @almumu

Veo que falta la parte del hash:

image

La documentación técnica de la AEAT está disponible (en "Borrador"), y en cuanto al tema de controlar la factura anterior enviada a Verifactu, si no me equivoco, es algo que ya requiere y está disponible dentro de TicketBai, así que seguramente lo podremos aprovechar.

¿Os parece bien si trabajamos de nuestro lado en la parte del Hash? ¿Veis necesario reunirnos antes? lo comento por no trabajar en paralelo en lo mismo y que nos repartamos la carga de trabajo.

Quedo a la espera de vuestros comentarios. Gracias!

Fuente: https://www.agenciatributaria.es/AEAT.desarrolladores/Desarrolladores/_menu_/Documentacion/IVA/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU.html

Hola Sonia
Perfecto, si quereis encargaros vosotros de la parte del HASH no hay problema, si quereis una reunión tampoco hay problema.
El tema del hash es que, el que implementa Odoo no vale, por que los valores para construirlo para el verifactu son distintos y además la complejidad reside en saber cual es el último registro que ha sido enviado a la AEAT por el tema del encadenamiento. Con respecto a utilizar la parte de ticketbai para esto, podéis revisar como se implemento como inspiración, pero no vale para la implementación del verifactu ya que esta implementado con una librería de python externa y en los OCA Days los PSC nos indicaron que de esta manera no se fusionaría. Por nuestro lado, si queréis podemos empezar con las llamadas al wsdl de la AEAT y así avanzamos.

@ljsalvatierra-factorlibre
Copy link
Contributor

Hola @zamberjo @almumu
Veo que falta la parte del hash:
image
La documentación técnica de la AEAT está disponible (en "Borrador"), y en cuanto al tema de controlar la factura anterior enviada a Verifactu, si no me equivoco, es algo que ya requiere y está disponible dentro de TicketBai, así que seguramente lo podremos aprovechar.
¿Os parece bien si trabajamos de nuestro lado en la parte del Hash? ¿Veis necesario reunirnos antes? lo comento por no trabajar en paralelo en lo mismo y que nos repartamos la carga de trabajo.
Quedo a la espera de vuestros comentarios. Gracias!
Fuente: https://www.agenciatributaria.es/AEAT.desarrolladores/Desarrolladores/_menu_/Documentacion/IVA/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU.html

Hola Sonia Perfecto, si quereis encargaros vosotros de la parte del HASH no hay problema, si quereis una reunión tampoco hay problema. El tema del hash es que, el que implementa Odoo no vale, por que los valores para construirlo para el verifactu son distintos y además la complejidad reside en saber cual es el último registro que ha sido enviado a la AEAT por el tema del encadenamiento. Con respecto a utilizar la parte de ticketbai para esto, podéis revisar como se implemento como inspiración, pero no vale para la implementación del verifactu ya que esta implementado con una librería de python externa y en los OCA Days los PSC nos indicaron que de esta manera no se fusionaría. Por nuestro lado, si queréis podemos empezar con las llamadas al wsdl de la AEAT y así avanzamos.

Hola @anmarmo1, ¿con librería de python externa te refieres a la librería de Javascript tbai.js?

@anmarmo1
Copy link

anmarmo1 commented Oct 8, 2024

Hola @zamberjo @almumu
Veo que falta la parte del hash:
image
La documentación técnica de la AEAT está disponible (en "Borrador"), y en cuanto al tema de controlar la factura anterior enviada a Verifactu, si no me equivoco, es algo que ya requiere y está disponible dentro de TicketBai, así que seguramente lo podremos aprovechar.
¿Os parece bien si trabajamos de nuestro lado en la parte del Hash? ¿Veis necesario reunirnos antes? lo comento por no trabajar en paralelo en lo mismo y que nos repartamos la carga de trabajo.
Quedo a la espera de vuestros comentarios. Gracias!
Fuente: https://www.agenciatributaria.es/AEAT.desarrolladores/Desarrolladores/_menu_/Documentacion/IVA/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU.html

Hola Sonia Perfecto, si quereis encargaros vosotros de la parte del HASH no hay problema, si quereis una reunión tampoco hay problema. El tema del hash es que, el que implementa Odoo no vale, por que los valores para construirlo para el verifactu son distintos y además la complejidad reside en saber cual es el último registro que ha sido enviado a la AEAT por el tema del encadenamiento. Con respecto a utilizar la parte de ticketbai para esto, podéis revisar como se implemento como inspiración, pero no vale para la implementación del verifactu ya que esta implementado con una librería de python externa y en los OCA Days los PSC nos indicaron que de esta manera no se fusionaría. Por nuestro lado, si queréis podemos empezar con las llamadas al wsdl de la AEAT y así avanzamos.

Hola @anmarmo1, ¿con librería de python externa te refieres a la librería de Javascript tbai.js?

Hola @ljsalvatierra-factorlibre realmente me referia a este PR #3547

@almumu
Copy link
Member

almumu commented Nov 7, 2024

Hemos hecho una primera versión funcional de envío de facturas a verifactu.

El desarrollo está hecho de la forma más parecida posible al módulo del sii, para que en caso de que haya que unificar o modificar procesos, sea los más entendible posible para todos los que toquemos código.

Falta mucho por hacer pero ya es un paso, cualquier aportación es bienvenida.

Para poder probarlo:

  • Tener certificado
  • Activar verifactu en la compañía y establecer que es entorno de pruebas.
  • Configurar en la posición fiscal la clave de impuesto (Verifactu Tax Key): IVA y clave de registro verifactu: Operación de Régimen General, para que al crear la factura se rellenen los datos.
  • Hay un mapeo de impuestos como en el sii, algunos están ya rellenados pero faltará revisarlo.
  • De momento el envío se hace desde el botón manual en la factura, una vez validada. Todavía no está implementado el envío con queue job.
  • Sólo se han hecho pruebas de envío con facturas normales de régimen nacional o recargo de equivalencia sin impuestos especiales. Como la parte del encadenamiento con el registro anterior en el hash sigue sin estar clara, de momento se envía siempre como si fuera el primer registro para poder enviarlo.
  • No están contemplados aún casos como facturas simplificadas, terceros, no sujetas.., tampoco modificaciones y anulaciones de facturas.
  • Los datos del desarrollador: IdSistemaInformatico, NumeroInstalacion, .. nos los hemos inventado un poco, esto habrá que verlo.

@almumu almumu force-pushed the ADD/l10n_es_aeat_verifactu branch 3 times, most recently from 192593e to 0a8205b Compare November 7, 2024 11:58
@syci
Copy link

syci commented Nov 14, 2024

Hola, por mi parte empezaré a revisar/probar y demás para poder desarrollar la parte necesaria para la ATC en Canarias.

@ozono
Copy link
Contributor

ozono commented Nov 14, 2024

He enviado un PR aurestic#62 a los compañeros de Aurestic como punto de partida para el QR en las facturas. Es una implementación funcional, aunque hay detalles por discutir y revisar. Aprovecho para dar las gracias a todos por el trabajo realizado.

@syci
Copy link

syci commented Nov 14, 2024

@pedrobaeza veo que en los mapeos los impuestos del IGIC no están en https://github.com/aurestic/l10n-spain/tree/ADD/l10n_es_aeat_verifactu/l10n_es_aeat_verifactu/data , ¿Dónde se implementaría en el módulo del igic, en uno nuevo verifactu_igic ...... ?

@pedrobaeza
Copy link
Member

Eso es, @syci. Habrá que hacer un módulo puente.

@almumu almumu force-pushed the ADD/l10n_es_aeat_verifactu branch from f26de9e to 61fb366 Compare November 28, 2024 06:37
@anmarmo1
Copy link

@SoniaViciana @ljsalvatierra-factorlibre ¿Vais a implementar la parte del Encadenamiento? Es por seguir nosotros.
El registro ha de ser único para todas las series.
image
Lo que no se que pasaría si el sistema esta caído, siempre hablan de "por orden cronológico de generación de registros de facturación en el SIF", he enviado la consulta a la AEAT por que no lo he visto en las FAQ

@ljsalvatierra-factorlibre
Copy link
Contributor

@SoniaViciana @ljsalvatierra-factorlibre ¿Vais a implementar la parte del Encadenamiento? Es por seguir nosotros. El registro ha de ser único para todas las series. image Lo que no se que pasaría si el sistema esta caído, siempre hablan de "por orden cronológico de generación de registros de facturación en el SIF", he enviado la consulta a la AEAT por que no lo he visto en las FAQ

Hola @anmarmo1 estamos realizando el desarrollo para tener un SIF para el backend de Odoo y un SIF por cada TPV (pos.config), del mismo modo que TicketBAI.

@anmarmo1
Copy link

@ljsalvatierra-factorlibre ok entonces esperamos. ¡Gracias!

@ljsalvatierra-factorlibre
Copy link
Contributor

@ljsalvatierra-factorlibre ok entonces esperamos. ¡Gracias!

Podéis revisar los cambios aquí #3973
Me decís por favor en ese PR cualquier cambio que veáis necesario, gracias.
Cuando esté todo listo vemos cómo integrarlo.

@ljsalvatierra-factorlibre
Copy link
Contributor

@ljsalvatierra-factorlibre ok entonces esperamos. ¡Gracias!

Podéis revisar los cambios aquí #3973 Me decís por favor en ese PR cualquier cambio que veáis necesario, gracias. Cuando esté todo listo vemos cómo integrarlo.

Estoy ahora con el desarrollo de l10n_es_aeat_verifactu_pos.

@anmarmo1
Copy link

@ljsalvatierra-factorlibre ok entonces esperamos. ¡Gracias!

Podéis revisar los cambios aquí #3973 Me decís por favor en ese PR cualquier cambio que veáis necesario, gracias. Cuando esté todo listo vemos cómo integrarlo.

Ok! Revisamos

@almumu
Copy link
Member

almumu commented Feb 4, 2025

Muchas gracias por vuestra aportación @ljsalvatierra-factorlibre , en el pr #3973
a nivel funcional lo hemos probado y está correcto, y la idea de guardarlo a nivel de compañía es buena.

Aunque la parte de anulación de facturas aún no está hecha, ahí también se envía el encadenamiento, habrá que tener cuidado a futuro de no invocar a _get_chaining_invoice_dict ya que se machacaría el valor del encadenamiento. O bien añadir una comprobación de que si ya está establecido el verifactu_last_invoice_id en la factura, no lo modifique ni en la factura ni en la compañía.

Aun así siguen habiendo varias dudas que aún no sabemos como se van a implementar y que tendremos que llegar a un consenso entre todos...
En qué momento se enviarán las facturas? al validarlas? generamos una cola de envío? porque si hay múltiples usuarios validando y enviando facturas, puede haber problemas de concurrencia con lo del encadenamiento. O por ejemplo si se va la luz durante un envío, y no se sabe si se ha enviado a verifactu porque no se había obtenido la respuesta de la aeat de si el envío ha sido correcto.., y ese tipo de cosas que pueden afectar al encadenamiento.

Tampoco tenemos claro cuál es la fecha-hora que deberíamos enviar en la huella (FechaHoraHusoGenRegistro), ahora mismo es la de creación (_get_verifactu_registration_date), pero eso no es viable porque si pasan más de 120 segundos de esa fecha-hora de creación hasta que se envía a verifactu (lo cual es muy probable que pase), la aeat la rechaza con el error "2004 El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos". Quizá lo correcto sería crear un nuevo campo de fecha envío verifactu que sea cuando realmente se envía a verifactu y que se guarde en la factura y sea ese el que se use para obtener el hash.

En cualquier caso, de momento podéis hacernos un pr a nuestra rama con estos cambios 03f46ef y así los mergeamos mientras se decide todo lo demás.
Agradeceros de nuevo vuestra contribución
Saludos

@ljsalvatierra-factorlibre
Copy link
Contributor

Muchas gracias por vuestra aportación @ljsalvatierra-factorlibre , en el pr #3973 a nivel funcional lo hemos probado y está correcto, y la idea de guardarlo a nivel de compañía es buena.

Aunque la parte de anulación de facturas aún no está hecha, ahí también se envía el encadenamiento, habrá que tener cuidado a futuro de no invocar a _get_chaining_invoice_dict ya que se machacaría el valor del encadenamiento. O bien añadir una comprobación de que si ya está establecido el verifactu_last_invoice_id en la factura, no lo modifique ni en la factura ni en la compañía.

Aun así siguen habiendo varias dudas que aún no sabemos como se van a implementar y que tendremos que llegar a un consenso entre todos... En qué momento se enviarán las facturas? al validarlas? generamos una cola de envío? porque si hay múltiples usuarios validando y enviando facturas, puede haber problemas de concurrencia con lo del encadenamiento. O por ejemplo si se va la luz durante un envío, y no se sabe si se ha enviado a verifactu porque no se había obtenido la respuesta de la aeat de si el envío ha sido correcto.., y ese tipo de cosas que pueden afectar al encadenamiento.

Tampoco tenemos claro cuál es la fecha-hora que deberíamos enviar en la huella (FechaHoraHusoGenRegistro), ahora mismo es la de creación (_get_verifactu_registration_date), pero eso no es viable porque si pasan más de 120 segundos de esa fecha-hora de creación hasta que se envía a verifactu (lo cual es muy probable que pase), la aeat la rechaza con el error "2004 El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos". Quizá lo correcto sería crear un nuevo campo de fecha envío verifactu que sea cuando realmente se envía a verifactu y que se guarde en la factura y sea ese el que se use para obtener el hash.

En cualquier caso, de momento podéis hacernos un pr a nuestra rama con estos cambios 03f46ef y así los mergeamos mientras se decide todo lo demás. Agradeceros de nuevo vuestra contribución Saludos

Hola @almumu, muchas gracias por revisarlo, sobre el envío:

"El tema de encadenamiento de la huella de las facturas esa huella su encadenamiento se genera en funcion de la serie de 
facturacion, es decir hago la A/1, A/2 se encadena con A/1 pero si ahora hago la C/1 ¿se encadena con A/2 o realmente no 
porque es la primera de la serie C?",Ramon Sanchez,'-,,10/28/2024 13:56:15,,
El encadenamiento se realiza por orden cronológico de generación de registros de facturación, independientemente de si es un 
registro de alta o anulación o del nº de factura o serie del mismo.  No está relacionado con el orden en que los registros son 
comunicados (pueden desordenarse en la comunicación si hubiera que hacer reenvíos), ni con la serie/número de la factura 
(aunque normalmente suela seguir una cierta pauta temporal), sino con el orden en que son generados.  Cualquier registro de 
facturación nuevo tiene que ir encadenado al registro de facturación inmediatamente anterior. Eso quiere decir que el bloque 
"Encadenamiento" se rellenará con los datos del bloque "RegistroAnterior" del registro de facturación anterior y el campo 
“Huella”.

Comment on lines 40 to 41
record.restrict_mode_hash_table = True
record.restrict_mode_hash_table_readonly = True
Copy link
Contributor

@aritzolea aritzolea Feb 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

He detectado que esto no está llamando al write de account.journal, y está dando problemas al activar Verifactu en una compañía. Podríais actualizar esos dos campos mediante un write?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hola @aritzolea , no sé muy bien qué problemas os estará dando esta parte pero si tienes el caso controlado, podéis hacer cualquier modificación necesaria en vuestra rama y añadirlo al pr que nos hagáis. Quizá sería buena idea que nos hagáis el pr a esta rama para poder mergearlo cuanto antes y que todos hagamos las pruebas y aportaciones sobre el mismo código, como hicimos con el de @ozono , y seguir avanzando.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buenas @almumu
Estoy con pruebas en mi local, intento abriros el PR entre hoy y mañana.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

genial! muchas gracias @aritzolea

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buenas! Os he abierto PR

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

He abierto otro PR para corregir pre-commit y tests

Copy link
Member

@almumu almumu Feb 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

He abierto otro PR para corregir pre-commit y tests

merged. He hecho otro commit porque todavía daba error el precommit

# no vamos autilizar el hash de odoo porque la estructura no nos sirve
# para verifactu, por lo que este código no nos terminaría de valer.
# De momento lo dejamos hasta saber cómo vamos a controlar
# el tema de la factura anterior enviada a verifactu para el cálculo
Copy link
Contributor

@aritzolea aritzolea Feb 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No entiendo del todo por que se ha hecho esto de esta forma. pero sigue siendo necesario después de la implementación del encadenamiento en #3973?

Sí que habrá que controlar la modificación de las facturas ya enviadas, pero la primera parte no me queda clara.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

se hizo en su momento para utilizar la parte de odoo que mediante el restrict_mode_hash_table del account.move (que es un related al journal) controla la modificación de facturas, no permite pasarlas a borrador, controla qué campos se pueden modificar, etc. Lo que no se usa es ese ese propio hash para enviarlo a verifactu como hash puesto que no tiene nada que ver el formato de ese hash con el que pide verifactu.

@almumu almumu force-pushed the ADD/l10n_es_aeat_verifactu branch from 7ee354c to 62e0169 Compare February 25, 2025 08:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.