178 lines
4.9 KiB
Markdown
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
|