Adzacam commited on
Commit
432899b
·
1 Parent(s): 5bfe767

feat: implement dynamic budget category creation based on program names during data ingestion

Browse files
Files changed (1) hide show
  1. app.py +12 -5
app.py CHANGED
@@ -528,7 +528,9 @@ def procesar_lote_tabular(payloads: List[ProcessSheetPayload], db: Session = Dep
528
  tiempos_db = {t.id_tiempo for t in db.query(DimTiempo).all()}
529
  docs_db = {d.id_documento for d in db.query(DimOrigenDocumental).all()}
530
  users_db = {u.id for u in db.query(Users).all()}
531
- categorias_db = {c.id_categoria for c in db.query(DimCategoriaFinanciera).all()}
 
 
532
 
533
  nuevos_estudiantes = []
534
  nuevos_docentes = []
@@ -574,9 +576,13 @@ def procesar_lote_tabular(payloads: List[ProcessSheetPayload], db: Session = Dep
574
  # Para presupuestos asumimos categoría base por defecto (ID 1) si no existe
575
  area_check = getattr(payload, 'tipo_fuente', 'ACADEMIC')
576
  if not area_check: area_check = 'ACADEMIC'
577
- if area_check == 'BUDGET' and 1 not in categorias_db:
578
- nuevas_categorias.append(DimCategoriaFinanciera(id_categoria=1, nombre_categoria="Presupuesto General", tipo="EGRESO"))
579
- categorias_db.add(1)
 
 
 
 
580
 
581
  # Insertar nuevas dimensiones en bloque si existen
582
  if nuevos_docentes: db.add_all(nuevos_docentes)
@@ -628,9 +634,10 @@ def procesar_lote_tabular(payloads: List[ProcessSheetPayload], db: Session = Dep
628
  puntuacion=getattr(payload, 'puntuacion', 5.0), comentario=nombre_resuelto
629
  ))
630
  elif area == "BUDGET":
 
631
  hechos_budget.append(FactRentabilidadPresupuesto(
632
  id_modulo=payload.id_modulo, id_tiempo=payload.id_tiempo,
633
- id_categoria=1,
634
  monto_ejecutado=getattr(payload, 'monto_ejecutado', getattr(payload, 'costo', 0)),
635
  monto_meta=getattr(payload, 'monto_meta', getattr(payload, 'costo', 0))
636
  ))
 
528
  tiempos_db = {t.id_tiempo for t in db.query(DimTiempo).all()}
529
  docs_db = {d.id_documento for d in db.query(DimOrigenDocumental).all()}
530
  users_db = {u.id for u in db.query(Users).all()}
531
+
532
+ existing_categorias = {c.nombre_categoria: c.id_categoria for c in db.query(DimCategoriaFinanciera).all()}
533
+ categorias_db = set(existing_categorias.values())
534
 
535
  nuevos_estudiantes = []
536
  nuevos_docentes = []
 
576
  # Para presupuestos asumimos categoría base por defecto (ID 1) si no existe
577
  area_check = getattr(payload, 'tipo_fuente', 'ACADEMIC')
578
  if not area_check: area_check = 'ACADEMIC'
579
+ if area_check == 'BUDGET':
580
+ cat_name = payload.programa.strip() if getattr(payload, 'programa', None) else "Presupuesto General"
581
+ if cat_name not in existing_categorias:
582
+ new_id = max(existing_categorias.values() or [0]) + 1
583
+ nuevas_categorias.append(DimCategoriaFinanciera(id_categoria=new_id, nombre_categoria=cat_name, tipo="EGRESO"))
584
+ existing_categorias[cat_name] = new_id
585
+ categorias_db.add(new_id)
586
 
587
  # Insertar nuevas dimensiones en bloque si existen
588
  if nuevos_docentes: db.add_all(nuevos_docentes)
 
634
  puntuacion=getattr(payload, 'puntuacion', 5.0), comentario=nombre_resuelto
635
  ))
636
  elif area == "BUDGET":
637
+ cat_name = payload.programa.strip() if getattr(payload, 'programa', None) else "Presupuesto General"
638
  hechos_budget.append(FactRentabilidadPresupuesto(
639
  id_modulo=payload.id_modulo, id_tiempo=payload.id_tiempo,
640
+ id_categoria=existing_categorias.get(cat_name, 1),
641
  monto_ejecutado=getattr(payload, 'monto_ejecutado', getattr(payload, 'costo', 0)),
642
  monto_meta=getattr(payload, 'monto_meta', getattr(payload, 'costo', 0))
643
  ))