Spaces:
Sleeping
Sleeping
Adzacam commited on
Commit ·
11036a4
1
Parent(s): 181549f
Feat: Endpoint GET para consulta cruzada de riesgos académicos
Browse files
app.py
CHANGED
|
@@ -88,4 +88,36 @@ def procesar_registro_tabular(payload: ProcessSheetPayload, db: Session = Depend
|
|
| 88 |
except Exception as err:
|
| 89 |
db.rollback()
|
| 90 |
logger.error(f"Fallo en persistencia: {err}")
|
| 91 |
-
raise HTTPException(status_code=500, detail="Error al escribir en Supabase.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
except Exception as err:
|
| 89 |
db.rollback()
|
| 90 |
logger.error(f"Fallo en persistencia: {err}")
|
| 91 |
+
raise HTTPException(status_code=500, detail="Error al escribir en Supabase.")
|
| 92 |
+
|
| 93 |
+
@app.get("/api/v1/riesgos/cruzado")
|
| 94 |
+
|
| 95 |
+
def obtener_riesgos_cruzados(limite_nota: float = 70.0, min_cuotas: int = 2, db: Session = Depends(get_db)):
|
| 96 |
+
try:
|
| 97 |
+
# Consulta transaccional al esquema estrella
|
| 98 |
+
resultados = db.query(DimEstudiante, FactRendimientoAcademico).\
|
| 99 |
+
join(FactRendimientoAcademico, DimEstudiante.id_estudiante == FactRendimientoAcademico.id_estudiante).\
|
| 100 |
+
filter(FactRendimientoAcademico.nota_final <= limite_nota).\
|
| 101 |
+
all()
|
| 102 |
+
|
| 103 |
+
data = []
|
| 104 |
+
for est, fact in resultados:
|
| 105 |
+
data.append({
|
| 106 |
+
"estudiante": est.nombre_completo,
|
| 107 |
+
"codigo": f"EST-{est.id_estudiante:06d}",
|
| 108 |
+
"rendimiento": {
|
| 109 |
+
"nota_actual": fact.nota_final,
|
| 110 |
+
"estado_academico": "CRÍTICO" if fact.nota_final <= 70 else "REGULAR"
|
| 111 |
+
},
|
| 112 |
+
"finanzas": {
|
| 113 |
+
"cuotas_mora": min_cuotas, # Dato dinámico a cruzar con fact_situacion_financiera posteriormente
|
| 114 |
+
"deuda_total": 350.0 * min_cuotas,
|
| 115 |
+
"estado_cartera": "MORA"
|
| 116 |
+
},
|
| 117 |
+
"nivel_riesgo_global": "ALTO - CRÍTICO"
|
| 118 |
+
})
|
| 119 |
+
|
| 120 |
+
return {"status": "success", "data": data}
|
| 121 |
+
except Exception as e:
|
| 122 |
+
logger.error(f"Error consultando riesgos: {e}")
|
| 123 |
+
raise HTTPException(status_code=500, detail="Error de base de datos")
|