Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Sistema web de control de asistencia, horas extra y nómina para el Restaurante & Bar El Bodegón (León, Nicaragua).
Proyecto de la asignatura Tecnología de la Información (Universidad Tecnológica La Salle, ULSA), unidad Fundamentos y transformación digital.
El sistema reemplaza el cuaderno de firmas y el cálculo manual de la quincena. Este repositorio se evalúa sobre dos funciones principales:
/kiosco), con cola local en IndexedDB/LocalStorage para seguir registrando sin internet y sincronización por lotes (sync-batch) al volver la red./admin/nomina): el sistema detecta el excedente sobre 8 horas continuas o jornada partida, compensa deudas previas 1 a 1 y deja la solicitud para que la administración la apruebe o rechace con validación de PIN en servidor. Genera boleta oficial con folio (RPHE) y exporta la planilla consolidada a Excel.También incluye gestión de colaboradores y generación de carnets imprimibles, feriados automáticos (cómputo al 200% o acreditación de descanso), deducción/registro de vacaciones, control de compras/gastos y bitácora de auditoría.
| Capa | Tecnología | Despliegue |
|---|---|---|
| Frontend y Kiosco | Next.js 16, React 19, TypeScript, Tailwind CSS 4 | Vercel |
| Backend (API REST) | Django 5, Django REST Framework, Python 3.12 | Render Cloud |
| Base de Datos | PostgreSQL (AWS Pooler Supabase / SQLite en dev) | Supabase |
Tecnologías habilitadoras: computación en la nube y analítica de datos (reglas automatizadas de balance de horas, déficit, amortización 1:1, horas extra y nómina). No se utiliza inteligencia artificial ni IoT.
backend/
asistencia/ app Django: modelos, vistas, serializers, urls, migraciones
sgp_asistencia/ configuración del proyecto Django (settings, wsgi, asgi)
scripts/ utilidades de mantenimiento y migración
seed_data.py carga de colaboradores de prueba ficticios
test_*.py batería de pruebas automatizadas de turnos y reglas
simulate_week.py simulación integral de quincena/semana operativa
verify_nomina.py verificación matemática de cálculos de nómina
build.sh script de construcción para despliegue en Render
requirements.txt dependencias de Python
frontend/
app/ rutas Next.js: /kiosco, /admin, /admin/nomina, /admin/asistencia, /admin/empleados, /control
components/ componentes reutilizables, modales y compuertas de seguridad
lib/ cliente de API tipado (api-client.ts) y utilidades de audio/tiempo
DATABASE_URL, el backend utiliza automáticamente SQLite local.cd backend
python -m venv env
# En Windows (PowerShell / CMD):
.\env\Scripts\activate
# En Linux / macOS:
source env/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py createsuperuser # Opcional, para el panel /admin de Django
cd frontend
npm install
Copia los valores de ejemplo de .env.example y ajústalos según tu entorno. No subas claves, contraseñas ni tokens al repositorio.
Backend (Variables de entorno en .env o variables de Render):
| Variable | Descripción | Valor de ejemplo |
|---|---|---|
SECRET_KEY | Clave criptográfica de Django. Obligatoria: sin ella el servidor no arranca (salvo con DEBUG=True) | Genera una con python -c "import secrets; print(secrets.token_urlsafe(50))" |
DEBUG | Modo depuración | True (local) / False (producción) |
DATABASE_URL | Conexión a PostgreSQL (si no se define, usa SQLite) | postgresql://postgres:clave@host:5432/postgres |
BACKUP_ADMIN_KEY | Clave para descargar el respaldo de la DB. Obligatoria: sin ella el servidor no arranca (salvo con DEBUG=True). Permite descargar el respaldo sin sesión del panel (cabecera X-Admin-Backup-Key); con sesión del panel no hace falta | Genera otra con el mismo comando |
ADMIN_SUPERVISOR_PIN | PIN de gerencia para entrar al panel (4 dígitos). Sin valor por defecto | definido por gerencia |
ADMIN_PAYROLL_PIN | PIN de nómina para aprobar horas extra y pagos (4 dígitos). Sin valor por defecto | definido por gerencia |
ADMIN_TOKEN_HOURS | Horas de validez de la sesión del panel (opcional) | 12 |
KIOSK_SIMULATION_KEY | Solo pruebas: permite simular la hora de marcaje en el kiosco. No definir en producción | — |
Los PINs nunca se escriben en el frontend ni en el repositorio: el panel los envía al servidor (POST /api/auth/login/), que devuelve un token firmado con vencimiento. Tras 5 intentos fallidos desde la misma IP, el servidor bloquea el PIN por 15 minutos.
Frontend (archivo frontend/.env.local o variables en Vercel):
NEXT_PUBLIC_API_URL=http://127.0.0.1:8000/api
NEXT_PUBLIC_SUPABASE_URL=https://tu-proyecto.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=tu-clave-anonima-publica
Terminal 1 (Backend):
cd backend
.\env\Scripts\activate
python manage.py runserver # Servidor en http://127.0.0.1:8000
Terminal 2 (Frontend):
cd frontend
npm run dev # Aplicación en http://localhost:3000
Rutas principales disponibles:
/kiosco: Terminal de marcaje con QR y captura de foto de verificación./admin: Panel de control general./admin/asistencia: Consulta y filtrado de asistencia con evidencia fotográfica./admin/nomina: Gestión de bolsa de horas, aprobación de horas extra y exportación de nómina./admin/empleados: Gestión de colaboradores y generación de carnets.Nota: El acceso a la cámara en el Kiosco funciona nativamente en localhost o en conexiones seguras con HTTPS.
cd backend
python seed_data.py
Crea colaboradores de prueba ficticios y genera tokens QR para cada uno. Los carnets con códigos QR se pueden previsualizar e imprimir desde /admin/empleados. No se utilizan datos personales reales para fines académicos ni de demostración.
/admin/empleados y visualiza el carnet QR de un colaborador de prueba en pantalla o impreso./kiosco, acerca el carnet QR a la cámara web y registra Entrada; registra luego la Salida (o ejecuta los scripts de simulación para emular turnos completos)./admin/asistencia y constata el marcaje registrado junto a su foto de auditoría./admin/nomina, dirígete a la pestaña Horas extra: previsualiza la solicitud, revisa la amortización automática con la bolsa de horas y aprueba ingresando el PIN de administración.El PIN administrativo de demostración se entrega por separado al docente evaluador.
Las pruebas de nómina (horas extra y bolsa de horas, tardanza, vacaciones y marcaje del kiosco) están en backend/asistencia/tests/ y corren solas en GitHub Actions en cada push a main y en cada pull request:
cd backend
python manage.py test asistencia
Django crea una base de datos de prueba temporal y la borra al terminar, así que no tocan los datos reales.
Scripts de diagnóstico que siguen disponibles:
python verify_nomina.py # Balance de nómina del 01 al 15 de agosto 2026
python simulate_week.py # Simulación de ciclo semanal completo
[!WARNING]
simulate_week.pyborra y crea registros en la base de datos configurada. Ejecútalo únicamente en el entorno local (SQLite, sin configurarDATABASE_URLde producción).
La matriz de pruebas completa con capturas de evidencia se encuentra en el documento Evidencia de pruebas.
bash build.sh instala las dependencias de Python, recolecta archivos estáticos con WhiteNoise y ejecuta migraciones. Se sirve mediante gunicorn sgp_asistencia.wsgi.main; compila la aplicación Next.js y consume el backend en la nube mediante NEXT_PUBLIC_API_URL.En la auditoría técnica previa a la entrega se identificaron y mitigaron los siguientes aspectos de seguridad:
Authorization: Bearer <token>). Solo quedan públicos los del kiosco: kiosco/marcar/, kiosco/consultar/, kiosco/empleados/ (nombres y huella del QR, sin tokens) y asistencia/sync-batch/.ADMIN_SUPERVISOR_PIN) y el de nómina (ADMIN_PAYROLL_PIN) se validan únicamente en Django, con comparación en tiempo constante y bloqueo por intentos fallidos. El frontend no contiene ningún PIN./api/admin/respaldo-datos/ exige la sesión del panel (o la cabecera X-Admin-Backup-Key con BACKUP_ADMIN_KEY), registrando intentos indebidos en la bitácora con IP.CORS_ALLOW_ALL_ORIGINS = True y se configuró una lista estricta de orígenes permitidos (asistenciabodegon.vercel.app, localhost:3000).El historial de commits y control de versiones refleja la colaboración del equipo:
| Integrante | Rol y Aportes Principales |
|---|---|
| Eddy Martínez | Arquitectura general del sistema, motor de cálculo laboral en backend Django (bolsa de horas, turnos partidos, compensación 1:1), desarrollo del Kiosco offline y hardening de seguridad en API REST. |
| Cristoffer Betancourt | Diseño y maquetación de interfaces en Next.js/Tailwind CSS, módulo de administración de colaboradores, generación e impresión de carnets QR y pruebas de usabilidad del kiosco. |
| Erick Amaya | Diseño y ejecución de la matriz de pruebas unitarias/integración, elaboración del módulo de reportería Excel de nómina/vacaciones, configuración de entornos y documentación del repositorio. |
El código desarrollado en este proyecto se distribuye bajo la licencia MIT (consultar archivo LICENSE).
Componentes y bibliotecas de terceros utilizados:
| Componente | Licencia |
|---|---|
| Next.js, React, Tailwind CSS, @supabase/supabase-js | MIT |
| lucide-react, qrcode.react | ISC |
| html5-qrcode | Apache-2.0 |
| Django, Django REST Framework, dj-database-url | BSD |
| django-cors-headers, whitenoise, gunicorn, openpyxl, et_xmlfile | MIT |
| Pillow | HPND |
| psycopg2-binary | LGPL |
Servicios en la nube operados bajo sus planes educativos y de desarrollo: Vercel, Render y Supabase.