@facturacr/atv-sdk 0.0.0-beta → 0.0.2-beta
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/.env.example +7 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/pull_request_template.md +7 -0
- package/.github/workflows/ci.yml +3 -3
- package/CODE_OF_CONDUCT.md +128 -0
- package/LICENSE +21 -0
- package/README.md +8 -1
- package/__tests__/stubs/dummyKeys/README.md +19 -0
- package/__tests__/stubs/frontendRequest.stub.ts +6 -5
- package/__tests__/stubs/token.stub.ts +18 -0
- package/__tests__/tests/electronicBill.test.ts +28 -0
- package/__tests__/{unit → tests}/getClave.test.ts +2 -2
- package/__tests__/tests/lib/getClave.test.ts +11 -0
- package/__tests__/tests/services/getToken.test.ts +15 -0
- package/atv-structures/4.3/FacturaElectronicaExportacion_V4.3.xsd.xml +1747 -0
- package/atv-structures/4.3/FacturaElectronica_V4.3.xsd.xml +1781 -0
- package/dist/__tests__/stubs/frontendRequest.stub.d.ts +3 -0
- package/dist/__tests__/stubs/frontendRequest.stub.js +61 -0
- package/dist/__tests__/stubs/frontendRequest.stub.js.map +1 -0
- package/dist/__tests__/stubs/token.stub.d.ts +17 -0
- package/dist/__tests__/stubs/token.stub.js +21 -0
- package/dist/__tests__/stubs/token.stub.js.map +1 -0
- package/dist/__tests__/tests/electronicBill.test.d.ts +1 -0
- package/dist/__tests__/tests/electronicBill.test.js +38 -0
- package/dist/__tests__/tests/electronicBill.test.js.map +1 -0
- package/dist/__tests__/tests/getClave.test.d.ts +1 -0
- package/dist/__tests__/tests/getClave.test.js +15 -0
- package/dist/__tests__/tests/getClave.test.js.map +1 -0
- package/dist/__tests__/tests/getToken.test.d.ts +0 -0
- package/dist/__tests__/tests/getToken.test.js +28 -0
- package/dist/__tests__/tests/getToken.test.js.map +1 -0
- package/dist/__tests__/tests/lib/getClave.test.d.ts +1 -0
- package/dist/__tests__/tests/lib/getClave.test.js +15 -0
- package/dist/__tests__/tests/lib/getClave.test.js.map +1 -0
- package/dist/__tests__/tests/services/getToken.test.d.ts +1 -0
- package/dist/__tests__/tests/services/getToken.test.js +27 -0
- package/dist/__tests__/tests/services/getToken.test.js.map +1 -0
- package/dist/examples/confirmXML.d.ts +1 -0
- package/dist/examples/confirmXML.js +89 -0
- package/dist/examples/confirmXML.js.map +1 -0
- package/dist/examples/consultXML.d.ts +1 -0
- package/dist/examples/consultXML.js +55 -0
- package/dist/examples/consultXML.js.map +1 -0
- package/dist/examples/createAndSend.d.ts +1 -0
- package/dist/examples/createAndSend.js +78 -0
- package/dist/examples/createAndSend.js.map +1 -0
- package/dist/examples/createCreditNote.d.ts +1 -0
- package/dist/examples/createCreditNote.js +52 -0
- package/dist/examples/createCreditNote.js.map +1 -0
- package/dist/examples/createDebitNote.d.ts +1 -0
- package/dist/examples/createDebitNote.js +52 -0
- package/dist/examples/createDebitNote.js.map +1 -0
- package/dist/examples/genBasicXML.d.ts +1 -0
- package/dist/examples/genBasicXML.js +44 -0
- package/dist/examples/genBasicXML.js.map +1 -0
- package/dist/examples/getClave.d.ts +1 -0
- package/dist/examples/getClave.js +12 -0
- package/dist/examples/getClave.js.map +1 -0
- package/dist/examples/getToken.d.ts +1 -0
- package/dist/examples/getToken.js +22 -0
- package/dist/examples/getToken.js.map +1 -0
- package/dist/src/confirmXML.d.ts +8 -0
- package/dist/src/confirmXML.js +44 -0
- package/dist/src/confirmXML.js.map +1 -0
- package/dist/src/creditNote.d.ts +14 -0
- package/dist/src/creditNote.js +77 -0
- package/dist/src/creditNote.js.map +1 -0
- package/dist/src/data/codigoMoneda.d.ts +1 -0
- package/dist/src/data/codigoMoneda.js +184 -0
- package/dist/src/data/codigoMoneda.js.map +1 -0
- package/dist/src/data/exoneracion.d.ts +1 -0
- package/dist/src/data/exoneracion.js +15 -0
- package/dist/src/data/exoneracion.js.map +1 -0
- package/dist/src/data/impuestos.d.ts +25 -0
- package/dist/src/data/impuestos.js +51 -0
- package/dist/src/data/impuestos.js.map +1 -0
- package/dist/src/data/tipoCedula.d.ts +7 -0
- package/dist/src/data/tipoCedula.js +17 -0
- package/dist/src/data/tipoCedula.js.map +1 -0
- package/dist/src/data/tipoDocumento.d.ts +26 -0
- package/dist/src/data/tipoDocumento.js +30 -0
- package/dist/src/data/tipoDocumento.js.map +1 -0
- package/dist/src/data/unidadesMedida.d.ts +5 -0
- package/dist/src/data/unidadesMedida.js +141 -0
- package/dist/src/data/unidadesMedida.js.map +1 -0
- package/dist/src/debitNote.d.ts +14 -0
- package/dist/src/debitNote.js +77 -0
- package/dist/src/debitNote.js.map +1 -0
- package/dist/src/electronicBill.d.ts +3 -0
- package/dist/src/electronicBill.js +61 -0
- package/dist/src/electronicBill.js.map +1 -0
- package/dist/src/helpers/comprobantes.d.ts +7 -0
- package/dist/src/helpers/comprobantes.js +92 -0
- package/dist/src/helpers/comprobantes.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.js +42 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/genClave/index.d.ts +9 -0
- package/dist/src/lib/genClave/index.js +119 -0
- package/dist/src/lib/genClave/index.js.map +1 -0
- package/dist/src/lib/genJSON/confirmXML.d.ts +7 -0
- package/dist/src/lib/genJSON/confirmXML.js +46 -0
- package/dist/src/lib/genJSON/confirmXML.js.map +1 -0
- package/dist/src/lib/genJSON/index.d.ts +3 -0
- package/dist/src/lib/genJSON/index.js +133 -0
- package/dist/src/lib/genJSON/index.js.map +1 -0
- package/dist/src/lib/genXML/index.d.ts +7 -0
- package/dist/src/lib/genXML/index.js +51 -0
- package/dist/src/lib/genXML/index.js.map +1 -0
- package/dist/src/lib/genXML/sigXML/genKeysAndCert.d.ts +6 -0
- package/dist/src/lib/genXML/sigXML/genKeysAndCert.js +77 -0
- package/dist/src/lib/genXML/sigXML/genKeysAndCert.js.map +1 -0
- package/dist/src/lib/genXML/sigXML/index.d.ts +1 -0
- package/dist/src/lib/genXML/sigXML/index.js +86 -0
- package/dist/src/lib/genXML/sigXML/index.js.map +1 -0
- package/dist/src/lib/genXML/xmlConfig.d.ts +55 -0
- package/dist/src/lib/genXML/xmlConfig.js +36 -0
- package/dist/src/lib/genXML/xmlConfig.js.map +1 -0
- package/dist/src/services/getToken/index.d.ts +3 -0
- package/dist/src/services/getToken/index.js +22 -0
- package/dist/src/services/getToken/index.js.map +1 -0
- package/dist/src/services/send/index.d.ts +2 -0
- package/dist/src/services/send/index.js +40 -0
- package/dist/src/services/send/index.js.map +1 -0
- package/dist/src/types/xml/notaDeCredito.d.ts +21 -0
- package/dist/src/types/xml/notaDeCredito.js +3 -0
- package/dist/src/types/xml/notaDeCredito.js.map +1 -0
- package/dist/src/types/xml/notaDeDebito.d.ts +21 -0
- package/dist/src/types/xml/notaDeDebito.js +3 -0
- package/dist/src/types/xml/notaDeDebito.js.map +1 -0
- package/examples/README.md +54 -0
- package/{test/examples → examples}/createAndSend.ts +16 -12
- package/{test/examples → examples}/createCreditNote.ts +3 -3
- package/{test/examples → examples}/createDebitNote.ts +3 -3
- package/{test/examples → examples}/genBasicXML.ts +2 -2
- package/{test/examples → examples}/getClave.ts +2 -2
- package/examples/getToken.ts +15 -0
- package/jest.config.js +20 -3
- package/package.json +15 -18
- package/src/ATV.ts +28 -0
- package/src/confirmXML.ts +4 -4
- package/src/creditNote.ts +9 -9
- package/src/data/codigoMoneda.ts +180 -0
- package/src/data/exoneracion.ts +11 -0
- package/src/data/impuestos.ts +26 -0
- package/src/data/tipoCedula.ts +8 -0
- package/src/data/unidadesMedida.ts +99 -0
- package/src/debitNote.ts +9 -9
- package/src/electronicBill.ts +17 -9
- package/src/helpers/comprobantes.ts +7 -7
- package/src/lib/genClave/index.ts +7 -7
- package/src/lib/genJSON/confirmXML.ts +2 -2
- package/src/lib/genJSON/index.ts +23 -21
- package/src/lib/genXML/index.ts +3 -9
- package/src/lib/genXML/sigXML/genKeysAndCert.ts +1 -5
- package/src/lib/genXML/sigXML/index.ts +1 -1
- package/src/lib/genXML/xmlConfig.ts +14 -1
- package/src/services/getToken/GetToken.ts +54 -0
- package/src/services/getToken/__tests__/GetToken.test.ts +82 -0
- package/src/services/getToken/index.ts +1 -1
- package/src/services/getToken/types.ts +30 -0
- package/src/services/send/index.ts +2 -2
- package/src/types/{facturaInterfaces.ts → facturaInterfaces.d.ts} +18 -1
- package/src/types/globalInterfaces.d.ts +5 -2
- package/src/types/xml/notaDeCredito.ts +1 -1
- package/src/types/xml/notaDeDebito.ts +1 -1
- package/{test/tools → tools}/strToClave.ts +1 -1
- package/tools/xsdToJsonSchema.ts +108 -0
- package/tsconfig.json +5 -2
- package/test/examples/README.md +0 -43
- package/test/examples/getToken.ts +0 -18
- /package/__tests__/{unit → tests}/getToken.test.ts +0 -0
- /package/{test/examples → examples}/confirmXML.ts +0 -0
- /package/{test/examples → examples}/consultXML.ts +0 -0
- /package/{test/tools → tools}/readXML.ts +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.xmlExtructures = exports.defaultOptions = exports.declaration = void 0;
|
|
4
|
+
const FE_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica';
|
|
5
|
+
const FE_XML_SCHEMA_XSI = 'https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/FacturaElectronica_V4.3.xsd';
|
|
6
|
+
const FEE_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronicaExportacion';
|
|
7
|
+
const FEE_XML_SCHEMA_XSI = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronicaExportacion.xsd';
|
|
8
|
+
const MR_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/mensajeReceptor';
|
|
9
|
+
const NC_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/notaCreditoElectronica';
|
|
10
|
+
const NC_XML_SCHEMA_XSI = 'https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/NotaCreditoElectronica_V4.3.xsd';
|
|
11
|
+
const ND_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/notaDebitoElectronica';
|
|
12
|
+
const ND_XML_SCHEMA_XSI = 'https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/NotaDebitoElectronica_V4.3.xsd';
|
|
13
|
+
exports.declaration = '<?xml version="1.0" encoding="utf-8"?>';
|
|
14
|
+
exports.defaultOptions = {
|
|
15
|
+
attrNodeName: 'attr'
|
|
16
|
+
};
|
|
17
|
+
const COMMON_STRUCTURE = {
|
|
18
|
+
'xmlns:ds': 'http://www.w3.org/2000/09/xmldsig#',
|
|
19
|
+
'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema',
|
|
20
|
+
'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance'
|
|
21
|
+
};
|
|
22
|
+
const FE_XML_ATTRS = Object.assign(Object.assign({ xmlns: FE_XML_SCHEMA_NS }, COMMON_STRUCTURE), { 'xsi:schemaLocation': `${FE_XML_SCHEMA_NS} ${FE_XML_SCHEMA_XSI}` });
|
|
23
|
+
const FEE_XML_ATTRS = Object.assign(Object.assign({ xmlns: FE_XML_SCHEMA_NS }, COMMON_STRUCTURE), { 'xsi:schemaLocation': `${FEE_XML_SCHEMA_NS} ${FEE_XML_SCHEMA_XSI}` });
|
|
24
|
+
const NC_XML_ATTRS = Object.assign(Object.assign({ xmlns: NC_XML_SCHEMA_NS }, COMMON_STRUCTURE), { 'xsi:schemaLocation': `${NC_XML_SCHEMA_NS} ${NC_XML_SCHEMA_XSI}` });
|
|
25
|
+
const ND_XML_ATTRS = Object.assign(Object.assign({ xmlns: NC_XML_SCHEMA_NS }, COMMON_STRUCTURE), { 'xsi:schemaLocation': `${ND_XML_SCHEMA_NS} ${ND_XML_SCHEMA_XSI}` });
|
|
26
|
+
const MR_XML_ATTRS = Object.assign(Object.assign({ xmlns: MR_XML_SCHEMA_NS }, COMMON_STRUCTURE), { 'xsi:schemaLocation': `${MR_XML_SCHEMA_NS}` });
|
|
27
|
+
exports.xmlExtructures = {
|
|
28
|
+
FacturaElectronica: FE_XML_ATTRS,
|
|
29
|
+
FacturaElectronicaExportacion: FEE_XML_ATTRS,
|
|
30
|
+
NC: NC_XML_ATTRS,
|
|
31
|
+
ND: ND_XML_ATTRS,
|
|
32
|
+
CCE: MR_XML_ATTRS,
|
|
33
|
+
CPCE: MR_XML_ATTRS,
|
|
34
|
+
RCE: MR_XML_ATTRS
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=xmlConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xmlConfig.js","sourceRoot":"","sources":["../../../../src/lib/genXML/xmlConfig.ts"],"names":[],"mappings":";;;AAAA,MAAM,gBAAgB,GAAG,gFAAgF,CAAA;AACzG,MAAM,iBAAiB,GAAG,2GAA2G,CAAA;AAErI,MAAM,iBAAiB,GAAG,2FAA2F,CAAA;AACrH,MAAM,kBAAkB,GAAG,+FAA+F,CAAA;AAE1H,MAAM,gBAAgB,GAAG,6EAA6E,CAAA;AAEtG,MAAM,gBAAgB,GAAG,oFAAoF,CAAA;AAC7G,MAAM,iBAAiB,GAAG,+GAA+G,CAAA;AAEzI,MAAM,gBAAgB,GAAG,mFAAmF,CAAA;AAC5G,MAAM,iBAAiB,GAAG,8GAA8G,CAAA;AAE3H,QAAA,WAAW,GAAG,wCAAwC,CAAA;AAEtD,QAAA,cAAc,GAAG;IAC5B,YAAY,EAAE,MAAM;CACrB,CAAA;AAED,MAAM,gBAAgB,GAAG;IACvB,UAAU,EAAE,oCAAoC;IAChD,WAAW,EAAE,kCAAkC;IAC/C,WAAW,EAAE,2CAA2C;CACzD,CAAA;AAED,MAAM,YAAY,iCAChB,KAAK,EAAE,gBAAgB,IACpB,gBAAgB,KACnB,oBAAoB,EAAE,GAAG,gBAAgB,IAAI,iBAAiB,EAAE,GACjE,CAAA;AAED,MAAM,aAAa,iCACjB,KAAK,EAAE,gBAAgB,IACpB,gBAAgB,KACnB,oBAAoB,EAAE,GAAG,iBAAiB,IAAI,kBAAkB,EAAE,GACnE,CAAA;AAED,MAAM,YAAY,iCAChB,KAAK,EAAE,gBAAgB,IACpB,gBAAgB,KACnB,oBAAoB,EAAE,GAAG,gBAAgB,IAAI,iBAAiB,EAAE,GACjE,CAAA;AAED,MAAM,YAAY,iCAChB,KAAK,EAAE,gBAAgB,IACpB,gBAAgB,KACnB,oBAAoB,EAAE,GAAG,gBAAgB,IAAI,iBAAiB,EAAE,GACjE,CAAA;AAED,MAAM,YAAY,iCAChB,KAAK,EAAE,gBAAgB,IACpB,gBAAgB,KACnB,oBAAoB,EAAE,GAAG,gBAAgB,EAAE,GAC5C,CAAA;AAEY,QAAA,cAAc,GAAG;IAC5B,kBAAkB,EAAE,YAAY;IAChC,6BAA6B,EAAE,aAAa;IAC5C,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,YAAY;CAClB,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
const axios_1 = __importDefault(require("axios"));
|
|
7
|
+
const querystring_1 = __importDefault(require("querystring"));
|
|
8
|
+
const MAIN_DOMAIN = 'https://idp.comprobanteselectronicos.go.cr';
|
|
9
|
+
const RUT = (process.env.IS_STG) ? 'rut-stag' : 'rut';
|
|
10
|
+
const PATH = `/auth/realms/${RUT}/protocol/openid-connect/token`;
|
|
11
|
+
const TOKEN_URL = MAIN_DOMAIN + PATH;
|
|
12
|
+
exports.default = (postOptions) => {
|
|
13
|
+
return axios_1.default.post(TOKEN_URL, querystring_1.default.stringify(postOptions), {
|
|
14
|
+
headers: {
|
|
15
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
/*
|
|
20
|
+
* https://www.hacienda.go.cr/docs/5d16ade309fe0_Guia_IdP.pdf
|
|
21
|
+
*/
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/getToken/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,8DAA4B;AAG5B,MAAM,WAAW,GAAG,4CAA4C,CAAA;AAChE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAA;AACrD,MAAM,IAAI,GAAG,gBAAgB,GAAG,gCAAgC,CAAA;AAEhE,MAAM,SAAS,GAAG,WAAW,GAAG,IAAI,CAAA;AAEpC,kBAAe,CAAC,WAA6B,EAAgB,EAAE;IAC7D,OAAO,eAAK,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAE,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;QACtD,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;SACpD;KACF,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;GAEG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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.sendToCustomURL = exports.send = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const MAIN_DOMAIN = 'https://api.comprobanteselectronicos.go.cr/';
|
|
9
|
+
const RUT = (process.env.IS_STG) ? 'recepcion-sandbox' : 'recepcion';
|
|
10
|
+
const PATH = `${RUT}/v1/recepcion/`;
|
|
11
|
+
const SANBOX_URL = 'https://api-sandbox.comprobanteselectronicos.go.cr/recepcion/v1/recepcion';
|
|
12
|
+
const URL = (process.env.IS_STG) ? SANBOX_URL : MAIN_DOMAIN + PATH;
|
|
13
|
+
function send(token, postOptions) {
|
|
14
|
+
return (0, axios_1.default)({
|
|
15
|
+
url: URL,
|
|
16
|
+
method: 'post',
|
|
17
|
+
data: postOptions,
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: 'bearer ' + token,
|
|
20
|
+
'Content-Type': 'application/json'
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
exports.send = send;
|
|
25
|
+
function sendToCustomURL(token, url) {
|
|
26
|
+
return (0, axios_1.default)({
|
|
27
|
+
url: url,
|
|
28
|
+
method: 'get',
|
|
29
|
+
headers: {
|
|
30
|
+
Authorization: 'bearer ' + token,
|
|
31
|
+
'Content-Type': 'application/json'
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
exports.sendToCustomURL = sendToCustomURL;
|
|
36
|
+
/*
|
|
37
|
+
* https://www.hacienda.go.cr/docs/5d16ade309fe0_Guia_IdP.pdf
|
|
38
|
+
* https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.2/comprobantes-electronicos-api.html#
|
|
39
|
+
*/
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/send/index.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AAEzB,MAAM,WAAW,GAAG,6CAA6C,CAAA;AACjE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,CAAA;AACpE,MAAM,IAAI,GAAG,GAAG,GAAG,gBAAgB,CAAA;AACnC,MAAM,UAAU,GAAG,2EAA2E,CAAA;AAC9F,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAA;AAElE,SAAgB,IAAI,CAAC,KAAa,EAAE,WAAgB;IAClD,OAAO,IAAA,eAAK,EAAC;QACX,GAAG,EAAE,GAAG;QACR,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,GAAG,KAAK;YAChC,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;AACJ,CAAC;AAVD,oBAUC;AAED,SAAgB,eAAe,CAAC,KAAa,EAAE,GAAW;IACxD,OAAO,IAAA,eAAK,EAAC;QACX,GAAG,EAAE,GAAG;QACR,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,GAAG,KAAK;YAChC,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;AACJ,CAAC;AATD,0CASC;AAED;;;GAGG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Persona, DetalleServicio, Resumen } from '@src/types/facturaInterfaces';
|
|
2
|
+
declare type NotaCreditoElectronica = {
|
|
3
|
+
Clave: string;
|
|
4
|
+
CodigoActividad: string;
|
|
5
|
+
NumeroConsecutivo: string;
|
|
6
|
+
FechaEmision?: string;
|
|
7
|
+
Emisor: Persona;
|
|
8
|
+
Receptor: Persona;
|
|
9
|
+
CondicionVenta?: string;
|
|
10
|
+
PlazoCredito?: string;
|
|
11
|
+
MedioPago?: string;
|
|
12
|
+
DetalleServicio?: DetalleServicio;
|
|
13
|
+
ResumenFactura: Resumen;
|
|
14
|
+
Otros?: {
|
|
15
|
+
OtroTexto: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare type NotaCreditoContenedor = {
|
|
19
|
+
NotaCreditoElectronica: NotaCreditoElectronica;
|
|
20
|
+
};
|
|
21
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notaDeCredito.js","sourceRoot":"","sources":["../../../../src/types/xml/notaDeCredito.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Persona, DetalleServicio, Resumen } from '@src/types/facturaInterfaces';
|
|
2
|
+
declare type NotaDebitoElectronica = {
|
|
3
|
+
Clave: string;
|
|
4
|
+
CodigoActividad: string;
|
|
5
|
+
NumeroConsecutivo: string;
|
|
6
|
+
FechaEmision?: string;
|
|
7
|
+
Emisor: Persona;
|
|
8
|
+
Receptor: Persona;
|
|
9
|
+
CondicionVenta?: string;
|
|
10
|
+
PlazoCredito?: string;
|
|
11
|
+
MedioPago?: string;
|
|
12
|
+
DetalleServicio?: DetalleServicio;
|
|
13
|
+
ResumenFactura: Resumen;
|
|
14
|
+
Otros?: {
|
|
15
|
+
OtroTexto: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare type NotaDebitoContenedor = {
|
|
19
|
+
NotaDebitoElectronica: NotaDebitoElectronica;
|
|
20
|
+
};
|
|
21
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notaDeDebito.js","sourceRoot":"","sources":["../../../../src/types/xml/notaDeDebito.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Ejemplos con implementaciones para pruebas
|
|
2
|
+
|
|
3
|
+
Para probar crear y enviar factura
|
|
4
|
+
```
|
|
5
|
+
yarn ts-node -r tsconfig-paths/register --require dotenv/config examples/createAndSend.ts
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
Para probar genJson HeaderXML
|
|
9
|
+
```
|
|
10
|
+
yarn ts-node -r tsconfig-paths/register --require dotenv/config examples/genBasicXML.ts
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Generar la clave
|
|
14
|
+
```
|
|
15
|
+
yarn ts-node -r tsconfig-paths/register--require dotenv/config examples/getClave.ts
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Para crear una nota de credito
|
|
19
|
+
```
|
|
20
|
+
yarn ts-node -r tsconfig-paths/register --require dotenv/config examples/createCreditNote.ts
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Para obtener un token
|
|
24
|
+
```
|
|
25
|
+
yarn ts-node -r tsconfig-paths/register --require dotenv/config examples/getToken.ts
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Testing
|
|
29
|
+
Para probar las funcionalidades se recomienda crear un .env en donde se especifiquen datos de prueba.
|
|
30
|
+
```
|
|
31
|
+
USERNAME_TEST= ## Provided be ATV System
|
|
32
|
+
PASSWORD_TEST= ## Provided be ATV System
|
|
33
|
+
IS_STG=1
|
|
34
|
+
SOURCE_P12_URI= ## Provided be ATV System
|
|
35
|
+
SOURCE_P12_PASSPORT= ## Provided be ATV System
|
|
36
|
+
SOURCE_URI_XML_OUTPUT= ## Custom OS PATH
|
|
37
|
+
XML_TO_CONFIRM= ## Custom OS PATH
|
|
38
|
+
```
|
|
39
|
+
Example:
|
|
40
|
+
```
|
|
41
|
+
USERNAME_TEST=USER@stag.comprobanteselectronicos.go.cr
|
|
42
|
+
PASSWORD_TEST=PASSWORD_PROVIDED_BY_ATV
|
|
43
|
+
IS_STG="1"
|
|
44
|
+
SOURCE_P12_URI=$PATH/#####.p12
|
|
45
|
+
SOURCE_P12_PASSPORT=1234
|
|
46
|
+
SOURCE_URI_XML_OUTPUT=$PATH/__test__/output/output.xml
|
|
47
|
+
XML_TO_CONFIRM=$PATH/__test__/input/Comprobante_Electronico_####_####.xml
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Tools
|
|
51
|
+
Para usar readXML establecer en .env
|
|
52
|
+
```
|
|
53
|
+
SOURCE_URI=
|
|
54
|
+
```
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ClientPayload } from '@src/types/globalInterfaces'
|
|
2
2
|
import requestStub from '@test/stubs/frontendRequest.stub'
|
|
3
|
-
import
|
|
4
|
-
import getToken from '@src/services/getToken'
|
|
5
|
-
import { sendToCustomURL } from '@src/services/send/index'
|
|
3
|
+
import { eletronicBill, sendToCustomURL } from '@src/index'
|
|
6
4
|
import fs from 'fs'
|
|
5
|
+
import { ATV } from '@src/ATV'
|
|
7
6
|
|
|
8
7
|
const IS_STG = process.env.IS_STG
|
|
9
8
|
const USERNAME_TEST = process.env.USERNAME_TEST
|
|
@@ -12,9 +11,16 @@ console.log('process.env.IS_STG', IS_STG)
|
|
|
12
11
|
|
|
13
12
|
const SOURCE_P12_URI = process.env.SOURCE_P12_URI
|
|
14
13
|
const SOURCE_P12_PASSPORT = process.env.SOURCE_P12_PASSPORT
|
|
14
|
+
|
|
15
|
+
if (!SOURCE_P12_PASSPORT || !SOURCE_P12_URI) {
|
|
16
|
+
throw new Error('No environment. For running examples set .env before.')
|
|
17
|
+
}
|
|
18
|
+
|
|
15
19
|
const pem = fs.readFileSync(SOURCE_P12_URI, 'binary')
|
|
16
20
|
|
|
17
|
-
const frontEndRequest:
|
|
21
|
+
const frontEndRequest: ClientPayload = requestStub
|
|
22
|
+
|
|
23
|
+
console.log('requestStub consecutivo', requestStub.consecutivo)
|
|
18
24
|
|
|
19
25
|
function decodeBase64(encodedStr: string): string {
|
|
20
26
|
const buff = Buffer.from(encodedStr, 'base64')
|
|
@@ -24,7 +30,7 @@ function decodeBase64(encodedStr: string): string {
|
|
|
24
30
|
function getConfimation(token: string, data: any, ms: number): Promise<any> {
|
|
25
31
|
return new Promise((resolve, reject): any => {
|
|
26
32
|
setTimeout(() => {
|
|
27
|
-
const location = data
|
|
33
|
+
const location = data?.headers?.location
|
|
28
34
|
console.log('location', location)
|
|
29
35
|
sendToCustomURL(token, location)
|
|
30
36
|
.then(data => resolve(data))
|
|
@@ -34,15 +40,13 @@ function getConfimation(token: string, data: any, ms: number): Promise<any> {
|
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
async function main(): Promise<void> {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
client_secret: '', // eslint-disable-line
|
|
40
|
-
grant_type: 'password', // eslint-disable-line
|
|
43
|
+
const atv = new ATV({}, 'stg')
|
|
44
|
+
const tokenData = await atv.getToken({
|
|
41
45
|
username: USERNAME_TEST,
|
|
42
46
|
password: PASSWORD_TEST
|
|
43
47
|
})
|
|
44
|
-
const token =
|
|
45
|
-
const data = await
|
|
48
|
+
const token = tokenData.accessToken
|
|
49
|
+
const data = await eletronicBill(token, frontEndRequest, {
|
|
46
50
|
buffer: pem,
|
|
47
51
|
password: SOURCE_P12_PASSPORT
|
|
48
52
|
})
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import creditNote from '
|
|
1
|
+
import { ClientPayload } from '@src/types/globalInterfaces'
|
|
2
|
+
import creditNote from '@src/creditNote'
|
|
3
3
|
import getToken from '@src/services/getToken'
|
|
4
4
|
import requestStub from '@test/stubs/frontendRequest.stub'
|
|
5
5
|
import fs from 'fs'
|
|
6
6
|
|
|
7
|
-
const frontEndRequest:
|
|
7
|
+
const frontEndRequest: ClientPayload = requestStub
|
|
8
8
|
const USERNAME_TEST = process.env.USERNAME_TEST
|
|
9
9
|
const PASSWORD_TEST = process.env.PASSWORD_TEST
|
|
10
10
|
const SOURCE_P12_URI = process.env.SOURCE_P12_URI
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import debitNote from '
|
|
1
|
+
import { ClientPayload } from '@src/types/globalInterfaces'
|
|
2
|
+
import debitNote from '@src/debitNote'
|
|
3
3
|
import getToken from '@src/services/getToken'
|
|
4
4
|
import requestStub from '@test/stubs/frontendRequest.stub'
|
|
5
5
|
import fs from 'fs'
|
|
6
6
|
|
|
7
|
-
const frontEndRequest:
|
|
7
|
+
const frontEndRequest: ClientPayload = requestStub
|
|
8
8
|
const USERNAME_TEST = process.env.USERNAME_TEST
|
|
9
9
|
const PASSWORD_TEST = process.env.PASSWORD_TEST
|
|
10
10
|
const SOURCE_P12_URI = process.env.SOURCE_P12_URI
|
|
@@ -2,9 +2,9 @@ import fs from 'fs'
|
|
|
2
2
|
import genJSON from '@src/lib/genJSON'
|
|
3
3
|
import { parseOptions, genClaveObj, genString } from '@src/lib/genClave'
|
|
4
4
|
import requestStub from '@test/stubs/frontendRequest.stub'
|
|
5
|
-
import {
|
|
5
|
+
import { ClientPayload } from '@src/types/globalInterfaces'
|
|
6
6
|
|
|
7
|
-
const frontEndRequest:
|
|
7
|
+
const frontEndRequest: ClientPayload = requestStub
|
|
8
8
|
|
|
9
9
|
const SOURCE_P12_URI = process.env.SOURCE_P12_URI
|
|
10
10
|
const SOURCE_P12_PASSPORT = process.env.SOURCE_P12_PASSPORT
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getClave } from '@src/lib/genClave'
|
|
2
2
|
import requestStub from '@test/stubs/frontendRequest.stub'
|
|
3
|
-
import {
|
|
3
|
+
import { ClientPayload } from '@src/types/globalInterfaces'
|
|
4
4
|
|
|
5
|
-
const frontEndRequest:
|
|
5
|
+
const frontEndRequest: ClientPayload = requestStub
|
|
6
6
|
const result = getClave(frontEndRequest)
|
|
7
7
|
|
|
8
8
|
console.log('Clave', result)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ATV } from '@src/ATV'
|
|
2
|
+
|
|
3
|
+
const IS_STG = process.env.IS_STG
|
|
4
|
+
const USERNAME_TEST = process.env.USERNAME_TEST
|
|
5
|
+
const PASSWORD_TEST = process.env.PASSWORD_TEST
|
|
6
|
+
console.log('process.env.IS_STG', IS_STG)
|
|
7
|
+
|
|
8
|
+
const atv = new ATV({}, 'stg')
|
|
9
|
+
const tokenData = atv.getToken({
|
|
10
|
+
username: USERNAME_TEST,
|
|
11
|
+
password: PASSWORD_TEST
|
|
12
|
+
})
|
|
13
|
+
tokenData.then((resp) => {
|
|
14
|
+
console.log('accessToken', resp.accessToken)
|
|
15
|
+
})
|
package/jest.config.js
CHANGED
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
module.exports = {
|
|
2
2
|
testEnvironment: 'node',
|
|
3
3
|
transform: {
|
|
4
|
-
'^.+\\.ts$': 'ts-jest'
|
|
4
|
+
'^.+\\.ts$': 'ts-jest'
|
|
5
5
|
},
|
|
6
|
-
modulePathIgnorePatterns: ['inputs', 'stubs']
|
|
7
|
-
|
|
6
|
+
modulePathIgnorePatterns: ['<rootDir>/dist/', 'inputs', 'stubs'],
|
|
7
|
+
moduleNameMapper: {
|
|
8
|
+
'^@test(.*)$': '<rootDir>/__tests__/$1',
|
|
9
|
+
'^@src(.*)$': '<rootDir>/src/$1'
|
|
10
|
+
},
|
|
11
|
+
coverageThreshold: {
|
|
12
|
+
global: {
|
|
13
|
+
statements: 58,
|
|
14
|
+
branches: 35,
|
|
15
|
+
functions: 58,
|
|
16
|
+
lines: 58
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
restoreMocks: true,
|
|
20
|
+
collectCoverage: true,
|
|
21
|
+
collectCoverageFrom: [
|
|
22
|
+
'src/**/*.{ts,js}'
|
|
23
|
+
]
|
|
24
|
+
}
|
package/package.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@facturacr/atv-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2-beta",
|
|
4
4
|
"description": "Librería (SDK) de Javascript/NodeJS para acceder al API de Administración Tributaria Virtual (ATV) del Ministerio de Hacienda.",
|
|
5
|
-
"main": "index.js",
|
|
5
|
+
"main": "dist/src/index.js",
|
|
6
|
+
"types": "dist/src//index.d.ts",
|
|
6
7
|
"directories": {
|
|
7
8
|
"doc": "doc",
|
|
8
9
|
"example": "examples",
|
|
9
|
-
"test": "
|
|
10
|
+
"test": "__test__"
|
|
10
11
|
},
|
|
11
12
|
"scripts": {
|
|
12
|
-
"test
|
|
13
|
+
"test": "npx jest",
|
|
13
14
|
"dev": "dotenv -- nodemon -e ts,graphql -x 'yarn lint & ts-node -r tsconfig-paths/register src/index.ts'",
|
|
14
|
-
"build": "yarn lint &
|
|
15
|
-
"lint": "eslint --ext .ts, --ignore-path .gitignore ."
|
|
16
|
-
"test": "test"
|
|
15
|
+
"build": "yarn lint & tsc",
|
|
16
|
+
"lint": "eslint --ext .ts, --ignore-path .gitignore ."
|
|
17
17
|
},
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
@@ -41,23 +41,20 @@
|
|
|
41
41
|
"eslint-plugin-node": "^11.1.0",
|
|
42
42
|
"eslint-plugin-promise": "^4.3.1",
|
|
43
43
|
"eslint-plugin-standard": "^5.0.0",
|
|
44
|
-
"
|
|
45
|
-
"
|
|
44
|
+
"jest": "^26.6.3",
|
|
45
|
+
"nodemon": "^2.0.19",
|
|
46
|
+
"ts-jest": "^26.5.6",
|
|
47
|
+
"ts-node": "10.9.1",
|
|
48
|
+
"tsc": "^1.20150623.0",
|
|
46
49
|
"tsconfig-paths": "^3.9.0",
|
|
47
|
-
"typescript": "^4.2.4"
|
|
48
|
-
"xmldsigjs": "^2.1.3"
|
|
50
|
+
"typescript": "^4.2.4"
|
|
49
51
|
},
|
|
50
52
|
"dependencies": {
|
|
51
53
|
"@peculiar/webcrypto": "^1.1.6",
|
|
52
54
|
"axios": "^0.21.1",
|
|
53
55
|
"fast-xml-parser": "^3.19.0",
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"node-forge": "^0.10.0",
|
|
57
|
-
"ts-jest": "^26.5.6",
|
|
58
|
-
"tsc": "^1.20150623.0",
|
|
59
|
-
"xadesjs": "^2.1.1",
|
|
60
|
-
"xml-crypto": "^2.1.1",
|
|
56
|
+
"node-forge": "^1.3.0",
|
|
57
|
+
"xadesjs": "^2.1.2",
|
|
61
58
|
"xmldom-alpha": "^0.1.28"
|
|
62
59
|
}
|
|
63
60
|
}
|
package/src/ATV.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
import { GetToken } from './services/getToken/GetToken'
|
|
3
|
+
import { GetTokenDto, GetTokenResponse } from './services/getToken/types'
|
|
4
|
+
|
|
5
|
+
export type Mode = 'prod' | 'stg' | 'custom';
|
|
6
|
+
|
|
7
|
+
export type ATVOptions = {
|
|
8
|
+
defaultOverwrites?: {
|
|
9
|
+
tokenServiceUrl: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type TokenServiceProps = {
|
|
14
|
+
serviceUrl: string;
|
|
15
|
+
clientId: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class ATV {
|
|
19
|
+
public readonly options: ATVOptions
|
|
20
|
+
constructor(options?: ATVOptions, public readonly mode: Mode = 'prod') {
|
|
21
|
+
this.options = options
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public getToken(params: GetTokenDto): Promise<GetTokenResponse> {
|
|
25
|
+
const tokenService = new GetToken(this)
|
|
26
|
+
return tokenService.execute(params)
|
|
27
|
+
}
|
|
28
|
+
}
|
package/src/confirmXML.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { consecutivoStr } from '
|
|
2
|
-
import { xmlToJson, genXML } from '
|
|
3
|
-
import { send } from '
|
|
4
|
-
import { getFinalMessage, getMsjObj } from '
|
|
1
|
+
import { consecutivoStr } from '@src/lib/genClave'
|
|
2
|
+
import { xmlToJson, genXML } from '@src/lib/genXML/index'
|
|
3
|
+
import { send } from '@src/services/send/index'
|
|
4
|
+
import { getFinalMessage, getMsjObj } from '@src/lib/genJSON/confirmXML'
|
|
5
5
|
|
|
6
6
|
function getConsecutivoStr(opts: any): string {
|
|
7
7
|
return consecutivoStr({
|
package/src/creditNote.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { NotaCreditoContenedor } from '
|
|
3
|
-
import { genXML } from '
|
|
4
|
-
import { send } from '
|
|
5
|
-
import { genClaveObj, genString, parseOptions } from '
|
|
1
|
+
import { ClientPayload, XmlOpt } from '@src/types/globalInterfaces'
|
|
2
|
+
import { NotaCreditoContenedor } from '@src/types/xml/notaDeCredito'
|
|
3
|
+
import { genXML } from '@src/lib/genXML/index'
|
|
4
|
+
import { send } from '@src/services/send/index'
|
|
5
|
+
import { genClaveObj, genString, parseOptions } from '@src/lib/genClave/index'
|
|
6
6
|
import {
|
|
7
7
|
getBillResum,
|
|
8
8
|
getReceiver,
|
|
9
9
|
getSender,
|
|
10
10
|
getSimpleReceiver,
|
|
11
11
|
getSimpleSender
|
|
12
|
-
} from '
|
|
12
|
+
} from '@src/helpers/comprobantes'
|
|
13
13
|
|
|
14
14
|
const VOUCHER_TYPE = 'NC'
|
|
15
15
|
|
|
16
16
|
export function parseCreditNote(options: {
|
|
17
|
-
frontEndRequest:
|
|
17
|
+
frontEndRequest: ClientPayload;
|
|
18
18
|
consecutivo: string;
|
|
19
19
|
clave: string;
|
|
20
20
|
date: Date;
|
|
@@ -41,7 +41,7 @@ export function parseCreditNote(options: {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
function sendMessage(options: {
|
|
44
|
-
frontEndRequest:
|
|
44
|
+
frontEndRequest: ClientPayload;
|
|
45
45
|
token: string;
|
|
46
46
|
clave: string;
|
|
47
47
|
date: Date;
|
|
@@ -65,7 +65,7 @@ function sendMessage(options: {
|
|
|
65
65
|
|
|
66
66
|
export default async (options: {
|
|
67
67
|
token: string;
|
|
68
|
-
frontEndRequest:
|
|
68
|
+
frontEndRequest: ClientPayload;
|
|
69
69
|
xmlOpt: XmlOpt;
|
|
70
70
|
}): Promise<any> => {
|
|
71
71
|
const date = new Date()
|