Adzacam commited on
Commit
2ee6390
·
1 Parent(s): 9f5c52c

feat: add financial reporting fields to schema, update data ingestion logic, and lower AI confidence threshold for revision

Browse files
Files changed (1) hide show
  1. app.py +19 -5
app.py CHANGED
@@ -138,6 +138,10 @@ class ProcessSheetPayload(BaseModel):
138
  # Financial fields
139
  monto_deuda: Optional[float] = 0.0
140
  cuotas_impagas: Optional[int] = 0
 
 
 
 
141
 
142
  # Marketing fields
143
  leads: Optional[int] = 0
@@ -451,7 +455,7 @@ def analyze_nlp_only(payload: ProcessSheetPayload, db: Session = Depends(get_db)
451
  payload.incumplimiento_tareas < 0 or payload.incumplimiento_tareas > 100
452
  )
453
 
454
- forzar_revision = (confianza_ia < 0.60) or fuera_de_rango
455
 
456
  alertas_disparadas = []
457
  if payload.tipo_fuente not in ["FINANCE", "BUDGET", "MARKETING", "SURVEYS"]:
@@ -592,7 +596,7 @@ def procesar_lote_tabular(payloads: List[ProcessSheetPayload], db: Session = Dep
592
  else:
593
  entidades = ner_engine.extract_entities(payload.texto_celda)
594
  confianza_ia = sum([e["score"] for e in entidades]) / len(entidades) if entidades else 1.0
595
- forzar_revision = confianza_ia < 0.60
596
 
597
  nombre_resuelto = payload.texto_celda[:200].strip()
598
  estudiante = next((e for e in estudiantes_db if e.codigo_estudiante == payload.codigo_estudiante), None) if payload.codigo_estudiante else None
@@ -626,8 +630,17 @@ def procesar_lote_tabular(payloads: List[ProcessSheetPayload], db: Session = Dep
626
  hechos_budget.append(FactRentabilidadPresupuesto(
627
  id_modulo=payload.id_modulo, id_tiempo=payload.id_tiempo,
628
  id_categoria=1,
629
- monto_ejecutado=getattr(payload, 'monto_deuda', getattr(payload, 'costo', 0)),
630
- monto_meta=getattr(payload, 'monto_deuda', getattr(payload, 'costo', 0))
 
 
 
 
 
 
 
 
 
631
  ))
632
  else: # ACADEMIC
633
  hechos_academic.append(FactRendimientoAcademico(
@@ -642,6 +655,7 @@ def procesar_lote_tabular(payloads: List[ProcessSheetPayload], db: Session = Dep
642
  if hechos_marketing: db.add_all(hechos_marketing)
643
  if hechos_surveys: db.add_all(hechos_surveys)
644
  if hechos_budget: db.add_all(hechos_budget)
 
645
  if hechos_academic: db.add_all(hechos_academic)
646
 
647
  db.commit()
@@ -1477,7 +1491,7 @@ def batch_analyze_nlp(
1477
  db.flush()
1478
  estudiantes_existentes.append(estudiante)
1479
 
1480
- candidatos_difusos = get_top_matches(nombre_resuelto, estudiantes_existentes, top_k=5) if requiere_revision or (confianza_ia < 0.60 and area in ['ACADEMIC', 'FINANCE']) else []
1481
 
1482
  # Calculo de alertas
1483
  alertas = []
 
138
  # Financial fields
139
  monto_deuda: Optional[float] = 0.0
140
  cuotas_impagas: Optional[int] = 0
141
+ monto_ejecutado: Optional[float] = 0.0
142
+ monto_meta: Optional[float] = 0.0
143
+ estado_cartera: Optional[str] = None
144
+ tipo_alerta: Optional[str] = None
145
 
146
  # Marketing fields
147
  leads: Optional[int] = 0
 
455
  payload.incumplimiento_tareas < 0 or payload.incumplimiento_tareas > 100
456
  )
457
 
458
+ forzar_revision = (confianza_ia < 0.50) or fuera_de_rango
459
 
460
  alertas_disparadas = []
461
  if payload.tipo_fuente not in ["FINANCE", "BUDGET", "MARKETING", "SURVEYS"]:
 
596
  else:
597
  entidades = ner_engine.extract_entities(payload.texto_celda)
598
  confianza_ia = sum([e["score"] for e in entidades]) / len(entidades) if entidades else 1.0
599
+ forzar_revision = confianza_ia < 0.50
600
 
601
  nombre_resuelto = payload.texto_celda[:200].strip()
602
  estudiante = next((e for e in estudiantes_db if e.codigo_estudiante == payload.codigo_estudiante), None) if payload.codigo_estudiante else None
 
630
  hechos_budget.append(FactRentabilidadPresupuesto(
631
  id_modulo=payload.id_modulo, id_tiempo=payload.id_tiempo,
632
  id_categoria=1,
633
+ monto_ejecutado=getattr(payload, 'monto_ejecutado', getattr(payload, 'costo', 0)),
634
+ monto_meta=getattr(payload, 'monto_meta', getattr(payload, 'costo', 0))
635
+ ))
636
+ elif area == "FINANCE":
637
+ hechos_finance.append(FactSituacionFinanciera(
638
+ id_estudiante=estudiante.id_estudiante,
639
+ id_tiempo=payload.id_tiempo,
640
+ monto_deuda=getattr(payload, 'monto_deuda', 0),
641
+ cuotas_impagas=getattr(payload, 'cuotas_impagas', 0),
642
+ estado_cartera=getattr(payload, 'estado_cartera', 'PENDIENTE'),
643
+ tipo_alerta=getattr(payload, 'tipo_alerta', 'NINGUNA')
644
  ))
645
  else: # ACADEMIC
646
  hechos_academic.append(FactRendimientoAcademico(
 
655
  if hechos_marketing: db.add_all(hechos_marketing)
656
  if hechos_surveys: db.add_all(hechos_surveys)
657
  if hechos_budget: db.add_all(hechos_budget)
658
+ if hechos_finance: db.add_all(hechos_finance)
659
  if hechos_academic: db.add_all(hechos_academic)
660
 
661
  db.commit()
 
1491
  db.flush()
1492
  estudiantes_existentes.append(estudiante)
1493
 
1494
+ candidatos_difusos = get_top_matches(nombre_resuelto, estudiantes_existentes, top_k=5) if requiere_revision or (confianza_ia < 0.50 and area in ['ACADEMIC', 'FINANCE']) else []
1495
 
1496
  # Calculo de alertas
1497
  alertas = []