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.