Universidad Nacional Sede Región Brunca | II Ciclo 2025
Vitalis DB es una solución empresarial de gestión hospitalaria construida sobre Oracle 19c, diseñada para optimizar la administración de centros de salud mediante automatización inteligente, alta disponibilidad y seguridad robusta.
| Característica | Beneficio |
|---|---|
| 🔄 Alta Disponibilidad | Sistema standby con sincronización automática cada 5 minutos |
| 🤖 Automatización Completa | Jobs programados para mantenimiento, notificaciones y auditoría |
| 🔐 Seguridad Multinivel | Roles, perfiles, encriptación y auditoría completa |
| 📧 Notificaciones Inteligentes | Sistema de emails directo desde Oracle con encriptación |
| 📊 Gestión Financiera | Control completo de planillas, pagos y reportes bancarios |
| 🐳 Containerizado | Despliegue rápido con Docker Compose |
| Aplicar modelos relacionales avanzados para sistemas de salud con normalización óptima | Implementar soluciones de alta disponibilidad con Oracle Data Guard y automatización | Establecer capas de seguridad con roles, encriptación y auditoría completa |
✨ Características Destacadas
├── 📝 Auto-registro de personal médico y administrativo
├── ✅ Sistema de aprobación por administradores
├── 🔑 Generación automática de usuarios y credenciales
├── 👤 Gestión completa de perfiles y permisos por rol
├── 💳 Registro de información bancaria para pagos electrónicos
├── 📄 Control de documentación y requisitos por puesto
└── 🔒 Desactivación automática por inactividad (90 días)
- 🏥 Registro y gestión de centros médicos con jerarquía regional
- ⏰ Control de puestos médicos y asignación de turnos
- 💉 Catálogo de procedimientos médicos con tarifas
- 📅 Escalas de atención base y mensuales automatizadas
- 💰 Sistema de cobros y control de pagos por servicios
- 📊 Reportes operativos por centro y región
| Módulo | Funcionalidad |
|---|---|
| Tipos de Planilla | Creación y configuración de planillas personalizadas |
| Generación Automática | Procesamiento mensual de planillas por procedimiento |
| Comprobantes Digitales | Envío automático de comprobantes por email |
| Control de Deducciones | Gestión de movimientos, descuentos y bonificaciones |
| Reportes Bancarios | Archivos de depósito masivo para bancos |
| Auditoría Completa | Trazabilidad de todos los pagos y modificaciones |
- 📈 Resúmenes mensuales de ingresos y gastos consolidados
- 🏥 Reportes por centro de salud con desglose detallado
- 💵 Control de transacciones con auditoría temporal
- 📉 Análisis de tendencias y proyecciones financieras
- 🧾 Integración bancaria para conciliación automática
graph TB
A[👤 Usuario] --> B{Autenticación}
B -->|Válido| C[Roles Oracle]
B -->|Inválido| Z[❌ Acceso Denegado]
C --> D[ROL_ADMIN]
C --> E[ROL_MEDICO]
C --> F[ROL_ADMINISTRATIVO]
D --> G[Perfiles de Usuario]
E --> G
F --> G
G --> H[Control por Pantalla]
H --> I[📊 Acceso a Datos]
I --> J[Auditoría/Bitácora]
| Capa | Componente | Descripción |
|---|---|---|
| 1️⃣ | Autenticación Oracle | Usuarios nativos con contraseñas encriptadas |
| 2️⃣ | Roles Funcionales | ROL_ADMIN, ROL_MEDICO, ROL_ADMINISTRATIVO |
| 3️⃣ | Perfiles de Usuario | Control granular por funcionalidad y pantalla |
| 4️⃣ | Procedimientos Seguros | Asignación automática de permisos al crear usuarios |
| 5️⃣ | Auditoría Completa | Bitácora de todas las operaciones críticas |
| 6️⃣ | Encriptación | Claves de email y datos sensibles encriptados |
-- Integración con Brevo API
PKG_BREVO_MAIL
├── Configuración parametrizada (host, puerto, credenciales)
├── Encriptación de claves con DBMS_CRYPTO
├── Envío directo desde Oracle sin middleware
├── Templates HTML personalizables
└── Log de envíos para auditoría✨ Funcionalidades de Notificación:
- 📬 Comprobantes de pago automáticos
⚠️ Alertas de mantenimiento y tablespaces- 🔧 Reportes de objetos inválidos
- 👤 Notificaciones de desactivación de usuarios
- 📊 Reportes de jobs ejecutados
🏥 vitalis_db/
│
├── 📄 LICENSE # Licencia del proyecto
├── 📄 README.md # Documentación principal
├── 📄 vitalis_script.SQL # Script consolidado de la BD
├── 🖼️ Vitalis.png # Logo oficial del proyecto
├── 📄 Vitalis.txp # Modelo ER de base de datos
│
├── 📁 PadronNacional/ # Datos demográficos nacionales
│ └── 🗂️ Información del padrón para validación de identidades
│
├── 📁 Primary/ # Configuración Base de Datos Principal
│ ├── 📁 Documentation/
│ │ ├── 📋 BITACORA.md # Sistema de auditoría
│ │ └── 📖 Jobs_Manual.md # Guía de configuración de Jobs
│ │
│ └── 📁 Scripts/
│ ├── 🗄️ tablespace.sql # Definición de tablespaces
│ ├── 📊 schema.sql # Esquema principal de la BD
│ ├── 🔐 seguridad_roles.sql # Roles y permisos
│ ├── ⚡ triggers.sql # Triggers principales
│ ├── 📂 DATA_DIR.sql # Configuración de directorios
│ │
│ ├── 📁 start/ # Scripts de inicialización
│ │ ├── personas.sql # Datos de personas
│ │ ├── centrosalud.sql # Centros de salud
│ │ ├── escalasbase.sql # Escalas de atención
│ │ ├── procedimientos_medicos.sql
│ │ ├── tipos_planillas.sql
│ │ ├── pre-binnacle.sql # Pre-configuración auditoría
│ │ ├── pre-job.sql # Pre-configuración jobs
│ │ └── pre-spreadsheet.sql # Pre-configuración planillas
│ │
│ ├── 📁 binnacle/ # Sistema de auditoría
│ │ └── triggers.sql # Triggers de bitácora
│ │
│ ├── 📁 email/ # Sistema de notificaciones
│ │ ├── email_parameters.sql # Configuración SMTP
│ │ └── start_email.sql # Inicialización de email
│ │
│ ├── 📁 packages/ # Paquetes PL/SQL
│ │ └── PKG_BREVO_MAIL.sql # API de envío de emails
│ │
│ ├── 📁 procedure/ # Procedimientos almacenados
│ │ ├── GENERATE_PLANILLAS_FULL.sql
│ │ ├── DESACTIVATE_USERS.sql
│ │ ├── VERIFY_TABLESPACES.sql
│ │ ├── VERIFY_INDEXES.sql
│ │ ├── VERIFY_INVALID_OBJECTS.sql
│ │ ├── SCALEMONTHLY.sql
│ │ ├── JOBS_LOG.sql
│ │ └── send_email_planilla.sql
│ │
│ ├── 📁 jobs/ # Definición de Jobs Oracle
│ │ ├── DESACTIVATE_USERS.sql # Job mensual inactividad
│ │ ├── VERIFY_TABLESPACES.sql # Job diario espacios
│ │ ├── VERIFY_INDEXES.sql # Job diario índices
│ │ └── VERIFY_INVALID_OBJECTS.sql
│ │
│ └── 📁 test/ # Scripts de prueba
│ ├── test-binnacle.sql
│ ├── test-jobs.sql
│ ├── test-scale.sql
│ ├── test-spreadsheet.sql
│ └── test-roles.sql
│
└── 📁 standby/ # Alta Disponibilidad
├── 🐳 docker-compose.yml # Orquestación de contenedores
├── 🐳 Dockerfile.vitalis-primary
├── 🐳 Dockerfile.vitalis-standby
│
├── 📁 Documentation/
│ ├── 🔧 DBEAVER-CONFIG.md # Configuración cliente DBeaver
│ ├── 🐋 oracle-docker-guide.md # Guía Oracle en Docker
│ ├── 🔄 SWITCHOVER-GUIDE.md # Proceso completo de switchover
│ └── ⚡ SWITCHOVER-QUICK.md # Guía rápida de switchover
│
└── 📁 scripts/
├── 📁 main/ # Scripts para servidor principal
│ ├── backup_vitalis.sh # Backup manual
│ ├── daily_backup.sh # Backup automático diario
│ ├── initialize_vitalis.sh # Inicialización primaria
│ ├── purge_applied_logs.sh # Limpieza de logs aplicados
│ └── purge_complete_logs_in_standby.sh
│
├── 📁 standby/ # Scripts para servidor standby
│ ├── initialize_vitalis.sh # Inicialización standby
│ ├── switchover_to_primary.sh # Conversión a primaria
│ ├── fix_listener.sh # Reparación de listener
│ ├── delete_obsolete_vitalis.sh
│ ├── purge_applied_logs.sh
│ └── purge_complete_logs_in_standby.sh
│
└── 📁 test/ # Scripts de validación
├── check_sync_status.sql # Estado de sincronización
├── test-primary.sql # Test servidor principal
└── test-standby.sql # Test servidor standby
| Categoría | Tecnología | Versión | Propósito |
|---|---|---|---|
| 💾 Base de Datos | Oracle Database | 19c Enterprise | Motor principal de datos |
| 🔄 Replicación | Oracle Data Guard | 19c | Alta disponibilidad y DR |
| 🐳 Containerización | Docker | Latest | Aislamiento y portabilidad |
| 🎼 Orquestación | Docker Compose | Latest | Gestión multi-contenedor |
| 📧 Email Service | Brevo API | v3 | Envío de notificaciones |
| 💻 Scripting | Bash/Shell | - | Automatización y mantenimiento |
| 🗂️ Modelado | Oracle SQL Developer | - | Diseño ER y modelado |
| 🔍 Cliente DB | DBeaver | Community | Administración y testing |
┌─────────────────────────────────────────────────────────────┐
│ PRODUCCIÓN │
├─────────────────────────────────────────────────────────────┤
│ 🐳 Container: vitalis-primary │
│ ├── Oracle 19c (Modo READ WRITE) │
│ ├── Data Guard (Primaria) │
│ ├── Archive Logs (Generación) │
│ ├── Jobs Automáticos (Activos) │
│ └── Backups Diarios │
│ │
│ 📡 Sincronización Automática │
│ ├── Frecuencia: 5 min o 50 MB │
│ ├── Protocolo: Archive Log Shipping │
│ └── Validación: Cada 10 minutos │
│ │
│ 🐳 Container: vitalis-standby │
│ ├── Oracle 19c (Modo MOUNT) │
│ ├── Data Guard (Standby Física) │
│ ├── Archive Logs (Aplicación) │
│ ├── Recuperación Automática │
│ └── Backup Reception │
└─────────────────────────────────────────────────────────────┘
|
🖥️ Software Requerido
|
🌐 Configuración de Red
|
git clone https://github.com/kjarj54/vitalis_db.git
cd vitalis_db# Levantar contenedores con Docker Compose
cd standby
docker-compose up -d
# Verificar que los contenedores están corriendo
docker ps
# Conectar al contenedor principal
docker exec -it vitalis-primary /bin/bashEjecutar scripts en orden dentro del contenedor:
-- 1. Conectar como SYS
sqlplus sys/VITALIS as sysdba
-- 2. Crear tablespaces
@Primary/Scripts/tablespace.sql
-- 3. Crear directorios de datos
@Primary/Scripts/DATA_DIR.sql
-- 4. Crear esquema principal
@Primary/Scripts/schema.sql
-- 5. Configurar seguridad
@Primary/Scripts/seguridad_roles.sql
-- 6. Cargar datos iniciales
@Primary/Scripts/start/pre-paises.sql
@Primary/Scripts/start/personas.sql
@Primary/Scripts/start/centrosalud.sql
@Primary/Scripts/start/escalasbase.sql
@Primary/Scripts/start/procedimientos_medicos.sql
@Primary/Scripts/start/tipos_planillas.sql
@Primary/Scripts/start/tipos_procedimientos.sql
@Primary/Scripts/start/movimientos.sql
@Primary/Scripts/start/puestoTurno.sql
-- 7. Configurar sistema de auditoría
@Primary/Scripts/start/pre-binnacle.sql
@Primary/Scripts/binnacle/triggers.sql
-- 8. Configurar sistema de emails
@Primary/Scripts/email/start_email.sql
@Primary/Scripts/email/email_parameters.sql
@Primary/Scripts/packages/PKG_BREVO_MAIL.sql
-- 9. Configurar Jobs automáticos
@Primary/Scripts/start/pre-job.sql
@Primary/Scripts/procedure/JOBS_LOG.sql
@Primary/Scripts/procedure/DESACTIVATE_USERS.sql
@Primary/Scripts/procedure/VERIFY_TABLESPACES.sql
@Primary/Scripts/procedure/VERIFY_INDEXES.sql
@Primary/Scripts/procedure/VERIFY_INVALID_OBJECTS.sql
-- 10. Crear Jobs
@Primary/Scripts/jobs/DESACTIVATE_USERS.sql
@Primary/Scripts/jobs/VERIFY_TABLESPACES.sql
@Primary/Scripts/jobs/VERIFY_INDEXES.sql
@Primary/Scripts/jobs/VERIFY_INVALID_OBJECTS.sql
-- 11. Configurar planillas
@Primary/Scripts/start/pre-spreadsheet.sql
@Primary/Scripts/procedure/GENERATE_PLANILLAS_FULL.sql
@Primary/Scripts/procedure/SCALEMONTHLY.sql
@Primary/Scripts/procedure/send_email_planilla.sql
-- 12. Crear triggers principales
@Primary/Scripts/triggers.sql# Desde el host, ejecutar script de inicialización
cd standby/scripts/standby
./initialize_vitalis.sh-- En el contenedor primary
sqlplus sys/VITALIS as sysdba
@standby/scripts/test/test-primary.sql
-- En el contenedor standby
sqlplus sys/VITALISSB as sysdba
@standby/scripts/test/test-standby.sql
@standby/scripts/test/check_sync_status.sql# Ejecutar suite completa de pruebas
cd Primary/Scripts/test
# Probar sistema de auditoría
sqlplus ADMIN_VITALIS/VITALIS@//localhost:1521/VITALIS
@test-binnacle.sql
# Probar Jobs
@test-jobs.sql
# Probar sistema de roles
@test-roles.sql
# Probar generación de planillas
@test-spreadsheet.sql
@test-scale.sql
# Probar envío de emails
@test-port-email.sqlgraph LR
A[🏥 Aplicación] --> B[vitalis-primary<br/>READ-WRITE]
B -->|Archive Logs| C[📦 Archive Area]
C -->|Transfer<br/>5min/50MB| D[📦 Standby Archive]
D -->|Apply| E[vitalis-standby<br/>MOUNT]
B -.->|Backup Diario| F[💾 Backup Storage]
F -.->|Transfer| E
E -->|Switchover| G[🔄 Nueva Primary]
style B fill:#4CAF50,stroke:#333,stroke-width:2px,color:#fff
style E fill:#2196F3,stroke:#333,stroke-width:2px,color:#fff
style G fill:#FF9800,stroke:#333,stroke-width:2px,color:#fff
| Característica | Configuración | Beneficio |
|---|---|---|
| 🔄 Sincronización | Cada 5 min o 50 MB | Pérdida de datos < 5 minutos |
| 📦 Transfer Service | Automático cada 10 min | Replicación continua |
| 🧹 Limpieza Automática | Archivos > 3 días | Optimización de espacio |
| 💾 Backup Diario | 2:00 AM automático | Recuperación point-in-time |
| 🔀 Switchover | Manual guiado | Failover planificado |
| ⚡ Recovery Time | < 15 minutos | Mínima interrupción |
| 📊 Monitoring | Scripts automáticos | Detección temprana |
📅 Job 1: Desactivación de Usuarios Inactivos
Nombre: JOB_DESACTIVATE_USERS
Frecuencia: Primer día de cada mes a las 00:00
Procedimiento: DESACTIVATE_USERSFunción: Desactiva automáticamente usuarios sin actividad por más de 90 días y envía notificación por email.
Beneficios:
- ✅ Mejora la seguridad eliminando cuentas inactivas
- ✅ Notifica a administradores sobre usuarios desactivados
- ✅ Mantiene auditoría de desactivaciones
💾 Job 2: Verificación de Tablespaces
Nombre: JOB_VERIFY_TABLESPACES
Frecuencia: Diario a las 06:00
Procedimiento: VERIFY_TABLESPACESFunción: Verifica el uso de espacio en todos los tablespaces y alerta cuando supera el 85%.
Alertas generadas:
- 🟡 Warning: 85-90% de uso
- 🔴 Critical: >90% de uso
- 📧 Email automático a administradores
🔧 Job 3: Verificación de Objetos Inválidos
Nombre: JOB_VERIFY_INVALID_OBJECTS
Frecuencia: Diario a las 07:00
Procedimiento: VERIFY_INVALID_OBJECTSFunción: Detecta y reporta objetos de base de datos en estado inválido.
Cobertura:
- Procedimientos almacenados
- Funciones
- Paquetes PL/SQL
- Triggers
- Vistas
🔍 Job 4: Verificación de Índices
Nombre: JOB_VERIFY_INDEXES
Frecuencia: Diario a las 08:00
Procedimiento: VERIFY_INDEXESFunción: Analiza el estado de todos los índices y detecta corrupción o fragmentación.
Acciones:
- Valida integridad de índices
- Detecta índices dañados o corruptos
- Genera reporte de recomendaciones
- Notifica necesidad de rebuild
-- Query rápido de estado del sistema
SELECT
'🔄 Replicación' as componente,
CASE WHEN gap_count = 0 THEN '✅ OK' ELSE '⚠️ GAP' END as estado
FROM (
SELECT COUNT(*) as gap_count FROM v$archive_gap
)
UNION ALL
SELECT
'💾 Tablespaces' as componente,
CASE WHEN MAX(pct_used) < 85 THEN '✅ OK' ELSE '⚠️ ALERTA' END as estado
FROM (
SELECT
ROUND((1 - (free.bytes / total.bytes)) * 100, 2) as pct_used
FROM
(SELECT tablespace_name, SUM(bytes) bytes
FROM dba_free_space GROUP BY tablespace_name) free,
(SELECT tablespace_name, SUM(bytes) bytes
FROM dba_data_files GROUP BY tablespace_name) total
WHERE free.tablespace_name = total.tablespace_name
)
UNION ALL
SELECT
'🔧 Objetos' as componente,
CASE WHEN invalid_count = 0 THEN '✅ OK' ELSE '⚠️ REVISAR' END as estado
FROM (
SELECT COUNT(*) as invalid_count
FROM dba_objects
WHERE status = 'INVALID'
);| Avatar | Nombre | GitHub | Rol Principal | Especialización |
|---|---|---|---|---|
| 🧑💻 | Kevin Arauz | @kjarj54 | Lead Developer | Arquitectura & Integración |
| 👨💼 | Kevin Fallas | @kevtico20 | Database Administrator | Oracle DBA & Replicación |
| 🧑🔧 | James Rivera | @JamesRiveran | Backend Developer | PL/SQL & Automatización |
|
Kevin Arauz 📐 Diseño de arquitectura 🔐 Sistema de seguridad 📧 Integración Brevo API 🐳 Dockerización |
Kevin Fallas 🔄 Data Guard setup 💾 Estrategia de backup 📊 Tablespace management 🔧 Performance tuning |
James Rivera ⚡ Triggers y procedimientos 🤖 Jobs automáticos 📋 Sistema de planillas 🧪 Testing y validación |
Sede Región Brunca
|
Materia: Administración de Bases de Datos Código: EIF-420 Período: II Ciclo 2025 Modalidad: Presencial |
Profesor: Máster Carlos Carranza Blanco Facultad: Ciencias Exactas y Naturales Escuela: Informática Sede: Región Brunca, Pérez Zeledón |
Este proyecto fue desarrollado con fines académicos para el curso de Administración de Bases de Datos en la Universidad Nacional Sede Región Brunca durante el II Ciclo 2025.
|
✅ Permitido:
|
❌ Prohibido:
|
📧 Para permisos especiales o consultas: Contactar a través de los perfiles de GitHub de los desarrolladores.
Ver archivo LICENSE para términos completos.
Apreciamos tu interés en mejorar Vitalis DB. Aquí te explicamos cómo puedes participar:
- Busca si el problema ya fue reportado en Issues
- Crea un nuevo Issue con la siguiente información:
- 📝 Descripción clara del problema
- 🔄 Pasos para reproducir
- 💻 Entorno (OS, versión de Oracle, Docker)
- 📸 Capturas de pantalla si aplica
- Abre un Issue con el tag
enhancement - Describe detalladamente la funcionalidad propuesta
- Explica el beneficio para el proyecto
# 1. Fork el repositorio
# 2. Crea una rama para tu feature
git checkout -b feature/nueva-funcionalidad
# 3. Realiza tus cambios y commits
git commit -m "feat: descripción de la nueva funcionalidad"
# 4. Push a tu fork
git push origin feature/nueva-funcionalidad
# 5. Crea un Pull Request- SQL: Usar MAYÚSCULAS para palabras clave, nombres descriptivos
- PL/SQL: Comentarios en español, indentación de 4 espacios
- Bash: ShellCheck compliant, comentarios detallados
- Commits: Seguir Conventional Commits
|
📝 Sistema de Auditoría 🤖 Manual de Jobs 🔧 Configurar DBeaver |
🐳 Oracle en Docker 🔄 Guía Switchover ⚡ Switchover Rápido |
🗂️ Modelo ER 📜 Script Completo 📄 Licencia |
Agradecemos especialmente a:
🎓 Universidad Nacional de Costa Rica - Sede Región Brunca
Por proporcionar el espacio y recursos para desarrollar este proyecto
👨🏫 Máster Carlos Carranza Blanco
Por su guía, conocimiento y apoyo durante el desarrollo del proyecto
🤝 Comunidad Oracle
Por la documentación y recursos que facilitaron la implementación
💻 Equipo de Desarrollo
Por la dedicación, esfuerzo y compromiso durante todo el proyecto
