Files
rips_manager/DOCUMENTACION.md
T

451 lines
16 KiB
Markdown

# RIPS Manager — Documentación Completa
**Desarrollado por [U-SITE SAS BIC](https://u-site.app/)**
**Repositorio**: `https://github.com/U-SITE-SAS-BIC/rips_manager`
Sistema web para generar y enviar JSON de RIPS (Registro Individual de Prestación de Servicios de Salud) según la **Resolución 2275 de 2023** del Ministerio de Salud y Protección Social de Colombia.
---
## 1. Arquitectura
```
┌────────────────────┐
│ Navegador │
│ Tailwind + CM │
└────────┬───────────┘
│ HTTP
┌────────▼───────────┐
│ FastAPI (8080) │
│ + Jinja2 │
│ + Auth Middleware │
└───┬────┬────┬──────┘
│ │ │
┌──────────┘ │ └──────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ Firebird │ │ SQLite │ │ API externa │
│ (datos) │ │ (app.db) │ │ (receptor) │
└──────────┘ └──────────┘ └──────────────┘
```
### Stack Tecnológico
| Componente | Tecnología | Versión |
|---|---|---|
| Backend | FastAPI | 0.115.6 |
| Servidor ASGI | Uvicorn | 0.34.0 |
| Templates | Jinja2 | 3.1.5 |
| CSS | Tailwind CSS | CDN |
| Editor SQL | CodeMirror | 5.65.16 CDN |
| BD de la app | SQLite | — |
| BD de datos | Firebird | vía fdb >= 2.0.0 |
| Autenticación | python-jose (JWT) + bcrypt | 3.3.0 / 4.2.1 |
| Cliente HTTP | httpx | 0.28.1 |
| Multipart | python-multipart | 0.0.20 |
| Archivos async | aiofiles | 24.1.0 |
---
## 2. Endpoints (20 totales)
### Autenticación — `app/routes/auth.py`
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/auth/login` | Página de inicio de sesión | Pública |
| POST | `/auth/login` | Procesa login, setea cookie HttpOnly con JWT | Pública |
| GET | `/auth/register` | Página de registro | Pública |
| POST | `/auth/register` | Crea usuario (username, email, password) | Pública |
| GET | `/auth/logout` | Elimina cookie, redirige a login | Pública |
| POST | `/auth/api/login` | Login API, devuelve `{"access_token": "...", "token_type": "bearer"}` | Pública |
### Dashboard — `app/routes/dashboard.py`
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/dashboard` | Estadísticas: total envíos exitosos/errores, últimos 10 registros | Requerida |
### Configuración — `app/routes/config.py`
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/config` | Página de configuración (Firebird, API, prestador) | Requerida |
| POST | `/config/save` | Guarda configuración (11 claves) | Requerida |
### Consultas SQL — `app/routes/queries.py`
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/queries` | Página con 3 pestañas: Probador / Constructor / Editor | Requerida |
| POST | `/queries/run-sql` | Ejecuta SQL raw contra Firebird (max 200 filas) | Requerida |
| POST | `/queries/test` | Prueba consulta guardada (max 20 filas) | Requerida |
| POST | `/queries/esquema` | Devuelve esquema completo: tablas + columnas + tipos | Requerida |
| POST | `/queries/tablas` | Lista nombres de tablas | Requerida |
| POST | `/queries/create` | Crea nueva consulta | Requerida |
| POST | `/queries/update/{id}` | Actualiza consulta | Requerida |
| POST | `/queries/delete/{id}` | Elimina consulta | Requerida |
### Terceros — `app/routes/terceros.py`
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/terceros` | Página de envío de terceros | Requerida |
| POST | `/terceros/test-connection` | Prueba conexión Firebird | Requerida |
| POST | `/terceros/preview` | Vista previa del JSON de terceros | Requerida |
| POST | `/terceros/send` | Genera y envía JSON de terceros a la API | Requerida |
### Transacción RIPS — `app/routes/transaccion.py`
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/transaccion` | Página de envío de transacción RIPS | Requerida |
| POST | `/transaccion/preview` | Vista previa del JSON de transacción | Requerida |
| POST | `/transaccion/send` | Genera y envía JSON de transacción a la API | Requerida |
### Automatización — `app/routes/automation.py`
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/automation` | Página de automatización (2 pasos) | Requerida |
| POST | `/automation/run` | Paso 1 (terceros) + Paso 2 (transacción) por rango de fechas | Requerida |
### Logs — `app/routes/logs.py`
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/logs` | Historial de envíos con filtros (tipo, status, factura) | Requerida |
### Root
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
| GET | `/` | Redirige a `/dashboard` | Pública |
---
## 3. Modelo de Base de Datos
### SQLite (`rips_manager.db`)
#### Tabla `users`
| Columna | Tipo | Descripción |
|---|---|---|
| id | INTEGER PK AUTOINCREMENT | ID único |
| username | TEXT UNIQUE NOT NULL | Nombre de usuario |
| email | TEXT UNIQUE NOT NULL | Correo electrónico |
| password_hash | TEXT NOT NULL | Hash bcrypt |
| created_at | TEXT DEFAULT datetime('now') | Fecha de creación |
#### Tabla `config`
| Columna | Tipo | Descripción |
|---|---|---|
| id | INTEGER PK AUTOINCREMENT | ID único |
| key | TEXT UNIQUE NOT NULL | Clave de configuración |
| value | TEXT | Valor |
**Claves predefinidas:**
| Clave | Default | Descripción |
|---|---|---|
| `firebird_host` | `localhost` | Host Firebird |
| `firebird_port` | `3050` | Puerto Firebird |
| `firebird_database` | — | Ruta BD Firebird |
| `firebird_user` | `SYSDBA` | Usuario Firebird |
| `firebird_password` | `masterkey` | Contraseña Firebird |
| `api_url` | — | URL de la API destino |
| `api_method` | `POST` | Método HTTP (POST/PUT) |
| `api_key` | — | API Key (Bearer token) |
| `api_timeout` | `30` | Timeout en segundos |
| `num_documento_obligado` | — | NIT del prestador |
| `cod_prestador` | — | Código del prestador |
#### Tabla `queries`
| Columna | Tipo | Descripción |
|---|---|---|
| id | INTEGER PK AUTOINCREMENT | ID único |
| name | TEXT NOT NULL | Nombre descriptivo |
| query_type | TEXT NOT NULL | `terceros` o `transaccion` |
| query_text | TEXT NOT NULL | SQL con parámetros `:param` |
| description | TEXT | Descripción |
| created_at | TEXT DEFAULT datetime('now') | Fecha de creación |
**Consultas por defecto** (3):
1. `Terceros - Datos del paciente` — Busca paciente por `:doc_num`
2. `Procedimientos por factura` — Busca servicios por `:factura`, `:fecha_ini`, `:fecha_fin`
3. `Procedimientos por fecha` — JOIN servicios + pacientes por rango de fechas
#### Tabla `envios`
| Columna | Tipo | Descripción |
|---|---|---|
| id | INTEGER PK AUTOINCREMENT | ID único |
| user_id | INTEGER FK → users(id) | Usuario que envió |
| tipo | TEXT NOT NULL | `terceros` o `transaccion` |
| factura | TEXT | Número de factura |
| fecha_inicio | TEXT | Inicio del rango |
| fecha_fin | TEXT | Fin del rango |
| pacientes_count | INTEGER DEFAULT 0 | Cantidad de pacientes |
| servicios_count | INTEGER DEFAULT 0 | Cantidad de servicios |
| status | TEXT NOT NULL DEFAULT 'pendiente' | `success` o `error` |
| json_enviado | TEXT | JSON completo enviado |
| respuesta_api | TEXT | Respuesta de la API |
| codigo_cuv | TEXT | Código CUV (si aplica) |
| created_at | TEXT DEFAULT datetime('now') | Fecha del envío |
---
## 4. Autenticación
### Flujo Login
```
Navegador Servidor
│ │
│── POST /auth/login ──────▶│ (username + password)
│ │── verifica bcrypt
│ │── genera JWT HS256
│◀── 302 /dashboard ────────│ (Set-Cookie: token=JWT; HttpOnly)
│ │
│── GET /dashboard ────────▶│ (Cookie: token=JWT)
│ │── middleware decodifica JWT
│ │── request.state.user = payload
│◀──── HTML dashboard ──────│
```
### Middleware (`main.py:48-68`)
- Rutas públicas: `/auth/login`, `/auth/register`, `/auth/api/login`, `/static/*`
- Lee token de: `Cookie: token``Authorization: Bearer`
- Si inválido y `/api/` → 401 JSON; si HTML → redirect `/auth/login`
### JWT
- Algoritmo: HS256
- Clave: `rips-manager-secret-key-change-in-production`
- Payload: `{user_id, username}` (sin expiración)
---
## 5. Estructuras JSON
### JSON Terceros (17 campos)
```json
{
"tipoDocumentoIdentificacion": "CC",
"numDocumentoIdentificacion": "27765610",
"primerNombre": "MARIA",
"segundoNombre": "ELENA",
"primerApellido": "GOMEZ",
"segundoApellido": "RUIZ",
"fechaNacimiento": "1954-01-19",
"codSexo": "F",
"codEntidadAdministradora": "EPS010",
"tipoUsuario": "01",
"codPaisResidencia": "170",
"codMunicipioResidencia": "54001",
"codZonaTerritorialResidencia": "01",
"incapacidad": "NO",
"codPaisOrigen": "170",
"direccionResidencia": "CRA 5 #10-20",
"codZonaResidencia": "01"
}
```
### JSON Procedimiento (20 campos P01-P20)
```json
{
"consecutivo": 1,
"codProcedimiento": "903841",
"fechaInicioAtencion": "2026-06-11 00:00",
"codDiagnosticoPrincipal": "R790",
"codDiagnosticoRelacionado": null,
"finalidadTecnologiaSalud": "23",
"viaIngresoServicioSalud": "02",
"modalidadGrupoServicioTecSal": "01",
"grupoServicios": "02",
"codServicio": 706,
"codPrestador": "540010152002",
"tipoDocumentoIdentificacion": "CC",
"numDocumentoIdentificacion": "27898369",
"vrServicio": 8000,
"valorPagoModerador": 0,
"conceptoRecaudo": "05",
"numAutorizacion": null,
"idMIPRES": null,
"codComplicacion": null,
"numFEVPagoModerador": null
}
```
### JSON Transacción
```json
{
"numDocumentoIdObligado": "900278729",
"numFactura": "LHXC03404",
"tipoNota": null,
"numNota": null,
"usuarios": [{
"tipoDocumentoIdentificacion": "CC",
"numDocumentoIdentificacion": "27765610",
"codEntidadAdministradora": "EPS010",
"tipoUsuario": "12",
"fechaNacimiento": "1954-01-19",
"codSexo": "F",
"codPaisResidencia": "170",
"codMunicipioResidencia": "54001",
"codZonaTerritorialResidencia": "02",
"incapacidad": "NO",
"consecutivo": 1,
"codPaisOrigen": "170",
"servicios": {
"procedimientos": [
{ /* procedimiento */ }
]
}
}]
}
```
---
## 6. Flujo de Datos
### Terceros
```
1. Config → leer firebird_host, api_url, etc.
2. Firebird → conectar + ejecutar query → filas
3. Mapear fila → JSON (generar_terceros)
4. httpx → POST/PUT {api_url}/terceros
5. Guardar en envios (JSON + respuesta)
```
### Transacción
```
1. Config → leer Firebird + API
2. Firebird → ejecutar query → filas
3. Agrupar por (factura, paciente)
4. Cada grupo → JSON (generar_transaccion)
5. Cada grupo → httpx → {api_url}/transaccion
6. Cada envío → log en envios
```
### Automatización
```
Paso 1: Terceros
- Query tipo 'terceros' por rango de fechas
- Deduplicar por documento
- Enviar cada uno
Paso 2: Transacción
- Query tipo 'transaccion' por mismo rango
- Agrupar por factura
- Enviar cada grupo agrupado
```
---
## 7. Parámetros en Consultas SQL
| Parámetro | Ejemplo | Descripción |
|---|---|---|
| `:doc_num` | `WHERE doc = :doc_num` | Filtrar por documento |
| `:factura` | `WHERE factura = :factura` | Filtrar por factura |
| `:fecha_ini` | `WHERE fecha >= :fecha_ini` | Fecha inicio |
| `:fecha_fin` | `WHERE fecha <= :fecha_fin` | Fecha fin |
---
## 8. Estructura del Proyecto
```
rips_manager/
├── main.py # Entry point, middleware, rutas
├── requirements.txt # 9 dependencias
├── rips_manager.db # SQLite (autogenerado)
├── README.md # Documentación de usuario
├── DOCUMENTACION.md # Documentación técnica
├── ejemplo_terceros.json # JSON ejemplo
├── ejemplo_transaccion_rips.json # JSON ejemplo
├── arrancar.sh # Inicio macOS/Linux
├── run.bat # Inicio Windows (minimizado)
├── run.ps1 # Inicio Windows PowerShell
├── run.vbs # Inicio Windows (sin ventana)
├── stop.bat # Detener servidor
├── app/
│ ├── __init__.py
│ ├── auth.py # JWT, bcrypt, get_current_user
│ ├── database.py # SQLite init y conexión
│ ├── models.py # Pydantic models
│ ├── routes/
│ │ ├── __init__.py
│ │ ├── auth.py # Login, register, logout
│ │ ├── dashboard.py # Estadísticas
│ │ ├── config.py # Configuración
│ │ ├── queries.py # CRUD + Probador + Constructor
│ │ ├── terceros.py # Envío terceros
│ │ ├── transaccion.py # Envío transacción
│ │ ├── automation.py # Automatización 2 pasos
│ │ └── logs.py # Historial
│ ├── services/
│ │ ├── __init__.py
│ │ ├── firebird_service.py # Conexión y consultas Firebird
│ │ ├── json_generator.py # Construcción de JSON RIPS
│ │ └── api_client.py # Envío HTTP
│ └── templates/
│ ├── base.html # Layout (sidebar, Tailwind, CodeMirror, FontAwesome)
│ ├── login.html
│ ├── register.html
│ ├── dashboard.html
│ ├── config.html
│ ├── queries.html # Probador / Constructor / Editor
│ ├── terceros.html
│ ├── transaccion.html
│ ├── automation.html
│ └── logs.html
```
---
## 9. Cómo Ejecutar
### Windows
```powershell
git clone https://github.com/U-SITE-SAS-BIC/rips_manager.git
cd rips_manager
powershell -ExecutionPolicy Bypass -File run.ps1
```
O doble clic en `run.bat` (inicia minimizado).
### macOS / Linux
```bash
git clone https://github.com/U-SITE-SAS-BIC/rips_manager.git
cd rips_manager
chmod +x arrancar.sh
./arrancar.sh
```
### Acceder
- Local: `http://localhost:8080`
- Red: `http://<IP_LOCAL>:8080`
---
## 10. Primer Uso
1. Abrir `http://localhost:8080/auth/register`
2. Crear usuario y contraseña
3. Iniciar sesión
4. Ir a **Configuración** → configurar Firebird, API, datos del prestador
5. Ir a **Consultas SQL** → ajustar/queries a nombres reales de tablas
6. Usar el **Probador** para probar consultas
7. Usar **Terceros**, **Transacción RIPS** o **Automatización**
---
## 11. Créditos
© 2026 **U-SITE SAS BIC** — Todos los derechos reservados.
- **Web**: [https://u-site.app/](https://u-site.app/)
- **Sistema**: RIPS Manager v1.0
- **Propósito**: Generación y envío de RIPS según Res. 2275/2023
- **Campos cubiertos**: Procedimientos (20 campos P01-P20 del Anexo Técnico 1)