/** * Grupos (ADR-083) — subdivisión de una organización que agrupa RECURSOS y * PERSONAS a la vez. Servicio de plataforma, agnóstico de dominio: el mismo * contrato sirve a la línea de producción de Merotz, al refugio de Chesed o al * evento de Bingo. Cada app le pone su etiqueta ("Equipo", "Sucursal") vía i18n * — el modelo no la sabe. */ export interface ValGroup { id: string; orgId: string; appId: string; /** Etiqueta de dominio que declara la app: "machine", "shelter", "event". */ kind?: string; /** Texto del CLIENTE ("Línea 3"): no se traduce. */ name: string; parentId?: string; archived: boolean; createdAt: string; createdBy?: string; updatedAt: string; } export interface ValGroupMember { groupId: string; orgId: string; userId: string; groupName?: string; addedAt: string; addedBy?: string; } export interface CreateGroupRequest { name: string; kind?: string; } export interface UpdateGroupRequest { name: string; } export interface AddGroupMemberRequest { userId: string; } export interface GroupResponse { operationId: string; group: ValGroup; } export interface ListGroupsResponse { operationId: string; groups: ValGroup[]; count: number; } export interface ListGroupMembersResponse { operationId: string; members: ValGroupMember[]; count: number; } /** * Respuesta de "mis grupos": lo que alimenta el filtrado del lado del cliente * cuando hace falta mostrar contexto (p.ej. qué grupo eligió el usuario por * default), aunque el filtrado real siempre corre en el backend. */ export interface MyGroupsResponse { operationId: string; groupIds: string[]; /** * El usuario ve TODOS los grupos sin importar membresía (permiso * `groups:all`). Sin `omitempty` del lado del backend a propósito: un * `false` ausente sería indistinguible de una respuesta vieja. */ allGroups: boolean; groups: ValGroupMember[]; }