@facturacr/atv-sdk 0.0.7-beta → 0.0.8-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 (163) hide show
  1. package/.github/workflows/ci.yml +7 -4
  2. package/__tests__/stubs/commonExpectedXml.xml +94 -0
  3. package/__tests__/stubs/createDocument.stub.ts +80 -0
  4. package/__tests__/tests/ATV/__snapshots__/index.test.ts.snap +3 -0
  5. package/__tests__/tests/ATV/index.test.ts +50 -0
  6. package/doc/atv-structures/4.3/ANEXOS Y ESTRUCTURAS_V4.3.pdf +0 -0
  7. package/doc/atv-structures/4.3/API Ministerio de Hacienda /342/200/223 Dropbox Paper.pdf +0 -0
  8. package/doc/atv-structures/4.3/MensajeHacienda_V4.3.xsd.xml +179 -0
  9. package/doc/atv-structures/4.3/MensajeReceptor_V4.3.xsd.xml +163 -0
  10. package/doc/atv-structures/4.3/NotaCreditoElectronica_V4.3.xsd.xml +1804 -0
  11. package/doc/atv-structures/4.3/NotaDebitoElectronica_V4.3.xsd.xml +1804 -0
  12. package/examples/createAndSend.ts +27 -32
  13. package/examples/getToken.ts +3 -2
  14. package/jest-setup.js +5 -0
  15. package/jest.config.js +6 -5
  16. package/package.json +18 -14
  17. package/src/ATV/core/Clave.ts +41 -0
  18. package/src/ATV/core/Document.ts +123 -0
  19. package/src/ATV/core/DocumentType.ts +23 -0
  20. package/src/ATV/core/FullConsecutive.ts +29 -0
  21. package/src/ATV/core/OrderLine.ts +95 -0
  22. package/src/ATV/core/Person.ts +68 -0
  23. package/src/ATV/core/Summary.type.ts +20 -0
  24. package/src/ATV/core/documentNames.types.ts +5 -0
  25. package/src/ATV/index.ts +102 -0
  26. package/src/ATV/mappers/billDocToAtv.ts +103 -0
  27. package/src/ATV/types.ts +37 -0
  28. package/src/ATV/useCases/createDocument/index.ts +137 -0
  29. package/src/ATV/useCases/createDocument/types.ts +79 -0
  30. package/src/helpers/comprobantes.ts +1 -1
  31. package/src/lib/genJSON/index.ts +2 -2
  32. package/src/lib/genXML/xmlConfig.ts +2 -2
  33. package/src/services/getToken/GetToken.ts +1 -1
  34. package/src/types/facturaInterfaces.d.ts +27 -20
  35. package/__tests__/tests/electronicBill.test.ts +0 -28
  36. package/dist/__tests__/stubs/frontendRequest.stub.d.ts +0 -3
  37. package/dist/__tests__/stubs/frontendRequest.stub.js +0 -61
  38. package/dist/__tests__/stubs/frontendRequest.stub.js.map +0 -1
  39. package/dist/__tests__/stubs/token.stub.d.ts +0 -17
  40. package/dist/__tests__/stubs/token.stub.js +0 -21
  41. package/dist/__tests__/stubs/token.stub.js.map +0 -1
  42. package/dist/__tests__/tests/electronicBill.test.d.ts +0 -1
  43. package/dist/__tests__/tests/electronicBill.test.js +0 -38
  44. package/dist/__tests__/tests/electronicBill.test.js.map +0 -1
  45. package/dist/__tests__/tests/getClave.test.d.ts +0 -1
  46. package/dist/__tests__/tests/getClave.test.js +0 -15
  47. package/dist/__tests__/tests/getClave.test.js.map +0 -1
  48. package/dist/__tests__/tests/getToken.test.d.ts +0 -0
  49. package/dist/__tests__/tests/getToken.test.js +0 -28
  50. package/dist/__tests__/tests/getToken.test.js.map +0 -1
  51. package/dist/__tests__/tests/lib/getClave.test.d.ts +0 -1
  52. package/dist/__tests__/tests/lib/getClave.test.js +0 -15
  53. package/dist/__tests__/tests/lib/getClave.test.js.map +0 -1
  54. package/dist/__tests__/tests/services/getToken.test.d.ts +0 -1
  55. package/dist/__tests__/tests/services/getToken.test.js +0 -27
  56. package/dist/__tests__/tests/services/getToken.test.js.map +0 -1
  57. package/dist/examples/confirmXML.d.ts +0 -1
  58. package/dist/examples/confirmXML.js +0 -89
  59. package/dist/examples/confirmXML.js.map +0 -1
  60. package/dist/examples/consultXML.d.ts +0 -1
  61. package/dist/examples/consultXML.js +0 -55
  62. package/dist/examples/consultXML.js.map +0 -1
  63. package/dist/examples/createAndSend.d.ts +0 -1
  64. package/dist/examples/createAndSend.js +0 -77
  65. package/dist/examples/createAndSend.js.map +0 -1
  66. package/dist/examples/createCreditNote.d.ts +0 -1
  67. package/dist/examples/createCreditNote.js +0 -52
  68. package/dist/examples/createCreditNote.js.map +0 -1
  69. package/dist/examples/createDebitNote.d.ts +0 -1
  70. package/dist/examples/createDebitNote.js +0 -52
  71. package/dist/examples/createDebitNote.js.map +0 -1
  72. package/dist/examples/genBasicXML.d.ts +0 -1
  73. package/dist/examples/genBasicXML.js +0 -44
  74. package/dist/examples/genBasicXML.js.map +0 -1
  75. package/dist/examples/getClave.d.ts +0 -1
  76. package/dist/examples/getClave.js +0 -12
  77. package/dist/examples/getClave.js.map +0 -1
  78. package/dist/examples/getToken.d.ts +0 -1
  79. package/dist/examples/getToken.js +0 -16
  80. package/dist/examples/getToken.js.map +0 -1
  81. package/dist/src/ATV.d.ts +0 -17
  82. package/dist/src/ATV.js +0 -16
  83. package/dist/src/ATV.js.map +0 -1
  84. package/dist/src/confirmXML.d.ts +0 -8
  85. package/dist/src/confirmXML.js +0 -44
  86. package/dist/src/confirmXML.js.map +0 -1
  87. package/dist/src/creditNote.d.ts +0 -14
  88. package/dist/src/creditNote.js +0 -77
  89. package/dist/src/creditNote.js.map +0 -1
  90. package/dist/src/data/codigoMoneda.d.ts +0 -1
  91. package/dist/src/data/codigoMoneda.js +0 -184
  92. package/dist/src/data/codigoMoneda.js.map +0 -1
  93. package/dist/src/data/exoneracion.d.ts +0 -1
  94. package/dist/src/data/exoneracion.js +0 -15
  95. package/dist/src/data/exoneracion.js.map +0 -1
  96. package/dist/src/data/impuestos.d.ts +0 -25
  97. package/dist/src/data/impuestos.js +0 -51
  98. package/dist/src/data/impuestos.js.map +0 -1
  99. package/dist/src/data/tipoCedula.d.ts +0 -7
  100. package/dist/src/data/tipoCedula.js +0 -17
  101. package/dist/src/data/tipoCedula.js.map +0 -1
  102. package/dist/src/data/tipoDocumento.d.ts +0 -26
  103. package/dist/src/data/tipoDocumento.js +0 -30
  104. package/dist/src/data/tipoDocumento.js.map +0 -1
  105. package/dist/src/data/unidadesMedida.d.ts +0 -5
  106. package/dist/src/data/unidadesMedida.js +0 -141
  107. package/dist/src/data/unidadesMedida.js.map +0 -1
  108. package/dist/src/debitNote.d.ts +0 -14
  109. package/dist/src/debitNote.js +0 -77
  110. package/dist/src/debitNote.js.map +0 -1
  111. package/dist/src/electronicBill.d.ts +0 -3
  112. package/dist/src/electronicBill.js +0 -61
  113. package/dist/src/electronicBill.js.map +0 -1
  114. package/dist/src/helpers/comprobantes.d.ts +0 -7
  115. package/dist/src/helpers/comprobantes.js +0 -92
  116. package/dist/src/helpers/comprobantes.js.map +0 -1
  117. package/dist/src/index.d.ts +0 -8
  118. package/dist/src/index.js.map +0 -1
  119. package/dist/src/lib/genClave/index.d.ts +0 -9
  120. package/dist/src/lib/genClave/index.js +0 -119
  121. package/dist/src/lib/genClave/index.js.map +0 -1
  122. package/dist/src/lib/genJSON/confirmXML.d.ts +0 -7
  123. package/dist/src/lib/genJSON/confirmXML.js +0 -46
  124. package/dist/src/lib/genJSON/confirmXML.js.map +0 -1
  125. package/dist/src/lib/genJSON/index.d.ts +0 -3
  126. package/dist/src/lib/genJSON/index.js +0 -133
  127. package/dist/src/lib/genJSON/index.js.map +0 -1
  128. package/dist/src/lib/genXML/index.d.ts +0 -7
  129. package/dist/src/lib/genXML/index.js +0 -51
  130. package/dist/src/lib/genXML/index.js.map +0 -1
  131. package/dist/src/lib/genXML/sigXML/genKeysAndCert.d.ts +0 -6
  132. package/dist/src/lib/genXML/sigXML/genKeysAndCert.js +0 -72
  133. package/dist/src/lib/genXML/sigXML/genKeysAndCert.js.map +0 -1
  134. package/dist/src/lib/genXML/sigXML/index.d.ts +0 -1
  135. package/dist/src/lib/genXML/sigXML/index.js +0 -86
  136. package/dist/src/lib/genXML/sigXML/index.js.map +0 -1
  137. package/dist/src/lib/genXML/xmlConfig.d.ts +0 -55
  138. package/dist/src/lib/genXML/xmlConfig.js +0 -36
  139. package/dist/src/lib/genXML/xmlConfig.js.map +0 -1
  140. package/dist/src/services/getToken/GetToken.d.ts +0 -8
  141. package/dist/src/services/getToken/GetToken.js +0 -66
  142. package/dist/src/services/getToken/GetToken.js.map +0 -1
  143. package/dist/src/services/getToken/__tests__/GetToken.test.d.ts +0 -1
  144. package/dist/src/services/getToken/__tests__/GetToken.test.js +0 -86
  145. package/dist/src/services/getToken/__tests__/GetToken.test.js.map +0 -1
  146. package/dist/src/services/getToken/index.d.ts +0 -3
  147. package/dist/src/services/getToken/index.js +0 -22
  148. package/dist/src/services/getToken/index.js.map +0 -1
  149. package/dist/src/services/getToken/types.d.ts +0 -27
  150. package/dist/src/services/getToken/types.js +0 -3
  151. package/dist/src/services/getToken/types.js.map +0 -1
  152. package/dist/src/services/send/index.d.ts +0 -2
  153. package/dist/src/services/send/index.js +0 -40
  154. package/dist/src/services/send/index.js.map +0 -1
  155. package/dist/src/types/xml/notaDeCredito.d.ts +0 -21
  156. package/dist/src/types/xml/notaDeCredito.js +0 -3
  157. package/dist/src/types/xml/notaDeCredito.js.map +0 -1
  158. package/dist/src/types/xml/notaDeDebito.d.ts +0 -21
  159. package/dist/src/types/xml/notaDeDebito.js +0 -3
  160. package/dist/src/types/xml/notaDeDebito.js.map +0 -1
  161. package/src/ATV.ts +0 -28
  162. /package/{atv-structures → doc/atv-structures}/4.3/FacturaElectronicaExportacion_V4.3.xsd.xml +0 -0
  163. /package/{atv-structures → doc/atv-structures}/4.3/FacturaElectronica_V4.3.xsd.xml +0 -0
@@ -10,7 +10,7 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
12
  - name: Check out repository code
13
- uses: actions/checkout@v2
13
+ uses: actions/checkout@v3
14
14
  - name: Install modules
15
15
  run: yarn
16
16
  - name: Run testing
@@ -19,9 +19,9 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  strategy:
21
21
  matrix:
22
- node: [12, 14, 16, 18]
22
+ node: [18, 20]
23
23
  steps:
24
- - uses: actions/checkout@v2
24
+ - uses: actions/checkout@v3
25
25
  - uses: actions/setup-node@v1
26
26
  with:
27
27
  node-version: ${{ matrix.node }}
@@ -35,11 +35,14 @@ jobs:
35
35
  fail_ci_if_error: false
36
36
  run-on-window:
37
37
  runs-on: windows-latest
38
+ strategy:
39
+ matrix:
40
+ node: [18, 20]
38
41
  steps:
39
42
  - uses: actions/checkout@v2
40
43
  - uses: actions/setup-node@v1
41
44
  with:
42
- node-version: 12
45
+ node-version: ${{ matrix.node }}
43
46
  - run: yarn
44
47
  - run: yarn build
45
48
  - name: coverage
@@ -0,0 +1,94 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <FacturaElectronica xmlns="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/FacturaElectronica_V4.3.xsd">
3
+ <Clave>50601042400020692014200100001010000000002100000001</Clave>
4
+ <CodigoActividad>000004</CodigoActividad>
5
+ <NumeroConsecutivo>00100001010000000002</NumeroConsecutivo>
6
+ <FechaEmision>2024-04-01T00:00:00.000Z</FechaEmision>
7
+ <Emisor>
8
+ <Nombre>Nombre Receptor</Nombre>
9
+ <Identificacion>
10
+ <Tipo>01</Tipo>
11
+ <Numero>206920142</Numero>
12
+ </Identificacion>
13
+ <NombreComercial>xyz</NombreComercial>
14
+ <Ubicacion>
15
+ <Provincia>1</Provincia>
16
+ <Canton>01</Canton>
17
+ <Distrito>01</Distrito>
18
+ <Barrio>01</Barrio>
19
+ <OtrasSenas>Señas xyz</OtrasSenas>
20
+ </Ubicacion>
21
+ <Telefono>
22
+ <CodigoPais>506</CodigoPais>
23
+ <NumTelefono>12341234</NumTelefono>
24
+ </Telefono>
25
+ <Fax>
26
+ <CodigoPais>506</CodigoPais>
27
+ <NumTelefono>12341234</NumTelefono>
28
+ </Fax>
29
+ <CorreoElectronico>test@test.com</CorreoElectronico>
30
+ </Emisor>
31
+ <Receptor>
32
+ <Nombre>SRL</Nombre>
33
+ <Identificacion>
34
+ <Tipo>02</Tipo>
35
+ <Numero>3102759157</Numero>
36
+ </Identificacion>
37
+ <NombreComercial>CIENCIA DEL SABOR</NombreComercial>
38
+ <Ubicacion>
39
+ <Provincia>2</Provincia>
40
+ <Canton>06</Canton>
41
+ <Distrito>04</Distrito>
42
+ <Barrio>06</Barrio>
43
+ <OtrasSenas>25 norte 500 oeste restaurante El Faro</OtrasSenas>
44
+ </Ubicacion>
45
+ <Telefono>
46
+ <CodigoPais>506</CodigoPais>
47
+ <NumTelefono>80808080</NumTelefono>
48
+ </Telefono>
49
+ <Fax>
50
+ <CodigoPais>506</CodigoPais>
51
+ <NumTelefono>80808080</NumTelefono>
52
+ </Fax>
53
+ <CorreoElectronico>cienciadelsabor@gmail.com</CorreoElectronico>
54
+ </Receptor>
55
+ <CondicionVenta>01</CondicionVenta>
56
+ <MedioPago>01</MedioPago>
57
+ <DetalleServicio>
58
+ <LineaDetalle>
59
+ <NumeroLinea>1</NumeroLinea>
60
+ <Codigo>7113301000000</Codigo>
61
+ <Cantidad>1</Cantidad>
62
+ <UnidadMedida>Unid</UnidadMedida>
63
+ <Detalle>detalle</Detalle>
64
+ <PrecioUnitario>10</PrecioUnitario>
65
+ <MontoTotal>10</MontoTotal>
66
+ <SubTotal>10</SubTotal>
67
+ <Impuesto>
68
+ <Codigo>01</Codigo>
69
+ <CodigoTarifa>08</CodigoTarifa>
70
+ <Tarifa>13</Tarifa>
71
+ <Monto>1.3</Monto>
72
+ </Impuesto>
73
+ <MontoTotalLinea>11.3</MontoTotalLinea>
74
+ </LineaDetalle>
75
+ </DetalleServicio>
76
+ <ResumenFactura>
77
+ <CodigoTipoMoneda>
78
+ <CodigoMoneda>CRC</CodigoMoneda>
79
+ <TipoCambio>585.69</TipoCambio>
80
+ </CodigoTipoMoneda>
81
+ <TotalServGravados>0</TotalServGravados>
82
+ <TotalServExentos>0</TotalServExentos>
83
+ <TotalMercanciasGravadas>10</TotalMercanciasGravadas>
84
+ <TotalMercanciasExentas>0</TotalMercanciasExentas>
85
+ <TotalGravado>10</TotalGravado>
86
+ <TotalExento>0</TotalExento>
87
+ <TotalExonerado>0</TotalExonerado>
88
+ <TotalVenta>10</TotalVenta>
89
+ <TotalDescuentos>0</TotalDescuentos>
90
+ <TotalVentaNeta>10</TotalVentaNeta>
91
+ <TotalImpuesto>1.3</TotalImpuesto>
92
+ <TotalComprobante>11.3</TotalComprobante>
93
+ </ResumenFactura>
94
+ </FacturaElectronica>
@@ -0,0 +1,80 @@
1
+ import { CreateDocumentInput } from '@src/ATV/useCases/createDocument/types'
2
+
3
+ const taxStub: CreateDocumentInput['document']['orderLines'][0]['tax'] = {
4
+ code: '01',
5
+ rateCode: '08',
6
+ rate: 13
7
+ }
8
+
9
+ const orderLines: CreateDocumentInput['document']['orderLines'] = [{
10
+ code: '7113301000000',
11
+ quantity: 1,
12
+ measureUnit: 'Unid',
13
+ detail: 'detalle',
14
+ unitaryPrice: 10,
15
+ tax: taxStub
16
+ }]
17
+
18
+ const receiverStub: CreateDocumentInput['document']['emitter'] = {
19
+ fullName: 'SRL',
20
+ commercialName: 'CIENCIA DEL SABOR',
21
+ identifier: {
22
+ type: '02',
23
+ id: '3102759157'
24
+ },
25
+ location: {
26
+ province: '2',
27
+ canton: '06',
28
+ district: '04',
29
+ neighborhood: '06',
30
+ details: '25 norte 500 oeste restaurante El Faro'
31
+ },
32
+ phone: {
33
+ countryCode: '506',
34
+ number: '80808080'
35
+ },
36
+ email: 'cienciadelsabor@gmail.com',
37
+ fax: {
38
+ countryCode: '506',
39
+ number: '80808080'
40
+ }
41
+ }
42
+
43
+ const emitterStub: CreateDocumentInput['document']['receiver'] = {
44
+ fullName: 'Nombre Receptor',
45
+ commercialName: 'xyz',
46
+ identifier: {
47
+ type: '01',
48
+ id: '206920142'
49
+ },
50
+ location: {
51
+ province: '1',
52
+ canton: '1',
53
+ district: '1',
54
+ neighborhood: '1',
55
+ details: 'Señas xyz'
56
+ },
57
+ email: 'test@test.com',
58
+ fax: {
59
+ countryCode: '506',
60
+ number: '12341234'
61
+ },
62
+ phone: {
63
+ countryCode: '506',
64
+ number: '12341234'
65
+ }
66
+ }
67
+
68
+ export const createDocumentInputStub: CreateDocumentInput['document'] = {
69
+ consecutiveIdentifier: '2',
70
+ activityCode: '4',
71
+ documentName: 'FacturaElectronica',
72
+ branch: '001',
73
+ terminal: '00001',
74
+ ceSituation: '1',
75
+ countryCode: '506',
76
+ emitter: emitterStub,
77
+ receiver: receiverStub,
78
+ orderLines,
79
+ securityCode: '00000001'
80
+ }
@@ -0,0 +1,3 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Create Document (Invoice) should create document and generate a correct command 1`] = `"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RmFjdHVyYUVsZWN0cm9uaWNhIHhtbG5zPSJodHRwczovL2Nkbi5jb21wcm9iYW50ZXNlbGVjdHJvbmljb3MuZ28uY3IveG1sLXNjaGVtYXMvdjQuMy9mYWN0dXJhRWxlY3Ryb25pY2EiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHBzOi8vY2RuLmNvbXByb2JhbnRlc2VsZWN0cm9uaWNvcy5nby5jci94bWwtc2NoZW1hcy92NC4zL2ZhY3R1cmFFbGVjdHJvbmljYSBodHRwczovL3d3dy5oYWNpZW5kYS5nby5jci9BVFYvQ29tcHJvYmFudGVFbGVjdHJvbmljby9kb2NzL2VzcXVlbWFzLzIwMTYvdjQuMy9GYWN0dXJhRWxlY3Ryb25pY2FfVjQuMy54c2QiPjxDbGF2ZT41MDYwMTA0MjQwMDAyMDY5MjAxNDIwMDEwMDAwMTAxMDAwMDAwMDAwMjEwMDAwMDAwMTwvQ2xhdmU+PENvZGlnb0FjdGl2aWRhZD4wMDAwMDQ8L0NvZGlnb0FjdGl2aWRhZD48TnVtZXJvQ29uc2VjdXRpdm8+MDAxMDAwMDEwMTAwMDAwMDAwMDI8L051bWVyb0NvbnNlY3V0aXZvPjxGZWNoYUVtaXNpb24+MjAyNC0wNC0wMVQwMDowMDowMC4wMDBaPC9GZWNoYUVtaXNpb24+PEVtaXNvcj48Tm9tYnJlPk5vbWJyZSBSZWNlcHRvcjwvTm9tYnJlPjxJZGVudGlmaWNhY2lvbj48VGlwbz4wMTwvVGlwbz48TnVtZXJvPjIwNjkyMDE0MjwvTnVtZXJvPjwvSWRlbnRpZmljYWNpb24+PE5vbWJyZUNvbWVyY2lhbD54eXo8L05vbWJyZUNvbWVyY2lhbD48VWJpY2FjaW9uPjxQcm92aW5jaWE+MTwvUHJvdmluY2lhPjxDYW50b24+MDE8L0NhbnRvbj48RGlzdHJpdG8+MDE8L0Rpc3RyaXRvPjxCYXJyaW8+MDE8L0JhcnJpbz48T3RyYXNTZW5hcz5TZcOxYXMgeHl6PC9PdHJhc1NlbmFzPjwvVWJpY2FjaW9uPjxUZWxlZm9ubz48Q29kaWdvUGFpcz41MDY8L0NvZGlnb1BhaXM+PE51bVRlbGVmb25vPjEyMzQxMjM0PC9OdW1UZWxlZm9ubz48L1RlbGVmb25vPjxGYXg+PENvZGlnb1BhaXM+NTA2PC9Db2RpZ29QYWlzPjxOdW1UZWxlZm9ubz4xMjM0MTIzNDwvTnVtVGVsZWZvbm8+PC9GYXg+PENvcnJlb0VsZWN0cm9uaWNvPnRlc3RAdGVzdC5jb208L0NvcnJlb0VsZWN0cm9uaWNvPjwvRW1pc29yPjxSZWNlcHRvcj48Tm9tYnJlPlNSTDwvTm9tYnJlPjxJZGVudGlmaWNhY2lvbj48VGlwbz4wMjwvVGlwbz48TnVtZXJvPjMxMDI3NTkxNTc8L051bWVybz48L0lkZW50aWZpY2FjaW9uPjxOb21icmVDb21lcmNpYWw+Q0lFTkNJQSBERUwgU0FCT1I8L05vbWJyZUNvbWVyY2lhbD48VWJpY2FjaW9uPjxQcm92aW5jaWE+MjwvUHJvdmluY2lhPjxDYW50b24+MDY8L0NhbnRvbj48RGlzdHJpdG8+MDQ8L0Rpc3RyaXRvPjxCYXJyaW8+MDY8L0JhcnJpbz48T3RyYXNTZW5hcz4yNSBub3J0ZSA1MDAgb2VzdGUgcmVzdGF1cmFudGUgRWwgRmFybzwvT3RyYXNTZW5hcz48L1ViaWNhY2lvbj48VGVsZWZvbm8+PENvZGlnb1BhaXM+NTA2PC9Db2RpZ29QYWlzPjxOdW1UZWxlZm9ubz44MDgwODA4MDwvTnVtVGVsZWZvbm8+PC9UZWxlZm9ubz48RmF4PjxDb2RpZ29QYWlzPjUwNjwvQ29kaWdvUGFpcz48TnVtVGVsZWZvbm8+ODA4MDgwODA8L051bVRlbGVmb25vPjwvRmF4PjxDb3JyZW9FbGVjdHJvbmljbz5jaWVuY2lhZGVsc2Fib3JAZ21haWwuY29tPC9Db3JyZW9FbGVjdHJvbmljbz48L1JlY2VwdG9yPjxDb25kaWNpb25WZW50YT4wMTwvQ29uZGljaW9uVmVudGE+PE1lZGlvUGFnbz4wMTwvTWVkaW9QYWdvPjxEZXRhbGxlU2VydmljaW8+PExpbmVhRGV0YWxsZT48TnVtZXJvTGluZWE+MTwvTnVtZXJvTGluZWE+PENvZGlnbz43MTEzMzAxMDAwMDAwPC9Db2RpZ28+PENhbnRpZGFkPjE8L0NhbnRpZGFkPjxVbmlkYWRNZWRpZGE+VW5pZDwvVW5pZGFkTWVkaWRhPjxEZXRhbGxlPmRldGFsbGU8L0RldGFsbGU+PFByZWNpb1VuaXRhcmlvPjEwPC9QcmVjaW9Vbml0YXJpbz48TW9udG9Ub3RhbD4xMDwvTW9udG9Ub3RhbD48U3ViVG90YWw+MTA8L1N1YlRvdGFsPjxJbXB1ZXN0bz48Q29kaWdvPjAxPC9Db2RpZ28+PENvZGlnb1RhcmlmYT4wODwvQ29kaWdvVGFyaWZhPjxUYXJpZmE+MTM8L1RhcmlmYT48TW9udG8+MS4zPC9Nb250bz48L0ltcHVlc3RvPjxNb250b1RvdGFsTGluZWE+MTEuMzwvTW9udG9Ub3RhbExpbmVhPjwvTGluZWFEZXRhbGxlPjwvRGV0YWxsZVNlcnZpY2lvPjxSZXN1bWVuRmFjdHVyYT48Q29kaWdvVGlwb01vbmVkYT48Q29kaWdvTW9uZWRhPkNSQzwvQ29kaWdvTW9uZWRhPjxUaXBvQ2FtYmlvPjU4NS42OTwvVGlwb0NhbWJpbz48L0NvZGlnb1RpcG9Nb25lZGE+PFRvdGFsU2VydkdyYXZhZG9zPjA8L1RvdGFsU2VydkdyYXZhZG9zPjxUb3RhbFNlcnZFeGVudG9zPjA8L1RvdGFsU2VydkV4ZW50b3M+PFRvdGFsTWVyY2FuY2lhc0dyYXZhZGFzPjEwPC9Ub3RhbE1lcmNhbmNpYXNHcmF2YWRhcz48VG90YWxNZXJjYW5jaWFzRXhlbnRhcz4wPC9Ub3RhbE1lcmNhbmNpYXNFeGVudGFzPjxUb3RhbEdyYXZhZG8+MTA8L1RvdGFsR3JhdmFkbz48VG90YWxFeGVudG8+MDwvVG90YWxFeGVudG8+PFRvdGFsRXhvbmVyYWRvPjA8L1RvdGFsRXhvbmVyYWRvPjxUb3RhbFZlbnRhPjEwPC9Ub3RhbFZlbnRhPjxUb3RhbERlc2N1ZW50b3M+MDwvVG90YWxEZXNjdWVudG9zPjxUb3RhbFZlbnRhTmV0YT4xMDwvVG90YWxWZW50YU5ldGE+PFRvdGFsSW1wdWVzdG8+MS4zPC9Ub3RhbEltcHVlc3RvPjxUb3RhbENvbXByb2JhbnRlPjExLjM8L1RvdGFsQ29tcHJvYmFudGU+PC9SZXN1bWVuRmFjdHVyYT48L0ZhY3R1cmFFbGVjdHJvbmljYT4="`;
@@ -0,0 +1,50 @@
1
+ import fs from 'fs'
2
+ import { ATV } from "@src/ATV"
3
+ import 'jest-xml-matcher'
4
+ import { createDocumentInputStub } from "@test/stubs/createDocument.stub"
5
+ const fakePem = fs.readFileSync('__tests__/stubs/dummyKeys/client-identity.p12', 'binary')
6
+ const fakePassword = '1234'
7
+ const expectXml = fs.readFileSync('__tests__/stubs/commonExpectedXml.xml', 'utf-8')
8
+
9
+ describe('Create Document (Invoice)', () => {
10
+ beforeAll(() => {
11
+ jest.useFakeTimers();
12
+ jest.setSystemTime(new Date(2024, 3, 1, 0, 0, 0, 0));
13
+ })
14
+
15
+ it('should create document and generate a correct command', async () => {
16
+ const atv = new ATV({}, 'stg')
17
+ const createdDoc = await atv.createDocumentCommand({
18
+ document: createDocumentInputStub,
19
+ token: 'fake-token',
20
+ signatureOptions: {
21
+ buffer: fakePem,
22
+ password: fakePassword
23
+ }
24
+ })
25
+ expect(createdDoc.command).toMatchObject({
26
+ url: 'https://api-sandbox.comprobanteselectronicos.go.cr/recepcion/v1/recepcion',
27
+ method: 'post'
28
+ })
29
+ expect(createdDoc.command.data).toMatchObject({
30
+ clave: '50601042400020692014200100001010000000002100000001',
31
+ fecha: '2024-04-01T00:00:00.000Z',
32
+ emisor: { tipoIdentificacion: '01', numeroIdentificacion: '206920142' },
33
+ receptor: { tipoIdentificacion: '02', numeroIdentificacion: '3102759157' }
34
+ })
35
+ expect(createdDoc.command.data.comprobanteXml).toBeDefined()
36
+ expect(createdDoc.extraData.xml).toBeDefined()
37
+ })
38
+
39
+ it('should create document and generate a correct command', async () => {
40
+ const atv = new ATV({}, 'stg')
41
+ //@ts-ignore just for testing
42
+ const createdDoc = await atv.createDocumentCommand({
43
+ document: createDocumentInputStub,
44
+ token: 'fake-token',
45
+ signatureOptions: undefined
46
+ })
47
+ expect(createdDoc.command.data.comprobanteXml).toMatchSnapshot()
48
+ expect(createdDoc.extraData.xml).toEqualXML(expectXml)
49
+ })
50
+ })
@@ -0,0 +1,179 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xs:schema xmlns="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/mensajeHacienda" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/mensajeHacienda" elementFormDefault="qualified" attributeFormDefault="unqualified" version="4.3" vc:minVersion="1.1">
3
+ <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="../../xmldsig-core-schema.xsd"/>
4
+ <xs:element name="MensajeHacienda">
5
+ <xs:annotation>
6
+ <xs:documentation>Mensaje de uso exclusivo por parte de la Direccion General de Tributación</xs:documentation>
7
+ </xs:annotation>
8
+ <xs:complexType>
9
+ <xs:sequence>
10
+ <xs:element name="Clave">
11
+ <xs:annotation>
12
+ <xs:documentation>Clave numérica del comprobante</xs:documentation>
13
+ </xs:annotation>
14
+ <xs:simpleType>
15
+ <xs:restriction base="xs:string">
16
+ <xs:pattern value="\d{50,50}"/>
17
+ </xs:restriction>
18
+ </xs:simpleType>
19
+ </xs:element>
20
+ <xs:element name="NombreEmisor">
21
+ <xs:annotation>
22
+ <xs:documentation>Nombre o razón social del emisor</xs:documentation>
23
+ </xs:annotation>
24
+ <xs:simpleType>
25
+ <xs:restriction base="xs:string">
26
+ <xs:maxLength value="100"/>
27
+ </xs:restriction>
28
+ </xs:simpleType>
29
+ </xs:element>
30
+ <xs:element name="TipoIdentificacionEmisor" nillable="false">
31
+ <xs:annotation>
32
+ <xs:documentation>Tipo de identificacion: 01 Cedula Fisica, 02 Cedula Juridica, 03 DIMEX, 04 NITE</xs:documentation>
33
+ </xs:annotation>
34
+ <xs:simpleType>
35
+ <xs:restriction base="xs:string">
36
+ <xs:enumeration value="01">
37
+ <xs:annotation>
38
+ <xs:documentation>Cedula Fisica</xs:documentation>
39
+ </xs:annotation>
40
+ </xs:enumeration>
41
+ <xs:enumeration value="02">
42
+ <xs:annotation>
43
+ <xs:documentation> Cedula Juridica</xs:documentation>
44
+ </xs:annotation>
45
+ </xs:enumeration>
46
+ <xs:enumeration value="03">
47
+ <xs:annotation>
48
+ <xs:documentation>DIMEX</xs:documentation>
49
+ </xs:annotation>
50
+ </xs:enumeration>
51
+ <xs:enumeration value="04">
52
+ <xs:annotation>
53
+ <xs:documentation>NITE</xs:documentation>
54
+ </xs:annotation>
55
+ </xs:enumeration>
56
+ </xs:restriction>
57
+ </xs:simpleType>
58
+ </xs:element>
59
+ <xs:element name="NumeroCedulaEmisor">
60
+ <xs:annotation>
61
+ <xs:documentation>Número de cédula fisica/jurídica/NITE/DIMEX del emisor</xs:documentation>
62
+ </xs:annotation>
63
+ <xs:simpleType>
64
+ <xs:restriction base="xs:string">
65
+ <xs:maxLength value="12"/>
66
+ <xs:pattern value="\d{9,12}"/>
67
+ </xs:restriction>
68
+ </xs:simpleType>
69
+ </xs:element>
70
+ <xs:element name="NombreReceptor" nillable="false" minOccurs="0">
71
+ <xs:annotation>
72
+ <xs:documentation>Nombre o razon social del receptor</xs:documentation>
73
+ </xs:annotation>
74
+ <xs:simpleType>
75
+ <xs:restriction base="xs:string">
76
+ <xs:maxLength value="100"/>
77
+ <xs:minLength value="0"/>
78
+ </xs:restriction>
79
+ </xs:simpleType>
80
+ </xs:element>
81
+ <xs:element name="TipoIdentificacionReceptor" nillable="true" minOccurs="0">
82
+ <xs:annotation>
83
+ <xs:documentation>Tipo de identificacion: 01 Cedula Fisica, 02 Cedula Juridica, 03 DIMEX, 04 NITE, 05 Otros</xs:documentation>
84
+ </xs:annotation>
85
+ <xs:simpleType>
86
+ <xs:restriction base="xs:string">
87
+ <xs:enumeration value="01">
88
+ <xs:annotation>
89
+ <xs:documentation>Cedula Fisica</xs:documentation>
90
+ </xs:annotation>
91
+ </xs:enumeration>
92
+ <xs:enumeration value="02">
93
+ <xs:annotation>
94
+ <xs:documentation> Cedula Juridica</xs:documentation>
95
+ </xs:annotation>
96
+ </xs:enumeration>
97
+ <xs:enumeration value="03">
98
+ <xs:annotation>
99
+ <xs:documentation>DIMEX</xs:documentation>
100
+ </xs:annotation>
101
+ </xs:enumeration>
102
+ <xs:enumeration value="04">
103
+ <xs:annotation>
104
+ <xs:documentation>NITE</xs:documentation>
105
+ </xs:annotation>
106
+ </xs:enumeration>
107
+ <xs:enumeration value="05">
108
+ <xs:annotation>
109
+ <xs:documentation>Otros</xs:documentation>
110
+ </xs:annotation>
111
+ </xs:enumeration>
112
+ </xs:restriction>
113
+ </xs:simpleType>
114
+ </xs:element>
115
+ <xs:element name="NumeroCedulaReceptor" nillable="true" minOccurs="0">
116
+ <xs:annotation>
117
+ <xs:documentation>Número de cédula fisica/jurídica/NITE/DIMEX del receptor</xs:documentation>
118
+ </xs:annotation>
119
+ <xs:simpleType>
120
+ <xs:restriction base="xs:string">
121
+ <xs:maxLength value="12"/>
122
+ <xs:pattern value="\d{9,12}"/>
123
+ </xs:restriction>
124
+ </xs:simpleType>
125
+ </xs:element>
126
+ <xs:element name="Mensaje">
127
+ <xs:annotation>
128
+ <xs:documentation>Codigo del mensaje de respuesta. 1 aceptado, 3 rechazado</xs:documentation>
129
+ </xs:annotation>
130
+ <xs:simpleType>
131
+ <xs:restriction base="xs:integer">
132
+ <xs:enumeration value="1">
133
+ <xs:annotation>
134
+ <xs:documentation>Aceptado</xs:documentation>
135
+ </xs:annotation>
136
+ </xs:enumeration>
137
+ <xs:enumeration value="3">
138
+ <xs:annotation>
139
+ <xs:documentation>Rechazado</xs:documentation>
140
+ </xs:annotation>
141
+ </xs:enumeration>
142
+ </xs:restriction>
143
+ </xs:simpleType>
144
+ </xs:element>
145
+ <xs:element name="DetalleMensaje">
146
+ <xs:annotation>
147
+ <xs:documentation>Detalle del mensaje</xs:documentation>
148
+ </xs:annotation>
149
+ <xs:simpleType>
150
+ <xs:restriction base="xs:string"/>
151
+ </xs:simpleType>
152
+ </xs:element>
153
+ <xs:element name="MontoTotalImpuesto" minOccurs="0">
154
+ <xs:annotation>
155
+ <xs:documentation>Monto total del impuesto, que es obligatorio si el comprobante tenga impuesto.</xs:documentation>
156
+ </xs:annotation>
157
+ <xs:simpleType>
158
+ <xs:restriction base="xs:decimal">
159
+ <xs:totalDigits value="18"/>
160
+ <xs:fractionDigits value="5"/>
161
+ </xs:restriction>
162
+ </xs:simpleType>
163
+ </xs:element>
164
+ <xs:element name="TotalFactura">
165
+ <xs:annotation>
166
+ <xs:documentation>Monto total de la factura</xs:documentation>
167
+ </xs:annotation>
168
+ <xs:simpleType>
169
+ <xs:restriction base="xs:decimal">
170
+ <xs:totalDigits value="18"/>
171
+ <xs:fractionDigits value="5"/>
172
+ </xs:restriction>
173
+ </xs:simpleType>
174
+ </xs:element>
175
+ <xs:element ref="ds:Signature" minOccurs="1" maxOccurs="1"/>
176
+ </xs:sequence>
177
+ </xs:complexType>
178
+ </xs:element>
179
+ </xs:schema>
@@ -0,0 +1,163 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xs:schema xmlns="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/mensajeReceptor" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/mensajeReceptor" elementFormDefault="qualified" attributeFormDefault="unqualified" version="4.3" vc:minVersion="1.1">
3
+ <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="../../xmldsig-core-schema.xsd"/>
4
+ <xs:element name="MensajeReceptor">
5
+ <xs:annotation>
6
+ <xs:documentation>Mensaje de aceptacion o rechazo de los documentos electronicos por parte del obligado tributario</xs:documentation>
7
+ </xs:annotation>
8
+ <xs:complexType>
9
+ <xs:sequence>
10
+ <xs:element name="Clave">
11
+ <xs:annotation>
12
+ <xs:documentation>Clave numérica del comprobante</xs:documentation>
13
+ </xs:annotation>
14
+ <xs:simpleType>
15
+ <xs:restriction base="xs:string">
16
+ <xs:pattern value="\d{50,50}"/>
17
+ </xs:restriction>
18
+ </xs:simpleType>
19
+ </xs:element>
20
+ <xs:element name="NumeroCedulaEmisor">
21
+ <xs:annotation>
22
+ <xs:documentation>Número de cédula fisica/jurídica/NITE/DIMEX del vendedor</xs:documentation>
23
+ </xs:annotation>
24
+ <xs:simpleType>
25
+ <xs:restriction base="xs:string">
26
+ <xs:maxLength value="12"/>
27
+ <xs:pattern value="\d{9,12}"/>
28
+ </xs:restriction>
29
+ </xs:simpleType>
30
+ </xs:element>
31
+ <xs:element name="FechaEmisionDoc" type="xs:dateTime">
32
+ <xs:annotation>
33
+ <xs:documentation>Fecha de emision de la confirmación</xs:documentation>
34
+ </xs:annotation>
35
+ </xs:element>
36
+ <xs:element name="Mensaje">
37
+ <xs:annotation>
38
+ <xs:documentation>Codigo del mensaje de respuesta. 1 aceptado, 2 aceptado parcialmente, 3 rechazado</xs:documentation>
39
+ </xs:annotation>
40
+ <xs:simpleType>
41
+ <xs:restriction base="xs:integer">
42
+ <xs:enumeration value="1">
43
+ <xs:annotation>
44
+ <xs:documentation>Aceptado</xs:documentation>
45
+ </xs:annotation>
46
+ </xs:enumeration>
47
+ <xs:enumeration value="2">
48
+ <xs:annotation>
49
+ <xs:documentation>Aceptado Parcialmente</xs:documentation>
50
+ </xs:annotation>
51
+ </xs:enumeration>
52
+ <xs:enumeration value="3">
53
+ <xs:annotation>
54
+ <xs:documentation>Rechazado</xs:documentation>
55
+ </xs:annotation>
56
+ </xs:enumeration>
57
+ </xs:restriction>
58
+ </xs:simpleType>
59
+ </xs:element>
60
+ <xs:element name="DetalleMensaje" minOccurs="0">
61
+ <xs:annotation>
62
+ <xs:documentation>Detalle del mensaje</xs:documentation>
63
+ </xs:annotation>
64
+ <xs:simpleType>
65
+ <xs:restriction base="xs:string">
66
+ <xs:maxLength value="160"/>
67
+ </xs:restriction>
68
+ </xs:simpleType>
69
+ </xs:element>
70
+ <xs:element name="MontoTotalImpuesto" minOccurs="0">
71
+ <xs:annotation>
72
+ <xs:documentation>Monto total del impuesto, que es obligatorio si el comprobante tenga impuesto.</xs:documentation>
73
+ </xs:annotation>
74
+ <xs:simpleType>
75
+ <xs:restriction base="xs:decimal">
76
+ <xs:totalDigits value="18"/>
77
+ <xs:fractionDigits value="5"/>
78
+ </xs:restriction>
79
+ </xs:simpleType>
80
+ </xs:element>
81
+ <xs:element name="CodigoActividad" minOccurs="0">
82
+ <xs:annotation>
83
+ <xs:documentation>Código Actividad Económica</xs:documentation>
84
+ </xs:annotation>
85
+ <xs:simpleType>
86
+ <xs:restriction base="xs:string">
87
+ <xs:maxLength value="6"/>
88
+ </xs:restriction>
89
+ </xs:simpleType>
90
+ </xs:element>
91
+ <xs:element name="CondicionImpuesto" minOccurs="0">
92
+ <xs:annotation>
93
+ <xs:documentation>Condición del IVA. 01 General Credito IVA, 02 General Crédito parcial del IVA, 03 Bienes de Capital, 04 Gasto corriente no genera crédito, 05 Proporcionalidad</xs:documentation>
94
+ </xs:annotation>
95
+ <xs:simpleType>
96
+ <xs:restriction base="xs:string">
97
+ <xs:enumeration value="01"/>
98
+ <xs:enumeration value="02"/>
99
+ <xs:enumeration value="03"/>
100
+ <xs:enumeration value="04"/>
101
+ <xs:enumeration value="05"/>
102
+ </xs:restriction>
103
+ </xs:simpleType>
104
+ </xs:element>
105
+ <xs:element name="MontoTotalImpuestoAcreditar" type="DecimalDineroType" minOccurs="0">
106
+ <xs:annotation>
107
+ <xs:documentation>Monto del Impuesto acreditar</xs:documentation>
108
+ </xs:annotation>
109
+ </xs:element>
110
+ <xs:element name="MontoTotalDeGastoAplicable" type="DecimalDineroType" minOccurs="0">
111
+ <xs:annotation>
112
+ <xs:documentation>Monto total del gasto a aplicar </xs:documentation>
113
+ </xs:annotation>
114
+ </xs:element>
115
+ <xs:element name="TotalFactura">
116
+ <xs:annotation>
117
+ <xs:documentation>Monto total de la factura</xs:documentation>
118
+ </xs:annotation>
119
+ <xs:simpleType>
120
+ <xs:restriction base="xs:decimal">
121
+ <xs:totalDigits value="18"/>
122
+ <xs:fractionDigits value="5"/>
123
+ </xs:restriction>
124
+ </xs:simpleType>
125
+ </xs:element>
126
+ <xs:element name="NumeroCedulaReceptor">
127
+ <xs:annotation>
128
+ <xs:documentation>Número de cédula fisica/jurídica/NITE/DIMEX del comprador</xs:documentation>
129
+ </xs:annotation>
130
+ <xs:simpleType>
131
+ <xs:restriction base="xs:string">
132
+ <xs:maxLength value="12"/>
133
+ <xs:pattern value="\d{9,12}"/>
134
+ </xs:restriction>
135
+ </xs:simpleType>
136
+ </xs:element>
137
+ <xs:element name="NumeroConsecutivoReceptor">
138
+ <xs:annotation>
139
+ <xs:documentation>Numeración consecutiva de los mensajes de confirmación</xs:documentation>
140
+ </xs:annotation>
141
+ <xs:simpleType>
142
+ <xs:restriction base="xs:string">
143
+ <xs:maxLength value="20"/>
144
+ <xs:pattern value="\d{20,20}"/>
145
+ </xs:restriction>
146
+ </xs:simpleType>
147
+ </xs:element>
148
+ <xs:element ref="ds:Signature" minOccurs="1" maxOccurs="1"/>
149
+ </xs:sequence>
150
+ </xs:complexType>
151
+ </xs:element>
152
+ <xs:simpleType name="DecimalDineroType">
153
+ <xs:annotation>
154
+ <xs:documentation>Tipo de dato decimal para representar los valores de dinero.</xs:documentation>
155
+ </xs:annotation>
156
+ <xs:restriction base="xs:decimal">
157
+ <xs:totalDigits value="18"/>
158
+ <xs:fractionDigits value="5"/>
159
+ <xs:maxInclusive value="9999999999999.99999"/>
160
+ <xs:minInclusive value="0"/>
161
+ </xs:restriction>
162
+ </xs:simpleType>
163
+ </xs:schema>