# digitalDot VeriFactu para WooCommerce 1.2.16.4

Adaptacion del nucleo fiscal `ddverifactu` 1.2.16 a WordPress + WooCommerce.

## Principio fiscal

En WooCommerce core existe el pedido y el reembolso, pero no un objeto nativo equivalente al `OrderInvoice` numerado de PrestaShop. Por eso esta edicion crea una capa fiscal propia e inmutable:

1. El pedido de WooCommerce sigue siendo un pedido y no se envia a VeriFactu por si mismo.
2. Al emitir, el plugin valida primero configuracion, destinatario, importes e impuestos.
3. Solo si la validacion es correcta asigna serie y numero correlativo y conserva una instantanea economica inmutable con SHA-256.
4. A partir de esa factura fiscal se generan XML, huella, QR, cola y envio AEAT.
5. Un reembolso WooCommerce genera su propia factura rectificativa numerada y referencia la factura original aceptada.

Los cambios posteriores en el pedido no reescriben una factura ya emitida.

## Funcionalidad conservada/adaptada

- Altas F1 y F2 bajo las mismas reglas de seguridad del nucleo original.
- Rectificativas R1-R5 por diferencias a partir del reembolso exacto de WooCommerce.
- Subsanacion y anulacion sin reescribir registros fiscales anteriores.
- Cadena SHA-256 independiente por entorno, NIF emisor e instalacion.
- XML y huella inmutables; reintentos de transporte reutilizan la evidencia original.
- Cola persistente y cron interno de WordPress, con endpoint externo protegido por token.
- Consulta directa AEAT separada del entorno configurado para envios.
- Certificado P12/PFX/PEM cifrado con AES-256-GCM y usado mediante mTLS.
- QR generado localmente, sin servicios QR de terceros.
- Bloqueo preventivo de tipos al 0 %, exenciones, no sujecion, fiscalidad extranjera, recargo o impuestos compuestos cuando no exista una clasificacion inequívoca.
- Modo manual y automatico.
- Factura y rectificativa con **PDF real generado en servidor mediante Dompdf**, ademas de conservar la vista HTML imprimible existente.
- El PDF incluye el QR tributario VeriFactu al inicio, una sola vez, en un tamano de 30-40 mm y usando la identidad/entorno del registro de ALTA exacto.
- Enlace de factura en Mi cuenta y, opcionalmente, en emails de WooCommerce.
- Compatibilidad declarada con HPOS: el plugin usa las APIs CRUD de WooCommerce para pedidos y reembolsos.
- La desactivacion no borra evidencias fiscales, XML, registros, cola ni certificado.

## Requisitos

- WordPress 6.5 o superior.
- WooCommerce 8.2 o superior.
- PHP 8.1 o superior.
- PHP DOM, mbstring, cURL, OpenSSL, GD e iconv.
- MySQL/MariaDB con tablas InnoDB y soporte de `GET_LOCK`.
- Certificado electronico valido con clave privada.

## Instalacion

1. Haga copia de seguridad de WordPress y de la base de datos.
2. En **Plugins > Anadir nuevo > Subir plugin**, seleccione el ZIP de esta entrega.
3. Active **digitalDot VeriFactu for WooCommerce**.
4. Abra **WooCommerce > VeriFactu > Configuracion**.
5. Configure productor, sistema, entorno, modo, series, reglas fiscales y certificado.
6. Trabaje primero contra **Preproduccion**.
7. Revise el mapa fiscal si existen operaciones al 0 %, exentas, no sujetas, extranjeras o con regimenes especiales.
8. No active produccion hasta disponer de la declaracion responsable correspondiente a esta version.

## Numeracion

Las series de factura y rectificativa son independientes y deben ser distintas. El primer numero configurado solo se aplica antes de emitir el primer documento de cada serie. La numeracion se protege con bloqueo MySQL para evitar duplicados en ejecuciones simultaneas.

## Almacen privado

Por defecto, evidencias y certificado se guardan en:

`wp-content/ddverifactu-private/site-{ID}/`

El plugin crea reglas de denegacion para Apache e IIS. Se puede definir `DD_VERIFACTU_STORAGE_DIR` en `wp-config.php` para usar una ubicacion privada fuera del webroot. En ese caso, la ruta indicada debe ser escribible por PHP.

## Checkout y NIF/VAT

En checkout clasico se incorpora el campo **NIF / DNI / VAT**. Ademas, el plugin reconoce metadatos habituales de extensiones fiscales (`_billing_nif`, `_billing_vat`, `_billing_vat_number`, etc.) y ofrece el filtro `ddverifactu_recipient_tax_id` para integraciones personalizadas.

Si se usa Checkout Blocks y otra extension no guarda el identificador en uno de esos metadatos, puede introducirse desde la ficha del pedido antes de emitir la factura o integrarse mediante el filtro indicado.

## Seguridad y conservacion

- El certificado subido se valida como subida HTTP, se mueve primero a un fichero temporal local controlado y despues se cifra.
- Los nombres de fichero de evidencia se derivan solo del ID interno del registro; los numeros y fechas introducidos por administracion no se usan como rutas.
- Los endpoints AEAT son constantes del nucleo fiscal; el usuario no controla la URL de destino de las llamadas mTLS.
- Los documentos fiscales emitidos y las evidencias no se eliminan al desactivar el plugin.
- Dompdf tiene deshabilitadas las cargas remotas, PHP y JavaScript. El QR y el logotipo se incorporan desde ficheros locales/datos embebidos.
- Cambiar las salts de WordPress cambia la clave derivada que protege el certificado; tras una rotacion de salts sera necesario volver a subir el certificado.

## Facturas PDF y QR VeriFactu

El PDF no crea una segunda numeracion ni una segunda factura. Es la representacion visible del mismo documento fiscal inmutable que alimenta XML, huella y registro VeriFactu.

- Solo se ofrece PDF cuando existe un registro VeriFactu de **ALTA** para ese documento.
- Numero, fecha, importes, destinatario, lineas e impuestos salen de la instantanea inmutable almacenada al emitir.
- El QR se genera localmente y usa los datos del registro de ALTA exacto. No se utilizan proveedores QR externos.
- El PDF coloca el QR antes del contenido de la factura y lo incluye una sola vez.
- El tamano del QR se valida en el rango 30-40 mm.
- En modo VeriFactu se muestra `VERI*FACTU` y la leyenda de factura verificable en la sede electronica de la AEAT.
- Administracion y cliente pueden seguir usando la vista HTML anterior; la descarga PDF es una funcion adicional.

## Validacion de esta entrega

La entrega ha pasado:

- `php -l` sobre todos los ficheros PHP incluidos.
- carga del plugin con `E_ALL` en PHP 8.4 sin avisos/deprecaciones propios.
- prueba de activacion con adaptador WordPress simulado: configuracion, esquema, almacenamiento y cron.
- prueba funcional de instantanea WooCommerce -> F1 al 21 %.
- prueba de integridad SHA-256 de la instantanea.
- prueba de validacion fiscal antes de consumir numeracion.

Estas pruebas no sustituyen una instalacion real de WordPress/WooCommerce ni una remision real a AEAT. Antes de produccion debe probarse con la version, impuestos, checkout, tema, extensiones y certificado reales del comercio.
