@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.
package/README.md CHANGED
@@ -1,273 +1,273 @@
1
- # @devlas/dte-sii
2
-
3
- **Librería de facturación y boletas electrónicas para el SII de Chile.**
4
-
5
- Genera, timbra, firma y envía facturas electrónicas, boletas electrónicas, libros contables y automatiza el proceso de certificación ante el SII.
6
-
7
- > Desarrollada por [Devlas SpA](https://devlas.cl) y publicada bajo licencia MIT para la comunidad de desarrolladores chilenos.
8
-
9
- ---
10
-
11
- ## Instalación
12
-
13
- ```bash
14
- npm install @devlas/dte-sii
15
- ```
16
-
17
- ## Uso básico
18
-
19
- ```javascript
20
- const {
21
- Certificado, CAF, DTE, EnvioDTE, EnvioBOLETA, EnviadorSII,
22
- ConsumoFolio, LibroCompraVenta, LibroGuia,
23
- } = require('@devlas/dte-sii')
24
-
25
- // Cargar certificado digital (.pfx)
26
- const cert = new Certificado(fs.readFileSync('certificado.pfx'), 'contraseña')
27
-
28
- // Cargar CAF (folios autorizados)
29
- const caf = new CAF(fs.readFileSync('caf.xml', 'utf8'))
30
-
31
- // Crear y timbrar una Factura Electrónica (tipo 33)
32
- const dte = new DTE({ Encabezado: { ... }, Detalle: [ ... ] })
33
- dte.generarXML().timbrar(caf).firmar(cert)
34
-
35
- // Enviar al SII
36
- const envio = new EnvioDTE({ certificado: cert })
37
- envio.agregar(dte)
38
- envio.setCaratula({ RutEmisor: '76354771-K', ... })
39
- envio.generar()
40
-
41
- const enviador = new EnviadorSII(cert, 'produccion') // o 'certificacion'
42
- const resultado = await enviador.enviarDteSoap(envio)
43
- console.log(resultado.trackId)
44
- ```
45
-
46
- ## Módulos
47
-
48
- | Clase | Descripción |
49
- |---|---|
50
- | `Certificado` | Carga y maneja certificados digitales PFX/P12 |
51
- | `CAF` | Código de Autorización de Folios del SII |
52
- | `DTE` | Genera, timbra y firma documentos tributarios |
53
- | `EnvioDTE` | Sobre XML para facturas, guías y notas |
54
- | `EnvioBOLETA` | Sobre XML para boletas electrónicas |
55
- | `EnviadorSII` | Comunicación SOAP/HTTP con el SII |
56
- | `ConsumoFolio` | Genera RCOF (Resumen Consumo de Folios) |
57
- | `LibroCompraVenta` | Libro electrónico de Compra/Venta |
58
- | `LibroGuia` | Libro electrónico de Guías de Despacho |
59
- | `FolioService` | Gestión y solicitud de folios (CAF) |
60
- | `SiiSession` | Sesión autenticada con el portal SII |
61
- | `SiiCertificacion` | Automatización del proceso de certificación |
62
-
63
- ## Tipos de DTE soportados
64
-
65
- | Tipo | Documento |
66
- |---|---|
67
- | 33 | Factura Electrónica |
68
- | 34 | Factura No Afecta o Exenta |
69
- | 39 | Boleta Electrónica Afecta |
70
- | 41 | Boleta Electrónica Exenta |
71
- | 43 | Liquidación Factura |
72
- | 46 | Factura de Compra |
73
- | 52 | Guía de Despacho |
74
- | 56 | Nota de Débito |
75
- | 61 | Nota de Crédito |
76
-
77
- ## Ambientes
78
-
79
- Soporta `'certificacion'` y `'produccion'`. Pasarlo al instanciar `EnviadorSII`.
80
-
81
- ## Estados SII — Interpretación de respuestas
82
-
83
- `EnviadorSII` interpreta automáticamente los códigos del SII en tres categorías:
84
-
85
- ### QueryEstUp — Estado del sobre de envío
86
-
87
- | Código | Descripción | `esExitoso` | `esIntermedio` | `esRechazado` |
88
- |--------|-------------|:-----------:|:--------------:|:-------------:|
89
- | `EPR` | Envío Procesado | ✅ | | |
90
- | `RPR` | Procesado con Reparos | ✅ | | |
91
- | `REC` / `SOK` / `FOK` / `CRT` / `PRD` / `PDR` | En proceso de validación | | ✅ | |
92
- | `RSC` | Error en Schema XML | | | ✅ |
93
- | `RFR` | Error en Firma Digital | | | ✅ |
94
- | `RCT` | Error en Carátula | | | ✅ |
95
-
96
- ### QueryEstDte — Estado del DTE individual
97
-
98
- | Código | Descripción | Clasificación |
99
- |--------|-------------|---------------|
100
- | `DOK` | Datos coinciden | ✅ Exitoso |
101
- | `DNK` | Datos no coinciden | ⏳ Intermedio |
102
- | `FAU` | Folio no autorizado | ❌ Rechazado |
103
- | `FNA` | Emisor no habilitado | ❌ Rechazado |
104
- | `FAN` / `AND` / `ANC` | Anulado | ❌ Rechazado |
105
- | `EMP` | Empresa sin autorización | ❌ Rechazado |
106
-
107
- ### Códigos negativos (errores de consulta)
108
-
109
- Los códigos `-1` a `-14` son **errores del servidor de consulta SII**, no implican rechazo del documento. Todos resultan en `esIntermedio = true` y se pueden reintentar.
110
-
111
- > Ver `docs/README.md` en el repositorio para la tabla completa de estados con descripción detallada.
112
-
113
- ---
114
-
115
- ## Licencia
116
-
117
- MIT — Copyright (c) 2026 [Devlas SpA](https://devlas.cl)
118
-
119
- Inspirada conceptualmente en [LibreDTE de SASCO SpA](https://libredte.cl).
120
- Implementa el protocolo XML público del SII de Chile.
121
-
122
- ---
123
-
124
- ## Estructura de Archivos
125
-
126
- ```
127
- dte-sii/
128
- ├── index.js # Punto de entrada principal
129
- ├── utils.js # Utilidades y helpers
130
- ├── Certificado.js # Manejo de certificados PFX/P12
131
- ├── CAF.js # Código de Autorización de Folios
132
- ├── DTE.js # Documento Tributario Electrónico
133
- ├── Signer.js # Firma XML-DSig
134
- ├── Envio.js # EnvioBOLETA y EnvioDTE
135
- ├── EnviadorSII.js # Comunicación con servicios SII
136
- ├── BoletaService.js # Servicio simplificado para boletas
137
- ├── LibroBase.js # Clase base para libros
138
- ├── ConsumoFolio.js # RCOF (Resumen Consumo Folios)
139
- ├── LibroCompraVenta.js # Libro Compra/Venta
140
- ├── LibroGuia.js # Libro Guías de Despacho
141
- ├── FolioService.js # Gestión integral de folios (solicitar, consultar, anular)
142
- ├── FolioRegistry.js # Registro local de folios usados + helpers
143
- └── SiiSession.js # Sesiones HTTP autenticadas con el SII
144
- ```
145
-
146
- ## Uso
147
-
148
- ```javascript
149
- const {
150
- DTE, CAF, Certificado, EnvioDTE, EnviadorSII,
151
- FolioRegistry, createCafFingerprint, resolveCafPath
152
- } = require('@devlas/dte-sii');
153
-
154
- // Instancia de registro de folios
155
- const folioRegistry = new FolioRegistry();
156
- ```
157
-
158
- ## Clases Principales
159
-
160
- | Clase | Responsabilidad |
161
- |-------|-----------------|
162
- | `Certificado` | Carga y manejo de certificados digitales (.pfx/.p12) |
163
- | `CAF` | Parseado y uso de Códigos de Autorización de Folios |
164
- | `DTE` | Generación, timbraje y firma de documentos |
165
- | `Signer` | Firma XML-DSig compatible con SII |
166
- | `EnvioBOLETA` | Sobre para boletas electrónicas |
167
- | `EnvioDTE` | Sobre para facturas y otros DTEs |
168
- | `EnviadorSII` | Autenticación y envío al SII (REST + SOAP) |
169
- | `BoletaService` | Servicio simplificado para crear boletas |
170
- | `ConsumoFolio` | RCOF - Resumen Consumo de Folios |
171
- | `LibroCompraVenta` | Libro electrónico de compras/ventas |
172
- | `LibroGuia` | Libro electrónico de guías de despacho |
173
-
174
- ## Gestión de Folios
175
-
176
- | Clase/Función | Responsabilidad |
177
- |---------------|-----------------|
178
- | `FolioService` | Servicio para solicitar, consultar y anular folios en el SII |
179
- | `FolioRegistry` | Registro local de folios usados, reservados y enviados |
180
- | `SiiSession` | Sesiones HTTP autenticadas con certificado digital |
181
- | `createCafFingerprint(xml)` | Genera hash único de un CAF |
182
- | `findLatestCaf(tipoDte, dir)` | Busca el CAF más reciente para un tipo de DTE |
183
- | `resolveCafPath(opts)` | Resuelve ruta de CAF con validación de folios |
184
-
185
- ### Ejemplo de uso de FolioRegistry
186
-
187
- ```javascript
188
- const {
189
- FolioRegistry, CAF, createCafFingerprint, resolveCafPath
190
- } = require('@devlas/dte-sii');
191
-
192
- // Instancia de registro
193
- const folioRegistry = new FolioRegistry();
194
-
195
- // Resolver CAF automáticamente
196
- const cafPath = resolveCafPath({
197
- tipoDte: 33,
198
- rutEmisor: '78206276-K',
199
- requiredCount: 1,
200
- ambiente: 'certificacion',
201
- });
202
-
203
- // Cargar CAF
204
- const cafXml = fs.readFileSync(cafPath, 'utf8');
205
- const caf = new CAF(cafXml);
206
- const cafFingerprint = createCafFingerprint(cafXml);
207
-
208
- // Reservar próximo folio
209
- const folio = folioRegistry.reserveNextFolio({
210
- rutEmisor: '78206276-K',
211
- tipoDte: caf.getTipoDTE(),
212
- folioDesde: caf.getFolioDesde(),
213
- folioHasta: caf.getFolioHasta(),
214
- ambiente: 'certificacion',
215
- cafFingerprint,
216
- });
217
-
218
- // Marcar folio como enviado (después de envío exitoso)
219
- folioRegistry.markFolioSent({
220
- rutEmisor: '78206276-K',
221
- tipoDte: caf.getTipoDTE(),
222
- folio,
223
- folioDesde: caf.getFolioDesde(),
224
- folioHasta: caf.getFolioHasta(),
225
- ambiente: 'certificacion',
226
- cafFingerprint,
227
- trackId: '0245283324',
228
- });
229
- ```
230
-
231
- ### Ejemplo de uso de FolioService (avanzado)
232
-
233
- ```javascript
234
- const { FolioService, Certificado } = require('@devlas/dte-sii');
235
-
236
- const certificado = new Certificado('certificado.pfx', 'password');
237
- const folioService = new FolioService({
238
- ambiente: 'certificacion',
239
- rutEmisor: '78206276-K',
240
- certificado: certificado,
241
- });
242
-
243
- // Consultar folios en el SII
244
- const consulta = await folioService.consultarFolios({ tipoDte: 33 });
245
- console.log('Último folio:', consulta.ultimoFolioFinal);
246
-
247
- // Anular folios no usados
248
- const resultado = await folioService.anularFolios({
249
- tipoDte: 33,
250
- folioDesde: 50,
251
- folioHasta: 60,
252
- motivo: 'Folios no utilizados',
253
- });
254
- ```
255
-
256
- ## Utilidades
257
-
258
- | Función | Descripción |
259
- |---------|-------------|
260
- | `sanitizeSiiText()` | Elimina caracteres problemáticos (apóstrofes, comillas) |
261
- | `formatRut()` | Formatea RUT chileno |
262
- | `calcularDV()` | Calcula dígito verificador |
263
- | `formatBase64InXml()` | Formatea base64 con saltos de línea |
264
-
265
- ## Filosofía
266
-
267
- `@devlas/dte-sii` actúa como **facilitador transparente** entre el usuario y el SII:
268
-
269
- 1. **Sanitización automática**: El usuario no se preocupa por caracteres especiales
270
- 2. **Formatos flexibles**: Acepta datos simplificados o estructurados
271
- 3. **Encoding interno**: Maneja UTF-8/ISO-8859-1 automáticamente
272
- 4. **Firma automática**: Genera firmas XML-DSig compatibles con SII
273
- 5. **Gestión de folios**: Control automático de CAFs, folios y anulaciones
1
+ # @devlas/dte-sii
2
+
3
+ **Librería de facturación y boletas electrónicas para el SII de Chile.**
4
+
5
+ Genera, timbra, firma y envía facturas electrónicas, boletas electrónicas, libros contables y automatiza el proceso de certificación ante el SII.
6
+
7
+ > Desarrollada por [Devlas SpA](https://devlas.cl) y publicada bajo licencia MIT para la comunidad de desarrolladores chilenos.
8
+
9
+ ---
10
+
11
+ ## Instalación
12
+
13
+ ```bash
14
+ npm install @devlas/dte-sii
15
+ ```
16
+
17
+ ## Uso básico
18
+
19
+ ```javascript
20
+ const {
21
+ Certificado, CAF, DTE, EnvioDTE, EnvioBOLETA, EnviadorSII,
22
+ ConsumoFolio, LibroCompraVenta, LibroGuia,
23
+ } = require('@devlas/dte-sii')
24
+
25
+ // Cargar certificado digital (.pfx)
26
+ const cert = new Certificado(fs.readFileSync('certificado.pfx'), 'contraseña')
27
+
28
+ // Cargar CAF (folios autorizados)
29
+ const caf = new CAF(fs.readFileSync('caf.xml', 'utf8'))
30
+
31
+ // Crear y timbrar una Factura Electrónica (tipo 33)
32
+ const dte = new DTE({ Encabezado: { ... }, Detalle: [ ... ] })
33
+ dte.generarXML().timbrar(caf).firmar(cert)
34
+
35
+ // Enviar al SII
36
+ const envio = new EnvioDTE({ certificado: cert })
37
+ envio.agregar(dte)
38
+ envio.setCaratula({ RutEmisor: '76354771-K', ... })
39
+ envio.generar()
40
+
41
+ const enviador = new EnviadorSII(cert, 'produccion') // o 'certificacion'
42
+ const resultado = await enviador.enviarDteSoap(envio)
43
+ console.log(resultado.trackId)
44
+ ```
45
+
46
+ ## Módulos
47
+
48
+ | Clase | Descripción |
49
+ |---|---|
50
+ | `Certificado` | Carga y maneja certificados digitales PFX/P12 |
51
+ | `CAF` | Código de Autorización de Folios del SII |
52
+ | `DTE` | Genera, timbra y firma documentos tributarios |
53
+ | `EnvioDTE` | Sobre XML para facturas, guías y notas |
54
+ | `EnvioBOLETA` | Sobre XML para boletas electrónicas |
55
+ | `EnviadorSII` | Comunicación SOAP/HTTP con el SII |
56
+ | `ConsumoFolio` | Genera RCOF (Resumen Consumo de Folios) |
57
+ | `LibroCompraVenta` | Libro electrónico de Compra/Venta |
58
+ | `LibroGuia` | Libro electrónico de Guías de Despacho |
59
+ | `FolioService` | Gestión y solicitud de folios (CAF) |
60
+ | `SiiSession` | Sesión autenticada con el portal SII |
61
+ | `SiiCertificacion` | Automatización del proceso de certificación |
62
+
63
+ ## Tipos de DTE soportados
64
+
65
+ | Tipo | Documento |
66
+ |---|---|
67
+ | 33 | Factura Electrónica |
68
+ | 34 | Factura No Afecta o Exenta |
69
+ | 39 | Boleta Electrónica Afecta |
70
+ | 41 | Boleta Electrónica Exenta |
71
+ | 43 | Liquidación Factura |
72
+ | 46 | Factura de Compra |
73
+ | 52 | Guía de Despacho |
74
+ | 56 | Nota de Débito |
75
+ | 61 | Nota de Crédito |
76
+
77
+ ## Ambientes
78
+
79
+ Soporta `'certificacion'` y `'produccion'`. Pasarlo al instanciar `EnviadorSII`.
80
+
81
+ ## Estados SII — Interpretación de respuestas
82
+
83
+ `EnviadorSII` interpreta automáticamente los códigos del SII en tres categorías:
84
+
85
+ ### QueryEstUp — Estado del sobre de envío
86
+
87
+ | Código | Descripción | `esExitoso` | `esIntermedio` | `esRechazado` |
88
+ |--------|-------------|:-----------:|:--------------:|:-------------:|
89
+ | `EPR` | Envío Procesado | ✅ | | |
90
+ | `RPR` | Procesado con Reparos | ✅ | | |
91
+ | `REC` / `SOK` / `FOK` / `CRT` / `PRD` / `PDR` | En proceso de validación | | ✅ | |
92
+ | `RSC` | Error en Schema XML | | | ✅ |
93
+ | `RFR` | Error en Firma Digital | | | ✅ |
94
+ | `RCT` | Error en Carátula | | | ✅ |
95
+
96
+ ### QueryEstDte — Estado del DTE individual
97
+
98
+ | Código | Descripción | Clasificación |
99
+ |--------|-------------|---------------|
100
+ | `DOK` | Datos coinciden | ✅ Exitoso |
101
+ | `DNK` | Datos no coinciden | ⏳ Intermedio |
102
+ | `FAU` | Folio no autorizado | ❌ Rechazado |
103
+ | `FNA` | Emisor no habilitado | ❌ Rechazado |
104
+ | `FAN` / `AND` / `ANC` | Anulado | ❌ Rechazado |
105
+ | `EMP` | Empresa sin autorización | ❌ Rechazado |
106
+
107
+ ### Códigos negativos (errores de consulta)
108
+
109
+ Los códigos `-1` a `-14` son **errores del servidor de consulta SII**, no implican rechazo del documento. Todos resultan en `esIntermedio = true` y se pueden reintentar.
110
+
111
+ > Ver `docs/README.md` en el repositorio para la tabla completa de estados con descripción detallada.
112
+
113
+ ---
114
+
115
+ ## Licencia
116
+
117
+ MIT — Copyright (c) 2026 [Devlas SpA](https://devlas.cl)
118
+
119
+ Inspirada conceptualmente en [LibreDTE de SASCO SpA](https://libredte.cl).
120
+ Implementa el protocolo XML público del SII de Chile.
121
+
122
+ ---
123
+
124
+ ## Estructura de Archivos
125
+
126
+ ```
127
+ dte-sii/
128
+ ├── index.js # Punto de entrada principal
129
+ ├── utils.js # Utilidades y helpers
130
+ ├── Certificado.js # Manejo de certificados PFX/P12
131
+ ├── CAF.js # Código de Autorización de Folios
132
+ ├── DTE.js # Documento Tributario Electrónico
133
+ ├── Signer.js # Firma XML-DSig
134
+ ├── Envio.js # EnvioBOLETA y EnvioDTE
135
+ ├── EnviadorSII.js # Comunicación con servicios SII
136
+ ├── BoletaService.js # Servicio simplificado para boletas
137
+ ├── LibroBase.js # Clase base para libros
138
+ ├── ConsumoFolio.js # RCOF (Resumen Consumo Folios)
139
+ ├── LibroCompraVenta.js # Libro Compra/Venta
140
+ ├── LibroGuia.js # Libro Guías de Despacho
141
+ ├── FolioService.js # Gestión integral de folios (solicitar, consultar, anular)
142
+ ├── FolioRegistry.js # Registro local de folios usados + helpers
143
+ └── SiiSession.js # Sesiones HTTP autenticadas con el SII
144
+ ```
145
+
146
+ ## Uso
147
+
148
+ ```javascript
149
+ const {
150
+ DTE, CAF, Certificado, EnvioDTE, EnviadorSII,
151
+ FolioRegistry, createCafFingerprint, resolveCafPath
152
+ } = require('@devlas/dte-sii');
153
+
154
+ // Instancia de registro de folios
155
+ const folioRegistry = new FolioRegistry();
156
+ ```
157
+
158
+ ## Clases Principales
159
+
160
+ | Clase | Responsabilidad |
161
+ |-------|-----------------|
162
+ | `Certificado` | Carga y manejo de certificados digitales (.pfx/.p12) |
163
+ | `CAF` | Parseado y uso de Códigos de Autorización de Folios |
164
+ | `DTE` | Generación, timbraje y firma de documentos |
165
+ | `Signer` | Firma XML-DSig compatible con SII |
166
+ | `EnvioBOLETA` | Sobre para boletas electrónicas |
167
+ | `EnvioDTE` | Sobre para facturas y otros DTEs |
168
+ | `EnviadorSII` | Autenticación y envío al SII (REST + SOAP) |
169
+ | `BoletaService` | Servicio simplificado para crear boletas |
170
+ | `ConsumoFolio` | RCOF - Resumen Consumo de Folios |
171
+ | `LibroCompraVenta` | Libro electrónico de compras/ventas |
172
+ | `LibroGuia` | Libro electrónico de guías de despacho |
173
+
174
+ ## Gestión de Folios
175
+
176
+ | Clase/Función | Responsabilidad |
177
+ |---------------|-----------------|
178
+ | `FolioService` | Servicio para solicitar, consultar y anular folios en el SII |
179
+ | `FolioRegistry` | Registro local de folios usados, reservados y enviados |
180
+ | `SiiSession` | Sesiones HTTP autenticadas con certificado digital |
181
+ | `createCafFingerprint(xml)` | Genera hash único de un CAF |
182
+ | `findLatestCaf(tipoDte, dir)` | Busca el CAF más reciente para un tipo de DTE |
183
+ | `resolveCafPath(opts)` | Resuelve ruta de CAF con validación de folios |
184
+
185
+ ### Ejemplo de uso de FolioRegistry
186
+
187
+ ```javascript
188
+ const {
189
+ FolioRegistry, CAF, createCafFingerprint, resolveCafPath
190
+ } = require('@devlas/dte-sii');
191
+
192
+ // Instancia de registro
193
+ const folioRegistry = new FolioRegistry();
194
+
195
+ // Resolver CAF automáticamente
196
+ const cafPath = resolveCafPath({
197
+ tipoDte: 33,
198
+ rutEmisor: '78206276-K',
199
+ requiredCount: 1,
200
+ ambiente: 'certificacion',
201
+ });
202
+
203
+ // Cargar CAF
204
+ const cafXml = fs.readFileSync(cafPath, 'utf8');
205
+ const caf = new CAF(cafXml);
206
+ const cafFingerprint = createCafFingerprint(cafXml);
207
+
208
+ // Reservar próximo folio
209
+ const folio = folioRegistry.reserveNextFolio({
210
+ rutEmisor: '78206276-K',
211
+ tipoDte: caf.getTipoDTE(),
212
+ folioDesde: caf.getFolioDesde(),
213
+ folioHasta: caf.getFolioHasta(),
214
+ ambiente: 'certificacion',
215
+ cafFingerprint,
216
+ });
217
+
218
+ // Marcar folio como enviado (después de envío exitoso)
219
+ folioRegistry.markFolioSent({
220
+ rutEmisor: '78206276-K',
221
+ tipoDte: caf.getTipoDTE(),
222
+ folio,
223
+ folioDesde: caf.getFolioDesde(),
224
+ folioHasta: caf.getFolioHasta(),
225
+ ambiente: 'certificacion',
226
+ cafFingerprint,
227
+ trackId: '0245283324',
228
+ });
229
+ ```
230
+
231
+ ### Ejemplo de uso de FolioService (avanzado)
232
+
233
+ ```javascript
234
+ const { FolioService, Certificado } = require('@devlas/dte-sii');
235
+
236
+ const certificado = new Certificado('certificado.pfx', 'password');
237
+ const folioService = new FolioService({
238
+ ambiente: 'certificacion',
239
+ rutEmisor: '78206276-K',
240
+ certificado: certificado,
241
+ });
242
+
243
+ // Consultar folios en el SII
244
+ const consulta = await folioService.consultarFolios({ tipoDte: 33 });
245
+ console.log('Último folio:', consulta.ultimoFolioFinal);
246
+
247
+ // Anular folios no usados
248
+ const resultado = await folioService.anularFolios({
249
+ tipoDte: 33,
250
+ folioDesde: 50,
251
+ folioHasta: 60,
252
+ motivo: 'Folios no utilizados',
253
+ });
254
+ ```
255
+
256
+ ## Utilidades
257
+
258
+ | Función | Descripción |
259
+ |---------|-------------|
260
+ | `sanitizeSiiText()` | Elimina caracteres problemáticos (apóstrofes, comillas) |
261
+ | `formatRut()` | Formatea RUT chileno |
262
+ | `calcularDV()` | Calcula dígito verificador |
263
+ | `formatBase64InXml()` | Formatea base64 con saltos de línea |
264
+
265
+ ## Filosofía
266
+
267
+ `@devlas/dte-sii` actúa como **facilitador transparente** entre el usuario y el SII:
268
+
269
+ 1. **Sanitización automática**: El usuario no se preocupa por caracteres especiales
270
+ 2. **Formatos flexibles**: Acepta datos simplificados o estructurados
271
+ 3. **Encoding interno**: Maneja UTF-8/ISO-8859-1 automáticamente
272
+ 4. **Firma automática**: Genera firmas XML-DSig compatibles con SII
273
+ 5. **Gestión de folios**: Control automático de CAFs, folios y anulaciones
@@ -1102,13 +1102,17 @@ class SiiCertificacion {
1102
1102
  for (const [key, { nombre, regex }] of Object.entries(SiiCertificacion.ESTADO_PATTERNS)) {
1103
1103
  const match = result.rawHtml?.match(regex);
1104
1104
  if (match) {
1105
+ const estadoTexto = match[1].trim();
1106
+ const upper = estadoTexto.toUpperCase();
1105
1107
  estados[key] = {
1106
1108
  nombre,
1107
- estado: match[1].trim(),
1108
- esConforme: match[1].trim().toUpperCase().includes('REVISADO CONFORME'),
1109
- enRevision: match[1].trim().toUpperCase().includes('EN REVISION'),
1110
- esRechazado: match[1].trim().toUpperCase().includes('RECHAZADO') ||
1111
- match[1].trim().toUpperCase().includes('ERRORES'),
1109
+ estado: estadoTexto,
1110
+ esConforme: upper.includes('REVISADO CONFORME'),
1111
+ enRevision: upper.includes('EN REVISION'),
1112
+ esRechazado: upper.includes('RECHAZADO') || upper.includes('ERRORES'),
1113
+ esReparos: upper.includes('REPAROS'),
1114
+ porRealizar: upper.includes('POR REALIZAR'),
1115
+ esAnulado: upper.includes('ANULADO'),
1112
1116
  };
1113
1117
  }
1114
1118
  }
@@ -1119,9 +1123,12 @@ class SiiCertificacion {
1119
1123
  estados.setSimulacion = {
1120
1124
  nombre: 'SET SIMULACION',
1121
1125
  estado: 'PENDIENTE CONFIRMAR',
1122
- esConforme: false,
1123
- enRevision: true,
1126
+ esConforme: false,
1127
+ enRevision: true,
1124
1128
  esRechazado: false,
1129
+ esReparos: false,
1130
+ porRealizar: false,
1131
+ esAnulado: false,
1125
1132
  pendienteConfirmar: true,
1126
1133
  };
1127
1134
  }