@devlas/dte-sii 2.5.12 → 2.5.14
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/BoletaService.js +1 -1
- package/CafSolicitor.js +11 -12
- package/Certificado.js +2 -2
- package/ConsumoFolio.js +3 -3
- package/EnviadorSII.js +72 -99
- package/FolioService.js +1 -1
- package/SiiCertificacion.js +159 -28
- package/SiiPortalAuth.js +33 -9
- package/SiiSession.js +4 -4
- package/cert/BoletaCert.js +44 -44
- package/cert/CertRunner.js +511 -219
- package/cert/ConfigLoader.js +1 -1
- package/cert/IntercambioCert.js +19 -19
- package/cert/LibroCompras.js +45 -5
- package/cert/MuestrasImpresas.js +18 -18
- package/cert/SetBase.js +16 -16
- package/cert/SetBasico.js +6 -6
- package/cert/SetCompra.js +6 -6
- package/cert/SetExenta.js +6 -6
- package/cert/SetGuia.js +2 -2
- package/cert/SetParser.js +96 -13
- package/cert/SetsProvider.js +16 -19
- package/cert/Simulacion.js +1 -1
- package/package.json +2 -1
- package/utils/progress.js +78 -0
- package/utils/xml.js +2 -2
package/cert/BoletaCert.js
CHANGED
|
@@ -302,11 +302,11 @@ class BoletaCert {
|
|
|
302
302
|
const { DOMParser: XMLParser } = require('@xmldom/xmldom');
|
|
303
303
|
|
|
304
304
|
console.log('\n' + '═'.repeat(60));
|
|
305
|
-
console.log('
|
|
305
|
+
console.log('REENVÍO RCOF (ConsumoFolio)');
|
|
306
306
|
console.log('═'.repeat(60));
|
|
307
307
|
|
|
308
308
|
// 1. Parsear el EnvioBOLETA existente para extraer info
|
|
309
|
-
console.log('\
|
|
309
|
+
console.log('\nLeyendo EnvioBOLETA...');
|
|
310
310
|
const envioBOLETAXml = fs.readFileSync(options.envioBOLETAPath, 'utf-8');
|
|
311
311
|
const parser = new XMLParser();
|
|
312
312
|
const doc = parser.parseFromString(envioBOLETAXml, 'text/xml');
|
|
@@ -333,11 +333,11 @@ class BoletaCert {
|
|
|
333
333
|
Totales: { MntNeto: mntNeto, MntExe: mntExe, IVA: iva, MntTotal: mntTotal }
|
|
334
334
|
}
|
|
335
335
|
});
|
|
336
|
-
console.log(`
|
|
336
|
+
console.log(` - Folio ${folio}: Neto=${mntNeto}, Exento=${mntExe}, IVA=${iva}, Total=${mntTotal}`);
|
|
337
337
|
}
|
|
338
338
|
|
|
339
339
|
// 2. Crear RCOF
|
|
340
|
-
console.log(`\
|
|
340
|
+
console.log(`\nGenerando RCOF con SecEnvio=${options.secEnvio}...`);
|
|
341
341
|
const { ConsumoFolio } = this._lib();
|
|
342
342
|
const consumoFolio = new ConsumoFolio(this.certificado);
|
|
343
343
|
|
|
@@ -354,26 +354,26 @@ class BoletaCert {
|
|
|
354
354
|
});
|
|
355
355
|
|
|
356
356
|
consumoFolio.generar();
|
|
357
|
-
console.log(`
|
|
357
|
+
console.log(` ✓ XML generado: ${consumoFolio.xml.length} bytes`);
|
|
358
358
|
|
|
359
359
|
// Guardar debug
|
|
360
360
|
if (this.debugDir) {
|
|
361
361
|
const debugPath = path.join(this.debugDir, 'boleta-cert');
|
|
362
362
|
fs.mkdirSync(debugPath, { recursive: true });
|
|
363
363
|
fs.writeFileSync(path.join(debugPath, `ConsumoFolio-sec${options.secEnvio}.xml`), consumoFolio.xml, 'utf-8');
|
|
364
|
-
console.log(`
|
|
364
|
+
console.log(` Guardado en: ${path.join(debugPath, `ConsumoFolio-sec${options.secEnvio}.xml`)}`);
|
|
365
365
|
}
|
|
366
366
|
|
|
367
367
|
// 3. Enviar RCOF
|
|
368
|
-
console.log('\
|
|
368
|
+
console.log('\nEnviando RCOF al SII...');
|
|
369
369
|
const enviador = new EnviadorSII(this.certificado, this.ambiente);
|
|
370
370
|
const resultadoRCOF = await enviador.enviarConsumoFolios(consumoFolio);
|
|
371
371
|
|
|
372
372
|
if (!resultadoRCOF.ok) {
|
|
373
|
-
console.log(`
|
|
373
|
+
console.log(` [ERR] Error: ${resultadoRCOF.error}`);
|
|
374
374
|
return { success: false, error: resultadoRCOF.error };
|
|
375
375
|
}
|
|
376
|
-
console.log(`
|
|
376
|
+
console.log(` [OK] Enviado - TrackId: ${resultadoRCOF.trackId}`);
|
|
377
377
|
|
|
378
378
|
return { success: true, trackIdRCOF: resultadoRCOF.trackId };
|
|
379
379
|
}
|
|
@@ -390,71 +390,71 @@ class BoletaCert {
|
|
|
390
390
|
const { EnviadorSII } = this._lib();
|
|
391
391
|
|
|
392
392
|
console.log('\n' + '═'.repeat(60));
|
|
393
|
-
console.log('
|
|
393
|
+
console.log('CERTIFICACIÓN BOLETAS ELECTRÓNICAS');
|
|
394
394
|
console.log('═'.repeat(60));
|
|
395
395
|
|
|
396
396
|
// 1. Parsear set de pruebas
|
|
397
|
-
console.log('\
|
|
397
|
+
console.log('\nParseando set de pruebas...');
|
|
398
398
|
const casos = this.parseSetPruebas(options.setPath);
|
|
399
|
-
console.log(`
|
|
399
|
+
console.log(` ✓ ${casos.length} casos encontrados`);
|
|
400
400
|
|
|
401
401
|
// 2. Generar boletas
|
|
402
|
-
console.log('\
|
|
402
|
+
console.log('\nGenerando boletas...');
|
|
403
403
|
const { boletas, foliosUsados, folioInicial, folioFinal } = await this.generarBoletasSet(
|
|
404
404
|
casos,
|
|
405
405
|
options.cafBoleta,
|
|
406
406
|
options.folioInicial
|
|
407
407
|
);
|
|
408
|
-
console.log(`
|
|
408
|
+
console.log(` ✓ ${boletas.length} boletas generadas (folios ${folioInicial}-${folioFinal})`);
|
|
409
409
|
|
|
410
410
|
for (const b of boletas) {
|
|
411
411
|
const monto = b.dte.montoTotal || 0;
|
|
412
|
-
console.log(`
|
|
412
|
+
console.log(` - CASO-${b.caso}: Folio ${b.folio} - $${monto.toLocaleString('es-CL')}`);
|
|
413
413
|
}
|
|
414
414
|
|
|
415
415
|
// 3. Generar EnvioBOLETA
|
|
416
|
-
console.log('\
|
|
416
|
+
console.log('\nGenerando EnvioBOLETA...');
|
|
417
417
|
const envioBoleta = this.generarEnvioBoleta(boletas);
|
|
418
|
-
console.log(`
|
|
418
|
+
console.log(` ✓ XML generado: ${envioBoleta.xml.length} bytes`);
|
|
419
419
|
|
|
420
420
|
// Guardar debug
|
|
421
421
|
if (this.debugDir) {
|
|
422
422
|
const debugPath = path.join(this.debugDir, 'boleta-cert');
|
|
423
423
|
fs.mkdirSync(debugPath, { recursive: true });
|
|
424
424
|
fs.writeFileSync(path.join(debugPath, 'EnvioBOLETA.xml'), envioBoleta.xml, 'utf-8');
|
|
425
|
-
console.log(`
|
|
425
|
+
console.log(` Guardado en: ${path.join(debugPath, 'EnvioBOLETA.xml')}`);
|
|
426
426
|
}
|
|
427
427
|
|
|
428
428
|
// 4. Enviar EnvioBOLETA
|
|
429
|
-
console.log('\
|
|
429
|
+
console.log('\nEnviando EnvioBOLETA al SII...');
|
|
430
430
|
const enviador = new EnviadorSII(this.certificado, this.ambiente);
|
|
431
431
|
const resultadoBoleta = await enviador.enviarBoletaSoap(envioBoleta);
|
|
432
432
|
|
|
433
433
|
if (!resultadoBoleta.ok) {
|
|
434
|
-
console.log(`
|
|
434
|
+
console.log(` [ERR] Error: ${resultadoBoleta.error}`);
|
|
435
435
|
return { success: false, error: resultadoBoleta.error, fase: 'EnvioBOLETA' };
|
|
436
436
|
}
|
|
437
|
-
console.log(`
|
|
437
|
+
console.log(` [OK] Enviado - TrackId: ${resultadoBoleta.trackId}`);
|
|
438
438
|
|
|
439
439
|
// 5. Generar RCOF
|
|
440
|
-
console.log('\
|
|
440
|
+
console.log('\nGenerando RCOF (ConsumoFolio)...');
|
|
441
441
|
const consumoFolio = this.generarConsumoFolio(envioBoleta);
|
|
442
442
|
consumoFolio.generar(); // generar() ya incluye firmar() internamente
|
|
443
|
-
console.log(`
|
|
443
|
+
console.log(` ✓ XML generado: ${consumoFolio.xml.length} bytes`);
|
|
444
444
|
|
|
445
445
|
// Guardar debug
|
|
446
446
|
if (this.debugDir) {
|
|
447
447
|
const debugPath = path.join(this.debugDir, 'boleta-cert');
|
|
448
448
|
fs.writeFileSync(path.join(debugPath, 'ConsumoFolio.xml'), consumoFolio.xml, 'utf-8');
|
|
449
|
-
console.log(`
|
|
449
|
+
console.log(` Guardado en: ${path.join(debugPath, 'ConsumoFolio.xml')}`);
|
|
450
450
|
}
|
|
451
451
|
|
|
452
452
|
// 6. Enviar RCOF
|
|
453
|
-
console.log('\
|
|
453
|
+
console.log('\nEnviando RCOF al SII...');
|
|
454
454
|
const resultadoRCOF = await enviador.enviarConsumoFolios(consumoFolio);
|
|
455
455
|
|
|
456
456
|
if (!resultadoRCOF.ok) {
|
|
457
|
-
console.log(`
|
|
457
|
+
console.log(` [ERR] Error: ${resultadoRCOF.error}`);
|
|
458
458
|
return {
|
|
459
459
|
success: false,
|
|
460
460
|
error: resultadoRCOF.error,
|
|
@@ -462,16 +462,16 @@ class BoletaCert {
|
|
|
462
462
|
trackIdBoleta: resultadoBoleta.trackId
|
|
463
463
|
};
|
|
464
464
|
}
|
|
465
|
-
console.log(`
|
|
465
|
+
console.log(` [OK] Enviado - TrackId: ${resultadoRCOF.trackId}`);
|
|
466
466
|
|
|
467
467
|
// Resumen
|
|
468
468
|
console.log('\n' + '═'.repeat(60));
|
|
469
|
-
console.log('
|
|
469
|
+
console.log('[OK] CERTIFICACIÓN BOLETAS COMPLETADA');
|
|
470
470
|
console.log('═'.repeat(60));
|
|
471
|
-
console.log(`
|
|
472
|
-
console.log(`
|
|
473
|
-
console.log(`
|
|
474
|
-
console.log(`
|
|
471
|
+
console.log(` EnvioBOLETA: ${resultadoBoleta.trackId}`);
|
|
472
|
+
console.log(` RCOF: ${resultadoRCOF.trackId}`);
|
|
473
|
+
console.log(` Boletas: ${boletas.length}`);
|
|
474
|
+
console.log(` Folios: ${folioInicial} - ${folioFinal}`);
|
|
475
475
|
|
|
476
476
|
return {
|
|
477
477
|
success: true,
|
|
@@ -494,9 +494,9 @@ class BoletaCert {
|
|
|
494
494
|
const forge = require('node-forge');
|
|
495
495
|
|
|
496
496
|
console.log('\n' + '═'.repeat(60));
|
|
497
|
-
console.log('
|
|
497
|
+
console.log('DECLARAR AVANCE BOLETAS');
|
|
498
498
|
console.log('═'.repeat(60));
|
|
499
|
-
console.log(`
|
|
499
|
+
console.log(` TrackId: ${trackId}`);
|
|
500
500
|
|
|
501
501
|
const host = this.ambiente === 'produccion' ? 'palena.sii.cl' : 'maullin.sii.cl';
|
|
502
502
|
const endpoint = '/cgi_dte/UPL/DTEauth?3';
|
|
@@ -548,7 +548,7 @@ class BoletaCert {
|
|
|
548
548
|
req.end();
|
|
549
549
|
});
|
|
550
550
|
|
|
551
|
-
console.log(`
|
|
551
|
+
console.log(` URL: ${url}`);
|
|
552
552
|
|
|
553
553
|
try {
|
|
554
554
|
const response = await requestWithCert({
|
|
@@ -561,7 +561,7 @@ class BoletaCert {
|
|
|
561
561
|
},
|
|
562
562
|
}, body);
|
|
563
563
|
|
|
564
|
-
console.log(`
|
|
564
|
+
console.log(` Status: ${response.status}`);
|
|
565
565
|
|
|
566
566
|
// Guardar respuesta para debug
|
|
567
567
|
if (this.debugDir) {
|
|
@@ -583,24 +583,24 @@ class BoletaCert {
|
|
|
583
583
|
const enRevision = /EN REVISION|PROCESANDO/i.test(html);
|
|
584
584
|
|
|
585
585
|
if (esAprobado) {
|
|
586
|
-
console.log('
|
|
586
|
+
console.log(' [OK] BOLETAS APROBADAS');
|
|
587
587
|
return { success: true, estado: 'APROBADO', html };
|
|
588
588
|
} else if (esRechazado) {
|
|
589
|
-
console.log('
|
|
589
|
+
console.log(' [ERR] BOLETAS RECHAZADAS');
|
|
590
590
|
// Extraer mensaje de error si existe
|
|
591
591
|
const errorMatch = html.match(/<font[^>]*color[^>]*red[^>]*>([^<]+)</i);
|
|
592
592
|
const errorMsg = errorMatch ? errorMatch[1].trim() : 'Error desconocido';
|
|
593
593
|
return { success: false, estado: 'RECHAZADO', error: errorMsg, html };
|
|
594
594
|
} else if (enRevision) {
|
|
595
|
-
console.log('
|
|
595
|
+
console.log(' [...] EN REVISIÓN');
|
|
596
596
|
return { success: true, estado: 'EN_REVISION', html };
|
|
597
597
|
} else {
|
|
598
|
-
console.log('
|
|
598
|
+
console.log(' Respuesta recibida (verificar manualmente)');
|
|
599
599
|
return { success: true, estado: 'DESCONOCIDO', html };
|
|
600
600
|
}
|
|
601
601
|
|
|
602
602
|
} catch (error) {
|
|
603
|
-
console.error(`
|
|
603
|
+
console.error(` [ERR] Error: ${error.message}`);
|
|
604
604
|
return { success: false, error: error.message };
|
|
605
605
|
}
|
|
606
606
|
}
|
|
@@ -614,8 +614,8 @@ class BoletaCert {
|
|
|
614
614
|
const https = require('https');
|
|
615
615
|
const forge = require('node-forge');
|
|
616
616
|
|
|
617
|
-
console.log(`\n
|
|
618
|
-
console.log(`
|
|
617
|
+
console.log(`\n Consultando estado del set...`);
|
|
618
|
+
console.log(` TrackId: ${trackId}`);
|
|
619
619
|
|
|
620
620
|
const host = this.ambiente === 'produccion' ? 'www4.sii.cl' : 'www4.sii.cl';
|
|
621
621
|
|
|
@@ -718,7 +718,7 @@ class BoletaCert {
|
|
|
718
718
|
}
|
|
719
719
|
|
|
720
720
|
} catch (error) {
|
|
721
|
-
console.error(`
|
|
721
|
+
console.error(` [!] Error consultando estado: ${error.message}`);
|
|
722
722
|
return {
|
|
723
723
|
success: true,
|
|
724
724
|
estado: 'DESCONOCIDO',
|