Sistema completo para la gestión de personal y nómina de instituciones educativas, desarrollado en Python con interfaz gráfica CustomTkinter.
Este sistema proporciona una solución integral para la administración de recursos humanos en instituciones educativas, permitiendo gestionar empleados, documentos, incidencias, permisos y nóminas de manera eficiente y organizada.
| Punto de entrada | Contenido |
|---|---|
| Portal web | Lector de la tesis y la documentación técnica, catálogo y buscador |
| Informes académicos | Contabilidad, socio crítico, proyecto y redes de computadoras |
| Documentación técnica | Arquitectura, instalación, operación y mantenimiento |
| Guía de usuario | Manual operativo del sistema |
| Tesis | Índice del compendio académico y sus anexos |
| Guía del servidor local | Sincronización, cuentas, firewall y diagnóstico |
| Checklist de producción | Instalación y validación en equipos reales |
| Notas de desarrollo | Bitácora técnica y decisiones de diseño |
| Guía de contribución | Convenciones, pruebas y flujo de trabajo |
El portal también se abre sin conexión: start docs/index.html (Windows),
open docs/index.html (macOS) o xdg-open docs/index.html (Linux).
- Registro completo de empleados (Docentes, Administrativos, Mantenimiento)
- Ficha de datos personales, físicos y de contacto
- Gestión de fotos de perfil
- Clasificación por tipo, cargo y departamento
- Búsqueda y filtrado avanzado
- Carga y almacenamiento de documentos digitalizados
- Soporte para PDFs e imágenes
- Clasificación por tipo de documento
- Control de vencimientos (reporte PDF con vencidos y por vencer)
- Gestión de documentos por empleado
- Exportación del listado a Excel/CSV
- Registro de reposos médicos, ausencias y permisos
- Sistema de aprobación/rechazo
- Gestión de documentos de soporte
- Cálculo automático de días
- Control de incidencias vigentes
- Reporte PDF y exportación a Excel/CSV (por empleado o general)
- Generación automática de nóminas por periodo
- Motor de cálculo con dos modalidades: porcentual (histórica) y por tramos progresivos de ISR con techos de cotización y aportes patronales
- Horas extra con recargo por jornada (diurna, nocturna y feriada)
- Prestaciones: aguinaldo, bono vacacional, prestaciones por antigüedad, indemnización y preaviso proportional al tiempo servido
- Generación de recibos de pago y planilla de nómina en PDF
- Control de pagos pendientes y realizados
- Alta de contratos (indefinido, temporal, por obra o pasantía)
- Renovación encadenada al contrato anterior y terminación con finiquito
- Unicidad del contrato vigente y numeración automática
- Control de contratos por vencer y vencidos
- Reporte PDF de contratos
- Estudiantes: legajo completo con cédula única, nivel educativo, representante y datos de contacto, búsqueda por nombre o cédula y exportación a Excel
- Grados y matrículas: grados y secciones por año escolar, asignación del docente responsable y una sola matrícula activa por estudiante y periodo
- Calificaciones: registro, corrección y eliminación de notas finales por materia, carga por lotes en una única transacción, consolidado del periodo, boletín por estudiante y acta final del grado
- Periodos académicos: alta y edición del año escolar, cierre que bloquea las notas (servicio y base de datos) y reapertura restringida al administrador
- Autorización por token: solo la administración o el docente asignado al grado escriben notas, con token de sesión de una jornada y sin guardarlo en claro
- Indicadores clave: nómina del mes, contratos por vencer y dotación activa
- Gráficos de barras, dona y línea dibujados sobre Canvas (sin dependencias nuevas)
- Constancias de trabajo y de estudios
- Ficha completa del empleado (datos personales, laborales, bancarios, salud y familia)
- Recibos de pago
- Reportes de empleados
- Planilla de nómina por periodo con totales (ISSS, AFP, ISR, neto)
- Reporte de incidencias, control de vencimientos de documentos y reporte de contratos
- Exportación de listados a Excel (.xlsx) y CSV (UTF-8 compatible con Excel), incluida la exportación multihoja
- Autenticación de usuarios con contraseñas cifradas (PBKDF2)
- Roles y permisos por módulo (Administrador, Gestor, Usuario, Solo lectura)
- Cambio de contraseña del usuario logueado
- Visor de auditoría (solo administradores) con filtro por tipo y exportación
- Bloqueo de cuenta por intentos fallidos con desbloqueo administrativo
- Caducidad de contraseñas, historial de claves y cambio obligatorio
- Respaldos automáticos programados con verificación de integridad
- Tema oscuro/claro configurable y persistente (botón ☀️/🌙 en la cabecera)
- Atajos de teclado para navegar y operar más rápido
- Panel de control (Dashboard) con tarjetas estadísticas navegables, indicadores analíticos y gráficos propios
- Ventanas integradas de Ayuda (guía rápida) y Acerca de
- Barra de estado con reloj y mensajes de la aplicación
- Soporte de alta resolución (DPI) en Windows
- Actualizador incluido en el instalador y programado automáticamente cada 2 días (Programador de tareas de Windows, 09:00)
- Ventana de estado que muestra todo el proceso: comprobando, descargando (con porcentaje y tamaño), instalando y resultado final
- Ícono en la bandeja del sistema (barra inferior derecha) con menú: buscar ahora, mostrar ventana o salir
- Descarga e instala en silencio la última versión publicada en GitHub
- Python 3.15 o superior
- Windows 10/11
- 4GB RAM mínimo
- 500MB espacio en disco
El sistema sigue una arquitectura en capas separando la lógica de negocio, acceso a datos e interfaz de usuario:
- Capa de Modelos: Define la estructura de datos usando SQLAlchemy ORM
- Capa de Repositorios: Maneja el acceso a la base de datos
- Capa de Servicios: Contiene la lógica de negocio
- Capa de GUI: Interfaz gráfica con CustomTkinter
- Capa de Utilidades: Funciones auxiliares y helpers
El repositorio incluye SDEP Móvil, una aplicación nativa en Kotlin
(Jetpack Compose, Room, Hilt) que se conecta al nodo central de sincronización
como un puesto más de la intranet. Permite levantar registros de campo desde el
teléfono, editarlos y consultarlos sin conexión; al recuperar la red, las
operaciones viajan al servidor con el mismo protocolo que usan los puestos de
escritorio y aterrizan en la tabla registros_moviles, visible desde la base
institucional.
- Ingreso con contraseña (PBKDF2) y desbloqueo con huella o rostro.
- Roles de administrador, editor y consulta.
- CRUD completo con búsqueda, categorías y valor numérico.
- Cola de salida transaccional, cursor de sincronización y bandeja de conflictos.
- Sin dependencia de servicios en la nube: habla solo con el nodo del colegio.
Instrucciones de compilación, emparejamiento y contrato del protocolo en
android/README.md.
El sistema incluye un servidor de sincronización que permite que múltiples instalaciones del sistema (en diferentes computadoras) se mantengan sincronizadas automáticamente. El servidor puede ejecutarse en cualquier computadora sin necesidad de un servidor dedicado y está configurado para comunicarse con:
- ✅ Otras computadoras con el mismo programa en la red local
- ✅ Aplicación Android (SDEP Móvil) en la misma red WiFi
- ✅ Cualquier dispositivo conectado a la misma red
# Opción 1: Script de inicialización automática (recomendado)
python iniciar_servidor.py
# El servidor mostrará automáticamente las URLs de conexión:
# - Desde esta PC: http://127.0.0.1:8765
# - Desde Android/otros PCs: http://192.168.1.XXX:8765Esto:
- Crea la base de datos central (
sync_central.db) - Inicializa el esquema necesario
- Crea usuarios por defecto (admin, manager, user, viewer)
- Crea un dispositivo para conexión
- Inicia el servidor HTTP en el puerto 8765
- Muestra la IP local para conectar desde Android y otros equipos
En la instalación de escritorio no hace falta ejecutar ningún script ni responder preguntas. Desde la primera ejecución el nodo central arranca solo con la aplicación, incluso antes de iniciar sesión, y queda visible en el área de notificación de Windows, que muestra su estado y avisa cuando ya está disponible para el teléfono.
La auto-configuración copia al nodo central las cuentas de este equipo que aún no existan allí, con su misma contraseña (solo el hash), y crea las cuentas iniciales que falten, de modo que el teléfono entra con el mismo usuario y contraseña que la computadora. También deja este equipo como puesto cliente del nodo local. Desde el icono se puede copiar la URL de red para el teléfono, ver los datos de conexión, iniciar o detener el servidor y salir. Si el servicio se cayera, la aplicación lo vuelve a levantar sola; al salir, se cierra de forma ordenada.
| Usuario | Contraseña | Rol |
|---|---|---|
| admin | Admin1234 | Administrador total |
| manager | Gestor1234 | Gestor con permisos de edición |
| user | Usuario1234 | Usuario estándar |
| viewer | Lector1234 | Solo lectura |
IMPORTANTE: Cambie estas contraseñas después del primer inicio.
En el arranque automático, las cuentas que ya existen en el equipo se copian al nodo central con su contraseña actual; la tabla anterior solo se aplica a las cuentas que falten o al script manual.
- Vaya a Configuración → Sincronización
- Configure la URL del servidor (use la IP local que muestra el servidor)
- Ejemplo:
http://192.168.1.100:8765
- Ejemplo:
- Ingrese el token del dispositivo
- Active la sincronización
- Instale y abra SDEP Móvil en el teléfono, en la misma Wi-Fi.
- Escriba solo su usuario y contraseña de la institución. No hay dirección, equipo ni token que configurar: el teléfono descubre el escritorio por difusión UDP y, si la red la bloquea, por sondeo de la subred.
- Si el escritorio aún no aparece, pulse «Volver a buscar». La app sigue intentando en segundo plano mientras el equipo se enciende.
Para que Android y otros PCs puedan conectarse, el firewall debe permitir el puerto 8765/TCP y el 8766/UDP (descubrimiento automático):
Windows:
New-NetFirewallRule -DisplayName "SDEP Servidor" -Direction Inbound -LocalPort 8765 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "SDEP Descubrimiento" -Direction Inbound -LocalPort 8766 -Protocol UDP -Action AllowEl instalador crea esta regla automáticamente para las redes privada y de dominio; al ejecutar desde el código fuente hay que crearla a mano.
Linux (UFW):
sudo ufw allow 8765/tcp# Ver dispositivos registrados
py -3 -m sync_agent dispositivos --db sqlite:///sync_central.db --listar
# Crear un nuevo dispositivo
py -3 -m sync_agent servidor --db sqlite:///sync_central.db --crear-dispositivo "Puesto 2"
# Ver sesiones activas
py -3 -m sync_agent sesiones --db sqlite:///sync_central.db --listarPara instrucciones detalladas sobre configuración, seguridad, firewall y solución de
problemas, consulte GUIA_SERVIDOR_LOCAL.md.
La integración continua se reparte entre dos workflows complementarios.
.github/workflows/build.yml (integración y empaquetado):
- Pruebas: ejecuta la suite completa de pytest sobre los 33 archivos de (32 test_*.py + conftest.py)
tests/en cada push amainodevelop. - Compilación Windows: en
windows-latest, empaqueta la app con PyInstaller (directorioonedir+ icono + metadatos de versión). - Actualizador automático: compila
SDEP_CPP5_AutoUpdater.exe(PyInstaller onefile, sin consola) con la ventana de estado y el ícono de bandeja del sistema. - Instalador: genera
SistemaGestionPersonal-Setup-<versión>.execon Inno Setup (asistente en español/inglés, accesos directos, desinstalador); incluye el actualizador dentro del instalador y lo programa en el Programador de tareas cada 2 días. - Compilación Linux: compila el mismo
spec/app.specdentro de un contenedor Debian 13 (glibc 2.41) y empaqueta la versión portable de Linux en untar.gz. El binario funciona en Debian 13 y Ubuntu 24.04 LTS o superior; se autoverifica con--selftestbajoxvfb-rundentro de contenedoresdebian:13-slimy se comprueba que la glibc máxima requerida no supere 2.41. - Artefactos: sube a la ejecución el instalador
Setup.exe, el ZIP portable de Windows, eltar.gzportable de Linux y el reporte de cobertura. El actualizadorSDEP_CPP5_AutoUpdater.exese compila y queda incluido dentro del instalador. Este workflow no publica releases: solo compila y verifica.
.github/workflows/release.yml (release firmada) se activa con cada
push a main, con etiquetas v* y de forma manual. Aplica firma masiva
profunda en dos pasadas —todo el contenido de dist/ antes de Inno Setup y
el instalador final después—, audita que ningún archivo firmable quede sin
firma y publica la Release con un único adjunto: el instalador
SistemaGestionPersonal-Setup-<versión>.exe. En los push a main la
etiqueta de la release continua es continuous-v<versión>.<número de ejecución>; una etiqueta vX.Y.Z produce una release versionada con ese
nombre. La firma requiere los secretos PFX_BASE64 y PFX_PASSWORD.
Cada cambio publicado genera su Release firmada automáticamente:
git push origin mainPara una release versionada (opcional):
git tag v3.0.1
git push origin v3.0.1Descargue SistemaGestionPersonal-Setup-<versión>.exe desde el Release o
los artefactos del workflow y ejecútelo. Los datos de la aplicación
(base de datos, documentos, respaldos) se guardan en
%LOCALAPPDATA%\SistemaGestionPersonal, independientes de la instalación.
El instalador incluye el actualizador automático (
SDEP_CPP5_AutoUpdater.exe): al terminar la instalación queda programado para comprobar novedades cada 2 días y se ejecuta con ventana de estado e ícono en la bandeja del sistema.
Descargue SistemaGestionPersonal-Linux-<versión>.tar.gz desde el Release,
descomprímalo y ejecute el binario:
tar -xzf SistemaGestionPersonal-Linux-<versión>.tar.gz
cd SistemaGestionPersonal
./SistemaGestionPersonalLos datos de la aplicación se guardan junto al ejecutable.
- Clonar el repositorio:
git clone <repository-url>
cd SDEP_CPP5- Crear entorno virtual:
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # Linux/Mac- Instalar dependencias:
pip install -r requirements.txt- Ejecutar la aplicación:
python src/main.py- Instalar dependencias de construcción:
pip install pyinstaller
# Instale además Inno Setup 6: https://jrsoftware.org/isdl.php
# o con Chocolatey: choco install innosetup -y- Ejecutar el script de construcción:
python build.py # ejecutable + actualizador + instalador
python build.py --exe # solo el ejecutable
python build.py --updater # solo el actualizador automático- Resultados:
- Ejecutable:
dist/SistemaGestionPersonal/ - Actualizador:
dist_updater/SDEP_CPP5_AutoUpdater.exe - Instalador:
dist_installer/SistemaGestionPersonal-Setup-<versión>.exe
- Ejecutable:
La versión se lee del archivo
VERSION(fuente única).
SDEP_CPP5/
├── src/ # Código fuente principal
│ ├── gui/ # Interfaz gráfica de usuario
│ │ ├── main_window.py # Ventana principal
│ │ └── frames.py # Frames de cada módulo
│ ├── models/ # Modelos de datos (ORM)
│ │ ├── base.py # Modelo base
│ │ ├── enums.py # Enumeraciones
│ │ ├── empleado.py # Modelo de empleado
│ │ ├── documento.py # Modelo de documento
│ │ ├── incidencia.py # Modelo de incidencia
│ │ ├── pago.py # Modelo de pago
│ │ └── configuracion.py # Modelo de configuración
│ ├── repositories/ # Acceso a datos
│ │ ├── base_repository.py # Repositorio base
│ │ ├── empleado_repository.py
│ │ ├── documento_repository.py
│ │ ├── incidencia_repository.py
│ │ ├── pago_repository.py
│ │ └── configuracion_repository.py
│ ├── services/ # Lógica de negocio
│ │ ├── empleado_service.py
│ │ ├── documento_service.py
│ │ ├── incidencia_service.py
│ │ ├── pago_service.py
│ │ └── configuracion_service.py
│ ├── utils/ # Utilidades y helpers
│ │ ├── helpers.py # Funciones auxiliares
│ │ ├── validators.py # Validadores
│ │ ├── document_manager.py # Gestión de documentos
│ │ └── pdf_generator.py # Generación de PDFs
│ ├── config/ # Configuración
│ │ ├── settings.py # Configuración general
│ │ └── database.py # Configuración de base de datos
│ └── main.py # Punto de entrada
├── tests/ # Pruebas unitarias
├── requirements.txt # Dependencias del proyecto
├── requirements-dev.txt # Dependencias de desarrollo
├── pyproject.toml # Configuración del proyecto
├── build.py # Script de construcción
├── updater/ # Actualizador automático
│ ├── auto_updater.py # Lógica principal (GitHub, descarga, tareas)
│ ├── updater_gui.py # Ventana de estado (tkinter)
│ ├── tray_icon.py # Ícono de bandeja del sistema (ctypes)
│ └── updater.spec # Spec de PyInstaller
└── .env.example # Ejemplo de variables de entorno
El sistema utiliza SQLite como base de datos local. La base de datos se crea automáticamente al iniciar la aplicación y se encuentra en el archivo personal_management.db.
- empleados: Información completa de empleados
- documentos: Documentos digitalizados de empleados
- incidencias: Permisos, reposos y ausencias
- contratos: Contratos laborales y su ciclo de vida
- pagos: Registro de nóminas y pagos
- estudiantes, grados, matriculas, notas_finales y periodos_academicos: subdominio académico (legajo, estructura escolar y calificaciones)
- tokens_sesion: tokens de sesión con alcance académico (solo su hash; no se sincronizan entre equipos)
- configuraciones: Configuración del sistema
| Atajo | Acción |
|---|---|
Ctrl+1 … Ctrl+9 |
Ir al módulo 1 (Dashboard) … 7 (Configuración), 8 (Estudiantes) y 9 (Calificaciones) |
Ctrl+N |
Nuevo registro en el módulo activo |
Ctrl+F |
Buscar / enfocar el filtro del módulo activo |
Ctrl+S |
Guardar cambios (Configuración) |
F5 |
Actualizar la lista del módulo activo |
Esc |
Cerrar diálogos o limpiar la selección de la tabla |
-
Configuración Inicial:
- Configure los datos de la institución en la sección "Configuración"
- Establezca los porcentajes de deducciones para nómina
-
Registro de Empleados:
- Vaya a la sección "Empleados"
- Haga clic en "Nuevo Empleado"
- Complete los datos personales, laborales y de contacto
-
Gestión Documental:
- Seleccione un empleado
- Vaya a "Documentos"
- Cargue documentos digitalizados (cedulas, títulos, etc.)
-
Incidencias:
- Seleccione un empleado
- Vaya a "Incidencias"
- Registre permisos, reposos o ausencias
- Apruebe o rechace solicitudes
-
Nómina:
- Vaya a "Nómina"
- Seleccione el periodo
- Genere la nómina automáticamente
- Genere recibos de pago en PDF
- Los datos se almacenan localmente en SQLite
- La aplicación funciona sin conexión a internet (solo el actualizador automático la consulta, de forma opcional)
- Los documentos se almacenan en el sistema de archivos local
- Se recomienda realizar copias de seguridad periódicas
pytest tests/black src/
isort src/flake8 src/
pylint src/- Configuración Inicial: Al iniciar el sistema por primera vez, configure los datos de la institución
- Registro de Empleados: Agregue los empleados con sus datos personales y laborales
- Gestión Documental: Cargue los documentos requeridos para cada empleado
- Control de Incidencias: Registre permisos, reposos y ausencias
- Procesamiento de Nómina: Genere nóminas periódicas y emita recibos de pago
Copie .env.example a .env y configure las variables:
DATABASE_URL=sqlite:///personal_management.db
APP_NAME=Sistema de Gestión de Personal
DEBUG=FalseLa configuración se puede modificar desde la sección "Configuración" de la aplicación:
- General: Nombre de la institución, dirección, contacto
- Nómina: Porcentajes de deducciones, salario mínimo
- Recursos Humanos: Días de vacaciones, horas laborales
- Verifique que Python 3.15+ esté instalado
- Instale las dependencias:
pip install -r requirements.txt - Verifique que los directorios
documents,photos,exportsexistan
- No elimine el archivo
personal_management.db. Conserve el archivo dañado para diagnóstico. - En su lugar, use la función de respaldo automático o recupere desde
%LOCALAPPDATA%\SistemaGestionPersonal
- Asegúrese de tener PyInstaller instalado:
pip install pyinstaller - Verifique que el archivo
spec/app.specexista - Ejecute el script
build.py
Este proyecto está bajo licencia MIT.
Desarrollado para gestión de personal en instituciones educativas.
Para soporte o consultas, contacte al equipo de desarrollo.
- Versión: 3.0.1
- Última actualización: 2026