Verifactu

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 month 2 weeks ago #373037

-- HikaShop version -- : 6.5.0.

Hola,

Alguien esta interesado en un plugin para Verifactu para conectar con la AEAT de España?

Un saludo

Please Log in or Create an account to join the conversation.

  • Posts: 86217
  • Thank you received: 14222
  • MODERATOR
1 month 1 week ago #373038

Hola,

Sí, hay interés, es un tema que nos empieza a llegar de los comerciantes españoles.

Por nuestra parte no está previsto integrarlo en el núcleo de HikaShop a corto plazo, y la razón no es técnica sino legal : el reglamento no obliga solamente al comerciante, obliga también al productor del software, que debe emitir una declaración responsable certificando que su programa cumple los requisitos de integridad e inalterabilidad. Un sistema informático de facturación tiene que ser no modificable por el usuario, y HikaShop es una extensión PHP que el comerciante instala en su propio servidor y que puede modificar libremente con overrides y plugins. Convertir eso en un SIF certificado no es un desarrollo, es un compromiso permanente.

Por eso, si desarrollas un plugin, la arquitectura que te recomendamos es la de puente y no la de SIF completo : HikaShop envía los datos de la factura a un proveedor VeriFactu ya certificado (hay varias APIs en el mercado en España), y ese proveedor genera el registro encadenado, lo firma, lo remite a la AEAT y te devuelve la huella, el CSV y el QR para imprimir en la factura. Así el certificado del comerciante no vive en el servidor de la tienda y la declaración responsable la mantiene el proveedor, no tú. La otra vía, generar tú mismo el registro de alta, la cadena de huellas, la firma XAdES y el registro de eventos, es mucho más trabajo y te deja con la responsabilidad encima.

En HikaShop tienes lo necesario para engancharlo :

- El evento onAfterInvoiceCreate se dispara justo cuando HikaShop asigna el número de factura a un pedido, con el pedido completo como parámetro. Es el punto natural para generar el registro de alta.
- El plugin Attach invoice genera el PDF de la factura con TCPDF, que sabe dibujar códigos QR de forma nativa, así que ahí es donde se añade el QR y la mención VERI*FACTU.

Dos puntos que conviene aclarar antes de empezar, porque cambian el alcance :

- Muchas tiendas no necesitan que HikaShop sea el SIF. Si la factura la emite su programa de contabilidad a partir de un export de pedidos, el SIF es ese programa, y HikaShop solo le alimenta los datos. Los obligados al SII están directamente fuera del ámbito de VeriFactu.
- Si eliges la modalidad VeriFactu, con remisión inmediata a la AEAT, los registros no necesitan firma electrónica, es la remisión la que da la garantía. La modalidad sin remisión sí exige firma y conservación local, y es bastante más pesada de implementar. Para una tienda online la primera es casi siempre la buena opción.

Sobre las herramientas, existe la librería josemmo/Verifactu-PHP, en MIT, que cubre la generación de los registros y el envío a la AEAT. Curiosamente es del mismo autor que josemmo/einvoicing, la librería que ya usamos en nuestro plugin Attach invoice para el formato UBL. Pide PHP 8.2 como mínimo, así que habría que ponerle un control de versión en el plugin.

Si desarrollas el plugin, dínoslo, lo podemos referenciar en nuestra web para que los comerciantes españoles lo encuentren.

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 month 1 week ago #373059

# PLG_HIKASHOP_VERIFACTU

He desarrollado personalmente este plugin para integrar la gestión de **Veri*Factu** con **Joomla + HikaShop**, incorporando las funciones necesarias para la generación, gestión y seguimiento de facturas y abonos.

El plugin ha sido desarrollado y **se han realizado las pruebas pertinentes con la AEAT** dentro del entorno y configuración utilizados durante su desarrollo.

## Características principales

* Gestión de facturas y abonos mediante Veri*Factu*.
* Registro en la base de datos de un **historial de todas las facturas y abonos** procesados por el plugin.
* Conservación de la información necesaria para realizar un seguimiento de cada registro.
* Gestión de facturas negativas/abonos y sus correspondientes tipos de devolución.
* Generación y utilización del **código QR Veri*Factu*** en las facturas.
* Declaración Responsable integrada en el propio plugin.
* Condiciones de uso del software incluidas.
* Manual completo de instalación y configuración incluido dentro del plugin.
* Configuración de los campos personalizados necesarios para el correcto funcionamiento del sistema.

## Código QR

He incorporado la generación del **código QR Veri*Factu*** dentro del funcionamiento del plugin.

El código QR puede utilizarse con **las dos opciones de generación de facturas PDF**:

* La **plantilla de factura incluida de forma nativa en HikaShop**.
* El plugin **HikaShop - generate PDF invoice**.

De esta manera, el código QR Veri*Factu* puede incorporarse a las facturas PDF independientemente de cuál de estos dos sistemas de generación de facturas se utilice.

## Historial de facturas y abonos

El plugin mantiene en la base de datos un **historial de las facturas y abonos gestionados**, permitiendo conservar la información relacionada con los registros enviados y su correspondiente seguimiento.

Esto permite disponer de una trazabilidad de las operaciones realizadas mediante el sistema Veri*Factu*.

## Instalación y configuración

El plugin incluye un **manual completo de instalación y configuración** dentro del propio archivo ZIP.

En dicho manual se detallan, entre otros aspectos:

* Instalación del plugin.
* Configuración necesaria de Veri*Factu*.
* Configuración de HikaShop.
* Configuración de las facturas y abonos.
* Creación y configuración de los **campos personalizados necesarios en HikaShop**.
* Configuración del código QR.
* Procedimientos de comprobación.
* Comandos necesarios para determinadas operaciones.

Se recomienda seguir el manual paso a paso antes de utilizar el plugin en producción.

## Acceso mediante SSH

Para realizar correctamente la instalación y configuración completa del plugin es necesario disponer de **acceso al terminal SSH del alojamiento**.

Los comandos necesarios para la instalación, configuración y comprobación están incluidos en el **manual que se encuentra dentro del propio plugin**.

Por este motivo, antes de instalarlo es necesario comprobar que el alojamiento permite el acceso mediante SSH y que se dispone de los permisos necesarios para ejecutar los comandos indicados en el manual.

## Joomla y HikaShop

El plugin ha sido desarrollado para trabajar conjuntamente con **Joomla y HikaShop**, pero es importante señalar que **Joomla y HikaShop no han sido desarrollados por Locker25.com**.

El plugin utiliza las funcionalidades proporcionadas por estos sistemas para realizar su integración con Veri*Factu*.

## ⚠️ Recomendación antes de instalar

**Recomendamos realizar una copia de seguridad completa del sitio web y de la base de datos antes de instalar el plugin.**

La copia de seguridad debe realizarse antes de cualquier instalación, actualización o modificación relacionada con el plugin.

Esto permitirá restaurar el sitio y la base de datos en caso de que se produzca cualquier incidencia durante la instalación o configuración.

## Pruebas con la AEAT

Durante el desarrollo se han realizado las **pruebas pertinentes con la AEAT** para comprobar el funcionamiento del sistema de envío y gestión de los registros Veri*Factu* dentro del entorno utilizado para el desarrollo.

No obstante, el funcionamiento final puede depender de la configuración concreta del servidor, Joomla, HikaShop, PHP, certificado digital, configuración de la empresa y otros componentes de terceros instalados en cada alojamiento.

Por ello, se recomienda realizar las comprobaciones correspondientes antes de utilizar el sistema en producción.

## Software freeware

**PLG_HIKASHOP_VERIFACTU es software freeware desarrollado por Locker25.com.**

El plugin se distribuye gratuitamente y ha sido desarrollado con el objetivo de facilitar la integración de HikaShop con Veri*Factu*.

El usuario debe leer y aceptar las **Condiciones de Uso** y la **Declaración Responsable** incluidas en el propio plugin antes de utilizarlo.

## Recomendación final

Antes de poner el sistema en producción:

1. Realice una **copia de seguridad completa**.
2. Lea el **manual incluido dentro del plugin**.
3. Compruebe que dispone de **acceso SSH**.
4. Cree y configure todos los **campos personalizados de HikaShop** indicados en el manual.
5. Configure correctamente el sistema Veri*Factu*.
6. Compruebe la configuración del código QR.
7. Realice las pruebas correspondientes.
8. Verifique que las facturas y abonos quedan correctamente registrados en el historial.

**Locker25.com recomienda realizar todas estas comprobaciones antes de utilizar el plugin en un entorno de producción.**

Please Log in or Create an account to join the conversation.

  • Posts: 86217
  • Thank you received: 14222
  • MODERATOR
1 month 1 week ago #373060

Hola,

Enhorabuena, y gracias por compartirlo con la comunidad. En el mensaje no aparece ningún enlace ni fichero adjunto : ¿dónde pueden descargarlo los comerciantes? Con la URL lo referenciamos desde nuestra web para que los comerciantes españoles lo encuentren.

Dos sugerencias, porque los dos puntos que más van a frenar la adopción son el acceso SSH y la configuración manual :

1. El acceso SSH. Muchos alojamientos compartidos no lo ofrecen, o lo ofrecen sin permisos suficientes, y eso deja fuera a buena parte de las tiendas. Si los comandos son para instalar dependencias con composer, la solución habitual es incluir ya la carpeta vendor dentro del ZIP del plugin : es lo que hacemos nosotros en el plugin "HikaShop - generate PDF invoice", que se instala sin tocar la línea de comandos. Y si son tareas periódicas, Joomla tiene su propio sistema de tareas programadas con lanzador web, que evita depender del cron del servidor.

2. Los campos personalizados. En lugar de pedirlos en el manual, el plugin puede crearlos él mismo en su instalación, con la clase de campos de HikaShop. Así se evitan los errores de nombre de columna, que son difíciles de diagnosticar después. Y si necesita tablas propias, HikaShop dispara el evento onHikashopBeforeCheckDB durante la comprobación de la base de datos : ahí puede declarar sus tablas y sus columnas, y HikaShop las crea y las mantiene al día en cada actualización, igual que hacen varios de nuestros plugins.

Y dos preguntas por curiosidad técnica :

- ¿Qué modalidad implementa, VERI*FACTU con remisión inmediata a la AEAT, o el modo sin remisión con firma XAdES y conservación local?
- ¿Qué versión mínima de PHP requiere? Es útil indicarlo en la página de descarga, sobre todo si usa una librería que pide PHP 8.2.

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 month 1 week ago #373094

Hello Nicolas,

I have modified the plugin, and an SSH terminal is no longer required. I have reduced the setup process to the bare minimum needed to get the plugin working. Nevertheless, any improvements are always welcome.

The instructions are included in the plugin itself.

Here is the link to the .zip file.

drive.google.com/file/d/1FmY6aDSHikLOHNX...Ki5/view?usp=sharing

Best regards,

Nico

Please Log in or Create an account to join the conversation.

  • Posts: 86217
  • Thank you received: 14222
  • MODERATOR
1 month 6 days ago #373095

Hola,

Hemos estudiado tu plugin a fondo y le hemos dedicado tiempo, porque nos parece la pieza que le falta a las tiendas españolas y porque la arquitectura que has elegido es la correcta: apoyarte en una librería ya existente para la firma, la huella encadenada y el diálogo SOAP con la AEAT, en vez de reinventarlo.

Para poder trabajar sobre él sin pisarte nada, lo hemos puesto en un repositorio público de GitHub:

github.com/hikashop-nicolas/hikashop-verifactu

El primer commit es tu versión 0.30.32 tal cual, sin tocar, así que todo lo que viene después se lee como una diferencia contra tu código. La licencia GPLv2 y tu autoría están indicadas en el README y en la descripción del repositorio. Es tu plugin: coge de aquí lo que te sirva, ignora lo que no, y si prefieres llevarlo tú en tu propio repositorio, encantados de enviar los cambios allí.

Cada corrección va en su propio commit, con el porqué explicado en el mensaje:

1. Instalación en MySQL, no solo en MariaDB
github.com/hikashop-nicolas/hikashop-verifactu/commit/bb3c42eb7
El SQL de instalación creaba las dos columnas del pedido con ADD COLUMN IF NOT EXISTS. Eso es una extensión de MariaDB: MySQL responde error 1064, el instalador de Joomla se para ahí y los campos personalizados que van después no llegan a crearse. Ahora las crea un script de instalación que comprueba antes en INFORMATION_SCHEMA, y funciona en los dos.

2. Funcionar sin el plugin de compatibilidad de Joomla
github.com/hikashop-nicolas/hikashop-verifactu/commit/fd6ba79c0
El plugin usaba JPlugin, JFactory y JLog, así que en Joomla 5 y 6 solo cargaba mientras estuviera activo "Comportamiento - Compatibilidad con versiones anteriores", que viene desactivado en una instalación nueva. Un plugin fiscal que deja de enviar facturas el día que alguien desactiva ese plugin es un riesgo que no compensa. Todas esas clases están sustituidas por sus equivalentes con espacio de nombres.

3. El registro ya no queda accesible desde la web
github.com/hikashop-nicolas/hikashop-verifactu/commit/0fa434e36
Cada operación se añadía a debug.log dentro de la carpeta del plugin, con números de pedido, números de factura y NIF. Esa carpeta la sirve el servidor web, así que el archivo se podía descargar sabiendo la dirección. Ahora se escribe en el registro de Joomla, en su carpeta de logs y con extensión .php, que Joomla protege.

4. No declarar un desglose inventado
github.com/hikashop-nicolas/hikashop-verifactu/commit/a1f48a3ca
Cuando el pedido no traía un desglose de impuestos utilizable, se construía una línea al 21 % con la base igual al total y cuota cero, y se enviaba. Una declaración equivocada es peor que una tardía: queda registrada y hay que rectificarla. Ahora ese caso devuelve un error y se anota en el log, y la factura no se envía hasta que se arreglen los impuestos del pedido.

5. La base imponible cuadra con el total de la factura
github.com/hikashop-nicolas/hikashop-verifactu/commit/7b54b1157
Este es el que más nos ha llamado la atención, y solo se ve con gastos de envío o de pago con impuesto. HikaShop guarda esos gastos con el impuesto ya incluido y además vuelve a sumar la cuota al calcular el campo amount de order_tax_info, así que la base que salía de ahí venía inflada justo en el doble del impuesto de esos gastos.

Lo hemos medido con un pedido real, creado con el propio recálculo de HikaShop: producto 100 + cargo 20 + envío 12,10 + pago 6,05, todo al 21 %.

HikaShop guarda: amount = 141,30   tax_amount = 28,35   total = 163,35
Se declaraba:    base   = 141,30 + cuota 28,35 = 169,65  frente a 163,35
Ahora:           base   = 135,00 + cuota 28,35 = 163,35  igual al total

La base se deduce ahora de la propia cuota (base = cuota / tipo), que es la relación que la AEAT comprueba. Los gastos en sí ya los recogías bien: HikaShop mete el envío, el pago y las líneas de tipo "order additional" que añaden otros plugins dentro de order_tax_info, que es de donde sale el desglose.

6. Una sola versión
github.com/hikashop-nicolas/hikashop-verifactu/commit/33bbc1d49
Convivían tres: el manifiesto decía 0.30.32, la declaración responsable 0.30.7 y el bloque SistemaInformatico que se envía a la AEAT iba fijo a "HikaShop" versión "1.0". La declaración responsable certifica una versión concreta de un sistema concreto, así que ahora las tres leen la versión del manifiesto, y el sistema se identifica como "HikaShop VeriFactu", que es lo que es. Ojo con ese punto: el sistema informático de facturación es tu plugin, no HikaShop, y la declaración la haces tú como productor.

También hemos cambiado la forma de empaquetarlo:

github.com/hikashop-nicolas/hikashop-verifactu/commit/512badb25
Las librerías ya no van commiteadas ni dentro del zip del repositorio: las trae Composer con las versiones fijadas en composer.lock, y los tres parches que necesita eseperio/verifactu-php (el formato de fecha en la huella, y numserie e importe en la URL del QR) los aplica un script en PHP en el momento de compilar, en vez de pedirle al comerciante que ejecute un bash dentro de la carpeta del plugin. Ese script se para con un error si un parche deja de encajar, porque un paquete sin parchear parece correcto y la AEAT lo rechaza. Reproduce tus dos archivos byte a byte.

Además se quitan del paquete los PDF de especificaciones de la AEAT y los tests que vienen con las librerías: nunca se ejecutan en una web y son 9,6 MB de los 11. El zip pasa de 8 MB a menos de 400 kB.

El empaquetado es automático: cada commit se compila y se publica, y cada versión etiquetada tiene su release con el zip instalable.

github.com/hikashop-nicolas/hikashop-verifactu/releases

Todo esto está probado en una instalación de Joomla 6 con HikaShop y MySQL 9.6, sin el plugin de compatibilidad instalado: el paquete instala, crea sus dos tablas, sus dos columnas y sus dos campos personalizados, la clase del plugin carga, y los campos de su pantalla de configuración se generan correctamente, incluido el desplegable que lee los estados de pedido reales de la tienda. Lo que no hemos probado es el envío real a la AEAT, porque no tenemos certificado ni entorno de pruebas dado de alta; esa parte sigue verificada solo por tu trabajo.

Una última cosa, y la decimos por ti más que por nosotros: la declaración responsable la firma quien produce el software. Si el plugin lo distribuyes tú, el productor eres tú, con lo que eso implica. Nosotros no podemos asumir ese papel por HikaShop, que es justo lo que te comentábamos más arriba en el hilo, y por eso este repositorio es una ayuda al tuyo y no un producto nuestro.

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 month 5 days ago #373102

Hi Nicolas,

Just sent you a private message.

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 month 3 days ago #373123

Made the latest changes on the Verifactu plugin and everything works fine.... Except when you uninstall the plugin then it messes completly up with frontend and backend styles. I really have no clue what it can be....

This message has an attachment file.
Please log in or register to see it.

The following user(s) said Thank You: nicolas

Please Log in or Create an account to join the conversation.

  • Posts: 86217
  • Thank you received: 14222
  • MODERATOR
1 month 3 days ago #373125

Hola,

Reproducido, y la causa no está en HikaShop sino en el manifiesto del plugin:

<media folder="media" destination="com_hikashop">
    <folder>plugins</folder>
</media>

Al desinstalar, Joomla procesa ese bloque en Installer::removeFiles() y termina con un Folder::delete() de la carpeta de destino, sin ninguna condición. Como el destino es com_hikashop, la desinstalación borra media/com_hikashop entera: css, js, images, mail y upload/safe. Por eso el front y el back se quedan sin estilos.

Comprobado en Joomla 6.2 con HikaShop y MySQL: instalar el plugin y desinstalarlo deja el sitio sin esa carpeta.

Te adjunto el paquete corregido, versión 0.31.1:

- El manifiesto ya no lleva bloque media.
- La plantilla de la factura viaja dentro del plugin, en layouts/invoice.php.
- El script de instalación la copia a media/com_hikashop/plugins/invoice.php, que es donde HikaShop busca la plantilla (attachinvoice.php la carga desde HIKASHOP_MEDIA.'plugins'.DS.$layout.'.php').
- Al desinstalar se borra solo ese archivo, y la carpeta únicamente si queda vacía.
- Si en esa ruta ya existe una plantilla que no es la del plugin, se conserva y se avisa por mensaje, en lugar de sobrescribirla.

Probado sobre el propio zip adjunto: instalación, desinstalación, y media/com_hikashop queda intacta.

Un aviso que conviene dar a quien ya haya desinstalado una versión anterior: media/com_hikashop se recupera reinstalando HikaShop encima de la instalación existente, pero los archivos vendidos que estuvieran en media/com_hikashop/upload/safe solo vuelven desde una copia de seguridad.
This attachment is hidden for guests.
Please log in or register to see it.

This message has an attachment file.
Please log in or register to see it.

Last edit: 1 month 3 days ago by nicolas.
The following user(s) said Thank You: nicobraam

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 month 3 days ago #373128

Hello Nicolas,

Works fine now but i can not create an invoice with QR code for somebody from portugal or other country. I also made some modifications in the layout and some fields are filled automaticly now. (date, version etc....) I also removed unnecessary address fields as address is taken from store_address. I added a new version for your convenience.

Best regards

This message has an attachment file.
Please log in or register to see it.

Last edit: 1 month 3 days ago by nicobraam.

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 month 3 days ago #373132

Just modified lastest version and it seems to work fine now. If somebody wants to check it and confirm your more than welcome :) :) :) :) :)

This message has an attachment file.
Please log in or register to see it.

The following user(s) said Thank You: nicolas

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
6 days 23 hours ago #373438

Hello Nicolas,

English

After receiving some new information about VeriFactu, I have had to modify how invoice numbering and NIF/DNI validation work.
Maybe you can upload a recent version to Github as i dont have an account. (after you check it)

I am attaching the two updated plugins.

Español

Después de haber recibido más información nueva sobre VeriFactu, he tenido que modificar el funcionamiento de la numeración de las facturas y la comprobación del NIF/DNI. Quizá puedes subir una nueva versión a Github ya que no tengo cuenta. (después de comprobarlo)

Adjunto los dos plugins actualizados.

This message has attachments files.
Please log in or register to see it.

Last edit: 6 days 23 hours ago by nicobraam.

Please Log in or Create an account to join the conversation.

  • Posts: 86217
  • Thank you received: 14222
  • MODERATOR
6 days 19 hours ago #373440

Hola,

Sobre subir la versión a GitHub: sí, podemos subirla nosotros al repositorio. Antes de hacerlo te comentamos los puntos que hemos visto en la revisión, porque varios cambian lo que acaba registrado en la AEAT y preferimos que la versión que quede publicada ya los lleve resueltos. Dinos qué te parece cada uno, y con lo que decidas la subimos.

Subir la versión a nuestro GitHub es justo lo que no podemos hacer, y es el mismo punto de los mensajes anteriores. Si tú dejas de distribuir y el único sitio donde se descarga el instalable es nuestro repositorio, el distribuidor pasamos a ser nosotros, que es el papel que dijimos desde el principio que HikaShop no puede asumir. Abrir una cuenta en GitHub es gratis y son dos minutos: si creas el repositorio, te enviamos allí nuestros cambios y tú publicas las versiones. Y si prefieres no usar GitHub, vale cualquier alojamiento tuyo, Drive como hasta ahora o tu propia web; nosotros mantenemos el nuestro solo como repositorio de código, con tu autoría.

Numeración propia. Viene activada por defecto, así que una tienda que actualice cambia de numeración sin enterarse; nos parece más prudente que el valor por defecto sea No y que cada comerciante la active a conciencia. La semilla solo reconoce el formato {aa}{prefijo}-{dígitos}, así que en una tienda cuyo formato de factura de HikaShop sea otro la serie arranca en 0001 en vez de continuar. Y con el prefijo F1 vacío tu serie tiene exactamente la misma forma que la nativa de HikaShop: las facturas que HikaShop numera pero que no llegan al estado disparador conservan el número nativo y ese contador sigue avanzando por su cuenta, con lo que las dos series pueden acabar emitiendo el mismo número. Poner también un prefijo propio a F1, o disparar exactamente en el estado en el que HikaShop numera, lo evita. Un último detalle: el año sale de la fecha del envío, no de la de la factura, así que una factura del 31 de diciembre enviada el 1 de enero recibe el prefijo del año nuevo mientras su FechaExpedicion sigue en el anterior.

Destinatario extranjero. Tu cambio vuelve a fijar IDType 02 para todo el extranjero. 02 es NIF-IVA y la AEAT lo contrasta contra VIES: PT503890278 pasa, pero 503890278 a secas, que es como lo escribe medio mundo, y cualquier cliente de fuera de la UE se rechazan, que es el 1103 que viste. Lo tenemos resuelto sin perder tu caso: 02 solo cuando el identificador lleva el prefijo de su país (EL en el caso de Grecia), 04 en los demás, y CodigoPais siempre informado. Te lo pasamos para que lo incorpores.

Desglose vacío. De acuerdo en las dos cosas: el 21 % inventado estaba mal, y cortar antes de registrar dejaba el pedido sin rastro ni QR. Pero declarar N2, no sujeta por reglas de localización, en cualquier pedido sin desglose también declara como no sujeta una venta española cuyos impuestos simplemente estén mal configurados, y eso queda registrado en la AEAT igual de bien. Nosotros lo limitaríamos al destinatario fuera de España, y para un pedido español sin desglose seguiríamos devolviendo error, pero guardando ya la fila del registro local como haces ahora.

Validador de NIF. Vaciar el NIF cuando no valida tiene un efecto que quizá no buscabas: en el plugin VeriFactu la familia se decide según haya o no NIF de cliente, así que un cliente español que se equivoca en una letra pasa de F1 a F2 y su factura sale a la AEAT como simplificada, con los límites de importe que eso implica, sin que nadie se entere. Es mejor rechazar el valor y que el cliente lo corrija, o guardarlo tal cual y marcar el pedido para revisión, que borrarlo en silencio. Dos detalles menores: el plugin escribe directamente en $_POST, que Joomla ya ha leído en su propio objeto Input, así que ese borrado puede no llegar donde esperas; y el mensaje de error está fijo en español dentro del JavaScript, sin archivo de idioma.

Autoría. El manifiesto sigue diciendo author y copyright "Custom". Para que podamos subirlo esto sí necesitamos cambiarlo: la GPLv2 mantiene el nombre del autor, y nosotros no podemos publicar como anónimo un código que no hemos escrito. Además, tal como queda ahora, la declaración deja un documento en el que el productor declarado es el comerciante y el software no lo firma nadie. Es tu plugin, ponte como autor.

Lo que no hemos podido comprobar sigue siendo lo mismo que la otra vez: el envío real a la AEAT, porque aquí no tenemos certificado ni entorno de pruebas dado de alta. Todo lo anterior es revisión de código sobre tus dos zips.

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 day 9 hours ago #373479

Hello Nicolas,

Could you share please (sent you a private masage before yesterday):

Destinatario extranjero. Tu cambio vuelve a fijar IDType 02 para todo el extranjero. 02 es NIF-IVA y la AEAT lo contrasta contra VIES: PT503890278 pasa, pero 503890278 a secas, que es como lo escribe medio mundo, y cualquier cliente de fuera de la UE se rechazan, que es el 1103 que viste. Lo tenemos resuelto sin perder tu caso: 02 solo cuando el identificador lleva el prefijo de su país (EL en el caso de Grecia), 04 en los demás, y CodigoPais siempre informado. Te lo pasamos para que lo incorpores.

Thanks

Please Log in or Create an account to join the conversation.

  • Posts: 86217
  • Thank you received: 14222
  • MODERATOR
1 day 6 hours ago #373481

Hola Nico,

Te adjunto tu versión 0.32.2 con el cambio del destinatario extranjero ya incorporado, y el diff por separado (en .txt, el foro no admite .diff) para que veas exactamente qué cambia. Solo toca src/VerifactuLibraryBridge.php, el resto del zip es tu versión tal cual.

Lo que hace:
- IDType 02 (NIF-IVA) solo cuando el identificador empieza por el prefijo de su país (PT503890278, o EL para Grecia). Tu caso sigue funcionando igual.
- IDType 04 en los demás casos: número nacional sin prefijo (503890278) y cualquier cliente de fuera de la UE.
- CodigoPais siempre informado.
- Un cliente español que escribe su NIF con el prefijo ES (ES12345678Z) lo pierde antes de ir en NIF.

Como la otra vez, aquí solo lo hemos comprobado contra la validación de la librería, no contra la AEAT. Antes de usarlo en producción convendría enviar en el entorno de pruebas una factura con un NIF portugués sin prefijo y otra con un cliente de fuera de la UE.

Sobre la numeración que explicas en tu mensaje: de acuerdo en que cada tipo de factura necesita su serie correlativa. Los puntos que comentamos en la revisión siguen en pie (activada por defecto, la semilla, el posible choque con la numeración nativa si F1 no tiene prefijo, y el año tomado del envío).

This message has attachments files.
Please log in or register to see it.

Last edit: 1 day 8 hours ago by nicolas.

Please Log in or Create an account to join the conversation.

  • Posts: 47
  • Thank you received: 3
  • Hikashop Business
1 day 6 hours ago #373484

Hola Nicolas,

He trabajado el fin de semana para resolver los problemas con los NIF + impuesto + abonos de Portugal, Canarias Ceuta y Melilla. He realizado las pruebas en la AEAT y ahora todos están marcados como aceptado y con su "Causa operación exenta" correcta. Además en el plugin permite ahora descargar por selección de fechas un csv o un xml en formato .zip tal como obliga la AEAT. Mientras tanto se han generado mas modificaciones del plugin. Te adjunto la ultima versión de mi plugin con los cambios realizados para que lo puedes contrastar. Una comprobación del archivo vf_destinatario_extranjero_0_32_2.diff ha arrojado este resultado.

"La decisión 02 vs 04 es la misma idea que aplicamos en 0.34.14: 02 solo si el identificador lleva el prefijo VIES de su propio país (Grecia = EL, no GR); en cualquier otro caso, 04. Solo cambia la forma de escribirlo (tu diff usa un array de constantes PREFIJO_VAT_UE; nosotros una función que reutiliza esPaisUE(), que ya usábamos en otro sitio para la exención E5 — evita mantener la lista de 27 países en dos lugares que podrían desincronizarse).

Diferencias reales

1. Algo que el diff arregla y a nosotros se nos escapó — vale la pena portarlo. Para el destinatario español, el diff añade:

php
$recipient->nif = preg_replace('/^ES(?=[0-9A-Z]{9}$)/', '', $nifCliente);

Si un cliente español escribe su NIF/CIF en formato intracomunitario (ESB12345678, con el prefijo "ES" que se usa para operaciones dentro de la UE), el campo <NIF> del bloque destinatario español lo quiere sin ese prefijo (B12345678) — la AEAT valida el NIF español con su propio formato de 9 caracteres, y ESB12345678 (11 caracteres) lo rechazaría. Nuestro código actual (línea 1307) sigue haciendo $recipient->nif = $nifCliente; sin esa limpieza. Esto es un bug real que no tocamos.

2. Comprobación de longitud algo más laxa en el diff. Exige solo que el identificador tenga al menos 1 carácter después del prefijo de país (strlen($identificador) > strlen($prefijo)). La nuestra exige entre 2 y 12 caracteres alfanuméricos después del prefijo (heredado de la vieja esNifIvaUEValido()). En la práctica ningún NIF-IVA real de la UE tiene solo 1 dígito tras el prefijo, así que esto no cambia ningún caso real — la nuestra es simplemente algo más estricta por definición, sin coste.

3. Añade 'XI' => 'XI' (Irlanda del Norte) al mapa. No aporta nada en este plugin: el país de facturación sale de obtenerCodigoPaisFactura(), que lee zone_code_2 de HikaShop — Irlanda del Norte no existe como zona propia ahí, esas direcciones caen bajo GB (Reino Unido). Ese caso es papel mojado con la estructura de datos que tenemos.

Conclusión
La lógica del IDType es equivalente a la que ya llevamos en 0.34.16. Lo único que merece la pena incorporar es el punto 1 (limpieza del prefijo ES en el NIF del destinatario español), que es un bug distinto y real que seguimos teniendo."

Respecto al plugin "Nif validator" es el seguro que no se envían facturas a la AEAT con un error en el NIF/DNI. Esto es la razón que si no esta bien el NIF/DNI no se guarda nada pero el cliente SI puede registrarse y realizar la compra. La compre se queda registrado como F2 y si quiere posteriormente una factura se puede modificar el mismo pedido. (Si este flujo de trabajo se puede incorporar en el plugin aun seria mejor)

Un saludo,

Nico

This message has an attachment file.
Please log in or register to see it.

Please Log in or Create an account to join the conversation.

  • Posts: 86217
  • Thank you received: 14222
  • MODERATOR
23 hours 44 minutes ago #373488

Hola Nico,

Gracias por la nueva versión y por las pruebas contra la AEAT. Hemos revisado la 0.34.16 frente a la 0.32.2. De acuerdo con tu análisis del IDType: la lógica 02/04 es equivalente a la nuestra, y está bien que la numeración propia venga ahora desactivada por defecto y que el desglose vacío ya no se declare como N2 para un cliente español. Antes de subirla al repositorio, estos son los puntos que hemos encontrado, del más grave al menos grave:

1. La actualización desde la 0.32.2 falla. El archivo sql/updates/mysql/0.34.13.sql hace un MODIFY COLUMN de verifactu_sustituye_simplificada, pero en una tienda con la 0.32.2 esa columna todavía no existe: la crea script.php en el postflight, que Joomla ejecuta después de los SQL de actualización. MySQL responde "Unknown column", Joomla interrumpe la actualización y el postflight no llega a ejecutarse, así que tampoco se crean tipo_registro y motivo_anulacion ni se acepta el aviso legal. Al reintentar, vuelve a fallar en el mismo punto. La solución es quitar ese MODIFY del SQL y hacerlo en script.php, solo si la columna existe y todavía es TINYINT. De paso: Joomla activa siempre el modo estricto de MySQL, así que guardar 'Sí' en una columna TINYINT da un error, no se trunca en silencio como dicen los comentarios.

2. Las anulaciones no se guardan en el registro local. En guardarRegistro(), total_factura vale null para una anulación, pero la columna es DECIMAL NOT NULL sin valor por defecto. El INSERT falla y la excepción solo se escribe en el log: la AEAT ha aceptado la anulación, pero la tabla no la tiene, la cadena de huellas se la salta y el siguiente guardado del pedido la vuelve a enviar. Poner 0 en total_factura para las anulaciones, o permitir NULL en la columna, lo resuelve. Pasa algo parecido cuando el aviso legal no está aceptado: la fila se intenta guardar sin fecha, NIF ni total, y el número de factura ya se ha consumido.

3. El prefijo ES del NIF español sigue sin quitarse (lo mencionas tú mismo). La línea es esta, en el bloque del destinatario español:

$recipient->nif = preg_replace('/^ES(?=[0-9A-Z]{9}$)/', '', $nifCliente);

4. Canarias, Ceuta y Melilla se detectan por el código postal de facturación. La exención depende de adónde van las mercancías, y HikaShop calcula por defecto los impuestos sobre la dirección de envío: un cliente que factura en Madrid y envía a Tenerife no paga IVA, pero el plugin lo trata como peninsular y rechaza el pedido por desglose vacío. Conviene mirar primero la dirección de envío y usar la de facturación solo si el pedido no tiene.

5. Rectificativas: $facturaRectificada queda siempre a null, así que FacturasRectificadas nunca se informa y obtenerFacturaRectificada() no se llega a usar. Los importes negativos y el R5 nos parecen correctos.

6. La exportación: las fechas y los filtros están bien protegidos, pero el CSV y el ZIP cargan todo el rango en memoria, con los QR en base64 incluidos, así que un rango largo puede superar el memory_limit. Además, el ZIP se crea en sys_get_temp_dir(), que en alojamientos con open_basedir suele fallar; la carpeta tmp de Joomla (tmp_path) es más segura, y conviene comprobar el resultado de open() y borrar el archivo al terminar.

7. Los dos cambios en vendor/eseperio (getLastRequestXml) desaparecen en cuanto se regenera la carpeta vendor. En el repositorio los parches a la librería se aplican con un script en el momento de la compilación, así que los añadiríamos allí.

Por último, el manifiesto sigue indicando "Custom" como autor y copyright, y la licencia ha pasado de GPLv2 a GPLv3. Para publicarla en el repositorio necesitamos que el manifiesto lleve tu nombre (o Locker25.com). El cambio a GPLv3 lo puedes hacer como autor, y por nuestra parte no hay inconveniente en que nuestras correcciones pasen también a GPLv3. El DISCLAIMER.md todavía indica la v0.34.10.

Si nos confirmas los puntos 1 a 3, los corregimos nosotros sobre tu 0.34.16, junto con el del autor, y la subimos al repositorio con cada corrección en su propio commit para que las veas. Como siempre, solo podemos comprobarlo contra la validación de la librería y no contra la AEAT, así que convendría repetir tus pruebas en el entorno de pruebas antes de pasar a producción.

Please Log in or Create an account to join the conversation.

Time to create page: 0.100 seconds
Powered by Kunena Forum