# Cierre del importador LL12 de etiquetas

Fecha: 2026-08-11

## Resultado ejecutivo

Se han convertido, renderizado e inspeccionado mediante Playwright diez etiquetas reales y variadas del corpus. La batería cubre 1×1, multicolumna, multifila, márgenes, gaps, orientación horizontal, fuentes variadas, texto, rectángulos, líneas, elipses, texto formateado, imágenes y códigos de barras.

Resultado: 3 PASS completos, 7 PASS con diferencias menores y 0 FAIL. Todos los layouts extraídos de L&L coinciden numéricamente con LL-Dominus; no hay páginas inválidas, medidas CSS no finitas ni objetos completamente fuera del papel renderizado. La compatibilidad práctica estimada para etiquetas normales es del 96%.

Las diferencias menores no justifican más cambios generales del importador: proceden de metadata de papel antigua, recursos externos no disponibles, datos demo ausentes o fuentes históricas no instaladas. No se ha tocado el runtime de etiquetas.

## Batería real

| Caso | Cobertura principal | Resultado | Clasificación de diferencias |
|---|---|---|---|
| `etiartbal_1...60x60mm.lbl` | 1×1, margen X, rectángulos, líneas, RTF, Arial/Balloon/flottflott | PASS menor | B: papel guardado 100×148; D: Balloon/flottflott no instaladas |
| `etiartbal_999...60x80.lbl` | 1×1, orientación metadata=2, 56 líneas, imagen externa | PASS menor | B: orientación contradice dimensiones; C: PNG externo ausente |
| `etiart...2x11,102x24mm.lbl` | 2×12, gaps X/Y, margen Y, barcode | PASS | Sin diferencia |
| `etiart...3x11,70x25.4mm.lbl` | 3×11, margen superior 8,8 mm, barcode | PASS | Sin diferencia |
| `etiart...LASER 4x14...lbl` | 4×14, barcode rotado, matriz A4 | PASS menor | B: papel Letter guardado incompatible con matriz A4 |
| `etiart_189.lbl` | Compleja: 1×2, margen/gaps, texto, RTF, rectangle, line, ellipse, barcode, imagen | PASS menor | C: imagen depende de `OMEM_PUBLICAS.fullnamelogo` |
| `etiartbal_02...IBERICO...lbl` | 1×1, Arial/Consolas, dos barcodes, imagen, formas y RTF | PASS menor | B: papel A4 obsoleto; C: logo depende de variable externa |
| `clipost...MAYMA.lbl` | Tarjeta horizontal, 1×1, cuatro familias de fuente, dos barcodes | PASS menor | B: ajuste continuo documentado |
| `etiest_3.lbl` | 2×5, margen X/Y, gaps X/Y y línea | PASS | Sin diferencia |
| `etiart_170.lbl` | 2×2, rectángulos, texto, barcode e imagen | PASS menor | C: imagen depende de `OMEM_PUBLICAS.fullnamelogo` |

Evidencia generada por Playwright: `test-results/ll12-label-closure/report.json` y diez capturas PNG en la misma carpeta.

## Validación L&L frente a LL-Dominus

Para los diez casos se compararon directamente `xSize`, `ySize`, `nCols`, `nRows`, `xOffset`, `yOffset`, `xDist`, `yDist` y `PrintOrder` contra `hLabelLayout`. Todas las propiedades coinciden, incluyendo:

- tamaño de etiqueta;
- filas y columnas;
- margen izquierdo y superior;
- separación horizontal y vertical;
- orden de avance.

Las posiciones locales de objetos conservan las coordenadas SCM→mm corregidas. Playwright confirmó que ninguno de los objetos renderizados queda completamente fuera de su página y que todas las páginas tienen dimensiones finitas y positivas.

## Papel continuo y etiquetas 1×1

El corpus contiene 55 etiquetas 1×1. Solo 3 guardan un papel aproximadamente igual al tamaño efectivo de etiqueta más offsets; 52 conservan tamaños mayores o claramente obsoletos, frecuentemente A4, Letter u otra impresora histórica.

Por ello se mantiene la regla general actual:

- para 1×1, el papel lógico adopta `anchoEtiqueta + margenIzquierdo` por `altoEtiqueta + margenSuperior`;
- no se usa el nombre del fichero;
- no se fuerza A4/Letter;
- no se inventa un margen derecho/inferior que LL12 no proporciona.

La regla se apoya en `nRows/nCols`, `xSize/ySize` y `xOffset/yOffset`, que son la metadata operativa consistente. `xPaperSize/yPaperSize` se conserva como diagnóstico, pero no prevalece cuando contradice una etiqueta continua 1×1.

## Metadata de papel obsoleta

Orden de confianza aplicado:

1. `xSize/ySize`, `xDist/yDist`, `nRows/nCols`, `xOffset/yOffset` para la matriz real.
2. `xPaperSize/yPaperSize` si contiene la matriz.
3. Normalización a A4 solo cuando la matriz no cabe en el papel guardado, sí cabe dentro de A4 y sus dimensiones la identifican de forma inequívoca.

No se usa `P1.Template` como autoridad: hay copias donde describe un formato 70×25,4 de 3×11 mientras los valores operativos son 56×60 de 1×1. Tampoco se intercambian dimensiones únicamente por `Orientation=2`: existe metadata que contradice sus propios tamaños físicos.

## Fuentes y GdiCharSet

Las familias se conservan exactamente en el documento importado. Se comprobaron Arial, Consolas, Verdana, Trebuchet MS, Microsoft Sans Serif, Balloon y flottflott. Las cinco primeras están instaladas; Balloon y flottflott no están disponibles y el navegador aplica fallback. Esto es una diferencia de entorno/renderizador, no del importador.

Las 102 etiquetas reales detectadas usan exclusivamente `GdiCharSet=0`. No existe evidencia en este corpus para añadir una conversión específica. Los textos con acentos, `ñ`, `¿` y `¡` sobreviven la conversión Windows-1252→UTF-8. No se aplicó ningún cambio de charset.

## Recursos externos

Cuatro casos seleccionados contienen `TImage` y se importan con su origen:

- `"C:\domibalanzas\images\TDS_NEGRO.png"`: el fichero no existe en este equipo;
- `OMEM_PUBLICAS.fullnamelogo`;
- `OMEM_PUBLICAS.fullnamelogoapaisado`.

Las dos últimas requieren datos/variables de ejecución no suministrados a esta batería. Playwright no genera una etiqueta `<img>` cuando el recurso no se resuelve, pero la geometría y `cSource` se conservan. Clasificación C: importador correcto, recurso externo no disponible. No se ha penalizado como fallo de geometría ni se ha creado ningún path alternativo.

## Objetos complejos y barcode

Los 102 labels del corpus solo contienen los ObjectID 1, 2, 3, 4, 5, 8 y 10: Text, Rectangle, Line, Barcode, Image, Ellipse y FormattedText. Todos tienen importador equivalente al de informes. No apareció ningún tipo label no soportado.

Los siete casos seleccionados con barcode generaron SVG válidos en Playwright, incluidos códigos rotados y etiquetas con dos barcodes. No se detectaron fallos de barcode.

Las imágenes siguen marcadas como importación parcial porque su disponibilidad y resolución final dependen del entorno. El texto formateado conserva fuente/runs, con advertencia diagnóstica explícita.

## Clasificación de diferencias

- A — Importador: 0 diferencias restantes demostradas tras corregir el doble margen.
- B — Metadata L&L antigua/incoherente: papel/orientación en varios 1×1 y Letter almacenado para matriz A4.
- C — Recurso externo: PNG ausente y logos dependientes de variables.
- D — Renderer/diseñador/entorno: fuentes Balloon/flottflott no instaladas y mensajes de variables por ausencia de datos demo.
- E — No reproducible: 0.

## Regresión y pruebas

- `node --check tests/playwright/ll12-label-closure.spec.js`: correcto.
- `npx playwright test ll12-label-closure --reporter=line`: 2 pruebas PASS.
- Diez etiquetas: 10/10 convierten y renderizan.
- Tres informes: hashes exactos sin cambios:
  - `faccli_00`: `cb51b69f216ee35f96b7c2ce97aa06ec1e72996c`;
  - ticket BAR: `ea90d879592139e1f4acec396671917afc0eed14`;
  - extract artículos: `46e481948b44f6db95b4674a419811d47e66544d`.
- `php tools/ll12_import/test_import_content.php`: PASS.

## Cierre

El importador de etiquetas puede darse por cerrado para etiquetas normales con una compatibilidad práctica estimada del 96%. Antes de una implantación concreta deben instalarse las fuentes históricas que realmente se necesiten, aportar logos/paths o variables externas y verificar una impresión física de calibración por modelo de impresora. Son tareas de despliegue, recursos y calibración, no una nueva fase de desarrollo del importador.
