juavillo bc4e232a80 Bloqueo de días, override del admin y edición del nombre de ronda
- Admin puede bloquear/desbloquear días (rounds.blocked) desde la vista de
  ocupación; los trabajadores no pueden elegirlos (🔒).
- El admin puede asignar cualquier día aunque supere el límite por día/cargo
  o esté bloqueado (override explícito en requests/set).
- Editar el nombre de la ronda con edición inline en el calendario
  (PUT /api/admin/rounds/:id/name).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 23:21:20 +02:00

Vacaciones 🌴

Aplicación web sencilla y pensada para el móvil con la que el equipo de un restaurante pide sus días de vacaciones.

Cómo funciona

Trabajadores

  1. Reciben una URL del tipo https://tudominio.com/r/AbC123xyz.
  2. Escriben su nombre y eligen su cargo (los que el administrador haya definido al crear la ronda; por defecto Camarero/a, Encargado o Cocina).
  3. Marcan en el calendario los días que quieren pedir y guardan.
  4. En cada día ven cuántas personas de su mismo cargo ya lo han pedido (nunca quiénes). Si un día ya ha alcanzado el límite de su cargo, o es pasado o es hoy, no se puede elegir.
  5. Cada solicitud tiene un estado, visible con un color: gris = eligiendo (sin guardar), amarillo = pendiente de aprobar, verde = aprobada, rojo = rechazada. Solo se pueden cambiar las pendientes o añadir nuevas; las aprobadas y rechazadas quedan bloqueadas.
  6. Una cookie les identifica: si vuelven a entrar con el mismo navegador, ven el estado de todos sus días (aprobados, rechazados y pendientes) y pueden seguir editando los pendientes mientras la ronda siga abierta.

Administrador (/admin, protegido por contraseña)

  • Crea rondas de peticiones por local y año; en cada ronda define los cargos y, opcionalmente, un límite de solicitudes por día y cargo (p. ej. Camarero/a: 2, Cocina: 1). Se genera una URL nueva para compartir.
  • Calendario de aprobación por ronda: una barra lateral lista a cada empleado con su situación (aprobados / pendientes / rechazados) y el calendario muestra la ocupación del equipo. Desde ahí aprueba o rechaza cada día (uno a uno o en bloque por empleado) y puede añadir o quitar días directamente.
  • Edita los límites por cargo en cualquier momento para ampliarlos o reducirlos (afecta a las nuevas solicitudes; las reservas ocupan hueco mientras estén pendientes o aprobadas, y rechazar libera el hueco).
  • Cierra una ronda (nadie puede pedir ni modificar) y puede reabrirla.
  • Descarga un Excel con dos hojas: días por persona separados por estado, y ocupación por día y cargo.

Ejecutar en local

npm install
npm start          # http://localhost:3000

Variables de entorno:

Variable Por defecto Descripción
ADMIN_PASSWORD admin Contraseña del panel /admin. Cámbiala en producción.
PORT 3000 Puerto HTTP
DATA_DIR ./data Carpeta donde se guarda la base de datos SQLite

Desplegar en Coolify

  1. Sube este repositorio a Git (GitHub, GitLab…).
  2. En Coolify: New Resource → Application, conecta el repositorio y elige Build Pack: Dockerfile.
  3. Puerto expuesto: 3000.
  4. En Environment Variables añade ADMIN_PASSWORD con una contraseña fuerte.
  5. En Storages añade un volumen persistente montado en /app/data (ahí vive la base de datos SQLite; sin esto perderías los datos en cada deploy).
  6. Asigna tu dominio y despliega.

Después entra en https://tudominio.com/admin, crea la primera ronda y comparte la URL con el equipo.

Notas técnicas

  • Node.js + Express + SQLite (better-sqlite3): un solo contenedor, sin servicios externos.
  • Las sesiones de administrador se guardan en memoria: si se reinicia el contenedor solo hay que volver a iniciar sesión.
  • Excel generado con exceljs.
S
Description
App de peticiones de vacaciones para restaurante (Node+Express+SQLite)
Readme 125 KiB
Languages
JavaScript 63.1%
CSS 26.1%
HTML 10.3%
Dockerfile 0.5%