Fix JSON generation: numero factura, forma pago, tipousuario, hora format
- 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 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
f5cd5a233f
commit
0ec4ae3e66
@@ -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á |
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))),
|
||||
}],
|
||||
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user