@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,44 @@
1
+ import { AccountabilityService } from './accountability.js';
2
+ import type { VerifactuRepository } from './repository.js';
3
+ /**
4
+ * Carga el `.p12` y el NIF de un tenant desde la base de datos.
5
+ * Lo implementa la aplicación (cada app decide cómo guarda el `.p12`).
6
+ */
7
+ export interface TenantP12Loader {
8
+ /** Devuelve el contenido del `.p12` de un tenant. */
9
+ getP12(tenantId: string): Promise<Buffer>;
10
+ /** Devuelve el NIF del tenant. */
11
+ getNif(tenantId: string): Promise<string>;
12
+ }
13
+ /**
14
+ * Almacén de credenciales por tenant.
15
+ *
16
+ * La contraseña del `.p12` se pide UNA vez al iniciar el proceso de
17
+ * facturación y se cachea en memoria (nunca se guarda en la BD). El `.p12`
18
+ * se carga de la BD por tenant, y el `AccountabilityService` se crea con la
19
+ * contraseña cacheada.
20
+ */
21
+ export declare class TenantCredentialStore {
22
+ private readonly loader;
23
+ private readonly baseUrl;
24
+ private readonly repository;
25
+ /** Contraseñas cacheadas en memoria por tenant. */
26
+ private readonly passwords;
27
+ constructor(loader: TenantP12Loader, baseUrl: string, repository: VerifactuRepository);
28
+ /**
29
+ * Establece la contraseña de un tenant (se pide una vez al iniciar).
30
+ */
31
+ setPassword(tenantId: string, password: string): void;
32
+ /**
33
+ * Devuelve el `AccountabilityService` de un tenant, usando la contraseña
34
+ * cacheada y el `.p12` cargado de la BD.
35
+ */
36
+ getService(tenantId: string): Promise<AccountabilityService>;
37
+ /**
38
+ * Limpia la contraseña cacheada de un tenant (p. ej. al cerrar sesión).
39
+ */
40
+ clear(tenantId: string): void;
41
+ /** Limpia todas las contraseñas cacheadas. */
42
+ clearAll(): void;
43
+ }
44
+ //# sourceMappingURL=tenant-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-credentials.d.ts","sourceRoot":"","sources":["../../../src/integration/tenant-credentials.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,kCAAkC;IAClC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN7B,mDAAmD;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAGpC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,mBAAmB;IAGlD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD;;;OAGG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAmBlE;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B,8CAA8C;IAC9C,QAAQ,IAAI,IAAI;CAGjB"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TenantCredentialStore = void 0;
4
+ const accountability_js_1 = require("./accountability.js");
5
+ /**
6
+ * Almacén de credenciales por tenant.
7
+ *
8
+ * La contraseña del `.p12` se pide UNA vez al iniciar el proceso de
9
+ * facturación y se cachea en memoria (nunca se guarda en la BD). El `.p12`
10
+ * se carga de la BD por tenant, y el `AccountabilityService` se crea con la
11
+ * contraseña cacheada.
12
+ */
13
+ class TenantCredentialStore {
14
+ loader;
15
+ baseUrl;
16
+ repository;
17
+ /** Contraseñas cacheadas en memoria por tenant. */
18
+ passwords = new Map();
19
+ constructor(loader, baseUrl, repository) {
20
+ this.loader = loader;
21
+ this.baseUrl = baseUrl;
22
+ this.repository = repository;
23
+ }
24
+ /**
25
+ * Establece la contraseña de un tenant (se pide una vez al iniciar).
26
+ */
27
+ setPassword(tenantId, password) {
28
+ this.passwords.set(tenantId, password);
29
+ }
30
+ /**
31
+ * Devuelve el `AccountabilityService` de un tenant, usando la contraseña
32
+ * cacheada y el `.p12` cargado de la BD.
33
+ */
34
+ async getService(tenantId) {
35
+ const password = this.passwords.get(tenantId);
36
+ if (!password) {
37
+ throw new Error(`No hay contraseña cacheada para el tenant ${tenantId}. Llama a setPassword primero.`);
38
+ }
39
+ const [p12Buffer, nif] = await Promise.all([
40
+ this.loader.getP12(tenantId),
41
+ this.loader.getNif(tenantId),
42
+ ]);
43
+ return new accountability_js_1.AccountabilityService(this.repository, {
44
+ baseUrl: this.baseUrl,
45
+ nif,
46
+ p12Buffer,
47
+ p12Password: password,
48
+ });
49
+ }
50
+ /**
51
+ * Limpia la contraseña cacheada de un tenant (p. ej. al cerrar sesión).
52
+ */
53
+ clear(tenantId) {
54
+ this.passwords.delete(tenantId);
55
+ }
56
+ /** Limpia todas las contraseñas cacheadas. */
57
+ clearAll() {
58
+ this.passwords.clear();
59
+ }
60
+ }
61
+ exports.TenantCredentialStore = TenantCredentialStore;
62
+ //# sourceMappingURL=tenant-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-credentials.js","sourceRoot":"","sources":["../../../src/integration/tenant-credentials.ts"],"names":[],"mappings":";;;AACA,2DAA4D;AAc5D;;;;;;;GAOG;AACH,MAAa,qBAAqB;IAKb;IACA;IACA;IANnB,mDAAmD;IAClC,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD,YACmB,MAAuB,EACvB,OAAe,EACf,UAA+B;QAF/B,WAAM,GAAN,MAAM,CAAiB;QACvB,YAAO,GAAP,OAAO,CAAQ;QACf,eAAU,GAAV,UAAU,CAAqB;IAC/C,CAAC;IAEJ;;OAEG;IACH,WAAW,CAAC,QAAgB,EAAE,QAAgB;QAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,6CAA6C,QAAQ,gCAAgC,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC7B,CAAC,CAAC;QAEH,OAAO,IAAI,yCAAqB,CAAC,IAAI,CAAC,UAAU,EAAE;YAChD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG;YACH,SAAS;YACT,WAAW,EAAE,QAAQ;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAgB;QACpB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,8CAA8C;IAC9C,QAAQ;QACN,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAnDD,sDAmDC"}
@@ -1,3 +1,52 @@
1
+ import { type SoapResponse, type RegistroResponse, type ConsultaResponse, type EventoResponse } from './response.js';
2
+ /**
3
+ * URL base del servicio AEAT en PRODUCCIÓN (Verifactu v1.0).
4
+ * Fuente: Veri-Factu_Descripcion_SWeb.pdf (Anexo I, entorno de producción).
5
+ */
6
+ export declare const AEAT_PRODUCTION_BASE_URL = "https://www2.agenciatributaria.gob.es";
7
+ /**
8
+ * URL base del servicio AEAT en PRUEBAS/desarrollo (Verifactu v1.0).
9
+ * Fuente: Veri-Factu_Descripcion_SWeb.pdf (Anexo I, entorno de pruebas).
10
+ */
11
+ export declare const AEAT_TEST_BASE_URL = "https://prewww2.aeat.es";
12
+ /**
13
+ * Ruta del WSDL del servicio SistemaFacturacion (Verifactu v1.0).
14
+ */
15
+ export declare const AEAT_WSDL_PATH = "/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/SistemaFacturacion.wsdl";
16
+ /**
17
+ * Endpoint SOAP de remisión voluntaria (VerifactuSOAP).
18
+ * - Producción: `https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP`
19
+ * - Pruebas: `https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP`
20
+ */
21
+ export declare const AEAT_PRODUCTION_SOAP_URL = "https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP";
22
+ export declare const AEAT_TEST_SOAP_URL = "https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP";
23
+ /**
24
+ * Endpoint SOAP de remisión bajo requerimiento (RequerimientoSOAP).
25
+ */
26
+ export declare const AEAT_PRODUCTION_REQUERIMIENTO_URL = "https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/RequerimientoSOAP";
27
+ export declare const AEAT_TEST_REQUERIMIENTO_URL = "https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/RequerimientoSOAP";
28
+ /**
29
+ * Operación SOAP de alta/anulación de registros.
30
+ */
31
+ export declare const AEAT_OPERATION_REGISTRO = "RegFactuSistemaFacturacion";
32
+ /**
33
+ * Operación SOAP de consulta.
34
+ */
35
+ export declare const AEAT_OPERATION_CONSULTA = "ConsultaFactuSistemaFacturacion";
36
+ /**
37
+ * Namespace del servicio (targetNamespace del WSDL).
38
+ */
39
+ export declare const AEAT_SOAP_NAMESPACE = "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl";
40
+ /**
41
+ * Namespace del elemento de consulta (`ConsultaLR.xsd`).
42
+ */
43
+ export declare const AEAT_CONSULTA_NAMESPACE = "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/ConsultaLR.xsd";
44
+ /**
45
+ * Entorno de ejecución del cliente AEAT.
46
+ * - `production`: usa la URL de producción.
47
+ * - `test` / `development`: usa la URL de pruebas (si se aporta).
48
+ */
49
+ export type VerifactuEnv = 'production' | 'test' | 'development';
1
50
  /**
2
51
  * Cliente para los servicios web de AEAT (Verifactu).
3
52
  *
@@ -5,23 +54,40 @@
5
54
  * (producción vs. pruebas), por lo que no debe acoplarse a la lógica de
6
55
  * negocio.
7
56
  *
8
- * NOTA: los endpoints y el formato de petición/respuesta deben ajustarse a
9
- * la documentación oficial de la AEAT (remisión voluntaria / bajo
10
- * requerimiento). Este cliente expone una implementación base con `fetch`
11
- * y rutas configurables.
57
+ * Soporta autenticación por certificado digital (mTLS): se pasan `cert` y
58
+ * `key` (PEM) extraídos de un `.p12` (ver `readP12` en `integration/p12.ts`).
12
59
  */
13
60
  export interface VerifactuClientConfig {
14
- /** URL base del servicio AEAT. */
15
- baseUrl: string;
16
- /** Token de autenticación (OAuth) o certificado. */
61
+ /** URL del endpoint SOAP del servicio AEAT en PRODUCCIÓN. */
62
+ baseUrl?: string;
63
+ /** URL del endpoint SOAP del servicio AEAT en PRUEBAS/desarrollo. */
64
+ testBaseUrl?: string;
65
+ /** Entorno de ejecución. Si no es `production`, se usa `testBaseUrl`. */
66
+ env?: VerifactuEnv;
67
+ /** Token de autenticación (OAuth) alternativo al certificado. */
17
68
  authToken?: string;
18
- /** Ruta del endpoint de envío de registros. */
19
- sendPath?: string;
20
- /** Ruta del endpoint de consulta de estado. */
21
- statusPath?: string;
69
+ /** Certificado de cliente en PEM (mTLS). */
70
+ cert?: string;
71
+ /** Clave privada del cliente en PEM (mTLS). */
72
+ key?: string;
73
+ /** Operación SOAP (por defecto `RegFactuSistemaFacturacion`). */
74
+ operation?: string;
75
+ /** Namespace del servicio SOAP. */
76
+ namespace?: string;
22
77
  /** Timeout de petición en ms. */
23
78
  timeoutMs?: number;
24
79
  }
80
+ /**
81
+ * Resuelve la URL base efectiva según el entorno.
82
+ *
83
+ * Regla: **por defecto se usa producción** (la app real factura en prod).
84
+ * - Si `env` es `production` (o no se indica), usa `baseUrl`.
85
+ * - Si `env` es `test`/`development`, usa `testBaseUrl`.
86
+ *
87
+ * Los tests se ejecutan aparte y fijan `env: 'test'` + `testBaseUrl` para
88
+ * usar desarrollo (sin necesidad de indicar la URL de producción).
89
+ */
90
+ export declare function resolveBaseUrl(config: Pick<VerifactuClientConfig, 'baseUrl' | 'testBaseUrl' | 'env'>): string;
25
91
  export interface SendResult {
26
92
  /** Identificador de la operación devuelto por AEAT. */
27
93
  operationId: string;
@@ -33,24 +99,59 @@ export interface SendResult {
33
99
  errorCode?: string;
34
100
  /** Cuerpo completo de la respuesta (para auditoría). */
35
101
  rawResponse?: string;
102
+ /** Respuesta completa parseada de AEAT (todo lo recibido, OK o error). */
103
+ data?: Record<string, unknown>;
104
+ /** Respuesta SOAP normalizada a JSON (XML → JSON). */
105
+ response?: SoapResponse;
106
+ /** Respuesta tipada de registro (si la operación es de registro). */
107
+ registro?: RegistroResponse;
108
+ /** Respuesta tipada de consulta (si la operación es de consulta). */
109
+ consulta?: ConsultaResponse;
110
+ /** Respuesta tipada de evento (si la operación es de evento). */
111
+ evento?: EventoResponse;
36
112
  }
37
113
  /**
38
114
  * Cliente de servicios AEAT para Verifactu.
39
115
  */
40
116
  export declare class VerifactuClient {
41
117
  private readonly config;
118
+ private readonly agent;
42
119
  constructor(config: VerifactuClientConfig);
43
120
  /**
44
- * Envía un registro (factura o evento) a AEAT.
121
+ * Envía un registro (factura o evento) a AEAT mediante SOAP.
45
122
  */
46
123
  sendRecord(xml: string): Promise<SendResult>;
47
124
  /**
48
- * Consulta el estado de una operación enviada.
125
+ * Consulta un registro de facturación por número de factura y devuelve la
126
+ * respuesta completa (incluida la huella confirmada por AEAT).
127
+ *
128
+ * Usa la operación `ConsultaFactuSistemaFacturacion` (mismo endpoint SOAP).
129
+ */
130
+ queryInvoice(params: {
131
+ /** Obligado a la emisión (quien consulta). */
132
+ obligado: {
133
+ nombreRazon: string;
134
+ nif: string;
135
+ };
136
+ /** Nº serie + nº factura a consultar (opcional: consulta por periodo). */
137
+ numSerieFactura?: string;
138
+ /** Ejercicio (año) del periodo de imputación, p. ej. `2026`. */
139
+ ejercicio: string;
140
+ /** Periodo de imputación, p. ej. `01` (enero) o `12` (diciembre). */
141
+ periodo: string;
142
+ /** Clave de paginación devuelta por AEAT en la página anterior (cursor). */
143
+ clavePaginacion?: string;
144
+ }): Promise<SendResult>;
145
+ /**
146
+ * Realiza la petición HTTPS usando el agente (con mTLS si hay certificado).
49
147
  */
50
- getOperationStatus(operationId: string): Promise<SendResult>;
148
+ private request;
51
149
  /**
52
150
  * Parsea la respuesta de AEAT. La estructura exacta depende del servicio;
53
151
  * este es un mapeo base que el consumidor puede sobrescribir.
152
+ *
153
+ * Devuelve SIEMPRE todo lo recibido: la respuesta completa parseada en
154
+ * `data` y el cuerpo crudo en `rawResponse`, tanto si es OK como error.
54
155
  */
55
156
  protected parseResponse(raw: string, httpStatus: number): SendResult;
56
157
  }
@@ -1 +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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/aeat/client.ts"],"names":[],"mappings":"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"}
@@ -1,87 +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
+ }
1
69
  /**
2
70
  * Cliente de servicios AEAT para Verifactu.
3
71
  */
4
72
  export class VerifactuClient {
5
73
  config;
74
+ agent;
6
75
  constructor(config) {
7
76
  this.config = {
8
- sendPath: '/verifactu/registro',
9
- statusPath: '/verifactu/estado',
77
+ operation: AEAT_OPERATION_REGISTRO,
78
+ namespace: AEAT_SOAP_NAMESPACE,
10
79
  timeoutMs: 10_000,
11
80
  ...config,
81
+ baseUrl: resolveBaseUrl(config),
12
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);
13
87
  }
14
88
  /**
15
- * Envía un registro (factura o evento) a AEAT.
89
+ * Envía un registro (factura o evento) a AEAT mediante SOAP.
16
90
  */
17
91
  async sendRecord(xml) {
18
- const url = `${this.config.baseUrl}${this.config.sendPath}`;
92
+ const envelope = buildRemisionEnvelope(xml);
93
+ const url = new URL(this.config.baseUrl);
19
94
  const headers = {
20
- 'Content-Type': 'application/xml',
21
- Accept: 'application/json',
95
+ 'Content-Type': 'text/xml; charset=utf-8',
96
+ SOAPAction: '',
97
+ Accept: 'application/xml',
22
98
  };
23
99
  if (this.config.authToken) {
24
100
  headers.Authorization = `Bearer ${this.config.authToken}`;
25
101
  }
26
- const controller = new AbortController();
27
- const timer = setTimeout(() => controller.abort(), this.config.timeoutMs);
28
- try {
29
- const res = await fetch(url, {
30
- method: 'POST',
31
- headers,
32
- body: xml,
33
- signal: controller.signal,
34
- });
35
- const raw = await res.text();
36
- return this.parseResponse(raw, res.status);
37
- }
38
- finally {
39
- clearTimeout(timer);
40
- }
102
+ return this.request(url, 'POST', headers, envelope);
41
103
  }
42
104
  /**
43
- * Consulta el estado de una operación enviada.
105
+ * Consulta un registro de facturación por número de factura y devuelve la
106
+ * respuesta completa (incluida la huella confirmada por AEAT).
107
+ *
108
+ * Usa la operación `ConsultaFactuSistemaFacturacion` (mismo endpoint SOAP).
44
109
  */
45
- async getOperationStatus(operationId) {
46
- const url = `${this.config.baseUrl}${this.config.statusPath}/${encodeURIComponent(operationId)}`;
47
- const headers = { Accept: 'application/json' };
110
+ async queryInvoice(params) {
111
+ const consultaXml = [
112
+ `<sfLRC:ConsultaFactuSistemaFacturacion xmlns:sfLRC="${AEAT_CONSULTA_NAMESPACE}" xmlns:sf="${AEAT_INFORMACION_NAMESPACE}">`,
113
+ ' <sfLRC:Cabecera>',
114
+ ' <sf:IDVersion>1.0</sf:IDVersion>',
115
+ ' <sf:ObligadoEmision>',
116
+ ` <sf:NombreRazon>${params.obligado.nombreRazon}</sf:NombreRazon>`,
117
+ ` <sf:NIF>${params.obligado.nif}</sf:NIF>`,
118
+ ' </sf:ObligadoEmision>',
119
+ ' </sfLRC:Cabecera>',
120
+ ' <sfLRC:FiltroConsulta>',
121
+ ' <sfLRC:PeriodoImputacion>',
122
+ ` <sf:Ejercicio>${params.ejercicio}</sf:Ejercicio>`,
123
+ ` <sf:Periodo>${params.periodo}</sf:Periodo>`,
124
+ ' </sfLRC:PeriodoImputacion>',
125
+ ...(params.numSerieFactura
126
+ ? [` <sfLRC:NumSerieFactura>${params.numSerieFactura}</sfLRC:NumSerieFactura>`]
127
+ : []),
128
+ ...(params.clavePaginacion
129
+ ? [` <sfLRC:ClavePaginacion>${params.clavePaginacion}</sfLRC:ClavePaginacion>`]
130
+ : []),
131
+ ' </sfLRC:FiltroConsulta>',
132
+ '</sfLRC:ConsultaFactuSistemaFacturacion>',
133
+ ].join('\n');
134
+ const envelope = buildRemisionEnvelope(consultaXml);
135
+ const url = new URL(this.config.baseUrl);
136
+ const headers = {
137
+ 'Content-Type': 'text/xml; charset=utf-8',
138
+ SOAPAction: '',
139
+ Accept: 'application/xml',
140
+ };
48
141
  if (this.config.authToken) {
49
142
  headers.Authorization = `Bearer ${this.config.authToken}`;
50
143
  }
51
- const controller = new AbortController();
52
- const timer = setTimeout(() => controller.abort(), this.config.timeoutMs);
53
- try {
54
- const res = await fetch(url, { method: 'GET', headers, signal: controller.signal });
55
- const raw = await res.text();
56
- return this.parseResponse(raw, res.status);
57
- }
58
- finally {
59
- clearTimeout(timer);
60
- }
144
+ return this.request(url, 'POST', headers, envelope);
145
+ }
146
+ /**
147
+ * Realiza la petición HTTPS usando el agente (con mTLS si hay certificado).
148
+ */
149
+ request(url, method, headers, body) {
150
+ return new Promise((resolve, reject) => {
151
+ const req = https.request({
152
+ hostname: url.hostname,
153
+ port: url.port || 443,
154
+ path: `${url.pathname}${url.search}`,
155
+ method,
156
+ headers,
157
+ agent: this.agent,
158
+ }, (res) => {
159
+ let raw = '';
160
+ res.setEncoding('utf8');
161
+ res.on('data', (chunk) => {
162
+ raw += chunk;
163
+ });
164
+ res.on('end', () => {
165
+ resolve(this.parseResponse(raw, res.statusCode ?? 0));
166
+ });
167
+ });
168
+ req.on('error', reject);
169
+ req.setTimeout(this.config.timeoutMs, () => {
170
+ req.destroy(new Error(`Timeout tras ${this.config.timeoutMs}ms`));
171
+ });
172
+ if (body) {
173
+ req.write(body);
174
+ }
175
+ req.end();
176
+ });
61
177
  }
62
178
  /**
63
179
  * Parsea la respuesta de AEAT. La estructura exacta depende del servicio;
64
180
  * este es un mapeo base que el consumidor puede sobrescribir.
181
+ *
182
+ * Devuelve SIEMPRE todo lo recibido: la respuesta completa parseada en
183
+ * `data` y el cuerpo crudo en `rawResponse`, tanto si es OK como error.
65
184
  */
66
185
  parseResponse(raw, httpStatus) {
67
186
  let operationId = '';
68
187
  let status = httpStatus >= 200 && httpStatus < 300 ? 'OK' : 'ERROR';
69
188
  let message;
70
189
  let errorCode;
71
- try {
72
- const json = JSON.parse(raw);
73
- operationId = String(json.operationId ?? json.id ?? '');
74
- if (json.status === 'OK' || json.status === 'ERROR') {
75
- status = json.status;
190
+ let data;
191
+ let response;
192
+ // AEAT responde en SOAP/XML: se normaliza a JSON.
193
+ const soap = parseSoapResponse(raw);
194
+ if (soap) {
195
+ response = soap;
196
+ data = soap.body;
197
+ operationId = String(soap.body['ID'] ?? soap.body['IdPeticion'] ?? '');
198
+ // SOAP Fault: AEAT devolvió un error técnico (HTTP 200 con <Fault>).
199
+ const faultString = String(soap.body['faultstring'] ?? '');
200
+ if (soap.operation === 'Fault' || faultString) {
201
+ status = 'ERROR';
202
+ message = faultString || message;
203
+ errorCode = String(soap.body['faultcode'] ?? '') || errorCode;
204
+ return {
205
+ operationId,
206
+ status,
207
+ message,
208
+ errorCode,
209
+ rawResponse: raw,
210
+ data,
211
+ response,
212
+ };
213
+ }
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';
76
221
  }
77
- message = json.message;
78
- errorCode = json.errorCode;
222
+ errorCode = reg?.codigoErrorRegistro ?? con?.codigoError ?? ev?.codigoErrorEvento;
223
+ message =
224
+ reg?.descripcionErrorRegistro ??
225
+ con?.descripcionError ??
226
+ ev?.descripcionErrorEvento ??
227
+ estado;
79
228
  }
80
- catch {
81
- // Respuesta no JSON: se conserva el cuerpo como mensaje.
82
- message = raw;
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
+ }
83
244
  }
84
- return { operationId, status, message, errorCode, rawResponse: raw };
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
+ };
85
257
  }
86
258
  }
87
259
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/aeat/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/aeat/client.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  export * from './client.js';
2
+ export * from './response.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/aeat/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/aeat/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from './client.js';
2
+ export * from './response.js';
2
3
  //# sourceMappingURL=index.js.map