@devlas/dte-sii 2.21.1 → 2.23.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.
Files changed (2) hide show
  1. package/SiiPortalAuth.js +45 -0
  2. package/package.json +1 -1
package/SiiPortalAuth.js CHANGED
@@ -510,6 +510,21 @@ class SiiPortalAuth {
510
510
  throw errLimite;
511
511
  }
512
512
 
513
+ // El certificado nunca fue habilitado como método de login en el SII: trámite manual
514
+ // único del contribuyente (sii.cl, Clave Tributaria, Cambiar clave, habilitar
515
+ // autenticación con Certificado Digital), no un problema del certificado en sí ni de
516
+ // esta librería. Sin esta deteccion caía en el genérico "no se recibieron cookies", que
517
+ // no dice qué hacer -- caso real verificado el 2026-09-09 (RUT anonimizado en los tests).
518
+ if (r2.body.includes('Cambiar clave') || r2.body.includes('01.01.215.500.473')) {
519
+ const errNoHabilitado = new Error(
520
+ 'SiiPortalAuth: el certificado no está habilitado como método de autenticación en el SII.\n' +
521
+ 'El contribuyente debe entrar a sii.cl, Clave Tributaria, Cambiar clave, habilitar ' +
522
+ 'autenticación con Certificado Digital, y asociar este certificado. No se resuelve reintentando.'
523
+ );
524
+ errNoHabilitado.code = 'CERTIFICADO_NO_HABILITADO';
525
+ throw errNoHabilitado;
526
+ }
527
+
513
528
  const autenticado = Object.keys(cookieJar).some(k => k.startsWith('NETSCAPE_LIVEWIRE'));
514
529
  if (!autenticado) {
515
530
  throw new Error('SiiPortalAuth: autenticación fallida — no se recibieron cookies de sesión NETSCAPE_LIVEWIRE.*');
@@ -806,7 +821,37 @@ class SiiPortalAuth {
806
821
  * El HTML tiene filas <tr><td>Label</td><td>&nbsp;Valor</td></tr>
807
822
  * @private
808
823
  */
824
+ /**
825
+ * "el Contribuyente no está autorizado para operar en esta modalidad" — la empresa nunca
826
+ * quedó postulada (y/o enrolada) como emisor electrónico ante el SII, así que ad_empresa2
827
+ * ni siquiera devuelve la tabla de datos que `_parsearTablaEmpresa` espera: devuelve esta
828
+ * página de rechazo. Mismo patrón y mismo código de error que `CafSolicitor.esEmpresaNoAutorizada`
829
+ * (`EMPRESA_NO_AUTORIZADA`) — ahí ya existía para otro flujo, acá faltaba. Sin esto caía en
830
+ * el genérico "no se encontraron datos de resolución", que no dice qué falta. Caso real
831
+ * verificado el 2026-09-10 (RUT anonimizado en los tests).
832
+ */
833
+ static esEmpresaNoAutorizada(html) {
834
+ const texto = String(html || '').replace(/<[^>]+>/g, ' ');
835
+ // El SII usa dos sujetos distintos para el mismo rechazo, segun la pagina: "la empresa
836
+ // no esta autorizada" (ver CafSolicitor.esEmpresaNoAutorizada) y "el Contribuyente no
837
+ // esta autorizado" (ad_empresa2, caso real 2026-09-10) -- distinto genero tambien
838
+ // (autorizada/autorizado), por eso el [oa] al final en vez de repetir todo el patron.
839
+ return /(empresa|contribuyente)\s+no\s+est.{0,8}\s*autorizad[oa]\s+para\s+operar/i.test(texto);
840
+ }
841
+
809
842
  static _parsearTablaEmpresa(html) {
843
+ if (SiiPortalAuth.esEmpresaNoAutorizada(html)) {
844
+ const err = new Error(
845
+ 'SiiPortalAuth: la empresa no está autorizada para operar en esta modalidad. ' +
846
+ 'No es un problema de datos ni de sesión: el SII no reconoce a la empresa como ' +
847
+ 'emisor electrónico en este ambiente. Las dos causas habituales son que todavía ' +
848
+ 'no complete la certificación (en producción no queda autorizada hasta entonces) ' +
849
+ 'o que nunca se haya corrido la Postulación/Enrolamiento.'
850
+ );
851
+ err.code = 'EMPRESA_NO_AUTORIZADA';
852
+ throw err;
853
+ }
854
+
810
855
  const datos = {};
811
856
  const decode = s => s
812
857
  .replace(/<[^>]+>/g, '')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devlas/dte-sii",
3
- "version": "2.21.1",
3
+ "version": "2.23.0",
4
4
  "description": "Facturación y boletas electrónicas para el SII de Chile. Genera, timbra, firma y envía DTEs, libros electrónicos y automatiza la certificación.",
5
5
  "main": "index.js",
6
6
  "types": "dte-sii.d.ts",