@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.
- package/dist/cjs/aeat/client.d.ts +162 -0
- package/dist/cjs/aeat/client.d.ts.map +1 -0
- package/dist/cjs/aeat/client.js +267 -0
- package/dist/cjs/aeat/client.js.map +1 -0
- package/dist/cjs/aeat/index.d.ts +3 -0
- package/dist/cjs/aeat/index.d.ts.map +1 -0
- package/dist/cjs/aeat/index.js +19 -0
- package/dist/cjs/aeat/index.js.map +1 -0
- package/dist/cjs/aeat/response.d.ts +78 -0
- package/dist/cjs/aeat/response.d.ts.map +1 -0
- package/dist/cjs/aeat/response.js +117 -0
- package/dist/cjs/aeat/response.js.map +1 -0
- package/dist/{core → cjs/core}/hash/chain.d.ts +42 -0
- package/dist/cjs/core/hash/chain.d.ts.map +1 -0
- package/dist/cjs/core/hash/chain.js +167 -0
- package/dist/cjs/core/hash/chain.js.map +1 -0
- package/dist/cjs/core/hash/index.d.ts.map +1 -0
- package/dist/cjs/core/hash/index.js +18 -0
- package/dist/cjs/core/hash/index.js.map +1 -0
- package/dist/{core → cjs/core}/index.d.ts +2 -0
- package/dist/cjs/core/index.d.ts.map +1 -0
- package/dist/cjs/core/index.js +23 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/core/models/event.d.ts.map +1 -0
- package/dist/cjs/core/models/event.js +3 -0
- package/dist/{core → cjs/core}/models/event.js.map +1 -1
- package/dist/cjs/core/models/index.d.ts.map +1 -0
- package/dist/cjs/core/models/index.js +19 -0
- package/dist/cjs/core/models/index.js.map +1 -0
- package/dist/{core → cjs/core}/models/invoice.d.ts +42 -17
- package/dist/cjs/core/models/invoice.d.ts.map +1 -0
- package/dist/cjs/core/models/invoice.js +3 -0
- package/dist/{core → cjs/core}/models/invoice.js.map +1 -1
- package/dist/cjs/core/qr/index.d.ts.map +1 -0
- package/dist/cjs/core/qr/index.js +18 -0
- package/dist/cjs/core/qr/index.js.map +1 -0
- package/dist/cjs/core/qr/qr.d.ts.map +1 -0
- package/dist/cjs/core/qr/qr.js +19 -0
- package/dist/cjs/core/qr/qr.js.map +1 -0
- package/dist/cjs/core/utils/date.d.ts +16 -0
- package/dist/cjs/core/utils/date.d.ts.map +1 -0
- package/dist/cjs/core/utils/date.js +27 -0
- package/dist/cjs/core/utils/date.js.map +1 -0
- package/dist/cjs/core/utils/index.d.ts +2 -0
- package/dist/cjs/core/utils/index.d.ts.map +1 -0
- package/dist/cjs/core/utils/index.js +18 -0
- package/dist/cjs/core/utils/index.js.map +1 -0
- package/dist/cjs/core/validation/index.d.ts +2 -0
- package/dist/cjs/core/validation/index.d.ts.map +1 -0
- package/dist/cjs/core/validation/index.js +18 -0
- package/dist/cjs/core/validation/index.js.map +1 -0
- package/dist/cjs/core/validation/validate.d.ts +18 -0
- package/dist/cjs/core/validation/validate.d.ts.map +1 -0
- package/dist/cjs/core/validation/validate.js +65 -0
- package/dist/cjs/core/validation/validate.js.map +1 -0
- package/dist/cjs/core/xml/generator.d.ts +140 -0
- package/dist/cjs/core/xml/generator.d.ts.map +1 -0
- package/dist/cjs/core/xml/generator.js +269 -0
- package/dist/cjs/core/xml/generator.js.map +1 -0
- package/dist/cjs/core/xml/index.d.ts.map +1 -0
- package/dist/cjs/core/xml/index.js +18 -0
- package/dist/cjs/core/xml/index.js.map +1 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/integration/accountability.d.ts +41 -0
- package/dist/cjs/integration/accountability.d.ts.map +1 -0
- package/dist/cjs/integration/accountability.js +92 -0
- package/dist/cjs/integration/accountability.js.map +1 -0
- package/dist/cjs/integration/index.d.ts +5 -0
- package/dist/cjs/integration/index.d.ts.map +1 -0
- package/dist/cjs/integration/index.js +21 -0
- package/dist/cjs/integration/index.js.map +1 -0
- package/dist/cjs/integration/p12.d.ts +58 -0
- package/dist/cjs/integration/p12.d.ts.map +1 -0
- package/dist/cjs/integration/p12.js +127 -0
- package/dist/cjs/integration/p12.js.map +1 -0
- package/dist/{integration → cjs/integration}/repository.d.ts +2 -0
- package/dist/cjs/integration/repository.d.ts.map +1 -0
- package/dist/cjs/integration/repository.js +3 -0
- package/dist/cjs/integration/repository.js.map +1 -0
- package/dist/{integration → cjs/integration}/service.d.ts +11 -2
- package/dist/cjs/integration/service.d.ts.map +1 -0
- package/dist/cjs/integration/service.js +230 -0
- package/dist/cjs/integration/service.js.map +1 -0
- package/dist/cjs/integration/tenant-credentials.d.ts +44 -0
- package/dist/cjs/integration/tenant-credentials.d.ts.map +1 -0
- package/dist/cjs/integration/tenant-credentials.js +62 -0
- package/dist/cjs/integration/tenant-credentials.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/esm/aeat/client.d.ts +162 -0
- package/dist/esm/aeat/client.d.ts.map +1 -0
- package/dist/esm/aeat/client.js +259 -0
- package/dist/esm/aeat/client.js.map +1 -0
- package/dist/esm/aeat/index.d.ts +3 -0
- package/dist/esm/aeat/index.d.ts.map +1 -0
- package/dist/esm/aeat/index.js +3 -0
- package/dist/esm/aeat/index.js.map +1 -0
- package/dist/esm/aeat/response.d.ts +78 -0
- package/dist/esm/aeat/response.d.ts.map +1 -0
- package/dist/esm/aeat/response.js +114 -0
- package/dist/esm/aeat/response.js.map +1 -0
- package/dist/esm/core/hash/chain.d.ts +139 -0
- package/dist/esm/core/hash/chain.d.ts.map +1 -0
- package/dist/{core → esm/core}/hash/chain.js +37 -0
- package/dist/esm/core/hash/chain.js.map +1 -0
- package/dist/esm/core/hash/index.d.ts +2 -0
- package/dist/esm/core/hash/index.d.ts.map +1 -0
- package/dist/esm/core/hash/index.js.map +1 -0
- package/dist/esm/core/index.d.ts +7 -0
- package/dist/esm/core/index.d.ts.map +1 -0
- package/dist/{core → esm/core}/index.js +2 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/models/event.d.ts +25 -0
- package/dist/esm/core/models/event.d.ts.map +1 -0
- package/dist/esm/core/models/event.js.map +1 -0
- package/dist/esm/core/models/index.d.ts +3 -0
- package/dist/esm/core/models/index.d.ts.map +1 -0
- package/dist/esm/core/models/index.js.map +1 -0
- package/dist/esm/core/models/invoice.d.ts +115 -0
- package/dist/esm/core/models/invoice.d.ts.map +1 -0
- package/dist/esm/core/models/invoice.js.map +1 -0
- package/dist/esm/core/qr/index.d.ts +2 -0
- package/dist/esm/core/qr/index.d.ts.map +1 -0
- package/dist/esm/core/qr/index.js.map +1 -0
- package/dist/esm/core/qr/qr.d.ts +13 -0
- package/dist/esm/core/qr/qr.d.ts.map +1 -0
- package/dist/esm/core/qr/qr.js.map +1 -0
- package/dist/esm/core/utils/date.d.ts +16 -0
- package/dist/esm/core/utils/date.d.ts.map +1 -0
- package/dist/esm/core/utils/date.js +24 -0
- package/dist/esm/core/utils/date.js.map +1 -0
- package/dist/esm/core/utils/index.d.ts +2 -0
- package/dist/esm/core/utils/index.d.ts.map +1 -0
- package/dist/esm/core/utils/index.js +2 -0
- package/dist/esm/core/utils/index.js.map +1 -0
- package/dist/esm/core/validation/index.d.ts +2 -0
- package/dist/esm/core/validation/index.d.ts.map +1 -0
- package/dist/esm/core/validation/index.js +2 -0
- package/dist/esm/core/validation/index.js.map +1 -0
- package/dist/esm/core/validation/validate.d.ts +18 -0
- package/dist/esm/core/validation/validate.d.ts.map +1 -0
- package/dist/esm/core/validation/validate.js +62 -0
- package/dist/esm/core/validation/validate.js.map +1 -0
- package/dist/esm/core/xml/generator.d.ts +140 -0
- package/dist/esm/core/xml/generator.d.ts.map +1 -0
- package/dist/esm/core/xml/generator.js +259 -0
- package/dist/esm/core/xml/generator.js.map +1 -0
- package/dist/esm/core/xml/index.d.ts +2 -0
- package/dist/esm/core/xml/index.d.ts.map +1 -0
- package/dist/esm/core/xml/index.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/integration/accountability.d.ts +41 -0
- package/dist/esm/integration/accountability.d.ts.map +1 -0
- package/dist/esm/integration/accountability.js +88 -0
- package/dist/esm/integration/accountability.js.map +1 -0
- package/dist/esm/integration/index.d.ts +5 -0
- package/dist/esm/integration/index.d.ts.map +1 -0
- package/dist/esm/integration/index.js +5 -0
- package/dist/esm/integration/index.js.map +1 -0
- package/dist/esm/integration/p12.d.ts +58 -0
- package/dist/esm/integration/p12.d.ts.map +1 -0
- package/dist/esm/integration/p12.js +119 -0
- package/dist/esm/integration/p12.js.map +1 -0
- package/dist/esm/integration/repository.d.ts +79 -0
- package/dist/esm/integration/repository.d.ts.map +1 -0
- package/dist/esm/integration/repository.js.map +1 -0
- package/dist/esm/integration/service.d.ts +45 -0
- package/dist/esm/integration/service.d.ts.map +1 -0
- package/dist/{integration → esm/integration}/service.js +101 -15
- package/dist/esm/integration/service.js.map +1 -0
- package/dist/esm/integration/tenant-credentials.d.ts +44 -0
- package/dist/esm/integration/tenant-credentials.d.ts.map +1 -0
- package/dist/esm/integration/tenant-credentials.js +58 -0
- package/dist/esm/integration/tenant-credentials.js.map +1 -0
- package/package.json +45 -13
- package/readme.md +566 -42
- package/src/aeat/client.ts +296 -55
- package/src/aeat/index.ts +1 -0
- package/src/aeat/response.ts +195 -0
- package/src/core/hash/chain.ts +68 -0
- package/src/core/index.ts +2 -0
- package/src/core/models/invoice.ts +40 -18
- package/src/core/utils/date.ts +27 -0
- package/src/core/utils/index.ts +1 -0
- package/src/core/validation/index.ts +1 -0
- package/src/core/validation/validate.ts +71 -0
- package/src/core/xml/generator.ts +306 -73
- package/src/integration/accountability.ts +125 -0
- package/src/integration/index.ts +2 -0
- package/src/integration/p12.ts +155 -0
- package/src/integration/repository.ts +2 -0
- package/src/integration/service.ts +113 -14
- package/dist/aeat/client.d.ts +0 -57
- package/dist/aeat/client.d.ts.map +0 -1
- package/dist/aeat/client.js +0 -87
- package/dist/aeat/client.js.map +0 -1
- package/dist/aeat/index.d.ts +0 -2
- package/dist/aeat/index.d.ts.map +0 -1
- package/dist/aeat/index.js +0 -2
- package/dist/aeat/index.js.map +0 -1
- package/dist/core/hash/chain.d.ts.map +0 -1
- package/dist/core/hash/chain.js.map +0 -1
- package/dist/core/hash/index.d.ts.map +0 -1
- package/dist/core/hash/index.js.map +0 -1
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js.map +0 -1
- package/dist/core/models/event.d.ts.map +0 -1
- package/dist/core/models/index.d.ts.map +0 -1
- package/dist/core/models/index.js.map +0 -1
- package/dist/core/models/invoice.d.ts.map +0 -1
- package/dist/core/qr/index.d.ts.map +0 -1
- package/dist/core/qr/index.js.map +0 -1
- package/dist/core/qr/qr.d.ts.map +0 -1
- package/dist/core/qr/qr.js.map +0 -1
- package/dist/core/xml/generator.d.ts +0 -32
- package/dist/core/xml/generator.d.ts.map +0 -1
- package/dist/core/xml/generator.js +0 -103
- package/dist/core/xml/generator.js.map +0 -1
- package/dist/core/xml/index.d.ts.map +0 -1
- package/dist/core/xml/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integration/index.d.ts +0 -3
- package/dist/integration/index.d.ts.map +0 -1
- package/dist/integration/index.js +0 -3
- package/dist/integration/index.js.map +0 -1
- package/dist/integration/repository.d.ts.map +0 -1
- package/dist/integration/repository.js.map +0 -1
- package/dist/integration/service.d.ts.map +0 -1
- package/dist/integration/service.js.map +0 -1
- /package/dist/{core → cjs/core}/hash/index.d.ts +0 -0
- /package/dist/{core → cjs/core}/models/event.d.ts +0 -0
- /package/dist/{core → cjs/core}/models/index.d.ts +0 -0
- /package/dist/{core → cjs/core}/qr/index.d.ts +0 -0
- /package/dist/{core → cjs/core}/qr/qr.d.ts +0 -0
- /package/dist/{core → cjs/core}/xml/index.d.ts +0 -0
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{core → esm/core}/hash/index.js +0 -0
- /package/dist/{core → esm/core}/models/event.js +0 -0
- /package/dist/{core → esm/core}/models/index.js +0 -0
- /package/dist/{core → esm/core}/models/invoice.js +0 -0
- /package/dist/{core → esm/core}/qr/index.js +0 -0
- /package/dist/{core → esm/core}/qr/qr.js +0 -0
- /package/dist/{core → esm/core}/xml/index.js +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{integration → esm/integration}/repository.js +0 -0
|
@@ -0,0 +1,162 @@
|
|
|
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';
|
|
50
|
+
/**
|
|
51
|
+
* Cliente para los servicios web de AEAT (Verifactu).
|
|
52
|
+
*
|
|
53
|
+
* Capa de red, separada del núcleo puro. Depende de credenciales y entornos
|
|
54
|
+
* (producción vs. pruebas), por lo que no debe acoplarse a la lógica de
|
|
55
|
+
* negocio.
|
|
56
|
+
*
|
|
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`).
|
|
59
|
+
*/
|
|
60
|
+
export interface VerifactuClientConfig {
|
|
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. */
|
|
68
|
+
authToken?: 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;
|
|
77
|
+
/** Timeout de petición en ms. */
|
|
78
|
+
timeoutMs?: number;
|
|
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;
|
|
91
|
+
export interface SendResult {
|
|
92
|
+
/** Identificador de la operación devuelto por AEAT. */
|
|
93
|
+
operationId: string;
|
|
94
|
+
/** Estado de la respuesta. */
|
|
95
|
+
status: 'OK' | 'ERROR';
|
|
96
|
+
/** Mensaje de la AEAT. */
|
|
97
|
+
message?: string;
|
|
98
|
+
/** Código de error de AEAT (si lo hay). */
|
|
99
|
+
errorCode?: string;
|
|
100
|
+
/** Cuerpo completo de la respuesta (para auditoría). */
|
|
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;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Cliente de servicios AEAT para Verifactu.
|
|
115
|
+
*/
|
|
116
|
+
export declare class VerifactuClient {
|
|
117
|
+
private readonly config;
|
|
118
|
+
private readonly agent;
|
|
119
|
+
constructor(config: VerifactuClientConfig);
|
|
120
|
+
/**
|
|
121
|
+
* Envía un registro (factura o evento) a AEAT mediante SOAP.
|
|
122
|
+
*/
|
|
123
|
+
sendRecord(xml: string): Promise<SendResult>;
|
|
124
|
+
/**
|
|
125
|
+
* @deprecated La consulta por ID de operación no está soportada por el
|
|
126
|
+
* esquema `ConsultaLR.xsd` de AEAT (devuelve error 4118). Usa
|
|
127
|
+
* {@link queryInvoice} para consultar registros por número de factura.
|
|
128
|
+
*/
|
|
129
|
+
getOperationStatus(operationId: string): Promise<SendResult>;
|
|
130
|
+
/**
|
|
131
|
+
* Consulta un registro de facturación por número de factura y devuelve la
|
|
132
|
+
* respuesta completa (incluida la huella confirmada por AEAT).
|
|
133
|
+
*
|
|
134
|
+
* Usa la operación `ConsultaFactuSistemaFacturacion` (mismo endpoint SOAP).
|
|
135
|
+
*/
|
|
136
|
+
queryInvoice(params: {
|
|
137
|
+
/** Obligado a la emisión (quien consulta). */
|
|
138
|
+
obligado: {
|
|
139
|
+
nombreRazon: string;
|
|
140
|
+
nif: string;
|
|
141
|
+
};
|
|
142
|
+
/** Nº serie + nº factura a consultar (opcional: consulta por periodo). */
|
|
143
|
+
numSerieFactura?: string;
|
|
144
|
+
/** Ejercicio (año) del periodo de imputación, p. ej. `2026`. */
|
|
145
|
+
ejercicio: string;
|
|
146
|
+
/** Periodo de imputación, p. ej. `01` (enero) o `12` (diciembre). */
|
|
147
|
+
periodo: string;
|
|
148
|
+
}): Promise<SendResult>;
|
|
149
|
+
/**
|
|
150
|
+
* Realiza la petición HTTPS usando el agente (con mTLS si hay certificado).
|
|
151
|
+
*/
|
|
152
|
+
private request;
|
|
153
|
+
/**
|
|
154
|
+
* Parsea la respuesta de AEAT. La estructura exacta depende del servicio;
|
|
155
|
+
* este es un mapeo base que el consumidor puede sobrescribir.
|
|
156
|
+
*
|
|
157
|
+
* Devuelve SIEMPRE todo lo recibido: la respuesta completa parseada en
|
|
158
|
+
* `data` y el cuerpo crudo en `rawResponse`, tanto si es OK como error.
|
|
159
|
+
*/
|
|
160
|
+
protected parseResponse(raw: string, httpStatus: number): SendResult;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/aeat/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VerifactuClient = exports.AEAT_CONSULTA_NAMESPACE = exports.AEAT_SOAP_NAMESPACE = exports.AEAT_OPERATION_CONSULTA = exports.AEAT_OPERATION_REGISTRO = exports.AEAT_TEST_REQUERIMIENTO_URL = exports.AEAT_PRODUCTION_REQUERIMIENTO_URL = exports.AEAT_TEST_SOAP_URL = exports.AEAT_PRODUCTION_SOAP_URL = exports.AEAT_WSDL_PATH = exports.AEAT_TEST_BASE_URL = exports.AEAT_PRODUCTION_BASE_URL = void 0;
|
|
7
|
+
exports.resolveBaseUrl = resolveBaseUrl;
|
|
8
|
+
const node_https_1 = __importDefault(require("node:https"));
|
|
9
|
+
const generator_js_1 = require("../core/xml/generator.js");
|
|
10
|
+
const response_js_1 = require("./response.js");
|
|
11
|
+
/**
|
|
12
|
+
* URL base del servicio AEAT en PRODUCCIÓN (Verifactu v1.0).
|
|
13
|
+
* Fuente: Veri-Factu_Descripcion_SWeb.pdf (Anexo I, entorno de producción).
|
|
14
|
+
*/
|
|
15
|
+
exports.AEAT_PRODUCTION_BASE_URL = 'https://www2.agenciatributaria.gob.es';
|
|
16
|
+
/**
|
|
17
|
+
* URL base del servicio AEAT en PRUEBAS/desarrollo (Verifactu v1.0).
|
|
18
|
+
* Fuente: Veri-Factu_Descripcion_SWeb.pdf (Anexo I, entorno de pruebas).
|
|
19
|
+
*/
|
|
20
|
+
exports.AEAT_TEST_BASE_URL = 'https://prewww2.aeat.es';
|
|
21
|
+
/**
|
|
22
|
+
* Ruta del WSDL del servicio SistemaFacturacion (Verifactu v1.0).
|
|
23
|
+
*/
|
|
24
|
+
exports.AEAT_WSDL_PATH = '/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/SistemaFacturacion.wsdl';
|
|
25
|
+
/**
|
|
26
|
+
* Endpoint SOAP de remisión voluntaria (VerifactuSOAP).
|
|
27
|
+
* - Producción: `https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP`
|
|
28
|
+
* - Pruebas: `https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP`
|
|
29
|
+
*/
|
|
30
|
+
exports.AEAT_PRODUCTION_SOAP_URL = 'https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP';
|
|
31
|
+
exports.AEAT_TEST_SOAP_URL = 'https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP';
|
|
32
|
+
/**
|
|
33
|
+
* Endpoint SOAP de remisión bajo requerimiento (RequerimientoSOAP).
|
|
34
|
+
*/
|
|
35
|
+
exports.AEAT_PRODUCTION_REQUERIMIENTO_URL = 'https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/RequerimientoSOAP';
|
|
36
|
+
exports.AEAT_TEST_REQUERIMIENTO_URL = 'https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/RequerimientoSOAP';
|
|
37
|
+
/**
|
|
38
|
+
* Operación SOAP de alta/anulación de registros.
|
|
39
|
+
*/
|
|
40
|
+
exports.AEAT_OPERATION_REGISTRO = 'RegFactuSistemaFacturacion';
|
|
41
|
+
/**
|
|
42
|
+
* Operación SOAP de consulta.
|
|
43
|
+
*/
|
|
44
|
+
exports.AEAT_OPERATION_CONSULTA = 'ConsultaFactuSistemaFacturacion';
|
|
45
|
+
/**
|
|
46
|
+
* Namespace del servicio (targetNamespace del WSDL).
|
|
47
|
+
*/
|
|
48
|
+
exports.AEAT_SOAP_NAMESPACE = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl';
|
|
49
|
+
/**
|
|
50
|
+
* Namespace del elemento de consulta (`ConsultaLR.xsd`).
|
|
51
|
+
*/
|
|
52
|
+
exports.AEAT_CONSULTA_NAMESPACE = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/ConsultaLR.xsd';
|
|
53
|
+
/**
|
|
54
|
+
* Resuelve la URL base efectiva según el entorno.
|
|
55
|
+
*
|
|
56
|
+
* Regla: **por defecto se usa producción** (la app real factura en prod).
|
|
57
|
+
* - Si `env` es `production` (o no se indica), usa `baseUrl`.
|
|
58
|
+
* - Si `env` es `test`/`development`, usa `testBaseUrl`.
|
|
59
|
+
*
|
|
60
|
+
* Los tests se ejecutan aparte y fijan `env: 'test'` + `testBaseUrl` para
|
|
61
|
+
* usar desarrollo (sin necesidad de indicar la URL de producción).
|
|
62
|
+
*/
|
|
63
|
+
function resolveBaseUrl(config) {
|
|
64
|
+
const env = config.env ?? 'production';
|
|
65
|
+
if (env !== 'production') {
|
|
66
|
+
if (config.testBaseUrl) {
|
|
67
|
+
return config.testBaseUrl;
|
|
68
|
+
}
|
|
69
|
+
throw new Error('env no es "production" y no se ha proporcionado testBaseUrl.');
|
|
70
|
+
}
|
|
71
|
+
if (!config.baseUrl) {
|
|
72
|
+
throw new Error('env es "production" y no se ha proporcionado baseUrl.');
|
|
73
|
+
}
|
|
74
|
+
return config.baseUrl;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Cliente de servicios AEAT para Verifactu.
|
|
78
|
+
*/
|
|
79
|
+
class VerifactuClient {
|
|
80
|
+
config;
|
|
81
|
+
agent;
|
|
82
|
+
constructor(config) {
|
|
83
|
+
this.config = {
|
|
84
|
+
operation: exports.AEAT_OPERATION_REGISTRO,
|
|
85
|
+
namespace: exports.AEAT_SOAP_NAMESPACE,
|
|
86
|
+
timeoutMs: 10_000,
|
|
87
|
+
...config,
|
|
88
|
+
baseUrl: resolveBaseUrl(config),
|
|
89
|
+
};
|
|
90
|
+
// Si hay certificado y clave, se usan en el handshake TLS (mTLS).
|
|
91
|
+
this.agent = new node_https_1.default.Agent(this.config.cert && this.config.key
|
|
92
|
+
? { cert: this.config.cert, key: this.config.key }
|
|
93
|
+
: undefined);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Envía un registro (factura o evento) a AEAT mediante SOAP.
|
|
97
|
+
*/
|
|
98
|
+
async sendRecord(xml) {
|
|
99
|
+
const envelope = (0, generator_js_1.buildRemisionEnvelope)(xml);
|
|
100
|
+
const url = new URL(this.config.baseUrl);
|
|
101
|
+
const headers = {
|
|
102
|
+
'Content-Type': 'text/xml; charset=utf-8',
|
|
103
|
+
SOAPAction: '',
|
|
104
|
+
Accept: 'application/xml',
|
|
105
|
+
};
|
|
106
|
+
if (this.config.authToken) {
|
|
107
|
+
headers.Authorization = `Bearer ${this.config.authToken}`;
|
|
108
|
+
}
|
|
109
|
+
return this.request(url, 'POST', headers, envelope);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* @deprecated La consulta por ID de operación no está soportada por el
|
|
113
|
+
* esquema `ConsultaLR.xsd` de AEAT (devuelve error 4118). Usa
|
|
114
|
+
* {@link queryInvoice} para consultar registros por número de factura.
|
|
115
|
+
*/
|
|
116
|
+
async getOperationStatus(operationId) {
|
|
117
|
+
const consultaXml = `<ConsultaFactuSistemaFacturacion xmlns="${this.config.namespace}"><ID>${operationId}</ID></ConsultaFactuSistemaFacturacion>`;
|
|
118
|
+
const envelope = (0, generator_js_1.buildRemisionEnvelope)(consultaXml);
|
|
119
|
+
const url = new URL(this.config.baseUrl);
|
|
120
|
+
const headers = {
|
|
121
|
+
'Content-Type': 'text/xml; charset=utf-8',
|
|
122
|
+
SOAPAction: '',
|
|
123
|
+
Accept: 'application/xml',
|
|
124
|
+
};
|
|
125
|
+
if (this.config.authToken) {
|
|
126
|
+
headers.Authorization = `Bearer ${this.config.authToken}`;
|
|
127
|
+
}
|
|
128
|
+
return this.request(url, 'POST', headers, envelope);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Consulta un registro de facturación por número de factura y devuelve la
|
|
132
|
+
* respuesta completa (incluida la huella confirmada por AEAT).
|
|
133
|
+
*
|
|
134
|
+
* Usa la operación `ConsultaFactuSistemaFacturacion` (mismo endpoint SOAP).
|
|
135
|
+
*/
|
|
136
|
+
async queryInvoice(params) {
|
|
137
|
+
const consultaXml = [
|
|
138
|
+
`<sfLRC:ConsultaFactuSistemaFacturacion xmlns:sfLRC="${exports.AEAT_CONSULTA_NAMESPACE}" xmlns:sf="${generator_js_1.AEAT_INFORMACION_NAMESPACE}">`,
|
|
139
|
+
' <sfLRC:Cabecera>',
|
|
140
|
+
' <sf:IDVersion>1.0</sf:IDVersion>',
|
|
141
|
+
' <sf:ObligadoEmision>',
|
|
142
|
+
` <sf:NombreRazon>${params.obligado.nombreRazon}</sf:NombreRazon>`,
|
|
143
|
+
` <sf:NIF>${params.obligado.nif}</sf:NIF>`,
|
|
144
|
+
' </sf:ObligadoEmision>',
|
|
145
|
+
' </sfLRC:Cabecera>',
|
|
146
|
+
' <sfLRC:FiltroConsulta>',
|
|
147
|
+
' <sfLRC:PeriodoImputacion>',
|
|
148
|
+
` <sf:Ejercicio>${params.ejercicio}</sf:Ejercicio>`,
|
|
149
|
+
` <sf:Periodo>${params.periodo}</sf:Periodo>`,
|
|
150
|
+
' </sfLRC:PeriodoImputacion>',
|
|
151
|
+
...(params.numSerieFactura
|
|
152
|
+
? [` <sfLRC:NumSerieFactura>${params.numSerieFactura}</sfLRC:NumSerieFactura>`]
|
|
153
|
+
: []),
|
|
154
|
+
' </sfLRC:FiltroConsulta>',
|
|
155
|
+
'</sfLRC:ConsultaFactuSistemaFacturacion>',
|
|
156
|
+
].join('\n');
|
|
157
|
+
const envelope = (0, generator_js_1.buildRemisionEnvelope)(consultaXml);
|
|
158
|
+
const url = new URL(this.config.baseUrl);
|
|
159
|
+
const headers = {
|
|
160
|
+
'Content-Type': 'text/xml; charset=utf-8',
|
|
161
|
+
SOAPAction: '',
|
|
162
|
+
Accept: 'application/xml',
|
|
163
|
+
};
|
|
164
|
+
if (this.config.authToken) {
|
|
165
|
+
headers.Authorization = `Bearer ${this.config.authToken}`;
|
|
166
|
+
}
|
|
167
|
+
return this.request(url, 'POST', headers, envelope);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Realiza la petición HTTPS usando el agente (con mTLS si hay certificado).
|
|
171
|
+
*/
|
|
172
|
+
request(url, method, headers, body) {
|
|
173
|
+
return new Promise((resolve, reject) => {
|
|
174
|
+
const req = node_https_1.default.request({
|
|
175
|
+
hostname: url.hostname,
|
|
176
|
+
port: url.port || 443,
|
|
177
|
+
path: `${url.pathname}${url.search}`,
|
|
178
|
+
method,
|
|
179
|
+
headers,
|
|
180
|
+
agent: this.agent,
|
|
181
|
+
}, (res) => {
|
|
182
|
+
let raw = '';
|
|
183
|
+
res.setEncoding('utf8');
|
|
184
|
+
res.on('data', (chunk) => {
|
|
185
|
+
raw += chunk;
|
|
186
|
+
});
|
|
187
|
+
res.on('end', () => {
|
|
188
|
+
resolve(this.parseResponse(raw, res.statusCode ?? 0));
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
req.on('error', reject);
|
|
192
|
+
req.setTimeout(this.config.timeoutMs, () => {
|
|
193
|
+
req.destroy(new Error(`Timeout tras ${this.config.timeoutMs}ms`));
|
|
194
|
+
});
|
|
195
|
+
if (body) {
|
|
196
|
+
req.write(body);
|
|
197
|
+
}
|
|
198
|
+
req.end();
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Parsea la respuesta de AEAT. La estructura exacta depende del servicio;
|
|
203
|
+
* este es un mapeo base que el consumidor puede sobrescribir.
|
|
204
|
+
*
|
|
205
|
+
* Devuelve SIEMPRE todo lo recibido: la respuesta completa parseada en
|
|
206
|
+
* `data` y el cuerpo crudo en `rawResponse`, tanto si es OK como error.
|
|
207
|
+
*/
|
|
208
|
+
parseResponse(raw, httpStatus) {
|
|
209
|
+
let operationId = '';
|
|
210
|
+
let status = httpStatus >= 200 && httpStatus < 300 ? 'OK' : 'ERROR';
|
|
211
|
+
let message;
|
|
212
|
+
let errorCode;
|
|
213
|
+
let data;
|
|
214
|
+
let response;
|
|
215
|
+
// AEAT responde en SOAP/XML: se normaliza a JSON.
|
|
216
|
+
const soap = (0, response_js_1.parseSoapResponse)(raw);
|
|
217
|
+
if (soap) {
|
|
218
|
+
response = soap;
|
|
219
|
+
data = soap.body;
|
|
220
|
+
operationId = String(soap.body['ID'] ?? soap.body['IdPeticion'] ?? '');
|
|
221
|
+
// Estado según el registro/consulta/evento mapeado.
|
|
222
|
+
const reg = soap.registro;
|
|
223
|
+
const con = soap.consulta;
|
|
224
|
+
const ev = soap.evento;
|
|
225
|
+
const estado = reg?.estadoRegistro ?? con?.estado ?? ev?.estadoEvento;
|
|
226
|
+
if (estado) {
|
|
227
|
+
status = /OK|ACEPTAD|CONFIRMAD|CORRECT/i.test(estado) ? 'OK' : 'ERROR';
|
|
228
|
+
}
|
|
229
|
+
errorCode = reg?.codigoErrorRegistro ?? con?.codigoError ?? ev?.codigoErrorEvento;
|
|
230
|
+
message =
|
|
231
|
+
reg?.descripcionErrorRegistro ??
|
|
232
|
+
con?.descripcionError ??
|
|
233
|
+
ev?.descripcionErrorEvento ??
|
|
234
|
+
estado;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
// Respuesta no XML/JSON: se conserva el cuerpo como mensaje.
|
|
238
|
+
try {
|
|
239
|
+
const json = JSON.parse(raw);
|
|
240
|
+
data = json;
|
|
241
|
+
operationId = String(json.operationId ?? json.id ?? '');
|
|
242
|
+
if (json.status === 'OK' || json.status === 'ERROR') {
|
|
243
|
+
status = json.status;
|
|
244
|
+
}
|
|
245
|
+
message = json.message;
|
|
246
|
+
errorCode = json.errorCode;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
message = raw;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
operationId,
|
|
254
|
+
status,
|
|
255
|
+
message,
|
|
256
|
+
errorCode,
|
|
257
|
+
rawResponse: raw,
|
|
258
|
+
data,
|
|
259
|
+
response,
|
|
260
|
+
registro: response?.registro,
|
|
261
|
+
consulta: response?.consulta,
|
|
262
|
+
evento: response?.evento,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
exports.VerifactuClient = VerifactuClient;
|
|
267
|
+
//# 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;AAC5B,cAAc,eAAe,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("./client.js"), exports);
|
|
18
|
+
__exportStar(require("./response.js"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/aeat/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,gDAA8B"}
|
|
@@ -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"}
|