Adzacam commited on
Commit
11036a4
·
1 Parent(s): 181549f

Feat: Endpoint GET para consulta cruzada de riesgos académicos

Browse files
Files changed (1) hide show
  1. app.py +33 -1
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")