Saltar a contenido

ADR-026 — Escaneo de DNI con decodificador PDF417 propio (independiente del navegador)

  • Status: accepted (2026-08-23; enmienda a la estrategia de AC-22, reabierto por prueba física en Samsung S24 / Chrome)
  • Context: El escaneo del DNI (AC-22) se apoyaba en BarcodeDetector (Shape Detection API de Chromium). Prueba en dispositivo real (Samsung S24, Chrome de Android — el navegador más común del público objetivo): el botón "Escanear DNI" NO aparece porque getSupportedFormats() no incluye pdf417. Chrome de Android soporta QR pero no PDF417 sin el módulo de códigos de Google Play Services; Samsung Internet y Firefox no traen BarcodeDetector. Conclusión: la estrategia nativa deja el escaneo indisponible para la mayoría del público de salón. La carga manual (fallback de AC-22) funciona, pero la feature de conveniencia prácticamente no existe.
  • Alternatives:
  • Aceptar carga manual como principal (statu quo): cero costo, pero el "escaneá tu DNI" casi nunca aparece.
  • Decodificador PDF417 en JS/WASM (elegido): funciona en TODOS los navegadores con cámara, independiente de BarcodeDetector. Se carga lazy (dynamic import() al tocar "Escanear"), así NO afecta el presupuesto de 3G de la primera pantalla (AC-24). Como el decodificado es NUESTRO, controlamos el charset → la Ñ/acentos se resuelven de raíz (cierra QA-L5, ya no es especulación).
  • Decision:
  • Integrar un decodificador PDF417 JS/WASM (evaluar zxing-wasm vs @zxing/library; elegir el que decodifique de forma confiable el PDF417 del DNI argentino y permita manejar el encoding Latin-1). Carga diferida en lib/dniScanner.ts (ya es un módulo dinámico).
  • BarcodeDetector queda como camino rápido OPCIONAL solo donde soporte pdf417; el decodificador propio es el motor por defecto. El botón "Escanear DNI" se muestra en cualquier navegador con cámara (getUserMedia), no solo donde hay BarcodeDetector.
  • Charset: el payload del DNI argentino se decodifica respetando su codificación real (Latin-1/ISO-8859-1) para que apellidos con Ñ/acentos lleguen correctos al padrón.
  • Presupuesto: el decodificador NO entra al bundle inicial (lazy). El presupuesto de 60 KB gzip de la primera pantalla se mantiene (AC-24).
  • Consequences: El escaneo funciona en todo el parque de teléfonos, no solo en un subconjunto de Chrome. Dependencia nueva de la landing, pero fuera del camino crítico (lazy). ADR-015 ("landing pelada") se enmienda: la restricción de peso aplica al bundle INICIAL; un módulo de escaneo diferido está permitido porque no lo penaliza.

Verification

  • [ ] AC-48 — El botón "Escanear DNI" aparece en cualquier navegador con cámara (no depende de BarcodeDetector); el decodificador PDF417 propio lee un DNI de prueba y autocompleta.
  • [ ] AC-49 — Charset: un payload PDF417 con apellido "PEÑA"/"MARÍA JOSÉ" decodifica con la Ñ y los acentos correctos (unit test sobre el payload conocido — cierra QA-L5).
  • [ ] Bundle inicial de la landing sigue ≤ 60 KB gzip (el decodificador es lazy, AC-24).