Aplicación fullstack para administrar un restaurante: menú, pedidos, mesas, reservas, inventario con recetas, proveedores, empleados y reportes de ventas. Maneja tres roles con vistas propias: cliente, mesero y administrador.
| Capa | Tecnología |
|---|---|
| Backend | Node.js 18+, Express, Zod, JWT, bcrypt, Helmet, rate-limit |
| Base de datos | PostgreSQL (Supabase) |
| Frontend | React 18, Vite 5, React Router 6, Axios |
SGPR/
├── backend/ # API REST (Express + Supabase)
├── frontend/ # SPA (React + Vite)
└── database/ # schema.sql (tablas, índices y vistas)
- Crea un proyecto en supabase.com.
- Abre el SQL Editor y ejecuta el contenido completo de
database/schema.sql. - Copia la URL del proyecto y la service role key (Settings → API).
cd backend
cp .env.example .env # completa SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY y JWT_SECRET
npm install
npm run seed # crea admin, categorías, mesas, platos, insumos y recetas
npm run dev # http://localhost:4000El seed crea el usuario administrador
admin@sgpr.com/admin123. Cámbiale la contraseña apenas entres.
cd frontend
cp .env.example .env # VITE_API_URL=http://localhost:4000/api
npm install
npm run dev # http://localhost:5173| Rol | Puede |
|---|---|
| Cliente | Ver menú público, registrarse, pedir con carrito, ver sus pedidos, reservar mesa |
| Mesero | Panel de mesas en vivo, tomar comandas por mesa, cambiar estado de pedidos, facturar |
| Administrador | Todo lo anterior + CRUD de menú/categorías, inventario, proveedores, empleados, dashboard y reportes |
Base: /api — autenticación con Authorization: Bearer <token>.
| Módulo | Endpoints |
|---|---|
| Auth | POST /auth/register, POST /auth/login, GET /auth/me |
| Menú | GET /menu/categorias, GET /menu/platos, POST/PUT/DELETE /menu/platos (admin), POST /menu/categorias (admin) |
| Pedidos | GET /pedidos, GET /pedidos/:id, POST /pedidos, PATCH /pedidos/:id/estado, POST /pedidos/:id/facturar |
| Reservas | GET /reservas/disponibilidad, GET/POST /reservas, PATCH /reservas/:id/cancelar |
| Mesas | GET /mesas, POST /mesas (admin), PATCH /mesas/:id/estado (mesero/admin) |
| Inventario | GET /inventario, GET /inventario/alertas, POST/PUT/DELETE (admin) |
| Proveedores | CRUD completo (admin) |
| Usuarios | CRUD + desactivación (admin) |
| Reportes | GET /reportes/resumen, /reportes/ventas-diarias, /reportes/platos-mas-vendidos (admin) |
- Al crear un pedido se descuenta el inventario según la receta de cada plato (
plato_insumos); si no hay stock suficiente responde409. - El total se calcula en el backend:
subtotal + IVA (IVA_PORCENTAJE) + propina. - Facturar un pedido genera un registro en
facturasy pasa la mesa aen_limpieza. - Las acciones sensibles quedan registradas en la tabla
auditoria. - Los reportes usan las vistas
v_ventas_diarias,v_platos_mas_vendidosyv_alertas_stock.
Backend (backend/.env):
SUPABASE_URL=https://xxxx.supabase.co
SUPABASE_SERVICE_ROLE_KEY=sb_secret_xxxx
JWT_SECRET=una-cadena-larga-y-aleatoria # obligatorio, la API no arranca sin él
JWT_EXPIRES_IN=8h
PORT=4000
CORS_ORIGIN=http://localhost:5173
IVA_PORCENTAJE=0.08
PROPINA_SUGERIDA=0.10Frontend (frontend/.env):
VITE_API_URL=http://localhost:4000/api- Tests automatizados (Vitest / Supertest)
- Paginación en listados grandes
- Subida de imágenes de platos a Supabase Storage
- Notificaciones en tiempo real (hoy el frontend hace polling cada 8s)