@dwast/verifactu-lib 0.1.0-beta.2 → 0.1.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/aeat/client.d.ts +2 -6
- package/dist/cjs/aeat/client.d.ts.map +1 -1
- package/dist/cjs/aeat/client.js +19 -19
- package/dist/cjs/aeat/client.js.map +1 -1
- package/dist/cjs/aeat/response.d.ts +2 -0
- package/dist/cjs/aeat/response.d.ts.map +1 -1
- package/dist/cjs/aeat/response.js +1 -0
- package/dist/cjs/aeat/response.js.map +1 -1
- package/dist/cjs/core/models/index.d.ts +0 -1
- package/dist/cjs/core/models/index.d.ts.map +1 -1
- package/dist/cjs/core/models/index.js +0 -1
- package/dist/cjs/core/models/index.js.map +1 -1
- package/dist/cjs/core/xml/generator.d.ts +13 -15
- package/dist/cjs/core/xml/generator.d.ts.map +1 -1
- package/dist/cjs/core/xml/generator.js +16 -3
- package/dist/cjs/core/xml/generator.js.map +1 -1
- package/dist/cjs/integration/repository.d.ts +2 -3
- package/dist/cjs/integration/repository.d.ts.map +1 -1
- package/dist/cjs/integration/service.d.ts.map +1 -1
- package/dist/cjs/integration/service.js +16 -2
- package/dist/cjs/integration/service.js.map +1 -1
- package/dist/esm/aeat/client.d.ts +2 -6
- package/dist/esm/aeat/client.d.ts.map +1 -1
- package/dist/esm/aeat/client.js +19 -19
- package/dist/esm/aeat/client.js.map +1 -1
- package/dist/esm/aeat/response.d.ts +2 -0
- package/dist/esm/aeat/response.d.ts.map +1 -1
- package/dist/esm/aeat/response.js +1 -0
- package/dist/esm/aeat/response.js.map +1 -1
- package/dist/esm/core/models/index.d.ts +0 -1
- package/dist/esm/core/models/index.d.ts.map +1 -1
- package/dist/esm/core/models/index.js +0 -1
- package/dist/esm/core/models/index.js.map +1 -1
- package/dist/esm/core/xml/generator.d.ts +13 -15
- package/dist/esm/core/xml/generator.d.ts.map +1 -1
- package/dist/esm/core/xml/generator.js +16 -3
- package/dist/esm/core/xml/generator.js.map +1 -1
- package/dist/esm/integration/repository.d.ts +2 -3
- package/dist/esm/integration/repository.d.ts.map +1 -1
- package/dist/esm/integration/service.d.ts.map +1 -1
- package/dist/esm/integration/service.js +17 -3
- package/dist/esm/integration/service.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +175 -6
- package/src/aeat/client.ts +21 -21
- package/src/aeat/response.ts +3 -0
- package/src/core/models/index.ts +0 -1
- package/src/core/xml/generator.ts +25 -19
- package/src/integration/repository.ts +2 -3
- package/src/integration/schema.sql +0 -14
- package/src/integration/service.ts +22 -3
- package/src/core/models/event.ts +0 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/aeat/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/aeat/response.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
|
@@ -28,15 +28,6 @@ export interface AnulacionInput {
|
|
|
28
28
|
* antes de producción.
|
|
29
29
|
*/
|
|
30
30
|
export declare function generateRegistroAltaXml(invoice: Invoice, previousHash: string | null): string;
|
|
31
|
-
/**
|
|
32
|
-
* Cabecera del suministro (CabeceraType del XSD).
|
|
33
|
-
*/
|
|
34
|
-
export interface Cabecera {
|
|
35
|
-
/** Nombre o razón social del obligado a emitir. */
|
|
36
|
-
nombreRazon: string;
|
|
37
|
-
/** NIF del obligado a emitir. */
|
|
38
|
-
nif: string;
|
|
39
|
-
}
|
|
40
31
|
/**
|
|
41
32
|
* Namespace del esquema `SuministroLR.xsd` de la AEAT.
|
|
42
33
|
*/
|
|
@@ -98,12 +89,6 @@ export declare function generateInvoiceXml(invoice: Invoice, previousHash: strin
|
|
|
98
89
|
* Estructura según el XSD `SuministroInformacion.xsd` (`RegistroFacturacionAnulacionType`).
|
|
99
90
|
*/
|
|
100
91
|
export declare function generateAnulacionXml(anulacion: AnulacionInput, previousHash: string | null): string;
|
|
101
|
-
/**
|
|
102
|
-
* Datos de un registro de evento (RegistroEvento).
|
|
103
|
-
*
|
|
104
|
-
* Nota: el `NIF` aparece dos veces: `nifSistemaInformatico` (del sistema
|
|
105
|
-
* informático) y `nifObligado` (del obligado a emitir).
|
|
106
|
-
*/
|
|
107
92
|
/**
|
|
108
93
|
* Datos de un registro de evento (RegistroEvento, EventosSIF.xsd).
|
|
109
94
|
*/
|
|
@@ -121,6 +106,15 @@ export interface EventoInput {
|
|
|
121
106
|
tipoEvento: string;
|
|
122
107
|
/** Huella (hash) del evento. */
|
|
123
108
|
huellaEvento: string;
|
|
109
|
+
/** Evento anterior de la cadena (obligatorio para el 2º evento en adelante). */
|
|
110
|
+
eventoAnterior?: {
|
|
111
|
+
/** Tipo de evento del evento anterior. */
|
|
112
|
+
tipoEvento: string;
|
|
113
|
+
/** Fecha/hora de generación del evento anterior. */
|
|
114
|
+
fechaHoraHusoGenEvento: string;
|
|
115
|
+
/** Huella (hash) del evento anterior. */
|
|
116
|
+
huellaEvento: string;
|
|
117
|
+
};
|
|
124
118
|
/** Versión del esquema (por defecto '1.0'). */
|
|
125
119
|
idVersion?: string;
|
|
126
120
|
}
|
|
@@ -129,6 +123,10 @@ export interface EventoInput {
|
|
|
129
123
|
*
|
|
130
124
|
* Estructura basada en `EventosSIF.xsd` (namespace `sf`). El evento se envía
|
|
131
125
|
* como un suministro independiente (no dentro de `RegFactuSistemaFacturacion`).
|
|
126
|
+
*
|
|
127
|
+
* El encadenado emite `<sf:PrimerEvento>S</sf:PrimerEvento>` si es el primer
|
|
128
|
+
* evento, o `<sf:EventoAnterior>` con los datos del evento previo si se
|
|
129
|
+
* proporciona `eventoAnterior`.
|
|
132
130
|
*/
|
|
133
131
|
export declare function generateEventoXml(evento: EventoInput): string;
|
|
134
132
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../src/core/xml/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,sBAAsB,EAAE,MAAM,CAAC;IAC/B,4CAA4C;IAC5C,sBAAsB,EAAE,MAAM,CAAC;IAC/B,8DAA8D;IAC9D,6BAA6B,EAAE,MAAM,CAAC;IACtC,2CAA2C;IAC3C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iDAAiD;IACjD,wBAAwB,EAAE,MAAM,CAAC;IACjC,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CA8E7F;AAED;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../src/core/xml/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -205,9 +205,24 @@ export function generateAnulacionXml(anulacion, previousHash) {
|
|
|
205
205
|
*
|
|
206
206
|
* Estructura basada en `EventosSIF.xsd` (namespace `sf`). El evento se envía
|
|
207
207
|
* como un suministro independiente (no dentro de `RegFactuSistemaFacturacion`).
|
|
208
|
+
*
|
|
209
|
+
* El encadenado emite `<sf:PrimerEvento>S</sf:PrimerEvento>` si es el primer
|
|
210
|
+
* evento, o `<sf:EventoAnterior>` con los datos del evento previo si se
|
|
211
|
+
* proporciona `eventoAnterior`.
|
|
208
212
|
*/
|
|
209
213
|
export function generateEventoXml(evento) {
|
|
210
214
|
const si = evento.sistemaInformatico;
|
|
215
|
+
const encadenamiento = evento.eventoAnterior
|
|
216
|
+
? [
|
|
217
|
+
' <sf:Encadenamiento>',
|
|
218
|
+
' <sf:EventoAnterior>',
|
|
219
|
+
` <sf:TipoEvento>${escapeXml(evento.eventoAnterior.tipoEvento)}</sf:TipoEvento>`,
|
|
220
|
+
` <sf:FechaHoraHusoGenEvento>${evento.eventoAnterior.fechaHoraHusoGenEvento}</sf:FechaHoraHusoGenEvento>`,
|
|
221
|
+
` <sf:HuellaEvento>${evento.eventoAnterior.huellaEvento}</sf:HuellaEvento>`,
|
|
222
|
+
' </sf:EventoAnterior>',
|
|
223
|
+
' </sf:Encadenamiento>',
|
|
224
|
+
]
|
|
225
|
+
: [' <sf:Encadenamiento>', ' <sf:PrimerEvento>S</sf:PrimerEvento>', ' </sf:Encadenamiento>'];
|
|
211
226
|
const xml = [
|
|
212
227
|
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
213
228
|
`<sf:RegistroEvento xmlns:sf="${AEAT_EVENTO_NAMESPACE}">`,
|
|
@@ -230,9 +245,7 @@ export function generateEventoXml(evento) {
|
|
|
230
245
|
' </sf:ObligadoEmision>',
|
|
231
246
|
` <sf:FechaHoraHusoGenEvento>${evento.fechaHoraHusoGenEvento}</sf:FechaHoraHusoGenEvento>`,
|
|
232
247
|
` <sf:TipoEvento>${escapeXml(evento.tipoEvento)}</sf:TipoEvento>`,
|
|
233
|
-
|
|
234
|
-
' <sf:PrimerEvento>S</sf:PrimerEvento>',
|
|
235
|
-
' </sf:Encadenamiento>',
|
|
248
|
+
...encadenamiento,
|
|
236
249
|
' <sf:TipoHuella>01</sf:TipoHuella>',
|
|
237
250
|
` <sf:HuellaEvento>${evento.huellaEvento}</sf:HuellaEvento>`,
|
|
238
251
|
' </sf:Evento>',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/core/xml/generator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/core/xml/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Event } from '../core/models/event.js';
|
|
2
1
|
/**
|
|
3
2
|
* Estado de un registro de facturación en el sistema consumidor.
|
|
4
3
|
*/
|
|
@@ -21,6 +20,8 @@ export interface StoredRecord {
|
|
|
21
20
|
previousHash: string | null;
|
|
22
21
|
/** Payload del QR Verifactu (URL de verificación con el hash). */
|
|
23
22
|
qrPayload?: string;
|
|
23
|
+
/** `true` si la huella devuelta por AEAT coincide con la calculada. */
|
|
24
|
+
hashVerified?: boolean;
|
|
24
25
|
/** Estado del registro. */
|
|
25
26
|
status: RecordStatus;
|
|
26
27
|
/** Fecha/hora de creación. */
|
|
@@ -73,7 +74,5 @@ export interface VerifactuRepository {
|
|
|
73
74
|
saveResponse(response: StoredResponse): Promise<void>;
|
|
74
75
|
/** Obtiene las respuestas de un registro. */
|
|
75
76
|
getResponses(recordId: string): Promise<StoredResponse[]>;
|
|
76
|
-
/** Guarda un evento. */
|
|
77
|
-
saveEvent(event: Event): Promise<void>;
|
|
78
77
|
}
|
|
79
78
|
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/integration/repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/integration/repository.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,MAAM,GACN,WAAW,GACX,UAAU,GACV,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2BAA2B;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,qCAAqC;IACrC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACpD,kEAAkE;IAClE,aAAa,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC9C,mCAAmC;IACnC,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,6CAA6C;IAC7C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/integration/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAqG,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAM/J,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQzE;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAFf,UAAU,EAAE,mBAAmB,EAC/B,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,MAAM,YAAA;IAG1C;;;OAGG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/integration/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAqG,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAM/J,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQzE;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAFf,UAAU,EAAE,mBAAmB,EAC/B,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,MAAM,YAAA;IAG1C;;;OAGG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAoF9D;;;;;OAKG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IA8E/E;;;;;;OAMG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAQxF;;;;;OAKG;IACG,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAoDhE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { generateInvoiceXml, generateSuministroXml, buildCabecera, generateAnulacionXml, generateEventoXml } from '../core/xml/generator.js';
|
|
2
|
-
import { computeRegistroAlta, computeRegistroAnulacion, computeRegistroEvento } from '../core/hash/chain.js';
|
|
2
|
+
import { computeRegistroAlta, computeRegistroAnulacion, computeRegistroEvento, verifyRegistroAlta } from '../core/hash/chain.js';
|
|
3
3
|
import { buildQrPayload } from '../core/qr/qr.js';
|
|
4
4
|
import { nowIsoWithOffset } from '../core/utils/date.js';
|
|
5
5
|
import { validateInvoice } from '../core/validation/validate.js';
|
|
@@ -78,10 +78,24 @@ export class VerifactuService {
|
|
|
78
78
|
message: result.message,
|
|
79
79
|
receivedAt: new Date().toISOString(),
|
|
80
80
|
});
|
|
81
|
-
// 5.
|
|
81
|
+
// 5. Verificar la huella devuelta por AEAT (integridad del registro).
|
|
82
|
+
const aeatHash = result.registro?.huella;
|
|
83
|
+
const hashVerified = result.status === 'OK' && aeatHash !== undefined
|
|
84
|
+
? verifyRegistroAlta({
|
|
85
|
+
idEmisorFactura: invoice.emisor.nif,
|
|
86
|
+
numSerieFactura: `${invoice.id.serie ?? ''}${invoice.id.numero}`,
|
|
87
|
+
fechaExpedicionFactura: invoice.id.fechaExpedicion,
|
|
88
|
+
tipoFactura: invoice.tipoFactura,
|
|
89
|
+
cuotaTotal: invoice.desglose.cuotaTotal.toFixed(2),
|
|
90
|
+
importeTotal: invoice.desglose.importeTotal.toFixed(2),
|
|
91
|
+
huellaAnterior: previousHash,
|
|
92
|
+
fechaHoraHusoGenRegistro,
|
|
93
|
+
}, aeatHash)
|
|
94
|
+
: undefined;
|
|
95
|
+
// 6. Actualizar el estado del registro según la respuesta.
|
|
82
96
|
const status = result.status === 'OK' ? 'CONFIRMED' : 'REJECTED';
|
|
83
97
|
await this.repository.updateRecordStatus(record.id, status);
|
|
84
|
-
return { ...record, status };
|
|
98
|
+
return { ...record, status, hashVerified };
|
|
85
99
|
}
|
|
86
100
|
/**
|
|
87
101
|
* Anula una factura previamente registrada.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/integration/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAoB,MAAM,0BAA0B,CAAC;AAC/J,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/integration/service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dwast/verifactu-lib",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.3",
|
|
4
4
|
"description": "Librería para la gestión de Verifactu (RD 1007/2023): modelo de datos, encadenado hash, generación XML, QR y cliente AEAT.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
package/readme.md
CHANGED
|
@@ -25,10 +25,11 @@ npm install @dwast/verifactu-lib
|
|
|
25
25
|
```
|
|
26
26
|
src/
|
|
27
27
|
├── core/
|
|
28
|
-
│ ├── models/ # Tipos: Invoice, Emisor, Desglose, SistemaInformatico
|
|
28
|
+
│ ├── models/ # Tipos: Invoice, Emisor, Desglose, SistemaInformatico
|
|
29
29
|
│ ├── hash/ # Encadenado hash (SHA-256)
|
|
30
30
|
│ ├── xml/ # Generación XML Verifactu (RegistroAlta, Anulacion, Evento, Suministro)
|
|
31
31
|
│ ├── qr/ # Generación QR Verifactu
|
|
32
|
+
│ ├── validation/ # Validación de facturas
|
|
32
33
|
│ └── utils/ # Utilidades (fecha/hora con huso)
|
|
33
34
|
├── aeat/ # Cliente de servicios AEAT (SOAP + mTLS)
|
|
34
35
|
├── integration/ # Repositorio, servicio, p12, accountability
|
|
@@ -46,6 +47,175 @@ src/
|
|
|
46
47
|
|
|
47
48
|
---
|
|
48
49
|
|
|
50
|
+
## Cómo usar
|
|
51
|
+
|
|
52
|
+
Guía práctica paso a paso. La receta recomendada es **`VerifactuService`** (se encarga de validar, generar el hash, el XML, encadenar con la huella anterior, enviar y persistir). Para casos "de bajo nivel" usa el `VerifactuClient` directamente.
|
|
53
|
+
|
|
54
|
+
### 0. Configuración inicial (certificado `.p12` → cliente)
|
|
55
|
+
|
|
56
|
+
Extrae `cert` + `key` del `.p12` y construye el cliente (aquí en entorno de **pruebas**; en producción usa `baseUrl` y no pases `env`).
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { readFileSync } from 'node:fs';
|
|
60
|
+
import { readP12 } from '@dwast/verifactu-lib/integration';
|
|
61
|
+
import { VerifactuClient, AEAT_TEST_SOAP_URL } from '@dwast/verifactu-lib/aeat';
|
|
62
|
+
import { VerifactuService } from '@dwast/verifactu-lib/integration';
|
|
63
|
+
import type { VerifactuRepository } from '@dwast/verifactu-lib/integration';
|
|
64
|
+
|
|
65
|
+
// 1. Leer el .p12 y extraer certificado + clave (PEM).
|
|
66
|
+
const { certificates, keys } = readP12(
|
|
67
|
+
readFileSync('mi-certificado.p12'),
|
|
68
|
+
'contraseña-del-p12',
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// 2. Cliente AEAT con mTLS. env:'test' → usa testBaseUrl (pruebas).
|
|
72
|
+
const client = new VerifactuClient({
|
|
73
|
+
testBaseUrl: AEAT_TEST_SOAP_URL, // https://prewww1.aeat.es/.../VerifactuSOAP
|
|
74
|
+
env: 'test',
|
|
75
|
+
cert: certificates[0],
|
|
76
|
+
key: keys[0],
|
|
77
|
+
timeoutMs: 15_000,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// 3. Servicio de orquestación (repositorio implementado por tu app + cliente).
|
|
81
|
+
// El 3er arg (cert PEM) sirve para detectar representante en la cabecera.
|
|
82
|
+
const repo: VerifactuRepository = /* tu implementación (Mongoose, Prisma...) */;
|
|
83
|
+
const service = new VerifactuService(repo, client, certificates[0]);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> **Producción:** omite `env` y `testBaseUrl`, usa `baseUrl`:
|
|
87
|
+
> `new VerifactuClient({ baseUrl: AEAT_PRODUCTION_SOAP_URL, cert, key })`.
|
|
88
|
+
|
|
89
|
+
### 1. Enviar 1 factura (alta)
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import type { Invoice } from '@dwast/verifactu-lib/core';
|
|
93
|
+
|
|
94
|
+
const invoice: Invoice = {
|
|
95
|
+
id: { serie: 'A', numero: '2026-0001', fechaExpedicion: '07-09-2026' }, // DD-MM-YYYY
|
|
96
|
+
emisor: { nif: 'B18579458', nombreRazon: 'MOVVIENDO TOURISM GROUP SL' },
|
|
97
|
+
tipoFactura: 'F1',
|
|
98
|
+
tipoDesglose: 'S1',
|
|
99
|
+
descripcion: 'Servicios de consultoria',
|
|
100
|
+
destinatarios: [{ nombreRazon: 'CLIENTE SL', nif: 'B12345678' }],
|
|
101
|
+
desglose: {
|
|
102
|
+
detalles: [
|
|
103
|
+
{ calificacionOperacion: 'S1', claveRegimen: '01', tipoImpositivo: 21, baseImponible: 100, cuotaRepercutida: 21 },
|
|
104
|
+
],
|
|
105
|
+
cuotaTotal: 21,
|
|
106
|
+
importeTotal: 121,
|
|
107
|
+
},
|
|
108
|
+
sistemaInformatico: {
|
|
109
|
+
nombreRazon: 'MOVVIENDO TOURISM GROUP SL',
|
|
110
|
+
nif: 'B18579458',
|
|
111
|
+
nombreSistemaInformatico: 'SIF-PROD',
|
|
112
|
+
idSistemaInformatico: '01', // máx 2 caracteres
|
|
113
|
+
version: '1.0',
|
|
114
|
+
numeroInstalacion: '1',
|
|
115
|
+
},
|
|
116
|
+
fechaHoraHusoGenRegistro: new Date().toISOString().replace(/\.\d+Z/, 'Z'), // o nowIsoWithOffset()
|
|
117
|
+
huella: '', // la calcula el servicio
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const record = await service.registerInvoice(invoice);
|
|
121
|
+
|
|
122
|
+
console.log(record.status); // 'CONFIRMED' | 'REJECTED'
|
|
123
|
+
console.log(record.hash); // huella SHA-256 (64 hex)
|
|
124
|
+
console.log(record.hashVerified); // true/false (si AEAT devolvió huella que coincide)
|
|
125
|
+
console.log(record.qrPayload); // URL del QR
|
|
126
|
+
console.log(record.xml); // XML Verifactu que se envió (persistir)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
> La **fecha/hora** debe ser la actual (margen AEAT de 240s). Usa `nowIsoWithOffset()` de `@dwast/verifactu-lib/core` en vez de `toISOString()`.
|
|
130
|
+
|
|
131
|
+
### 2. Enviar varias facturas encadenadas
|
|
132
|
+
|
|
133
|
+
`VerifactuService` **encadena automáticamente** la huella: cada alta usa como `huellaAnterior` el hash del último registro guardado en `getLastRecord()`. Solo encadena **dentro del mismo obligado + sistema informático**.
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
const f1 = await service.registerInvoice(invoice1); // PrimerRegistro
|
|
137
|
+
const f2 = await service.registerInvoice(invoice2); // usa f1.hash como huellaAnterior
|
|
138
|
+
const f3 = await service.registerInvoice(invoice3); // usa f2.hash
|
|
139
|
+
console.log(f2.previousHash === f1.hash); // true
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
> **Importante:** el sistema informático (`numeroInstalacion`/`idSistemaInformatico`) debe ser **el mismo** en toda la cadena. Para empezar una cadena nueva por cada sistema, usa un `numeroInstalacion` único.
|
|
143
|
+
|
|
144
|
+
### 3. Anular una factura
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
await service.annulInvoice(invoiceId, invoice);
|
|
148
|
+
// - Genera el registro de anulación (encadena con el último hash).
|
|
149
|
+
// - Envía a AEAT.
|
|
150
|
+
// - Marca la factura original como 'ANNULLED'.
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
`invoiceId` es la **referencia de la original** (serie + número, p. ej. `A2026-0001`), que debe existir en el repositorio. Pasa la `invoice` completa si quieres que use su `sistemaInformatico` y sus fechas; si no, usa los valores por defecto de la librería.
|
|
154
|
+
|
|
155
|
+
### 4. Modificar una factura
|
|
156
|
+
|
|
157
|
+
Verifactu **no tiene "modificación"**: se hace como anulación + nuevo alta. `modifyInvoice` lo hace por ti.
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
const original: Invoice = /* la factura ya enviada */;
|
|
161
|
+
await service.registerInvoice(original);
|
|
162
|
+
|
|
163
|
+
const corregida: Invoice = { ...original, id: { ...original.id, numero: '2026-0002' }, /* cambios */ };
|
|
164
|
+
await service.modifyInvoice(`${original.id.serie ?? ''}${original.id.numero}`, corregida);
|
|
165
|
+
// Anula la original y emite la corregida como nuevo alta (CONFIRMED si AEAT la acepta).
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 5. Consultar la huella de un registro enviado
|
|
169
|
+
|
|
170
|
+
En lugar de guardar la huella, puedes pedirla a AEAT. Necesitas el **número de factura** y el **mes** real.
|
|
171
|
+
|
|
172
|
+
```ts
|
|
173
|
+
const res = await client.queryInvoice({
|
|
174
|
+
obligado: { nombreRazon: 'MOVVIENDO TOURISM GROUP SL', nif: 'B18579458' },
|
|
175
|
+
numSerieFactura: 'A2026-0001',
|
|
176
|
+
ejercicio: '2026',
|
|
177
|
+
periodo: '09', // 01–12, el mes real de la factura
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
const huella = res.consulta?.huella; // hash confirmado por AEAT
|
|
181
|
+
const pagSiguiente = res.consulta?.clavePaginacion; // pasar como clavePaginacion en la siguiente consulta
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
> **Recomendación:** para encadenar la siguiente factura es más fiable **guardar la huella localmente** (`getLastRecord()`). `queryInvoice` es útil para auditoría o recuperación puntual. Consultar "por periodo" sin número devuelve registros de todos los sistemas y ejecuciones (poco fiable).
|
|
185
|
+
|
|
186
|
+
### 6. Enviar un evento (`RegistroEvento`)
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
import { computeRegistroEvento } from '@dwast/verifactu-lib/core';
|
|
190
|
+
|
|
191
|
+
const last = await repo.getLastRecord(); // último registro (para encadenar)
|
|
192
|
+
const fechaHora = nowIsoWithOffset();
|
|
193
|
+
const hash = computeRegistroEvento({
|
|
194
|
+
nifSistemaInformatico: 'B18579458',
|
|
195
|
+
id: '', // IDOtro del software (vacío si usa NIF)
|
|
196
|
+
idSistemaInformatico: '01',
|
|
197
|
+
version: '1.0',
|
|
198
|
+
numeroInstalacion: '1',
|
|
199
|
+
nifObligado: 'B18579458',
|
|
200
|
+
tipoEvento: '01', // 01–10, 90 (ver EventosSIF.xsd)
|
|
201
|
+
huellaAnterior: last?.hash ?? null,
|
|
202
|
+
fechaHoraHusoGenEvento: fechaHora,
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
await service.registerEvent({
|
|
206
|
+
sistemaInformatico: { /* igual que en la factura */ },
|
|
207
|
+
obligadoEmision: { nombreRazon: 'MOVVIENDO TOURISM GROUP SL', nif: 'B18579458' },
|
|
208
|
+
fechaHoraHusoGenEvento: fechaHora,
|
|
209
|
+
tipoEvento: '01',
|
|
210
|
+
huellaEvento: hash,
|
|
211
|
+
// eventoAnterior: { tipoEvento, fechaHoraHusoGenEvento, huellaEvento } // para el 2º evento en adelante
|
|
212
|
+
});
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
> **⚠️ Envío de eventos.** La generación del XML (`generateEventoXml`) es correcta y está cubierta por unit tests, pero **el envío real necesita un endpoint/operación SOAP específica de eventos** que el cliente actual (`VerifactuSOAP`) todavía no cubre (AEAT devuelve error 4118). Úsalo cuando se añada ese endpoint.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
49
219
|
## Núcleo (`core`)
|
|
50
220
|
|
|
51
221
|
### Modelos (`core/models`)
|
|
@@ -272,8 +442,7 @@ const client = new VerifactuClient({
|
|
|
272
442
|
| Método | Descripción |
|
|
273
443
|
|--------|-------------|
|
|
274
444
|
| `sendRecord(xml)` | Envía un registro (alta/anulación/evento) a AEAT |
|
|
275
|
-
| `
|
|
276
|
-
| `queryInvoice({ obligado, numSerieFactura, ejercicio, periodo })` | Consulta un registro por número de factura y devuelve su huella |
|
|
445
|
+
| `queryInvoice({ obligado, numSerieFactura, ejercicio, periodo, clavePaginacion? })` | Consulta un registro por número de factura y devuelve su huella; acepta `clavePaginacion` para cursar las páginas siguientes |
|
|
277
446
|
|
|
278
447
|
### `queryInvoice` — obtener la huella de un registro enviado
|
|
279
448
|
|
|
@@ -296,7 +465,7 @@ const huella = res.consulta?.huella; // hash confirmado por AEAT
|
|
|
296
465
|
|
|
297
466
|
### Formato de respuesta (`SendResult`)
|
|
298
467
|
|
|
299
|
-
`sendRecord
|
|
468
|
+
`sendRecord` y `queryInvoice` devuelven **todo lo recibido de AEAT**, sea OK o error:
|
|
300
469
|
|
|
301
470
|
```ts
|
|
302
471
|
interface SendResult {
|
|
@@ -332,6 +501,7 @@ interface ConsultaResponse {
|
|
|
332
501
|
descripcionError?: string;
|
|
333
502
|
csv?: string;
|
|
334
503
|
huella?: string; // hash del primer registro devuelto
|
|
504
|
+
clavePaginacion?: string; // cursor para la página siguiente
|
|
335
505
|
registros?: RegistroResponse[];
|
|
336
506
|
}
|
|
337
507
|
|
|
@@ -421,7 +591,7 @@ WSDL: `.../tikeV1.0/cont/ws/SistemaFacturacion.wsdl`. La operación de consulta
|
|
|
421
591
|
|
|
422
592
|
### Requisitos del sistema consumidor
|
|
423
593
|
|
|
424
|
-
1. **Persistencia.** El sistema DEBE implementar `VerifactuRepository` y disponer de las tablas de `src/integration/schema.sql` (`verifactu_records`, `verifactu_responses
|
|
594
|
+
1. **Persistencia.** El sistema DEBE implementar `VerifactuRepository` y disponer de las tablas de `src/integration/schema.sql` (`verifactu_records`, `verifactu_responses`). La AEAT exige conservar la respuesta de cada envío.
|
|
425
595
|
2. **Credenciales.** Para el envío real, el sistema aporta el certificado (`.p12`) y el NIF.
|
|
426
596
|
|
|
427
597
|
### Repositorio (`VerifactuRepository`)
|
|
@@ -437,7 +607,6 @@ const repo: VerifactuRepository = {
|
|
|
437
607
|
getLastRecord() { /* ... */ },
|
|
438
608
|
saveResponse(response) { /* ... */ },
|
|
439
609
|
getResponses(recordId) { /* ... */ },
|
|
440
|
-
saveEvent(event) { /* ... */ },
|
|
441
610
|
};
|
|
442
611
|
```
|
|
443
612
|
|
package/src/aeat/client.ts
CHANGED
|
@@ -197,27 +197,6 @@ export class VerifactuClient {
|
|
|
197
197
|
return this.request(url, 'POST', headers, envelope);
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
/**
|
|
201
|
-
* @deprecated La consulta por ID de operación no está soportada por el
|
|
202
|
-
* esquema `ConsultaLR.xsd` de AEAT (devuelve error 4118). Usa
|
|
203
|
-
* {@link queryInvoice} para consultar registros por número de factura.
|
|
204
|
-
*/
|
|
205
|
-
async getOperationStatus(operationId: string): Promise<SendResult> {
|
|
206
|
-
const consultaXml = `<ConsultaFactuSistemaFacturacion xmlns="${this.config.namespace}"><ID>${operationId}</ID></ConsultaFactuSistemaFacturacion>`;
|
|
207
|
-
const envelope = buildRemisionEnvelope(consultaXml);
|
|
208
|
-
const url = new URL(this.config.baseUrl);
|
|
209
|
-
const headers: Record<string, string> = {
|
|
210
|
-
'Content-Type': 'text/xml; charset=utf-8',
|
|
211
|
-
SOAPAction: '',
|
|
212
|
-
Accept: 'application/xml',
|
|
213
|
-
};
|
|
214
|
-
if (this.config.authToken) {
|
|
215
|
-
headers.Authorization = `Bearer ${this.config.authToken}`;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
return this.request(url, 'POST', headers, envelope);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
200
|
/**
|
|
222
201
|
* Consulta un registro de facturación por número de factura y devuelve la
|
|
223
202
|
* respuesta completa (incluida la huella confirmada por AEAT).
|
|
@@ -233,6 +212,8 @@ export class VerifactuClient {
|
|
|
233
212
|
ejercicio: string;
|
|
234
213
|
/** Periodo de imputación, p. ej. `01` (enero) o `12` (diciembre). */
|
|
235
214
|
periodo: string;
|
|
215
|
+
/** Clave de paginación devuelta por AEAT en la página anterior (cursor). */
|
|
216
|
+
clavePaginacion?: string;
|
|
236
217
|
}): Promise<SendResult> {
|
|
237
218
|
const consultaXml = [
|
|
238
219
|
`<sfLRC:ConsultaFactuSistemaFacturacion xmlns:sfLRC="${AEAT_CONSULTA_NAMESPACE}" xmlns:sf="${AEAT_INFORMACION_NAMESPACE}">`,
|
|
@@ -251,6 +232,9 @@ export class VerifactuClient {
|
|
|
251
232
|
...(params.numSerieFactura
|
|
252
233
|
? [` <sfLRC:NumSerieFactura>${params.numSerieFactura}</sfLRC:NumSerieFactura>`]
|
|
253
234
|
: []),
|
|
235
|
+
...(params.clavePaginacion
|
|
236
|
+
? [` <sfLRC:ClavePaginacion>${params.clavePaginacion}</sfLRC:ClavePaginacion>`]
|
|
237
|
+
: []),
|
|
254
238
|
' </sfLRC:FiltroConsulta>',
|
|
255
239
|
'</sfLRC:ConsultaFactuSistemaFacturacion>',
|
|
256
240
|
].join('\n');
|
|
@@ -332,6 +316,22 @@ export class VerifactuClient {
|
|
|
332
316
|
response = soap;
|
|
333
317
|
data = soap.body;
|
|
334
318
|
operationId = String(soap.body['ID'] ?? soap.body['IdPeticion'] ?? '');
|
|
319
|
+
// SOAP Fault: AEAT devolvió un error técnico (HTTP 200 con <Fault>).
|
|
320
|
+
const faultString = String(soap.body['faultstring'] ?? '');
|
|
321
|
+
if (soap.operation === 'Fault' || faultString) {
|
|
322
|
+
status = 'ERROR';
|
|
323
|
+
message = faultString || message;
|
|
324
|
+
errorCode = String(soap.body['faultcode'] ?? '') || errorCode;
|
|
325
|
+
return {
|
|
326
|
+
operationId,
|
|
327
|
+
status,
|
|
328
|
+
message,
|
|
329
|
+
errorCode,
|
|
330
|
+
rawResponse: raw,
|
|
331
|
+
data,
|
|
332
|
+
response,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
335
|
// Estado según el registro/consulta/evento mapeado.
|
|
336
336
|
const reg = soap.registro;
|
|
337
337
|
const con = soap.consulta;
|
package/src/aeat/response.ts
CHANGED
|
@@ -37,6 +37,8 @@ export interface ConsultaResponse {
|
|
|
37
37
|
csv?: string;
|
|
38
38
|
/** Huella (hash) de la operación consultada. */
|
|
39
39
|
huella?: string;
|
|
40
|
+
/** Clave de paginación para obtener la siguiente página (cursor). */
|
|
41
|
+
clavePaginacion?: string;
|
|
40
42
|
/** Registros devueltos por la consulta. */
|
|
41
43
|
registros?: RegistroResponse[];
|
|
42
44
|
}
|
|
@@ -160,6 +162,7 @@ function mapConsulta(opBody: Record<string, unknown> | undefined): ConsultaRespo
|
|
|
160
162
|
descripcionError: str(opBody['DescripcionError']),
|
|
161
163
|
csv: str(opBody['CSV']),
|
|
162
164
|
huella: registros?.[0]?.huella,
|
|
165
|
+
clavePaginacion: str(opBody['ClavePaginacion']),
|
|
163
166
|
registros: registros as RegistroResponse[] | undefined,
|
|
164
167
|
};
|
|
165
168
|
}
|
package/src/core/models/index.ts
CHANGED