Saltar al contenido principal
Versión: 2.0

Módulo: Miembros

Scope

Tipo de organizaciónAcceso
Empresa
Agencia
Reclutador independiente

Permisos por rol

AcciónDisponiblePermiso
Ver lista de miembrosmemberships:read
Invitar miembromemberships:invite
Asignar rolmemberships:update-role
Actualizar estadomemberships:update-status

¿Qué es?

Gestión de los miembros (usuarios) de la organización. Permite ver quién pertenece al equipo, su rol y estado, invitar nuevos miembros, y administrar accesos.

¿Qué puede hacer el usuario?

  • Ver lista paginada de miembros con scroll infinito
  • Buscar miembros por nombre, email o rol
  • Filtrar por estado (Todos, Activo, Invitado, Suspendido, Retirado)
  • Invitar nuevos miembros por email con rol seleccionado
  • Asignar rol a un miembro (próximamente)
  • Actualizar estado de un miembro (próximamente)

Flujo del usuario

Listar miembros

1. Abre "Equipo" → tab "Usuarios"
2. Ve lista con nombre, email, rol y estado
3. Busca por nombre/email/rol
4. Filtra por status con dropdown
5. Scroll infinito para cargar más

Invitar miembro

1. Presiona "Invitar" en el header
2. Se abre modal bottom sheet
3. Ingresa email del invitado
4. Selecciona rol de la lista de roles asignables
5. Confirma → se envía email de invitación
6. Navega automáticamente al tab "Invitaciones"

Reglas de negocio

  • Un usuario solo puede pertenecer a un tenant
  • Admins no pueden suspender/retirar su propia membresía
  • La invitación requiere email válido + rol seleccionado
  • Los roles asignables vienen del endpoint /roles/assignable
  • El filtro de búsqueda es client-side sobre datos ya cargados
  • El filtro de status es client-side (no se envía como query param)

Arquitectura

lib/features/team/
├── application/
│ ├── members_cubit.dart # loadMembers, loadMore, updateStatus, assignRole, loadAssignableRoles
│ └── members_state.dart # MembersStatus enum, members list, assignableRoles
├── data/
│ ├── datasources/
│ │ └── team_remote_datasource.dart # listMembers, updateMemberStatus, assignMemberRole
│ ├── models/
│ │ └── membership_model.dart # MembershipModel, MembershipsResponseModel
│ └── repositories/
│ └── team_repository_impl.dart
├── domain/
│ ├── entities/
│ │ └── membership.dart # Membership, MemberUser, MemberAvatar, MemberRole (Equatable)
│ └── repositories/
│ └── team_repository.dart
└── presentation/
└── tabs/
└── members_tab.dart # BlocProvider + BlocBuilder, invite modal

Endpoints API

MétodoEndpointPermisoDescripción
GET/membershipsmemberships:readLista miembros (paginado, search, sort, status)
PATCH/memberships/:id/statusmemberships:update-statusActualizar estado (ACTIVE, SUSPENDED, REMOVED)
PATCH/memberships/:id/rolememberships:update-roleAsignar rol a miembro
GET/roles/assignableroles:readRoles asignables para invitaciones
POST/memberships/invitationsmemberships:inviteCrear invitación

Registro DI

  • Cubit: Factory (nueva instancia por pantalla)
getIt<MembersCubit>()

Localización

✅ Completa — claves con prefijo members en ambos ARB:

  • Filtros: membersFilterAll, membersFilterActive, membersFilterInvited, etc.
  • UI: membersSubtitle, membersCount, membersSearchHint, membersInviteButton
  • Roles: membersRoleAdmin, membersRoleHr, membersRoleViewer, membersRoleAgencyAdmin, membersRoleRecruiter
  • Status: membersStatusActive, membersStatusInactive, membersStatusSuspended
  • Invite form: membersInviteTitle, membersInviteDescription, membersEmailLabel, etc.