@r2digisolutions/verifactu
v0.2.2
Published
Motor VERI*FACTU (AEAT): hash SHA-256, XML, QR, SOAP mTLS y cifrado del certificado
Readme
@r2digisolutions/verifactu
Motor VERI*FACTU (SIF / AEAT) para productos Evoteg: hash SHA-256 encadenado, XML de registro, QR de cotejo, SOAP mTLS y cifrado del certificado .p12.
No es un formato de factura (Facturae). Es el control fiscal del software (RD 1007/2023 + Orden HAC/1177/2024). Hacienda no homologa programas: el productor autocertifica cada SIF con una declaración responsable.
Qué cubre / qué no
| Sí | No |
| ------------------------------------------- | ---------------------------- |
| Registro de alta / anulación | Persistencia (Drizzle, cola) |
| Huella SHA-256 spec AEAT v0.1.2 | UI de ajustes o facturas |
| XML + envelope SOAP | TicketBAI / Navarra / SII |
| QR de cotejo (la huella no va en el QR) | Facturae / Crea y Crece |
| mTLS con el .p12 del obligado | Certificado del productor |
Cada producto es un SIF distinto (Atom id 01, CRM id 02). El productor es Evoteg. El obligado tributario (gym / empresa) factura con su CIF y su certificado.
Instalación
pnpm add @r2digisolutions/verifactuEl producto debe pasar:
- Identidad del SIF (
name,id,version) - NIF y nombre del productor (
VERIFACTU_PRODUCER_NIF/VERIFACTU_PRODUCER_NAME) - Entorno AEAT (
pre|prod) - Clave de cifrado (
VERIFACTU_ENCRYPTION_KEY: 64 hex o secreto ≥ 32)
Uso
import { Verifactu } from '@r2digisolutions/verifactu';
const verifactu = new Verifactu({
sif: { name: 'CRM', id: '02', version: '1.0.0' },
producer: { name: 'Evoteg', nif: process.env.VERIFACTU_PRODUCER_NIF! },
env: 'pre',
encryptionKey: process.env.VERIFACTU_ENCRYPTION_KEY!
});
const huella = verifactu.hashAlta({ /* campos AEAT */ });
const xml = verifactu.buildAltaXml({ /* … */, huella });
const qr = verifactu.qrUrl({ nif, numSerie, fechaExpedicion, totalCents });
await verifactu.submitSoap({
soapXml: verifactu.wrapSoap({ emisorNombre, emisorNif, registroInner: xml }),
pfx,
passphrase
});Helpers estáticos: Verifactu.resolveDocumentType, Verifactu.centsToAeatAmount, Verifactu.formatFechaExpedicion, Verifactu.interpretAeatResponse, Verifactu.jurisdictionBlocks.
Specs
Portal desarrolladores AEAT — SIF / VERI*FACTU
Desarrollo
pnpm install
pnpm test:unit -- --run
pnpm check
pnpm prepackPublicación
El versionado usa bumpp. Un tag v* dispara GitHub Actions, que publica en npm con Trusted Publishing (OIDC).
Requisitos previos (una sola vez)
- Acceso al scope npm
@r2digisolutions - En npmjs.com → Trusted Publisher:
- Provider: GitHub Actions
- Organization / user:
r2digitalsolutions - Repository:
verifactu - Workflow filename:
publish.yml - Environment:
production(debe coincidir con el job de CI)
Subir versión
Working tree limpio, en main:
pnpm release:patch # 0.1.3 → 0.1.4
pnpm release:minor # 0.1.3 → 0.2.0
pnpm release:major # 0.1.3 → 1.0.0
# O interactivo:
pnpm releaseBump de versión, commit, tag vX.Y.Z y push. CI publica el paquete y crea el GitHub Release.
Creado con sv create --template library.
