@devlas/dte-sii 2.9.8 → 2.11.0

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.
@@ -162,6 +162,7 @@ class BoletaCert {
162
162
  tipo: 39,
163
163
  folio: folioActual,
164
164
  fechaEmision: fechaHoy,
165
+ precioConIva: true, // Set de pruebas SII define precios "con IVA" (precio al consumidor)
165
166
  emisor: {
166
167
  RUTEmisor: this.emisor.rut,
167
168
  RznSocEmisor: this.emisor.razon_social,
@@ -453,8 +454,34 @@ class BoletaCert {
453
454
  }
454
455
  } else {
455
456
  console.log(` [OK] Enviado - TrackId: ${resultadoBoleta.trackId}`);
457
+
458
+ // Verificar estado SOAP antes de continuar. Error 6 "Rut No Autorizado a Firmar"
459
+ // es fatal — reintentar con otro sec no sirve de nada.
460
+ process.stderr.write(`[PROGRESS]${JSON.stringify({ step: 'BOLETA_SOAP_CHECK' })}\n`);
461
+ console.log(` ⏳ Esperando 20s para verificar estado SOAP del EnvioBOLETA...`);
462
+ await new Promise(r => setTimeout(r, 20000));
463
+ try {
464
+ const _estadoBoleta = await enviador.consultarEstadoSoap(resultadoBoleta.trackId, this.emisor.rut);
465
+ console.log(` [Estado SOAP EnvioBOLETA] ${_estadoBoleta.estado} — ${_estadoBoleta.mensaje}`);
466
+ if (_estadoBoleta.esRechazado) {
467
+ const _glosa = _estadoBoleta.glosa || _estadoBoleta.estado || '?';
468
+ const _esAuth = /autorizado|autorizar|firmar|permiso/i.test(_glosa);
469
+ console.log(` [ERR] EnvioBOLETA rechazado por SII${_esAuth ? ' (error de autorización)' : ''}: ${_glosa}`);
470
+ return {
471
+ success: false,
472
+ error: `EnvioBOLETA rechazado por SII: ${_glosa} (${_estadoBoleta.estado})`,
473
+ fase: 'EnvioBOLETA-SOAP',
474
+ noAutorizado: _esAuth,
475
+ estadoSoap: _estadoBoleta.estado,
476
+ };
477
+ }
478
+ // Estado intermedio (REC, SOK, FOK…) → SII aún procesa, continuar con RCOF
479
+ } catch (_e) {
480
+ console.log(` [!] No se pudo verificar estado SOAP EnvioBOLETA: ${_e.message} — continuando`);
481
+ }
456
482
  }
457
-
483
+
484
+ process.stderr.write(`[PROGRESS]${JSON.stringify({ step: 'BOLETA_RCOF' })}\n`);
458
485
  // 5 & 6. Generar y enviar RCOF — loop hasta que SII lo acepte o se agoten intentos.
459
486
  // Estrategia: enviar → si ok, esperar 30s → consultar estado (EPR o RPR = éxito).
460
487
  // Si DUPLICADO: el SII ya tiene un RCOF para este RUT/período. El entorno de certificación
@@ -528,8 +555,17 @@ class BoletaCert {
528
555
  break;
529
556
  }
530
557
 
531
- // SII lo rechazó explícitamente — probar con el siguiente sec
532
- console.log(` [⚠️ RECHAZADO] RCOF sec=${secActual} rechazado (${estadoRcof.estado}: ${estadoRcof.glosa || estadoRcof.mensaje}). Probando sec=${secActual + 1}...`);
558
+ // SII lo rechazó explícitamente.
559
+ // Si es un error de autorización (error 6 "Rut No Autorizado a Firmar"),
560
+ // cambiar sec no sirve — abortar inmediatamente.
561
+ const _glosaRcof = estadoRcof.glosa || estadoRcof.mensaje || '';
562
+ const _esAuthRcof = /autorizado|autorizar|firmar|permiso/i.test(_glosaRcof);
563
+ if (_esAuthRcof) {
564
+ console.log(` [ERR-AUTH] RCOF rechazado por error de autorización (${estadoRcof.estado}): ${_glosaRcof} — abortando (reintentar no ayuda)`);
565
+ resultadoRCOF = { ok: false, error: `Empresa no autorizada para firmar RCOF: ${_glosaRcof}`, noAutorizado: true };
566
+ break;
567
+ }
568
+ console.log(` [⚠️ RECHAZADO] RCOF sec=${secActual} rechazado (${estadoRcof.estado}: ${_glosaRcof}). Probando sec=${secActual + 1}...`);
533
569
  trackIdRCOFloop = null;
534
570
  }
535
571
 
@@ -542,7 +578,8 @@ class BoletaCert {
542
578
  success: false,
543
579
  error: resultadoRCOF.error,
544
580
  fase: 'RCOF',
545
- trackIdBoleta: resultadoBoleta.trackId
581
+ noAutorizado: resultadoRCOF.noAutorizado || false,
582
+ trackIdBoleta: resultadoBoleta.trackId,
546
583
  };
547
584
  }
548
585
  }