@devlas/dte-sii 2.12.25 → 2.12.26

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/DTE.js CHANGED
@@ -350,6 +350,13 @@ class DTE {
350
350
  format: false,
351
351
  });
352
352
 
353
+ // NO QUITAR estos dos xmlns del <DTE>. NO son redundantes aunque el sobre
354
+ // <EnvioBOLETA>/<EnvioDTE> también los declare.
355
+ // El DigestValue de la firma se calcula en _c14nDocumento(), que lee el xmlns
356
+ // desde el <DTE> y lo hereda al <Documento> canonicalizado. Si se quita, se
357
+ // firma un <Documento> sin namespace, pero el SII lo canonicaliza CON
358
+ // xmlns="http://www.sii.cl/SiiDte" (lo hereda igual) → los digests no coinciden
359
+ // → "firma inválida" / rechazo. Tampoco stripearlos después en Envio.js.
353
360
  const dteConVersion = {
354
361
  '@_xmlns': 'http://www.sii.cl/SiiDte',
355
362
  '@_xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
package/Envio.js CHANGED
@@ -81,6 +81,11 @@ class EnvioBase {
81
81
 
82
82
  /**
83
83
  * Extraer XML de DTEs sin declaration
84
+ *
85
+ * NO stripear el xmlns del <DTE> aquí (aunque el sobre ya lo declare). Ese
86
+ * namespace es parte del documento firmado: el DigestValue de la firma se
87
+ * calculó heredándolo al <Documento>. Si se quita, el SII recalcula el digest
88
+ * CON el namespace y no coincide → "firma inválida". Solo quitar el prolog XML.
84
89
  */
85
90
  _extractDTEsXml() {
86
91
  return this.dtes.map(dte => {
package/README.md CHANGED
@@ -197,6 +197,21 @@ const estadoDte = await enviador.consultarEstadoDte({
197
197
 
198
198
  ## Boletas electrónicas
199
199
 
200
+ > **Recomendado para CERTIFICAR boletas: usar `CertRunner` + `BoletaCert`, no el camino manual.**
201
+ >
202
+ > Para el proceso de certificación de boletas ante el SII, use el orquestador de
203
+ > alto nivel (`require('@devlas/dte-sii/cert')` → `CertRunner` / `BoletaCert`). Ese
204
+ > camino descarga el set, genera y firma las boletas, arma el `EnvioBOLETA` + RCOF,
205
+ > obtiene el TrackId y declara el cumplimiento. Es el flujo probado end-to-end.
206
+ >
207
+ > El camino manual de bajo nivel (`DTE` + `EnvioBOLETA` + `EnviadorSII`) que se
208
+ > muestra más abajo funciona, pero es fácil romperlo. **Error frecuente:** "optimizar"
209
+ > quitando los `xmlns` del `<DTE>` por parecer redundantes con el sobre. NO lo haga:
210
+ > el `xmlns="http://www.sii.cl/SiiDte"` del `<DTE>` es parte del documento firmado
211
+ > (se hereda al `<Documento>` al calcular el DigestValue). Si lo quita, el SII
212
+ > recalcula el digest con el namespace y no coincide → rechazo por "firma inválida".
213
+ > Ver [Certificación SII](#certificación-sii).
214
+
200
215
  > **Diferencia crítica por ambiente**
201
216
  >
202
217
  > - **Producción** → usar la API **REST** del SII (`enviarBoleta`) con los datos reales de resolución de la empresa.
@@ -12,6 +12,12 @@
12
12
  * 3. Se genera RCOF (ConsumoFolio) para reportar los folios usados
13
13
  * 4. Se envían ambos documentos al SII
14
14
  * 5. SII valida y aprueba
15
+ *
16
+ * NOTA sobre el RCOF (ConsumoFolio):
17
+ * El RCOF está deprecado en producción y ya no se usa en la operación normal.
18
+ * Solo se mantiene aquí porque este paso de certificación todavía lo exige.
19
+ * Al enviarlo, el SII puede devolver reparos: eso es esperado en certificación
20
+ * y no bloquea el avance del proceso.
15
21
  */
16
22
 
17
23
  const path = require('path');
@@ -482,6 +488,8 @@ class BoletaCert {
482
488
  }
483
489
 
484
490
  process.stderr.write(`[PROGRESS]${JSON.stringify({ step: 'BOLETA_RCOF' })}\n`);
491
+ // RCOF deprecado en producción: solo se envía aquí porque la certificación aún
492
+ // lo exige. Reparos del SII en este envío son esperados y NO bloquean el avance.
485
493
  // 5 & 6. Generar y enviar RCOF — loop hasta que SII lo acepte o se agoten intentos.
486
494
  // Estrategia: enviar → si ok, esperar 30s → consultar estado (EPR o RPR = éxito).
487
495
  // Si DUPLICADO: el SII ya tiene un RCOF para este RUT/período. El entorno de certificación
@@ -3073,6 +3073,20 @@ class CertRunner {
3073
3073
  // ═══════════════════════════════════════════════════════════════
3074
3074
  // BOLETA ELECTRÓNICA — automatización portal certBolElectDteInternet
3075
3075
  // ═══════════════════════════════════════════════════════════════
3076
+ //
3077
+ // Métodos que se usan para la CERTIFICACIÓN DE BOLETAS (flujo, en orden):
3078
+ // 1. obtenerSetBoletaPortal → descarga el Set de Pruebas (?SET=1)
3079
+ // 2. (BoletaCert.ejecutarCertificacion emite EnvioBOLETA + RCOF → devuelve trackId)
3080
+ // 3. solicitarValidacionBoletaPortal → declara el trackId del envío (?SET=2)
3081
+ // 4. completarDeclaracionBoletaPortal→ declara cumplimiento y autoriza producción
3082
+ //
3083
+ // Apoyo (solo lectura / recuperación de estado):
3084
+ // - consultarEstadoBoletaPortal → estado en el portal GWT de boleta
3085
+ // - verificarAutorizacionBoleta → confirma si la empresa ya emite tipo 39
3086
+ //
3087
+ // El portal de boleta usa GWT-RPC (certBolElectDteInternet), distinto del portal
3088
+ // pe_avance usado para facturas/DTE. La certificación de boletas NO usa las fases
3089
+ // de sets/libros/simulación/intercambio/muestras; esas son solo del track DTE.
3076
3090
 
3077
3091
  /**
3078
3092
  * Descarga el Set de Pruebas de Boleta Electrónica desde el portal SII.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devlas/dte-sii",
3
- "version": "2.12.25",
3
+ "version": "2.12.26",
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",