100 lines
3.5 KiB
Markdown
100 lines
3.5 KiB
Markdown
# Casa Benell - Dashboard ejecutivo
|
|
|
|
Dashboard en Next.js + TypeScript para Casa Benell, con base PostgreSQL para auth/roles/invitaciones.
|
|
|
|
## Stack
|
|
- Next.js (App Router) + TypeScript
|
|
- TailwindCSS
|
|
- Recharts (Sankey)
|
|
- Zustand (estado UI persistido en `localStorage`)
|
|
- Prisma + PostgreSQL
|
|
- NextAuth (credentials + adapter Prisma)
|
|
- Nodemailer (SMTP invitations)
|
|
|
|
## Ejecutar
|
|
```bash
|
|
npm install
|
|
npm run dev
|
|
```
|
|
Abre `https://benell.maliountech.com.mx`.
|
|
|
|
## Configuración backend (Fase 3/4)
|
|
1. Crea tu archivo de entorno:
|
|
```bash
|
|
cp .env.example .env.local
|
|
```
|
|
2. Ajusta valores reales (DB, `NEXTAUTH_SECRET`, SMTP).
|
|
Importante: define `APP_URL` con `https://benell.maliountech.com.mx` para enlaces por correo.
|
|
3. Genera cliente Prisma y aplica migraciones:
|
|
```bash
|
|
npm run prisma:generate
|
|
npm run prisma:migrate
|
|
npm run prisma:seed
|
|
```
|
|
Para servidor (sin permisos de create database), usa:
|
|
```bash
|
|
npm run prisma:deploy
|
|
```
|
|
4. Inicia el proyecto:
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
Build de producción:
|
|
```bash
|
|
npm run build
|
|
npm run start
|
|
```
|
|
|
|
## Sync automático Meta (Marketing) diario 06:00
|
|
1. Define en `.env` o `.env.local`:
|
|
```bash
|
|
MARKETING_SYNC_CRON_SECRET="un-secreto-largo"
|
|
INSTAGRAM_TOKEN="..."
|
|
INSTAGRAM_USER_ID="..."
|
|
```
|
|
2. Instala unidades `systemd` (si despliegas con `systemd`):
|
|
```bash
|
|
sudo cp deploy/systemd/benell-marketing-sync.service /etc/systemd/system/
|
|
sudo cp deploy/systemd/benell-marketing-sync.timer /etc/systemd/system/
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now benell-marketing-sync.timer
|
|
```
|
|
3. Verifica:
|
|
```bash
|
|
systemctl status benell-marketing-sync.timer
|
|
systemctl list-timers | grep benell-marketing-sync
|
|
```
|
|
Nota: `OnCalendar=*-*-* 06:00:00` usa la zona horaria del servidor.
|
|
|
|
## Estructura relevante
|
|
- `src/app`: rutas App Router (`/login`, `/dashboard`, `/financial-flow`, etc.)
|
|
- `src/components`: shell y componentes UI reutilizables
|
|
- `src/lib/mock`: datos mock tipados (`locations`, `departments`, `kpis`, `initiatives`, `meetings`, `people`)
|
|
- `src/lib/store/ui-store.ts`: rol/filtros globales (persistidos)
|
|
- `src/styles/tokens.ts`: tokens de diseño (paleta, radios, sombras, spacing)
|
|
- `public/brand/logo.webp`, `public/brand/mascot.png`: assets de marca
|
|
- `prisma/schema.prisma`: modelos DB (users, roles, user_roles, invitations, next-auth tables)
|
|
- `src/app/api/invitations/route.ts`: crear invitaciones + envío SMTP
|
|
- `src/app/api/invitations/accept/route.ts`: aceptar invitación y crear/actualizar usuario
|
|
- `src/app/api/auth/register/route.ts`: crear cuenta y enviar verificación por correo
|
|
- `src/app/api/auth/verify-email/route.ts`: validar token de verificación y activar login
|
|
|
|
## Estado UI (sin backend)
|
|
- Rol de vista en topbar es informativo y se toma de la sesión autenticada (no editable en UI).
|
|
- Filtros de rango de fecha y ubicación en topbar
|
|
- Búsqueda global local para filtrar listas visibles
|
|
|
|
## Estado backend actual
|
|
1. Login con credenciales reales desde PostgreSQL.
|
|
2. Rutas de app protegidas con middleware (`/dashboard`, `/financial-flow`, etc).
|
|
3. Rol en sesión (`owner|leader|employee`) como fuente de verdad para la UI.
|
|
4. Invitaciones por email con token seguro hash + expiración + aceptación.
|
|
5. Botón "Crear cuenta" y verificación de correo antes de login.
|
|
6. Recuperación de contraseña por correo (`/forgot-password` + `/reset-password`).
|
|
|
|
## Pendiente
|
|
1. Migrar KPIs y métricas mock a tablas reales.
|
|
2. Agregar UI admin para listar/reenviar invitaciones.
|
|
3. Fortalecer manejo de errores SMTP/DB en panel de configuración.
|