Update DOCUMENTACION.md with complete project documentation

This commit is contained in:
Lizandro Guarnizo
2026-06-18 11:36:20 -05:00
parent 1e4b895913
commit 65ff7995e8
+450 -347
View File
@@ -1,347 +1,450 @@
# RIPS Manager — Documentación Técnica # RIPS Manager — Documentación Completa
Sistema web para generar y enviar JSON de RIPS (Res. 2275/2023) a una API, conectándose a una base de datos Firebird. **Desarrollado por [U-SITE SAS BIC](https://u-site.app/)**
--- **Repositorio**: `https://github.com/U-SITE-SAS-BIC/rips_manager`
## Arquitectura 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.
``` ---
┌─────────────┐ ┌──────────────────┐ ┌──────────────┐
│ Navegador │────▶│ FastAPI (8080) │────▶│ Firebird BD │ ## 1. Arquitectura
│ (Tailwind) │◀────│ + Jinja2 │◀────│ (datos) │
└─────────────┘ └──────────────────┘ └──────────────┘ ```
┌────────────────────┐
│ Navegador │
┌──────────────┐ │ Tailwind + CM │
│ SQLite │ └────────┬───────────┘
│ (app.db) │ │ HTTP
──────────────┘ ┌────────▼───────────
│ FastAPI (8080)
│ + Jinja2 │
┌──────────────┐ │ + Auth Middleware │
│ API externa │ └───┬────┬────┬──────┘
│ (envío RIPS) │ │
└──────────────┘ ┌──────────┘ │ └──────────
``` ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
## Stack técnico │ Firebird │ │ SQLite │ │ API externa │
│ (datos) │ │ (app.db) │ │ (receptor) │
| Componente | Tecnología | └──────────┘ └──────────┘ └──────────────┘
|---|---| ```
| Backend | Python 3.9+ / FastAPI |
| Frontend | Jinja2 + Tailwind CSS (CDN) + FontAwesome | ### Stack Tecnológico
| Base de datos app | SQLite (usuarios, config, logs, queries) |
| Base de datos datos | Firebird (vía `fdb`) | | Componente | Tecnología | Versión |
| Autenticación | JWT + bcrypt + HttpOnly cookies | |---|---|---|
| Cliente HTTP | httpx (async) | | Backend | FastAPI | 0.115.6 |
| Servidor | uvicorn | | Servidor ASGI | Uvicorn | 0.34.0 |
| Templates | Jinja2 | 3.1.5 |
--- | CSS | Tailwind CSS | CDN |
| Editor SQL | CodeMirror | 5.65.16 CDN |
## Endpoints (20 totales) | BD de la app | SQLite | — |
| BD de datos | Firebird | vía fdb >= 2.0.0 |
### Autenticación (6 endpoints) | Autenticación | python-jose (JWT) + bcrypt | 3.3.0 / 4.2.1 |
| Cliente HTTP | httpx | 0.28.1 |
| Método | Ruta | Descripción | Autenticación | | Multipart | python-multipart | 0.0.20 |
|---|---|---|---| | Archivos async | aiofiles | 24.1.0 |
| GET | `/auth/login` | Página de inicio de sesión | Pública |
| POST | `/auth/login` | Procesa login, devuelve cookie JWT | Pública | ---
| GET | `/auth/register` | Página de registro | Pública |
| POST | `/auth/register` | Registra nuevo usuario | Pública | ## 2. Endpoints (20 totales)
| GET | `/auth/logout` | Cierra sesión (elimina cookie) | Pública |
| POST | `/auth/api/login` | Login vía API (devuelve token JSON) | Pública | ### Autenticación — `app/routes/auth.py`
### Dashboard (1 endpoint) | Método | Ruta | Descripción | Auth |
|---|---|---|---|
| Método | Ruta | Descripción | Autenticación | | 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 | `/dashboard` | Estadísticas de envíos, últimos registros | Requerida | | GET | `/auth/register` | Página de registro | Pública |
| POST | `/auth/register` | Crea usuario (username, email, password) | Pública |
### Configuración (2 endpoints) | GET | `/auth/logout` | Elimina cookie, redirige a login | Pública |
| POST | `/auth/api/login` | Login API, devuelve `{"access_token": "...", "token_type": "bearer"}` | Pública |
| Método | Ruta | Descripción | Autenticación |
|---|---|---|---| ### Dashboard — `app/routes/dashboard.py`
| GET | `/config` | Página de configuración (Firebird + API + prestador) | Requerida |
| POST | `/config/save` | Guarda toda la configuración | Requerida | | Método | Ruta | Descripción | Auth |
|---|---|---|---|
### Consultas SQL (3 endpoints) | GET | `/dashboard` | Estadísticas: total envíos exitosos/errores, últimos 10 registros | Requerida |
| Método | Ruta | Descripción | Autenticación | ### Configuración — `app/routes/config.py`
|---|---|---|---|
| GET | `/queries` | Página de gestión de consultas SQL | Requerida | | Método | Ruta | Descripción | Auth |
| POST | `/queries/create` | Crea nueva consulta SQL | Requerida | |---|---|---|---|
| POST | `/queries/delete/{id}` | Elimina consulta SQL | Requerida | | GET | `/config` | Página de configuración (Firebird, API, prestador) | Requerida |
| POST | `/queries/update/{id}` | Actualiza consulta SQL | Requerida | | POST | `/config/save` | Guarda configuración (11 claves) | Requerida |
### Terceros (3 endpoints) ### Consultas SQL — `app/routes/queries.py`
| Método | Ruta | Descripción | Autenticación | | Método | Ruta | Descripción | Auth |
|---|---|---|---| |---|---|---|---|
| GET | `/terceros` | Página de envío de terceros | Requerida | | GET | `/queries` | Página con 3 pestañas: Probador / Constructor / Editor | Requerida |
| POST | `/terceros/test-connection` | Prueba conexión Firebird | Requerida | | POST | `/queries/run-sql` | Ejecuta SQL raw contra Firebird (max 200 filas) | Requerida |
| POST | `/terceros/preview` | Vista previa del JSON de terceros | Requerida | | POST | `/queries/test` | Prueba consulta guardada (max 20 filas) | Requerida |
| POST | `/terceros/send` | Genera y envía JSON de terceros a la API | Requerida | | POST | `/queries/esquema` | Devuelve esquema completo: tablas + columnas + tipos | Requerida |
| POST | `/queries/tablas` | Lista nombres de tablas | Requerida |
### Transacción RIPS (3 endpoints) | POST | `/queries/create` | Crea nueva consulta | Requerida |
| POST | `/queries/update/{id}` | Actualiza consulta | Requerida |
| Método | Ruta | Descripción | Autenticación | | POST | `/queries/delete/{id}` | Elimina consulta | Requerida |
|---|---|---|---|
| GET | `/transaccion` | Página de envío de transacción RIPS | Requerida | ### Terceros — `app/routes/terceros.py`
| 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 | | Método | Ruta | Descripción | Auth |
|---|---|---|---|
### Automatización (2 endpoints) | GET | `/terceros` | Página de envío de terceros | Requerida |
| POST | `/terceros/test-connection` | Prueba conexión Firebird | Requerida |
| Método | Ruta | Descripción | Autenticación | | POST | `/terceros/preview` | Vista previa del JSON de terceros | Requerida |
|---|---|---|---| | POST | `/terceros/send` | Genera y envía JSON de terceros a la API | Requerida |
| GET | `/automation` | Página de automatización 2 pasos | Requerida |
| POST | `/automation/run` | Ejecuta Paso 1 (terceros) + Paso 2 (transacción) | Requerida | ### Transacción RIPS — `app/routes/transaccion.py`
### Logs (1 endpoint) | Método | Ruta | Descripción | Auth |
|---|---|---|---|
| Método | Ruta | Descripción | Autenticación | | GET | `/transaccion` | Página de envío de transacción RIPS | Requerida |
|---|---|---|---| | POST | `/transaccion/preview` | Vista previa del JSON de transacción | Requerida |
| GET | `/logs` | Historial de envíos con filtros | Requerida | | POST | `/transaccion/send` | Genera y envía JSON de transacción a la API | Requerida |
--- ### Automatización — `app/routes/automation.py`
## Flujo de autenticación | Método | Ruta | Descripción | Auth |
|---|---|---|---|
``` | GET | `/automation` | Página de automatización (2 pasos) | Requerida |
Navegador Servidor | POST | `/automation/run` | Paso 1 (terceros) + Paso 2 (transacción) por rango de fechas | Requerida |
│ │
│── GET /auth/login ───────▶│ ### Logs — `app/routes/logs.py`
│◀──── HTML login page ─────│
│ │ | Método | Ruta | Descripción | Auth |
│── POST /auth/login ───────▶│ (username + password) |---|---|---|---|
│ │── verifica credenciales | GET | `/logs` | Historial de envíos con filtros (tipo, status, factura) | Requerida |
│ │── genera JWT
│◀── 302 /dashboard ────────│ (Set-Cookie: token=JWT; HttpOnly) ### Root
│ │
│── GET /dashboard ────────▶│ (Cookie: token=JWT) | Método | Ruta | Descripción | Auth |
│ │── middleware verifica JWT |---|---|---|---|
│ │── setea request.state.user | GET | `/` | Redirige a `/dashboard` | Pública |
│◀──── HTML dashboard ──────│
``` ---
- **Cookie HttpOnly**: no accesible desde JavaScript (seguridad XSS) ## 3. Modelo de Base de Datos
- **JWT expira en 12 horas**
- **Bearer token** también soportado para llamadas API (`Authorization: Bearer <token>`) ### SQLite (`rips_manager.db`)
--- #### Tabla `users`
| Columna | Tipo | Descripción |
## Flujo de envío de RIPS |---|---|---|
| id | INTEGER PK AUTOINCREMENT | ID único |
### Manual (página Terceros + Transacción) | username | TEXT UNIQUE NOT NULL | Nombre de usuario |
| email | TEXT UNIQUE NOT NULL | Correo electrónico |
``` | password_hash | TEXT NOT NULL | Hash bcrypt |
1. Configurar conexión Firebird y API (una vez) | created_at | TEXT DEFAULT datetime('now') | Fecha de creación |
2. Definir consultas SQL en "Consultas SQL"
3. Ir a "Terceros" → seleccionar consulta → "Vista Previa" → "Enviar a API" #### Tabla `config`
4. Ir a "Transacción RIPS" → seleccionar consulta + fechas → "Enviar a API" | Columna | Tipo | Descripción |
``` |---|---|---|
| id | INTEGER PK AUTOINCREMENT | ID único |
### Automatizado (página Automatización) | key | TEXT UNIQUE NOT NULL | Clave de configuración |
| value | TEXT | Valor |
```
1. Seleccionar consulta de terceros (Paso 1) **Claves predefinidas:**
2. Seleccionar consulta de transacción (Paso 2)
3. Definir rango de fechas | Clave | Default | Descripción |
4. "Ejecutar Automatización Completa" |---|---|---|
└── Paso 1: Envía todos los terceros del período | `firebird_host` | `localhost` | Host Firebird |
└── Paso 2: Envía todas las transacciones del período | `firebird_port` | `3050` | Puerto Firebird |
``` | `firebird_database` | — | Ruta BD Firebird |
| `firebird_user` | `SYSDBA` | Usuario Firebird |
### Estructura de los JSON generados | `firebird_password` | `masterkey` | Contraseña Firebird |
| `api_url` | — | URL de la API destino |
#### JSON Terceros | `api_method` | `POST` | Método HTTP (POST/PUT) |
```json | `api_key` | — | API Key (Bearer token) |
{ | `api_timeout` | `30` | Timeout en segundos |
"tipoDocumentoIdentificacion": "CC", | `num_documento_obligado` | — | NIT del prestador |
"numDocumentoIdentificacion": "27765610", | `cod_prestador` | — | Código del prestador |
"primerNombre": "MARIA",
"segundoNombre": "ELENA", #### Tabla `queries`
"primerApellido": "GOMEZ", | Columna | Tipo | Descripción |
"segundoApellido": "RUIZ", |---|---|---|
"fechaNacimiento": "1954-01-19", | id | INTEGER PK AUTOINCREMENT | ID único |
"codSexo": "F", | name | TEXT NOT NULL | Nombre descriptivo |
"codEntidadAdministradora": "EPS010", | query_type | TEXT NOT NULL | `terceros` o `transaccion` |
"tipoUsuario": "12", | query_text | TEXT NOT NULL | SQL con parámetros `:param` |
"codPaisResidencia": "170", | description | TEXT | Descripción |
"codMunicipioResidencia": "54001", | created_at | TEXT DEFAULT datetime('now') | Fecha de creación |
"codZonaTerritorialResidencia": "02",
"incapacidad": "NO", **Consultas por defecto** (3):
"codPaisOrigen": "170", 1. `Terceros - Datos del paciente` — Busca paciente por `:doc_num`
"direccionResidencia": "CRA 5 #10-20", 2. `Procedimientos por factura` — Busca servicios por `:factura`, `:fecha_ini`, `:fecha_fin`
"codZonaResidencia": "02" 3. `Procedimientos por fecha` — JOIN servicios + pacientes por rango de fechas
}
``` #### Tabla `envios`
| Columna | Tipo | Descripción |
#### JSON Transacción RIPS |---|---|---|
```json | id | INTEGER PK AUTOINCREMENT | ID único |
{ | user_id | INTEGER FK → users(id) | Usuario que envió |
"numDocumentoIdObligado": "900278729", | tipo | TEXT NOT NULL | `terceros` o `transaccion` |
"numFactura": "LHXC03404", | factura | TEXT | Número de factura |
"tipoNota": null, | fecha_inicio | TEXT | Inicio del rango |
"numNota": null, | fecha_fin | TEXT | Fin del rango |
"usuarios": [{ | pacientes_count | INTEGER DEFAULT 0 | Cantidad de pacientes |
"tipoDocumentoIdentificacion": "CC", | servicios_count | INTEGER DEFAULT 0 | Cantidad de servicios |
"numDocumentoIdentificacion": "27765610", | status | TEXT NOT NULL DEFAULT 'pendiente' | `success` o `error` |
"codEntidadAdministradora": "EPS010", | json_enviado | TEXT | JSON completo enviado |
"tipoUsuario": "12", | respuesta_api | TEXT | Respuesta de la API |
"fechaNacimiento": "1954-01-19", | codigo_cuv | TEXT | Código CUV (si aplica) |
"codSexo": "F", | created_at | TEXT DEFAULT datetime('now') | Fecha del envío |
"codPaisResidencia": "170",
"codMunicipioResidencia": "54001", ---
"codZonaTerritorialResidencia": "02",
"incapacidad": "NO", ## 4. Autenticación
"consecutivo": 1,
"codPaisOrigen": "170", ### Flujo Login
"servicios": { ```
"procedimientos": [{ Navegador Servidor
"consecutivo": 1, │ │
"codProcedimiento": "903841", │── POST /auth/login ──────▶│ (username + password)
"fechaInicioAtencion": "2026-06-11 00:00", │ │── verifica bcrypt
"codDiagnosticoPrincipal": "R790", │ │── genera JWT HS256
"codDiagnosticoRelacionado": null, │◀── 302 /dashboard ────────│ (Set-Cookie: token=JWT; HttpOnly)
"finalidadTecnologiaSalud": "23", │ │
"viaIngresoServicioSalud": "02", │── GET /dashboard ────────▶│ (Cookie: token=JWT)
"modalidadGrupoServicioTecSal": "01", │ │── middleware decodifica JWT
"grupoServicios": "02", │ │── request.state.user = payload
"codServicio": 706, │◀──── HTML dashboard ──────│
"codPrestador": "540010152002", ```
"tipoDocumentoIdentificacion": "CC",
"numDocumentoIdentificacion": "27898369", ### Middleware (`main.py:48-68`)
"vrServicio": 8000, - Rutas públicas: `/auth/login`, `/auth/register`, `/auth/api/login`, `/static/*`
"valorPagoModerador": 0, - Lee token de: `Cookie: token``Authorization: Bearer`
"conceptoRecaudo": "05", - Si inválido y `/api/` → 401 JSON; si HTML → redirect `/auth/login`
"numAutorizacion": null,
"idMIPRES": null, ### JWT
"codComplicacion": null, - Algoritmo: HS256
"numFEVPagoModerador": null - Clave: `rips-manager-secret-key-change-in-production`
}] - Payload: `{user_id, username}` (sin expiración)
}
}] ---
}
``` ## 5. Estructuras JSON
--- ### JSON Terceros (17 campos)
```json
## Base de datos SQLite (app) {
"tipoDocumentoIdentificacion": "CC",
### Tabla `users` "numDocumentoIdentificacion": "27765610",
| Columna | Tipo | Descripción | "primerNombre": "MARIA",
|---|---|---| "segundoNombre": "ELENA",
| id | INTEGER PK | Auto-incrementable | "primerApellido": "GOMEZ",
| username | TEXT UNIQUE | Nombre de usuario | "segundoApellido": "RUIZ",
| email | TEXT UNIQUE | Correo electrónico | "fechaNacimiento": "1954-01-19",
| password_hash | TEXT | Hash bcrypt de la contraseña | "codSexo": "F",
| created_at | TEXT | Fecha de creación | "codEntidadAdministradora": "EPS010",
"tipoUsuario": "01",
### Tabla `config` "codPaisResidencia": "170",
| Columna | Tipo | Descripción | "codMunicipioResidencia": "54001",
|---|---|---| "codZonaTerritorialResidencia": "01",
| id | INTEGER PK | Auto-incrementable | "incapacidad": "NO",
| key | TEXT UNIQUE | Clave de configuración | "codPaisOrigen": "170",
| value | TEXT | Valor | "direccionResidencia": "CRA 5 #10-20",
"codZonaResidencia": "01"
Claves predefinidas: }
- `firebird_host`, `firebird_port`, `firebird_database`, `firebird_user`, `firebird_password` ```
- `api_url`, `api_method`, `api_key`, `api_timeout`
- `num_documento_obligado`, `cod_prestador` ### JSON Procedimiento (20 campos P01-P20)
```json
### Tabla `queries` {
| Columna | Tipo | Descripción | "consecutivo": 1,
|---|---|---| "codProcedimiento": "903841",
| id | INTEGER PK | Auto-incrementable | "fechaInicioAtencion": "2026-06-11 00:00",
| name | TEXT | Nombre descriptivo | "codDiagnosticoPrincipal": "R790",
| query_type | TEXT | `terceros` o `transaccion` | "codDiagnosticoRelacionado": null,
| query_text | TEXT | Sentencia SQL con parámetros | "finalidadTecnologiaSalud": "23",
| description | TEXT | Descripción | "viaIngresoServicioSalud": "02",
| created_at | TEXT | Fecha de creación | "modalidadGrupoServicioTecSal": "01",
"grupoServicios": "02",
### Tabla `envios` "codServicio": 706,
| Columna | Tipo | Descripción | "codPrestador": "540010152002",
|---|---|---| "tipoDocumentoIdentificacion": "CC",
| id | INTEGER PK | Auto-incrementable | "numDocumentoIdentificacion": "27898369",
| user_id | INTEGER FK | Usuario que realizó el envío | "vrServicio": 8000,
| tipo | TEXT | `terceros` o `transaccion` | "valorPagoModerador": 0,
| factura | TEXT | Número de factura | "conceptoRecaudo": "05",
| fecha_inicio / fecha_fin | TEXT | Rango de fechas del envío | "numAutorizacion": null,
| pacientes_count / servicios_count | INTEGER | Cantidades | "idMIPRES": null,
| status | TEXT | `success` o `error` | "codComplicacion": null,
| json_enviado | TEXT | JSON completo enviado | "numFEVPagoModerador": null
| respuesta_api | TEXT | Respuesta de la API | }
| codigo_cuv | TEXT | Código CUV (si aplica) | ```
| created_at | TEXT | Fecha del envío |
### JSON Transacción
--- ```json
{
## Parámetros en consultas SQL "numDocumentoIdObligado": "900278729",
"numFactura": "LHXC03404",
Las consultas pueden usar estos parámetros que el sistema reemplaza automáticamente: "tipoNota": null,
"numNota": null,
| Parámetro | Ejemplo | Uso | "usuarios": [{
|---|---|---| "tipoDocumentoIdentificacion": "CC",
| `:doc_num` | `WHERE doc = :doc_num` | Filtrar por documento de paciente | "numDocumentoIdentificacion": "27765610",
| `:factura` | `WHERE fact = :factura` | Filtrar por número de factura | "codEntidadAdministradora": "EPS010",
| `:fecha_ini` | `WHERE fecha >= :fecha_ini` | Fecha inicio del rango | "tipoUsuario": "12",
| `:fecha_fin` | `WHERE fecha <= :fecha_fin` | Fecha fin del rango | "fechaNacimiento": "1954-01-19",
"codSexo": "F",
--- "codPaisResidencia": "170",
"codMunicipioResidencia": "54001",
## Estructura del proyecto "codZonaTerritorialResidencia": "02",
"incapacidad": "NO",
``` "consecutivo": 1,
rips_manager/ "codPaisOrigen": "170",
├── main.py # Entry point, middleware, rutas "servicios": {
├── requirements.txt # Dependencias Python "procedimientos": [
├── rips_manager.db # SQLite (autogenerado) { /* procedimiento */ }
├── DOCUMENTACION.md # Este archivo ]
├── README.md # Documentación de RIPS }
├── ejemplo_terceros.json # JSON de ejemplo terceros }]
├── ejemplo_transaccion_rips.json # JSON de ejemplo transacción }
├── app/ ```
│ ├── __init__.py
│ ├── auth.py # JWT, bcrypt, get_current_user ---
│ ├── database.py # SQLite init y conexión
│ ├── models.py # Pydantic models ## 6. Flujo de Datos
│ ├── routes/
│ │ ├── auth.py # Login, register, logout ### Terceros
│ │ ├── dashboard.py # Página principal con stats ```
│ │ ├── config.py # Configuración Firebird + API 1. Config → leer firebird_host, api_url, etc.
│ │ ├── queries.py # CRUD de consultas SQL 2. Firebird → conectar + ejecutar query → filas
│ │ ├── terceros.py # Generar y enviar JSON terceros 3. Mapear fila → JSON (generar_terceros)
│ │ ├── transaccion.py # Generar y enviar JSON transacción 4. httpx → POST/PUT {api_url}/terceros
│ │ ├── automation.py # Paso 1 + Paso 2 automático 5. Guardar en envios (JSON + respuesta)
│ │ └── logs.py # Historial de envíos ```
│ ├── services/
│ │ ├── firebird_service.py # Conexión y consultas Firebird ### Transacción
│ │ ├── json_generator.py # Construcción de JSON RIPS ```
│ │ └── api_client.py # Envío HTTP a API externa 1. Config → leer Firebird + API
│ └── templates/ # 10 plantillas Jinja2 + Tailwind 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
## Cómo ejecutar ```
```bash ### Automatización
cd /Users/lizandro/Documents/proyectos/rips_manager ```
pip3 install -r requirements.txt Paso 1: Terceros
python3 main.py - Query tipo 'terceros' por rango de fechas
``` - Deduplicar por documento
- Enviar cada uno
Abrir en el navegador: **http://localhost:8080**
Paso 2: Transacción
--- - Query tipo 'transaccion' por mismo rango
- Agrupar por factura
## Secuencia para primer uso - Enviar cada grupo agrupado
```
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 ## 7. Parámetros en Consultas SQL
5. Ir a **Consultas SQL** → ajustar las queries a los nombres reales de tablas
6. Usar **Terceros**, **Transacción RIPS** o **Automatización** | 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)