Sistema B2B de Organizaciones
Sección titulada «Sistema B2B de Organizaciones»El sistema B2B (Business-to-Business) permite a empresas comprar suscripciones de equipo con múltiples asientos (seats) y gestionar el acceso de sus empleados a los cursos de TalentBricksAI.
¿Qué es el Sistema B2B?
Sección titulada «¿Qué es el Sistema B2B?»El sistema B2B transforma TalentBricksAI en una plataforma de aprendizaje corporativa, permitiendo a las empresas:
- 🏢 Crear organizaciones con múltiples miembros
- 💳 Comprar planes de equipo con X cantidad de asientos
- 👥 Gestionar miembros con diferentes roles y permisos
- 📚 Asignar cursos a toda la organización
- 📊 Ver analíticas del progreso del equipo
- 🔐 Controlar accesos según roles (OWNER, ADMIN, MEMBER)
Jerarquía de Roles
Sección titulada «Jerarquía de Roles»Platform Admin (isAdmin = true en User) └─ Acceso completo a todas las organizaciones
Organization OWNER └─ Control total de su organización • Gestionar facturación • Invitar/remover miembros • Asignar cursos • Cambiar roles • Eliminar organización
Organization ADMIN └─ Gestión de equipo • Invitar/remover miembros • Asignar cursos • Ver analíticas • NO puede gestionar facturación
Organization MEMBER └─ Acceso de usuario final • Acceder a cursos asignados • Ver progreso personal • NO puede gestionar el equipoDocumentación Disponible
Sección titulada «Documentación Disponible»Esta sección contiene tres guías principales:
Tiempo de lectura: 10 minutos
Aprende a usar el sistema B2B en 5 minutos. Incluye:
- Setup inicial (3 pasos)
- Credenciales de prueba
- 6 flujos esenciales
- Comandos SQL útiles
- Troubleshooting común
Ideal para: Empezar a probar rápidamente el sistema.
Tiempo de lectura: 2+ horas
Guía exhaustiva para probar todo el sistema. Incluye:
- 11 flujos de prueba detallados
- Casos edge y límites
- Verificaciones en base de datos
- Checklist de funcionalidad completo
- Problemas conocidos y soluciones
Ideal para: QA completo antes de producción.
Tiempo de lectura: 20 minutos
Documentación técnica del sistema. Incluye:
- Diagramas de entidades (ERD)
- Diagramas de flujo
- Control de acceso
- Integración con Stripe
- Estructura de archivos
Ideal para: Desarrolladores que necesitan entender el código.
🔑 Credenciales de Prueba
Sección titulada «🔑 Credenciales de Prueba»Platform Admin
Sección titulada «Platform Admin»- Email:
admin@talentbricks.ai - Password:
Admin123! - Dashboard: http://localhost:3000/admin/organizations
Usuarios de Organizaciones
Sección titulada «Usuarios de Organizaciones»Password para todos: Test123!
| Rol | Organización | Dashboard | |
|---|---|---|---|
owner@talentbricks.test | OWNER | TalentBricks Corp (10 seats) | /team/{organizationId} |
admin@talentbricks.test | ADMIN | TalentBricks Corp | /team/{organizationId} |
member1@talentbricks.test | MEMBER | TalentBricks Corp | /team/{organizationId} |
member2@talentbricks.test | MEMBER | TalentBricks Corp | /team/{organizationId} |
owner@acme.test | OWNER | Acme Inc (25 seats) | /team/{organizationId} |
admin@acme.test | ADMIN | Acme Inc | /team/{organizationId} |
owner@startup.test | OWNER | StartupXYZ (5 seats) | /team/{organizationId} |
Inicio Rápido (3 Pasos)
Sección titulada «Inicio Rápido (3 Pasos)»1. Crear Datos de Prueba
Sección titulada «1. Crear Datos de Prueba»cd appwasp db seed seedOrganizationTestDataEsto crea:
- 3 organizaciones de prueba
- 7 usuarios con diferentes roles (ver tabla arriba)
- Cursos pre-asignados
- Invitaciones pendientes
2. Iniciar la Aplicación
Sección titulada «2. Iniciar la Aplicación»# Terminal 1: Base de datoswasp db start
# Terminal 2: Aplicaciónwasp start3. Acceder con Usuarios de Prueba
Sección titulada «3. Acceder con Usuarios de Prueba»Usa las credenciales de la tabla de arriba para iniciar sesión en http://localhost:3000
Características Principales
Sección titulada «Características Principales»Control de Acceso Basado en Roles (RBAC)
Sección titulada «Control de Acceso Basado en Roles (RBAC)»El sistema implementa RBAC completo con 4 niveles:
| Acción | Platform Admin | OWNER | ADMIN | MEMBER |
|---|---|---|---|---|
| Ver todas las organizaciones | ✅ | ❌ | ❌ | ❌ |
| Gestionar facturación | ✅ | ✅ | ❌ | ❌ |
| Invitar miembros | ✅ | ✅ | ✅ | ❌ |
| Remover miembros | ✅ | ✅ | ✅ | ❌ |
| Cambiar roles | ✅ | ✅ | ❌ | ❌ |
| Asignar cursos | ✅ | ✅ | ✅ | ❌ |
| Acceder cursos | ✅ | ✅ | ✅ | ✅ |
Gestión de Asientos (Seats)
Sección titulada «Gestión de Asientos (Seats)»Cada organización tiene:
- maxSeats: Número de asientos comprados
- usedSeats: Número de asientos ocupados
El sistema previene:
- ❌ Invitar más miembros que asientos disponibles
- ❌ Aceptar invitaciones cuando ya no hay seats
- ✅ Auto-decrementa seats al remover miembros
Sistema de Invitaciones
Sección titulada «Sistema de Invitaciones»Las invitaciones tienen:
- Token único para seguridad
- Expiración de 7 días
- Rol pre-asignado (OWNER, ADMIN, MEMBER)
- Email de notificación (opcional)
Acceso a Cursos
Sección titulada «Acceso a Cursos»Los miembros de una organización pueden acceder a cursos si:
- ✅ La organización tiene un
OrganizationEnrollmentpara ese curso - ✅ La organización tiene
subscriptionStatus === 'active' - ✅ El usuario es miembro activo de la organización
Integración con Stripe
Sección titulada «Integración con Stripe»El sistema se integra completamente con Stripe:
- Checkout de equipos con cantidad de seats
- Webhooks para actualizar subscriptions
- Portal de clientes para que OWNERs gestionen facturación
- Metadata para tracking de organizaciones
Modelos de Base de Datos
Sección titulada «Modelos de Base de Datos»Organization
Sección titulada «Organization»model Organization { id String name String domain String? maxSeats Int usedSeats Int subscriptionStatus String? subscriptionPlan String? paymentProcessorCustomerId String? datePaid DateTime?
members OrganizationMember[] enrollments OrganizationEnrollment[] invitations OrganizationInvitation[]}OrganizationMember
Sección titulada «OrganizationMember»model OrganizationMember { id String organizationId String userId String role OrganizationRole // OWNER | ADMIN | MEMBER joinedAt DateTime
@@unique([organizationId, userId])}OrganizationEnrollment
Sección titulada «OrganizationEnrollment»model OrganizationEnrollment { id String organizationId String courseId Int assignedById String assignedAt DateTime
@@unique([organizationId, courseId])}OrganizationInvitation
Sección titulada «OrganizationInvitation»model OrganizationInvitation { id String organizationId String email String role OrganizationRole token String @unique invitedBy String invitedAt DateTime expiresAt DateTime acceptedAt DateTime?
@@unique([organizationId, email])}Archivos Clave
Sección titulada «Archivos Clave»Backend
Sección titulada «Backend»app/src/organizations/operations.ts- Queries y Actionsapp/src/organizations/permissions.ts- Helpers de permisosapp/src/courses/operations.ts- Modificado para acceso org (línea 958)app/src/payment/stripe/webhook.ts- Webhooks de equipos
Frontend
Sección titulada «Frontend»app/src/organizations/pages/TeamDashboardPage.tsxapp/src/organizations/pages/TeamMembersPage.tsxapp/src/organizations/pages/TeamCoursesPage.tsxapp/src/organizations/pages/TeamPurchasePage.tsxapp/src/admin/dashboards/organizations/- Admin UI
Testing
Sección titulada «Testing»app/src/server/scripts/seedOrganizations.ts- Seed de datos de pruebaTESTING_GUIDE.md(en root) - Guía exhaustiva de pruebas
Rutas Principales
Sección titulada «Rutas Principales»Dashboard de Equipo
Sección titulada «Dashboard de Equipo»/team/{organizationId}- Vista general/team/{organizationId}/members- Gestión de miembros/team/{organizationId}/courses- Gestión de cursos/team/{organizationId}/analytics- Analíticas/team/{organizationId}/billing- Facturación (OWNER only)
Compra e Invitaciones
Sección titulada «Compra e Invitaciones»/teams/purchase- Comprar plan de equipo/invitation/{token}- Aceptar invitación/teams- Landing page de equipos
Admin Dashboard
Sección titulada «Admin Dashboard»/admin/organizations- Lista de organizaciones/admin/organizations/{organizationId}- Detalle de organización