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:
co-authored by
Claude Sonnet 4.6
parent
3baa6e5f75
commit
200a3f550b
@@ -8,7 +8,7 @@ from app.auth import get_current_user
|
||||
from app.services.firebird_service import get_firebird_from_config
|
||||
from app.services.json_generator import generar_rda_paciente, agrupar_por_recepcion
|
||||
from app.services.api_client import get_tns_token, TNS_BASE
|
||||
from app.routes.contratos import load_contrato_map
|
||||
from app.routes.contratos import load_contrato_map, load_excluded_set
|
||||
|
||||
router = APIRouter(prefix="/transaccion", tags=["transaccion"])
|
||||
|
||||
@@ -98,10 +98,13 @@ async def preview_transaccion(
|
||||
remis_def = cfg.get("remisionante_default", "00")
|
||||
prefijo_def = cfg.get("prefijo_tns_default", "00")
|
||||
contrato_map = load_contrato_map()
|
||||
excluded = load_excluded_set()
|
||||
|
||||
items = []
|
||||
for id_rec, grupo_rows in grupos.items():
|
||||
enviado = _is_sent(id_rec)
|
||||
cod_c = str(grupo_rows[0].get("CODCONTRATO") or "").strip()
|
||||
is_excluded = cod_c in excluded
|
||||
rda = generar_rda_paciente(grupo_rows, prof_def, esp_def, remis_def, prefijo_def, contrato_map=contrato_map)
|
||||
items.append({
|
||||
"idrecepcion": id_rec,
|
||||
@@ -111,12 +114,14 @@ async def preview_transaccion(
|
||||
"examenes": [r.get("COD_EXAMEN", "") for r in grupo_rows],
|
||||
"valor": float(grupo_rows[0].get("VALORTOTAL") or 0),
|
||||
"enviado": enviado,
|
||||
"excluido": is_excluded,
|
||||
"json": rda,
|
||||
})
|
||||
|
||||
pendientes = sum(1 for i in items if not i["enviado"])
|
||||
pendientes = sum(1 for i in items if not i["enviado"] and not i["excluido"])
|
||||
enviados_ok = sum(1 for i in items if i["enviado"] and i["enviado"]["status"] == "success")
|
||||
enviados_err = sum(1 for i in items if i["enviado"] and i["enviado"]["status"] == "error")
|
||||
excluidos = sum(1 for i in items if i["excluido"])
|
||||
|
||||
return JSONResponse({
|
||||
"success": True,
|
||||
@@ -124,6 +129,7 @@ async def preview_transaccion(
|
||||
"pendientes": pendientes,
|
||||
"enviados_ok": enviados_ok,
|
||||
"enviados_err": enviados_err,
|
||||
"excluidos": excluidos,
|
||||
"items": items,
|
||||
})
|
||||
|
||||
@@ -149,6 +155,10 @@ async def send_one(
|
||||
if not grupo_rows:
|
||||
return JSONResponse({"success": False, "message": f"IDRECEPCION {idrecepcion} no encontrado"})
|
||||
|
||||
cod_c = str(grupo_rows[0].get("CODCONTRATO") or "").strip()
|
||||
if cod_c in load_excluded_set():
|
||||
return JSONResponse({"success": False, "message": f"Contrato {cod_c} está excluido del envío TNS"})
|
||||
|
||||
token, token_err = await get_tns_token(
|
||||
cfg.get("tns_empresa", ""), cfg.get("tns_usuario", ""), cfg.get("tns_password", "")
|
||||
)
|
||||
@@ -237,6 +247,12 @@ async def send_transaccion(
|
||||
if solo_pendientes == "1":
|
||||
grupos = {k: v for k, v in grupos.items() if not _is_sent(k)}
|
||||
|
||||
excluded = load_excluded_set()
|
||||
grupos_enviar = {k: v for k, v in grupos.items()
|
||||
if str(v[0].get("CODCONTRATO") or "").strip() not in excluded}
|
||||
excluidos_count = len(grupos) - len(grupos_enviar)
|
||||
grupos = grupos_enviar
|
||||
|
||||
contrato_map = load_contrato_map()
|
||||
|
||||
token, token_err = await get_tns_token(
|
||||
@@ -306,6 +322,7 @@ async def send_transaccion(
|
||||
"success": err_count == 0,
|
||||
"total_enviados": ok_count,
|
||||
"total_errores": err_count,
|
||||
"total_excluidos": excluidos_count,
|
||||
"resultados": resultados,
|
||||
})
|
||||
|
||||
@@ -340,6 +357,12 @@ async def send_direct(
|
||||
if not grupos:
|
||||
return JSONResponse({"success": False, "message": "Sin datos agrupables"})
|
||||
|
||||
# Rechazar si todos los grupos pertenecen a contratos excluidos
|
||||
excluded = load_excluded_set()
|
||||
primer_contrato = str(list(grupos.values())[0][0].get("CODCONTRATO") or "").strip()
|
||||
if primer_contrato in excluded:
|
||||
return JSONResponse({"success": False, "message": f"Contrato {primer_contrato} está excluido del envío TNS"})
|
||||
|
||||
token, token_err = await get_tns_token(
|
||||
cfg.get("tns_empresa", ""), cfg.get("tns_usuario", ""), cfg.get("tns_password", "")
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user