Agregar envio a n8n usando .env para enviar cuando se guarda una inspeccion
This commit is contained in:
@@ -83,6 +83,124 @@ def send_answer_notification(answer, question, mechanic, db):
|
||||
print(f"❌ Error enviando notificación: {e}")
|
||||
# No lanzamos excepción para no interrumpir el flujo normal
|
||||
|
||||
|
||||
def send_completed_inspection_to_n8n(inspection, db):
|
||||
"""Envía la inspección completa con todas las respuestas e imágenes a n8n"""
|
||||
try:
|
||||
if not app_config.settings.NOTIFICACION_ENDPOINT:
|
||||
print("No hay endpoint de notificación configurado")
|
||||
return
|
||||
|
||||
print(f"\n🚀 Enviando inspección #{inspection.id} a n8n...")
|
||||
|
||||
# Obtener datos del mecánico
|
||||
mechanic = db.query(models.User).filter(models.User.id == inspection.mechanic_id).first()
|
||||
|
||||
# Obtener checklist
|
||||
checklist = db.query(models.Checklist).filter(models.Checklist.id == inspection.checklist_id).first()
|
||||
|
||||
# Obtener todas las respuestas con sus imágenes
|
||||
answers = db.query(models.Answer).options(
|
||||
joinedload(models.Answer.media_files),
|
||||
joinedload(models.Answer.question)
|
||||
).filter(models.Answer.inspection_id == inspection.id).all()
|
||||
|
||||
# Preparar respuestas con imágenes
|
||||
respuestas_data = []
|
||||
for answer in answers:
|
||||
# Obtener URLs de imágenes
|
||||
imagenes = []
|
||||
for media in answer.media_files:
|
||||
if media.file_type == "image":
|
||||
imagenes.append({
|
||||
"id": media.id,
|
||||
"url": media.file_path,
|
||||
"filename": media.filename
|
||||
})
|
||||
|
||||
respuestas_data.append({
|
||||
"id": answer.id,
|
||||
"pregunta": {
|
||||
"id": answer.question.id,
|
||||
"texto": answer.question.text,
|
||||
"seccion": answer.question.section,
|
||||
"orden": answer.question.order
|
||||
},
|
||||
"respuesta": answer.answer_value,
|
||||
"estado": answer.status,
|
||||
"comentario": answer.comment,
|
||||
"observaciones": answer.observations,
|
||||
"puntos_obtenidos": answer.points_earned,
|
||||
"es_critico": answer.is_flagged,
|
||||
"imagenes": imagenes,
|
||||
"ai_analysis": answer.ai_analysis
|
||||
})
|
||||
|
||||
# Preparar datos completos de la inspección
|
||||
inspeccion_data = {
|
||||
"tipo": "inspeccion_completada",
|
||||
"inspeccion": {
|
||||
"id": inspection.id,
|
||||
"estado": inspection.status,
|
||||
"or_number": inspection.or_number,
|
||||
"work_order_number": inspection.work_order_number,
|
||||
"vehiculo": {
|
||||
"placa": inspection.vehicle_plate,
|
||||
"marca": inspection.vehicle_brand,
|
||||
"modelo": inspection.vehicle_model,
|
||||
"kilometraje": inspection.vehicle_km
|
||||
},
|
||||
"cliente": inspection.client_name,
|
||||
"mecanico": {
|
||||
"id": mechanic.id if mechanic else None,
|
||||
"nombre": mechanic.full_name if mechanic else None,
|
||||
"email": mechanic.email if mechanic else None,
|
||||
"codigo_operario": inspection.mechanic_employee_code
|
||||
},
|
||||
"checklist": {
|
||||
"id": checklist.id if checklist else None,
|
||||
"nombre": checklist.name if checklist else None
|
||||
},
|
||||
"puntuacion": {
|
||||
"obtenida": inspection.score,
|
||||
"maxima": inspection.max_score,
|
||||
"porcentaje": round(inspection.percentage, 2),
|
||||
"items_criticos": inspection.flagged_items_count
|
||||
},
|
||||
"fechas": {
|
||||
"inicio": inspection.started_at.isoformat() if inspection.started_at else None,
|
||||
"completado": inspection.completed_at.isoformat() if inspection.completed_at else None
|
||||
},
|
||||
"pdf_url": inspection.pdf_url,
|
||||
"firma": inspection.signature_data
|
||||
},
|
||||
"respuestas": respuestas_data,
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
# Enviar al webhook de n8n
|
||||
print(f"📤 Enviando {len(respuestas_data)} respuestas con imágenes a n8n...")
|
||||
response = requests.post(
|
||||
app_config.settings.NOTIFICACION_ENDPOINT,
|
||||
json=inspeccion_data,
|
||||
timeout=30 # Timeout más largo para inspecciones completas
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
print(f"✅ Inspección #{inspection.id} enviada exitosamente a n8n")
|
||||
print(f" - {len(respuestas_data)} respuestas")
|
||||
print(f" - {sum(len(r['imagenes']) for r in respuestas_data)} imágenes")
|
||||
else:
|
||||
print(f"⚠️ Error al enviar inspección a n8n: {response.status_code}")
|
||||
print(f" Response: {response.text[:200]}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error enviando inspección a n8n: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
# No lanzamos excepción para no interrumpir el flujo normal
|
||||
|
||||
|
||||
BACKEND_VERSION = "1.0.25"
|
||||
app = FastAPI(title="Checklist Inteligente API", version=BACKEND_VERSION)
|
||||
|
||||
@@ -1028,6 +1146,10 @@ def complete_inspection(
|
||||
inspection.pdf_url = pdf_url
|
||||
db.commit()
|
||||
db.refresh(inspection)
|
||||
|
||||
# Enviar inspección completa a n8n con todas las respuestas e imágenes
|
||||
send_completed_inspection_to_n8n(inspection, db)
|
||||
|
||||
return inspection
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user