Sistema de reservas de horarios de descanso para operadores de seguridad
Esta aplicación web resuelve el problema de coordinación de descansos en turnos de trabajo. Los operadores pueden reservar sus 30 minutos de descanso por turno de manera justa y transparente, eliminando conflictos bajo el principio First-Come, First-Served.
- 3 turnos configurados: Mañana (06:45-14:45), Tarde (14:45-23:45), Noche (23:45-06:45)
- Slots de 10 minutos para máxima flexibilidad
- Visualización clara de disponibilidad en tiempo real
- Sincronización instantánea con Supabase Realtime
- Actualizaciones automáticas sin recargar página
- Prevención de conflictos de concurrencia
- 30 minutos máximo por turno por operador
- Múltiples combinaciones:
1×30min,2×15min,3×10min - Validación automática de límites
- Cancelación sencilla de reservas propias
- Google OAuth: Para usuarios recurrentes con perfiles persistentes
- Modo Invitado: Acceso rápido sin registro (sesión local)
- Onboarding automático para nuevos usuarios OAuth
Frontend moderno y robusto:
- Next.js 15 + App Router - Framework React con SSR optimizado
- TypeScript - Tipado estático para mayor confiabilidad
- Tailwind CSS v4 - Utility-first CSS con design system personalizado
- React Hot Toast - Notificaciones elegantes
Backend como Servicio:
- Supabase - PostgreSQL + Auth + Realtime
- Google OAuth - Autenticación social segura
- Row Level Security (RLS) - Políticas de seguridad a nivel de base de datos
Deployment & Hosting:
- Vercel - Hosting optimizado para Next.js
- GitHub Actions - CI/CD automático
git clone https://github.com/LucasSabena/securitas-descansos.git
cd securitas-descansos
npm install# Copiar variables de entorno
cp .env.example .env.local
# Editar .env.local con tus credenciales de Supabase:
# NEXT_PUBLIC_SUPABASE_URL=https://tu-proyecto.supabase.co
# NEXT_PUBLIC_SUPABASE_ANON_KEY=tu_clave_anon_aquiEjecuta este SQL en tu proyecto Supabase:
-- Crear tabla de perfiles
CREATE TABLE profiles (
id UUID REFERENCES auth.users(id) PRIMARY KEY,
display_name TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Crear tabla de reservas
CREATE TABLE reservas (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
user_id UUID REFERENCES auth.users(id),
user_name TEXT NOT NULL,
shift TEXT NOT NULL,
start_time TIMESTAMP WITH TIME ZONE NOT NULL,
end_time TIMESTAMP WITH TIME ZONE NOT NULL,
duration_minutes INTEGER NOT NULL
);
-- Habilitar RLS
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE reservas ENABLE ROW LEVEL SECURITY;
-- Políticas de seguridad
CREATE POLICY "Usuarios pueden ver todos los perfiles" ON profiles
FOR SELECT USING (true);
CREATE POLICY "Usuarios pueden crear su propio perfil" ON profiles
FOR INSERT WITH CHECK (auth.uid() = id);
CREATE POLICY "Usuarios pueden ver todas las reservas" ON reservas
FOR SELECT USING (true);
CREATE POLICY "Usuarios pueden crear reservas" ON reservas
FOR INSERT WITH CHECK (auth.uid() = user_id OR user_id IS NULL);
CREATE POLICY "Usuarios pueden eliminar sus propias reservas" ON reservas
FOR DELETE USING (auth.uid() = user_id);- Ve a Google Cloud Console
- Crea un proyecto y habilita Google+ API
- En "Credenciales" → "OAuth 2.0" → Agregar URIs:
- Desarrollo:
http://localhost:3000/auth/callback - Producción:
https://tu-dominio.vercel.app/auth/callback
- Desarrollo:
- En Supabase → Authentication → Settings → OAuth → Google → Pega Client ID y Secret
npm run dev🎉 ¡Listo! Ve a http://localhost:3000
* Crea las tablas profiles y reservas como se especifica en la lógica de la aplicación.
* Crea un archivo .env.local en la raíz del proyecto.
* Copia tus claves de API de Supabase en el archivo:
env NEXT_PUBLIC_SUPABASE_URL=TU_URL_DE_SUPABASE NEXT_PUBLIC_SUPABASE_ANON_KEY=TU_CLAVE_ANON_DE_SUPABASE
securitas-descansos/
├── app/ # Next.js App Router
│ ├── (main)/ # Rutas protegidas
│ │ ├── dashboard/ # Dashboard principal
│ │ └── layout.tsx # Layout con auth guard
│ ├── auth/ # Autenticación
│ │ ├── login/ # Página de login
│ │ └── callback/ # OAuth callback
│ ├── welcome/ # Onboarding nuevos usuarios
│ ├── layout.tsx # Layout global
│ └── globals.css # Estilos globales + design system
├── components/ # Componentes reutilizables
├── lib/ # Utilidades (Supabase client)
├── types/ # Definiciones TypeScript
├── design_system.json # Tokens de diseño
└── instrucciones.json # Documentación del proyecto
- Acceso inicial:
/→ Verifica sesión → Redirige según estado - Sin sesión:
/auth/login→ Google OAuth o modo invitado - Primera vez OAuth:
/welcome→ Configurar nombre de usuario - Usuario válido:
/dashboard→ Gestión de reservas
- Fork o clona este repositorio
- Importa en Vercel desde GitHub
- Configura las variables de entorno en Vercel:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
- Deploy automático en cada push a main
Este proyecto está bajo la licencia MIT. Ver LICENSE para más detalles.
Desarrollado para Securitas 🛡️
Sistema de gestión de descansos para operadores