Skip to content

Asignar líderes y pastores

Hay dos cosas distintas que podrías querer decir cuando dices "Jane lidera la Sede Norte". GCM las almacena en dos tablas diferentes y hacen trabajos muy diferentes.

  1. Líder de una unidad — el nombre de un solo miembro aparece en la tarjeta hero de la unidad, en la insignia de líder y en los reportes. Almacenado en org_units.leader_member_id.
  2. Usuario limitado a una unidad — el login de un usuario está restringido a ver solo la data en (y debajo de) esa unidad. Almacenado en user_unit_assignments_v2.

Un líder es una relación de visualización. Un alcance de usuario es una relación de seguridad. A menudo son la misma persona, pero no tienen que serlo — y cuando no lo son, verás el valor de la separación.

Popover de asignar líder

Definir un líder

En el árbol organizacional, cada fila de unidad tiene un botón Definir líder a la derecha de su nombre (o Cambiar líder si ya hay uno asignado). Haz clic para abrir un pequeño popover con una búsqueda de miembros.

  • Escribe dos caracteres para disparar el RPC search_members.
  • Selecciona un resultado para escribir leader_member_id en la unidad.
  • Un toast confirma; la fila se actualiza inmediatamente con el nuevo nombre y un pequeño avatar.
  • Para limpiar, abre el popover en una unidad que ya tenga un líder y haz clic en Quitar líder.

El botón usa un contorno ámbar suave cuando no hay líder asignado, atrayendo tu vista a los huecos. En árboles grandes así es como detectas células sin personal sin tener que hacer scroll.

Qué hace definir un líder:

  • El nombre y avatar del líder aparece en la tarjeta de la unidad, en el hero del detalle de la unidad, y en cada lugar donde la unidad se menciona en los reportes.
  • La foto y el anillo de estado activo/perdido del líder se renderizan vía el componente compartido MemberAvatar, así que un líder que se ha "perdido" obtiene una pista visual.
  • La vista unit_with_leader impulsa la proporción "líderes asignados" en la página de nivel (ej. "2 / 7 líderes asignados").
  • No cambia lo que el login del usuario de ese miembro puede ver. Eso es la siguiente sección.

Limitar un usuario a una unidad

Esta es la mitad de seguridad. Una cuenta de usuario (no un registro de miembro) recibe una fila en user_unit_assignments_v2 por cada unidad que le otorgues. Su alcance visible es la unión de sus unidades asignadas y cada descendiente.

Dónde definirlo

Ve a Usuarios y roles → Usuarios, encuentra la fila y haz clic en Editar asignaciones. El selector muestra tu jerarquía completa con casillas de verificación. Marca cada unidad que deba ver.

Un patrón típico:

  • Un admin de organización tiene cero filas en la tabla — ve todo.
  • Un pastor regional tiene una fila en el nivel 1 (una región). Ve las sedes, centros, células y miembros de esa región.
  • Un pastor de célula tiene una fila en el nivel 3 (una célula). Ve solo su célula.
  • Un director de alabanza multi-campus tiene dos filas en el nivel 2. Ve los subárboles de ambos campus.

Cómo se aplica el alcance

Cuando un usuario no admin inicia sesión, el frontend llama a un RPC de Postgres llamado user_visible_unit_ids que recorre el árbol y devuelve cada id de unidad que puede tocar. El hook useUnitScope cachea el resultado por 2 minutos.

Cada página de lista en GCM filtra por org_unit_id IN (visible_unit_ids) antes de renderizar. Las políticas RLS sobre las tablas subyacentes hacen lo mismo. Un pastor que edite las peticiones de red de su navegador no puede sacar filas fuera de su alcance — la base de datos las rechaza.

Fail-closed por defecto

Si el RPC falla o aún no ha devuelto, el hook trata el alcance como vacío en lugar de abierto. Un parpadeo de red no le mostrará accidentalmente a un pastor la data del pastor principal — solo verá una lista vacía hasta que el RPC se resuelva.

Cuando el líder y el alcance del usuario divergen

Casos comunes en los que intencionalmente no son la misma persona:

  • El líder de un grupo pequeño es el pastor reconocido que anunciarías desde el púlpito, pero no usa la app. No existe una fila de user_unit_assignments_v2 para él.
  • Un asistente administrativo tiene alcance de usuario para ingresar data de una sede pero no es el líder público. Recibe una fila en user_unit_assignments_v2 pero leader_member_id apunta al pastor.
  • Un pastor regional es el líder de su región (nivel 1) y también tiene alcance de usuario en ese nivel. Los dos registros coinciden. Este es el caso más común.

GCM nunca sincroniza los dos automáticamente. Definir un líder no crea una fila de alcance de usuario, y dar a un usuario alcance no lo define como el líder. Haces ambas llamadas de manera deliberada.

El nivel más estrecho

Cuando un usuario tiene asignaciones en varios niveles, GCM elige el más estrecho (índice de nivel con número más alto) como su filtro por defecto en los selectores en cascada. Esto significa que un usuario asignado a una región y a una célula específica por defecto va a la vista de célula, con un toggle manual para ampliar.

useUnitScope expone esto como narrowestLevel. Los selectores por encima de ese nivel pueden quedar bloqueados a la única asignación del usuario si solo tiene una en ese nivel.

Resumen de permisos

AcciónAdminPastor regionalPastor de célulaMiembro
Asignar un líder a una unidaddentro del alcancenono
Definir alcance de usuario a una unidaddentro del alcancenono
Ver miembros de una unidadglobaldentro del alcancedentro del alcancesolo el propio
Ver asistencia de una unidadglobaldentro del alcancedentro del alcancesolo el propio
Ver donaciones de una unidad (si no está bloqueado por privacidad)globaldentro del alcanceconfigurablesolo el propio

"Dentro del alcance" significa que el usuario solo puede tocar unidades que estén en su propio subárbol visible. Puede otorgar un alcance no más amplio que el suyo.

Preguntas comunes

¿Puede un líder ver la lista de miembros de su unidad sin alcance de usuario? Solo si su cuenta de usuario tiene alcance. Definir leader_member_id a un miembro no le otorga un login ni un alcance. Si aún no tiene un login, invítalo vía Usuarios y roles y elige la unidad durante el flujo de invitación — GCM crea la fila de user_unit_assignments_v2 por ti.

¿Qué pasa si asigno a un líder que no es un miembro? No puedes. El selector de líder solo muestra miembros existentes. Agrégalo primero como miembro.

¿Archivar una unidad limpia su líder? No — el leader_member_id se queda. Cuando la unidad se restaura, el líder sigue adjunto. Archivar tampoco remueve las filas de alcance de usuario; las unidades restauradas vuelven totalmente conectadas.

¿Puede el mismo miembro liderar varias unidades? Sí. No hay una restricción de unicidad sobre leader_member_id. Un pastor puede liderar una región y una célula al mismo tiempo — común cuando un pastor principal también dirige un grupo de discipulado.

Próximos pasos