Backend (v1.0.84):
- Agregado campo 'context_match' en respuesta JSON de análisis IA
- IA evalúa si imagen corresponde al contexto de la pregunta
- Tres niveles de validación: prompt personalizado, pregunta específica, análisis general
- Detección automática de imágenes fuera de contexto con recomendaciones específicas
Frontend (v1.0.84):
- Sistema de alertas cuando IA detecta imágenes que no corresponden
- Popup de advertencia muestra qué imágenes no coinciden y por qué
- Opción para eliminar automáticamente fotos incorrectas y cargar nuevas
- Validación con frases clave: "no corresponde", "no coincide", "no relacionad"
- Previene que mecánicos carguen imágenes irrelevantes a las preguntas
Evita errores en inspecciones al garantizar que cada foto corresponda a su pregunta específica
🎭 Frontend v1.0.81
1. Botón renombrado:
❌ Antes: "🤖 Analizar Pregunta"
✅ Ahora: "📁 Cargar Documentos"
Estado procesando: "Procesando..." (sin mencionar IA)
2. Análisis IA separado de observaciones:
El análisis NO se escribe en el campo de observaciones
Se guarda en aiAnalysis (campo separado)
Mecánico escribe observaciones manualmente
Se agrega flag documentsLoaded: true al procesar
3. Popup de confirmación:
Después de cargar documentos: "✅ Documentos cargados correctamente"
NO muestra el análisis al mecánico
4. Validación obligatoria:
Si hay fotos adjuntas y el checklist tiene IA activada
DEBE presionar "Cargar Documentos" antes de continuar
Mensaje: "⚠️ Debes presionar 'Cargar Documentos' antes de continuar"
5. Referencias a IA eliminadas:
❌ Removido: "Analizando X imagen(es) con IA..."
❌ Removido: "✓ Analizada"
❌ Removido: "guardada automáticamente"
✅ Ahora: "Procesando X documento(s)..."
✅ Ahora: "Respuesta guardada"
6. Análisis IA solo visible para admin:
En el modal de detalle de inspección
Sección morada "🤖 Análisis de IA"
Muestra: estado, observaciones, recomendación, confianza
Solo visible si user.role === 'admin'
🔧 Backend v1.0.83
Sin cambios (el campo ai_analysis ya existía en JSON)
El botón "📄 Exportar PDF" ahora solo es visible para admin y asesor
Los mecánicos (role === 'mechanic') pueden ver el modal de inspección pero NO pueden exportar el PDF
Backend v1.0.82 (sin cambios adicionales)
Resumen de permisos:
✅ Admin: Ver inspección + Exportar PDF + Ver historial + Inactivar
✅ Asesor: Ver inspección + Exportar PDF
❌ Mecánico: Solo ver inspección + Continuar incompletas
- Generación de PDF ahora muestra dos logos en el encabezado
- Logo izquierda: logo de la empresa (AIConfiguration)
- Logo derecha: logo del checklist específico (o empresa como fallback)
- Nueva función helper load_logo() para reutilización
- Layout horizontal con tabla de 3 columnas para separación visual
- Frontend: sin cambios (v1.0.79)
- Generación de PDF ahora muestra dos logos en el encabezado
- Logo izquierda: logo de la empresa (AIConfiguration)
- Logo derecha: logo del checklist específico (o empresa como fallback)
- Nueva función helper load_logo() para reutilización
- Layout horizontal con tabla de 3 columnas para separación visual
- Frontend: sin cambios (v1.0.79)
He implementado exitosamente la funcionalidad solicitada. Aquí está el resumen:
🔄 Cambios en el Frontend (App.jsx)
Renombrado de "Borrador" a "Incompleta":
Actualizado el filtro de estado: draft → incomplete
Cambiado el texto del selector: "Borradores" → "Incompletas"
Actualizado el badge de estado en la lista de inspecciones
Botón "Continuar Inspección":
Agregado botón verde "▶️ Continuar Inspección" en InspectionDetailModal
Solo aparece cuando inspection.status !== 'completed'
Cierra el modal de detalle y abre el modal de inspección para continuar
Soporte para continuar inspecciones:
Modificado InspectionModal para recibir existingInspection
Carga automática de datos del vehículo existentes
Carga de respuestas previas desde el backend
Si hay respuestas existentes, salta directamente al paso 2 (Preguntas)
No crea una nueva inspección si ya existe, solo continúa la actual
Actualización de versión:
package.json: v1.0.78 → v1.0.79
🔧 Cambios en el Backend (models.py)
Renombrado del estado por defecto:
status = Column(String(20), default="draft") → default="incomplete"
Comentario actualizado: # draft, completed, inactive → # incomplete, completed, inactive
✅ Etiquetas legibles en lugar de valores técnicos
✅ Más fácil e intuitivo para administradores
✅ Reutiliza el mismo componente configurable
Frontend actualizado a v1.0.77
📸 Logo del PDF:
Usa exclusivamente el logo de "⚙️ Configuración"
No usa el logo del checklist (ese es para otra funcionalidad)
Más simple y consistente
Backend v1.0.79
🔍 Mejor debugging:
Logs detallados en consola para ver qué está pasando
Muestra la URL del logo que intenta cargar
Indica el código HTTP de respuesta
Stack trace completo si hay error
📐 Ajuste automático de tamaño:
Antes: Forzaba 40mm x 40mm (distorsionaba la imagen)
Ahora: Mantiene proporciones (aspect ratio)
Ancho máximo: 50mm
Alto máximo: 40mm
Se ajusta automáticamente al que limite primero
✅ Validaciones adicionales:
Verifica que el checklist exista
Verifica que tenga logo_url configurado
Mensajes informativos en cada caso
Backend v1.0.79
✅ Cambios aplicados:
📏 Nuevos tamaños de letra:
Preguntas: 11pt en negrita (más grandes y destacadas)
Respuestas: 10pt (tamaño medio legible)
Comentarios: 9pt con indentación (diferenciados visualmente)
🤖 Formato mejorado de comentarios IA:
✅ Removido prefijo "Análisis IA (98% confianza): "
✅ Salto de línea doble antes de "Recomendaciones:"
✅ "Recomendaciones:" ahora en negrita
✅ Indentación de 10mm en comentarios para mejor jerarquía visual
🖼️ Logo en la portada del PDF:
Se carga el logo desde checklist.logo_url (configurado en la administración)
Ubicación: Arriba del título, centrado
Tamaño: 40mm x 40mm (tamaño estándar para logos corporativos)
Manejo de errores: Si el logo no carga, continúa generando el PDF sin bloquearse
Si no hay logo configurado, simplemente no se muestra (no rompe el PDF)
📄 Estructura de la portada:
Logo del checklist (si existe)
Título "📋 INFORME DE INSPECCIÓN VEHICULAR"
Número de inspección
Cuadros de información del vehículo e inspección
Resumen de evaluación
- 🎨 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
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 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
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