Bops
AI 봇 팀이 업무 운영을 담당, 메일·파이프라인·청구·보고서 관리, 각각 컴퓨터·이메일·전화번호 보유, 모든 정보를 기억
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
Attendance System for kruhr
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Registro de entrada y salida de colaboradores, con cálculo de horas por período para la nómina de Kru.
Prueba técnica: ver prueba-tecnica-kru-marcaje.md · plan en docs/plan.md · UI en docs/design-system.md.
Navegador ──► Vercel · Next.js 16 (apps/web)
│ rewrite /api/* (mismo origen → cookie first-party)
▼
Render · NestJS 11 (apps/api, Docker)
│ Drizzle + postgres.js (Transaction pooler · 6543)
▼
Supabase · Postgres
proxy.ts solo redirige a /login si falta la cookie.JwtAuthGuard global + @Public()) y, más adelante, el cálculo.Ya está listo:
httpOnly.packages/core, con los dos ejemplos del enunciado entre sus tests./marcar, /marcar/historial y /marcar/contrasena (cambiar su contraseña);/rrhh/<empresa>/hoy, colaboradores (alta, ficha, asignar contraseña, corregir con motivo e historial) y periodos (semana, quincenas o rango, alertas y CSV);/registro de empresas;/rrhh/<empresa>/equipo: el admin gestiona a los admins y analistas de su alcance;/admin: el superusuario gestiona grupos, empresas y sus admins./marcar/recibos.manifest.webmanifest), que abre en /panel y manda a cada quien a su pantalla./api/health, que hace select 1 contra la base.Los requerimientos, los roles, las vistas y el modelo de datos completo (incluida la nómina) están en docs/requisitos.md.
Requisitos: Node 24 (.nvmrc), Docker y pnpm vía corepack.
corepack enable
pnpm install
pnpm db:up
cp apps/api/.env.example apps/api/.env && cp apps/web/.env.example apps/web/.env.local
Edita apps/api/.env: al menos JWT_SECRET y las variables SEED_*, que son las claves de los usuarios de demo. Después crea las tablas y carga los datos de demo:
pnpm db:migrate && pnpm db:seed
pnpm dev
El seed es idempotente: si lo vuelves a correr, actualiza las claves. Crea estos usuarios:
| Rol | Usuario | Clave |
|---|---|---|
| superadmin | SEED_SUPERADMIN_EMAIL | SEED_SUPERADMIN_PASSWORD |
| admin de las empresas A Norte y A Sur | [email protected] | SEED_DEMO_PASSWORD |
| analista de A Norte | [email protected] | SEED_DEMO_PASSWORD |
| colaboradora de A Norte y A Sur (elige la empresa al entrar) | cédula 12345678 | SEED_DEMO_PASSWORD |
| admin de la empresa B | [email protected] | SEED_DEMO_PASSWORD |
Si DATABASE_URL apunta a Supabase, pnpm db:migrate y pnpm db:seed actúan sobre producción. Para usar la base local, anteponles DATABASE_URL=postgresql://postgres:postgres@localhost:5432/marcaje: la variable de entorno tiene prioridad sobre .env.
Para cambiar el esquema, edita apps/api/src/database/schema.ts y genera la migración con pnpm --filter @marcaje/api db:generate.
pnpm test
pnpm db:up && pnpm --filter @marcaje/api test:e2e
Los e2e de integración usan la base marcaje_test del Postgres de docker compose; la crean y la migran solos. Nunca tocan la base de desarrollo ni Supabase. Para usar otra base, define TEST_DATABASE_URL; su nombre debe contener test.
kru-attendance, us-west-2, la misma región que Render oregon)
ensure_rls.lock_down_public_default_privileges; equivale a desmarcar Automatically expose new tables:
alter default privileges for role postgres in schema public revoke all on tables from anon, authenticated;
alter default privileges for role postgres in schema public revoke all on sequences from anon, authenticated;
alter default privileges for role postgres in schema public revoke all on functions from anon, authenticated;
?sslmode=require y usarla como DATABASE_URL. Si la contraseña tiene caracteres especiales, hay que codificarlos (@ → %40).render.yaml: completar DATABASE_URL. JWT_SECRET se genera solo. Las migraciones y el seed se corren desde una máquina local contra la DATABASE_URL de Supabase (pnpm db:migrate, pnpm db:seed), antes de desplegar el código que las necesita.apps/web. Variables de entorno:
API_URL = URL pública de Render (sin /api).ENABLE_EXPERIMENTAL_COREPACK=1, para que use el pnpm fijado en packageManager.HEALTH_URL = https://<tu-app>.vercel.app/api/health. El workflow keepalive la llama cada 3 días para que Supabase no pause el proyecto.El plan gratuito de Render duerme el servicio tras 15 min sin tráfico; la primera petición tarda ~30–50 s.