Files
checklist/docs/pdf-regeneration.md

178 lines
4.9 KiB
Markdown

# Regeneración Automática de PDF al Editar Respuestas
## Descripción General
Se ha implementado la funcionalidad de regeneración automática del PDF de inspección cuando se editan respuestas en inspecciones completadas.
## Cambios Implementados
### 1. Nueva Función Reutilizable: `generate_inspection_pdf()`
**Ubicación**: `backend/app/main.py` (línea ~1046)
**Propósito**: Generar el PDF de una inspección y subirlo a S3.
**Parámetros**:
- `inspection_id: int` - ID de la inspección
- `db: Session` - Sesión de base de datos
**Retorna**: `str` - URL del PDF generado en S3
**Características**:
- Genera PDF profesional con diseño A4
- Incluye toda la información de la inspección
- Sube automáticamente a S3/MinIO
- Sobrescribe PDF existente si ya existe
- Maneja errores y excepciones
### 2. Actualización de `complete_inspection()`
**Ubicación**: `backend/app/main.py` (línea ~1358)
**Cambios**:
- Removido código duplicado de generación de PDF
- Ahora usa la función `generate_inspection_pdf()`
- Código más limpio y mantenible
**Antes**:
```python
# 300+ líneas de código de generación de PDF inline
```
**Después**:
```python
# Generar PDF usando función reutilizable
pdf_url = generate_inspection_pdf(inspection_id, db)
inspection.pdf_url = pdf_url
```
### 3. Actualización de `update_answer()`
**Ubicación**: `backend/app/main.py` (línea ~1497)
**Nuevas Funcionalidades**:
1. **Verificación de Estado**: Comprueba si la inspección está completada
2. **Recálculo de Puntuación**: Actualiza score, porcentaje y contadores
3. **Regeneración de PDF**: Genera nuevo PDF con los cambios
4. **Manejo de Errores**: No interrumpe la actualización si falla la generación del PDF
**Flujo de Trabajo**:
```python
1. Usuario edita respuesta
2. Backend actualiza Answer en BD
3. Backend verifica si inspection.status == "completed"
4. Si está completada:
a. Recalcula score total
b. Recalcula porcentaje
c. Recalcula items críticos
d. Genera nuevo PDF
e. Actualiza inspection.pdf_url
5. Retorna Answer actualizado
```
## Casos de Uso
### Caso 1: Editar Respuesta en Inspección en Progreso
```
- Usuario edita respuesta
- Respuesta se actualiza
- PDF NO se regenera (inspección no completada)
```
### Caso 2: Editar Respuesta en Inspección Completada
```
- Usuario edita respuesta
- Respuesta se actualiza
- Sistema detecta que inspección está completada
- Score se recalcula automáticamente
- PDF se regenera con los nuevos datos
- PDF anterior es sobrescrito en S3
```
## Ventajas de la Nueva Implementación
1. **DRY (Don't Repeat Yourself)**: Código de generación de PDF existe una sola vez
2. **Mantenibilidad**: Cambios al PDF solo se hacen en un lugar
3. **Automatización**: PDFs siempre reflejan el estado actual
4. **Consistencia**: Mismo diseño profesional en todas partes
5. **Robustez**: Manejo de errores sin interrumpir flujo principal
## Estructura del PDF Generado
El PDF incluye:
### Portada
- Título e ID de inspección
- Cuadro de información del vehículo (azul)
- Cuadro de información del cliente y mecánico (verde)
- Resumen de puntuación con colores según porcentaje
### Detalle de Inspección
- Agrupado por secciones
- Cada pregunta con:
- Icono de estado (✓ ok, ⚠ warning, ✕ critical)
- Respuesta y estado
- Comentarios
- Galería de imágenes (6 por fila)
### Footer
- Timestamp de generación
## Logs y Debugging
El sistema imprime logs útiles:
```python
# Al regenerar PDF
🔄 Regenerando PDF para inspección completada #123
# Al completar regeneración
PDF generado y subido a S3: https://...
# Si hay error
Error regenerando PDF: [detalle]
```
## Versión del Backend
**Versión actual**: `1.0.26`
Se incrementó la versión para reflejar esta nueva funcionalidad.
## Notas Técnicas
### S3/MinIO
- Los PDFs sobrescriben el archivo anterior con el mismo nombre
- Ruta: `{año}/{mes}/inspeccion_{id}_{placa}.pdf`
- Content-Type: `application/pdf`
### Base de Datos
- Campo `inspection.pdf_url` se actualiza automáticamente
- Score, porcentaje y flagged_items_count se recalculan
- Todo en una sola transacción
### Manejo de Errores
- Si falla la generación del PDF, se registra el error
- La actualización de la respuesta NO se revierte
- Se imprime traceback completo para debugging
## Próximos Pasos Sugeridos
1. ✅ Implementar regeneración de PDF (COMPLETADO)
2. ⏳ Ejecutar migraciones SQL para employee_code
3. ⏳ Probar flujo completo en ambiente de desarrollo
4. ⏳ Considerar notificación a n8n cuando se edita inspección completada
5. ⏳ Agregar campo `updated_at` a inspecciones para tracking de cambios
## Testing
Para probar la funcionalidad:
1. Completar una inspección
2. Verificar que se genera el PDF
3. Editar una respuesta (cambiar status, comentario, etc.)
4. Verificar en logs que se regenera el PDF
5. Descargar el PDF y confirmar que refleja los cambios
6. Verificar que el score se recalculó correctamente