- 🎨 Rediseñado PDF primera página con diseño moderno y profesional (cuadros con encabezados separados y coloreados, bordes redondeados, separadores internos, mejor jerarquía visual)
- 🔒 Eliminado nombre de mecánico del PDF por privacidad (solo código de operario)
- 🐛 Corregido bug: PDF mostraba valores técnicos en lugar de etiquetas legibles (implementada función get_readable_answer() que convierte "option1" → "Bueno", "pass" → "Pasa", soporta boolean, single_choice y multiple_choice)
Frontend v1.0.75:
- ❌ Sin cambios
🎨 Diseño Visual Mejorado:
Portada más espaciada - Espaciado superior aumentado para mejor presentación
Cuadros con encabezados separados - Cada sección tiene un header coloreado profesional
Bordes redondeados - Esquinas suavizadas para un look más moderno
Separadores internos - Líneas delgadas entre filas para mejor legibilidad
Etiquetas diferenciadas - Labels en gris claro, valores en negrita oscura
🚗 Cuadro de Vehículo:
Header azul (#2563eb) con "🚗 INFORMACIÓN DEL VEHÍCULO"
Contenido blanco con bordes redondeados
Layout limpio: etiqueta arriba, valor abajo por campo
📄 Cuadro de Inspección:
Header verde (#16a34a) con "📄 INFORMACIÓN DE LA INSPECCIÓN"
Nombre de mecánico eliminado - Solo código de operario por privacidad
Campos: Nº Pedido, OR Nº, Cód. Operario, Fecha
📊 Resumen de Evaluación:
Título "📊 RESUMEN DE EVALUACIÓN" centrado
Grid de 4 métricas: Puntuación, Porcentaje, Estado, Ítems Críticos
Borde dinámico según resultado (verde/amarillo/rojo)
Estado textual: EXCELENTE/ACEPTABLE/DEFICIENTE
Separadores internos para cada métrica
Versión Backend actualizada a 1.0.75
Frontend v1.0.75
Nueva Funcionalidad:
✅ Auto-scroll automático cuando arrastras cerca de los bordes del modal
✅ Zona de activación: 100 pixeles desde arriba/abajo
✅ Scroll suave: 10 pixeles cada 16ms (~60fps)
✅ Limpieza automática: Detiene el scroll cuando sueltas o sales del área
Cómo Funciona:
Arrastras una pregunta cerca del borde superior → scroll automático hacia arriba
Arrastras cerca del borde inferior → scroll automático hacia abajo
Alejas del borde → scroll se detiene
Sueltas la pregunta → scroll se limpia
Cambios v1.0.74
Lógica Implementada:
Preguntas padre solo se pueden reordenar entre sí
Subpreguntas solo se pueden reordenar con otras subpreguntas del mismo padre
No se permite arrastrar una pregunta padre dentro de subpreguntas o viceversa
Validaciones:
✅ En handleDragOver: Cursor none si intentas arrastrar entre diferentes niveles
✅ En handleDrop: Mensajes de error claros si intentas mezclar niveles
✅ Filtrado inteligente: Solo reordena el grupo correcto de preguntas
- Implementado drag & drop nativo HTML5 para reordenar preguntas
- Agregados estados draggedQuestion y dragOverQuestion
- Handlers: handleDragStart, handleDragEnd, handleDragOver, handleDrop
- Indicador visual: línea azul en drop zone
- Icono de agarre (⋮⋮) con tooltip "Arrastra para reordenar"
- Opacidad 50% en elemento arrastrado
- Cursor 'move' indica elemento arrastrable
- Mantiene función moveQuestion para compatibilidad
- Reordenamiento automático al soltar
- Implementado drag & drop nativo HTML5 para reordenar preguntas
- Agregados estados draggedQuestion y dragOverQuestion
- Handlers: handleDragStart, handleDragEnd, handleDragOver, handleDrop
- Indicador visual: línea azul en drop zone
- Icono de agarre (⋮⋮) con tooltip "Arrastra para reordenar"
- Opacidad 50% en elemento arrastrado
- Cursor 'move' indica elemento arrastrable
- Mantiene función moveQuestion para compatibilidad
- Reordenamiento automático al soltar
- Implementado sistema de reordenamiento de preguntas
- Nuevo endpoint PATCH /api/checklists/{id}/questions/reorder
- Schema QuestionReorder para validar datos de reorden
- Actualización en lote de campo 'order' en preguntas
- Auditoría automática de cambios de orden
- Validación de permisos y existencia de checklist
Frontend v1.0.73:
- Agregada funcionalidad de reordenamiento de preguntas
- Botones ▲ ▼ para mover preguntas arriba/abajo
- Función moveQuestion() para gestionar reordenamiento
- Interfaz visual mejorada con separadores
- Tooltips descriptivos en botones de orden
- Recarga automática tras reordenar
- Implementado sistema de reordenamiento de preguntas
- Nuevo endpoint PATCH /api/checklists/{id}/questions/reorder
- Schema QuestionReorder para validar datos de reorden
- Actualización en lote de campo 'order' en preguntas
- Auditoría automática de cambios de orden
- Validación de permisos y existencia de checklist
Frontend v1.0.71:
- Agregada funcionalidad de reordenamiento de preguntas
- Botones ▲ ▼ para mover preguntas arriba/abajo
- Función moveQuestion() para gestionar reordenamiento
- Interfaz visual mejorada con separadores
- Tooltips descriptivos en botones de orden
- Recarga automática tras reordenar
- Implementado sistema de reordenamiento de preguntas
- Nuevo endpoint PATCH /api/checklists/{id}/questions/reorder
- Schema QuestionReorder para validar datos de reorden
- Actualización en lote de campo 'order' en preguntas
- Auditoría automática de cambios de orden
- Validación de permisos y existencia de checklist
Frontend v1.0.71:
- Agregada funcionalidad de reordenamiento de preguntas
- Botones ▲ ▼ para mover preguntas arriba/abajo
- Función moveQuestion() para gestionar reordenamiento
- Interfaz visual mejorada con separadores
- Tooltips descriptivos en botones de orden
- Recarga automática tras reordenar
- Implementado soft delete para preguntas
- Nuevas columnas: is_deleted (boolean), updated_at (timestamp)
- Migración SQL: add_soft_delete_to_questions.sql
- Endpoint DELETE marca preguntas como eliminadas en lugar de borrarlas
- GET /api/checklists/{id} filtra preguntas eliminadas (is_deleted=false)
- Validación de subpreguntas activas antes de eliminar
- Índices agregados para optimizar queries
- Mantiene integridad de respuestas históricas y PDFs generados
- Permite limpiar checklists sin afectar inspecciones completadas
- Implementado soft delete para preguntas
- Nuevas columnas: is_deleted (boolean), updated_at (timestamp)
- Migración SQL: add_soft_delete_to_questions.sql
- Endpoint DELETE marca preguntas como eliminadas en lugar de borrarlas
- GET /api/checklists/{id} filtra preguntas eliminadas (is_deleted=false)
- Validación de subpreguntas activas antes de eliminar
- Índices agregados para optimizar queries
- Mantiene integridad de respuestas históricas y PDFs generados
- Permite limpiar checklists sin afectar inspecciones completadas
- Agregado debug logging para investigar problema de carga de ai_prompt al editar preguntas
- Console.log muestra el objeto de pregunta completo y el campo ai_prompt específico
Backend v1.0.69:
- Sincronización de versión con frontend
- Schema ya incluye ai_prompt en QuestionBase y Question
- Agregada funcionalidad de edición de checklists
- Nuevo modal para editar nombre, descripción, modo IA y scoring
- Botón "✏️ Editar" en cada checklist (solo admins)
- Mejora en la gestión de checklists en el panel de administración
Backend v1.0.68:
- Actualización de versión para sincronizar con frontend
- Endpoint PUT /api/checklists/{id} ya soportaba la funcionalidad
Frontend (1.0.67):
- 🔧 Checklists e inspecciones se ordenan por ID descendente (más recientes primero)
- Mantiene posición de elementos después de editar/actualizar
- Ya no se mueven al final de la lista tras modificaciones
- Orden consistente en todas las recargas de datos
- Mejora UX al preservar contexto visual del usuario
Backend (1.0.67):
- Sin cambios (mantiene versión actual)
Frontend (1.0.66):
- 🔧 Filtro de usuarios ahora incluye admin además de mechanic/mecanico
- Los administradores aparecen en el filtro ya que también pueden hacer inspecciones
- Formato mejorado: "{full_name || username} ({role})"
- Mayor visibilidad de todas las inspecciones realizadas por cualquier usuario autorizado
Backend (1.0.67):
- Sin cambios (mantiene versión actual)
Frontend (1.0.65):
- 🔧 Filtro de mecánicos muestra nombre completo con rol
- Formato: "{full_name || username} ({role})"
- Ejemplo: "Ron 1 Admin (admin)" en lugar de solo "Ron 1"
- Fallback a username si full_name no está disponible
- Mayor claridad para identificar usuarios en reportes
Backend (1.0.67):
- Sin cambios (mantiene versión actual)
Frontend (1.0.64):
- 📄 Paginación en InspectionsTab (10 inspecciones/página)
- 📄 Paginación en ChecklistsTab (10 checklists/página)
- 📊 Paginación en ReportsTab (10 informes/página)
- Auto-reset a página 1 cuando cambian filtros de búsqueda
- Navegación inteligente con puntos suspensivos para rangos grandes
- Muestra primera, última y páginas cercanas (actual ± 1)
- Contador 'Mostrando X-Y de Z' en cada pestaña
- Botones Anterior/Siguiente con estados deshabilitados
- useEffect para sincronizar currentPage con filtros
Mejoras de UX:
- Navegación directa por número de página
- Diseño consistente en las 3 pestañas
- Controles responsive con hover states
- Indicadores visuales claros de página actual
Backend (1.0.67):
- Sin cambios (mantiene versión actual)
Documentación:
- 📝 Agregada sección 'Control de Versiones' en README.md
- Instrucciones detalladas para commits con versiones
- Formato estándar para mensajes de commit
- Tipos de commit (feat, fix, refactor, etc.)
- Reglas de Semantic Versioning
- Ubicación de archivos de versión"
Backend (1.0.67):
- 🐛 Fix: ai_analysis cambió de dict a list en schemas
- Soporta múltiples análisis de IA (una por cada imagen)
- AnswerCreate.ai_analysis: Optional[list] = None
- Answer.ai_analysis: Optional[list] = None
- Compatible con campo JSON en base de datos
Frontend (1.0.61):
- Sin cambios (ya enviaba ai_analysis como array)
- Formato: [{ success, analysis, raw_response, model, provider, imageIndex, fileName }]
Causa del error 422:
- Frontend enviaba: ai_analysis: [{ imageIndex: 1, ... }]
- Backend esperaba: ai_analysis: { ... } (dict)
- Ahora backend acepta: ai_analysis: [{ ... }, { ... }] (list)
Beneficio:
- Ahora se almacenan TODOS los análisis de múltiples imágenes
- Cada elemento del array tiene imageIndex para identificación
- Mantiene trazabilidad completa del análisis IA
Backend (1.0.66):
- 🐛 Fix: answer_value ahora es Optional en AnswerBase schema
- Permite guardar respuestas con solo análisis IA y fotos
- Permite guardar observaciones sin answer_value
- Ya no rechaza con 422 cuando answer_value es null/vacío
Frontend (1.0.60):
- 🐛 Fix: saveAnswer ahora permite guardar si hay:
* Valor de respuesta, O
* Observaciones de IA, O
* Fotos cargadas
- Mejorada lógica de determinación de status
- Solo calcula status si hay answer.value
- Permite guardar análisis IA antes de seleccionar respuesta
Flujo mejorado:
1. Usuario sube fotos
2. Click "Analizar con IA" → genera observaciones
3. Puede avanzar sin seleccionar respuesta (guardará solo observaciones)
4. O puede seleccionar respuesta después → actualiza el record
Causa del error 422:
- answer_value era required en schema
- Al analizar fotos sin seleccionar respuesta se enviaba answer_value=""
- Backend rechazaba con 422 Unprocessable Entity
- Ahora answer_value es opcional y acepta null/vacío
Backend (1.0.65):
- Fix: Todas las referencias client_name cambiadas a order_number
- Actualizado webhook n8n: "cliente" → "pedido"
- Actualizado contexto IA: "Cliente" → "Nº Pedido"
- PDF ahora muestra "Nº de Pedido" en lugar de "Cliente"
Frontend (1.0.59):
- 📸 NUEVO: Vista previa de fotos cargadas (grid 3 columnas con thumbnails)
- 📸 NUEVO: Botón "✕" para eliminar fotos individuales
- 📸 NUEVO: Botón manual "🤖 Analizar con IA" (no auto-análisis)
- 📸 MEJORA: Permite cargar múltiples fotos respetando max_photos
- 📸 MEJORA: Input file solo required si no hay fotos cargadas
- 📸 MEJORA: Muestra contador "X foto(s) cargada(s)"
- 🔧 Fix: Ya no analiza automáticamente al subir (espera click en botón)
- 🔧 Fix: Permite re-cargar fotos eliminando las anteriores
- 🔧 Fix: Previene exceder max_photos mostrando alerta
UX Improvements:
- Usuario sube 1-3 fotos y las ve en preview
- Puede eliminar individualmente con hover + click en ✕
- Click en "Analizar con IA" procesa todas las fotos juntas
- Análisis secuencial con summary multi-imagen
Nota: No requiere migración (ya ejecutada en v1.0.64)
Backend (1.0.64):
- Renombrado campo client_name a order_number en modelo Inspection
- Actualizado InspectionBase schema con nuevo campo order_number
- Comentario descriptivo: "Número de pedido asociado a la inspección"
Frontend (1.0.58):
- Renombrado client_name a order_number en toda la aplicación
- Actualizado label: "Nombre del Cliente" → "Nº de Pedido"
- Actualizado placeholder: "Juan Pérez" → "PED-12345"
- Actualizado título sección: "Información del Cliente" → "Información del Pedido"
- Actualizado filtro de búsqueda para incluir número de pedido
- Actualizado texto de búsqueda: "cliente" → "Nº pedido"
Database:
- Script de migración: rename_client_name_to_order_number.sql
- Comando: ALTER TABLE inspections RENAME COLUMN client_name TO order_number
Nota: Ejecutar migración SQL antes de usar esta versión
Backend (1.0.63):
- Agregado modelo QuestionAuditLog para historial de cambios
- Implementado registro de auditoría en create/update/delete de preguntas
- Nuevos endpoints: GET /api/questions/{id}/audit y GET /api/checklists/{id}/questions/audit
- Tracking a nivel de campo con valores antes/después
- Script de migración: add_question_audit_log.sql
Frontend (1.0.57):
- Agregado botón "Editar" en preguntas de checklists
- Implementado formulario de edición con datos pre-cargados
- Agregado botón "Historial" para ver cambios de preguntas
- Modal de auditoría con timeline de cambios y comparación lado a lado
- Fix: Error "firstResult is not defined" en análisis multi-imagen IA
- UI con códigos de color para acciones (crear/modificar/eliminar)