From 0ec4ae3e664aa772677cc54061f92e3696d383cf Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 25 Jun 2026 20:48:22 -0500 Subject: [PATCH] Fix JSON generation: numero factura, forma pago, tipousuario, hora format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - numero: usar NUM_FACTURA en lugar de cadena vacía - codFormaPago: CLIP (particular) / INST (EPS) según TNS real - tipousuario: fallback desde TIPOUSU cuando TIPOUSUSISPRO es NULL - fechaHoraEgreso: última FECHA_REPORTADO en lugar de FECHA_RECEPCION - _fmt_datetime: eliminar espacios en tiempo ("06: 08: 29" → "06:08:29") - especialidad: limpiar valores basura (., -, 0, 00) - telefono: fallback "0000000" cuando vacío (campo requerido TNS) - profesional: COALESCE(USUARIO, MEDICO.CODIGO) en queries SQL Co-Authored-By: Claude Sonnet 4.6 --- ESTADO_CAMPOS.md | 193 +++++++++++++++++++++++++++++++++ app/routes/automation.py | 2 +- app/routes/queries.py | 4 +- app/services/json_generator.py | 45 ++++++-- norma/ANALISIS_CAMPOS_RIPS.md | 111 +++++++++++++++++++ 5 files changed, 341 insertions(+), 14 deletions(-) create mode 100644 ESTADO_CAMPOS.md create mode 100644 norma/ANALISIS_CAMPOS_RIPS.md diff --git a/ESTADO_CAMPOS.md b/ESTADO_CAMPOS.md new file mode 100644 index 0000000..27b8aed --- /dev/null +++ b/ESTADO_CAMPOS.md @@ -0,0 +1,193 @@ +# Estado de Campos — rips_manager +**Fecha:** 2026-06-25 | **Empresa:** 9002787299 | **Sucursal:** 81080 + +--- + +## 1. RIPS — Resolución 2275/2023 (vigente desde 1-abr-2024) + +> Los PDFs en `/norma` son sobre RDA/IHCE (Res. 866/2021 y 1888/2025), **no sobre RIPS**. +> La norma RIPS vigente es la **Res. 2275/2023 + Res. 558/2024 + Res. 1884/2024** (no están en la carpeta). +> TNS recibe nuestros datos y genera el RIPS hacia MinSalud internamente. + +### 1.1 Campos RIPS requeridos — nivel USUARIO (paciente) + +| Campo RIPS (Res. 2275) | Fuente Firebird | Estado | +|---|---|---| +| `tipoDocumentoIdentificacion` | `PACIENTE.TIPOIDENT` | ✅ Enviado como `tipoDocumento` en Tercero | +| `numDocumentoIdentificacion` | `PACIENTE.DOCIDENT` | ✅ Enviado como `nit` en Tercero | +| `fechaNacimiento` | `PACIENTE.F_NACIMIENTO` | ✅ Formato `dd/MM/yyyy` | +| `codSexo` | `PACIENTE.SEXO` | ✅ Enviado como `sexo` | +| `tipoUsuario` | `RECEPCION.TIPOUSUSISPRO` | ✅ Con fallback desde `TIPOUSU` | +| `codMunicipioResidencia` | `PACIENTE.CIUDAD` | ✅ Enviado como `codigoCiudad` (DIVIPOLA, igual en FB y TNS) | +| `codZonaTerritorialResidencia` | `PACIENTE.TIPORES` | ✅ Enviado como `zona` (U→`01`, R→`02`) | +| `codPaisResidencia` | No existe en Firebird | ⚪ TNS lo completa con `170` (Colombia) | +| `codPaisOrigen` | No existe en Firebird | ⚪ TNS lo completa con `170` | +| `incapacidad` | No existe en Firebird | ⚪ TNS lo completa como `NO` | + +### 1.2 Campos RIPS requeridos — nivel PROCEDIMIENTO (por examen) + +| Campo RIPS (Res. 2275) | Fuente Firebird | Estado | +|---|---|---| +| `codProcedimiento` | `RELACION.COD_EXAMEN` | ✅ Enviado como `codigoMaterial` | +| `fechaInicioAtencion` | `RELACION.FECHA_REPORTADO` | ✅ Enviado como `fechaHoraRealizacion` | +| `codDiagnosticoPrincipal` | `RECEPCION.DIAG_PPAL` | ✅ Enviado como `diagnosticoprincipal` | +| `vrServicio` | `RELACION.PRECIO` | ✅ Enviado como `valor` | +| `numAutorizacion` | `RECEPCION.AUTORIZACION` | ✅ Enviado como `numeroAutorizacion` | +| `finalidadTecnologiaSalud` | **No existe en Firebird** | ⚠️ TNS lo gestiona internamente (confirmar) | +| `viaIngresoServicioSalud` | **No existe en Firebird** | ⚠️ Fijo `"01"` — TNS lo completa | +| `modalidadGrupoServicioTecSal` | **No existe en Firebird** | ⚠️ TNS lo gestiona internamente | +| `grupoServicios` | **No existe en Firebird** | ⚠️ TNS lo gestiona internamente | +| `codServicio` | **No existe en Firebird** | ⚠️ TNS lo gestiona internamente | +| `valorPagoModerador` | **No existe en Firebird** | ⚪ TNS lo pone en `0` para particulares | +| `conceptoRecaudo` | **No existe en Firebird** | ⚠️ TNS lo gestiona internamente | +| `idMIPRES` | **No existe en Firebird** | ⚪ Opcional — solo para servicios MIPRES | +| `tipoDoc/numDoc del profesional` | Solo username (`RECEPCION.USUARIO`) | ⚠️ TNS usa username, no CC del médico | + +--- + +## 2. TNS API v2 — Estado del envío + +### 2.1 POST /v2/tablas/Tercero/Crear + +| Campo TNS | Fuente | Estado | +|---|---|---| +| `codigo` | `PACIENTE.CODIGO` | ✅ | +| `nit` | `PACIENTE.DOCIDENT` | ✅ | +| `tipoDocumento` | `PACIENTE.TIPOIDENT` (mapeado) | ✅ | +| `nombre`, `nombre1`, `nombre2` | `PACIENTE.NOMBRES` | ✅ | +| `apellido1`, `apellido2` | `PACIENTE.APELLIDOS` | ✅ | +| `direccion` | `PACIENTE.DIRECCION` | ✅ | +| `codigoCiudad` | `PACIENTE.CIUDAD` | ✅ Validado: DIVIPOLA igual en FB y TNS | +| `zona` | `PACIENTE.TIPORES` | ✅ U→`01`, R→`02` | +| `sexo` | `PACIENTE.SEXO` | ✅ | +| `fechaNacimiento` | `PACIENTE.F_NACIMIENTO` | ✅ | +| `etnia` | `PACIENTE.CODETNIA` | ✅ | +| `telefono` | `PACIENTE.TELEFONOS` | ✅ | +| `email` | `PACIENTE.EMAIL` | ✅ Fallback: `doc@sinregistro.co` | +| `natJuridica` | Hardcodeado `"N"` | ✅ Siempre Natural | +| `cliente` | Hardcodeado `"S"` | ✅ Siempre cliente | +| `zona1`, `clasificacion`, `codigoBarrio` | Hardcodeados `"00"` | ✅ Catálogos TNS sin config | +| `enfermedadCronica` | Hardcodeado `false` | ⚠️ No existe campo en Firebird | +| `noEnviarMinSalud` | Hardcodeado `false` | ⚠️ ¿Hay pacientes que no reportar? | + +### 2.2 POST /v2/rda/RdaPaciente/Insertar + +| Campo TNS | Fuente | Estado | +|---|---|---| +| `codigoPrefijo` | `RECEPCION.PREFIJO` | ✅ | +| `numero` | `RECEPCION.NUM_FACTURA` | ✅ Corregido (antes vacío) | +| `fecha` | `RECEPCION.FECHA_RECEPCION` | ✅ | +| `codTercero` | `RECEPCION.COD_PACIENTE` | ✅ | +| `tipoIngreso` | `RECEPCION.CLASEPROC` | ✅ (`1`=Amb, `2`=Hosp, `3`=Urgencias) | +| `fechaHoraIngreso` | `RECEPCION.HORAINICIORECEPCION` | ✅ Hora de inicio | +| `fechaHoraEgreso` | `RELACION.FECHA_REPORTADO` (última) | ✅ Fecha del último examen reportado | +| `diagnosticoprincipal` | `RECEPCION.DIAG_PPAL` | ✅ | +| `tipousuario` | `RECEPCION.TIPOUSUSISPRO` | ✅ Con fallback desde `TIPOUSU` | +| `numeroContrato` | `RECEPCION.NIT_EMPRESA` | ✅ NIT de EPS o `PART` | +| `numeroAutorizacion` | `RECEPCION.AUTORIZACION` | ✅ | +| `codFormaPago` | Derivado de `NIT_EMPRESA` | ✅ `PART`→`CLIP`, EPS→`INST` (validado en TNS) | +| `modalidadAtencion` | Hardcodeado `"01"` | ⚠️ No existe campo en Firebird (intramural) | +| `viaIngreso` | Hardcodeado `"01"` | ⚠️ No existe campo en Firebird (demanda espontánea) | +| `codVendedor` | Hardcodeado `"00"` | ✅ Default TNS validado | +| `codBanco` | Hardcodeado `"00"` | ✅ Default TNS validado | +| `codigoCentroCosto` | Hardcodeado `"00"` | ✅ Sin centros de costo configurados en TNS | +| `esTerapia` | Hardcodeado `false` | ✅ Es laboratorio | +| `esProcedimiento` | Hardcodeado `false` | ✅ Es laboratorio | +| **detallePedido:** | | | +| `codigoMaterial` | `RELACION.COD_EXAMEN` | ⚠️ Sin validar: DOCUXER sin permiso de artículos | +| `codigoBodega` | Hardcodeado `"00"` | ✅ Validado: única bodega en TNS es `"00"` | +| `cantidad` | Hardcodeado `1` | ✅ 1 examen = 1 unidad | +| `tipoUnidad` | Hardcodeado `"D"` | ✅ Default TNS | +| `valor` | `RELACION.PRECIO` | ✅ | +| `descuento` | Hardcodeado `0` | ✅ | +| `porcentajeIva` | Hardcodeado `0` | ✅ Salud sin IVA | +| `impConsumo` | Hardcodeado `0` | ✅ | +| `profesional` | `RECEPCION.USUARIO` (con fallback `MEDICO.CODIGO`) | ✅ Opcional según doc TNS | +| `especialidad` | `MEDICO.COD_ESPECIALIDAD` | ✅ Limpia valores basura (`.`, `-`, `00`) | +| `diagnosticoprincipal` | `RECEPCION.DIAG_PPAL` | ✅ | +| `fechaHoraRealizacion` | `RELACION.FECHA_REPORTADO` | ✅ Requerido — formato `dd/MM/yyyy HH:mm:ss` | + +--- + +## 3. Hardcodeados — Resumen definitivo + +### ✅ Correctos — defaults validados contra TNS + +| Campo | Valor | Razón | +|---|---|---| +| `codVendedor` | `"00"` | Default TNS documentado | +| `codBanco` | `"00"` | Default TNS documentado | +| `codigoCentroCosto` | `"00"` | Sin centros de costo en TNS | +| `codigoBodega` | `"00"` | Única bodega existente en TNS (`PRINCIPAL`) | +| `tipoUnidad` | `"D"` | Default TNS (Unidad) | +| `cantidad` | `1` | 1 examen = 1 unidad lógica | +| `descuento` | `0` | Sin descuentos | +| `porcentajeIva` | `0` | Servicios de salud exentos | +| `impConsumo` | `0` | Sin impuesto al consumo | +| `esTerapia` | `false` | Es laboratorio clínico | +| `esProcedimiento` | `false` | Es laboratorio clínico | +| `natJuridica` | `"N"` | Paciente = persona Natural | +| `cliente` | `"S"` | Siempre es cliente | +| `zona1` / `clasificacion` / `codigoBarrio` | `"00"` | Catálogos TNS sin configurar | +| `privada` / `mixta` | `"N"` | Laboratorio no es privado/mixto | +| `comision` | `0` | Sin comisiones | + +### ⚠️ Hardcodeados por ausencia de campo en Firebird — confirmar con operación + +| Campo | Valor fijo | Situación | +|---|---|---| +| `viaIngreso` | `"01"` Demanda Espontánea | **No existe** columna en `RECEPCION`. ¿Siempre es espontáneo? | +| `modalidadAtencion` | `"01"` Intramural | **No existe** columna en `RECEPCION`. ¿Hacen domiciliarias? | +| `enfermedadCronica` | `false` | **No existe** en Firebird | +| `noEnviarMinSalud` | `false` | **No existe** en Firebird. ¿Hay pacientes sin reporte? | + +--- + +## 4. Bugs corregidos en esta sesión + +| Bug | Causa | Fix | +|---|---|---| +| `Column unknown DOC_NUM / FECHA_INI` | `fdb` no soporta `:name` params | `firebird_service.py` convierte a `?` positional | +| `"06: 08: 29"` (espacios en hora) | Firebird retorna TIME con espacios | `_fmt_datetime` limpia `": "` → `":"` | +| `"numero": ""` (factura vacía) | Hardcodeado `""` | Ahora usa `RECEPCION.NUM_FACTURA` | +| `"especialidad": "."` | `COD_ESPECIALIDAD` con basura en BD | Limpia `.`, `-`, `0`, `00` | +| `"tipousuario": "12"` siempre | `TIPOUSUSISPRO` NULL en 96% de registros viejos | Fallback desde `TIPOUSU`: `1`→`11`, `5`→`07` | +| `"codFormaPago": "CO"` | Código no existe en TNS de este lab | Cambiado a `CLIP` (particular) / `INST` (EPS) | +| `fechaHoraEgreso` = fecha entrada | Usaba `FECHA_RECEPCION` como egreso | Ahora usa `max(FECHA_REPORTADO)` de exámenes | + +--- + +## 5. Pendientes bloqueantes + +### En portal.tns.co (requiere admin TNS) +| Permiso | Para qué | Sin esto | +|---|---|---| +| **Insertar RDA Pacientes** (usuario DOCUXER) | Enviar `RdaPaciente/Insertar` | El envío retorna error 403 | +| **Ver artículos** (usuario DOCUXER) | Validar que códigos de exámenes existen en TNS | Los códigos `TSH`, `903841`, etc. pueden no existir como materiales | + +### En Firebird (validar con quien administra el LIS) +| Campo | Acción | +|---|---| +| ¿`RECEPCION.VIAINGRESO` existe? | Consultar esquema — NO existe en la BD actual | +| ¿`RECEPCION.MODALIDAD` existe? | Consultar esquema — NO existe en la BD actual | +| ¿Hay exámenes sin `FECHA_REPORTADO` válida? | Verificar registros con año 1900 en `FECHA_REPORTADO` | + +### En TNS (validar manualmente en portal.tns.co) +| Validación | Cómo verificar | +|---|---| +| Códigos de exámenes (`TSH`, `903841`, etc.) existen como Materiales | Ir a Inventario → Artículos en el portal | +| `finalidadTecnologiaSalud` que TNS genera para exámenes de laboratorio | Revisar un RDA ya creado en TNS | +| `conceptoRecaudo` que TNS asigna | Revisar un RDA ya creado en TNS | + +--- + +## 6. Normas de referencia + +| Norma | Sobre | En carpeta `/norma` | +|---|---|---| +| Res. 2275/2023 | **RIPS vigente** (formato de reporte a MinSalud) | ❌ Falta — agregar | +| Res. 558/2024 | Actualización RIPS | ❌ Falta — agregar | +| Res. 1884/2024 | Actualización RIPS | ❌ Falta — agregar | +| Res. 866/2021 | Datos clínicos para interoperabilidad IHCE | ✅ Está | +| Res. 1888/2025 | RDA — Resumen Digital de Atención (IHCE) | ✅ Está | +| Res. 1995/1999 | Normas historia clínica | ✅ Está | diff --git a/app/routes/automation.py b/app/routes/automation.py index 6c1c15d..81194a2 100644 --- a/app/routes/automation.py +++ b/app/routes/automation.py @@ -59,7 +59,7 @@ SELECT rel.PRECIO, rel.FECHA_REPORTADO, m.COD_ESPECIALIDAD, - r.USUARIO AS profesional + COALESCE(NULLIF(TRIM(r.USUARIO), ''), TRIM(m.CODIGO), '') AS profesional FROM RECEPCION r JOIN RELACION rel ON rel.IDRECEPCION = r.IDRECEPCION LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO diff --git a/app/routes/queries.py b/app/routes/queries.py index 1bb59f1..6c9d675 100644 --- a/app/routes/queries.py +++ b/app/routes/queries.py @@ -51,7 +51,7 @@ WHERE p.DOCIDENT = :doc_num""", rel.PRECIO, rel.FECHA_REPORTADO, m.COD_ESPECIALIDAD, - r.USUARIO AS profesional + COALESCE(NULLIF(TRIM(r.USUARIO), ''), TRIM(m.CODIGO), '') AS profesional FROM RECEPCION r JOIN RELACION rel ON rel.IDRECEPCION = r.IDRECEPCION LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO @@ -79,7 +79,7 @@ WHERE r.NUM_FACTURA = :num_factura""", rel.PRECIO, rel.FECHA_REPORTADO, m.COD_ESPECIALIDAD, - r.USUARIO AS profesional + COALESCE(NULLIF(TRIM(r.USUARIO), ''), TRIM(m.CODIGO), '') AS profesional FROM RECEPCION r JOIN RELACION rel ON rel.IDRECEPCION = r.IDRECEPCION LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO diff --git a/app/services/json_generator.py b/app/services/json_generator.py index 5aeef09..6975a23 100644 --- a/app/services/json_generator.py +++ b/app/services/json_generator.py @@ -22,7 +22,9 @@ def _fmt_datetime(val) -> str: return "" if hasattr(val, "strftime"): return val.strftime("%d/%m/%Y %H:%M:%S") + # Eliminar espacios dentro de la parte de hora ("06: 08: 29" → "06:08:29") s = str(val)[:19].replace("T", " ") + s = s.replace(": ", ":").replace(" :", ":") parts = s.split(" ") if len(parts) == 2: dp = parts[0].split("-") @@ -67,7 +69,7 @@ def generar_tercero_api(row: dict) -> dict: "zona1": "00", "clasificacion": "00", "nomRegTri": nombre_completo, - "telefono": str(row.get("TELEFONOS") or "").strip(), + "telefono": str(row.get("TELEFONOS") or "").strip() or "0000000", "email": (row.get("EMAIL") or "").strip() or f"{str(row.get('DOCIDENT') or 'paciente').strip()}@sinregistro.co", "inactivo": False, "privada": "N", @@ -101,7 +103,12 @@ def generar_rda_paciente(rows: list) -> dict: fecha = _fmt_fecha(h.get("FECHA_RECEPCION")) ingreso = _fmt_datetime(h.get("HORAINICIORECEPCION") or h.get("FECHA_RECEPCION")) - egreso = _fmt_datetime(h.get("FECHA_RECEPCION")) + # Egreso = última fecha de reporte válida entre los exámenes, o fecha de recepción + ultima_fecha = max( + (r.get("FECHA_REPORTADO") for r in rows if str(r.get("FECHA_REPORTADO") or "")[:4] != "1900"), + default=None, + ) + egreso = _fmt_datetime(ultima_fecha or h.get("FECHA_RECEPCION")) detalle_pedido = [] for row in rows: @@ -120,37 +127,53 @@ def generar_rda_paciente(rows: list) -> dict: "impConsumo": 0, "observacion": "", "profesional": str(h.get("profesional") or "").strip(), - "especialidad": str(row.get("COD_ESPECIALIDAD") or "").strip(), + "especialidad": (lambda e: e if e not in (".", "-", "0", "00") else "")(str(row.get("COD_ESPECIALIDAD") or "").strip()), "diagnosticoprincipal": str(h.get("DIAG_PPAL") or "").strip(), "fechaHoraRealizacion": fecha_real or egreso, }) autorizacion = str(h.get("AUTORIZACION") or "").strip() or None + nit_empresa = str(h.get("NIT_EMPRESA") or "").strip() + es_particular = nit_empresa.upper() in ("PART", "PARTICULAR", "", "0") + # Códigos configurados en TNS para este laboratorio (GET /v2/tablas/FormaPago/ObtenerFormasDePago) + cod_forma_pago = "CLIP" if es_particular else "INST" + + # tipousuario: usar TIPOUSUSISPRO; si es NULL derivar de TIPOUSU + NIT_EMPRESA + _TIPOUSU_MAP = {"1": "11", "5": "07"} # EPS→11, Póliza→07 + tipoususispro = str(h.get("TIPOUSUSISPRO") or "").strip() + if not tipoususispro: + tipousu = str(h.get("TIPOUSU") or "").strip() + tipoususispro = _TIPOUSU_MAP.get(tipousu, "12" if es_particular else "11") + + # viaIngreso y modalidadAtencion no existen en RECEPCION → valores fijos de laboratorio + via_ingreso = "01" # Demanda espontánea (pacientes llegan directo al lab) + modalidad = "01" # Intramural (laboratorio en sede fija) + return { "codigoPrefijo": str(h.get("PREFIJO") or "00").strip(), - "numero": "", + "numero": str(h.get("NUM_FACTURA") or "").strip(), "fecha": fecha, "codTercero": str(h.get("COD_PACIENTE") or "").strip(), "codVendedor": "00", - "codFormaPago": "CO", + "codFormaPago": cod_forma_pago, "codBanco": "00", "codigoCentroCosto": "00", "tipoIngreso": str(h.get("CLASEPROC") or "1").strip() or "1", "fechaHoraIngreso": ingreso, "fechaHoraEgreso": egreso, - "modalidadAtencion": "01", - "numeroContrato": str(h.get("NIT_EMPRESA") or "").strip(), + "modalidadAtencion": modalidad, + "numeroContrato": nit_empresa, "diagnosticoprincipal": str(h.get("DIAG_PPAL") or "").strip(), - "tipousuario": str(h.get("TIPOUSUSISPRO") or "12").strip(), - "viaIngreso": "01", + "tipousuario": tipoususispro, + "viaIngreso": via_ingreso, "esTerapia": False, "esProcedimiento": False, "numeroAutorizacion": autorizacion, "detallePedido": detalle_pedido, "detalleFormaPago": [{ - "codigoFormaPago": "CO", - "plazoDias": "0", + "codigoFormaPago": cod_forma_pago, + "plazoDias": "0" if es_particular else "30", "fechaVencimiento": fecha, "valor": str(int(float(h.get("VALORTOTAL") or 0))), }], diff --git a/norma/ANALISIS_CAMPOS_RIPS.md b/norma/ANALISIS_CAMPOS_RIPS.md new file mode 100644 index 0000000..096ea38 --- /dev/null +++ b/norma/ANALISIS_CAMPOS_RIPS.md @@ -0,0 +1,111 @@ +# Análisis de Campos RIPS vs Normas vigentes +**Fecha:** 2026-06-25 +**Proyecto:** rips_manager (TNS API v2) + +--- + +## 1. ¿Qué normas hay en esta carpeta? + +| PDF | Sobre qué trata | ¿Es RIPS? | +|-----|-----------------|-----------| +| Res. 866 de 2021 | Datos clínicos relevantes para interoperabilidad de Historia Clínica (IHCE) | ❌ No es RIPS | +| Res. 1888 de 2025 | Adopta el RDA (Resumen Digital de Atención) — historia clínica interoperable | ❌ No es RIPS | +| Res. 1995 de 1999 | Normas de manejo y custodia de historia clínica | ❌ No es RIPS | +| Anexo Técnico Res. 866 | Estructura técnica del conjunto de datos clínicos RDA/IHCE | ❌ No es RIPS | + +> **Importante:** RIPS está regido por **Res. 2275 de 2023** (vigente desde 1-abr-2024), actualizada por **Res. 558/2024** y **Res. 1884/2024**. Esa resolución NO está en esta carpeta. + +--- + +## 2. RIPS vigente: ¿qué campos exige Res. 2275/2023? + +Los campos del archivo `FVLH03404/ripsjson_FVLH03404.json` corresponden exactamente al formato Res. 2275: + +### A nivel de USUARIO (paciente): +| Campo | ¿Nuestro sistema lo envía? | Dónde | +|-------|---------------------------|-------| +| tipoDocumentoIdentificacion | ✅ | `tipoDocumento` en Tercero/Crear | +| numDocumentoIdentificacion | ✅ | `nit` en Tercero/Crear | +| fechaNacimiento | ✅ | `fechaNacimiento` en Tercero/Crear | +| codSexo | ✅ | `sexo` en Tercero/Crear | +| tipoUsuario | ✅ | `tipousuario` en RdaPaciente | +| codMunicipioResidencia | ✅ | `codigoCiudad` en Tercero/Crear | +| codZonaTerritorialResidencia | ✅ | `zona` en Tercero/Crear | +| codPaisResidencia | ❌ No enviamos | TNS lo gestiona con "170" por defecto | +| codPaisOrigen | ❌ No enviamos | TNS lo gestiona con "170" por defecto | +| incapacidad | ❌ No enviamos | TNS lo gestiona internamente | + +### A nivel de PROCEDIMIENTO (por examen): +| Campo | ¿Nuestro sistema lo envía? | Dónde | +|-------|---------------------------|-------| +| codProcedimiento | ✅ | `codigoMaterial` en detallePedido | +| fechaInicioAtencion | ✅ | `fechaHoraRealizacion` en detallePedido | +| codDiagnosticoPrincipal | ✅ | `diagnosticoprincipal` en detallePedido | +| vrServicio | ✅ | `valor` en detallePedido | +| finalidadTecnologiaSalud | ❌ No enviamos | **TNS lo gestiona — campo RIPS interno** | +| viaIngresoServicioSalud | ⚠️ Parcial | `viaIngreso: "01"` fijo en cabecera RDA | +| modalidadGrupoServicioTecSal | ❌ No enviamos | **TNS lo gestiona internamente** | +| grupoServicios | ❌ No enviamos | **TNS lo gestiona internamente** | +| codServicio | ❌ No enviamos | **TNS lo gestiona internamente** | +| valorPagoModerador | ❌ No enviamos | TNS pone 0 para particulares | +| conceptoRecaudo | ❌ No enviamos | **TNS lo gestiona internamente** | +| numAutorizacion | ✅ | `numeroAutorizacion` en RdaPaciente | +| idMIPRES | ❌ No enviamos | Opcional — solo si aplica MIPRES | +| tipoDoc/numDoc profesional | ⚠️ Parcial | Solo enviamos username (`profesional`) | + +--- + +## 3. ¿Los campos que no enviamos son un problema? + +**NO**, porque TNS API es un intermediario habilitado por MinSalud que: +1. Recibe nuestros datos en su formato simplificado (RdaPaciente/Insertar) +2. Completa internamente los campos RIPS (finalidad, grupoServicios, codServicio, conceptoRecaudo, etc.) basándose en la configuración del prestador (sucursal 81080) +3. Genera y transmite el RIPS completo en formato Res. 2275 al MinSalud + +**Los campos que sí debemos revisar:** + +| Campo | Riesgo | Acción | +|-------|--------|--------| +| `finalidadTecnologiaSalud` | Medio — varía por examen (23 vs 15 en el JSON antiguo) | TNS puede manejarlo por tipo de procedimiento | +| `viaIngresoServicioSalud` | Bajo — laboratorio siempre es "02" (Extramural) | Confirmar con TNS si aceptan fijo | +| Doc. del profesional (CC) | Bajo — TNS usa username del sistema | Si TNS lo requiere, agregar campo | + +--- + +## 4. Campos del RDA (Res. 1888/2025) que SÍ cubrimos + +La Res. 1888 define el "Resumen Digital de Atención" para IHCE (interoperabilidad). Estos campos coinciden con lo que ya enviamos a TNS: + +| Campo RDA | Nuestro campo TNS | +|-----------|-------------------| +| Municipio de residencia habitual | `codigoCiudad` | +| Zona territorial de residencia | `zona` | +| Fecha y hora de inicio de la atención | `fechaHoraIngreso` / `fechaHoraRealizacion` | +| Fecha y hora de fin de la atención | `fechaHoraEgreso` | +| Diagnóstico principal (CIE-10) | `diagnosticoprincipal` | +| Tipo de usuario | `tipousuario` | +| Profesional que realizó la atención | `profesional` | +| Grupo de servicios | `modalidadAtencion: "01"` (parcial) | + +--- + +## 5. Resoluciones RIPS vigentes (imagen historial CNT) + +Según el historial de resoluciones RIPS: +- **Res. 2275/2023** → vigente desde **1-abr-2024** (formato xml + json) +- **Res. 558/2024** → vigente desde **1-oct-2024** (actualización) +- **Res. 1884/2024** → vigente desde **1-oct-2024** (actualización) + +Estas son las normas que rigen el RIPS actual. **Ninguna está en la carpeta norma** — solo hay normas de RDA/IHCE. + +--- + +## 6. Conclusión + +✅ **Lo que hacemos está bien** para el flujo TNS API v2: +- Enviamos todos los campos que TNS requiere en su documentación +- TNS completa los campos RIPS internos (finalidad, grupoServicios, etc.) + +⚠️ **Recomendación**: Agregar a la carpeta `norma/` la **Res. 2275 de 2023** y la **Res. 558 de 2024** para tener la norma RIPS vigente de referencia. + +⚠️ **Pendiente confirmar con TNS**: Si `finalidadTecnologiaSalud` (campo que varía entre exámenes de laboratorio) debe venir de la BD del laboratorio y enviarse en el detallePedido.