@devlas/dte-sii 2.5.10 → 2.5.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CafSolicitor.js +378 -378
- package/ConsumoFolio.js +376 -376
- package/Envio.js +196 -196
- package/LICENSE +27 -27
- package/README.md +273 -239
- package/SiiCertificacion.js +14 -7
- package/SiiPortalAuth.js +474 -468
- package/cert/CertRunner.js +8 -0
- package/cert/ConfigLoader.js +131 -131
- package/cert/IntercambioCert.js +427 -427
- package/cert/LibroCompras.js +357 -357
- package/cert/LibroGuias.js +169 -169
- package/cert/LibroVentas.js +151 -151
- package/cert/MuestrasImpresas.js +674 -674
- package/cert/SetBase.js +319 -319
- package/cert/SetBasico.js +411 -411
- package/cert/SetCompra.js +470 -470
- package/cert/SetExenta.js +488 -488
- package/cert/SetGuia.js +281 -281
- package/cert/SetParser.js +1182 -1182
- package/cert/SetsProvider.js +497 -497
- package/cert/Simulacion.js +519 -519
- package/cert/comunaOficina.js +458 -458
- package/cert/index.js +122 -122
- package/cert/types.js +328 -328
- package/package.json +49 -49
package/cert/CertRunner.js
CHANGED
|
@@ -1217,6 +1217,14 @@ class CertRunner {
|
|
|
1217
1217
|
return { success: true, etapa: 'INTERCAMBIO' };
|
|
1218
1218
|
}
|
|
1219
1219
|
|
|
1220
|
+
// ✅ TAMBIÉN: Etapas que vienen DESPUÉS de INTERCAMBIO (simulación + intercambio ya completos)
|
|
1221
|
+
const ETAPAS_POST_INTERCAMBIO = ['DOCUMENTOS IMPRESOS', 'MUESTRAS IMPRESAS', 'BOLETA', 'AUTORIZADO', 'COMPLETADO'];
|
|
1222
|
+
if (avance.etapaActual && ETAPAS_POST_INTERCAMBIO.some(e => avance.etapaActual.toUpperCase().includes(e))) {
|
|
1223
|
+
console.log(` 📍 Etapa actual: ${avance.etapaActual}`);
|
|
1224
|
+
console.log('\n 🎉 ¡SIMULACIÓN + INTERCAMBIO COMPLETADOS! Empresa en etapa: ' + avance.etapaActual);
|
|
1225
|
+
return { success: true, etapa: avance.etapaActual, postIntercambio: true };
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1220
1228
|
// ✅ SEGUNDO: Verificar indicador de formulario de confirmación (simulación aprobada pendiente confirmar)
|
|
1221
1229
|
if (avance.simulacionAprobadaIndicador) {
|
|
1222
1230
|
console.log(` ✅ Formulario de confirmación detectado`);
|
package/cert/ConfigLoader.js
CHANGED
|
@@ -1,131 +1,131 @@
|
|
|
1
|
-
// Copyright (c) 2026 Devlas SpA — https://devlas.cl
|
|
2
|
-
// Licencia MIT. Ver archivo LICENSE para mas detalles.
|
|
3
|
-
/**
|
|
4
|
-
* ConfigLoader - Carga configuración de certificación desde .env
|
|
5
|
-
*
|
|
6
|
-
* Centraliza la carga de configuración para que los runners (CLI)
|
|
7
|
-
* no necesiten módulos intermedios.
|
|
8
|
-
*
|
|
9
|
-
* @module dte-sii/cert/ConfigLoader
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const path = require('path');
|
|
13
|
-
const fs = require('fs');
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Carga configuración desde .env y retorna objetos estructurados
|
|
17
|
-
*
|
|
18
|
-
* @param {Object} options
|
|
19
|
-
* @param {string} [options.envPath] - Ruta al archivo .env (por defecto busca en static/nodejs/.env)
|
|
20
|
-
* @param {string} [options.baseDir] - Directorio base para resolver rutas relativas
|
|
21
|
-
* @returns {Object} Configuración estructurada { EMISOR, RECEPTOR, CERT_PATH, CERT_PASS, AMBIENTE, BASE_DIR, ... }
|
|
22
|
-
*/
|
|
23
|
-
function loadConfig(options = {}) {
|
|
24
|
-
// Determinar baseDir
|
|
25
|
-
const baseDir = options.baseDir || path.resolve(__dirname, '..', '..', '..');
|
|
26
|
-
|
|
27
|
-
// Cargar .env (opcional — las vars pueden venir de process.env inyectadas por el proceso padre)
|
|
28
|
-
const envPath = options.envPath || path.join(baseDir, '.env');
|
|
29
|
-
|
|
30
|
-
if (fs.existsSync(envPath)) {
|
|
31
|
-
require('dotenv').config({ path: envPath });
|
|
32
|
-
} else {
|
|
33
|
-
console.warn(`[ConfigLoader] .env no encontrado en ${envPath} — usando variables de entorno del proceso.`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Resolver rutas relativas
|
|
37
|
-
const resolvePath = (filePath) => {
|
|
38
|
-
if (!filePath) return null;
|
|
39
|
-
return path.isAbsolute(filePath) ? filePath : path.resolve(baseDir, filePath);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
// Validar variables requeridas (solo CERT_PATH es estrictamente necesario;
|
|
43
|
-
// el resto puede no estar si los datos vienen del portal SII vía getEmisorFromPortal)
|
|
44
|
-
if (!process.env.CERT_PATH) {
|
|
45
|
-
throw new Error('Variable de entorno faltante: CERT_PATH');
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Construir objetos de configuración
|
|
49
|
-
const AMBIENTE = process.env.SII_AMBIENTE || 'certificacion';
|
|
50
|
-
|
|
51
|
-
const fch_resol = process.env.FECHA_RESOLUCION || new Date().toISOString().slice(0, 10);
|
|
52
|
-
const nro_resol = parseInt(process.env.NRO_RESOLUCION || '0', 10);
|
|
53
|
-
|
|
54
|
-
console.log(`[ConfigLoader] ✅ Resolución: NroResol=${nro_resol} FchResol=${fch_resol} (AMBIENTE=${AMBIENTE})`);
|
|
55
|
-
|
|
56
|
-
const EMISOR = {
|
|
57
|
-
rut: process.env.EMISOR_RUT,
|
|
58
|
-
razon_social: process.env.EMISOR_RAZON_SOCIAL,
|
|
59
|
-
giro: process.env.EMISOR_GIRO || 'ACTIVIDADES DE PROGRAMACION INFORMATICA',
|
|
60
|
-
acteco: process.env.EMISOR_ACTECO || '620200',
|
|
61
|
-
direccion: process.env.EMISOR_DIRECCION || '',
|
|
62
|
-
comuna: process.env.EMISOR_COMUNA || 'Santiago',
|
|
63
|
-
ciudad: process.env.EMISOR_CIUDAD || 'Santiago',
|
|
64
|
-
fch_resol,
|
|
65
|
-
nro_resol,
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const RECEPTOR = {
|
|
69
|
-
rut: process.env.RECEPTOR_RUT || '66666666-6',
|
|
70
|
-
razon_social: process.env.RECEPTOR_RAZON_SOCIAL || 'CLIENTE TEST',
|
|
71
|
-
giro: process.env.RECEPTOR_GIRO || 'ACTIVIDADES VARIAS',
|
|
72
|
-
direccion: process.env.RECEPTOR_DIRECCION || 'AVENIDA PRINCIPAL 123',
|
|
73
|
-
comuna: process.env.RECEPTOR_COMUNA || 'Santiago',
|
|
74
|
-
ciudad: process.env.RECEPTOR_CIUDAD || 'Santiago',
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const CERT_PATH = resolvePath(process.env.CERT_PATH);
|
|
78
|
-
const CERT_PASS = process.env.CERT_PASS || '';
|
|
79
|
-
|
|
80
|
-
// Configuración SII
|
|
81
|
-
const SII_CONFIG = {
|
|
82
|
-
sendDelayMs: parseInt(process.env.SII_SEND_DELAY_MS || '8000', 10),
|
|
83
|
-
sendRetries: parseInt(process.env.SII_SEND_RETRIES || '6', 10),
|
|
84
|
-
cafRetries: parseInt(process.env.SII_CAF_RETRIES || '3', 10),
|
|
85
|
-
reuseFolios: process.env.SII_REUSE_FOLIOS === 'true',
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
// Enviador (quien firma/envía)
|
|
89
|
-
const ENVIADOR = {
|
|
90
|
-
rut: process.env.ENVIADOR_RUT || EMISOR.rut,
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
return {
|
|
94
|
-
EMISOR,
|
|
95
|
-
RECEPTOR,
|
|
96
|
-
CERT_PATH,
|
|
97
|
-
CERT_PASS,
|
|
98
|
-
AMBIENTE,
|
|
99
|
-
BASE_DIR: baseDir,
|
|
100
|
-
SII_CONFIG,
|
|
101
|
-
ENVIADOR,
|
|
102
|
-
|
|
103
|
-
// Helper para crear config de CertRunner
|
|
104
|
-
toCertRunnerConfig() {
|
|
105
|
-
return {
|
|
106
|
-
certificado: { path: CERT_PATH, password: CERT_PASS },
|
|
107
|
-
emisor: EMISOR,
|
|
108
|
-
receptor: RECEPTOR,
|
|
109
|
-
ambiente: AMBIENTE,
|
|
110
|
-
resolucion: { fecha: EMISOR.fch_resol, numero: EMISOR.nro_resol },
|
|
111
|
-
baseDir: baseDir,
|
|
112
|
-
debugDir: path.join(baseDir, 'debug', 'cert-v2'),
|
|
113
|
-
};
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Imprime banner de sección para CLI
|
|
120
|
-
* @param {string} titulo
|
|
121
|
-
*/
|
|
122
|
-
function printBanner(titulo) {
|
|
123
|
-
console.log('\n' + '═'.repeat(60));
|
|
124
|
-
console.log(` ${titulo}`);
|
|
125
|
-
console.log('═'.repeat(60));
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
module.exports = {
|
|
129
|
-
loadConfig,
|
|
130
|
-
printBanner,
|
|
131
|
-
};
|
|
1
|
+
// Copyright (c) 2026 Devlas SpA — https://devlas.cl
|
|
2
|
+
// Licencia MIT. Ver archivo LICENSE para mas detalles.
|
|
3
|
+
/**
|
|
4
|
+
* ConfigLoader - Carga configuración de certificación desde .env
|
|
5
|
+
*
|
|
6
|
+
* Centraliza la carga de configuración para que los runners (CLI)
|
|
7
|
+
* no necesiten módulos intermedios.
|
|
8
|
+
*
|
|
9
|
+
* @module dte-sii/cert/ConfigLoader
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Carga configuración desde .env y retorna objetos estructurados
|
|
17
|
+
*
|
|
18
|
+
* @param {Object} options
|
|
19
|
+
* @param {string} [options.envPath] - Ruta al archivo .env (por defecto busca en static/nodejs/.env)
|
|
20
|
+
* @param {string} [options.baseDir] - Directorio base para resolver rutas relativas
|
|
21
|
+
* @returns {Object} Configuración estructurada { EMISOR, RECEPTOR, CERT_PATH, CERT_PASS, AMBIENTE, BASE_DIR, ... }
|
|
22
|
+
*/
|
|
23
|
+
function loadConfig(options = {}) {
|
|
24
|
+
// Determinar baseDir
|
|
25
|
+
const baseDir = options.baseDir || path.resolve(__dirname, '..', '..', '..');
|
|
26
|
+
|
|
27
|
+
// Cargar .env (opcional — las vars pueden venir de process.env inyectadas por el proceso padre)
|
|
28
|
+
const envPath = options.envPath || path.join(baseDir, '.env');
|
|
29
|
+
|
|
30
|
+
if (fs.existsSync(envPath)) {
|
|
31
|
+
require('dotenv').config({ path: envPath });
|
|
32
|
+
} else {
|
|
33
|
+
console.warn(`[ConfigLoader] .env no encontrado en ${envPath} — usando variables de entorno del proceso.`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Resolver rutas relativas
|
|
37
|
+
const resolvePath = (filePath) => {
|
|
38
|
+
if (!filePath) return null;
|
|
39
|
+
return path.isAbsolute(filePath) ? filePath : path.resolve(baseDir, filePath);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Validar variables requeridas (solo CERT_PATH es estrictamente necesario;
|
|
43
|
+
// el resto puede no estar si los datos vienen del portal SII vía getEmisorFromPortal)
|
|
44
|
+
if (!process.env.CERT_PATH) {
|
|
45
|
+
throw new Error('Variable de entorno faltante: CERT_PATH');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Construir objetos de configuración
|
|
49
|
+
const AMBIENTE = process.env.SII_AMBIENTE || 'certificacion';
|
|
50
|
+
|
|
51
|
+
const fch_resol = process.env.FECHA_RESOLUCION || new Date().toISOString().slice(0, 10);
|
|
52
|
+
const nro_resol = parseInt(process.env.NRO_RESOLUCION || '0', 10);
|
|
53
|
+
|
|
54
|
+
console.log(`[ConfigLoader] ✅ Resolución: NroResol=${nro_resol} FchResol=${fch_resol} (AMBIENTE=${AMBIENTE})`);
|
|
55
|
+
|
|
56
|
+
const EMISOR = {
|
|
57
|
+
rut: process.env.EMISOR_RUT,
|
|
58
|
+
razon_social: process.env.EMISOR_RAZON_SOCIAL,
|
|
59
|
+
giro: process.env.EMISOR_GIRO || 'ACTIVIDADES DE PROGRAMACION INFORMATICA',
|
|
60
|
+
acteco: process.env.EMISOR_ACTECO || '620200',
|
|
61
|
+
direccion: process.env.EMISOR_DIRECCION || '',
|
|
62
|
+
comuna: process.env.EMISOR_COMUNA || 'Santiago',
|
|
63
|
+
ciudad: process.env.EMISOR_CIUDAD || 'Santiago',
|
|
64
|
+
fch_resol,
|
|
65
|
+
nro_resol,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const RECEPTOR = {
|
|
69
|
+
rut: process.env.RECEPTOR_RUT || '66666666-6',
|
|
70
|
+
razon_social: process.env.RECEPTOR_RAZON_SOCIAL || 'CLIENTE TEST',
|
|
71
|
+
giro: process.env.RECEPTOR_GIRO || 'ACTIVIDADES VARIAS',
|
|
72
|
+
direccion: process.env.RECEPTOR_DIRECCION || 'AVENIDA PRINCIPAL 123',
|
|
73
|
+
comuna: process.env.RECEPTOR_COMUNA || 'Santiago',
|
|
74
|
+
ciudad: process.env.RECEPTOR_CIUDAD || 'Santiago',
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const CERT_PATH = resolvePath(process.env.CERT_PATH);
|
|
78
|
+
const CERT_PASS = process.env.CERT_PASS || '';
|
|
79
|
+
|
|
80
|
+
// Configuración SII
|
|
81
|
+
const SII_CONFIG = {
|
|
82
|
+
sendDelayMs: parseInt(process.env.SII_SEND_DELAY_MS || '8000', 10),
|
|
83
|
+
sendRetries: parseInt(process.env.SII_SEND_RETRIES || '6', 10),
|
|
84
|
+
cafRetries: parseInt(process.env.SII_CAF_RETRIES || '3', 10),
|
|
85
|
+
reuseFolios: process.env.SII_REUSE_FOLIOS === 'true',
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// Enviador (quien firma/envía)
|
|
89
|
+
const ENVIADOR = {
|
|
90
|
+
rut: process.env.ENVIADOR_RUT || EMISOR.rut,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
EMISOR,
|
|
95
|
+
RECEPTOR,
|
|
96
|
+
CERT_PATH,
|
|
97
|
+
CERT_PASS,
|
|
98
|
+
AMBIENTE,
|
|
99
|
+
BASE_DIR: baseDir,
|
|
100
|
+
SII_CONFIG,
|
|
101
|
+
ENVIADOR,
|
|
102
|
+
|
|
103
|
+
// Helper para crear config de CertRunner
|
|
104
|
+
toCertRunnerConfig() {
|
|
105
|
+
return {
|
|
106
|
+
certificado: { path: CERT_PATH, password: CERT_PASS },
|
|
107
|
+
emisor: EMISOR,
|
|
108
|
+
receptor: RECEPTOR,
|
|
109
|
+
ambiente: AMBIENTE,
|
|
110
|
+
resolucion: { fecha: EMISOR.fch_resol, numero: EMISOR.nro_resol },
|
|
111
|
+
baseDir: baseDir,
|
|
112
|
+
debugDir: path.join(baseDir, 'debug', 'cert-v2'),
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Imprime banner de sección para CLI
|
|
120
|
+
* @param {string} titulo
|
|
121
|
+
*/
|
|
122
|
+
function printBanner(titulo) {
|
|
123
|
+
console.log('\n' + '═'.repeat(60));
|
|
124
|
+
console.log(` ${titulo}`);
|
|
125
|
+
console.log('═'.repeat(60));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
module.exports = {
|
|
129
|
+
loadConfig,
|
|
130
|
+
printBanner,
|
|
131
|
+
};
|