@devlas/dte-sii 2.5.11 → 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.
@@ -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`);
@@ -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
+ };