@dwast/verifactu-lib 0.1.0-beta.1 → 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.
Files changed (157) hide show
  1. package/dist/cjs/aeat/client.d.ts +115 -14
  2. package/dist/cjs/aeat/client.d.ts.map +1 -1
  3. package/dist/cjs/aeat/client.js +223 -47
  4. package/dist/cjs/aeat/client.js.map +1 -1
  5. package/dist/cjs/aeat/index.d.ts +1 -0
  6. package/dist/cjs/aeat/index.d.ts.map +1 -1
  7. package/dist/cjs/aeat/index.js +1 -0
  8. package/dist/cjs/aeat/index.js.map +1 -1
  9. package/dist/cjs/aeat/response.d.ts +80 -0
  10. package/dist/cjs/aeat/response.d.ts.map +1 -0
  11. package/dist/cjs/aeat/response.js +118 -0
  12. package/dist/cjs/aeat/response.js.map +1 -0
  13. package/dist/cjs/core/hash/chain.d.ts +42 -0
  14. package/dist/cjs/core/hash/chain.d.ts.map +1 -1
  15. package/dist/cjs/core/hash/chain.js +40 -0
  16. package/dist/cjs/core/hash/chain.js.map +1 -1
  17. package/dist/cjs/core/index.d.ts +2 -0
  18. package/dist/cjs/core/index.d.ts.map +1 -1
  19. package/dist/cjs/core/index.js +2 -0
  20. package/dist/cjs/core/index.js.map +1 -1
  21. package/dist/cjs/core/models/index.d.ts +0 -1
  22. package/dist/cjs/core/models/index.d.ts.map +1 -1
  23. package/dist/cjs/core/models/index.js +0 -1
  24. package/dist/cjs/core/models/index.js.map +1 -1
  25. package/dist/cjs/core/models/invoice.d.ts +42 -17
  26. package/dist/cjs/core/models/invoice.d.ts.map +1 -1
  27. package/dist/cjs/core/utils/date.d.ts +16 -0
  28. package/dist/cjs/core/utils/date.d.ts.map +1 -0
  29. package/dist/cjs/core/utils/date.js +27 -0
  30. package/dist/cjs/core/utils/date.js.map +1 -0
  31. package/dist/cjs/core/utils/index.d.ts +2 -0
  32. package/dist/cjs/core/utils/index.d.ts.map +1 -0
  33. package/dist/cjs/core/utils/index.js +18 -0
  34. package/dist/cjs/core/utils/index.js.map +1 -0
  35. package/dist/cjs/core/validation/index.d.ts +2 -0
  36. package/dist/cjs/core/validation/index.d.ts.map +1 -0
  37. package/dist/cjs/core/validation/index.js +18 -0
  38. package/dist/cjs/core/validation/index.js.map +1 -0
  39. package/dist/cjs/core/validation/validate.d.ts +18 -0
  40. package/dist/cjs/core/validation/validate.d.ts.map +1 -0
  41. package/dist/cjs/core/validation/validate.js +65 -0
  42. package/dist/cjs/core/validation/validate.js.map +1 -0
  43. package/dist/cjs/core/xml/generator.d.ts +117 -11
  44. package/dist/cjs/core/xml/generator.d.ts.map +1 -1
  45. package/dist/cjs/core/xml/generator.js +239 -64
  46. package/dist/cjs/core/xml/generator.js.map +1 -1
  47. package/dist/cjs/integration/accountability.d.ts +41 -0
  48. package/dist/cjs/integration/accountability.d.ts.map +1 -0
  49. package/dist/cjs/integration/accountability.js +92 -0
  50. package/dist/cjs/integration/accountability.js.map +1 -0
  51. package/dist/cjs/integration/index.d.ts +2 -0
  52. package/dist/cjs/integration/index.d.ts.map +1 -1
  53. package/dist/cjs/integration/index.js +2 -0
  54. package/dist/cjs/integration/index.js.map +1 -1
  55. package/dist/cjs/integration/p12.d.ts +58 -0
  56. package/dist/cjs/integration/p12.d.ts.map +1 -0
  57. package/dist/cjs/integration/p12.js +127 -0
  58. package/dist/cjs/integration/p12.js.map +1 -0
  59. package/dist/cjs/integration/repository.d.ts +4 -3
  60. package/dist/cjs/integration/repository.d.ts.map +1 -1
  61. package/dist/cjs/integration/service.d.ts +11 -2
  62. package/dist/cjs/integration/service.d.ts.map +1 -1
  63. package/dist/cjs/integration/service.js +115 -15
  64. package/dist/cjs/integration/service.js.map +1 -1
  65. package/dist/cjs/integration/tenant-credentials.d.ts +44 -0
  66. package/dist/cjs/integration/tenant-credentials.d.ts.map +1 -0
  67. package/dist/cjs/integration/tenant-credentials.js +62 -0
  68. package/dist/cjs/integration/tenant-credentials.js.map +1 -0
  69. package/dist/esm/aeat/client.d.ts +115 -14
  70. package/dist/esm/aeat/client.d.ts.map +1 -1
  71. package/dist/esm/aeat/client.js +218 -46
  72. package/dist/esm/aeat/client.js.map +1 -1
  73. package/dist/esm/aeat/index.d.ts +1 -0
  74. package/dist/esm/aeat/index.d.ts.map +1 -1
  75. package/dist/esm/aeat/index.js +1 -0
  76. package/dist/esm/aeat/index.js.map +1 -1
  77. package/dist/esm/aeat/response.d.ts +80 -0
  78. package/dist/esm/aeat/response.d.ts.map +1 -0
  79. package/dist/esm/aeat/response.js +115 -0
  80. package/dist/esm/aeat/response.js.map +1 -0
  81. package/dist/esm/core/hash/chain.d.ts +42 -0
  82. package/dist/esm/core/hash/chain.d.ts.map +1 -1
  83. package/dist/esm/core/hash/chain.js +37 -0
  84. package/dist/esm/core/hash/chain.js.map +1 -1
  85. package/dist/esm/core/index.d.ts +2 -0
  86. package/dist/esm/core/index.d.ts.map +1 -1
  87. package/dist/esm/core/index.js +2 -0
  88. package/dist/esm/core/index.js.map +1 -1
  89. package/dist/esm/core/models/index.d.ts +0 -1
  90. package/dist/esm/core/models/index.d.ts.map +1 -1
  91. package/dist/esm/core/models/index.js +0 -1
  92. package/dist/esm/core/models/index.js.map +1 -1
  93. package/dist/esm/core/models/invoice.d.ts +42 -17
  94. package/dist/esm/core/models/invoice.d.ts.map +1 -1
  95. package/dist/esm/core/utils/date.d.ts +16 -0
  96. package/dist/esm/core/utils/date.d.ts.map +1 -0
  97. package/dist/esm/core/utils/date.js +24 -0
  98. package/dist/esm/core/utils/date.js.map +1 -0
  99. package/dist/esm/core/utils/index.d.ts +2 -0
  100. package/dist/esm/core/utils/index.d.ts.map +1 -0
  101. package/dist/esm/core/utils/index.js +2 -0
  102. package/dist/esm/core/utils/index.js.map +1 -0
  103. package/dist/esm/core/validation/index.d.ts +2 -0
  104. package/dist/esm/core/validation/index.d.ts.map +1 -0
  105. package/dist/esm/core/validation/index.js +2 -0
  106. package/dist/esm/core/validation/index.js.map +1 -0
  107. package/dist/esm/core/validation/validate.d.ts +18 -0
  108. package/dist/esm/core/validation/validate.d.ts.map +1 -0
  109. package/dist/esm/core/validation/validate.js +62 -0
  110. package/dist/esm/core/validation/validate.js.map +1 -0
  111. package/dist/esm/core/xml/generator.d.ts +117 -11
  112. package/dist/esm/core/xml/generator.d.ts.map +1 -1
  113. package/dist/esm/core/xml/generator.js +233 -64
  114. package/dist/esm/core/xml/generator.js.map +1 -1
  115. package/dist/esm/integration/accountability.d.ts +41 -0
  116. package/dist/esm/integration/accountability.d.ts.map +1 -0
  117. package/dist/esm/integration/accountability.js +88 -0
  118. package/dist/esm/integration/accountability.js.map +1 -0
  119. package/dist/esm/integration/index.d.ts +2 -0
  120. package/dist/esm/integration/index.d.ts.map +1 -1
  121. package/dist/esm/integration/index.js +2 -0
  122. package/dist/esm/integration/index.js.map +1 -1
  123. package/dist/esm/integration/p12.d.ts +58 -0
  124. package/dist/esm/integration/p12.d.ts.map +1 -0
  125. package/dist/esm/integration/p12.js +119 -0
  126. package/dist/esm/integration/p12.js.map +1 -0
  127. package/dist/esm/integration/repository.d.ts +4 -3
  128. package/dist/esm/integration/repository.d.ts.map +1 -1
  129. package/dist/esm/integration/service.d.ts +11 -2
  130. package/dist/esm/integration/service.d.ts.map +1 -1
  131. package/dist/esm/integration/service.js +117 -17
  132. package/dist/esm/integration/service.js.map +1 -1
  133. package/dist/esm/integration/tenant-credentials.d.ts +44 -0
  134. package/dist/esm/integration/tenant-credentials.d.ts.map +1 -0
  135. package/dist/esm/integration/tenant-credentials.js +58 -0
  136. package/dist/esm/integration/tenant-credentials.js.map +1 -0
  137. package/package.json +3 -1
  138. package/readme.md +731 -38
  139. package/src/aeat/client.ts +298 -57
  140. package/src/aeat/index.ts +1 -0
  141. package/src/aeat/response.ts +198 -0
  142. package/src/core/hash/chain.ts +68 -0
  143. package/src/core/index.ts +2 -0
  144. package/src/core/models/index.ts +0 -1
  145. package/src/core/models/invoice.ts +40 -18
  146. package/src/core/utils/date.ts +27 -0
  147. package/src/core/utils/index.ts +1 -0
  148. package/src/core/validation/index.ts +1 -0
  149. package/src/core/validation/validate.ts +71 -0
  150. package/src/core/xml/generator.ts +312 -73
  151. package/src/integration/accountability.ts +125 -0
  152. package/src/integration/index.ts +2 -0
  153. package/src/integration/p12.ts +155 -0
  154. package/src/integration/repository.ts +4 -3
  155. package/src/integration/schema.sql +0 -14
  156. package/src/integration/service.ts +134 -16
  157. package/src/core/models/event.ts +0 -25
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccountabilityService = void 0;
4
+ const generator_js_1 = require("../core/xml/generator.js");
5
+ const chain_js_1 = require("../core/hash/chain.js");
6
+ const qr_js_1 = require("../core/qr/qr.js");
7
+ const date_js_1 = require("../core/utils/date.js");
8
+ const client_js_1 = require("../aeat/client.js");
9
+ const p12_js_1 = require("./p12.js");
10
+ /**
11
+ * Integración de accountability (contabilidad) para Verifactu.
12
+ *
13
+ * Une las credenciales del certificado (`.p12`) con el cliente mTLS y la
14
+ * persistencia, para registrar facturas de forma verificable ante la AEAT.
15
+ */
16
+ class AccountabilityService {
17
+ repository;
18
+ client;
19
+ nif;
20
+ constructor(repository, config) {
21
+ this.repository = repository;
22
+ let cert;
23
+ let key;
24
+ if (config.p12Buffer && config.p12Password) {
25
+ const content = (0, p12_js_1.readP12)(config.p12Buffer, config.p12Password);
26
+ cert = content.certificates[0];
27
+ key = content.keys[0];
28
+ }
29
+ else if (config.cert && config.key) {
30
+ cert = config.cert;
31
+ key = config.key;
32
+ }
33
+ if (!cert || !key) {
34
+ throw new Error('AccountabilityService requiere un .p12 (p12Buffer + p12Password) o cert/key PEM.');
35
+ }
36
+ this.nif = config.nif;
37
+ this.client = new client_js_1.VerifactuClient({ baseUrl: config.baseUrl, cert, key });
38
+ }
39
+ /**
40
+ * Registra una factura (alta) ante la AEAT, usando el certificado del
41
+ * emisor para autenticar el envío.
42
+ */
43
+ async registerInvoice(invoice) {
44
+ // El NIF del emisor se toma del certificado (o del config).
45
+ const invoiceConNif = {
46
+ ...invoice,
47
+ emisor: { ...invoice.emisor, nif: this.nif },
48
+ };
49
+ const last = await this.repository.getLastRecord();
50
+ const previousHash = last?.hash ?? null;
51
+ const xml = (0, generator_js_1.generateInvoiceXml)(invoiceConNif, previousHash);
52
+ const fechaHoraHusoGenRegistro = (0, date_js_1.nowIsoWithOffset)();
53
+ const hash = (0, chain_js_1.computeRegistroAlta)({
54
+ idEmisorFactura: this.nif,
55
+ numSerieFactura: `${invoice.id.serie ?? ''}${invoice.id.numero}`,
56
+ fechaExpedicionFactura: invoice.id.fechaExpedicion,
57
+ tipoFactura: invoice.tipoFactura,
58
+ cuotaTotal: invoice.desglose.cuotaTotal.toFixed(2),
59
+ importeTotal: invoice.desglose.importeTotal.toFixed(2),
60
+ huellaAnterior: previousHash,
61
+ fechaHoraHusoGenRegistro,
62
+ });
63
+ const now = new Date().toISOString();
64
+ const record = {
65
+ id: `${invoice.id.serie ?? ''}${invoice.id.numero}`,
66
+ invoiceId: `${invoice.id.serie ?? ''}${invoice.id.numero}`,
67
+ emisorNif: this.nif,
68
+ xml,
69
+ hash,
70
+ previousHash,
71
+ qrPayload: (0, qr_js_1.buildQrPayload)(hash),
72
+ status: 'PENDING',
73
+ createdAt: now,
74
+ updatedAt: now,
75
+ };
76
+ await this.repository.saveRecord(record);
77
+ const result = await this.client.sendRecord(xml);
78
+ await this.repository.saveResponse({
79
+ id: `${record.id}-${Date.now()}`,
80
+ recordId: record.id,
81
+ operationId: result.operationId,
82
+ status: result.status,
83
+ message: result.message,
84
+ receivedAt: new Date().toISOString(),
85
+ });
86
+ const status = result.status === 'OK' ? 'CONFIRMED' : 'REJECTED';
87
+ await this.repository.updateRecordStatus(record.id, status);
88
+ return { ...record, status };
89
+ }
90
+ }
91
+ exports.AccountabilityService = AccountabilityService;
92
+ //# sourceMappingURL=accountability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountability.js","sourceRoot":"","sources":["../../../src/integration/accountability.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
1
  export * from './repository.js';
2
2
  export * from './service.js';
3
+ export * from './p12.js';
4
+ export * from './accountability.js';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integration/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integration/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC"}
@@ -16,4 +16,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./repository.js"), exports);
18
18
  __exportStar(require("./service.js"), exports);
19
+ __exportStar(require("./p12.js"), exports);
20
+ __exportStar(require("./accountability.js"), exports);
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integration/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integration/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,+CAA6B;AAC7B,2CAAyB;AACzB,sDAAoC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Un campo (bag) del `.p12`.
3
+ */
4
+ export interface P12Bag {
5
+ /** Tipo del bag (certBag, keyBag, pkcs8ShroudedKeyBag, ...). */
6
+ type: string;
7
+ /** Contenido en formato PEM (si es un certificado o clave). */
8
+ pem?: string;
9
+ /** Valor en bruto (si no es PEM). */
10
+ value?: unknown;
11
+ }
12
+ /**
13
+ * Contenido completo de un `.p12`, con todos sus campos.
14
+ */
15
+ export interface P12Content {
16
+ /** Todos los bags encontrados, en orden. */
17
+ bags: P12Bag[];
18
+ /** Certificados en PEM (conveniencia). */
19
+ certificates: string[];
20
+ /** Claves privadas en PEM (conveniencia). */
21
+ keys: string[];
22
+ }
23
+ /**
24
+ * Lee un certificado `.p12`/`.pfx` e itera todos sus campos (bags),
25
+ * devolviéndolos todos. La librería no interpreta qué campo es cada cosa:
26
+ * simplemente expone el contenido para que la aplicación lo use.
27
+ *
28
+ * @param buffer Contenido del archivo `.p12`/`.pfx`.
29
+ * @param password Contraseña del `.p12`.
30
+ */
31
+ export declare function readP12(buffer: Buffer, password: string): P12Content;
32
+ /**
33
+ * Extrae el NIF de un certificado en PEM.
34
+ *
35
+ * El NIF suele aparecer en el `serialNumber` (p. ej. `IDCES-74654958V`) o como
36
+ * primer token del `commonName` (p. ej. `74654958V ANTONIO JOSE RECHE`).
37
+ * Devuelve `null` si no se puede determinar.
38
+ */
39
+ export declare function extractNifFromCertificate(pem: string): string | null;
40
+ /**
41
+ * Información de un certificado en PEM: NIF y nombre/razón del titular.
42
+ */
43
+ export interface CertificateInfo {
44
+ /** NIF del titular del certificado. */
45
+ nif: string;
46
+ /** Nombre o razón social del titular. */
47
+ nombreRazon: string;
48
+ }
49
+ /**
50
+ * Extrae el NIF y el nombre/razón del titular de un certificado en PEM.
51
+ *
52
+ * El NIF se obtiene del `serialNumber` (p. ej. `IDCES-74654958V`) o del primer
53
+ * token del `commonName`. El nombre se compone de `givenName` + `surname`, o
54
+ * del `commonName` sin el prefijo de NIF. Devuelve `null` si no se puede
55
+ * determinar el NIF.
56
+ */
57
+ export declare function extractCertificateInfo(pem: string): CertificateInfo | null;
58
+ //# sourceMappingURL=p12.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"p12.d.ts","sourceRoot":"","sources":["../../../src/integration/p12.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,0CAA0C;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CA6BpE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuBpE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAuC1E"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readP12 = readP12;
7
+ exports.extractNifFromCertificate = extractNifFromCertificate;
8
+ exports.extractCertificateInfo = extractCertificateInfo;
9
+ const node_forge_1 = __importDefault(require("node-forge"));
10
+ /**
11
+ * Lee un certificado `.p12`/`.pfx` e itera todos sus campos (bags),
12
+ * devolviéndolos todos. La librería no interpreta qué campo es cada cosa:
13
+ * simplemente expone el contenido para que la aplicación lo use.
14
+ *
15
+ * @param buffer Contenido del archivo `.p12`/`.pfx`.
16
+ * @param password Contraseña del `.p12`.
17
+ */
18
+ function readP12(buffer, password) {
19
+ const asn1 = node_forge_1.default.asn1.fromDer(node_forge_1.default.util.createBuffer(new Uint8Array(buffer)));
20
+ const p12 = node_forge_1.default.pkcs12.pkcs12FromAsn1(asn1, password);
21
+ const bags = [];
22
+ const certificates = [];
23
+ const keys = [];
24
+ p12.safeContents.forEach((safe) => {
25
+ safe.safeBags.forEach((bag) => {
26
+ const type = bag.type ?? 'unknown';
27
+ let pem;
28
+ let value;
29
+ if (bag.cert) {
30
+ pem = node_forge_1.default.pki.certificateToPem(bag.cert);
31
+ certificates.push(pem);
32
+ }
33
+ else if (bag.key) {
34
+ pem = node_forge_1.default.pki.privateKeyToPem(bag.key);
35
+ keys.push(pem);
36
+ }
37
+ else {
38
+ value = bag.attributes;
39
+ }
40
+ bags.push({ type, pem, value });
41
+ });
42
+ });
43
+ return { bags, certificates, keys };
44
+ }
45
+ /**
46
+ * Extrae el NIF de un certificado en PEM.
47
+ *
48
+ * El NIF suele aparecer en el `serialNumber` (p. ej. `IDCES-74654958V`) o como
49
+ * primer token del `commonName` (p. ej. `74654958V ANTONIO JOSE RECHE`).
50
+ * Devuelve `null` si no se puede determinar.
51
+ */
52
+ function extractNifFromCertificate(pem) {
53
+ try {
54
+ const cert = node_forge_1.default.pki.certificateFromPem(pem);
55
+ const attrs = cert.subject.attributes;
56
+ // serialNumber: "IDCES-74654958V" o directamente "B12345678"
57
+ const serial = attrs.find((a) => a.name === 'serialNumber')?.value;
58
+ if (serial) {
59
+ const m = String(serial).match(/IDCES-(\S+)/i) ?? String(serial).match(/^([A-Z0-9]{8,9})/i);
60
+ if (m && m[1])
61
+ return m[1];
62
+ }
63
+ // commonName: "74654958V ANTONIO JOSE RECHE (R: B18579458)"
64
+ const cn = attrs.find((a) => a.name === 'commonName')?.value;
65
+ if (cn) {
66
+ const m = String(cn).match(/^([A-Z0-9]{8,9})/i);
67
+ if (m && m[1])
68
+ return m[1];
69
+ }
70
+ return null;
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ /**
77
+ * Extrae el NIF y el nombre/razón del titular de un certificado en PEM.
78
+ *
79
+ * El NIF se obtiene del `serialNumber` (p. ej. `IDCES-74654958V`) o del primer
80
+ * token del `commonName`. El nombre se compone de `givenName` + `surname`, o
81
+ * del `commonName` sin el prefijo de NIF. Devuelve `null` si no se puede
82
+ * determinar el NIF.
83
+ */
84
+ function extractCertificateInfo(pem) {
85
+ try {
86
+ const cert = node_forge_1.default.pki.certificateFromPem(pem);
87
+ const attrs = cert.subject.attributes;
88
+ // NIF
89
+ const serial = attrs.find((a) => a.name === 'serialNumber')?.value;
90
+ let nif = null;
91
+ if (serial) {
92
+ const m = String(serial).match(/IDCES-(\S+)/i) ?? String(serial).match(/^([A-Z0-9]{8,9})/i);
93
+ if (m && m[1])
94
+ nif = m[1];
95
+ }
96
+ if (!nif) {
97
+ const cn = attrs.find((a) => a.name === 'commonName')?.value;
98
+ if (cn) {
99
+ const m = String(cn).match(/^([A-Z0-9]{8,9})/i);
100
+ if (m && m[1])
101
+ nif = m[1];
102
+ }
103
+ }
104
+ if (!nif)
105
+ return null;
106
+ // Nombre: givenName + surname, o commonName sin el NIF.
107
+ const given = attrs.find((a) => a.name === 'givenName')?.value;
108
+ const surname = attrs.find((a) => a.name === 'surname')?.value;
109
+ let nombreRazon = '';
110
+ if (given)
111
+ nombreRazon += given;
112
+ if (surname)
113
+ nombreRazon += (nombreRazon ? ' ' : '') + surname;
114
+ nombreRazon = nombreRazon.trim();
115
+ if (!nombreRazon) {
116
+ const cn = attrs.find((a) => a.name === 'commonName')?.value;
117
+ if (cn) {
118
+ nombreRazon = String(cn).replace(/^[A-Z0-9]{8,9}\s*/, '').split(' (R:')[0]?.trim() ?? '';
119
+ }
120
+ }
121
+ return { nif, nombreRazon };
122
+ }
123
+ catch {
124
+ return null;
125
+ }
126
+ }
127
+ //# sourceMappingURL=p12.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"p12.js","sourceRoot":"","sources":["../../../src/integration/p12.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
  */
@@ -11,6 +10,8 @@ export interface StoredRecord {
11
10
  id: string;
12
11
  /** Referencia a la factura (serie + número). */
13
12
  invoiceId: string;
13
+ /** NIF del emisor de la factura. */
14
+ emisorNif: string;
14
15
  /** XML Verifactu generado. */
15
16
  xml: string;
16
17
  /** Hash del propio registro (huella). */
@@ -19,6 +20,8 @@ export interface StoredRecord {
19
20
  previousHash: string | null;
20
21
  /** Payload del QR Verifactu (URL de verificación con el hash). */
21
22
  qrPayload?: string;
23
+ /** `true` si la huella devuelta por AEAT coincide con la calculada. */
24
+ hashVerified?: boolean;
22
25
  /** Estado del registro. */
23
26
  status: RecordStatus;
24
27
  /** Fecha/hora de creación. */
@@ -71,7 +74,5 @@ export interface VerifactuRepository {
71
74
  saveResponse(response: StoredResponse): Promise<void>;
72
75
  /** Obtiene las respuestas de un registro. */
73
76
  getResponses(recordId: string): Promise<StoredResponse[]>;
74
- /** Guarda un evento. */
75
- saveEvent(event: Event): Promise<void>;
76
77
  }
77
78
  //# sourceMappingURL=repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/integration/repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD;;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,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,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;IAC1D,wBAAwB;IACxB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC"}
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,4 +1,5 @@
1
1
  import type { Invoice } from '../core/models/invoice.js';
2
+ import { type EventoInput } from '../core/xml/generator.js';
2
3
  import type { VerifactuClient } from '../aeat/client.js';
3
4
  import type { VerifactuRepository, StoredRecord } from './repository.js';
4
5
  /**
@@ -11,7 +12,8 @@ import type { VerifactuRepository, StoredRecord } from './repository.js';
11
12
  export declare class VerifactuService {
12
13
  private readonly repository;
13
14
  private readonly client;
14
- constructor(repository: VerifactuRepository, client: VerifactuClient);
15
+ private readonly certificatePem?;
16
+ constructor(repository: VerifactuRepository, client: VerifactuClient, certificatePem?: string | undefined);
15
17
  /**
16
18
  * Registra una factura: genera el XML, calcula el hash encadenado, guarda
17
19
  * el registro y lo envía a AEAT, persistiendo la respuesta.
@@ -23,7 +25,7 @@ export declare class VerifactuService {
23
25
  * Genera un registro de anulación que referencia la factura anulada,
24
26
  * lo envía a AEAT y marca la factura original como ANNULLED.
25
27
  */
26
- annulInvoice(invoiceId: string): Promise<StoredRecord>;
28
+ annulInvoice(invoiceId: string, invoice?: Invoice): Promise<StoredRecord>;
27
29
  /**
28
30
  * Modifica una factura previamente registrada.
29
31
  *
@@ -32,5 +34,12 @@ export declare class VerifactuService {
32
34
  * envía la referencia a la factura original y la factura corregida.
33
35
  */
34
36
  modifyInvoice(invoiceId: string, correctedInvoice: Invoice): Promise<StoredRecord>;
37
+ /**
38
+ * Registra un evento (RegistroEvento) ante AEAT.
39
+ *
40
+ * Genera el XML del evento, calcula su huella encadenada con el último
41
+ * registro, persiste el evento y lo envía a AEAT.
42
+ */
43
+ registerEvent(evento: EventoInput): Promise<StoredRecord>;
35
44
  }
36
45
  //# sourceMappingURL=service.d.ts.map
@@ -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;AAIzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEzE;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,UAAU,EAAE,mBAAmB,EAC/B,MAAM,EAAE,eAAe;IAG1C;;;OAGG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAmD9D;;;;;OAKG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA8D5D;;;;;;OAMG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;CAOzF"}
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"}
@@ -4,6 +4,14 @@ exports.VerifactuService = void 0;
4
4
  const generator_js_1 = require("../core/xml/generator.js");
5
5
  const chain_js_1 = require("../core/hash/chain.js");
6
6
  const qr_js_1 = require("../core/qr/qr.js");
7
+ const date_js_1 = require("../core/utils/date.js");
8
+ const validate_js_1 = require("../core/validation/validate.js");
9
+ const p12_js_1 = require("./p12.js");
10
+ /** Convierte `YYYY-MM-DD` a `DD-MM-YYYY` (formato XSD `fecha` de AEAT). */
11
+ function toDdMmYyyy(iso) {
12
+ const [y, m, d] = iso.split('-');
13
+ return `${d}-${m}-${y}`;
14
+ }
7
15
  /**
8
16
  * Servicio de orquestación de Verifactu.
9
17
  *
@@ -14,20 +22,30 @@ const qr_js_1 = require("../core/qr/qr.js");
14
22
  class VerifactuService {
15
23
  repository;
16
24
  client;
17
- constructor(repository, client) {
25
+ certificatePem;
26
+ constructor(repository, client, certificatePem) {
18
27
  this.repository = repository;
19
28
  this.client = client;
29
+ this.certificatePem = certificatePem;
20
30
  }
21
31
  /**
22
32
  * Registra una factura: genera el XML, calcula el hash encadenado, guarda
23
33
  * el registro y lo envía a AEAT, persistiendo la respuesta.
24
34
  */
25
35
  async registerInvoice(invoice) {
36
+ // 0. Validar la factura antes de generar el XML.
37
+ const validation = (0, validate_js_1.validateInvoice)(invoice);
38
+ if (!validation.valid) {
39
+ throw new Error(`Factura inválida: ${validation.errors.join('; ')}`);
40
+ }
26
41
  // 1. Obtener el hash del último registro para encadenar.
27
42
  const last = await this.repository.getLastRecord();
28
43
  const previousHash = last?.hash ?? null;
29
44
  // 2. Generar XML y calcular la huella (hash) del registro.
30
- const xml = (0, generator_js_1.generateInvoiceXml)(invoice, previousHash);
45
+ const registroAltaXml = (0, generator_js_1.generateInvoiceXml)(invoice, previousHash);
46
+ const cabecera = (0, generator_js_1.buildCabecera)({ nombreRazon: invoice.emisor.nombreRazon, nif: invoice.emisor.nif }, this.certificatePem, p12_js_1.extractCertificateInfo);
47
+ const xml = (0, generator_js_1.generateSuministroXml)(registroAltaXml, cabecera);
48
+ const fechaHoraHusoGenRegistro = (0, date_js_1.nowIsoWithOffset)();
31
49
  const hash = (0, chain_js_1.computeRegistroAlta)({
32
50
  idEmisorFactura: invoice.emisor.nif,
33
51
  numSerieFactura: `${invoice.id.serie ?? ''}${invoice.id.numero}`,
@@ -36,13 +54,14 @@ class VerifactuService {
36
54
  cuotaTotal: invoice.desglose.cuotaTotal.toFixed(2),
37
55
  importeTotal: invoice.desglose.importeTotal.toFixed(2),
38
56
  huellaAnterior: previousHash,
39
- fechaHoraHusoGenRegistro: new Date().toISOString(),
57
+ fechaHoraHusoGenRegistro,
40
58
  });
41
59
  // 3. Persistir el registro como PENDING.
42
60
  const now = new Date().toISOString();
43
61
  const record = {
44
62
  id: `${invoice.id.serie ?? ''}${invoice.id.numero}`,
45
63
  invoiceId: `${invoice.id.serie ?? ''}${invoice.id.numero}`,
64
+ emisorNif: invoice.emisor.nif,
46
65
  xml,
47
66
  hash,
48
67
  previousHash,
@@ -62,10 +81,24 @@ class VerifactuService {
62
81
  message: result.message,
63
82
  receivedAt: new Date().toISOString(),
64
83
  });
65
- // 5. Actualizar el estado del registro según la respuesta.
84
+ // 5. Verificar la huella devuelta por AEAT (integridad del registro).
85
+ const aeatHash = result.registro?.huella;
86
+ const hashVerified = result.status === 'OK' && aeatHash !== undefined
87
+ ? (0, chain_js_1.verifyRegistroAlta)({
88
+ idEmisorFactura: invoice.emisor.nif,
89
+ numSerieFactura: `${invoice.id.serie ?? ''}${invoice.id.numero}`,
90
+ fechaExpedicionFactura: invoice.id.fechaExpedicion,
91
+ tipoFactura: invoice.tipoFactura,
92
+ cuotaTotal: invoice.desglose.cuotaTotal.toFixed(2),
93
+ importeTotal: invoice.desglose.importeTotal.toFixed(2),
94
+ huellaAnterior: previousHash,
95
+ fechaHoraHusoGenRegistro,
96
+ }, aeatHash)
97
+ : undefined;
98
+ // 6. Actualizar el estado del registro según la respuesta.
66
99
  const status = result.status === 'OK' ? 'CONFIRMED' : 'REJECTED';
67
100
  await this.repository.updateRecordStatus(record.id, status);
68
- return { ...record, status };
101
+ return { ...record, status, hashVerified };
69
102
  }
70
103
  /**
71
104
  * Anula una factura previamente registrada.
@@ -73,7 +106,7 @@ class VerifactuService {
73
106
  * Genera un registro de anulación que referencia la factura anulada,
74
107
  * lo envía a AEAT y marca la factura original como ANNULLED.
75
108
  */
76
- async annulInvoice(invoiceId) {
109
+ async annulInvoice(invoiceId, invoice) {
77
110
  // 1. Obtener la factura original (para su huella) y el último registro.
78
111
  const original = await this.repository.getRecord(invoiceId);
79
112
  if (!original) {
@@ -81,25 +114,39 @@ class VerifactuService {
81
114
  }
82
115
  const last = await this.repository.getLastRecord();
83
116
  const previousHash = last?.hash ?? null;
117
+ const fechaHoraHusoGenRegistro = (0, date_js_1.nowIsoWithOffset)();
118
+ const fechaExpedicionFacturaAnulada = toDdMmYyyy(invoice?.id.fechaExpedicion ?? new Date().toISOString().slice(0, 10));
119
+ const sistemaInformatico = invoice?.sistemaInformatico ?? {
120
+ nombreRazon: 'Sistema',
121
+ nif: original.emisorNif,
122
+ nombreSistemaInformatico: 'SIF',
123
+ idSistemaInformatico: '01',
124
+ version: '1.0',
125
+ numeroInstalacion: '1',
126
+ };
84
127
  // 2. Generar XML de anulación y calcular la huella.
85
- const xml = (0, generator_js_1.generateAnulacionXml)({
86
- idEmisorFacturaAnulada: original.invoiceId,
87
- numSerieFacturaAnulada: original.invoiceId,
88
- fechaExpedicionFacturaAnulada: new Date().toISOString().slice(0, 10),
89
- huellaFacturaAnulada: original.hash,
90
- }, previousHash);
91
128
  const hash = (0, chain_js_1.computeRegistroAnulacion)({
92
- idEmisorFacturaAnulada: original.invoiceId,
129
+ idEmisorFacturaAnulada: original.emisorNif,
93
130
  numSerieFacturaAnulada: original.invoiceId,
94
- fechaExpedicionFacturaAnulada: new Date().toISOString().slice(0, 10),
131
+ fechaExpedicionFacturaAnulada,
95
132
  huellaAnterior: previousHash,
96
- fechaHoraHusoGenRegistro: new Date().toISOString(),
133
+ fechaHoraHusoGenRegistro,
97
134
  });
135
+ const xml = (0, generator_js_1.generateAnulacionXml)({
136
+ idEmisorFacturaAnulada: original.emisorNif,
137
+ numSerieFacturaAnulada: original.invoiceId,
138
+ fechaExpedicionFacturaAnulada,
139
+ huellaFacturaAnulada: original.hash,
140
+ sistemaInformatico,
141
+ fechaHoraHusoGenRegistro,
142
+ huella: hash,
143
+ }, previousHash);
98
144
  // 3. Persistir el registro de anulación como PENDING.
99
145
  const now = new Date().toISOString();
100
146
  const record = {
101
147
  id: `${invoiceId}-ANUL`,
102
148
  invoiceId,
149
+ emisorNif: original.emisorNif,
103
150
  xml,
104
151
  hash,
105
152
  previousHash,
@@ -139,6 +186,59 @@ class VerifactuService {
139
186
  // 2. Emitir la factura corregida como un nuevo alta.
140
187
  return this.registerInvoice(correctedInvoice);
141
188
  }
189
+ /**
190
+ * Registra un evento (RegistroEvento) ante AEAT.
191
+ *
192
+ * Genera el XML del evento, calcula su huella encadenada con el último
193
+ * registro, persiste el evento y lo envía a AEAT.
194
+ */
195
+ async registerEvent(evento) {
196
+ // 1. Obtener el hash del último registro para encadenar.
197
+ const last = await this.repository.getLastRecord();
198
+ const previousHash = last?.hash ?? null;
199
+ // 2. Generar XML y calcular la huella del evento.
200
+ const si = evento.sistemaInformatico;
201
+ const hash = (0, chain_js_1.computeRegistroEvento)({
202
+ nifSistemaInformatico: si.nif,
203
+ id: '',
204
+ idSistemaInformatico: si.idSistemaInformatico,
205
+ version: si.version,
206
+ numeroInstalacion: si.numeroInstalacion,
207
+ nifObligado: evento.obligadoEmision.nif,
208
+ tipoEvento: evento.tipoEvento,
209
+ huellaAnterior: previousHash,
210
+ fechaHoraHusoGenEvento: evento.fechaHoraHusoGenEvento,
211
+ });
212
+ const xml = (0, generator_js_1.generateEventoXml)({ ...evento, huellaEvento: hash });
213
+ // 3. Persistir el evento.
214
+ const now = new Date().toISOString();
215
+ const record = {
216
+ id: `EV-${evento.tipoEvento}-${Date.now()}`,
217
+ invoiceId: evento.obligadoEmision.nif,
218
+ emisorNif: evento.obligadoEmision.nif,
219
+ xml,
220
+ hash,
221
+ previousHash,
222
+ status: 'PENDING',
223
+ createdAt: now,
224
+ updatedAt: now,
225
+ };
226
+ await this.repository.saveRecord(record);
227
+ // 4. Enviar a AEAT y persistir la respuesta.
228
+ const result = await this.client.sendRecord(xml);
229
+ await this.repository.saveResponse({
230
+ id: `${record.id}-${Date.now()}`,
231
+ recordId: record.id,
232
+ operationId: result.operationId,
233
+ status: result.status,
234
+ message: result.message,
235
+ receivedAt: new Date().toISOString(),
236
+ });
237
+ // 5. Actualizar el estado.
238
+ const status = result.status === 'OK' ? 'CONFIRMED' : 'REJECTED';
239
+ await this.repository.updateRecordStatus(record.id, status);
240
+ return { ...record, status };
241
+ }
142
242
  }
143
243
  exports.VerifactuService = VerifactuService;
144
244
  //# sourceMappingURL=service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/integration/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/integration/service.ts"],"names":[],"mappings":"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"}