---
name: s35-get-users-roles-teams
scenario: S35
description: Lister les utilisateurs actifs ou archivés — champs disponibles, limitation sur les rôles et équipes, utilisateurs archivés sans nom
tags: [users, roles, teams, archived, pagination, cache]
when_to_use: Quand on veut résoudre des noms d'employés depuis leur ID, lister les membres actifs, ou inclure les utilisateurs archivés dans un audit historique
risk: P2 — get_users ne retourne PAS les rôles ni les équipes. Les utilisateurs archivés ont firstName=null et lastName=null — seul l'email reste identifiable.
---

# Instructions — Lister les utilisateurs (membres)

## ⚠️ Rôles et équipes non disponibles

`get_users` retourne : `id`, `firstName`, `lastName`, `email`, `companyId`

**Ce qui n'est PAS disponible :**
- Rôle (admin, contrôleur, employé...)
- Équipe / département
- Date d'embauche ou de départ

→ Pour filtrer "les admins" ou "les managers" : impossible via `get_users` seul.
→ Solution : utiliser les cost centers ou champs analytiques comme proxy organisationnel.

## ⚠️ Utilisateurs archivés : firstName et lastName = null

Les utilisateurs archivés n'ont ni prénom ni nom — seuls `id` et `email` sont présents.

```json
// Utilisateur actif :
{ "id": "...", "firstName": "Alice", "lastName": "Martin", "email": "alice@spendesk.com" }

// Utilisateur archivé :
{ "id": "...", "firstName": null, "lastName": null, "email": "alice@spendesk.com" }
```

→ Toujours utiliser `email` comme label de fallback si `firstName=null`.
→ Format d'affichage recommandé : `firstName + lastName || email`

## ⚠️ Cache 1200 secondes (20 minutes)

Les données peuvent avoir jusqu'à 20min de retard.
→ Pour du temps réel (onboarding en cours, départ récent), en informer l'utilisateur.

## Étape 1 — Lister les utilisateurs actifs

```json
{ "companyId": "...", "status": "active", "pageSize": 100 }
```

Toujours paginer jusqu'à `hasNextPage=false` — ce compte a plus de 10 utilisateurs actifs (hasNextPage=true dès pageSize=10).

## Étape 2 — Inclure les utilisateurs archivés (audit historique)

```json
{ "companyId": "...", "status": "archived", "pageSize": 100 }
```

Usage : retrouver les dépenses passées d'un ancien employé (par email ou userId).
⚠️ `firstName`/`lastName` sont null — n'afficher que l'email ou l'ID.

## Étape 3 — Résoudre un userId en nom

Pour résoudre un `memberId` (issu d'une payable) en nom d'employé :
1. Appeler `get_users` (status=active)
2. Si non trouvé, appeler `get_users` (status=archived)
3. Afficher : `${user.firstName} ${user.lastName}` si non-null, sinon `user.email`

## Étape 4 — Utilisation comme référentiel pour spendesk_analyze_spend

Pour filtrer les dépenses par employé :
1. `get_users` → trouver le `userId` par prénom/email
2. Passer `filters.employeeIds=[userId]` dans `spendesk_analyze_spend`

## Exemple live (données réelles)

- Utilisateurs actifs : > 10 (hasNextPage=true à pageSize=10)
- Utilisateurs archivés : > 5 (hasNextPage=true à pageSize=5)
- Format archivé confirmé : `{ firstName: null, lastName: null, email: "nina.mayer@spendesk.com" }`

## Exemple de prompt

- "Liste tous les employés actifs" → status=active + pagination complète
- "Retrouve les dépenses de Nina Mayer (ancienne employée)" → status=archived, filter by email
- "Qui a le plus de dépenses en juin ?" → get_users + spendesk_analyze_spend groupBy=employee
