@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.
Files changed (176) hide show
  1. package/.env.example +7 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. package/.github/pull_request_template.md +7 -0
  5. package/.github/workflows/ci.yml +3 -3
  6. package/CODE_OF_CONDUCT.md +128 -0
  7. package/LICENSE +21 -0
  8. package/README.md +8 -1
  9. package/__tests__/stubs/dummyKeys/README.md +19 -0
  10. package/__tests__/stubs/frontendRequest.stub.ts +6 -5
  11. package/__tests__/stubs/token.stub.ts +18 -0
  12. package/__tests__/tests/electronicBill.test.ts +28 -0
  13. package/__tests__/{unit → tests}/getClave.test.ts +2 -2
  14. package/__tests__/tests/lib/getClave.test.ts +11 -0
  15. package/__tests__/tests/services/getToken.test.ts +15 -0
  16. package/atv-structures/4.3/FacturaElectronicaExportacion_V4.3.xsd.xml +1747 -0
  17. package/atv-structures/4.3/FacturaElectronica_V4.3.xsd.xml +1781 -0
  18. package/dist/__tests__/stubs/frontendRequest.stub.d.ts +3 -0
  19. package/dist/__tests__/stubs/frontendRequest.stub.js +61 -0
  20. package/dist/__tests__/stubs/frontendRequest.stub.js.map +1 -0
  21. package/dist/__tests__/stubs/token.stub.d.ts +17 -0
  22. package/dist/__tests__/stubs/token.stub.js +21 -0
  23. package/dist/__tests__/stubs/token.stub.js.map +1 -0
  24. package/dist/__tests__/tests/electronicBill.test.d.ts +1 -0
  25. package/dist/__tests__/tests/electronicBill.test.js +38 -0
  26. package/dist/__tests__/tests/electronicBill.test.js.map +1 -0
  27. package/dist/__tests__/tests/getClave.test.d.ts +1 -0
  28. package/dist/__tests__/tests/getClave.test.js +15 -0
  29. package/dist/__tests__/tests/getClave.test.js.map +1 -0
  30. package/dist/__tests__/tests/getToken.test.d.ts +0 -0
  31. package/dist/__tests__/tests/getToken.test.js +28 -0
  32. package/dist/__tests__/tests/getToken.test.js.map +1 -0
  33. package/dist/__tests__/tests/lib/getClave.test.d.ts +1 -0
  34. package/dist/__tests__/tests/lib/getClave.test.js +15 -0
  35. package/dist/__tests__/tests/lib/getClave.test.js.map +1 -0
  36. package/dist/__tests__/tests/services/getToken.test.d.ts +1 -0
  37. package/dist/__tests__/tests/services/getToken.test.js +27 -0
  38. package/dist/__tests__/tests/services/getToken.test.js.map +1 -0
  39. package/dist/examples/confirmXML.d.ts +1 -0
  40. package/dist/examples/confirmXML.js +89 -0
  41. package/dist/examples/confirmXML.js.map +1 -0
  42. package/dist/examples/consultXML.d.ts +1 -0
  43. package/dist/examples/consultXML.js +55 -0
  44. package/dist/examples/consultXML.js.map +1 -0
  45. package/dist/examples/createAndSend.d.ts +1 -0
  46. package/dist/examples/createAndSend.js +78 -0
  47. package/dist/examples/createAndSend.js.map +1 -0
  48. package/dist/examples/createCreditNote.d.ts +1 -0
  49. package/dist/examples/createCreditNote.js +52 -0
  50. package/dist/examples/createCreditNote.js.map +1 -0
  51. package/dist/examples/createDebitNote.d.ts +1 -0
  52. package/dist/examples/createDebitNote.js +52 -0
  53. package/dist/examples/createDebitNote.js.map +1 -0
  54. package/dist/examples/genBasicXML.d.ts +1 -0
  55. package/dist/examples/genBasicXML.js +44 -0
  56. package/dist/examples/genBasicXML.js.map +1 -0
  57. package/dist/examples/getClave.d.ts +1 -0
  58. package/dist/examples/getClave.js +12 -0
  59. package/dist/examples/getClave.js.map +1 -0
  60. package/dist/examples/getToken.d.ts +1 -0
  61. package/dist/examples/getToken.js +22 -0
  62. package/dist/examples/getToken.js.map +1 -0
  63. package/dist/src/confirmXML.d.ts +8 -0
  64. package/dist/src/confirmXML.js +44 -0
  65. package/dist/src/confirmXML.js.map +1 -0
  66. package/dist/src/creditNote.d.ts +14 -0
  67. package/dist/src/creditNote.js +77 -0
  68. package/dist/src/creditNote.js.map +1 -0
  69. package/dist/src/data/codigoMoneda.d.ts +1 -0
  70. package/dist/src/data/codigoMoneda.js +184 -0
  71. package/dist/src/data/codigoMoneda.js.map +1 -0
  72. package/dist/src/data/exoneracion.d.ts +1 -0
  73. package/dist/src/data/exoneracion.js +15 -0
  74. package/dist/src/data/exoneracion.js.map +1 -0
  75. package/dist/src/data/impuestos.d.ts +25 -0
  76. package/dist/src/data/impuestos.js +51 -0
  77. package/dist/src/data/impuestos.js.map +1 -0
  78. package/dist/src/data/tipoCedula.d.ts +7 -0
  79. package/dist/src/data/tipoCedula.js +17 -0
  80. package/dist/src/data/tipoCedula.js.map +1 -0
  81. package/dist/src/data/tipoDocumento.d.ts +26 -0
  82. package/dist/src/data/tipoDocumento.js +30 -0
  83. package/dist/src/data/tipoDocumento.js.map +1 -0
  84. package/dist/src/data/unidadesMedida.d.ts +5 -0
  85. package/dist/src/data/unidadesMedida.js +141 -0
  86. package/dist/src/data/unidadesMedida.js.map +1 -0
  87. package/dist/src/debitNote.d.ts +14 -0
  88. package/dist/src/debitNote.js +77 -0
  89. package/dist/src/debitNote.js.map +1 -0
  90. package/dist/src/electronicBill.d.ts +3 -0
  91. package/dist/src/electronicBill.js +61 -0
  92. package/dist/src/electronicBill.js.map +1 -0
  93. package/dist/src/helpers/comprobantes.d.ts +7 -0
  94. package/dist/src/helpers/comprobantes.js +92 -0
  95. package/dist/src/helpers/comprobantes.js.map +1 -0
  96. package/dist/src/index.d.ts +7 -0
  97. package/dist/src/index.js +42 -0
  98. package/dist/src/index.js.map +1 -0
  99. package/dist/src/lib/genClave/index.d.ts +9 -0
  100. package/dist/src/lib/genClave/index.js +119 -0
  101. package/dist/src/lib/genClave/index.js.map +1 -0
  102. package/dist/src/lib/genJSON/confirmXML.d.ts +7 -0
  103. package/dist/src/lib/genJSON/confirmXML.js +46 -0
  104. package/dist/src/lib/genJSON/confirmXML.js.map +1 -0
  105. package/dist/src/lib/genJSON/index.d.ts +3 -0
  106. package/dist/src/lib/genJSON/index.js +133 -0
  107. package/dist/src/lib/genJSON/index.js.map +1 -0
  108. package/dist/src/lib/genXML/index.d.ts +7 -0
  109. package/dist/src/lib/genXML/index.js +51 -0
  110. package/dist/src/lib/genXML/index.js.map +1 -0
  111. package/dist/src/lib/genXML/sigXML/genKeysAndCert.d.ts +6 -0
  112. package/dist/src/lib/genXML/sigXML/genKeysAndCert.js +77 -0
  113. package/dist/src/lib/genXML/sigXML/genKeysAndCert.js.map +1 -0
  114. package/dist/src/lib/genXML/sigXML/index.d.ts +1 -0
  115. package/dist/src/lib/genXML/sigXML/index.js +86 -0
  116. package/dist/src/lib/genXML/sigXML/index.js.map +1 -0
  117. package/dist/src/lib/genXML/xmlConfig.d.ts +55 -0
  118. package/dist/src/lib/genXML/xmlConfig.js +36 -0
  119. package/dist/src/lib/genXML/xmlConfig.js.map +1 -0
  120. package/dist/src/services/getToken/index.d.ts +3 -0
  121. package/dist/src/services/getToken/index.js +22 -0
  122. package/dist/src/services/getToken/index.js.map +1 -0
  123. package/dist/src/services/send/index.d.ts +2 -0
  124. package/dist/src/services/send/index.js +40 -0
  125. package/dist/src/services/send/index.js.map +1 -0
  126. package/dist/src/types/xml/notaDeCredito.d.ts +21 -0
  127. package/dist/src/types/xml/notaDeCredito.js +3 -0
  128. package/dist/src/types/xml/notaDeCredito.js.map +1 -0
  129. package/dist/src/types/xml/notaDeDebito.d.ts +21 -0
  130. package/dist/src/types/xml/notaDeDebito.js +3 -0
  131. package/dist/src/types/xml/notaDeDebito.js.map +1 -0
  132. package/examples/README.md +54 -0
  133. package/{test/examples → examples}/createAndSend.ts +16 -12
  134. package/{test/examples → examples}/createCreditNote.ts +3 -3
  135. package/{test/examples → examples}/createDebitNote.ts +3 -3
  136. package/{test/examples → examples}/genBasicXML.ts +2 -2
  137. package/{test/examples → examples}/getClave.ts +2 -2
  138. package/examples/getToken.ts +15 -0
  139. package/jest.config.js +20 -3
  140. package/package.json +15 -18
  141. package/src/ATV.ts +28 -0
  142. package/src/confirmXML.ts +4 -4
  143. package/src/creditNote.ts +9 -9
  144. package/src/data/codigoMoneda.ts +180 -0
  145. package/src/data/exoneracion.ts +11 -0
  146. package/src/data/impuestos.ts +26 -0
  147. package/src/data/tipoCedula.ts +8 -0
  148. package/src/data/unidadesMedida.ts +99 -0
  149. package/src/debitNote.ts +9 -9
  150. package/src/electronicBill.ts +17 -9
  151. package/src/helpers/comprobantes.ts +7 -7
  152. package/src/lib/genClave/index.ts +7 -7
  153. package/src/lib/genJSON/confirmXML.ts +2 -2
  154. package/src/lib/genJSON/index.ts +23 -21
  155. package/src/lib/genXML/index.ts +3 -9
  156. package/src/lib/genXML/sigXML/genKeysAndCert.ts +1 -5
  157. package/src/lib/genXML/sigXML/index.ts +1 -1
  158. package/src/lib/genXML/xmlConfig.ts +14 -1
  159. package/src/services/getToken/GetToken.ts +54 -0
  160. package/src/services/getToken/__tests__/GetToken.test.ts +82 -0
  161. package/src/services/getToken/index.ts +1 -1
  162. package/src/services/getToken/types.ts +30 -0
  163. package/src/services/send/index.ts +2 -2
  164. package/src/types/{facturaInterfaces.ts → facturaInterfaces.d.ts} +18 -1
  165. package/src/types/globalInterfaces.d.ts +5 -2
  166. package/src/types/xml/notaDeCredito.ts +1 -1
  167. package/src/types/xml/notaDeDebito.ts +1 -1
  168. package/{test/tools → tools}/strToClave.ts +1 -1
  169. package/tools/xsdToJsonSchema.ts +108 -0
  170. package/tsconfig.json +5 -2
  171. package/test/examples/README.md +0 -43
  172. package/test/examples/getToken.ts +0 -18
  173. /package/__tests__/{unit → tests}/getToken.test.ts +0 -0
  174. /package/{test/examples → examples}/confirmXML.ts +0 -0
  175. /package/{test/examples → examples}/consultXML.ts +0 -0
  176. /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,3 @@
1
+ import { postTokenOptions } from '@src/services/getToken/interfaces';
2
+ declare const _default: (postOptions: postTokenOptions) => Promise<any>;
3
+ export default _default;
@@ -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,2 @@
1
+ export declare function send(token: string, postOptions: any): Record<string, any>;
2
+ export declare function sendToCustomURL(token: string, url: string): Record<string, any>;
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=notaDeCredito.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=notaDeDebito.js.map
@@ -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 { FrontEndRequest } from '@src/types/globalInterfaces'
1
+ import { ClientPayload } from '@src/types/globalInterfaces'
2
2
  import requestStub from '@test/stubs/frontendRequest.stub'
3
- import send from '@src/electronicBill'
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: FrontEndRequest = requestStub
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.headers.location
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 tokenObj = await getToken({
38
- client_id: 'api-stag', // eslint-disable-line
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 = tokenObj.data.access_token
45
- const data = await send(token, frontEndRequest, {
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 { FrontEndRequest } from '@src/types/globalInterfaces'
2
- import creditNote from './@src/creditNote'
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: FrontEndRequest = requestStub
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 { FrontEndRequest } from '@src/types/globalInterfaces'
2
- import debitNote from './@src/debitNote'
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: FrontEndRequest = requestStub
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 { FrontEndRequest } from '@src/types/globalInterfaces'
5
+ import { ClientPayload } from '@src/types/globalInterfaces'
6
6
 
7
- const frontEndRequest: FrontEndRequest = requestStub
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 { FrontEndRequest } from '@src/types/globalInterfaces'
3
+ import { ClientPayload } from '@src/types/globalInterfaces'
4
4
 
5
- const frontEndRequest: FrontEndRequest = requestStub
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.0-beta",
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": "test"
10
+ "test": "__test__"
10
11
  },
11
12
  "scripts": {
12
- "test:unit": "npx jest",
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 & ts-node -r tsconfig-paths/register src/index.ts",
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
- "nodemon": "^2.0.7",
45
- "ts-node": "^9.1.1",
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
- "google-p12-pem": "^3.0.3",
55
- "jest": "^26.6.3",
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 './lib/genClave'
2
- import { xmlToJson, genXML } from './lib/genXML/index'
3
- import { send } from './services/send/index'
4
- import { getFinalMessage, getMsjObj } from './lib/genJSON/confirmXML'
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 { FrontEndRequest, XmlOpt } from './types/globalInterfaces'
2
- import { NotaCreditoContenedor } from './types/xml/notaDeCredito'
3
- import { genXML } from './lib/genXML/index'
4
- import { send } from './services/send/index'
5
- import { genClaveObj, genString, parseOptions } from './lib/genClave/index'
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 './helpers/comprobantes'
12
+ } from '@src/helpers/comprobantes'
13
13
 
14
14
  const VOUCHER_TYPE = 'NC'
15
15
 
16
16
  export function parseCreditNote(options: {
17
- frontEndRequest: 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: 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: FrontEndRequest;
68
+ frontEndRequest: ClientPayload;
69
69
  xmlOpt: XmlOpt;
70
70
  }): Promise<any> => {
71
71
  const date = new Date()