Informe detallado de validación de producción

SIF BongoFact 1.0.29 · 29 de septiembre de 2026

Resultado global: PASS

Bump SemVer PATCH: aplicado

Esta autoverificación técnica revisa evidencias reproducibles del release. No constituye homologación de la AEAT, certificación ENS ni dictamen jurídico externo. Facturae/FACe se evalúa como interoperabilidad de factura electrónica y no como parte del RRSIF.

0. Gate funcional obligatorio

Resultado: PASS

Commit auditado: 7bdb02be4201e6f66ea888161c412152bdff5b95

Conectividad AEAT: N/A · falta certificado dedicado de sonda

1. SIF Veri*Factu y Facturae/FACe

31 controles · 27 PASS · 4 N/A · 0 FAIL

Artefacto: verifactu_audit_20260929_2356.txt

PASSSHA256_HUELLA

Área: Veri*Factu · huella

Referencia: RD 1007/2023 art. 12 · Orden HAC/1177/2024 art. 13

Requisito: Calcular SHA-256 sobre el subconjunto y formato oficial de campos.

Método: Vector determinista y recálculo independiente con node:crypto.

Evidencia: veriFactuService.mjs

Resultado: Huella SHA-256 hex 64 mayúsculas coincidente (38C89D610219…).

PASSXML_ALTA_ANULACION

Área: Veri*Factu · registros

Referencia: RD 1007/2023 arts. 10 y 11 · Orden HAC/1177/2024 arts. 10 y 11

Requisito: Generar altas y anulaciones XML UTF-8 con estructura y contenido reglamentarios.

Método: Generación de ambos tipos y comprobación de nodos críticos.

Evidencia: veriFactuService.mjs

Resultado: XML RegistroAlta y RegistroAnulacion contienen Huella, encadenamiento y estructura mínima.

PASSENCADENAMIENTO

Área: Veri*Factu · trazabilidad

Referencia: RD 1007/2023 art. 8.2.b · Orden HAC/1177/2024 art. 7

Requisito: Encadenar cada alta/anulación con el registro cronológicamente anterior.

Método: Cadena de dos registros y prueba negativa con huella alterada.

Evidencia: veriFactuService.mjs

Resultado: Encadenamiento: huella N depende de N-1; genesis vacío en cadena; ruptura detectada.

PASSQR_AEAT

Área: Veri*Factu · QR

Referencia: Orden HAC/1177/2024 arts. 20 y 21

Requisito: Construir la URL QR oficial exclusivamente con NIF, serie/número, fecha e importe.

Método: Parseo de URL y comparación exacta de parámetros.

Evidencia: qrGenerator.mjs · veriFactuService.mjs

Resultado: QR apunta a ValidarQR AEAT (prod/www2) con los cuatro parámetros oficiales y sin datos adicionales.

PASSINALTEABILIDAD_CUMP01

Área: Veri*Factu · inalterabilidad

Referencia: RD 1007/2023 art. 8.2.a · Orden HAC/1177/2024 art. 6

Requisito: Impedir modificación o eliminación de registros sellados.

Método: Sonda RPC real o verificación de migración cuando no hay credenciales.

Evidencia: prevent_invoice_tampering

Resultado: BD bloqueó UPDATE con huella: Veri*Factu: no se puede modificar base_imponible en factura emitida. Use anulación.

PASSEMISION_ATOMICA_CUMP02

Área: Veri*Factu · concurrencia

Referencia: RD 1007/2023 art. 8.2.a–b

Requisito: Serializar numeración y encadenamiento para evitar carreras.

Método: Sonda de existencia RPC o inspección de migración FOR UPDATE.

Evidencia: aplicar_emision_verifactu_atomica

Resultado: RPC aplicar_emision_verifactu_atomica desplegada (responde a sonda).

PASSSIF_IDENTIDAD_VERSION_PRODUCTOR

Área: Veri*Factu · identificación SIF

Referencia: Orden HAC/1177/2024, anexo 2.6 y art. 15.1 a–j

Requisito: Los registros deben identificar de forma coherente productor, código, versión e instalación del SIF.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: server/servicios/veriFactuService.mjs · src/config/sifRelease.json

Resultado: Productor, NIF y versión 1.0.29 son coherentes entre registro y release.

PASSMODO_EXCLUSIVO_VERIFACTU

Área: Veri*Factu · modalidad

Referencia: RD 1007/2023 art. 16 · Orden HAC/1177/2024 arts. 15.1.e y 16

Requisito: Si se declara uso exclusivo VERI*FACTU, la emisión debe enlazar con la remisión efectiva a AEAT.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: veriFactuService.mjs · emitirBorradorFacturaSaas.mjs

Resultado: El registro declara SoloVerifactu=S y el flujo de un tenant VERIFACTU remite tras sellar.

N/AFIRMA_REGISTROS_NO_VERIFACTU

Área: Veri*Factu · firma de registros

Referencia: RD 1007/2023 arts. 12 y 16.3 · Orden HAC/1177/2024 art. 14

Requisito: Los registros no VERI*FACTU se firman con XAdES y certificado cualificado; los VERI*FACTU están dispensados.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: TipoUsoPosibleSoloVerifactu=S

Resultado: No aplicable por diseño exclusivamente VERI*FACTU; permanece obligatoria la huella SHA-256.

N/AREGISTRO_EVENTOS_NO_VERIFACTU

Área: Veri*Factu · registro de eventos

Referencia: Orden HAC/1177/2024 art. 9

Requisito: Los sistemas no VERI*FACTU registran eventos de inicio/fin, anomalías, restauración y exportación.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: TipoUsoPosibleSoloVerifactu=S · FAQ técnica AEAT

Resultado: No aplicable mientras el producto solo pueda operar como VERI*FACTU.

PASSSIF_MULTIPLES_OBLIGADOS

Área: Veri*Factu · identificación SIF

Referencia: Orden HAC/1177/2024 art. 15.1.f y anexo 2.6

Requisito: La capacidad de prestar servicio a varios obligados tributarios debe declararse coherentemente.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: veriFactuService.mjs · migración agency_relations

Resultado: La capacidad multiobligado está declarada de forma coherente.

N/AAUTORIZACION_NO_APLICACION

Área: Veri*Factu · supuestos especiales

Referencia: Orden HAC/1177/2024 art. 12

Requisito: Consignar el número de registro de autorizaciones o resoluciones de no aplicación cuando existan.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: No se declara ninguna autorización o resolución especial para BongoFact.

Resultado: No aplicable al release auditado; si un obligado dispone de resolución, deberá habilitarse y verificarse antes de su uso.

N/ARENUNCIA_MODALIDAD_VERIFACTU

Área: Veri*Factu · modalidad

Referencia: Orden HAC/1177/2024 art. 17

Requisito: Una eventual renuncia a la remisión respeta plazo, campo oficial y mantenimiento hasta fin de año.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: Declaración de producto exclusivamente VERI*FACTU.

Resultado: No aplicable: el producto no ofrece cambio a modalidad no VERI*FACTU.

PASSALTA_SIMULTANEA_EXPEDICION

Área: Veri*Factu · registro de alta

Referencia: RD 1007/2023 arts. 9 y 10 · Orden HAC/1177/2024 art. 10

Requisito: Generar automáticamente el registro de alta simultáneamente o inmediatamente antes de expedir la factura.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: emitirBorradorFacturaSaas.mjs

Resultado: El flujo de emisión construye/persiste el XML y aplica numeración, huella y estado mediante operación atómica.

PASSCORRECCION_MEDIANTE_NUEVO_REGISTRO

Área: Veri*Factu · inalterabilidad

Referencia: RD 1007/2023 art. 8.2.a y art. 11

Requisito: Las correcciones o anulaciones no alteran el original: generan un registro posterior.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: veriFactuService.mjs · migraciones CUMP-01/CUMP-02

Resultado: Existe registro de anulación encadenado y bloqueo de mutación de registros sellados.

PASSTRAZABILIDAD_BIDIRECCIONAL_UI

Área: Veri*Factu · trazabilidad

Referencia: Orden HAC/1177/2024 art. 7.h

Requisito: Desde cualquier registro debe poder saltarse al anterior y posterior, mostrando validez de hash y orden temporal.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: src/components/facturacion/InvoiceTraceabilityTimeline.tsx

Resultado: La interfaz ofrece navegación anterior/posterior y valida encadenamiento.

PASSCONSERVACION_ACCESO_EXPORTACION

Área: Veri*Factu · conservación

Referencia: RD 1007/2023 art. 8.2.c y art. 14 · Orden HAC/1177/2024 art. 8

Requisito: Conservar y permitir acceso, consulta y copia electrónica legible de los registros.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: exportarDatosUsuario.mjs · /api/exportar-datos · almacenamiento facturas_xml

Resultado: La exportación autenticada reúne facturas y XML conservados en un ZIP tenant-scoped.

PASSREMISION_AEAT_SEGURA_FEHACIENTE

Área: Veri*Factu · remisión

Referencia: RD 1007/2023 arts. 8.1 y 16 · Orden HAC/1177/2024 arts. 4, 5 y 16

Requisito: Remisión continuada, segura, correcta, íntegra, automática, consecutiva, instantánea y fehaciente.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: aeatVerifactuRemision.mjs · procesarRemisionRegistroVerifactu.mjs

Resultado: Transporte HTTPS/mTLS, certificado y parser de respuesta AEAT presentes.

PASSPRODUCCION_AEAT_ENTORNO

Área: Veri*Factu · despliegue

Referencia: Orden HAC/1177/2024 art. 16 · separación de entornos AEAT

Requisito: Un release de producción debe auditarse contra configuración productiva explícita, nunca preproducción/mock.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: VERIFACTU_ENV · VERIFACTU_ENDPOINT_URL · release-prod-gate

Resultado: El gate usa entorno prod y endpoint oficial agenciatributaria.gob.es.

PASSREMISION_CONTROL_FLUJO

Área: Veri*Factu · remisión

Referencia: Orden HAC/1177/2024 art. 16.2

Requisito: Respetar el tiempo de espera inicialmente de 60 segundos, su actualización por AEAT y el máximo de registros por envío.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: aeatVerifactuRemision.mjs · verifactuFlowControl.mjs · migraciones verifactu_remision_control(_rpc)

Resultado: Se detecta control de flujo durable (RPC + TiempoEsperaEnvio) y tamaño máximo de lote 1000.

PASSREMISION_REINTENTO_INMUTABLE

Área: Veri*Factu · inalterabilidad y contingencia

Referencia: RD 1007/2023 art. 8.2.a · Orden HAC/1177/2024 art. 16.4

Requisito: Reenviar un registro sellado conserva XML, FechaHoraHusoGenRegistro y huella, marcando la incidencia solo en el sobre.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: remitirFacturaAeatManual.mjs · procesarRemisionRegistroVerifactu.mjs · prepararXmlRemisionConVentanaAeat.mjs

Resultado: El reenvío usa el XML firmado conservado, verifica su hash y no recalcula la huella.

PASSREMISION_REINTENTO_HORARIO_AVISO

Área: Veri*Factu · contingencia

Referencia: Orden HAC/1177/2024 art. 16.4

Requisito: Reintentar al menos cada hora y mantener aviso visible mientras existan registros pendientes.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: server/index.mjs · procesarRemisionRegistroVerifactu.mjs · frontend

Resultado: Existe worker horario y aviso persistente de pendientes.

PASSRESPUESTA_AEAT_CSV_ERRORES

Área: Veri*Factu · remisión

Referencia: Orden HAC/1177/2024 art. 16.3 y 16.5

Requisito: Interpretar aceptación, CSV, registro erróneo y código de error sin confundir HTTP 200 con aceptación.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: aeatVerifactuRemision.mjs · tests/aeatVerifactuRemision.test.mjs

Resultado: El parser separa estado de envío/registro, CSV y errores de negocio.

PASSREMISION_MARCA_INCIDENCIA

Área: Veri*Factu · contingencia

Referencia: Orden HAC/1177/2024 art. 16.4 y anexo 4

Requisito: Marcar en el mensaje los registros remitidos fuera de plazo por una incidencia técnica.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: aeatVerifactuRemision.mjs · verifactuFlowControl.mjs · migraciones verifactu_remision_control(_rpc)

Resultado: Se detecta el campo Incidencia en SOAP y persistencia de incidencia técnica por tenant.

PASSQR_REPRESENTACION_GRAFICA

Área: Veri*Factu · factura

Referencia: Orden HAC/1177/2024 arts. 20 y 21

Requisito: Incluir QR legible de 30–40 mm y la mención VERI*FACTU; en factura electrónica, la URL.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: invoiceTemplate.mjs · qrGenerator.mjs

Resultado: Las plantillas sitúan al inicio un QR de 30 mm con «QR tributario:» y la mención legal, sin exigir certificado al receptor.

PASSDECLARACION_RESPONSABLE_ART15

Área: Veri*Factu · declaración responsable

Referencia: RD 1007/2023 art. 13 · Orden HAC/1177/2024 art. 15

Requisito: Declaración visible por versión, con apartados obligatorios 1.a–1.l en orden y anexo explicativo.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: scripts/generate-declaracion.mjs · public/legal/declaracion-responsable.html

Resultado: Se comprueba estructuralmente el generador, no una firma externa ni una homologación de la AEAT.

PASSFACTURAE_322_ESTRUCTURA

Área: Facturae/FACe · formato

Referencia: Ley 25/2013 · formato Facturae 3.2.2 publicado por FACe

Requisito: Generar Facturae 3.2.2 con cabecera, partes, impuestos, totales, líneas y pago coherentes.

Método: Generación determinista de una factura de prueba y comprobación de estructura/valores.

Evidencia: facturaeXmlService.mjs · tests/facturaeXml.test.mjs

Resultado: La muestra usa namespace/esquema 3.2.2 y totaliza 100,00 + 21,00 = 121,00.

PASSFACTURAE_DIR3_FACE

Área: Facturae/FACe · centros administrativos

Referencia: Especificación FACe / Facturae 3.2.2

Requisito: Incluir oficina contable (01), órgano gestor (02) y unidad tramitadora (03) en BuyerParty.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: facturaeXmlService.mjs

Resultado: La muestra contiene los tres centros DIR3 con sus RoleTypeCode.

PASSFACTURAE_FIRMA_XADES_POLICY

Área: Facturae/FACe · firma

Referencia: Política de firma Facturae v3.1 · XAdES-EPES

Requisito: Firmar el XML con certificado cualificado, referencia enveloped y política Facturae exigida por FACe.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: facturaeSigner.mjs · facturaeXmlService.mjs

Resultado: El motor y el preflight exigen XAdES-EPES y el digest de política; no se usa un certificado real en CI.

PASSFACTURAE_IDENTIDAD_CERTIFICADO

Área: Facturae/FACe · identidad

Referencia: Política de firma Facturae/FACe

Requisito: Comprobar que el certificado pertenece al emisor o a un representante válido de la persona jurídica.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: facturaeXmlService.mjs · pkcs12Identidad.mjs

Resultado: El preflight compara SellerParty con identidad y organizationIdentifier del certificado.

PASSFACE_TRANSPORTE_RESPUESTA

Área: Facturae/FACe · remisión

Referencia: Servicios web FACe y WSDL oficial

Requisito: Enviar factura firmada, interpretar código de resultado y conservar número de registro.

Método: Inspección estática reproducible del código incluido en el release.

Evidencia: faceWebService.mjs · tests/aeatVerifactuRemision.test.mjs

Resultado: Existe cliente SOAP y parser que no considera éxito sin código/registro válido.

2. Seguridad

15 controles · 15 PASS · 0 N/A · 0 FAIL

Artefacto: security_audit_20260929_2356.txt

PASSJWT_PRIVATE_ENDPOINTS

Área: Identidad · autenticación

Referencia: RGPD art. 32 · ENS arts. 17 y 18 · OWASP ASVS V2

Requisito: Validar JWT en endpoints privados y autenticación específica del integrador.

Método: Inspección de middleware y prefijos protegidos.

Evidencia: server/index.mjs · middleware/requireAuth.mjs

Resultado: requireAuth valida JWT; AUTH_ROUTE_PREFIXES cubre facturación/admin; integrador usa API key propia.

PASSSQL_INJECTION_STATIC

Área: API · inyección

Referencia: OWASP ASVS V5 · OWASP Top 10 A03

Requisito: Evitar SQL construido por concatenación de entrada no confiable.

Método: Escaneo de patrones peligrosos en todos los archivos del servidor.

Evidencia: server/**/*.mjs

Resultado: Sin patrones obvios de SQL concatenado en 254 archivos server.

PASSINTEGRADOR_APIKEY_HASH

Área: Identidad · credenciales API

Referencia: OWASP ASVS V2/V6

Requisito: No persistir API keys de integradores en texto claro.

Método: Vector hash independiente y revisión de columnas persistidas.

Evidencia: integradorBancarioAuth.mjs

Resultado: API key de integrador: SHA-256 hex; solo se persiste integrador_api_key_hash.

PASSHEALTH_PUBLIC

Área: Operación · monitorización

Referencia: ENS arts. 23 y 26

Requisito: Exponer salud mínima sin datos sensibles y sin exigir sesión.

Método: Control negativo del gate JWT.

Evidencia: server/index.mjs

Resultado: /api/health excluido correctamente del gate JWT.

PASSTENANT_RLS_ISOLATION

Área: Datos · aislamiento tenant

Referencia: RGPD art. 32 · ENS arts. 15, 17 y 21 (referencia de buenas prácticas)

Requisito: Toda lectura/escritura fiscal debe quedar limitada al tenant autorizado.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: requireTenantFacturacion.mjs · políticas RLS en supabase/migrations

Resultado: Existe middleware tenant y RLS en la base de datos; la prueba no sustituye un test remoto de políticas.

PASSRBAC_SUPERADMIN_MFA

Área: Identidad · privilegios

Referencia: ENS arts. 17 y 18 · OWASP ASVS V2/V4

Requisito: Las acciones privilegiadas requieren rol de plataforma verificado y MFA AAL2.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: server/index.mjs · requireAuth.mjs

Resultado: El backend diferencia Superadmin de claims genéricos y dispone de gate AAL2.

PASSORIGIN_CORS_CSRF

Área: API · origen de peticiones

Referencia: OWASP ASVS V3/V14

Requisito: Restringir orígenes web y bloquear mutaciones sin origen/autenticación válida.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: server/index.mjs

Resultado: Existe allowlist de hosts/orígenes y gate JWT para prefijos protegidos.

PASSRATE_LIMIT_ABUSE

Área: API · disponibilidad

Referencia: ENS art. 23 · OWASP API Security API4

Requisito: Limitar abuso en autenticación, IA y rutas de coste elevado.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: server/index.mjs

Resultado: Se detectan limitadores para IA y middleware de rate limiting.

PASSHTTP_SECURITY_HEADERS

Área: Web · navegador y transporte

Referencia: ENS arts. 22 y 23 · OWASP ASVS V14

Requisito: Forzar HTTPS/HSTS y políticas CSP, anti-sniffing y framing.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: securityCsp.mjs · nginx-bongofact.conf

Resultado: La aplicación define HSTS/CSP y Nginx sirve el dominio por HTTPS.

PASSSECRETS_DEPLOY_ISOLATION

Área: Secretos · despliegue

Referencia: ENS arts. 18, 19 y 21 · OWASP ASVS V6

Requisito: No incluir secretos, credenciales cloud ni claves privadas en artefactos o frontend.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: deploy/deploy-bongoo.ps1

Resultado: El empaquetado excluye .env y credenciales; el .env remoto se conserva con permisos restringidos.

PASSCERTIFICATE_VAULT_CRYPTO

Área: Criptografía · certificados

Referencia: RGPD art. 32 · ENS arts. 21 y 22

Requisito: Cifrar certificados en reposo, limitar descifrado y limpiar material sensible de memoria.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: certificadoVault.mjs y servicios de firma

Resultado: Se detectan cifrado autenticado/gestión de bóveda y limpieza de buffers.

PASSAUDIT_LOG_APPEND_ONLY

Área: Trazabilidad · auditoría

Referencia: ENS art. 24 · RD 1007/2023 art. 8 (ámbito fiscal)

Requisito: Registrar acciones críticas en una bitácora tenant-scoped resistente a alteración.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: auditLogger.mjs · migration audit_logs_inmutable

Resultado: audit_logs es append-only por trigger, fuerza RLS y restringe privilegios.

PASSLOG_SECRET_DISCLOSURE

Área: Trazabilidad · confidencialidad

Referencia: RGPD art. 32 · OWASP ASVS V7

Requisito: No escribir contraseñas, PIN, claves privadas, service_role o API keys en logs.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: Escaneo de 254 archivos server

Resultado: No se detecta interpolación obvia de secretos en console.*.

PASSDEPENDENCY_LOCKFILE

Área: Cadena de suministro

Referencia: ENS arts. 20 y 21 · OWASP ASVS V1.14

Requisito: Fijar versiones reproducibles de dependencias para el artefacto desplegado.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: package-lock.json · npm install en deploy

Resultado: Existe lockfile y producción instala únicamente dependencias runtime.

PASSDEPLOY_ATOMIC_HEALTH_ROLLBACK

Área: Continuidad · despliegue

Referencia: ENS arts. 25 y 26

Requisito: Publicar de forma controlada, conservar versión anterior y verificar salud del servicio.

Método: Análisis estático reproducible del artefacto de release.

Evidencia: deploy/deploy-bongoo.ps1

Resultado: El frontend usa swap, conserva dist.previous y comprueba Nginx/API tras reinicio.

3. Fuentes normativas y técnicas

Generado automáticamente por scripts/release-prod-gate.mjs antes del despliegue.