debug: add /debug-fb/preview-ventas GET endpoint to trace filter logic

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-28 15:29:05 -05:00
co-authored by Claude Sonnet 4.6
parent 0e837e4a2d
commit 29ab01e729
+82
View File
@@ -267,6 +267,88 @@ async def debug_cmxc(
return JSONResponse({"ok": False, "traceback": traceback.format_exc()})
@router.get("/preview-ventas")
async def debug_preview_ventas(
fecha: str = Query(default="", description="YYYY-MM-DD"),
user: dict = Depends(get_current_user),
):
"""Corre la lógica completa de ventas del preview y muestra cada paso."""
from datetime import date as date_cls
from collections import defaultdict
if not fecha:
fecha = date_cls.today().isoformat()
fecha_ini = f"{fecha} 00:00:00"
fecha_fin = f"{fecha} 23:59:59"
try:
conn = get_connection()
cfg = {r["key"]: r["value"] for r in conn.execute("SELECT * FROM config").fetchall()}
excluded_ventas = set(
r["numero_contrato"]
for r in conn.execute("SELECT numero_contrato FROM contratos WHERE excluir_ventas=1").fetchall()
)
conn.close()
fb, ok, msg = get_firebird_from_config(cfg)
if not ok:
return JSONResponse({"ok": False, "error": msg})
ok_vta, err_vta, rows_vta = fb.execute_query("""
SELECT
r.IDRECEPCION, r.PREFIJO, r.NUM_FACTURA,
r.COD_PACIENTE, r.NIT_EMPRESA, r.VALORTOTAL,
rel.COD_EXAMEN,
TRIM(e.CODCONTRATO) AS CODCONTRATO
FROM RECEPCION r
JOIN RELACION rel ON rel.IDRECEPCION = r.IDRECEPCION
LEFT JOIN EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN)
LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA
LEFT JOIN TARIFA t ON TRIM(t.COD_EXAMEN) = TRIM(rel.COD_EXAMEN) AND t.TARIFA = e.TARIFA
WHERE r.FECHA_RECEPCION BETWEEN :fecha_ini AND :fecha_fin
AND r.PREFIJO = 'CMXC'
ORDER BY r.IDRECEPCION
""", {"fecha_ini": fecha_ini, "fecha_fin": fecha_fin})
fb.disconnect()
if not ok_vta:
return JSONResponse({"ok": False, "sql_error": err_vta})
# Agrupar por NUM_FACTURA
grupos: dict = defaultdict(list)
for row in (rows_vta or []):
key = str(row.get("NUM_FACTURA") or "")
grupos[key].append(dict(row))
pasos = []
grupos_finales = {}
for k, v in grupos.items():
paso = {"key": k, "filas": len(v),
"num_factura": v[0].get("NUM_FACTURA"),
"codcontrato": v[0].get("CODCONTRATO"),
"es_lista": isinstance(v, list),
"motivo_exclusion": None}
if not isinstance(v, list) or not v:
paso["motivo_exclusion"] = "no_es_lista_o_vacia"
elif int(v[0].get("NUM_FACTURA") or 0) == 0:
paso["motivo_exclusion"] = "num_factura_cero"
elif str(v[0].get("CODCONTRATO") or "").strip() in excluded_ventas:
paso["motivo_exclusion"] = f"contrato_excluido ({v[0].get('CODCONTRATO')})"
else:
grupos_finales[k] = v
pasos.append(paso)
return JSONResponse({
"ok": True,
"fecha": fecha,
"rows_vta_count": len(rows_vta or []),
"grupos_count": len(grupos),
"grupos_finales_count": len(grupos_finales),
"pasos": pasos,
"excluded_ventas_set": sorted(excluded_ventas),
})
except Exception:
return JSONResponse({"ok": False, "traceback": traceback.format_exc()})
@router.get("/cups")
async def find_cups(request: Request, user: dict = Depends(get_current_user)):
try: