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

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 (249) hide show
  1. package/dist/cjs/aeat/client.d.ts +162 -0
  2. package/dist/cjs/aeat/client.d.ts.map +1 -0
  3. package/dist/cjs/aeat/client.js +267 -0
  4. package/dist/cjs/aeat/client.js.map +1 -0
  5. package/dist/cjs/aeat/index.d.ts +3 -0
  6. package/dist/cjs/aeat/index.d.ts.map +1 -0
  7. package/dist/cjs/aeat/index.js +19 -0
  8. package/dist/cjs/aeat/index.js.map +1 -0
  9. package/dist/cjs/aeat/response.d.ts +78 -0
  10. package/dist/cjs/aeat/response.d.ts.map +1 -0
  11. package/dist/cjs/aeat/response.js +117 -0
  12. package/dist/cjs/aeat/response.js.map +1 -0
  13. package/dist/{core → cjs/core}/hash/chain.d.ts +42 -0
  14. package/dist/cjs/core/hash/chain.d.ts.map +1 -0
  15. package/dist/cjs/core/hash/chain.js +167 -0
  16. package/dist/cjs/core/hash/chain.js.map +1 -0
  17. package/dist/cjs/core/hash/index.d.ts.map +1 -0
  18. package/dist/cjs/core/hash/index.js +18 -0
  19. package/dist/cjs/core/hash/index.js.map +1 -0
  20. package/dist/{core → cjs/core}/index.d.ts +2 -0
  21. package/dist/cjs/core/index.d.ts.map +1 -0
  22. package/dist/cjs/core/index.js +23 -0
  23. package/dist/cjs/core/index.js.map +1 -0
  24. package/dist/cjs/core/models/event.d.ts.map +1 -0
  25. package/dist/cjs/core/models/event.js +3 -0
  26. package/dist/{core → cjs/core}/models/event.js.map +1 -1
  27. package/dist/cjs/core/models/index.d.ts.map +1 -0
  28. package/dist/cjs/core/models/index.js +19 -0
  29. package/dist/cjs/core/models/index.js.map +1 -0
  30. package/dist/{core → cjs/core}/models/invoice.d.ts +42 -17
  31. package/dist/cjs/core/models/invoice.d.ts.map +1 -0
  32. package/dist/cjs/core/models/invoice.js +3 -0
  33. package/dist/{core → cjs/core}/models/invoice.js.map +1 -1
  34. package/dist/cjs/core/qr/index.d.ts.map +1 -0
  35. package/dist/cjs/core/qr/index.js +18 -0
  36. package/dist/cjs/core/qr/index.js.map +1 -0
  37. package/dist/cjs/core/qr/qr.d.ts.map +1 -0
  38. package/dist/cjs/core/qr/qr.js +19 -0
  39. package/dist/cjs/core/qr/qr.js.map +1 -0
  40. package/dist/cjs/core/utils/date.d.ts +16 -0
  41. package/dist/cjs/core/utils/date.d.ts.map +1 -0
  42. package/dist/cjs/core/utils/date.js +27 -0
  43. package/dist/cjs/core/utils/date.js.map +1 -0
  44. package/dist/cjs/core/utils/index.d.ts +2 -0
  45. package/dist/cjs/core/utils/index.d.ts.map +1 -0
  46. package/dist/cjs/core/utils/index.js +18 -0
  47. package/dist/cjs/core/utils/index.js.map +1 -0
  48. package/dist/cjs/core/validation/index.d.ts +2 -0
  49. package/dist/cjs/core/validation/index.d.ts.map +1 -0
  50. package/dist/cjs/core/validation/index.js +18 -0
  51. package/dist/cjs/core/validation/index.js.map +1 -0
  52. package/dist/cjs/core/validation/validate.d.ts +18 -0
  53. package/dist/cjs/core/validation/validate.d.ts.map +1 -0
  54. package/dist/cjs/core/validation/validate.js +65 -0
  55. package/dist/cjs/core/validation/validate.js.map +1 -0
  56. package/dist/cjs/core/xml/generator.d.ts +140 -0
  57. package/dist/cjs/core/xml/generator.d.ts.map +1 -0
  58. package/dist/cjs/core/xml/generator.js +269 -0
  59. package/dist/cjs/core/xml/generator.js.map +1 -0
  60. package/dist/cjs/core/xml/index.d.ts.map +1 -0
  61. package/dist/cjs/core/xml/index.js +18 -0
  62. package/dist/cjs/core/xml/index.js.map +1 -0
  63. package/dist/cjs/index.d.ts.map +1 -0
  64. package/dist/cjs/index.js +20 -0
  65. package/dist/cjs/index.js.map +1 -0
  66. package/dist/cjs/integration/accountability.d.ts +41 -0
  67. package/dist/cjs/integration/accountability.d.ts.map +1 -0
  68. package/dist/cjs/integration/accountability.js +92 -0
  69. package/dist/cjs/integration/accountability.js.map +1 -0
  70. package/dist/cjs/integration/index.d.ts +5 -0
  71. package/dist/cjs/integration/index.d.ts.map +1 -0
  72. package/dist/cjs/integration/index.js +21 -0
  73. package/dist/cjs/integration/index.js.map +1 -0
  74. package/dist/cjs/integration/p12.d.ts +58 -0
  75. package/dist/cjs/integration/p12.d.ts.map +1 -0
  76. package/dist/cjs/integration/p12.js +127 -0
  77. package/dist/cjs/integration/p12.js.map +1 -0
  78. package/dist/{integration → cjs/integration}/repository.d.ts +2 -0
  79. package/dist/cjs/integration/repository.d.ts.map +1 -0
  80. package/dist/cjs/integration/repository.js +3 -0
  81. package/dist/cjs/integration/repository.js.map +1 -0
  82. package/dist/{integration → cjs/integration}/service.d.ts +11 -2
  83. package/dist/cjs/integration/service.d.ts.map +1 -0
  84. package/dist/cjs/integration/service.js +230 -0
  85. package/dist/cjs/integration/service.js.map +1 -0
  86. package/dist/cjs/integration/tenant-credentials.d.ts +44 -0
  87. package/dist/cjs/integration/tenant-credentials.d.ts.map +1 -0
  88. package/dist/cjs/integration/tenant-credentials.js +62 -0
  89. package/dist/cjs/integration/tenant-credentials.js.map +1 -0
  90. package/dist/cjs/package.json +3 -0
  91. package/dist/esm/aeat/client.d.ts +162 -0
  92. package/dist/esm/aeat/client.d.ts.map +1 -0
  93. package/dist/esm/aeat/client.js +259 -0
  94. package/dist/esm/aeat/client.js.map +1 -0
  95. package/dist/esm/aeat/index.d.ts +3 -0
  96. package/dist/esm/aeat/index.d.ts.map +1 -0
  97. package/dist/esm/aeat/index.js +3 -0
  98. package/dist/esm/aeat/index.js.map +1 -0
  99. package/dist/esm/aeat/response.d.ts +78 -0
  100. package/dist/esm/aeat/response.d.ts.map +1 -0
  101. package/dist/esm/aeat/response.js +114 -0
  102. package/dist/esm/aeat/response.js.map +1 -0
  103. package/dist/esm/core/hash/chain.d.ts +139 -0
  104. package/dist/esm/core/hash/chain.d.ts.map +1 -0
  105. package/dist/{core → esm/core}/hash/chain.js +37 -0
  106. package/dist/esm/core/hash/chain.js.map +1 -0
  107. package/dist/esm/core/hash/index.d.ts +2 -0
  108. package/dist/esm/core/hash/index.d.ts.map +1 -0
  109. package/dist/esm/core/hash/index.js.map +1 -0
  110. package/dist/esm/core/index.d.ts +7 -0
  111. package/dist/esm/core/index.d.ts.map +1 -0
  112. package/dist/{core → esm/core}/index.js +2 -0
  113. package/dist/esm/core/index.js.map +1 -0
  114. package/dist/esm/core/models/event.d.ts +25 -0
  115. package/dist/esm/core/models/event.d.ts.map +1 -0
  116. package/dist/esm/core/models/event.js.map +1 -0
  117. package/dist/esm/core/models/index.d.ts +3 -0
  118. package/dist/esm/core/models/index.d.ts.map +1 -0
  119. package/dist/esm/core/models/index.js.map +1 -0
  120. package/dist/esm/core/models/invoice.d.ts +115 -0
  121. package/dist/esm/core/models/invoice.d.ts.map +1 -0
  122. package/dist/esm/core/models/invoice.js.map +1 -0
  123. package/dist/esm/core/qr/index.d.ts +2 -0
  124. package/dist/esm/core/qr/index.d.ts.map +1 -0
  125. package/dist/esm/core/qr/index.js.map +1 -0
  126. package/dist/esm/core/qr/qr.d.ts +13 -0
  127. package/dist/esm/core/qr/qr.d.ts.map +1 -0
  128. package/dist/esm/core/qr/qr.js.map +1 -0
  129. package/dist/esm/core/utils/date.d.ts +16 -0
  130. package/dist/esm/core/utils/date.d.ts.map +1 -0
  131. package/dist/esm/core/utils/date.js +24 -0
  132. package/dist/esm/core/utils/date.js.map +1 -0
  133. package/dist/esm/core/utils/index.d.ts +2 -0
  134. package/dist/esm/core/utils/index.d.ts.map +1 -0
  135. package/dist/esm/core/utils/index.js +2 -0
  136. package/dist/esm/core/utils/index.js.map +1 -0
  137. package/dist/esm/core/validation/index.d.ts +2 -0
  138. package/dist/esm/core/validation/index.d.ts.map +1 -0
  139. package/dist/esm/core/validation/index.js +2 -0
  140. package/dist/esm/core/validation/index.js.map +1 -0
  141. package/dist/esm/core/validation/validate.d.ts +18 -0
  142. package/dist/esm/core/validation/validate.d.ts.map +1 -0
  143. package/dist/esm/core/validation/validate.js +62 -0
  144. package/dist/esm/core/validation/validate.js.map +1 -0
  145. package/dist/esm/core/xml/generator.d.ts +140 -0
  146. package/dist/esm/core/xml/generator.d.ts.map +1 -0
  147. package/dist/esm/core/xml/generator.js +259 -0
  148. package/dist/esm/core/xml/generator.js.map +1 -0
  149. package/dist/esm/core/xml/index.d.ts +2 -0
  150. package/dist/esm/core/xml/index.d.ts.map +1 -0
  151. package/dist/esm/core/xml/index.js.map +1 -0
  152. package/dist/esm/index.d.ts +4 -0
  153. package/dist/esm/index.d.ts.map +1 -0
  154. package/dist/esm/index.js.map +1 -0
  155. package/dist/esm/integration/accountability.d.ts +41 -0
  156. package/dist/esm/integration/accountability.d.ts.map +1 -0
  157. package/dist/esm/integration/accountability.js +88 -0
  158. package/dist/esm/integration/accountability.js.map +1 -0
  159. package/dist/esm/integration/index.d.ts +5 -0
  160. package/dist/esm/integration/index.d.ts.map +1 -0
  161. package/dist/esm/integration/index.js +5 -0
  162. package/dist/esm/integration/index.js.map +1 -0
  163. package/dist/esm/integration/p12.d.ts +58 -0
  164. package/dist/esm/integration/p12.d.ts.map +1 -0
  165. package/dist/esm/integration/p12.js +119 -0
  166. package/dist/esm/integration/p12.js.map +1 -0
  167. package/dist/esm/integration/repository.d.ts +79 -0
  168. package/dist/esm/integration/repository.d.ts.map +1 -0
  169. package/dist/esm/integration/repository.js.map +1 -0
  170. package/dist/esm/integration/service.d.ts +45 -0
  171. package/dist/esm/integration/service.d.ts.map +1 -0
  172. package/dist/{integration → esm/integration}/service.js +101 -15
  173. package/dist/esm/integration/service.js.map +1 -0
  174. package/dist/esm/integration/tenant-credentials.d.ts +44 -0
  175. package/dist/esm/integration/tenant-credentials.d.ts.map +1 -0
  176. package/dist/esm/integration/tenant-credentials.js +58 -0
  177. package/dist/esm/integration/tenant-credentials.js.map +1 -0
  178. package/package.json +45 -13
  179. package/readme.md +566 -42
  180. package/src/aeat/client.ts +296 -55
  181. package/src/aeat/index.ts +1 -0
  182. package/src/aeat/response.ts +195 -0
  183. package/src/core/hash/chain.ts +68 -0
  184. package/src/core/index.ts +2 -0
  185. package/src/core/models/invoice.ts +40 -18
  186. package/src/core/utils/date.ts +27 -0
  187. package/src/core/utils/index.ts +1 -0
  188. package/src/core/validation/index.ts +1 -0
  189. package/src/core/validation/validate.ts +71 -0
  190. package/src/core/xml/generator.ts +306 -73
  191. package/src/integration/accountability.ts +125 -0
  192. package/src/integration/index.ts +2 -0
  193. package/src/integration/p12.ts +155 -0
  194. package/src/integration/repository.ts +2 -0
  195. package/src/integration/service.ts +113 -14
  196. package/dist/aeat/client.d.ts +0 -57
  197. package/dist/aeat/client.d.ts.map +0 -1
  198. package/dist/aeat/client.js +0 -87
  199. package/dist/aeat/client.js.map +0 -1
  200. package/dist/aeat/index.d.ts +0 -2
  201. package/dist/aeat/index.d.ts.map +0 -1
  202. package/dist/aeat/index.js +0 -2
  203. package/dist/aeat/index.js.map +0 -1
  204. package/dist/core/hash/chain.d.ts.map +0 -1
  205. package/dist/core/hash/chain.js.map +0 -1
  206. package/dist/core/hash/index.d.ts.map +0 -1
  207. package/dist/core/hash/index.js.map +0 -1
  208. package/dist/core/index.d.ts.map +0 -1
  209. package/dist/core/index.js.map +0 -1
  210. package/dist/core/models/event.d.ts.map +0 -1
  211. package/dist/core/models/index.d.ts.map +0 -1
  212. package/dist/core/models/index.js.map +0 -1
  213. package/dist/core/models/invoice.d.ts.map +0 -1
  214. package/dist/core/qr/index.d.ts.map +0 -1
  215. package/dist/core/qr/index.js.map +0 -1
  216. package/dist/core/qr/qr.d.ts.map +0 -1
  217. package/dist/core/qr/qr.js.map +0 -1
  218. package/dist/core/xml/generator.d.ts +0 -32
  219. package/dist/core/xml/generator.d.ts.map +0 -1
  220. package/dist/core/xml/generator.js +0 -103
  221. package/dist/core/xml/generator.js.map +0 -1
  222. package/dist/core/xml/index.d.ts.map +0 -1
  223. package/dist/core/xml/index.js.map +0 -1
  224. package/dist/index.d.ts.map +0 -1
  225. package/dist/index.js.map +0 -1
  226. package/dist/integration/index.d.ts +0 -3
  227. package/dist/integration/index.d.ts.map +0 -1
  228. package/dist/integration/index.js +0 -3
  229. package/dist/integration/index.js.map +0 -1
  230. package/dist/integration/repository.d.ts.map +0 -1
  231. package/dist/integration/repository.js.map +0 -1
  232. package/dist/integration/service.d.ts.map +0 -1
  233. package/dist/integration/service.js.map +0 -1
  234. /package/dist/{core → cjs/core}/hash/index.d.ts +0 -0
  235. /package/dist/{core → cjs/core}/models/event.d.ts +0 -0
  236. /package/dist/{core → cjs/core}/models/index.d.ts +0 -0
  237. /package/dist/{core → cjs/core}/qr/index.d.ts +0 -0
  238. /package/dist/{core → cjs/core}/qr/qr.d.ts +0 -0
  239. /package/dist/{core → cjs/core}/xml/index.d.ts +0 -0
  240. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  241. /package/dist/{core → esm/core}/hash/index.js +0 -0
  242. /package/dist/{core → esm/core}/models/event.js +0 -0
  243. /package/dist/{core → esm/core}/models/index.js +0 -0
  244. /package/dist/{core → esm/core}/models/invoice.js +0 -0
  245. /package/dist/{core → esm/core}/qr/index.js +0 -0
  246. /package/dist/{core → esm/core}/qr/qr.js +0 -0
  247. /package/dist/{core → esm/core}/xml/index.js +0 -0
  248. /package/dist/{index.js → esm/index.js} +0 -0
  249. /package/dist/{integration → esm/integration}/repository.js +0 -0
@@ -0,0 +1,259 @@
1
+ import https from 'node:https';
2
+ import { buildRemisionEnvelope, AEAT_INFORMACION_NAMESPACE } from '../core/xml/generator.js';
3
+ import { parseSoapResponse } from './response.js';
4
+ /**
5
+ * URL base del servicio AEAT en PRODUCCIÓN (Verifactu v1.0).
6
+ * Fuente: Veri-Factu_Descripcion_SWeb.pdf (Anexo I, entorno de producción).
7
+ */
8
+ export const AEAT_PRODUCTION_BASE_URL = 'https://www2.agenciatributaria.gob.es';
9
+ /**
10
+ * URL base del servicio AEAT en PRUEBAS/desarrollo (Verifactu v1.0).
11
+ * Fuente: Veri-Factu_Descripcion_SWeb.pdf (Anexo I, entorno de pruebas).
12
+ */
13
+ export const AEAT_TEST_BASE_URL = 'https://prewww2.aeat.es';
14
+ /**
15
+ * Ruta del WSDL del servicio SistemaFacturacion (Verifactu v1.0).
16
+ */
17
+ export const AEAT_WSDL_PATH = '/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/SistemaFacturacion.wsdl';
18
+ /**
19
+ * Endpoint SOAP de remisión voluntaria (VerifactuSOAP).
20
+ * - Producción: `https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP`
21
+ * - Pruebas: `https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP`
22
+ */
23
+ export const AEAT_PRODUCTION_SOAP_URL = 'https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP';
24
+ export const AEAT_TEST_SOAP_URL = 'https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP';
25
+ /**
26
+ * Endpoint SOAP de remisión bajo requerimiento (RequerimientoSOAP).
27
+ */
28
+ export const AEAT_PRODUCTION_REQUERIMIENTO_URL = 'https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/RequerimientoSOAP';
29
+ export const AEAT_TEST_REQUERIMIENTO_URL = 'https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/RequerimientoSOAP';
30
+ /**
31
+ * Operación SOAP de alta/anulación de registros.
32
+ */
33
+ export const AEAT_OPERATION_REGISTRO = 'RegFactuSistemaFacturacion';
34
+ /**
35
+ * Operación SOAP de consulta.
36
+ */
37
+ export const AEAT_OPERATION_CONSULTA = 'ConsultaFactuSistemaFacturacion';
38
+ /**
39
+ * Namespace del servicio (targetNamespace del WSDL).
40
+ */
41
+ export const AEAT_SOAP_NAMESPACE = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl';
42
+ /**
43
+ * Namespace del elemento de consulta (`ConsultaLR.xsd`).
44
+ */
45
+ export const AEAT_CONSULTA_NAMESPACE = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/ConsultaLR.xsd';
46
+ /**
47
+ * Resuelve la URL base efectiva según el entorno.
48
+ *
49
+ * Regla: **por defecto se usa producción** (la app real factura en prod).
50
+ * - Si `env` es `production` (o no se indica), usa `baseUrl`.
51
+ * - Si `env` es `test`/`development`, usa `testBaseUrl`.
52
+ *
53
+ * Los tests se ejecutan aparte y fijan `env: 'test'` + `testBaseUrl` para
54
+ * usar desarrollo (sin necesidad de indicar la URL de producción).
55
+ */
56
+ export function resolveBaseUrl(config) {
57
+ const env = config.env ?? 'production';
58
+ if (env !== 'production') {
59
+ if (config.testBaseUrl) {
60
+ return config.testBaseUrl;
61
+ }
62
+ throw new Error('env no es "production" y no se ha proporcionado testBaseUrl.');
63
+ }
64
+ if (!config.baseUrl) {
65
+ throw new Error('env es "production" y no se ha proporcionado baseUrl.');
66
+ }
67
+ return config.baseUrl;
68
+ }
69
+ /**
70
+ * Cliente de servicios AEAT para Verifactu.
71
+ */
72
+ export class VerifactuClient {
73
+ config;
74
+ agent;
75
+ constructor(config) {
76
+ this.config = {
77
+ operation: AEAT_OPERATION_REGISTRO,
78
+ namespace: AEAT_SOAP_NAMESPACE,
79
+ timeoutMs: 10_000,
80
+ ...config,
81
+ baseUrl: resolveBaseUrl(config),
82
+ };
83
+ // Si hay certificado y clave, se usan en el handshake TLS (mTLS).
84
+ this.agent = new https.Agent(this.config.cert && this.config.key
85
+ ? { cert: this.config.cert, key: this.config.key }
86
+ : undefined);
87
+ }
88
+ /**
89
+ * Envía un registro (factura o evento) a AEAT mediante SOAP.
90
+ */
91
+ async sendRecord(xml) {
92
+ const envelope = buildRemisionEnvelope(xml);
93
+ const url = new URL(this.config.baseUrl);
94
+ const headers = {
95
+ 'Content-Type': 'text/xml; charset=utf-8',
96
+ SOAPAction: '',
97
+ Accept: 'application/xml',
98
+ };
99
+ if (this.config.authToken) {
100
+ headers.Authorization = `Bearer ${this.config.authToken}`;
101
+ }
102
+ return this.request(url, 'POST', headers, envelope);
103
+ }
104
+ /**
105
+ * @deprecated La consulta por ID de operación no está soportada por el
106
+ * esquema `ConsultaLR.xsd` de AEAT (devuelve error 4118). Usa
107
+ * {@link queryInvoice} para consultar registros por número de factura.
108
+ */
109
+ async getOperationStatus(operationId) {
110
+ const consultaXml = `<ConsultaFactuSistemaFacturacion xmlns="${this.config.namespace}"><ID>${operationId}</ID></ConsultaFactuSistemaFacturacion>`;
111
+ const envelope = buildRemisionEnvelope(consultaXml);
112
+ const url = new URL(this.config.baseUrl);
113
+ const headers = {
114
+ 'Content-Type': 'text/xml; charset=utf-8',
115
+ SOAPAction: '',
116
+ Accept: 'application/xml',
117
+ };
118
+ if (this.config.authToken) {
119
+ headers.Authorization = `Bearer ${this.config.authToken}`;
120
+ }
121
+ return this.request(url, 'POST', headers, envelope);
122
+ }
123
+ /**
124
+ * Consulta un registro de facturación por número de factura y devuelve la
125
+ * respuesta completa (incluida la huella confirmada por AEAT).
126
+ *
127
+ * Usa la operación `ConsultaFactuSistemaFacturacion` (mismo endpoint SOAP).
128
+ */
129
+ async queryInvoice(params) {
130
+ const consultaXml = [
131
+ `<sfLRC:ConsultaFactuSistemaFacturacion xmlns:sfLRC="${AEAT_CONSULTA_NAMESPACE}" xmlns:sf="${AEAT_INFORMACION_NAMESPACE}">`,
132
+ ' <sfLRC:Cabecera>',
133
+ ' <sf:IDVersion>1.0</sf:IDVersion>',
134
+ ' <sf:ObligadoEmision>',
135
+ ` <sf:NombreRazon>${params.obligado.nombreRazon}</sf:NombreRazon>`,
136
+ ` <sf:NIF>${params.obligado.nif}</sf:NIF>`,
137
+ ' </sf:ObligadoEmision>',
138
+ ' </sfLRC:Cabecera>',
139
+ ' <sfLRC:FiltroConsulta>',
140
+ ' <sfLRC:PeriodoImputacion>',
141
+ ` <sf:Ejercicio>${params.ejercicio}</sf:Ejercicio>`,
142
+ ` <sf:Periodo>${params.periodo}</sf:Periodo>`,
143
+ ' </sfLRC:PeriodoImputacion>',
144
+ ...(params.numSerieFactura
145
+ ? [` <sfLRC:NumSerieFactura>${params.numSerieFactura}</sfLRC:NumSerieFactura>`]
146
+ : []),
147
+ ' </sfLRC:FiltroConsulta>',
148
+ '</sfLRC:ConsultaFactuSistemaFacturacion>',
149
+ ].join('\n');
150
+ const envelope = buildRemisionEnvelope(consultaXml);
151
+ const url = new URL(this.config.baseUrl);
152
+ const headers = {
153
+ 'Content-Type': 'text/xml; charset=utf-8',
154
+ SOAPAction: '',
155
+ Accept: 'application/xml',
156
+ };
157
+ if (this.config.authToken) {
158
+ headers.Authorization = `Bearer ${this.config.authToken}`;
159
+ }
160
+ return this.request(url, 'POST', headers, envelope);
161
+ }
162
+ /**
163
+ * Realiza la petición HTTPS usando el agente (con mTLS si hay certificado).
164
+ */
165
+ request(url, method, headers, body) {
166
+ return new Promise((resolve, reject) => {
167
+ const req = https.request({
168
+ hostname: url.hostname,
169
+ port: url.port || 443,
170
+ path: `${url.pathname}${url.search}`,
171
+ method,
172
+ headers,
173
+ agent: this.agent,
174
+ }, (res) => {
175
+ let raw = '';
176
+ res.setEncoding('utf8');
177
+ res.on('data', (chunk) => {
178
+ raw += chunk;
179
+ });
180
+ res.on('end', () => {
181
+ resolve(this.parseResponse(raw, res.statusCode ?? 0));
182
+ });
183
+ });
184
+ req.on('error', reject);
185
+ req.setTimeout(this.config.timeoutMs, () => {
186
+ req.destroy(new Error(`Timeout tras ${this.config.timeoutMs}ms`));
187
+ });
188
+ if (body) {
189
+ req.write(body);
190
+ }
191
+ req.end();
192
+ });
193
+ }
194
+ /**
195
+ * Parsea la respuesta de AEAT. La estructura exacta depende del servicio;
196
+ * este es un mapeo base que el consumidor puede sobrescribir.
197
+ *
198
+ * Devuelve SIEMPRE todo lo recibido: la respuesta completa parseada en
199
+ * `data` y el cuerpo crudo en `rawResponse`, tanto si es OK como error.
200
+ */
201
+ parseResponse(raw, httpStatus) {
202
+ let operationId = '';
203
+ let status = httpStatus >= 200 && httpStatus < 300 ? 'OK' : 'ERROR';
204
+ let message;
205
+ let errorCode;
206
+ let data;
207
+ let response;
208
+ // AEAT responde en SOAP/XML: se normaliza a JSON.
209
+ const soap = parseSoapResponse(raw);
210
+ if (soap) {
211
+ response = soap;
212
+ data = soap.body;
213
+ operationId = String(soap.body['ID'] ?? soap.body['IdPeticion'] ?? '');
214
+ // Estado según el registro/consulta/evento mapeado.
215
+ const reg = soap.registro;
216
+ const con = soap.consulta;
217
+ const ev = soap.evento;
218
+ const estado = reg?.estadoRegistro ?? con?.estado ?? ev?.estadoEvento;
219
+ if (estado) {
220
+ status = /OK|ACEPTAD|CONFIRMAD|CORRECT/i.test(estado) ? 'OK' : 'ERROR';
221
+ }
222
+ errorCode = reg?.codigoErrorRegistro ?? con?.codigoError ?? ev?.codigoErrorEvento;
223
+ message =
224
+ reg?.descripcionErrorRegistro ??
225
+ con?.descripcionError ??
226
+ ev?.descripcionErrorEvento ??
227
+ estado;
228
+ }
229
+ else {
230
+ // Respuesta no XML/JSON: se conserva el cuerpo como mensaje.
231
+ try {
232
+ const json = JSON.parse(raw);
233
+ data = json;
234
+ operationId = String(json.operationId ?? json.id ?? '');
235
+ if (json.status === 'OK' || json.status === 'ERROR') {
236
+ status = json.status;
237
+ }
238
+ message = json.message;
239
+ errorCode = json.errorCode;
240
+ }
241
+ catch {
242
+ message = raw;
243
+ }
244
+ }
245
+ return {
246
+ operationId,
247
+ status,
248
+ message,
249
+ errorCode,
250
+ rawResponse: raw,
251
+ data,
252
+ response,
253
+ registro: response?.registro,
254
+ consulta: response?.consulta,
255
+ evento: response?.evento,
256
+ };
257
+ }
258
+ }
259
+ //# 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,3 @@
1
+ export * from './client.js';
2
+ export * from './response.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/aeat/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './client.js';
2
+ export * from './response.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/aeat/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Respuesta de AEAT para un registro de facturación (alta/anulación).
3
+ *
4
+ * AEAT devuelve un SOAP XML; este tipo es el resultado normalizado a JSON
5
+ * para que el sistema consumidor lo persista y lo maneje con facilidad.
6
+ */
7
+ export interface RegistroResponse {
8
+ /** Estado del registro devuelto por AEAT. */
9
+ estadoRegistro?: string;
10
+ /** Código de error del registro (si lo hay). */
11
+ codigoErrorRegistro?: string;
12
+ /** Descripción del error del registro (si lo hay). */
13
+ descripcionErrorRegistro?: string;
14
+ /** CSV (Código Seguro de Verificación) si AEAT lo devuelve. */
15
+ csv?: string;
16
+ /** Huella (hash) del registro confirmado por AEAT. */
17
+ huella?: string;
18
+ /** Fecha/hora de generación del registro en AEAT. */
19
+ fechaHoraHusoGenRegistro?: string;
20
+ /** Identificador de la factura (si AEAT lo devuelve). */
21
+ idFactura?: string;
22
+ }
23
+ /**
24
+ * Respuesta de AEAT para una consulta de estado de operación.
25
+ */
26
+ export interface ConsultaResponse {
27
+ /** Estado de la operación consultada. */
28
+ estado?: string;
29
+ /** Código de error (si lo hay). */
30
+ codigoError?: string;
31
+ /** Descripción del error (si lo hay). */
32
+ descripcionError?: string;
33
+ /** CSV de la operación consultada. */
34
+ csv?: string;
35
+ /** Huella (hash) de la operación consultada. */
36
+ huella?: string;
37
+ /** Registros devueltos por la consulta. */
38
+ registros?: RegistroResponse[];
39
+ }
40
+ /**
41
+ * Respuesta de AEAT para un registro de evento.
42
+ */
43
+ export interface EventoResponse {
44
+ /** Estado del evento devuelto por AEAT. */
45
+ estadoEvento?: string;
46
+ /** Código de error del evento (si lo hay). */
47
+ codigoErrorEvento?: string;
48
+ /** Descripción del error del evento (si lo hay). */
49
+ descripcionErrorEvento?: string;
50
+ /** CSV del evento si AEAT lo devuelve. */
51
+ csv?: string;
52
+ /** Huella (hash) del evento confirmado por AEAT. */
53
+ huella?: string;
54
+ }
55
+ /**
56
+ * Resultado normalizado de una respuesta SOAP de AEAT.
57
+ */
58
+ export interface SoapResponse {
59
+ /** Nombre del elemento raíz del body SOAP (p. ej. `RespuestaRegFactuSistemaFacturacion`). */
60
+ operation: string;
61
+ /** Objeto JSON completo parseado del body SOAP. */
62
+ body: Record<string, unknown>;
63
+ /** Respuesta tipada de registro (si la operación es de registro). */
64
+ registro?: RegistroResponse;
65
+ /** Respuesta tipada de consulta (si la operación es de consulta). */
66
+ consulta?: ConsultaResponse;
67
+ /** Respuesta tipada de evento (si la operación es de evento). */
68
+ evento?: EventoResponse;
69
+ }
70
+ /**
71
+ * Convierte un XML SOAP de AEAT a un objeto JSON normalizado.
72
+ *
73
+ * Extrae el body del sobre SOAP y mapea los campos a las interfaces tipadas
74
+ * (`RegistroResponse`, `ConsultaResponse`, `EventoResponse`). Si el XML no
75
+ * es parseable, devuelve `null`.
76
+ */
77
+ export declare function parseSoapResponse(xml: string): SoapResponse | null;
78
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/aeat/response.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sDAAsD;IACtD,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oDAAoD;IACpD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6FAA6F;IAC7F,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,iEAAiE;IACjE,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAUD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAqClE"}
@@ -0,0 +1,114 @@
1
+ import { XMLParser } from 'fast-xml-parser';
2
+ const parser = new XMLParser({
3
+ ignoreAttributes: false,
4
+ attributeNamePrefix: '@_',
5
+ removeNSPrefix: true,
6
+ parseTagValue: false,
7
+ trimValues: true,
8
+ });
9
+ /**
10
+ * Convierte un XML SOAP de AEAT a un objeto JSON normalizado.
11
+ *
12
+ * Extrae el body del sobre SOAP y mapea los campos a las interfaces tipadas
13
+ * (`RegistroResponse`, `ConsultaResponse`, `EventoResponse`). Si el XML no
14
+ * es parseable, devuelve `null`.
15
+ */
16
+ export function parseSoapResponse(xml) {
17
+ // Solo procesar si parece XML (evita parsear JSON u otros textos).
18
+ if (typeof xml !== 'string' || !xml.trim().startsWith('<')) {
19
+ return null;
20
+ }
21
+ let parsed;
22
+ try {
23
+ parsed = parser.parse(xml);
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ // Navegar hasta el body del sobre SOAP (removeNSPrefix elimina el prefijo).
29
+ const envelope = (parsed['Envelope'] ?? parsed);
30
+ const body = (envelope['Body'] ?? envelope);
31
+ // El body contiene un único elemento de operación.
32
+ const keys = Object.keys(body).filter((k) => k !== 'Body');
33
+ const operation = keys[0] ?? '';
34
+ const opBody = body[operation];
35
+ const result = {
36
+ operation,
37
+ body: (opBody ?? body),
38
+ };
39
+ // Mapear según el tipo de operación.
40
+ if (/RegFactu|Registro/i.test(operation)) {
41
+ result.registro = mapRegistro(opBody);
42
+ }
43
+ else if (/Consulta/i.test(operation)) {
44
+ result.consulta = mapConsulta(opBody);
45
+ }
46
+ else if (/Evento/i.test(operation)) {
47
+ result.evento = mapEvento(opBody);
48
+ }
49
+ return result;
50
+ }
51
+ function mapRegistro(opBody) {
52
+ if (!opBody)
53
+ return undefined;
54
+ const rf = (opBody['RegistroFactura'] ?? opBody);
55
+ return {
56
+ estadoRegistro: str(rf['EstadoRegistro']),
57
+ codigoErrorRegistro: str(rf['CodigoErrorRegistro']),
58
+ descripcionErrorRegistro: str(rf['DescripcionErrorRegistro']),
59
+ csv: str(rf['CSV']),
60
+ huella: str(rf['Huella']),
61
+ fechaHoraHusoGenRegistro: str(rf['FechaHoraHusoGenRegistro']),
62
+ idFactura: str(rf['IDFactura']),
63
+ };
64
+ }
65
+ function mapConsulta(opBody) {
66
+ if (!opBody)
67
+ return undefined;
68
+ // La consulta devuelve los registros en `RegistroRespuestaConsultaFactuSistemaFacturacion`
69
+ // (o `RegistroFactura`/`Registros` en otros formatos).
70
+ const registrosRaw = opBody['RegistroRespuestaConsultaFactuSistemaFacturacion'] ??
71
+ opBody['RegistroFactura'] ??
72
+ opBody['Registros'];
73
+ const registros = Array.isArray(registrosRaw)
74
+ ? registrosRaw.map((r) => mapRegistroConsulta(r)).filter(Boolean)
75
+ : registrosRaw
76
+ ? [mapRegistroConsulta(registrosRaw)]
77
+ : undefined;
78
+ return {
79
+ estado: str(opBody['Estado']),
80
+ codigoError: str(opBody['CodigoError']),
81
+ descripcionError: str(opBody['DescripcionError']),
82
+ csv: str(opBody['CSV']),
83
+ huella: registros?.[0]?.huella,
84
+ registros: registros,
85
+ };
86
+ }
87
+ /** Mapea un registro de la respuesta de consulta (con `DatosRegistroFacturacion`). */
88
+ function mapRegistroConsulta(raw) {
89
+ const datos = (raw['DatosRegistroFacturacion'] ?? raw);
90
+ const estado = (raw['EstadoRegistro'] ?? {});
91
+ return {
92
+ estadoRegistro: str(estado['EstadoRegistro']),
93
+ huella: str(datos['Huella']),
94
+ fechaHoraHusoGenRegistro: str(datos['FechaHoraHusoGenRegistro']),
95
+ idFactura: str(raw['IDFactura']),
96
+ };
97
+ }
98
+ function mapEvento(opBody) {
99
+ if (!opBody)
100
+ return undefined;
101
+ return {
102
+ estadoEvento: str(opBody['EstadoEvento']),
103
+ codigoErrorEvento: str(opBody['CodigoErrorEvento']),
104
+ descripcionErrorEvento: str(opBody['DescripcionErrorEvento']),
105
+ csv: str(opBody['CSV']),
106
+ huella: str(opBody['Huella']),
107
+ };
108
+ }
109
+ function str(value) {
110
+ if (value === undefined || value === null)
111
+ return undefined;
112
+ return String(value);
113
+ }
114
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/aeat/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA2E5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;IACzB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,IAAI;CACjB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,mEAAmE;IACnE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAA4B,CAAC;IAC3E,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAA4B,CAAC;IAEvE,mDAAmD;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAwC,CAAC;IAEtE,MAAM,MAAM,GAAiB;QAC3B,SAAS;QACT,IAAI,EAAE,CAAC,MAAM,IAAI,IAAI,CAA4B;KAClD,CAAC;IAEF,qCAAqC;IACrC,IAAI,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,MAA2C;IAC9D,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAA4B,CAAC;IAC5E,OAAO;QACL,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;QACzC,mBAAmB,EAAE,GAAG,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC;QACnD,wBAAwB,EAAE,GAAG,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC;QAC7D,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACzB,wBAAwB,EAAE,GAAG,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC;QAC7D,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAA2C;IAC9D,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,2FAA2F;IAC3F,uDAAuD;IACvD,MAAM,YAAY,GAChB,MAAM,CAAC,kDAAkD,CAAC;QAC1D,MAAM,CAAC,iBAAiB,CAAC;QACzB,MAAM,CAAC,WAAW,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAC3C,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAA4B,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAC5F,CAAC,CAAC,YAAY;YACZ,CAAC,CAAC,CAAC,mBAAmB,CAAC,YAAuC,CAAC,CAAC;YAChE,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACvC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACjD,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM;QAC9B,SAAS,EAAE,SAA2C;KACvD,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,SAAS,mBAAmB,CAC1B,GAA4B;IAE5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,GAAG,CAA4B,CAAC;IAClF,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxE,OAAO;QACL,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,wBAAwB,EAAE,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChE,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAA2C;IAC5D,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO;QACL,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACnD,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAC7D,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Calcula el hash SHA-256 de un dato en hexadecimal MAYÚSCULA.
3
+ * Verifactu exige el hash en hexadecimal en mayúsculas (64 caracteres).
4
+ */
5
+ export declare function sha256(data: string | Buffer): string;
6
+ /**
7
+ * Concatena los campos de un registro en el formato Verifactu:
8
+ * `nombreCampo1=valor1&nombreCampo2=valor2&...`
9
+ *
10
+ * Reglas de normalización (AEAT):
11
+ * - Se eliminan los espacios al inicio y final de cada valor (trim).
12
+ * - Los campos vacíos o ausentes se incluyen como `nombreCampo=` (sin valor).
13
+ * - No se aplica URL-encoding ni escaping a caracteres especiales.
14
+ */
15
+ export declare function concatenateFields(fields: Array<[string, string | null | undefined]>): string;
16
+ /**
17
+ * Campos de un registro de alta (RegistroAlta) para el cálculo de la huella.
18
+ */
19
+ export interface RegistroAltaInput {
20
+ /** Identificador del emisor (NIF). */
21
+ idEmisorFactura: string;
22
+ /** Número y serie de la factura. */
23
+ numSerieFactura: string;
24
+ /** Fecha de expedición de la factura. */
25
+ fechaExpedicionFactura: string;
26
+ /** Tipo de factura (F1, F2, ...). */
27
+ tipoFactura: string;
28
+ /** Cuota total. */
29
+ cuotaTotal: string;
30
+ /** Importe total. */
31
+ importeTotal: string;
32
+ /** Huella (hash) del registro anterior, o null para el primero. */
33
+ huellaAnterior: string | null;
34
+ /** Fecha/hora de generación con huso horario. */
35
+ fechaHoraHusoGenRegistro: string;
36
+ }
37
+ /**
38
+ * Campos de un registro de anulación (RegistroAnulacion).
39
+ */
40
+ export interface RegistroAnulacionInput {
41
+ /** Identificador del emisor de la factura anulada. */
42
+ idEmisorFacturaAnulada: string;
43
+ /** Número y serie de la factura anulada. */
44
+ numSerieFacturaAnulada: string;
45
+ /** Fecha de expedición de la factura anulada. */
46
+ fechaExpedicionFacturaAnulada: string;
47
+ /** Huella (hash) del registro anterior. */
48
+ huellaAnterior: string | null;
49
+ /** Fecha/hora de generación con huso horario. */
50
+ fechaHoraHusoGenRegistro: string;
51
+ }
52
+ /**
53
+ * Construye la cadena canónica a hashear de un registro de alta.
54
+ */
55
+ export declare function concatenateRegistroAlta(input: RegistroAltaInput): string;
56
+ /**
57
+ * Construye la cadena canónica a hashear de un registro de anulación.
58
+ */
59
+ export declare function concatenateRegistroAnulacion(input: RegistroAnulacionInput): string;
60
+ /**
61
+ * Calcula la huella (hash) de un registro de alta.
62
+ */
63
+ export declare function computeRegistroAlta(input: RegistroAltaInput): string;
64
+ /**
65
+ * Calcula la huella (hash) de un registro de anulación.
66
+ */
67
+ export declare function computeRegistroAnulacion(input: RegistroAnulacionInput): string;
68
+ /**
69
+ * Verifica que el hash de un registro de alta coincide con el esperado.
70
+ */
71
+ export declare function verifyRegistroAlta(input: RegistroAltaInput, expectedHash: string): boolean;
72
+ /**
73
+ * Verifica que el hash de un registro de anulación coincide con el esperado.
74
+ */
75
+ export declare function verifyRegistroAnulacion(input: RegistroAnulacionInput, expectedHash: string): boolean;
76
+ /**
77
+ * Campos de un registro de evento (RegistroEvento).
78
+ *
79
+ * Nota: el nombre `NIF` aparece DOS veces (posiciones 1 y 6): una para el
80
+ * sistema informático y otra para el obligado a emitir.
81
+ */
82
+ export interface RegistroEventoInput {
83
+ /** NIF del sistema informático (NIF, posición 1). */
84
+ nifSistemaInformatico: string;
85
+ /** Identificador del evento (ID). */
86
+ id: string;
87
+ /** Identificador del sistema informático. */
88
+ idSistemaInformatico: string;
89
+ /** Versión del sistema informático. */
90
+ version: string;
91
+ /** Número de instalación. */
92
+ numeroInstalacion: string;
93
+ /** NIF del obligado a emitir (NIF, posición 6). */
94
+ nifObligado: string;
95
+ /** Tipo de evento. */
96
+ tipoEvento: string;
97
+ /** Huella (hash) del registro anterior, o null para el primero. */
98
+ huellaAnterior: string | null;
99
+ /** Fecha/hora de generación con huso horario. */
100
+ fechaHoraHusoGenEvento: string;
101
+ }
102
+ /**
103
+ * Construye la cadena canónica a hashear de un registro de evento.
104
+ */
105
+ export declare function concatenateRegistroEvento(input: RegistroEventoInput): string;
106
+ /**
107
+ * Calcula la huella (hash) de un registro de evento.
108
+ */
109
+ export declare function computeRegistroEvento(input: RegistroEventoInput): string;
110
+ /**
111
+ * Verifica que el hash de un registro de evento coincide con el esperado.
112
+ */
113
+ export declare function verifyRegistroEvento(input: RegistroEventoInput, expectedHash: string): boolean;
114
+ /**
115
+ * Cadena de hash con estado, para encadenar registros de forma secuencial.
116
+ */
117
+ export declare class HashChain {
118
+ private _lastHash;
119
+ private _count;
120
+ /** Hash del último registro encadenado, o `null` si aún no hay ninguno. */
121
+ get lastHash(): string | null;
122
+ /** Número de registros encadenados hasta ahora. */
123
+ get count(): number;
124
+ /**
125
+ * Encadena un nuevo registro de alta y devuelve su huella.
126
+ */
127
+ pushAlta(input: Omit<RegistroAltaInput, 'huellaAnterior'>): string;
128
+ /**
129
+ * Encadena un nuevo registro de anulación y devuelve su huella.
130
+ */
131
+ pushAnulacion(input: Omit<RegistroAnulacionInput, 'huellaAnterior'>): string;
132
+ /**
133
+ * Encadena un nuevo registro de evento y devuelve su huella.
134
+ */
135
+ pushEvento(input: Omit<RegistroEventoInput, 'huellaAnterior'>): string;
136
+ /** Reinicia la cadena. */
137
+ reset(): void;
138
+ }
139
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../../../src/core/hash/chain.ts"],"names":[],"mappings":"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"}