@timbra-ec/sri 0.1.0
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/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-lint.log +5 -0
- package/.turbo/turbo-typecheck.log +5 -0
- package/dist/clave-acceso.d.ts +31 -0
- package/dist/clave-acceso.d.ts.map +1 -0
- package/dist/clave-acceso.js +70 -0
- package/dist/clave-acceso.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +26 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/signing/certificate.d.ts +27 -0
- package/dist/signing/certificate.d.ts.map +1 -0
- package/dist/signing/certificate.js +78 -0
- package/dist/signing/certificate.js.map +1 -0
- package/dist/signing/xades-bes.d.ts +10 -0
- package/dist/signing/xades-bes.d.ts.map +1 -0
- package/dist/signing/xades-bes.js +166 -0
- package/dist/signing/xades-bes.js.map +1 -0
- package/dist/soap/autorizacion.d.ts +21 -0
- package/dist/soap/autorizacion.d.ts.map +1 -0
- package/dist/soap/autorizacion.js +99 -0
- package/dist/soap/autorizacion.js.map +1 -0
- package/dist/soap/client.d.ts +6 -0
- package/dist/soap/client.d.ts.map +1 -0
- package/dist/soap/client.js +37 -0
- package/dist/soap/client.js.map +1 -0
- package/dist/soap/recepcion.d.ts +9 -0
- package/dist/soap/recepcion.d.ts.map +1 -0
- package/dist/soap/recepcion.js +60 -0
- package/dist/soap/recepcion.js.map +1 -0
- package/dist/xml/builder.d.ts +31 -0
- package/dist/xml/builder.d.ts.map +1 -0
- package/dist/xml/builder.js +287 -0
- package/dist/xml/builder.js.map +1 -0
- package/dist/xml/shared.d.ts +21 -0
- package/dist/xml/shared.d.ts.map +1 -0
- package/dist/xml/shared.js +93 -0
- package/dist/xml/shared.js.map +1 -0
- package/dist/xml/types.d.ts +179 -0
- package/dist/xml/types.d.ts.map +1 -0
- package/dist/xml/types.js +2 -0
- package/dist/xml/types.js.map +1 -0
- package/package.json +37 -0
- package/src/clave-acceso.ts +106 -0
- package/src/errors.ts +32 -0
- package/src/index.ts +49 -0
- package/src/signing/certificate.ts +103 -0
- package/src/signing/xades-bes.ts +188 -0
- package/src/soap/autorizacion.ts +139 -0
- package/src/soap/client.ts +45 -0
- package/src/soap/recepcion.ts +83 -0
- package/src/xml/builder.ts +344 -0
- package/src/xml/shared.ts +110 -0
- package/src/xml/types.ts +195 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { DOMParser } from '@xmldom/xmldom';
|
|
2
|
+
import { SRI_URLS } from '@timbra-ec/types';
|
|
3
|
+
import { SriSoapError, SriTimeoutError } from '../errors';
|
|
4
|
+
import { soapCall } from './client';
|
|
5
|
+
/** Extract text content of a tag from a parent element */
|
|
6
|
+
function getTagText(parent, tag) {
|
|
7
|
+
const el = parent.getElementsByTagName(tag)[0];
|
|
8
|
+
return el?.textContent ?? '';
|
|
9
|
+
}
|
|
10
|
+
/** Parse SRI mensajes from an autorizacion element */
|
|
11
|
+
function parseMensajes(parent) {
|
|
12
|
+
const mensajes = [];
|
|
13
|
+
const mensajeEls = parent.getElementsByTagName('mensaje');
|
|
14
|
+
for (let i = 0; i < mensajeEls.length; i++) {
|
|
15
|
+
const el = mensajeEls[i];
|
|
16
|
+
mensajes.push({
|
|
17
|
+
identificador: getTagText(el, 'identificador'),
|
|
18
|
+
mensaje: getTagText(el, 'mensaje'),
|
|
19
|
+
informacionAdicional: getTagText(el, 'informacionAdicional') || undefined,
|
|
20
|
+
tipo: getTagText(el, 'tipo'),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return mensajes;
|
|
24
|
+
}
|
|
25
|
+
function delay(ms, signal) {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
if (signal?.aborted) {
|
|
28
|
+
reject(new SriTimeoutError('Authorization query aborted'));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const timer = setTimeout(resolve, ms);
|
|
32
|
+
signal?.addEventListener('abort', () => {
|
|
33
|
+
clearTimeout(timer);
|
|
34
|
+
reject(new SriTimeoutError('Authorization query aborted'));
|
|
35
|
+
}, { once: true });
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Query SRI for the authorization status of a document.
|
|
40
|
+
*
|
|
41
|
+
* Polls the autorizacionComprobante service using the clave de acceso.
|
|
42
|
+
* Retries when status is EN PROCESO, up to maxAttempts times.
|
|
43
|
+
*
|
|
44
|
+
* Returns the authorization response when AUTORIZADO.
|
|
45
|
+
* Throws SriSoapError when NO AUTORIZADO.
|
|
46
|
+
* Throws SriTimeoutError when max attempts exhausted.
|
|
47
|
+
*/
|
|
48
|
+
export async function queryAutorizacion(claveAcceso, environment, options) {
|
|
49
|
+
const maxAttempts = options?.maxAttempts ?? 10;
|
|
50
|
+
const intervalMs = options?.intervalMs ?? 2000;
|
|
51
|
+
const signal = options?.signal;
|
|
52
|
+
const url = environment === '1' ? SRI_URLS.TEST.AUTORIZACION : SRI_URLS.PRODUCTION.AUTORIZACION;
|
|
53
|
+
const body = [
|
|
54
|
+
'<aut:autorizacionComprobante xmlns:aut="http://ec.gob.sri.ws.autorizacion">',
|
|
55
|
+
`<claveAccesoComprobante>${claveAcceso}</claveAccesoComprobante>`,
|
|
56
|
+
'</aut:autorizacionComprobante>',
|
|
57
|
+
].join('');
|
|
58
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
59
|
+
if (signal?.aborted) {
|
|
60
|
+
throw new SriTimeoutError('Authorization query aborted');
|
|
61
|
+
}
|
|
62
|
+
const responseXml = await soapCall(url, body, signal);
|
|
63
|
+
const parser = new DOMParser();
|
|
64
|
+
const doc = parser.parseFromString(responseXml, 'text/xml');
|
|
65
|
+
// Find the autorizacion element
|
|
66
|
+
const autorizacionEls = doc.getElementsByTagName('autorizacion');
|
|
67
|
+
if (autorizacionEls.length === 0) {
|
|
68
|
+
// No authorization data yet, retry
|
|
69
|
+
if (attempt < maxAttempts) {
|
|
70
|
+
await delay(intervalMs, signal);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
throw new SriTimeoutError(`No authorization response after ${maxAttempts} attempts`);
|
|
74
|
+
}
|
|
75
|
+
const autorizacion = autorizacionEls[0];
|
|
76
|
+
const estado = getTagText(autorizacion, 'estado');
|
|
77
|
+
const mensajes = parseMensajes(autorizacion);
|
|
78
|
+
if (estado === 'AUTORIZADO') {
|
|
79
|
+
return {
|
|
80
|
+
estado: 'AUTORIZADO',
|
|
81
|
+
numeroAutorizacion: getTagText(autorizacion, 'numeroAutorizacion'),
|
|
82
|
+
fechaAutorizacion: getTagText(autorizacion, 'fechaAutorizacion'),
|
|
83
|
+
ambiente: getTagText(autorizacion, 'ambiente'),
|
|
84
|
+
comprobante: getTagText(autorizacion, 'comprobante'),
|
|
85
|
+
mensajes,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (estado === 'NO AUTORIZADO') {
|
|
89
|
+
const errorMsg = mensajes.map((m) => `[${m.identificador}] ${m.mensaje}`).join('; ');
|
|
90
|
+
throw new SriSoapError(`SRI denied authorization: ${errorMsg}`, mensajes[0]?.identificador, mensajes);
|
|
91
|
+
}
|
|
92
|
+
// EN PROCESO — retry after interval
|
|
93
|
+
if (attempt < maxAttempts) {
|
|
94
|
+
await delay(intervalMs, signal);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
throw new SriTimeoutError(`Authorization still EN PROCESO after ${maxAttempts} attempts for clave ${claveAcceso}`);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=autorizacion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autorizacion.js","sourceRoot":"","sources":["../../src/soap/autorizacion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/soap/client.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC/F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { SriSoapError } from '../errors';
|
|
2
|
+
/**
|
|
3
|
+
* Make a SOAP call to SRI web services.
|
|
4
|
+
* Returns the raw XML response body.
|
|
5
|
+
*/
|
|
6
|
+
export async function soapCall(url, body, signal) {
|
|
7
|
+
// Strip ?wsdl from URL — we call the service endpoint directly
|
|
8
|
+
const serviceUrl = url.replace(/\?wsdl$/i, '');
|
|
9
|
+
const envelope = [
|
|
10
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
11
|
+
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">',
|
|
12
|
+
'<soapenv:Body>',
|
|
13
|
+
body,
|
|
14
|
+
'</soapenv:Body>',
|
|
15
|
+
'</soapenv:Envelope>',
|
|
16
|
+
].join('');
|
|
17
|
+
let response;
|
|
18
|
+
try {
|
|
19
|
+
response = await fetch(serviceUrl, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers: {
|
|
22
|
+
'Content-Type': 'text/xml; charset=utf-8',
|
|
23
|
+
},
|
|
24
|
+
body: envelope,
|
|
25
|
+
signal,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
throw new SriSoapError(`Network error connecting to SRI: ${err instanceof Error ? err.message : String(err)}`);
|
|
30
|
+
}
|
|
31
|
+
const responseText = await response.text();
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
throw new SriSoapError(`SRI returned HTTP ${response.status}: ${responseText.substring(0, 500)}`);
|
|
34
|
+
}
|
|
35
|
+
return responseText;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/soap/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAY,EAAE,MAAoB;IAC5E,+DAA+D;IAC/D,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAE9C,MAAM,QAAQ,GAAG;QACf,wCAAwC;QACxC,8EAA8E;QAC9E,gBAAgB;QAChB,IAAI;QACJ,iBAAiB;QACjB,qBAAqB;KACtB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEV,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,yBAAyB;aAC1C;YACD,IAAI,EAAE,QAAQ;YACd,MAAM;SACP,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CACpB,oCAAoC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACvF,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,YAAY,CACpB,qBAAqB,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC1E,CAAA;IACH,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SriEnvironment, SriRecepcionResponse } from '@timbra-ec/types';
|
|
2
|
+
/**
|
|
3
|
+
* Submit a signed XML document to SRI's reception service (validarComprobante).
|
|
4
|
+
*
|
|
5
|
+
* The signed XML is base64-encoded and sent via SOAP.
|
|
6
|
+
* Returns RECIBIDA if accepted, throws SriSoapError if DEVUELTA.
|
|
7
|
+
*/
|
|
8
|
+
export declare function submitComprobante(signedXml: string, environment: SriEnvironment, signal?: AbortSignal): Promise<SriRecepcionResponse>;
|
|
9
|
+
//# sourceMappingURL=recepcion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recepcion.d.ts","sourceRoot":"","sources":["../../src/soap/recepcion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAc,MAAM,kBAAkB,CAAA;AA6BxF;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,cAAc,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC,CA0C/B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { DOMParser } from '@xmldom/xmldom';
|
|
2
|
+
import { SRI_URLS } from '@timbra-ec/types';
|
|
3
|
+
import { SriSoapError } from '../errors';
|
|
4
|
+
import { soapCall } from './client';
|
|
5
|
+
/** Extract text content of a tag from a parent element */
|
|
6
|
+
function getTagText(parent, tag) {
|
|
7
|
+
const el = parent.getElementsByTagName(tag)[0];
|
|
8
|
+
return el?.textContent ?? '';
|
|
9
|
+
}
|
|
10
|
+
/** Parse SRI mensajes from a comprobante element */
|
|
11
|
+
function parseMensajes(comprobante) {
|
|
12
|
+
const mensajes = [];
|
|
13
|
+
const mensajeEls = comprobante.getElementsByTagName('mensaje');
|
|
14
|
+
for (let i = 0; i < mensajeEls.length; i++) {
|
|
15
|
+
const el = mensajeEls[i];
|
|
16
|
+
mensajes.push({
|
|
17
|
+
identificador: getTagText(el, 'identificador'),
|
|
18
|
+
mensaje: getTagText(el, 'mensaje'),
|
|
19
|
+
informacionAdicional: getTagText(el, 'informacionAdicional') || undefined,
|
|
20
|
+
tipo: getTagText(el, 'tipo'),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return mensajes;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Submit a signed XML document to SRI's reception service (validarComprobante).
|
|
27
|
+
*
|
|
28
|
+
* The signed XML is base64-encoded and sent via SOAP.
|
|
29
|
+
* Returns RECIBIDA if accepted, throws SriSoapError if DEVUELTA.
|
|
30
|
+
*/
|
|
31
|
+
export async function submitComprobante(signedXml, environment, signal) {
|
|
32
|
+
const url = environment === '1' ? SRI_URLS.TEST.RECEPCION : SRI_URLS.PRODUCTION.RECEPCION;
|
|
33
|
+
const xmlBase64 = Buffer.from(signedXml, 'utf-8').toString('base64');
|
|
34
|
+
const body = [
|
|
35
|
+
'<ec:validarComprobante xmlns:ec="http://ec.gob.sri.ws.recepcion">',
|
|
36
|
+
`<xml>${xmlBase64}</xml>`,
|
|
37
|
+
'</ec:validarComprobante>',
|
|
38
|
+
].join('');
|
|
39
|
+
const responseXml = await soapCall(url, body, signal);
|
|
40
|
+
const parser = new DOMParser();
|
|
41
|
+
const doc = parser.parseFromString(responseXml, 'text/xml');
|
|
42
|
+
const estado = getTagText(doc.documentElement, 'estado');
|
|
43
|
+
const comprobantes = [];
|
|
44
|
+
const comprobanteEls = doc.getElementsByTagName('comprobante');
|
|
45
|
+
for (let i = 0; i < comprobanteEls.length; i++) {
|
|
46
|
+
const el = comprobanteEls[i];
|
|
47
|
+
comprobantes.push({
|
|
48
|
+
claveAcceso: getTagText(el, 'claveAcceso'),
|
|
49
|
+
mensajes: parseMensajes(el),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const response = { estado: estado, comprobantes };
|
|
53
|
+
if (estado === 'DEVUELTA') {
|
|
54
|
+
const allMensajes = comprobantes.flatMap((c) => c.mensajes);
|
|
55
|
+
const errorMsg = allMensajes.map((m) => `[${m.identificador}] ${m.mensaje}`).join('; ');
|
|
56
|
+
throw new SriSoapError(`SRI rejected document: ${errorMsg}`, allMensajes[0]?.identificador, allMensajes);
|
|
57
|
+
}
|
|
58
|
+
return response;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=recepcion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recepcion.js","sourceRoot":"","sources":["../../src/soap/recepcion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Invoice, Organization } from '@timbra-ec/types';
|
|
2
|
+
import type { NotaCreditoInput, NotaDebitoInput, GuiaRemisionInput, RetencionInput, AtsInput } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Build SRI-compliant factura XML (codDoc=01, version 2.1.0).
|
|
5
|
+
*
|
|
6
|
+
* The returned XML has `id="comprobante"` on the root element,
|
|
7
|
+
* which is required for XAdES-BES signing to reference.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildFacturaXml(invoice: Invoice, org: Organization): string;
|
|
10
|
+
/**
|
|
11
|
+
* Build SRI-compliant Nota de Credito XML (codDoc=04, version 1.1.0).
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildNotaCreditoXml(input: NotaCreditoInput): string;
|
|
14
|
+
/**
|
|
15
|
+
* Build SRI-compliant Nota de Debito XML (codDoc=05, version 1.0.0).
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildNotaDebitoXml(input: NotaDebitoInput): string;
|
|
18
|
+
/**
|
|
19
|
+
* Build SRI-compliant Guia de Remision XML (codDoc=06, version 1.1.0).
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildGuiaRemisionXml(input: GuiaRemisionInput): string;
|
|
22
|
+
/**
|
|
23
|
+
* Build SRI-compliant Comprobante de Retencion XML (codDoc=07, Version ATS format).
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildRetencionXml(input: RetencionInput): string;
|
|
26
|
+
/**
|
|
27
|
+
* Build ATS (Anexo Transaccional Simplificado) XML for monthly filing.
|
|
28
|
+
* This is NOT an electronic document — it's a report XML uploaded to SRI portal.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildAtsXml(input: AtsInput): string;
|
|
31
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/xml/builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAe,YAAY,EAAiB,MAAM,kBAAkB,CAAA;AAEzF,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACT,MAAM,SAAS,CAAA;AAqChB;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CA0C3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAyBnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAwCjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAkDrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA8C/D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CA8DnD"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { create } from 'xmlbuilder2';
|
|
2
|
+
import { money, toSriDate, aggregateTaxTotals, buildInfoTributaria, buildInfoAdicional, buildDetalles, } from './shared';
|
|
3
|
+
/** Build pagos section */
|
|
4
|
+
function buildPagos(parent, pagos) {
|
|
5
|
+
const pagosEle = parent.ele('pagos');
|
|
6
|
+
for (const pago of pagos) {
|
|
7
|
+
const pagoEle = pagosEle.ele('pago');
|
|
8
|
+
pagoEle.ele('formaPago').txt(pago.formaPago);
|
|
9
|
+
pagoEle.ele('total').txt(money(pago.total));
|
|
10
|
+
if (pago.plazo !== undefined) {
|
|
11
|
+
pagoEle.ele('plazo').txt(pago.plazo.toString());
|
|
12
|
+
pagoEle.ele('unidadTiempo').txt(pago.unidadTiempo ?? 'dias');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Build totalConImpuestos section from aggregated tax totals */
|
|
17
|
+
function buildTotalConImpuestos(parent, items) {
|
|
18
|
+
const taxTotals = aggregateTaxTotals(items);
|
|
19
|
+
const totalConImpuestos = parent.ele('totalConImpuestos');
|
|
20
|
+
for (const tax of taxTotals) {
|
|
21
|
+
const totalImpuesto = totalConImpuestos.ele('totalImpuesto');
|
|
22
|
+
totalImpuesto.ele('codigo').txt(tax.codigo);
|
|
23
|
+
totalImpuesto.ele('codigoPorcentaje').txt(tax.codigoPorcentaje);
|
|
24
|
+
totalImpuesto.ele('baseImponible').txt(money(tax.baseImponible));
|
|
25
|
+
totalImpuesto.ele('valor').txt(money(tax.valor));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Build SRI-compliant factura XML (codDoc=01, version 2.1.0).
|
|
30
|
+
*
|
|
31
|
+
* The returned XML has `id="comprobante"` on the root element,
|
|
32
|
+
* which is required for XAdES-BES signing to reference.
|
|
33
|
+
*/
|
|
34
|
+
export function buildFacturaXml(invoice, org) {
|
|
35
|
+
const doc = create({ version: '1.0', encoding: 'UTF-8' });
|
|
36
|
+
const factura = doc.ele('factura', { id: 'comprobante', version: '2.1.0' });
|
|
37
|
+
// --- infoTributaria ---
|
|
38
|
+
buildInfoTributaria(factura, {
|
|
39
|
+
ambiente: invoice.ambiente,
|
|
40
|
+
tipoEmision: invoice.tipoEmision,
|
|
41
|
+
ruc: org.ruc,
|
|
42
|
+
claveAcceso: invoice.claveAcceso,
|
|
43
|
+
codDoc: invoice.codDoc,
|
|
44
|
+
estab: invoice.estab,
|
|
45
|
+
ptoEmi: invoice.ptoEmi,
|
|
46
|
+
secuencial: invoice.secuencial,
|
|
47
|
+
razonSocial: org.razonSocial,
|
|
48
|
+
nombreComercial: org.nombreComercial,
|
|
49
|
+
direccionMatriz: org.direccionMatriz,
|
|
50
|
+
regimenRimpe: org.regimenRimpe,
|
|
51
|
+
});
|
|
52
|
+
// --- infoFactura ---
|
|
53
|
+
const infoFact = factura.ele('infoFactura');
|
|
54
|
+
infoFact.ele('fechaEmision').txt(toSriDate(invoice.fechaEmision));
|
|
55
|
+
infoFact.ele('obligadoContabilidad').txt(org.obligadoContabilidad ? 'SI' : 'NO');
|
|
56
|
+
infoFact.ele('tipoIdentificacionComprador').txt(invoice.tipoIdentificacionComprador);
|
|
57
|
+
infoFact.ele('razonSocialComprador').txt(invoice.razonSocialComprador);
|
|
58
|
+
infoFact.ele('identificacionComprador').txt(invoice.identificacionComprador);
|
|
59
|
+
infoFact.ele('totalSinImpuestos').txt(money(invoice.totalSinImpuestos));
|
|
60
|
+
infoFact.ele('totalDescuento').txt(money(invoice.totalDescuento));
|
|
61
|
+
buildTotalConImpuestos(infoFact, invoice.items);
|
|
62
|
+
infoFact.ele('propina').txt(money(invoice.propina ?? 0));
|
|
63
|
+
infoFact.ele('importeTotal').txt(money(invoice.importeTotal));
|
|
64
|
+
infoFact.ele('moneda').txt(invoice.moneda);
|
|
65
|
+
buildPagos(infoFact, invoice.pagos);
|
|
66
|
+
// --- detalles ---
|
|
67
|
+
buildDetalles(factura, invoice.items);
|
|
68
|
+
// --- infoAdicional ---
|
|
69
|
+
buildInfoAdicional(factura, invoice.infoAdicional);
|
|
70
|
+
return doc.end({ prettyPrint: false });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Build SRI-compliant Nota de Credito XML (codDoc=04, version 1.1.0).
|
|
74
|
+
*/
|
|
75
|
+
export function buildNotaCreditoXml(input) {
|
|
76
|
+
const doc = create({ version: '1.0', encoding: 'UTF-8' });
|
|
77
|
+
const root = doc.ele('notaCredito', { id: 'comprobante', version: '1.1.0' });
|
|
78
|
+
buildInfoTributaria(root, input.infoTributaria);
|
|
79
|
+
const info = root.ele('infoNotaCredito');
|
|
80
|
+
info.ele('fechaEmision').txt(toSriDate(input.fechaEmision));
|
|
81
|
+
info.ele('obligadoContabilidad').txt(input.obligadoContabilidad ? 'SI' : 'NO');
|
|
82
|
+
info.ele('tipoIdentificacionComprador').txt(input.tipoIdentificacionComprador);
|
|
83
|
+
info.ele('razonSocialComprador').txt(input.razonSocialComprador);
|
|
84
|
+
info.ele('identificacionComprador').txt(input.identificacionComprador);
|
|
85
|
+
info.ele('codDocModificado').txt(input.codDocModificado);
|
|
86
|
+
info.ele('numDocModificado').txt(input.numDocModificado);
|
|
87
|
+
info.ele('fechaEmisionDocSustento').txt(toSriDate(input.fechaEmisionDocSustento));
|
|
88
|
+
info.ele('totalSinImpuestos').txt(money(input.totalSinImpuestos));
|
|
89
|
+
buildTotalConImpuestos(info, input.items);
|
|
90
|
+
info.ele('motivo').txt(input.motivo);
|
|
91
|
+
info.ele('importeTotal').txt(money(input.importeTotal));
|
|
92
|
+
buildPagos(info, input.pagos);
|
|
93
|
+
buildDetalles(root, input.items);
|
|
94
|
+
buildInfoAdicional(root, input.infoAdicional);
|
|
95
|
+
return doc.end({ prettyPrint: false });
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Build SRI-compliant Nota de Debito XML (codDoc=05, version 1.0.0).
|
|
99
|
+
*/
|
|
100
|
+
export function buildNotaDebitoXml(input) {
|
|
101
|
+
const doc = create({ version: '1.0', encoding: 'UTF-8' });
|
|
102
|
+
const root = doc.ele('notaDebito', { id: 'comprobante', version: '1.0.0' });
|
|
103
|
+
buildInfoTributaria(root, input.infoTributaria);
|
|
104
|
+
const info = root.ele('infoNotaDebito');
|
|
105
|
+
info.ele('fechaEmision').txt(toSriDate(input.fechaEmision));
|
|
106
|
+
info.ele('obligadoContabilidad').txt(input.obligadoContabilidad ? 'SI' : 'NO');
|
|
107
|
+
info.ele('tipoIdentificacionComprador').txt(input.tipoIdentificacionComprador);
|
|
108
|
+
info.ele('razonSocialComprador').txt(input.razonSocialComprador);
|
|
109
|
+
info.ele('identificacionComprador').txt(input.identificacionComprador);
|
|
110
|
+
info.ele('codDocModificado').txt(input.codDocModificado);
|
|
111
|
+
info.ele('numDocModificado').txt(input.numDocModificado);
|
|
112
|
+
info.ele('fechaEmisionDocSustento').txt(toSriDate(input.fechaEmisionDocSustento));
|
|
113
|
+
info.ele('totalSinImpuestos').txt(money(input.totalSinImpuestos));
|
|
114
|
+
const impuestosEle = info.ele('impuestos');
|
|
115
|
+
for (const imp of input.impuestos) {
|
|
116
|
+
const impuesto = impuestosEle.ele('impuesto');
|
|
117
|
+
impuesto.ele('codigo').txt(imp.codigo);
|
|
118
|
+
impuesto.ele('codigoPorcentaje').txt(imp.codigoPorcentaje);
|
|
119
|
+
impuesto.ele('tarifa').txt(money(imp.tarifa));
|
|
120
|
+
impuesto.ele('baseImponible').txt(money(imp.baseImponible));
|
|
121
|
+
impuesto.ele('valor').txt(money(imp.valor));
|
|
122
|
+
}
|
|
123
|
+
info.ele('importeTotal').txt(money(input.importeTotal));
|
|
124
|
+
buildPagos(info, input.pagos);
|
|
125
|
+
const motivos = root.ele('motivos');
|
|
126
|
+
for (const m of input.motivos) {
|
|
127
|
+
const motivo = motivos.ele('motivo');
|
|
128
|
+
motivo.ele('razon').txt(m.razon);
|
|
129
|
+
motivo.ele('valor').txt(money(m.valor));
|
|
130
|
+
}
|
|
131
|
+
buildInfoAdicional(root, input.infoAdicional);
|
|
132
|
+
return doc.end({ prettyPrint: false });
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Build SRI-compliant Guia de Remision XML (codDoc=06, version 1.1.0).
|
|
136
|
+
*/
|
|
137
|
+
export function buildGuiaRemisionXml(input) {
|
|
138
|
+
const doc = create({ version: '1.0', encoding: 'UTF-8' });
|
|
139
|
+
const root = doc.ele('guiaRemision', { id: 'comprobante', version: '1.1.0' });
|
|
140
|
+
buildInfoTributaria(root, input.infoTributaria);
|
|
141
|
+
const info = root.ele('infoGuiaRemision');
|
|
142
|
+
info.ele('dirEstablecimiento').txt(input.infoTributaria.direccionMatriz);
|
|
143
|
+
info.ele('dirPartida').txt(input.dirPartida);
|
|
144
|
+
info.ele('razonSocialTransportista').txt(input.razonSocialTransportista);
|
|
145
|
+
info.ele('tipoIdentificacionTransportista').txt(input.tipoIdentificacionTransportista);
|
|
146
|
+
info.ele('rucTransportista').txt(input.rucTransportista);
|
|
147
|
+
info.ele('obligadoContabilidad').txt(input.obligadoContabilidad ? 'SI' : 'NO');
|
|
148
|
+
info.ele('fechaIniTransporte').txt(toSriDate(input.fechaIniTransporte));
|
|
149
|
+
info.ele('fechaFinTransporte').txt(toSriDate(input.fechaFinTransporte));
|
|
150
|
+
info.ele('placa').txt(input.placa);
|
|
151
|
+
const destinatarios = root.ele('destinatarios');
|
|
152
|
+
for (const dest of input.destinatarios) {
|
|
153
|
+
const destinatario = destinatarios.ele('destinatario');
|
|
154
|
+
destinatario.ele('identificacionDestinatario').txt(dest.identificacionDestinatario);
|
|
155
|
+
destinatario.ele('razonSocialDestinatario').txt(dest.razonSocialDestinatario);
|
|
156
|
+
destinatario.ele('dirDestinatario').txt(dest.dirDestinatario);
|
|
157
|
+
destinatario.ele('motivoTraslado').txt(dest.motivoTraslado);
|
|
158
|
+
if (dest.codDocSustento) {
|
|
159
|
+
destinatario.ele('codDocSustento').txt(dest.codDocSustento);
|
|
160
|
+
}
|
|
161
|
+
if (dest.numDocSustento) {
|
|
162
|
+
destinatario.ele('numDocSustento').txt(dest.numDocSustento);
|
|
163
|
+
}
|
|
164
|
+
if (dest.numAutDocSustento) {
|
|
165
|
+
destinatario.ele('numAutDocSustento').txt(dest.numAutDocSustento);
|
|
166
|
+
}
|
|
167
|
+
if (dest.fechaEmisionDocSustento) {
|
|
168
|
+
destinatario.ele('fechaEmisionDocSustento').txt(toSriDate(dest.fechaEmisionDocSustento));
|
|
169
|
+
}
|
|
170
|
+
const detalles = destinatario.ele('detalles');
|
|
171
|
+
for (const item of dest.detalles) {
|
|
172
|
+
const detalle = detalles.ele('detalle');
|
|
173
|
+
detalle.ele('codigoInterno').txt(item.codigoInterno);
|
|
174
|
+
detalle.ele('descripcion').txt(item.descripcion);
|
|
175
|
+
detalle.ele('cantidad').txt(money(item.cantidad));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
buildInfoAdicional(root, input.infoAdicional);
|
|
179
|
+
return doc.end({ prettyPrint: false });
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Build SRI-compliant Comprobante de Retencion XML (codDoc=07, Version ATS format).
|
|
183
|
+
*/
|
|
184
|
+
export function buildRetencionXml(input) {
|
|
185
|
+
const doc = create({ version: '1.0', encoding: 'UTF-8' });
|
|
186
|
+
const root = doc.ele('comprobanteRetencion', { id: 'comprobante', version: '2.0.0' });
|
|
187
|
+
buildInfoTributaria(root, input.infoTributaria);
|
|
188
|
+
const info = root.ele('infoCompRetencion');
|
|
189
|
+
info.ele('fechaEmision').txt(toSriDate(input.fechaEmision));
|
|
190
|
+
info.ele('obligadoContabilidad').txt(input.obligadoContabilidad ? 'SI' : 'NO');
|
|
191
|
+
info.ele('tipoIdentificacionSujetoRetenido').txt(input.tipoIdentificacionSujetoRetenido);
|
|
192
|
+
info.ele('razonSocialSujetoRetenido').txt(input.razonSocialSujetoRetenido);
|
|
193
|
+
info.ele('identificacionSujetoRetenido').txt(input.identificacionSujetoRetenido);
|
|
194
|
+
info.ele('periodoFiscal').txt(input.periodoFiscal);
|
|
195
|
+
const docsSustento = root.ele('docsSustento');
|
|
196
|
+
// Group retention details by sustaining document
|
|
197
|
+
const byDoc = new Map();
|
|
198
|
+
for (const imp of input.impuestos) {
|
|
199
|
+
const key = `${imp.codDocSustento}-${imp.numDocSustento}-${imp.fechaEmisionDocSustento}`;
|
|
200
|
+
const group = byDoc.get(key) ?? [];
|
|
201
|
+
group.push(imp);
|
|
202
|
+
byDoc.set(key, group);
|
|
203
|
+
}
|
|
204
|
+
for (const [, retenciones] of byDoc) {
|
|
205
|
+
const first = retenciones[0];
|
|
206
|
+
const docSustento = docsSustento.ele('docSustento');
|
|
207
|
+
docSustento.ele('codSustento').txt('01');
|
|
208
|
+
docSustento.ele('codDocSustento').txt(first.codDocSustento);
|
|
209
|
+
docSustento.ele('numDocSustento').txt(first.numDocSustento);
|
|
210
|
+
docSustento.ele('fechaEmisionDocSustento').txt(toSriDate(first.fechaEmisionDocSustento));
|
|
211
|
+
const retencionesEle = docSustento.ele('retenciones');
|
|
212
|
+
for (const ret of retenciones) {
|
|
213
|
+
const retencion = retencionesEle.ele('retencion');
|
|
214
|
+
retencion.ele('codigo').txt(ret.codigo);
|
|
215
|
+
retencion.ele('codigoRetencion').txt(ret.codigoRetencion);
|
|
216
|
+
retencion.ele('baseImponible').txt(money(ret.baseImponible));
|
|
217
|
+
retencion.ele('porcentajeRetener').txt(money(ret.porcentajeRetener));
|
|
218
|
+
retencion.ele('valorRetenido').txt(money(ret.valorRetenido));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
buildInfoAdicional(root, input.infoAdicional);
|
|
222
|
+
return doc.end({ prettyPrint: false });
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Build ATS (Anexo Transaccional Simplificado) XML for monthly filing.
|
|
226
|
+
* This is NOT an electronic document — it's a report XML uploaded to SRI portal.
|
|
227
|
+
*/
|
|
228
|
+
export function buildAtsXml(input) {
|
|
229
|
+
const doc = create({ version: '1.0', encoding: 'UTF-8' });
|
|
230
|
+
const iva = doc.ele('iva');
|
|
231
|
+
iva.ele('TipoIDInformante').txt(input.tipoIDInformante);
|
|
232
|
+
iva.ele('IdInformante').txt(input.idInformante);
|
|
233
|
+
iva.ele('razonSocial').txt(input.razonSocial);
|
|
234
|
+
iva.ele('Anio').txt(input.anio);
|
|
235
|
+
iva.ele('Mes').txt(input.mes);
|
|
236
|
+
iva.ele('numEstabRuc').txt(input.numEstabRuc);
|
|
237
|
+
iva.ele('totalVentas').txt(money(input.totalVentas));
|
|
238
|
+
iva.ele('codigoOperativo').txt(input.codigoOperativo);
|
|
239
|
+
if (input.compras.length > 0) {
|
|
240
|
+
const compras = iva.ele('compras');
|
|
241
|
+
for (const c of input.compras) {
|
|
242
|
+
const detalle = compras.ele('detalleCompras');
|
|
243
|
+
detalle.ele('codSustento').txt(c.codSustento);
|
|
244
|
+
detalle.ele('tpIdProv').txt(c.tpIdProv);
|
|
245
|
+
detalle.ele('idProv').txt(c.idProv);
|
|
246
|
+
detalle.ele('tipoComprobante').txt(c.tipoComprobante);
|
|
247
|
+
detalle.ele('parteRel').txt(c.parteRel);
|
|
248
|
+
detalle.ele('fechaRegistro').txt(c.fechaRegistro);
|
|
249
|
+
detalle.ele('establecimiento').txt(c.establecimiento);
|
|
250
|
+
detalle.ele('puntoEmision').txt(c.puntoEmision);
|
|
251
|
+
detalle.ele('secuencial').txt(c.secuencial);
|
|
252
|
+
detalle.ele('fechaEmision').txt(c.fechaEmision);
|
|
253
|
+
detalle.ele('autorizacion').txt(c.autorizacion);
|
|
254
|
+
detalle.ele('baseNoGraIva').txt(money(c.baseNoGraIva));
|
|
255
|
+
detalle.ele('baseImponible').txt(money(c.baseImponible));
|
|
256
|
+
detalle.ele('baseImpGrav').txt(money(c.baseImpGrav));
|
|
257
|
+
detalle.ele('montoIva').txt(money(c.montoIva));
|
|
258
|
+
detalle.ele('valRetBien10').txt(money(c.valRetBien10));
|
|
259
|
+
detalle.ele('valRetServ20').txt(money(c.valRetServ20));
|
|
260
|
+
detalle.ele('valorRetBienes').txt(money(c.valorRetBienes));
|
|
261
|
+
detalle.ele('valRetServ50').txt(money(c.valRetServ50));
|
|
262
|
+
detalle.ele('valorRetServicios').txt(money(c.valorRetServicios));
|
|
263
|
+
detalle.ele('valRetServ100').txt(money(c.valRetServ100));
|
|
264
|
+
detalle.ele('totbasesImpReemb').txt(money(c.totbasesImpReemb));
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (input.ventas.length > 0) {
|
|
268
|
+
const ventas = iva.ele('ventas');
|
|
269
|
+
for (const v of input.ventas) {
|
|
270
|
+
const detalle = ventas.ele('detalleVentas');
|
|
271
|
+
detalle.ele('tpIdCliente').txt(v.tpIdCliente);
|
|
272
|
+
detalle.ele('idCliente').txt(v.idCliente);
|
|
273
|
+
detalle.ele('tipoComprobante').txt(v.tipoComprobante);
|
|
274
|
+
detalle.ele('tipoEmision').txt(v.tipoEmision);
|
|
275
|
+
detalle.ele('numeroComprobantes').txt(v.numeroComprobantes.toString());
|
|
276
|
+
detalle.ele('baseNoGraIva').txt(money(v.baseNoGraIva));
|
|
277
|
+
detalle.ele('baseImponible').txt(money(v.baseImponible));
|
|
278
|
+
detalle.ele('baseImpGrav').txt(money(v.baseImpGrav));
|
|
279
|
+
detalle.ele('montoIva').txt(money(v.montoIva));
|
|
280
|
+
detalle.ele('montoIce').txt(money(v.montoIce));
|
|
281
|
+
detalle.ele('valorRetIva').txt(money(v.valorRetIva));
|
|
282
|
+
detalle.ele('valorRetRenta').txt(money(v.valorRetRenta));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return doc.end({ prettyPrint: false });
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/xml/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { XMLBuilder } from 'xmlbuilder2/lib/interfaces';
|
|
2
|
+
import type { InvoiceItem } from '@timbra-ec/types';
|
|
3
|
+
import type { InfoTributariaInput } from './types';
|
|
4
|
+
/** Format a number to exactly 2 decimal places */
|
|
5
|
+
export declare function money(value: number): string;
|
|
6
|
+
/** Convert ISO date (YYYY-MM-DD) to SRI format (dd/MM/yyyy) */
|
|
7
|
+
export declare function toSriDate(isoDate: string): string;
|
|
8
|
+
/** Aggregate tax totals by codigoPorcentaje across all items */
|
|
9
|
+
export declare function aggregateTaxTotals(items: InvoiceItem[]): {
|
|
10
|
+
codigo: string;
|
|
11
|
+
codigoPorcentaje: string;
|
|
12
|
+
baseImponible: number;
|
|
13
|
+
valor: number;
|
|
14
|
+
}[];
|
|
15
|
+
/** Build the infoTributaria section (common to all SRI documents) */
|
|
16
|
+
export declare function buildInfoTributaria(parent: XMLBuilder, input: InfoTributariaInput): void;
|
|
17
|
+
/** Build infoAdicional section */
|
|
18
|
+
export declare function buildInfoAdicional(parent: XMLBuilder, infoAdicional?: Record<string, string>): void;
|
|
19
|
+
/** Build detalles section from InvoiceItems */
|
|
20
|
+
export declare function buildDetalles(parent: XMLBuilder, items: InvoiceItem[]): void;
|
|
21
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/xml/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,kDAAkD;AAClD,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE;YAGzC,MAAM;sBAAoB,MAAM;mBAAiB,MAAM;WAAS,MAAM;IAsBnF;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAqBxF;AAED,kCAAkC;AAClC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,IAAI,CAON;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CA4B5E"}
|