feat: excluir contratos del envío TNS

- Columna excluir en tabla contratos (migración automática)
- 25 contratos nuevos sembrados con excluir=1 (laboratorios externos, clínicas, médicos particulares)
- load_excluded_set() en contratos.py para consultar el set en runtime
- preview: marca items excluidos y los reporta en el conteo
- send/send-one/send-direct: bloquea envío si contrato está excluido
- automation preview+run: filtra excluidos antes del loop, reporta count
- UI /contratos: columna Envío TNS con toggle Activo/Excluido, fila en rojo si excluida

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-10 15:44:26 -05:00
co-authored by Claude Sonnet 4.6
parent 3baa6e5f75
commit 200a3f550b
5 changed files with 156 additions and 37 deletions
+13 -3
View File
@@ -14,7 +14,7 @@ from app.services.json_generator import (
)
from app.services.api_client import get_tns_token, TNS_BASE
from app.services.whatsapp_sync import sync_paciente, sync_todos, guardar_sync_log
from app.routes.contratos import load_contrato_map
from app.routes.contratos import load_contrato_map, load_excluded_set
router = APIRouter(prefix="/automation", tags=["automation"])
@@ -137,7 +137,11 @@ async def preview_automation(
if not ok2:
return JSONResponse({"success": False, "message": f"Error BD RDA: {err2}"})
grupos = agrupar_por_recepcion(rows_rda)
grupos_all = agrupar_por_recepcion(rows_rda)
excluded = load_excluded_set()
grupos = {k: v for k, v in grupos_all.items()
if str(v[0].get("CODCONTRATO") or "").strip() not in excluded}
excluidos_count = len(grupos_all) - len(grupos)
total_examenes = sum(len(v) for v in grupos.values())
# Agrupar RDA por COD_PACIENTE
@@ -172,6 +176,7 @@ async def preview_automation(
"pacientes": len(rows_pac),
"recepciones": len(grupos),
"examenes": total_examenes,
"excluidos": excluidos_count,
"pacientes_preview": pacientes_preview,
})
@@ -273,7 +278,12 @@ async def run_automation(
pass
# ── PASO 2: Enviar RDA Paciente ───────────────────────────────────────────
grupos = agrupar_por_recepcion(rows_rda)
excluded = load_excluded_set()
grupos_all = agrupar_por_recepcion(rows_rda)
grupos = {k: v for k, v in grupos_all.items()
if str(v[0].get("CODCONTRATO") or "").strip() not in excluded}
resultado["paso2_rda"]["excluidos"] = len(grupos_all) - len(grupos)
endpoint = f"{TNS_BASE}/v2/rda/RdaPaciente/Insertar?codigosucursal={api_sucursal or '00'}"
prof_def = configs.get("profesional_default", "")
esp_def = configs.get("especialidad_default", "")