SaaS legal
En producción

Gonzalez Law

Plataforma SaaS para la gestión integral de reportes legales de accidentes, con extracción de datos por OCR e IA, generación de PDF profesional y firma electrónica.

2 vistas del producto — clic para ampliar
Rol
Full Stack Developer
Cliente
Gonzalez Law (privado)
Periodo
2025
Estado
En producción

Contexto

Gonzalez & Associates P.C. Law Office es un despacho legal que tramita reportes de accidentes y lesiones, donde cada caso reúne datos del cliente, de la parte responsable, vehículos, aseguradoras, proveedores médicos, evidencia fotográfica y documentación de identidad. El proceso manual de capturar toda esa información a partir de documentos dispares (PDFs escaneados, fotos de identificaciones, partes de seguros) era lento y propenso a errores.

Gonzalez Law es la plataforma SaaS privada que construí para digitalizar ese flujo de principio a fin: desde la captura asistida del reporte hasta la generación del paquete del caso y la firma electrónica del cliente. Al ser un producto confidencial no tiene URL pública, y algunas capturas se muestran difuminadas para proteger datos reales de expedientes.

El reto

El despacho necesitaba reducir el tiempo de captura sin sacrificar precisión jurídica. Un reporte mezcla múltiples entidades (víctima, responsable, sus respectivos vehículos, seguros y médicos) y atribuir mal un dato compromete el caso. A esto se sumaban requisitos de almacenamiento seguro de evidencia, firma del cliente desde cualquier dispositivo, trabajo en tiempo real entre representantes y coordinadores, y un dashboard heredado en Bootstrap que había que conservar mientras se modernizaba la interfaz.

Arquitectura

El producto se reparte en tres repositorios:

  • gonzalez-law-backend — API REST en Node.js + Express 4 (CommonJS) sobre MongoDB con Mongoose. Usa Redis para sesiones y colas, y Socket.IO para chat y tableros en tiempo real. La evidencia y documentos viven en Cloudflare R2, con respaldo automático en Backblaze B2.
  • gonzalez-law-frontend — Astro en modo SSR con islas de React 19 y TypeScript. Conviven Tailwind (con prefijo tw-) y un template legacy en Bootstrap; los componentes nuevos se hacen en React + Tailwind sin romper lo existente.
  • officecontrol-pro — un producto adyacente más reciente (React 19 + tRPC + Vite): un tablero corporativo de KPIs, asistencia, requisiciones y finanzas para la operación de la oficina.

La autenticación es dual: login por contraseña y un PIN de 6 dígitos con hash bcrypt para re-autenticación rápida, ambos resolviendo a la misma cookie JWT httpOnly. El PIN tiene rate-limit (5 intentos → bloqueo de 15 minutos) y su hash nunca se serializa: al cliente solo viaja un booleano has_pin.

Funcionalidades clave

  • Captura del reporte por secciones (cliente, responsable, vehículos, seguros, lesiones, evidencia) con asistencia de IA.
  • Extracción automática de datos desde documentos mediante OCR e IA multimodal.
  • Clasificación de identificaciones (INE mexicana, licencia/ID de EE. UU., pasaporte) con visión por IA.
  • Generación del PDF del caso y de un paquete ZIP con reporte, resumen y evidencias organizadas.
  • Firma electrónica en lienzo y mediante enlaces públicos con token de expiración.
  • Gestión de litigios, demandas, préstamos, registros de cobro y proveedores médicos.
  • Notificaciones y chat en tiempo real, alertas de prescripción (statute of limitations) y recordatorios.

Decisiones técnicas y retos

La pieza central es el pipeline de extracción de datos. La función extractText decide cómo leer cada documento: los PDFs con capa de texto se procesan con pdf-parse; las imágenes pasan por Tesseract.js con modelos eng+spa (con fallback a eng); y los PDFs escaneados sin texto se transcriben con visión por IA. Sobre ese texto opera una cascada de LLMs —DeepSeek como primario, Gemini y OpenAI como respaldos— diseñada para tolerar caídas o falta de configuración de cualquier proveedor. El prompt está cuidadosamente construido para resolver el problema de atribución: identifica a quién pertenece cada dato (cliente vs. responsable, vehículo propio vs. vehículo de la parte responsable) e ignora deliberadamente abogados, ajustadores y testigos.

Para imágenes embebidas en PDFs (croquis de la escena, firmas) integré pdfimages/pdftoppm de poppler-utils vía execFile, con deduplicado por dimensiones y bytes para descartar logos repetidos y heurísticas que eligen el candidato a firma o el diagrama más grande. La clasificación de identificaciones usa una cascada de visión (OpenAI gpt-4o-mini → Gemini 2.5 Flash) tolerante a fotos torcidas, borrosas o con reflejos.

En la generación de PDF tomé una decisión de arquitectura deliberada: en lugar de duplicar el sistema de diseño en el servidor, el PDF del caso se renderiza en el navegador con @react-pdf/renderer (reutilizando el mismo diseño del frontend) y se sube al backend, que solo lo empaqueta con la evidencia descargada de R2. El backend responde por SSE el progreso del empaquetado y cachea el ZIP en Redis bajo un token derivado del folio y una firma de cambios (fechas y bytes de reporte y adjuntos): si el caso no cambió, el paquete se sirve al instante.

La firma electrónica se captura con react-canvas-draw en el formulario del cliente y se sube como adjunto a R2, con reglas de acceso por nivel de usuario (un reporter solo firma reportes en estado draft). Para firmar sin cuenta, el sistema emite share tokens con expiración configurable que habilitan un enlace público de firma y subida de documentos.

Resultado

Gonzalez Law está en producción y en uso activo por el despacho, con un ciclo de releases versionado por SemVer y desarrollo continuo desde inicios de 2025. El sistema convirtió un proceso de captura manual en un flujo asistido por OCR e IA, con generación de documentación profesional, firma electrónica multiplataforma y colaboración en tiempo real. La separación en tres repositorios permite evolucionar la API, el dashboard del despacho y el tablero corporativo de forma independiente, manteniendo una base técnica moderna sobre un legacy que se moderniza de manera incremental.