@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,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseSoapResponse = parseSoapResponse;
|
|
4
|
+
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
5
|
+
const parser = new fast_xml_parser_1.XMLParser({
|
|
6
|
+
ignoreAttributes: false,
|
|
7
|
+
attributeNamePrefix: '@_',
|
|
8
|
+
removeNSPrefix: true,
|
|
9
|
+
parseTagValue: false,
|
|
10
|
+
trimValues: true,
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Convierte un XML SOAP de AEAT a un objeto JSON normalizado.
|
|
14
|
+
*
|
|
15
|
+
* Extrae el body del sobre SOAP y mapea los campos a las interfaces tipadas
|
|
16
|
+
* (`RegistroResponse`, `ConsultaResponse`, `EventoResponse`). Si el XML no
|
|
17
|
+
* es parseable, devuelve `null`.
|
|
18
|
+
*/
|
|
19
|
+
function parseSoapResponse(xml) {
|
|
20
|
+
// Solo procesar si parece XML (evita parsear JSON u otros textos).
|
|
21
|
+
if (typeof xml !== 'string' || !xml.trim().startsWith('<')) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = parser.parse(xml);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// Navegar hasta el body del sobre SOAP (removeNSPrefix elimina el prefijo).
|
|
32
|
+
const envelope = (parsed['Envelope'] ?? parsed);
|
|
33
|
+
const body = (envelope['Body'] ?? envelope);
|
|
34
|
+
// El body contiene un único elemento de operación.
|
|
35
|
+
const keys = Object.keys(body).filter((k) => k !== 'Body');
|
|
36
|
+
const operation = keys[0] ?? '';
|
|
37
|
+
const opBody = body[operation];
|
|
38
|
+
const result = {
|
|
39
|
+
operation,
|
|
40
|
+
body: (opBody ?? body),
|
|
41
|
+
};
|
|
42
|
+
// Mapear según el tipo de operación.
|
|
43
|
+
if (/RegFactu|Registro/i.test(operation)) {
|
|
44
|
+
result.registro = mapRegistro(opBody);
|
|
45
|
+
}
|
|
46
|
+
else if (/Consulta/i.test(operation)) {
|
|
47
|
+
result.consulta = mapConsulta(opBody);
|
|
48
|
+
}
|
|
49
|
+
else if (/Evento/i.test(operation)) {
|
|
50
|
+
result.evento = mapEvento(opBody);
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
function mapRegistro(opBody) {
|
|
55
|
+
if (!opBody)
|
|
56
|
+
return undefined;
|
|
57
|
+
const rf = (opBody['RegistroFactura'] ?? opBody);
|
|
58
|
+
return {
|
|
59
|
+
estadoRegistro: str(rf['EstadoRegistro']),
|
|
60
|
+
codigoErrorRegistro: str(rf['CodigoErrorRegistro']),
|
|
61
|
+
descripcionErrorRegistro: str(rf['DescripcionErrorRegistro']),
|
|
62
|
+
csv: str(rf['CSV']),
|
|
63
|
+
huella: str(rf['Huella']),
|
|
64
|
+
fechaHoraHusoGenRegistro: str(rf['FechaHoraHusoGenRegistro']),
|
|
65
|
+
idFactura: str(rf['IDFactura']),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function mapConsulta(opBody) {
|
|
69
|
+
if (!opBody)
|
|
70
|
+
return undefined;
|
|
71
|
+
// La consulta devuelve los registros en `RegistroRespuestaConsultaFactuSistemaFacturacion`
|
|
72
|
+
// (o `RegistroFactura`/`Registros` en otros formatos).
|
|
73
|
+
const registrosRaw = opBody['RegistroRespuestaConsultaFactuSistemaFacturacion'] ??
|
|
74
|
+
opBody['RegistroFactura'] ??
|
|
75
|
+
opBody['Registros'];
|
|
76
|
+
const registros = Array.isArray(registrosRaw)
|
|
77
|
+
? registrosRaw.map((r) => mapRegistroConsulta(r)).filter(Boolean)
|
|
78
|
+
: registrosRaw
|
|
79
|
+
? [mapRegistroConsulta(registrosRaw)]
|
|
80
|
+
: undefined;
|
|
81
|
+
return {
|
|
82
|
+
estado: str(opBody['Estado']),
|
|
83
|
+
codigoError: str(opBody['CodigoError']),
|
|
84
|
+
descripcionError: str(opBody['DescripcionError']),
|
|
85
|
+
csv: str(opBody['CSV']),
|
|
86
|
+
huella: registros?.[0]?.huella,
|
|
87
|
+
registros: registros,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Mapea un registro de la respuesta de consulta (con `DatosRegistroFacturacion`). */
|
|
91
|
+
function mapRegistroConsulta(raw) {
|
|
92
|
+
const datos = (raw['DatosRegistroFacturacion'] ?? raw);
|
|
93
|
+
const estado = (raw['EstadoRegistro'] ?? {});
|
|
94
|
+
return {
|
|
95
|
+
estadoRegistro: str(estado['EstadoRegistro']),
|
|
96
|
+
huella: str(datos['Huella']),
|
|
97
|
+
fechaHoraHusoGenRegistro: str(datos['FechaHoraHusoGenRegistro']),
|
|
98
|
+
idFactura: str(raw['IDFactura']),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function mapEvento(opBody) {
|
|
102
|
+
if (!opBody)
|
|
103
|
+
return undefined;
|
|
104
|
+
return {
|
|
105
|
+
estadoEvento: str(opBody['EstadoEvento']),
|
|
106
|
+
codigoErrorEvento: str(opBody['CodigoErrorEvento']),
|
|
107
|
+
descripcionErrorEvento: str(opBody['DescripcionErrorEvento']),
|
|
108
|
+
csv: str(opBody['CSV']),
|
|
109
|
+
huella: str(opBody['Huella']),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function str(value) {
|
|
113
|
+
if (value === undefined || value === null)
|
|
114
|
+
return undefined;
|
|
115
|
+
return String(value);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/aeat/response.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,6 +73,44 @@ export declare function verifyRegistroAlta(input: RegistroAltaInput, expectedHas
|
|
|
73
73
|
* Verifica que el hash de un registro de anulación coincide con el esperado.
|
|
74
74
|
*/
|
|
75
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;
|
|
76
114
|
/**
|
|
77
115
|
* Cadena de hash con estado, para encadenar registros de forma secuencial.
|
|
78
116
|
*/
|
|
@@ -91,6 +129,10 @@ export declare class HashChain {
|
|
|
91
129
|
* Encadena un nuevo registro de anulación y devuelve su huella.
|
|
92
130
|
*/
|
|
93
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;
|
|
94
136
|
/** Reinicia la cadena. */
|
|
95
137
|
reset(): void;
|
|
96
138
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../../../src/core/hash/chain.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAO5F;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iDAAiD;IACjD,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,4CAA4C;IAC5C,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,6BAA6B,EAAE,MAAM,CAAC;IACtC,2CAA2C;IAC3C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iDAAiD;IACjD,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAWxE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAQlF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAEpE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAE1F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAET;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iDAAiD;IACjD,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAY5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAExE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAE9F;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAK;IAEnB,2EAA2E;IAC3E,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,mDAAmD;IACnD,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,MAAM;IAOlE;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,GAAG,MAAM;IAO5E;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,GAAG,MAAM;IAOtE,0BAA0B;IAC1B,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HashChain = void 0;
|
|
4
|
+
exports.sha256 = sha256;
|
|
5
|
+
exports.concatenateFields = concatenateFields;
|
|
6
|
+
exports.concatenateRegistroAlta = concatenateRegistroAlta;
|
|
7
|
+
exports.concatenateRegistroAnulacion = concatenateRegistroAnulacion;
|
|
8
|
+
exports.computeRegistroAlta = computeRegistroAlta;
|
|
9
|
+
exports.computeRegistroAnulacion = computeRegistroAnulacion;
|
|
10
|
+
exports.verifyRegistroAlta = verifyRegistroAlta;
|
|
11
|
+
exports.verifyRegistroAnulacion = verifyRegistroAnulacion;
|
|
12
|
+
exports.concatenateRegistroEvento = concatenateRegistroEvento;
|
|
13
|
+
exports.computeRegistroEvento = computeRegistroEvento;
|
|
14
|
+
exports.verifyRegistroEvento = verifyRegistroEvento;
|
|
15
|
+
const node_crypto_1 = require("node:crypto");
|
|
16
|
+
/**
|
|
17
|
+
* Calcula el hash SHA-256 de un dato en hexadecimal MAYÚSCULA.
|
|
18
|
+
* Verifactu exige el hash en hexadecimal en mayúsculas (64 caracteres).
|
|
19
|
+
*/
|
|
20
|
+
function sha256(data) {
|
|
21
|
+
return (0, node_crypto_1.createHash)('sha256').update(data).digest('hex').toUpperCase();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Concatena los campos de un registro en el formato Verifactu:
|
|
25
|
+
* `nombreCampo1=valor1&nombreCampo2=valor2&...`
|
|
26
|
+
*
|
|
27
|
+
* Reglas de normalización (AEAT):
|
|
28
|
+
* - Se eliminan los espacios al inicio y final de cada valor (trim).
|
|
29
|
+
* - Los campos vacíos o ausentes se incluyen como `nombreCampo=` (sin valor).
|
|
30
|
+
* - No se aplica URL-encoding ni escaping a caracteres especiales.
|
|
31
|
+
*/
|
|
32
|
+
function concatenateFields(fields) {
|
|
33
|
+
return fields
|
|
34
|
+
.map(([name, value]) => {
|
|
35
|
+
const trimmed = value ? value.trim() : '';
|
|
36
|
+
return `${name}=${trimmed}`;
|
|
37
|
+
})
|
|
38
|
+
.join('&');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Construye la cadena canónica a hashear de un registro de alta.
|
|
42
|
+
*/
|
|
43
|
+
function concatenateRegistroAlta(input) {
|
|
44
|
+
return concatenateFields([
|
|
45
|
+
['IDEmisorFactura', input.idEmisorFactura],
|
|
46
|
+
['NumSerieFactura', input.numSerieFactura],
|
|
47
|
+
['FechaExpedicionFactura', input.fechaExpedicionFactura],
|
|
48
|
+
['TipoFactura', input.tipoFactura],
|
|
49
|
+
['CuotaTotal', input.cuotaTotal],
|
|
50
|
+
['ImporteTotal', input.importeTotal],
|
|
51
|
+
['Huella', input.huellaAnterior],
|
|
52
|
+
['FechaHoraHusoGenRegistro', input.fechaHoraHusoGenRegistro],
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Construye la cadena canónica a hashear de un registro de anulación.
|
|
57
|
+
*/
|
|
58
|
+
function concatenateRegistroAnulacion(input) {
|
|
59
|
+
return concatenateFields([
|
|
60
|
+
['IDEmisorFacturaAnulada', input.idEmisorFacturaAnulada],
|
|
61
|
+
['NumSerieFacturaAnulada', input.numSerieFacturaAnulada],
|
|
62
|
+
['FechaExpedicionFacturaAnulada', input.fechaExpedicionFacturaAnulada],
|
|
63
|
+
['Huella', input.huellaAnterior],
|
|
64
|
+
['FechaHoraHusoGenRegistro', input.fechaHoraHusoGenRegistro],
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Calcula la huella (hash) de un registro de alta.
|
|
69
|
+
*/
|
|
70
|
+
function computeRegistroAlta(input) {
|
|
71
|
+
return sha256(concatenateRegistroAlta(input));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Calcula la huella (hash) de un registro de anulación.
|
|
75
|
+
*/
|
|
76
|
+
function computeRegistroAnulacion(input) {
|
|
77
|
+
return sha256(concatenateRegistroAnulacion(input));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Verifica que el hash de un registro de alta coincide con el esperado.
|
|
81
|
+
*/
|
|
82
|
+
function verifyRegistroAlta(input, expectedHash) {
|
|
83
|
+
return computeRegistroAlta(input).toLowerCase() === expectedHash.toLowerCase();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Verifica que el hash de un registro de anulación coincide con el esperado.
|
|
87
|
+
*/
|
|
88
|
+
function verifyRegistroAnulacion(input, expectedHash) {
|
|
89
|
+
return computeRegistroAnulacion(input).toLowerCase() === expectedHash.toLowerCase();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Construye la cadena canónica a hashear de un registro de evento.
|
|
93
|
+
*/
|
|
94
|
+
function concatenateRegistroEvento(input) {
|
|
95
|
+
return concatenateFields([
|
|
96
|
+
['NIF', input.nifSistemaInformatico],
|
|
97
|
+
['ID', input.id],
|
|
98
|
+
['IdSistemaInformatico', input.idSistemaInformatico],
|
|
99
|
+
['Version', input.version],
|
|
100
|
+
['NumeroInstalacion', input.numeroInstalacion],
|
|
101
|
+
['NIF', input.nifObligado],
|
|
102
|
+
['TipoEvento', input.tipoEvento],
|
|
103
|
+
['HuellaEvento', input.huellaAnterior],
|
|
104
|
+
['FechaHoraHusoGenEvento', input.fechaHoraHusoGenEvento],
|
|
105
|
+
]);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Calcula la huella (hash) de un registro de evento.
|
|
109
|
+
*/
|
|
110
|
+
function computeRegistroEvento(input) {
|
|
111
|
+
return sha256(concatenateRegistroEvento(input));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Verifica que el hash de un registro de evento coincide con el esperado.
|
|
115
|
+
*/
|
|
116
|
+
function verifyRegistroEvento(input, expectedHash) {
|
|
117
|
+
return computeRegistroEvento(input).toLowerCase() === expectedHash.toLowerCase();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Cadena de hash con estado, para encadenar registros de forma secuencial.
|
|
121
|
+
*/
|
|
122
|
+
class HashChain {
|
|
123
|
+
_lastHash = null;
|
|
124
|
+
_count = 0;
|
|
125
|
+
/** Hash del último registro encadenado, o `null` si aún no hay ninguno. */
|
|
126
|
+
get lastHash() {
|
|
127
|
+
return this._lastHash;
|
|
128
|
+
}
|
|
129
|
+
/** Número de registros encadenados hasta ahora. */
|
|
130
|
+
get count() {
|
|
131
|
+
return this._count;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Encadena un nuevo registro de alta y devuelve su huella.
|
|
135
|
+
*/
|
|
136
|
+
pushAlta(input) {
|
|
137
|
+
const hash = computeRegistroAlta({ ...input, huellaAnterior: this._lastHash });
|
|
138
|
+
this._lastHash = hash;
|
|
139
|
+
this._count += 1;
|
|
140
|
+
return hash;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Encadena un nuevo registro de anulación y devuelve su huella.
|
|
144
|
+
*/
|
|
145
|
+
pushAnulacion(input) {
|
|
146
|
+
const hash = computeRegistroAnulacion({ ...input, huellaAnterior: this._lastHash });
|
|
147
|
+
this._lastHash = hash;
|
|
148
|
+
this._count += 1;
|
|
149
|
+
return hash;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Encadena un nuevo registro de evento y devuelve su huella.
|
|
153
|
+
*/
|
|
154
|
+
pushEvento(input) {
|
|
155
|
+
const hash = computeRegistroEvento({ ...input, huellaAnterior: this._lastHash });
|
|
156
|
+
this._lastHash = hash;
|
|
157
|
+
this._count += 1;
|
|
158
|
+
return hash;
|
|
159
|
+
}
|
|
160
|
+
/** Reinicia la cadena. */
|
|
161
|
+
reset() {
|
|
162
|
+
this._lastHash = null;
|
|
163
|
+
this._count = 0;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.HashChain = HashChain;
|
|
167
|
+
//# sourceMappingURL=chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.js","sourceRoot":"","sources":["../../../../src/core/hash/chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/hash/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./chain.js"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/hash/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./models/index.js"), exports);
|
|
18
|
+
__exportStar(require("./hash/index.js"), exports);
|
|
19
|
+
__exportStar(require("./xml/index.js"), exports);
|
|
20
|
+
__exportStar(require("./qr/index.js"), exports);
|
|
21
|
+
__exportStar(require("./validation/index.js"), exports);
|
|
22
|
+
__exportStar(require("./utils/index.js"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,kDAAgC;AAChC,iDAA+B;AAC/B,gDAA8B;AAC9B,wDAAsC;AACtC,mDAAiC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../../src/core/models/event.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,cAAc,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,sBAAsB;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../../../src/core/models/event.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./invoice.js"), exports);
|
|
18
|
+
__exportStar(require("./event.js"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,6CAA2B"}
|
|
@@ -38,36 +38,48 @@ export type TipoFactura = 'F1' | 'F2' | 'F3' | 'F4' | 'F5' | 'F6' | 'F7' | 'F8'
|
|
|
38
38
|
*/
|
|
39
39
|
export type TipoDesglose = 'S1' | 'S2' | 'S3' | 'S4' | 'S5' | 'S6';
|
|
40
40
|
/**
|
|
41
|
-
* Detalle de
|
|
41
|
+
* Detalle de desglose de una línea (DetalleType del XSD de AEAT).
|
|
42
42
|
*/
|
|
43
|
-
export interface
|
|
43
|
+
export interface DetalleDesglose {
|
|
44
|
+
/** Calificación de la operación (p. ej. '01'). */
|
|
45
|
+
calificacionOperacion: string;
|
|
46
|
+
/** Clave de régimen (obligatoria si Impuesto es IVA/IPSI/IGIC). */
|
|
47
|
+
claveRegimen?: string;
|
|
44
48
|
/** Tipo impositivo (%). */
|
|
45
|
-
tipoImpositivo
|
|
46
|
-
/** Base imponible. */
|
|
49
|
+
tipoImpositivo?: number;
|
|
50
|
+
/** Base imponible o importe no sujeto. */
|
|
47
51
|
baseImponible: number;
|
|
48
52
|
/** Cuota repercutida. */
|
|
49
|
-
cuotaRepercutida
|
|
53
|
+
cuotaRepercutida?: number;
|
|
50
54
|
}
|
|
51
55
|
/**
|
|
52
|
-
* Desglose de la
|
|
53
|
-
*/
|
|
54
|
-
export interface DesgloseTipoOperacion {
|
|
55
|
-
/** Clave de tipo de operación (p. ej. '01'). */
|
|
56
|
-
tipoOperacion: string;
|
|
57
|
-
/** Detalles de IVA. */
|
|
58
|
-
detallesIva: DetalleIva[];
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Desglose completo de la factura.
|
|
56
|
+
* Desglose completo de la factura (DesgloseType del XSD de AEAT).
|
|
62
57
|
*/
|
|
63
58
|
export interface Desglose {
|
|
64
|
-
/**
|
|
65
|
-
|
|
59
|
+
/** Detalles de desglose (DetalleDesglose). */
|
|
60
|
+
detalles: DetalleDesglose[];
|
|
66
61
|
/** Cuota total de la factura. */
|
|
67
62
|
cuotaTotal: number;
|
|
68
63
|
/** Importe total de la factura. */
|
|
69
64
|
importeTotal: number;
|
|
70
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Sistema informático que genera el registro (SistemaInformaticoType del XSD).
|
|
68
|
+
*/
|
|
69
|
+
export interface SistemaInformatico {
|
|
70
|
+
/** Nombre o razón social del titular. */
|
|
71
|
+
nombreRazon: string;
|
|
72
|
+
/** NIF del titular. */
|
|
73
|
+
nif: string;
|
|
74
|
+
/** Nombre del sistema informático. */
|
|
75
|
+
nombreSistemaInformatico: string;
|
|
76
|
+
/** Identificador del sistema informático. */
|
|
77
|
+
idSistemaInformatico: string;
|
|
78
|
+
/** Versión del sistema informático. */
|
|
79
|
+
version: string;
|
|
80
|
+
/** Número de instalación. */
|
|
81
|
+
numeroInstalacion: string;
|
|
82
|
+
}
|
|
71
83
|
/**
|
|
72
84
|
* Factura en el modelo de datos Verifactu.
|
|
73
85
|
*/
|
|
@@ -84,6 +96,19 @@ export interface Invoice {
|
|
|
84
96
|
tipoDesglose: TipoDesglose;
|
|
85
97
|
/** Descripción de la operación. */
|
|
86
98
|
descripcion?: string;
|
|
99
|
+
/** Destinatarios de la operación (obligatorio para F1/F3/R1-R4). */
|
|
100
|
+
destinatarios?: {
|
|
101
|
+
nombreRazon: string;
|
|
102
|
+
nif: string;
|
|
103
|
+
}[];
|
|
104
|
+
/** Sistema informático que genera el registro. */
|
|
105
|
+
sistemaInformatico: SistemaInformatico;
|
|
106
|
+
/** Fecha/hora de generación con huso horario (ISO 8601). */
|
|
107
|
+
fechaHoraHusoGenRegistro: string;
|
|
108
|
+
/** Huella (hash) del registro. */
|
|
109
|
+
huella: string;
|
|
110
|
+
/** Versión del esquema (por defecto '1.0'). */
|
|
111
|
+
idVersion?: string;
|
|
87
112
|
/** Metadatos adicionales libres. */
|
|
88
113
|
metadata?: Record<string, unknown>;
|
|
89
114
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice.d.ts","sourceRoot":"","sources":["../../../../src/core/models/invoice.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoice.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"invoice.js","sourceRoot":"","sources":["../../../../src/core/models/invoice.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/qr/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./qr.js"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/qr/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../../../../src/core/qr/qr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,SAA8D,EACrE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACvC,MAAM,CAGR"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildQrPayload = buildQrPayload;
|
|
4
|
+
/**
|
|
5
|
+
* Construye el payload del QR Verifactu.
|
|
6
|
+
*
|
|
7
|
+
* El QR Verifactu codifica una URL de verificación que incluye el hash del
|
|
8
|
+
* registro, de modo que cualquier persona pueda verificar la integridad de
|
|
9
|
+
* la factura contra la AEAT.
|
|
10
|
+
*
|
|
11
|
+
* @param hash Hash del registro (encadenado).
|
|
12
|
+
* @param baseUrl URL base de verificación de la AEAT.
|
|
13
|
+
* @param extraParams Parámetros adicionales a incluir en la URL.
|
|
14
|
+
*/
|
|
15
|
+
function buildQrPayload(hash, baseUrl = 'https://www2.agenciatributaria.gob.es/verifactu/verificar', extraParams = {}) {
|
|
16
|
+
const params = new URLSearchParams({ hash, ...extraParams });
|
|
17
|
+
return `${baseUrl}?${params.toString()}`;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=qr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../../../src/core/qr/qr.ts"],"names":[],"mappings":";;AAWA,wCAOC;AAlBD;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAC5B,IAAY,EACZ,OAAO,GAAG,2DAA2D,EACrE,cAAsC,EAAE;IAExC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;IAC7D,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilidades de fecha/hora para Verifactu.
|
|
3
|
+
*
|
|
4
|
+
* AEAT exige que `FechaHoraHusoGenRegistro` sea la fecha/hora actual del
|
|
5
|
+
* sistema con su huso horario (margen de 240 segundos). Este helper genera
|
|
6
|
+
* ese valor detectando automáticamente el offset de zona, sin asumir un
|
|
7
|
+
* huso fijo (p. ej. `+02:00`).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Devuelve la fecha/hora actual en formato ISO 8601 con el offset de zona
|
|
11
|
+
* detectado automáticamente, p. ej. `2026-09-07T10:12:41+02:00`.
|
|
12
|
+
*
|
|
13
|
+
* @param date Fecha a formatear (por defecto, ahora).
|
|
14
|
+
*/
|
|
15
|
+
export declare function nowIsoWithOffset(date?: Date): string;
|
|
16
|
+
//# sourceMappingURL=date.d.ts.map
|