Frontend (v1.0.85):
- Reemplazado "Modo IA COMPLETO/ASISTIDO" por "Modo AUTOCOMPLETADO/ASISTIDO"
- Cambiado "La IA completará/sugerirá" por "El sistema completará/sugerirá"
- Reemplazado "🤖 Análisis automático" por "📋 Procesamiento automático"
- Eliminadas todas las menciones explícitas de IA visibles para mecánicos
- Terminología neutral: "el sistema" en lugar de "la IA"
Backend (v1.0.84):
- Sin cambios
Mecánicos usan funcionalidad IA sin saber que existe, mejora UX profesional
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
✅ Sin IA configurada → Solo popup (sin análisis)
✅ Error en el backend → Popup con mensaje de sin análisis
✅ Timeout o fallo de red → Documentos marcados como cargados
1. Eliminado campo duplicado de "Observaciones":
❌ Antes: Había 2 campos de observaciones (uno general y uno dentro de fotos)
✅ Ahora: Solo 1 campo de observaciones (el general)
2. Nuevo tipo de pregunta "📸 Solo Fotografía" (photo_only):
Comportamiento: Solo muestra el título de la pregunta y el campo para adjuntar fotos
NO muestra: Campo de respuesta ni campo de observaciones
Ideal para: Documentación fotográfica pura (ej: "Fotografía del VIN", "Estado general del vehículo")
🎭 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
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
📝 Selector de modo (admin):
❌ "Modo IA" → ✅ "Modo de Asistencia"
❌ "Sin IA - Control manual total" → ✅ "Manual - Control total del operario"
❌ "IA Asistida - Sugerencias en fotos" → ✅ "Asistido - Sugerencias automáticas"
❌ "IA Completa - Análisis automático" → ✅ "Automático - Análisis completo"
📋 Descripciones:
❌ "Sin IA: El mecánico completa..." → ✅ "Modo Manual: El operario completa..."
❌ "IA Asistida: Cuando se suben fotos, la IA analiza..." → ✅ "Modo Asistido: ...el sistema analiza..."
❌ "IA Completa: El mecánico solo toma fotos y la IA responde..." → ✅ "Modo Automático: ...el sistema responde..."
❌ "Requiere OPENAI_API_KEY configurada" → ✅ "Requiere configuración de API externa"
🔍 Durante inspección:
❌ "🤖 Análisis IA disponible" → ✅ "🤖 Análisis automático disponible"
💬 En observaciones/comentarios:
❌ "🤖 Análisis IA (98% confianza):" → ✅ "Análisis Automático (98% confianza):"
❌ "🤖 Análisis IA:" → ✅ "Análisis Automático:"
❌ "🤖 Análisis IA de X imágenes:" → ✅ "Análisis Automático de X imágenes:"
🎯 Resultado:
Los mecánicos ahora ven:
"Asistente automático" en lugar de "Inteligencia Artificial"
"Sistema" en lugar de "IA"
"Análisis automático" en lugar de "Análisis IA"
Terminología más neutral y profesional
Frontend actualizado a v1.0.78
✅ 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
🔄 Función getReadableAnswer() en Frontend:
Convierte valores técnicos a etiquetas legibles dinámicamente
Lee la configuración question.options (que tú defines al crear preguntas)
Busca en el array choices la etiqueta correspondiente al valor
📋 Conversiones soportadas:
Boolean: "yes" → "Sí", "pass" → "Pasa", "good" → "Bueno"
Single Choice: "option1" → "Opción 1", "excellent" → "Excelente"
Multiple Choice: "lights,wipers" → "Luces, Limpiaparabrisas"
Scale/Text/Number/Date/Time: Se muestran tal cual (ya son legibles)
🎯 Dónde se aplica:
Modal de detalle de inspección al ver respuestas completadas
Respeta las configuraciones dinámicas que defines en el editor de preguntas
Funciona con todas las plantillas predefinidas y configuraciones personalizadas
⚙️ Funcionamiento dinámico:
Como los tipos de pregunta son configurables por ti en el frontend,
la función lee directamente de question.options.choices el array que tú configuraste,
por lo que funcionará automáticamente con cualquier configuración que crees.
Versiones actualizadas:
Frontend: 1.0.76 - Backend: 1.0.77
Ahora tanto el PDF como el modal de inspecciones mostrarán las etiquetas legibles en lugar de los valores técnicos.
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 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
- 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