feat: opcion 'sin contrato' para enviar numeroContrato null en TNS

- Agrega columna sin_contrato en tabla contratos (migration automatica)
- Contrato 040 marcado excluir=0, sin_contrato=1 en seed
- load_sin_contrato_set() retorna contratos que deben ir con null
- generar_rda_paciente acepta sin_contrato_set y fuerza numeroContrato=null
- Automation paso 2 y 3 pasan sin_contrato_set al generador
- Pagina contratos: columna y toggle "Sin contrato", checkbox en modal editar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-10 21:22:09 -05:00
co-authored by Claude Sonnet 4.6
parent eeabb6268e
commit 9f2bd5164e
5 changed files with 127 additions and 64 deletions
+6 -2
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, load_excluded_set
from app.routes.contratos import load_contrato_map, load_excluded_set, load_sin_contrato_set
from app.utils.activity import log_activity, get_ip
router = APIRouter(prefix="/automation", tags=["automation"])
@@ -260,6 +260,7 @@ async def preview_automation(
if str(v[0].get("CODCONTRATO") or "").strip() not in excluded}
contrato_map = load_contrato_map()
sin_contrato_set = load_sin_contrato_set()
prof_def = configs.get("profesional_defecto", "")
esp_def = configs.get("especialidad_defecto", "")
remis_def = configs.get("remisionante_defecto", "00")
@@ -274,6 +275,7 @@ async def preview_automation(
numero_override=ps_numero,
contrato_map=contrato_map,
prefijo_override=ps_prefijo,
sin_contrato_set=sin_contrato_set,
)
preservicios_preview.append({
"factura": f"{ps_prefijo}-{ps_numero.zfill(5)}",
@@ -429,6 +431,7 @@ async def run_automation(
# ── PASO 2: Enviar RDA Paciente ───────────────────────────────────────────
excluded = load_excluded_set()
sin_contrato_set = load_sin_contrato_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}
@@ -445,7 +448,7 @@ async def run_automation(
for id_recepcion, grupo_rows in grupos.items():
num_fac = str(grupo_rows[0].get("NUM_FACTURA") or "").strip()
num_override = num_fac
rda_json = generar_rda_paciente(grupo_rows, prof_def, esp_def, remis_def, prefijo_def, num_override, contrato_map=contrato_map)
rda_json = generar_rda_paciente(grupo_rows, prof_def, esp_def, remis_def, prefijo_def, num_override, contrato_map=contrato_map, sin_contrato_set=sin_contrato_set)
factura = num_override or str(id_recepcion)
try:
resp = await client.post(endpoint, json=rda_json, headers=headers)
@@ -486,6 +489,7 @@ async def run_automation(
numero_override=ps_numero,
contrato_map=contrato_map,
prefijo_override=ps_prefijo,
sin_contrato_set=sin_contrato_set,
)
factura_ps = f"{ps_prefijo}-{ps_numero.zfill(5)}"
try: