From 9d6fd29ebd029af4cce2a1cfb14de13144c76829 Mon Sep 17 00:00:00 2001 From: Administrator Date: Fri, 9 Oct 2026 16:44:31 -0500 Subject: [PATCH] Actualizar backend/services.py --- backend/services.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/backend/services.py b/backend/services.py index 4181bae..22a9f42 100644 --- a/backend/services.py +++ b/backend/services.py @@ -226,6 +226,19 @@ def facturacion(ano="TODOS", mes="TODOS", cuota="TODOS"): try: return float(v) if v is not None else 0.0 except Exception: return 0.0 + def _fstr(fch): + """Fecha a 'dd/mm/yyyy'.""" + if fch is None: return "" + try: return fch.strftime("%d/%m/%Y") + except Exception: + s = str(fch) + return f"{s[8:10]}/{s[5:7]}/{s[0:4]}" if len(s) >= 10 else s + + def _etiq_comp(comp, fch, deudor): + """Etiqueta del comprobante: '12/08/2026 - B00100... - JUAN CARLOS'.""" + partes = [p for p in (_fstr(fch), str(comp or "").strip(), str(deudor or "").strip()) if p] + return " - ".join(partes) or "(SIN COMPROBANTE)" + # ── Índice de facturas por num_comprobante: programa, matrícula, min cuota ── # (para enlazar NC -> factura). Guardamos el primer programa/matrícula visto # y el MIN(num_cuota) del comprobante (num_cuota_NC del Power BI). @@ -239,6 +252,8 @@ def facturacion(ano="TODOS", mes="TODOS", cuota="TODOS"): comp_rep[nc] = comp_rep.get(nc, 0) + 1 g = fact_idx.setdefault(nc, {"prog": f.get("dsc_det_programa") or "", "glosa": f.get("dsc_glosa") or "", + "deudor": f.get("dsc_deudor") or "", + "fch": f.get("fch_emision"), "matricula": str(f.get("num_matricula") or "").strip(), "min_cuota": None}) cu = f.get("num_cuota") @@ -291,7 +306,8 @@ def facturacion(ano="TODOS", mes="TODOS", cuota="TODOS"): base = _num(f.get("imp_subtotal")) if str(f.get("cod_moneda") or "").upper() != "SOL": base *= _num(f.get("imp_tc")) - acc[(sede, tipo, pnom, comp or "(SIN COMPROBANTE)")]["ing"] += base + etiq = _etiq_comp(comp, f.get("fch_emision"), f.get("dsc_deudor")) + acc[(sede, tipo, pnom, etiq)]["ing"] += base # ── NOTAS DE CRÉDITO ── for n in notas: @@ -318,7 +334,9 @@ def facturacion(ano="TODOS", mes="TODOS", cuota="TODOS"): base = _num(n.get("imp_subtotal")) if str(n.get("cod_moneda") or "").upper() != "SOL": base *= _num(n.get("imp_tc")) - acc[(sede, tipo, pnom, comp_bf or "(SIN COMPROBANTE)")]["nc"] += base + # Etiqueta con fecha/deudor de la factura enlazada (misma línea que el ingreso) + etiq = _etiq_comp(comp_bf, fi.get("fch"), fi.get("deudor")) + acc[(sede, tipo, pnom, etiq)]["nc"] += base # ── armar jerarquía Sede -> Tipo -> Programa -> Comprobante ── def _n0(): return {"ing": 0.0, "nc": 0.0}