@facturacr/atv-sdk 0.0.1-beta → 0.0.3-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 (143) 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 +3 -2
  11. package/__tests__/stubs/token.stub.ts +18 -0
  12. package/__tests__/tests/electronicBill.test.ts +28 -0
  13. package/__tests__/tests/lib/getClave.test.ts +11 -0
  14. package/__tests__/tests/services/getToken.test.ts +15 -0
  15. package/atv-structures/4.3/FacturaElectronicaExportacion_V4.3.xsd.xml +1747 -0
  16. package/atv-structures/4.3/FacturaElectronica_V4.3.xsd.xml +1781 -0
  17. package/dist/__tests__/stubs/frontendRequest.stub.js +3 -2
  18. package/dist/__tests__/stubs/frontendRequest.stub.js.map +1 -1
  19. package/dist/__tests__/stubs/token.stub.d.ts +17 -0
  20. package/dist/__tests__/stubs/token.stub.js +21 -0
  21. package/dist/__tests__/stubs/token.stub.js.map +1 -0
  22. package/dist/__tests__/tests/electronicBill.test.d.ts +1 -0
  23. package/dist/__tests__/tests/electronicBill.test.js +38 -0
  24. package/dist/__tests__/tests/electronicBill.test.js.map +1 -0
  25. package/dist/__tests__/tests/getClave.test.d.ts +1 -0
  26. package/dist/__tests__/tests/getClave.test.js +15 -0
  27. package/dist/__tests__/tests/getClave.test.js.map +1 -0
  28. package/dist/__tests__/tests/getToken.test.d.ts +0 -0
  29. package/dist/__tests__/tests/getToken.test.js +28 -0
  30. package/dist/__tests__/tests/getToken.test.js.map +1 -0
  31. package/dist/__tests__/tests/lib/getClave.test.d.ts +1 -0
  32. package/dist/__tests__/tests/lib/getClave.test.js +15 -0
  33. package/dist/__tests__/tests/lib/getClave.test.js.map +1 -0
  34. package/dist/__tests__/tests/services/getToken.test.d.ts +1 -0
  35. package/dist/__tests__/tests/services/getToken.test.js +27 -0
  36. package/dist/__tests__/tests/services/getToken.test.js.map +1 -0
  37. package/dist/examples/confirmXML.js +3 -3
  38. package/dist/examples/confirmXML.js.map +1 -1
  39. package/dist/examples/consultXML.js +2 -2
  40. package/dist/examples/consultXML.js.map +1 -1
  41. package/dist/examples/createAndSend.js +6 -5
  42. package/dist/examples/createAndSend.js.map +1 -1
  43. package/dist/examples/createCreditNote.js +2 -2
  44. package/dist/examples/createCreditNote.js.map +1 -1
  45. package/dist/examples/createDebitNote.js +2 -2
  46. package/dist/examples/createDebitNote.js.map +1 -1
  47. package/dist/examples/genBasicXML.js +4 -4
  48. package/dist/examples/genBasicXML.js.map +1 -1
  49. package/dist/examples/getClave.js +1 -1
  50. package/dist/examples/getClave.js.map +1 -1
  51. package/dist/examples/getToken.js +1 -1
  52. package/dist/examples/getToken.js.map +1 -1
  53. package/dist/src/confirmXML.js +10 -10
  54. package/dist/src/confirmXML.js.map +1 -1
  55. package/dist/src/creditNote.d.ts +2 -2
  56. package/dist/src/creditNote.js +14 -14
  57. package/dist/src/creditNote.js.map +1 -1
  58. package/dist/src/data/codigoMoneda.d.ts +1 -0
  59. package/dist/src/data/codigoMoneda.js +184 -0
  60. package/dist/src/data/codigoMoneda.js.map +1 -0
  61. package/dist/src/data/exoneracion.d.ts +1 -0
  62. package/dist/src/data/exoneracion.js +15 -0
  63. package/dist/src/data/exoneracion.js.map +1 -0
  64. package/dist/src/data/impuestos.d.ts +2 -0
  65. package/dist/src/data/impuestos.js +25 -1
  66. package/dist/src/data/impuestos.js.map +1 -1
  67. package/dist/src/data/tipoCedula.d.ts +1 -0
  68. package/dist/src/data/tipoCedula.js +8 -1
  69. package/dist/src/data/tipoCedula.js.map +1 -1
  70. package/dist/src/data/unidadesMedida.d.ts +1 -0
  71. package/dist/src/data/unidadesMedida.js +99 -1
  72. package/dist/src/data/unidadesMedida.js.map +1 -1
  73. package/dist/src/debitNote.d.ts +2 -2
  74. package/dist/src/debitNote.js +14 -14
  75. package/dist/src/debitNote.js.map +1 -1
  76. package/dist/src/electronicBill.d.ts +1 -1
  77. package/dist/src/electronicBill.js +15 -9
  78. package/dist/src/electronicBill.js.map +1 -1
  79. package/dist/src/helpers/comprobantes.d.ts +2 -2
  80. package/dist/src/index.js +5 -1
  81. package/dist/src/index.js.map +1 -1
  82. package/dist/src/lib/genClave/index.d.ts +2 -2
  83. package/dist/src/lib/genClave/index.js +1 -1
  84. package/dist/src/lib/genClave/index.js.map +1 -1
  85. package/dist/src/lib/genJSON/confirmXML.d.ts +1 -1
  86. package/dist/src/lib/genJSON/confirmXML.js +1 -1
  87. package/dist/src/lib/genJSON/confirmXML.js.map +1 -1
  88. package/dist/src/lib/genJSON/index.d.ts +1 -1
  89. package/dist/src/lib/genJSON/index.js +18 -16
  90. package/dist/src/lib/genJSON/index.js.map +1 -1
  91. package/dist/src/lib/genXML/index.js +6 -12
  92. package/dist/src/lib/genXML/index.js.map +1 -1
  93. package/dist/src/lib/genXML/sigXML/index.js +3 -3
  94. package/dist/src/lib/genXML/sigXML/index.js.map +1 -1
  95. package/dist/src/lib/genXML/xmlConfig.d.ts +8 -1
  96. package/dist/src/lib/genXML/xmlConfig.js +5 -1
  97. package/dist/src/lib/genXML/xmlConfig.js.map +1 -1
  98. package/dist/src/services/getToken/index.d.ts +1 -1
  99. package/dist/src/services/send/index.js +4 -3
  100. package/dist/src/services/send/index.js.map +1 -1
  101. package/dist/src/types/xml/notaDeCredito.d.ts +1 -1
  102. package/dist/src/types/xml/notaDeDebito.d.ts +1 -1
  103. package/examples/README.md +6 -1
  104. package/examples/createAndSend.ts +7 -8
  105. package/examples/getToken.ts +6 -9
  106. package/jest.config.js +20 -3
  107. package/package.json +10 -11
  108. package/src/ATV.ts +28 -0
  109. package/src/confirmXML.ts +4 -4
  110. package/src/creditNote.ts +6 -6
  111. package/src/data/codigoMoneda.ts +180 -0
  112. package/src/data/exoneracion.ts +11 -0
  113. package/src/data/impuestos.ts +26 -0
  114. package/src/data/tipoCedula.ts +8 -0
  115. package/src/data/unidadesMedida.ts +99 -0
  116. package/src/debitNote.ts +6 -6
  117. package/src/electronicBill.ts +14 -6
  118. package/src/helpers/comprobantes.ts +2 -2
  119. package/src/index.ts +2 -0
  120. package/src/lib/genClave/index.ts +3 -3
  121. package/src/lib/genJSON/confirmXML.ts +2 -2
  122. package/src/lib/genJSON/index.ts +20 -18
  123. package/src/lib/genXML/index.ts +3 -9
  124. package/src/lib/genXML/sigXML/genKeysAndCert.ts +1 -5
  125. package/src/lib/genXML/sigXML/index.ts +1 -1
  126. package/src/lib/genXML/xmlConfig.ts +14 -1
  127. package/src/services/getToken/GetToken.ts +54 -0
  128. package/src/services/getToken/__tests__/GetToken.test.ts +82 -0
  129. package/src/services/getToken/index.ts +1 -1
  130. package/src/services/getToken/types.ts +30 -0
  131. package/src/services/send/index.ts +2 -2
  132. package/src/types/facturaInterfaces.d.ts +18 -1
  133. package/src/types/globalInterfaces.d.ts +2 -1
  134. package/src/types/xml/notaDeCredito.ts +1 -1
  135. package/src/types/xml/notaDeDebito.ts +1 -1
  136. package/tools/strToClave.ts +1 -1
  137. package/tools/xsdToJsonSchema.ts +108 -0
  138. package/tsconfig.json +1 -1
  139. package/dist/src/types/facturaInterfaces.d.ts +0 -88
  140. package/dist/src/types/facturaInterfaces.js +0 -7
  141. package/dist/src/types/facturaInterfaces.js.map +0 -1
  142. /package/__tests__/{unit → tests}/getClave.test.ts +0 -0
  143. /package/__tests__/{unit → tests}/getToken.test.ts +0 -0
@@ -0,0 +1,180 @@
1
+ export const enumCodigoMonedaType = [
2
+ 'AED',
3
+ 'AFN',
4
+ 'ALL',
5
+ 'AMD',
6
+ 'ANG',
7
+ 'AOA',
8
+ 'ARS',
9
+ 'AUD',
10
+ 'AWG',
11
+ 'AZN',
12
+ 'BAM',
13
+ 'BBD',
14
+ 'BDT',
15
+ 'BGN',
16
+ 'BHD',
17
+ 'BIF',
18
+ 'BMD',
19
+ 'BND',
20
+ 'BOB',
21
+ 'BOV',
22
+ 'BRL',
23
+ 'BSD',
24
+ 'BTN',
25
+ 'BWP',
26
+ 'BYR',
27
+ 'BZD',
28
+ 'CAD',
29
+ 'CDF',
30
+ 'CHE',
31
+ 'CHF',
32
+ 'CHW',
33
+ 'CLF',
34
+ 'CLP',
35
+ 'CNY',
36
+ 'COP',
37
+ 'COU',
38
+ 'CRC',
39
+ 'CUC',
40
+ 'CUP',
41
+ 'CVE',
42
+ 'CZK',
43
+ 'DJF',
44
+ 'DKK',
45
+ 'DOP',
46
+ 'DZD',
47
+ 'EGP',
48
+ 'ERN',
49
+ 'ETB',
50
+ 'EUR',
51
+ 'FJD',
52
+ 'FKP',
53
+ 'GBP',
54
+ 'GEL',
55
+ 'GHS',
56
+ 'GIP',
57
+ 'GMD',
58
+ 'GNF',
59
+ 'GTQ',
60
+ 'GYD',
61
+ 'HKD',
62
+ 'HNL',
63
+ 'HRK',
64
+ 'HTG',
65
+ 'HUF',
66
+ 'IDR',
67
+ 'ILS',
68
+ 'INR',
69
+ 'IQD',
70
+ 'IRR',
71
+ 'ISK',
72
+ 'JMD',
73
+ 'JOD',
74
+ 'JPY',
75
+ 'KES',
76
+ 'KGS',
77
+ 'KHR',
78
+ 'KMF',
79
+ 'KPW',
80
+ 'KRW',
81
+ 'KWD',
82
+ 'KYD',
83
+ 'KZT',
84
+ 'LAK',
85
+ 'LBP',
86
+ 'LKR',
87
+ 'LRD',
88
+ 'LSL',
89
+ 'LYD',
90
+ 'MAD',
91
+ 'MDL',
92
+ 'MGA',
93
+ 'MKD',
94
+ 'MMK',
95
+ 'MNT',
96
+ 'MOP',
97
+ 'MRO',
98
+ 'MUR',
99
+ 'MVR',
100
+ 'MWK',
101
+ 'MXN',
102
+ 'MXV',
103
+ 'MYR',
104
+ 'MZN',
105
+ 'NAD',
106
+ 'NGN',
107
+ 'NIO',
108
+ 'NOK',
109
+ 'NPR',
110
+ 'NZD',
111
+ 'OMR',
112
+ 'PAB',
113
+ 'PEN',
114
+ 'PGK',
115
+ 'PHP',
116
+ 'PKR',
117
+ 'PLN',
118
+ 'PYG',
119
+ 'QAR',
120
+ 'RON',
121
+ 'RSD',
122
+ 'RUB',
123
+ 'RWF',
124
+ 'SAR',
125
+ 'SBD',
126
+ 'SCR',
127
+ 'SDG',
128
+ 'SEK',
129
+ 'SGD',
130
+ 'SHP',
131
+ 'SLL',
132
+ 'SOS',
133
+ 'SRD',
134
+ 'SSP',
135
+ 'STD',
136
+ 'SVC',
137
+ 'SYP',
138
+ 'SZL',
139
+ 'THB',
140
+ 'TJS',
141
+ 'TMT',
142
+ 'TND',
143
+ 'TOP',
144
+ 'TRY',
145
+ 'TTD',
146
+ 'TWD',
147
+ 'TZS',
148
+ 'UAH',
149
+ 'UGX',
150
+ 'USD',
151
+ 'USN',
152
+ 'UYI',
153
+ 'UYU',
154
+ 'UZS',
155
+ 'VEF',
156
+ 'VND',
157
+ 'VUV',
158
+ 'WST',
159
+ 'XAF',
160
+ 'XAG',
161
+ 'XAU',
162
+ 'XBA',
163
+ 'XBB',
164
+ 'XBC',
165
+ 'XBD',
166
+ 'XCD',
167
+ 'XDR',
168
+ 'XOF',
169
+ 'XPD',
170
+ 'XPF',
171
+ 'XPT',
172
+ 'XSU',
173
+ 'XTS',
174
+ 'XUA',
175
+ 'XXX',
176
+ 'YER',
177
+ 'ZAR',
178
+ 'ZMW',
179
+ 'ZWL'
180
+ ]
@@ -0,0 +1,11 @@
1
+ // Tipo de documento de exoneración o autorización.
2
+ export const enumExoneracionType = [
3
+ '01', // Compras Autorizadas
4
+ '02', // Ventas exentas a diplomáticos
5
+ '03', // Autorizado por Ley Especial
6
+ '04', // Exenciones Dirección General de Hacienda
7
+ '05', // Transitorio V
8
+ '06', // Transitorio IX
9
+ '07', // Transitorio XVII
10
+ '99' // Otros
11
+ ]
@@ -21,3 +21,29 @@ export const tipoDocumento = {
21
21
  desc: 'Servicio'
22
22
  }
23
23
  }
24
+
25
+ // Código del impuesto
26
+ export const enumImpuestoTypeCodigo = [
27
+ '01', // Impuesto al valor agregado
28
+ '02', // Impuesto Selectivo de Consumo
29
+ '03', // Impuesto único a los combustivos
30
+ '04', // Impuesto específico de bebidas alcohólicas
31
+ '05', // Impuesto específico sobre las bebidas envasadas sin contenido alcohólico y jabones de tocador
32
+ '06', // Impuesto a los productos de tabaco
33
+ '07', // IVA (cálculo especial)
34
+ '08', // IVA Regimen de Bienes Usados (Factor)
35
+ '12', // Impuesto Especifico al cemento
36
+ '99' // Otros
37
+ ]
38
+
39
+ // Código de la tarifa del impuesto.
40
+ export const enumImpuestoTypeCodigoTarifa = [
41
+ '01', // Tarifa 0% (Exento),
42
+ '02', // Tarifa Reducida 1%
43
+ '03', // Tarifa reducida 2%
44
+ '04', // Tarifa reducida 4%
45
+ '05', // Transitorio 0%
46
+ '06', // Transitorio 4%
47
+ '07', // Transitorio 8%
48
+ '08' // Tarifa General 13%
49
+ ]
@@ -4,3 +4,11 @@ export const tipoCedula = {
4
4
  dimex: '03',
5
5
  nite: '04'
6
6
  }
7
+
8
+ // Tipo de identificación
9
+ export const enumIdentificacionType = [
10
+ '01', // Cédula Física
11
+ '02', // Cédula Jurídica
12
+ '03', // DIMEX
13
+ '04' // NITE
14
+ ]
@@ -38,3 +38,102 @@ export const unidadesDeMedida = [
38
38
  description: 'Metro cuadrado'
39
39
  }
40
40
  ]
41
+
42
+ export const enumUnidadDeMedidaType = [
43
+ 'Al',
44
+ 'Alc',
45
+ 'Cm',
46
+ 'I',
47
+ 'Os',
48
+ 'Sp',
49
+ 'Spe',
50
+ 'St',
51
+ 'd',
52
+ 'm',
53
+ 'kg',
54
+ 's',
55
+ 'A',
56
+ 'K',
57
+ 'mol',
58
+ 'cd',
59
+ 'm²',
60
+ 'm³',
61
+ 'm/s',
62
+ 'm/s²',
63
+ '1/m',
64
+ 'kg/m³',
65
+ 'A/m²',
66
+ 'A/m',
67
+ 'mol/m³',
68
+ 'cd/m²',
69
+ '1',
70
+ 'rad',
71
+ 'sr',
72
+ 'Hz',
73
+ 'N',
74
+ 'Pa',
75
+ 'J',
76
+ 'W',
77
+ 'C',
78
+ 'V',
79
+ 'F',
80
+ 'Ω',
81
+ 'S',
82
+ 'Wb',
83
+ 'T',
84
+ 'H',
85
+ '°C',
86
+ 'lm',
87
+ 'lx',
88
+ 'Bq',
89
+ 'Gy',
90
+ 'Sv',
91
+ 'kat',
92
+ 'Pa·s',
93
+ 'N·m',
94
+ 'N/m',
95
+ 'rad/s',
96
+ 'rad/s²',
97
+ 'W/m²',
98
+ 'J/K',
99
+ 'J/(kg·K)',
100
+ 'J/kg',
101
+ 'W/(m·K)',
102
+ 'J/m³',
103
+ 'V/m',
104
+ 'C/m³',
105
+ 'C/m²',
106
+ 'F/m',
107
+ 'H/m',
108
+ 'J/mol',
109
+ 'J/(mol·K)',
110
+ 'C/kg',
111
+ 'Gy/s',
112
+ 'W/sr',
113
+ 'W/(m²·sr)',
114
+ 'kat/m³',
115
+ 'min',
116
+ 'h',
117
+ 'd',
118
+ 'º',
119
+ '´',
120
+ '´´',
121
+ 'L',
122
+ 't',
123
+ 'Np',
124
+ 'B',
125
+ 'eV',
126
+ 'u',
127
+ 'ua',
128
+ 'Unid',
129
+ 'Gal',
130
+ 'g',
131
+ 'Km',
132
+ 'Kw',
133
+ 'ln',
134
+ 'cm',
135
+ 'mL',
136
+ 'mm',
137
+ 'Oz',
138
+ 'Otros'
139
+ ]
package/src/debitNote.ts CHANGED
@@ -1,15 +1,15 @@
1
- import { ClientPayload, XmlOpt } from './types/globalInterfaces'
2
- import { NotaDebitoContenedor } from './types/xml/notaDeDebito'
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 { NotaDebitoContenedor } from '@src/types/xml/notaDeDebito'
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 = 'ND'
15
15
 
@@ -1,12 +1,17 @@
1
- import { ClientPayload, FinalMessagePerson } from './types/globalInterfaces'
2
- import { genClaveObj, genString, parseOptions } from './lib/genClave/index'
3
- import genJSON from './lib/genJSON/index'
4
- import { send } from './services/send/index'
1
+ import { ClientPayload, FinalMessagePerson } from '@src/types/globalInterfaces'
2
+ import { genClaveObj, genString, parseOptions } from '@src/lib/genClave/index'
3
+ import genJSON from '@src/lib/genJSON/index'
4
+ import { send } from '@src/services/send/index'
5
5
 
6
6
  const DEFAULT_VALUES = {
7
7
  tipoIdentificacion: '01'
8
8
  }
9
9
 
10
+ const encodeXML = (xmlStr: string): string => {
11
+ const buffer = Buffer.from(xmlStr)
12
+ return buffer.toString('base64')
13
+ }
14
+
10
15
  function getSender(frontEndRequest: ClientPayload): FinalMessagePerson {
11
16
  const sender = frontEndRequest.Emisor
12
17
  return {
@@ -38,11 +43,14 @@ export default async (token, frontEndRequest: ClientPayload, xmlOpt): Promise<an
38
43
  fecha: date.toISOString(),
39
44
  emisor: getSender(frontEndRequest),
40
45
  receptor: getReceiver(frontEndRequest),
41
- comprobanteXml: XML
46
+ comprobanteXml: encodeXML(XML)
42
47
  }
43
- return send(token, finalMesage).catch((err) => {
48
+ const response = send(token, finalMesage).catch((err) => {
44
49
  const response = err.response || {}
45
50
  const header = response.headers || {}
51
+ console.log('response status code', err.response.status)
46
52
  console.log('x-error-cause', header['x-error-cause'])
47
53
  })
54
+
55
+ return response
48
56
  }
@@ -1,5 +1,5 @@
1
- import { ClientPayload, FinalMessagePerson } from '../types/globalInterfaces'
2
- import { Resumen, Persona } from '../types/facturaInterfaces'
1
+ import { ClientPayload, FinalMessagePerson } from '@src/types/globalInterfaces'
2
+ import { Resumen, Persona } from '@src/types/facturaInterfaces'
3
3
 
4
4
  const DEFAULT_VALUES = {
5
5
  key: 0,
package/src/index.ts CHANGED
@@ -4,10 +4,12 @@ import getToken from '@src/services/getToken'
4
4
  import genJSON from '@src/lib/genJSON'
5
5
  import eletronicBill from '@src/electronicBill'
6
6
  import * as genClaveTools from '@src/lib/genClave'
7
+ import { ATV } from './ATV'
7
8
  // import creditNote from '@src/creditNote'
8
9
  // import debitNote from '@src/debitNote'
9
10
 
10
11
  export {
12
+ ATV,
11
13
  confirmXML,
12
14
  sendToCustomURL,
13
15
  getToken,
@@ -1,6 +1,6 @@
1
- import { ClaveOpts, Clave, ClaveFecha, Consecutivo } from './interfaces'
2
- import { ClientPayload, FinalMessagePerson } from '../../types/globalInterfaces'
3
- import { tipoDocumento } from '../../data/tipoDocumento'
1
+ import { ClaveOpts, Clave, ClaveFecha, Consecutivo } from '@src/lib/genClave/interfaces'
2
+ import { ClientPayload, FinalMessagePerson } from '@src/types/globalInterfaces'
3
+ import { tipoDocumento } from '@src/data/tipoDocumento'
4
4
 
5
5
  const DEFAULT_VALUES = {
6
6
  tipoDocumento: '01',
@@ -1,5 +1,5 @@
1
- import { MensajeReceptorContenedor } from '../../types/xml/mensajeReceptor'
2
- import { tipoDocumento } from '../../data/tipoDocumento'
1
+ import { MensajeReceptorContenedor } from '@src/types/xml/mensajeReceptor'
2
+ import { tipoDocumento } from '@src/data/tipoDocumento'
3
3
 
4
4
  export function getMsjObj(opts: {
5
5
  fullInvoice: any;
@@ -1,6 +1,6 @@
1
- import { ClientPayload } from '../../types/globalInterfaces'
2
- import { FacturaElectronicaContenedor, Resumen, Persona, Impuesto, LineaDetalle } from '../../types/facturaInterfaces'
3
- import { genXML } from '../genXML'
1
+ import { ClientPayload } from '@src/types/globalInterfaces'
2
+ import { FacturaElectronicaContenedor, Resumen, Persona, Impuesto, LineaDetalle } from '@src/types/facturaInterfaces'
3
+ import { genXML } from '@src/lib/genXML'
4
4
 
5
5
  // Default XML Values
6
6
  const DEFAULT_VALUES = {
@@ -108,22 +108,24 @@ export default async (frontEndRequest: ClientPayload, date: any, clave: string,
108
108
  const receiver = getReceiver(frontEndRequest)
109
109
  const sender = getSender(frontEndRequest)
110
110
  const lines = setLinesDefaults(frontEndRequest.LineasDetalle)
111
+ const key = frontEndRequest.facturaElectronicaType || 'FacturaElectronica'
112
+ const body = {
113
+ Clave: clave,
114
+ CodigoActividad: frontEndRequest.actividad.padStart(6, '0'),
115
+ NumeroConsecutivo: consecutivo,
116
+ FechaEmision: date,
117
+ Emisor: sender,
118
+ Receptor: receiver,
119
+ CondicionVenta: '01',
120
+ MedioPago: '01',
121
+ DetalleServicio: {
122
+ LineaDetalle: lines
123
+ },
124
+ ResumenFactura: getBillResum(lines)
125
+ }
111
126
  const factura: FacturaElectronicaContenedor = {
112
- FacturaElectronica: {
113
- Clave: clave,
114
- CodigoActividad: frontEndRequest.actividad.padStart(6, '0'),
115
- NumeroConsecutivo: consecutivo,
116
- FechaEmision: date,
117
- Emisor: sender,
118
- Receptor: receiver,
119
- CondicionVenta: '01',
120
- MedioPago: '01',
121
- DetalleServicio: {
122
- LineaDetalle: lines
123
- },
124
- ResumenFactura: getBillResum(lines)
125
- }
127
+ [key]: body
126
128
  }
127
- const XML = await genXML('FE', factura, options)
129
+ const XML = await genXML(key, factura, options)
128
130
  return XML
129
131
  }
@@ -1,11 +1,6 @@
1
1
  import { j2xParser, parse } from 'fast-xml-parser'
2
- import { declaration, defaultOptions, xmlExtructures } from './xmlConfig'
3
- import sigXML from './sigXML/index'
4
-
5
- const encodeXML = (xmlStr: string): string => {
6
- const buffer = Buffer.from(xmlStr)
7
- return buffer.toString('base64')
8
- }
2
+ import { declaration, defaultOptions, xmlExtructures } from '@src/lib/genXML/xmlConfig'
3
+ import sigXML from '@src/lib/genXML/sigXML/index'
9
4
 
10
5
  export const objToXML = (xmlStructure: string, obj: object): string => {
11
6
  const parser = new j2xParser(defaultOptions) // eslint-disable-line new-cap
@@ -23,8 +18,7 @@ export async function genXML(xmlStructure: string, obj: object, options?: {
23
18
  const xml = objToXML(xmlStructure, obj)
24
19
  if (!options) return xml
25
20
  const signedXML = await sigXML(xml, options.buffer, options.password)
26
- if (!options.base64) return signedXML
27
- return encodeXML(signedXML)
21
+ return signedXML
28
22
  }
29
23
 
30
24
  export const xmlToJson = (xml: string): any => {
@@ -21,11 +21,7 @@ function preparePems(privatePem, publicPem, certPem): any {
21
21
 
22
22
  function fromBase64(base64Text: string): any {
23
23
  base64Text = base64Text.replace(/\n/g, '').replace(/\r/g, '').replace(/\t/g, '').replace(/\s/g, '')
24
- if (typeof atob !== 'undefined') {
25
- return this.FromBinary(atob(base64Text))
26
- } else {
27
- return new Uint8Array(Buffer.from(base64Text, 'base64')).buffer
28
- }
24
+ return new Uint8Array(Buffer.from(base64Text, 'base64')).buffer
29
25
  }
30
26
 
31
27
  function convertFromBase64(pems): any {
@@ -1,6 +1,6 @@
1
1
  import { Application, SignedXml, Parse, OptionsXAdES } from 'xadesjs'
2
2
  import { Crypto } from '@peculiar/webcrypto'
3
- import { genKeysAndCert } from './genKeysAndCert'
3
+ import { genKeysAndCert } from '@src/lib/genXML/sigXML/genKeysAndCert'
4
4
  import { XMLSerializer } from 'xmldom-alpha'
5
5
 
6
6
  function addSigToXML(xml: Document, signature: any): string {
@@ -1,8 +1,14 @@
1
1
  const FE_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica'
2
2
  const FE_XML_SCHEMA_XSI = 'https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/FacturaElectronica_V4.3.xsd'
3
+
4
+ const FEE_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronicaExportacion'
5
+ const FEE_XML_SCHEMA_XSI = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronicaExportacion.xsd'
6
+
3
7
  const MR_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/mensajeReceptor'
8
+
4
9
  const NC_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/notaCreditoElectronica'
5
10
  const NC_XML_SCHEMA_XSI = 'https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/NotaCreditoElectronica_V4.3.xsd'
11
+
6
12
  const ND_XML_SCHEMA_NS = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/notaDebitoElectronica'
7
13
  const ND_XML_SCHEMA_XSI = 'https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/NotaDebitoElectronica_V4.3.xsd'
8
14
 
@@ -24,6 +30,12 @@ const FE_XML_ATTRS = { // Factura Electronica
24
30
  'xsi:schemaLocation': `${FE_XML_SCHEMA_NS} ${FE_XML_SCHEMA_XSI}`
25
31
  }
26
32
 
33
+ const FEE_XML_ATTRS = { // Factura Electronica Exportación
34
+ xmlns: FE_XML_SCHEMA_NS,
35
+ ...COMMON_STRUCTURE,
36
+ 'xsi:schemaLocation': `${FEE_XML_SCHEMA_NS} ${FEE_XML_SCHEMA_XSI}`
37
+ }
38
+
27
39
  const NC_XML_ATTRS = { // Nota Credito Electronica
28
40
  xmlns: NC_XML_SCHEMA_NS,
29
41
  ...COMMON_STRUCTURE,
@@ -43,7 +55,8 @@ const MR_XML_ATTRS = { // Mensaje Receptor
43
55
  }
44
56
 
45
57
  export const xmlExtructures = {
46
- FE: FE_XML_ATTRS,
58
+ FacturaElectronica: FE_XML_ATTRS,
59
+ FacturaElectronicaExportacion: FEE_XML_ATTRS,
47
60
  NC: NC_XML_ATTRS,
48
61
  ND: ND_XML_ATTRS,
49
62
  CCE: MR_XML_ATTRS,
@@ -0,0 +1,54 @@
1
+ import axios from 'axios'
2
+ import qs from 'querystring'
3
+ import { GetTokenDto, GetTokenInternalProps, GetTokenRawResponse, GetTokenResponse } from './types'
4
+ import { ATV } from '@src/ATV'
5
+
6
+ const MAIN_DOMAIN = 'https://idp.comprobanteselectronicos.go.cr'
7
+ const options: { [key: string]: GetTokenInternalProps} = {
8
+ prod: {
9
+ serviceUrl: `${MAIN_DOMAIN}/auth/realms/rut/protocol/openid-connect/token`,
10
+ clientId: 'api'
11
+ },
12
+ stg: {
13
+ serviceUrl: `${MAIN_DOMAIN}/auth/realms/rut-stag/protocol/openid-connect/token`,
14
+ clientId: 'api-stag'
15
+ }
16
+ }
17
+
18
+ export class GetToken {
19
+ private readonly props: GetTokenInternalProps;
20
+ constructor(scope: ATV) {
21
+ this.props = this.initProps(scope.mode)
22
+ }
23
+
24
+ public async execute({ username, password }: GetTokenDto): Promise<GetTokenResponse> {
25
+ const fetchResponse = await axios.post<GetTokenRawResponse>(this.props.serviceUrl, qs.stringify({
26
+ // eslint-disable-next-line @typescript-eslint/camelcase
27
+ client_id: this.props.clientId,
28
+ // eslint-disable-next-line @typescript-eslint/camelcase
29
+ grant_type: 'password',
30
+ // eslint-disable-next-line @typescript-eslint/camelcase
31
+ client_secret: '',
32
+ username,
33
+ password
34
+ }), {
35
+ headers: {
36
+ 'Content-Type': 'application/x-www-form-urlencoded'
37
+ }
38
+ })
39
+ const data = fetchResponse.data
40
+ return {
41
+ accessToken: data.access_token,
42
+ expiresIn: data.expires_in,
43
+ refreshToken: data.refresh_token,
44
+ refreshExpiresIn: data.refresh_expires_in,
45
+ sessionState: data.session_state,
46
+ tokenType: data.token_type,
47
+ scope: data.scope
48
+ }
49
+ }
50
+
51
+ private initProps(mode: string): GetTokenInternalProps {
52
+ return options[mode] || options.prod
53
+ }
54
+ }