@dwast/verifactu-lib 0.1.0-beta.0 → 0.1.0-beta.1

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 (160) hide show
  1. package/dist/cjs/aeat/client.d.ts.map +1 -0
  2. package/dist/cjs/aeat/client.js +91 -0
  3. package/dist/cjs/aeat/client.js.map +1 -0
  4. package/dist/cjs/aeat/index.d.ts.map +1 -0
  5. package/dist/cjs/aeat/index.js +18 -0
  6. package/dist/cjs/aeat/index.js.map +1 -0
  7. package/dist/cjs/core/hash/chain.d.ts.map +1 -0
  8. package/dist/cjs/core/hash/chain.js +127 -0
  9. package/dist/cjs/core/hash/chain.js.map +1 -0
  10. package/dist/cjs/core/hash/index.d.ts.map +1 -0
  11. package/dist/cjs/core/hash/index.js +18 -0
  12. package/dist/cjs/core/hash/index.js.map +1 -0
  13. package/dist/cjs/core/index.d.ts.map +1 -0
  14. package/dist/cjs/core/index.js +21 -0
  15. package/dist/cjs/core/index.js.map +1 -0
  16. package/dist/cjs/core/models/event.d.ts.map +1 -0
  17. package/dist/cjs/core/models/event.js +3 -0
  18. package/dist/{core → cjs/core}/models/event.js.map +1 -1
  19. package/dist/cjs/core/models/index.d.ts.map +1 -0
  20. package/dist/cjs/core/models/index.js +19 -0
  21. package/dist/cjs/core/models/index.js.map +1 -0
  22. package/dist/cjs/core/models/invoice.d.ts.map +1 -0
  23. package/dist/cjs/core/models/invoice.js +3 -0
  24. package/dist/{core → cjs/core}/models/invoice.js.map +1 -1
  25. package/dist/cjs/core/qr/index.d.ts.map +1 -0
  26. package/dist/cjs/core/qr/index.js +18 -0
  27. package/dist/cjs/core/qr/index.js.map +1 -0
  28. package/dist/cjs/core/qr/qr.d.ts.map +1 -0
  29. package/dist/cjs/core/qr/qr.js +19 -0
  30. package/dist/cjs/core/qr/qr.js.map +1 -0
  31. package/dist/cjs/core/xml/generator.d.ts.map +1 -0
  32. package/dist/cjs/core/xml/generator.js +107 -0
  33. package/dist/cjs/core/xml/generator.js.map +1 -0
  34. package/dist/cjs/core/xml/index.d.ts.map +1 -0
  35. package/dist/cjs/core/xml/index.js +18 -0
  36. package/dist/cjs/core/xml/index.js.map +1 -0
  37. package/dist/cjs/index.d.ts.map +1 -0
  38. package/dist/cjs/index.js +20 -0
  39. package/dist/cjs/index.js.map +1 -0
  40. package/dist/cjs/integration/index.d.ts.map +1 -0
  41. package/dist/cjs/integration/index.js +19 -0
  42. package/dist/cjs/integration/index.js.map +1 -0
  43. package/dist/cjs/integration/repository.d.ts.map +1 -0
  44. package/dist/cjs/integration/repository.js +3 -0
  45. package/dist/cjs/integration/repository.js.map +1 -0
  46. package/dist/cjs/integration/service.d.ts.map +1 -0
  47. package/dist/cjs/integration/service.js +144 -0
  48. package/dist/cjs/integration/service.js.map +1 -0
  49. package/dist/cjs/package.json +3 -0
  50. package/dist/esm/aeat/client.d.ts +57 -0
  51. package/dist/esm/aeat/client.d.ts.map +1 -0
  52. package/dist/esm/aeat/client.js.map +1 -0
  53. package/dist/esm/aeat/index.d.ts +2 -0
  54. package/dist/esm/aeat/index.d.ts.map +1 -0
  55. package/dist/esm/aeat/index.js.map +1 -0
  56. package/dist/esm/core/hash/chain.d.ts +97 -0
  57. package/dist/esm/core/hash/chain.d.ts.map +1 -0
  58. package/dist/esm/core/hash/chain.js.map +1 -0
  59. package/dist/esm/core/hash/index.d.ts +2 -0
  60. package/dist/esm/core/hash/index.d.ts.map +1 -0
  61. package/dist/esm/core/hash/index.js.map +1 -0
  62. package/dist/esm/core/index.d.ts +5 -0
  63. package/dist/esm/core/index.d.ts.map +1 -0
  64. package/dist/esm/core/index.js.map +1 -0
  65. package/dist/esm/core/models/event.d.ts +25 -0
  66. package/dist/esm/core/models/event.d.ts.map +1 -0
  67. package/dist/esm/core/models/event.js.map +1 -0
  68. package/dist/esm/core/models/index.d.ts +3 -0
  69. package/dist/esm/core/models/index.d.ts.map +1 -0
  70. package/dist/esm/core/models/index.js.map +1 -0
  71. package/dist/esm/core/models/invoice.d.ts +90 -0
  72. package/dist/esm/core/models/invoice.d.ts.map +1 -0
  73. package/dist/esm/core/models/invoice.js.map +1 -0
  74. package/dist/esm/core/qr/index.d.ts +2 -0
  75. package/dist/esm/core/qr/index.d.ts.map +1 -0
  76. package/dist/esm/core/qr/index.js.map +1 -0
  77. package/dist/esm/core/qr/qr.d.ts +13 -0
  78. package/dist/esm/core/qr/qr.d.ts.map +1 -0
  79. package/dist/esm/core/qr/qr.js.map +1 -0
  80. package/dist/esm/core/xml/generator.d.ts +32 -0
  81. package/dist/esm/core/xml/generator.d.ts.map +1 -0
  82. package/dist/esm/core/xml/generator.js.map +1 -0
  83. package/dist/esm/core/xml/index.d.ts +2 -0
  84. package/dist/esm/core/xml/index.d.ts.map +1 -0
  85. package/dist/esm/core/xml/index.js.map +1 -0
  86. package/dist/esm/index.d.ts +4 -0
  87. package/dist/esm/index.d.ts.map +1 -0
  88. package/dist/esm/index.js.map +1 -0
  89. package/dist/esm/integration/index.d.ts +3 -0
  90. package/dist/esm/integration/index.d.ts.map +1 -0
  91. package/dist/esm/integration/index.js.map +1 -0
  92. package/dist/esm/integration/repository.d.ts +77 -0
  93. package/dist/esm/integration/repository.d.ts.map +1 -0
  94. package/dist/esm/integration/repository.js.map +1 -0
  95. package/dist/esm/integration/service.d.ts +36 -0
  96. package/dist/esm/integration/service.d.ts.map +1 -0
  97. package/dist/esm/integration/service.js.map +1 -0
  98. package/package.json +43 -13
  99. package/dist/aeat/client.d.ts.map +0 -1
  100. package/dist/aeat/client.js.map +0 -1
  101. package/dist/aeat/index.d.ts.map +0 -1
  102. package/dist/aeat/index.js.map +0 -1
  103. package/dist/core/hash/chain.d.ts.map +0 -1
  104. package/dist/core/hash/chain.js.map +0 -1
  105. package/dist/core/hash/index.d.ts.map +0 -1
  106. package/dist/core/hash/index.js.map +0 -1
  107. package/dist/core/index.d.ts.map +0 -1
  108. package/dist/core/index.js.map +0 -1
  109. package/dist/core/models/event.d.ts.map +0 -1
  110. package/dist/core/models/index.d.ts.map +0 -1
  111. package/dist/core/models/index.js.map +0 -1
  112. package/dist/core/models/invoice.d.ts.map +0 -1
  113. package/dist/core/qr/index.d.ts.map +0 -1
  114. package/dist/core/qr/index.js.map +0 -1
  115. package/dist/core/qr/qr.d.ts.map +0 -1
  116. package/dist/core/qr/qr.js.map +0 -1
  117. package/dist/core/xml/generator.d.ts.map +0 -1
  118. package/dist/core/xml/generator.js.map +0 -1
  119. package/dist/core/xml/index.d.ts.map +0 -1
  120. package/dist/core/xml/index.js.map +0 -1
  121. package/dist/index.d.ts.map +0 -1
  122. package/dist/index.js.map +0 -1
  123. package/dist/integration/index.d.ts.map +0 -1
  124. package/dist/integration/index.js.map +0 -1
  125. package/dist/integration/repository.d.ts.map +0 -1
  126. package/dist/integration/repository.js.map +0 -1
  127. package/dist/integration/service.d.ts.map +0 -1
  128. package/dist/integration/service.js.map +0 -1
  129. /package/dist/{aeat → cjs/aeat}/client.d.ts +0 -0
  130. /package/dist/{aeat → cjs/aeat}/index.d.ts +0 -0
  131. /package/dist/{core → cjs/core}/hash/chain.d.ts +0 -0
  132. /package/dist/{core → cjs/core}/hash/index.d.ts +0 -0
  133. /package/dist/{core → cjs/core}/index.d.ts +0 -0
  134. /package/dist/{core → cjs/core}/models/event.d.ts +0 -0
  135. /package/dist/{core → cjs/core}/models/index.d.ts +0 -0
  136. /package/dist/{core → cjs/core}/models/invoice.d.ts +0 -0
  137. /package/dist/{core → cjs/core}/qr/index.d.ts +0 -0
  138. /package/dist/{core → cjs/core}/qr/qr.d.ts +0 -0
  139. /package/dist/{core → cjs/core}/xml/generator.d.ts +0 -0
  140. /package/dist/{core → cjs/core}/xml/index.d.ts +0 -0
  141. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  142. /package/dist/{integration → cjs/integration}/index.d.ts +0 -0
  143. /package/dist/{integration → cjs/integration}/repository.d.ts +0 -0
  144. /package/dist/{integration → cjs/integration}/service.d.ts +0 -0
  145. /package/dist/{aeat → esm/aeat}/client.js +0 -0
  146. /package/dist/{aeat → esm/aeat}/index.js +0 -0
  147. /package/dist/{core → esm/core}/hash/chain.js +0 -0
  148. /package/dist/{core → esm/core}/hash/index.js +0 -0
  149. /package/dist/{core → esm/core}/index.js +0 -0
  150. /package/dist/{core → esm/core}/models/event.js +0 -0
  151. /package/dist/{core → esm/core}/models/index.js +0 -0
  152. /package/dist/{core → esm/core}/models/invoice.js +0 -0
  153. /package/dist/{core → esm/core}/qr/index.js +0 -0
  154. /package/dist/{core → esm/core}/qr/qr.js +0 -0
  155. /package/dist/{core → esm/core}/xml/generator.js +0 -0
  156. /package/dist/{core → esm/core}/xml/index.js +0 -0
  157. /package/dist/{index.js → esm/index.js} +0 -0
  158. /package/dist/{integration → esm/integration}/index.js +0 -0
  159. /package/dist/{integration → esm/integration}/repository.js +0 -0
  160. /package/dist/{integration → esm/integration}/service.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/aeat/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAUD;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,EAAE,qBAAqB;IASzC;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BlD;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBlE;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU;CAqBrE"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VerifactuClient = void 0;
4
+ /**
5
+ * Cliente de servicios AEAT para Verifactu.
6
+ */
7
+ class VerifactuClient {
8
+ config;
9
+ constructor(config) {
10
+ this.config = {
11
+ sendPath: '/verifactu/registro',
12
+ statusPath: '/verifactu/estado',
13
+ timeoutMs: 10_000,
14
+ ...config,
15
+ };
16
+ }
17
+ /**
18
+ * Envía un registro (factura o evento) a AEAT.
19
+ */
20
+ async sendRecord(xml) {
21
+ const url = `${this.config.baseUrl}${this.config.sendPath}`;
22
+ const headers = {
23
+ 'Content-Type': 'application/xml',
24
+ Accept: 'application/json',
25
+ };
26
+ if (this.config.authToken) {
27
+ headers.Authorization = `Bearer ${this.config.authToken}`;
28
+ }
29
+ const controller = new AbortController();
30
+ const timer = setTimeout(() => controller.abort(), this.config.timeoutMs);
31
+ try {
32
+ const res = await fetch(url, {
33
+ method: 'POST',
34
+ headers,
35
+ body: xml,
36
+ signal: controller.signal,
37
+ });
38
+ const raw = await res.text();
39
+ return this.parseResponse(raw, res.status);
40
+ }
41
+ finally {
42
+ clearTimeout(timer);
43
+ }
44
+ }
45
+ /**
46
+ * Consulta el estado de una operación enviada.
47
+ */
48
+ async getOperationStatus(operationId) {
49
+ const url = `${this.config.baseUrl}${this.config.statusPath}/${encodeURIComponent(operationId)}`;
50
+ const headers = { Accept: 'application/json' };
51
+ if (this.config.authToken) {
52
+ headers.Authorization = `Bearer ${this.config.authToken}`;
53
+ }
54
+ const controller = new AbortController();
55
+ const timer = setTimeout(() => controller.abort(), this.config.timeoutMs);
56
+ try {
57
+ const res = await fetch(url, { method: 'GET', headers, signal: controller.signal });
58
+ const raw = await res.text();
59
+ return this.parseResponse(raw, res.status);
60
+ }
61
+ finally {
62
+ clearTimeout(timer);
63
+ }
64
+ }
65
+ /**
66
+ * Parsea la respuesta de AEAT. La estructura exacta depende del servicio;
67
+ * este es un mapeo base que el consumidor puede sobrescribir.
68
+ */
69
+ parseResponse(raw, httpStatus) {
70
+ let operationId = '';
71
+ let status = httpStatus >= 200 && httpStatus < 300 ? 'OK' : 'ERROR';
72
+ let message;
73
+ let errorCode;
74
+ try {
75
+ const json = JSON.parse(raw);
76
+ operationId = String(json.operationId ?? json.id ?? '');
77
+ if (json.status === 'OK' || json.status === 'ERROR') {
78
+ status = json.status;
79
+ }
80
+ message = json.message;
81
+ errorCode = json.errorCode;
82
+ }
83
+ catch {
84
+ // Respuesta no JSON: se conserva el cuerpo como mensaje.
85
+ message = raw;
86
+ }
87
+ return { operationId, status, message, errorCode, rawResponse: raw };
88
+ }
89
+ }
90
+ exports.VerifactuClient = VerifactuClient;
91
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/aeat/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/aeat/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./client.js"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/aeat/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../../../src/core/hash/chain.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAO5F;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iDAAiD;IACjD,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,4CAA4C;IAC5C,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,6BAA6B,EAAE,MAAM,CAAC;IACtC,2CAA2C;IAC3C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iDAAiD;IACjD,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAWxE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAQlF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAEpE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAE1F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAET;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAK;IAEnB,2EAA2E;IAC3E,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,mDAAmD;IACnD,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,MAAM;IAOlE;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,GAAG,MAAM;IAO5E,0BAA0B;IAC1B,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HashChain = void 0;
4
+ exports.sha256 = sha256;
5
+ exports.concatenateFields = concatenateFields;
6
+ exports.concatenateRegistroAlta = concatenateRegistroAlta;
7
+ exports.concatenateRegistroAnulacion = concatenateRegistroAnulacion;
8
+ exports.computeRegistroAlta = computeRegistroAlta;
9
+ exports.computeRegistroAnulacion = computeRegistroAnulacion;
10
+ exports.verifyRegistroAlta = verifyRegistroAlta;
11
+ exports.verifyRegistroAnulacion = verifyRegistroAnulacion;
12
+ const node_crypto_1 = require("node:crypto");
13
+ /**
14
+ * Calcula el hash SHA-256 de un dato en hexadecimal MAYÚSCULA.
15
+ * Verifactu exige el hash en hexadecimal en mayúsculas (64 caracteres).
16
+ */
17
+ function sha256(data) {
18
+ return (0, node_crypto_1.createHash)('sha256').update(data).digest('hex').toUpperCase();
19
+ }
20
+ /**
21
+ * Concatena los campos de un registro en el formato Verifactu:
22
+ * `nombreCampo1=valor1&nombreCampo2=valor2&...`
23
+ *
24
+ * Reglas de normalización (AEAT):
25
+ * - Se eliminan los espacios al inicio y final de cada valor (trim).
26
+ * - Los campos vacíos o ausentes se incluyen como `nombreCampo=` (sin valor).
27
+ * - No se aplica URL-encoding ni escaping a caracteres especiales.
28
+ */
29
+ function concatenateFields(fields) {
30
+ return fields
31
+ .map(([name, value]) => {
32
+ const trimmed = value ? value.trim() : '';
33
+ return `${name}=${trimmed}`;
34
+ })
35
+ .join('&');
36
+ }
37
+ /**
38
+ * Construye la cadena canónica a hashear de un registro de alta.
39
+ */
40
+ function concatenateRegistroAlta(input) {
41
+ return concatenateFields([
42
+ ['IDEmisorFactura', input.idEmisorFactura],
43
+ ['NumSerieFactura', input.numSerieFactura],
44
+ ['FechaExpedicionFactura', input.fechaExpedicionFactura],
45
+ ['TipoFactura', input.tipoFactura],
46
+ ['CuotaTotal', input.cuotaTotal],
47
+ ['ImporteTotal', input.importeTotal],
48
+ ['Huella', input.huellaAnterior],
49
+ ['FechaHoraHusoGenRegistro', input.fechaHoraHusoGenRegistro],
50
+ ]);
51
+ }
52
+ /**
53
+ * Construye la cadena canónica a hashear de un registro de anulación.
54
+ */
55
+ function concatenateRegistroAnulacion(input) {
56
+ return concatenateFields([
57
+ ['IDEmisorFacturaAnulada', input.idEmisorFacturaAnulada],
58
+ ['NumSerieFacturaAnulada', input.numSerieFacturaAnulada],
59
+ ['FechaExpedicionFacturaAnulada', input.fechaExpedicionFacturaAnulada],
60
+ ['Huella', input.huellaAnterior],
61
+ ['FechaHoraHusoGenRegistro', input.fechaHoraHusoGenRegistro],
62
+ ]);
63
+ }
64
+ /**
65
+ * Calcula la huella (hash) de un registro de alta.
66
+ */
67
+ function computeRegistroAlta(input) {
68
+ return sha256(concatenateRegistroAlta(input));
69
+ }
70
+ /**
71
+ * Calcula la huella (hash) de un registro de anulación.
72
+ */
73
+ function computeRegistroAnulacion(input) {
74
+ return sha256(concatenateRegistroAnulacion(input));
75
+ }
76
+ /**
77
+ * Verifica que el hash de un registro de alta coincide con el esperado.
78
+ */
79
+ function verifyRegistroAlta(input, expectedHash) {
80
+ return computeRegistroAlta(input).toLowerCase() === expectedHash.toLowerCase();
81
+ }
82
+ /**
83
+ * Verifica que el hash de un registro de anulación coincide con el esperado.
84
+ */
85
+ function verifyRegistroAnulacion(input, expectedHash) {
86
+ return computeRegistroAnulacion(input).toLowerCase() === expectedHash.toLowerCase();
87
+ }
88
+ /**
89
+ * Cadena de hash con estado, para encadenar registros de forma secuencial.
90
+ */
91
+ class HashChain {
92
+ _lastHash = null;
93
+ _count = 0;
94
+ /** Hash del último registro encadenado, o `null` si aún no hay ninguno. */
95
+ get lastHash() {
96
+ return this._lastHash;
97
+ }
98
+ /** Número de registros encadenados hasta ahora. */
99
+ get count() {
100
+ return this._count;
101
+ }
102
+ /**
103
+ * Encadena un nuevo registro de alta y devuelve su huella.
104
+ */
105
+ pushAlta(input) {
106
+ const hash = computeRegistroAlta({ ...input, huellaAnterior: this._lastHash });
107
+ this._lastHash = hash;
108
+ this._count += 1;
109
+ return hash;
110
+ }
111
+ /**
112
+ * Encadena un nuevo registro de anulación y devuelve su huella.
113
+ */
114
+ pushAnulacion(input) {
115
+ const hash = computeRegistroAnulacion({ ...input, huellaAnterior: this._lastHash });
116
+ this._lastHash = hash;
117
+ this._count += 1;
118
+ return hash;
119
+ }
120
+ /** Reinicia la cadena. */
121
+ reset() {
122
+ this._lastHash = null;
123
+ this._count = 0;
124
+ }
125
+ }
126
+ exports.HashChain = HashChain;
127
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../../../src/core/hash/chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/hash/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./chain.js"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/hash/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./models/index.js"), exports);
18
+ __exportStar(require("./hash/index.js"), exports);
19
+ __exportStar(require("./xml/index.js"), exports);
20
+ __exportStar(require("./qr/index.js"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,kDAAgC;AAChC,iDAA+B;AAC/B,gDAA8B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../../src/core/models/event.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,cAAc,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,sBAAsB;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/core/models/event.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../../src/core/models/event.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./invoice.js"), exports);
18
+ __exportStar(require("./event.js"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,6CAA2B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice.d.ts","sourceRoot":"","sources":["../../../../src/core/models/invoice.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,CAAC;AAET;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,eAAe,EAAE,qBAAqB,EAAE,CAAC;IACzC,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,oCAAoC;IACpC,EAAE,EAAE,SAAS,CAAC;IACd,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,uBAAuB;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,wBAAwB;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=invoice.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"invoice.js","sourceRoot":"","sources":["../../../src/core/models/invoice.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"invoice.js","sourceRoot":"","sources":["../../../../src/core/models/invoice.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/qr/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./qr.js"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/qr/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../../../../src/core/qr/qr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,SAA8D,EACrE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACvC,MAAM,CAGR"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildQrPayload = buildQrPayload;
4
+ /**
5
+ * Construye el payload del QR Verifactu.
6
+ *
7
+ * El QR Verifactu codifica una URL de verificación que incluye el hash del
8
+ * registro, de modo que cualquier persona pueda verificar la integridad de
9
+ * la factura contra la AEAT.
10
+ *
11
+ * @param hash Hash del registro (encadenado).
12
+ * @param baseUrl URL base de verificación de la AEAT.
13
+ * @param extraParams Parámetros adicionales a incluir en la URL.
14
+ */
15
+ function buildQrPayload(hash, baseUrl = 'https://www2.agenciatributaria.gob.es/verifactu/verificar', extraParams = {}) {
16
+ const params = new URLSearchParams({ hash, ...extraParams });
17
+ return `${baseUrl}?${params.toString()}`;
18
+ }
19
+ //# sourceMappingURL=qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.js","sourceRoot":"","sources":["../../../../src/core/qr/qr.ts"],"names":[],"mappings":";;AAWA,wCAOC;AAlBD;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAC5B,IAAY,EACZ,OAAO,GAAG,2DAA2D,EACrE,cAAsC,EAAE;IAExC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;IAC7D,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../src/core/xml/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,sBAAsB,EAAE,MAAM,CAAC;IAC/B,4CAA4C;IAC5C,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,6BAA6B,EAAE,MAAM,CAAC;IACtC,2CAA2C;IAC3C,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAqBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAwDxF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,CAqBR"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateInvoiceXml = generateInvoiceXml;
4
+ exports.generateAnulacionXml = generateAnulacionXml;
5
+ /**
6
+ * Escapa caracteres especiales para XML.
7
+ */
8
+ function escapeXml(value) {
9
+ return value
10
+ .replace(/&/g, '&amp;')
11
+ .replace(/</g, '&lt;')
12
+ .replace(/>/g, '&gt;')
13
+ .replace(/"/g, '&quot;')
14
+ .replace(/'/g, '&apos;');
15
+ }
16
+ /**
17
+ * Formatea un número con 2 decimales (formato Verifactu).
18
+ */
19
+ function formatAmount(value) {
20
+ return value.toFixed(2);
21
+ }
22
+ /**
23
+ * Genera el XML Verifactu de una factura (registro de alta).
24
+ *
25
+ * Estructura basada en el RD 1007/2023 y la documentación técnica de la
26
+ * AEAT. NOTA: el esquema XSD oficial debe validarse antes de producción;
27
+ * este esqueleto refleja los bloques principales (IDFactura, IDEmisorFactura,
28
+ * TipoFactura, TipoDesglose, Desglose, CuotaTotal, Encadenamiento, Huella).
29
+ */
30
+ function generateInvoiceXml(invoice, previousHash) {
31
+ const { id, emisor, desglose, tipoFactura, tipoDesglose } = invoice;
32
+ const detalles = desglose.tipoOperaciones
33
+ .map((op) => {
34
+ const iva = op.detallesIva
35
+ .map((d) => ` <DetalleIVA>` +
36
+ `<TipoImpositivo>${formatAmount(d.tipoImpositivo)}</TipoImpositivo>` +
37
+ `<BaseImponible>${formatAmount(d.baseImponible)}</BaseImponible>` +
38
+ `<CuotaRepercutida>${formatAmount(d.cuotaRepercutida)}</CuotaRepercutida>` +
39
+ `</DetalleIVA>`)
40
+ .join('\n');
41
+ return (` <DesgloseTipoOperacion>` +
42
+ `<TipoOperacion>${escapeXml(op.tipoOperacion)}</TipoOperacion>` +
43
+ `\n <DesgloseIVA>\n${iva}\n </DesgloseIVA>` +
44
+ `\n </DesgloseTipoOperacion>`);
45
+ })
46
+ .join('\n');
47
+ const xml = [
48
+ '<?xml version="1.0" encoding="UTF-8"?>',
49
+ '<RegistroFactura>',
50
+ ' <IDFactura>',
51
+ ' <IDEmisorFactura>',
52
+ ` <NIF>${escapeXml(emisor.nif)}</NIF>`,
53
+ ` <NombreRazon>${escapeXml(emisor.nombreRazon)}</NombreRazon>`,
54
+ emisor.pais ? ` <Pais>${escapeXml(emisor.pais)}</Pais>` : '',
55
+ emisor.codigoPostal ? ` <CodigoPostal>${escapeXml(emisor.codigoPostal)}</CodigoPostal>` : '',
56
+ emisor.municipio ? ` <Municipio>${escapeXml(emisor.municipio)}</Municipio>` : '',
57
+ emisor.direccion ? ` <Direccion>${escapeXml(emisor.direccion)}</Direccion>` : '',
58
+ ' </IDEmisorFactura>',
59
+ id.serie ? ` <SerieFactura>${escapeXml(id.serie)}</SerieFactura>` : '',
60
+ ` <NumeroFactura>${escapeXml(id.numero)}</NumeroFactura>`,
61
+ ` <FechaExpedicionFactura>${id.fechaExpedicion}</FechaExpedicionFactura>`,
62
+ id.fechaOperacion ? ` <FechaOperacion>${id.fechaOperacion}</FechaOperacion>` : '',
63
+ ' </IDFactura>',
64
+ ` <TipoFactura>${tipoFactura}</TipoFactura>`,
65
+ ` <TipoDesglose>${tipoDesglose}</TipoDesglose>`,
66
+ ' <Desglose>',
67
+ detalles,
68
+ ' </Desglose>',
69
+ ` <CuotaTotal>${formatAmount(desglose.cuotaTotal)}</CuotaTotal>`,
70
+ ' <Encadenamiento>',
71
+ ` <HashAnterior>${previousHash ?? ''}</HashAnterior>`,
72
+ ' </Encadenamiento>',
73
+ '</RegistroFactura>',
74
+ ]
75
+ .filter((line) => line !== '')
76
+ .join('\n');
77
+ return xml;
78
+ }
79
+ /**
80
+ * Genera el XML Verifactu de un registro de anulación.
81
+ *
82
+ * Referencia la factura anulada (IDFactura + Huella) y encadena con el hash
83
+ * anterior. Estructura basada en el RD 1007/2023; validar contra el XSD
84
+ * oficial antes de producción.
85
+ */
86
+ function generateAnulacionXml(anulacion, previousHash) {
87
+ const xml = [
88
+ '<?xml version="1.0" encoding="UTF-8"?>',
89
+ '<RegistroFactura>',
90
+ ' <RegistroAnulacion>',
91
+ ' <IDFactura>',
92
+ ' <IDEmisorFactura>',
93
+ ` <NIF>${escapeXml(anulacion.idEmisorFacturaAnulada)}</NIF>`,
94
+ ' </IDEmisorFactura>',
95
+ ` <NumeroFactura>${escapeXml(anulacion.numSerieFacturaAnulada)}</NumeroFactura>`,
96
+ ` <FechaExpedicionFactura>${anulacion.fechaExpedicionFacturaAnulada}</FechaExpedicionFactura>`,
97
+ ' </IDFactura>',
98
+ ` <Huella>${anulacion.huellaFacturaAnulada}</Huella>`,
99
+ ' </RegistroAnulacion>',
100
+ ' <Encadenamiento>',
101
+ ` <HashAnterior>${previousHash ?? ''}</HashAnterior>`,
102
+ ' </Encadenamiento>',
103
+ '</RegistroFactura>',
104
+ ].join('\n');
105
+ return xml;
106
+ }
107
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/core/xml/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/xml/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./generator.js"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/xml/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./core/index.js"), exports);
18
+ __exportStar(require("./aeat/index.js"), exports);
19
+ __exportStar(require("./integration/index.js"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,kDAAgC;AAChC,yDAAuC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integration/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC"}