@devlas/dte-sii 2.13.1 → 2.13.2

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
@@ -270,8 +270,12 @@ class DTE {
270
270
  // va firmado, el SII valida la firma sobre lo que él leyó → "TED - Firma invalida".
271
271
  // Se aplica ANTES de firmar, así la firma cubre exactamente los bytes del barcode.
272
272
  // El DTE conserva el texto real con acentos; esto solo afecta al timbre.
273
- const rznRecepRaw = sanitizeTedText((enc.Receptor.RznSocRecep || '').substring(0, 40));
274
- const it1Raw = sanitizeTedText((primerItem.NmbItem || 'Producto').substring(0, 40));
273
+ // ⚠️ Truncar DESPUÉS de plegar, no antes: el plegado puede ALARGAR el texto, porque
274
+ // algunos caracteres se expanden de 1 a 2 (ß→ss, Æ→AE, Þ→TH, fi→fi). Si el corte de 40
275
+ // caía justo en uno de esos, el resultado quedaba en 41-42 caracteres y desbordaba el
276
+ // límite de <RSR> e <IT1> del SII, con riesgo de rechazo del timbre.
277
+ const rznRecepRaw = sanitizeTedText(enc.Receptor.RznSocRecep || '').substring(0, 40);
278
+ const it1Raw = sanitizeTedText(primerItem.NmbItem || 'Producto').substring(0, 40);
275
279
  const rznRecepXml = this._escapeXmlText(rznRecepRaw);
276
280
  const it1Xml = this._escapeXmlText(it1Raw);
277
281
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devlas/dte-sii",
3
- "version": "2.13.1",
3
+ "version": "2.13.2",
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",
package/utils/sanitize.js CHANGED
@@ -72,19 +72,27 @@ function sanitizeSiiText(text) {
72
72
  * @returns {string} - Texto sin caracteres fuera de ASCII
73
73
  */
74
74
  function sanitizeTedText(text) {
75
- return sanitizeSiiText(text)
75
+ // ⚠️ El plegado va ANTES de `sanitizeSiiText`, no después.
76
+ //
77
+ // `sanitizeSiiText` descarta lo que no reconoce, así que si corre primero se lleva las
78
+ // ligaduras (fi, ff, Œ…) y el mapeo de más abajo nunca llega a verlas: quedaba como código
79
+ // muerto y esos caracteres desaparecían del timbre en vez de expandirse.
80
+ return String(text ?? '')
76
81
  // Descompone en letra base + diacrítico y descarta el diacrítico.
77
82
  .normalize('NFD')
78
83
  .replace(/[\u0300-\u036f]/g, '')
79
84
  // Lo que NFD no separa (ligaduras y símbolos con forma propia).
80
- .replace(/[fffifl]/g, m => ({ 'ff': 'ff', 'fi': 'fi', 'fl': 'fl' })[m])
85
+ .replace(/[fffiflffifflŒœ]/g, m => ({
86
+ 'ff': 'ff', 'fi': 'fi', 'fl': 'fl', 'ffi': 'ffi', 'ffl': 'ffl', 'Œ': 'OE', 'œ': 'oe',
87
+ })[m])
81
88
  .replace(/Æ/g, 'AE').replace(/æ/g, 'ae')
82
89
  .replace(/Ø/g, 'O').replace(/ø/g, 'o')
83
90
  .replace(/Ð/g, 'D').replace(/ð/g, 'd')
84
91
  .replace(/Þ/g, 'TH').replace(/þ/g, 'th')
85
92
  .replace(/ß/g, 'ss')
86
- // Red de seguridad: cualquier resto no-ASCII se elimina antes del barcode.
87
- .replace(/[^\x20-\x7E]/g, '');
93
+ // Recién ahora las reglas del SII, sobre texto ya plegado a ASCII.
94
+ .replace(/[^\x20-\x7E]/g, '')
95
+ .trim();
88
96
  }
89
97
 
90
98
  /**