Deux types d’enregistrement décrivent une personne. Un utilisateur peut se connecter et possède un rôle. Un consultant est un profil affectable qui porte un coût journalier, un responsable et un statut. Pour pouvoir suivre le temps de quelqu’un, il faut les deux, reliés entre eux : un consultant dont l’user_id pointe vers un utilisateur.
Ce guide couvre l’invitation de personnes, l’acceptation d’invitations et la création de profils de consultant - soit reliés à un utilisateur existant, soit en invitant un tout nouvel utilisateur en une seule étape.
Rôles requis
Inviter des utilisateurs et créer des consultants requiert un administrateur (ou, pour les consultants, un utilisateur des opérations). La personne invitée accepte sa propre invitation sans être connectée.
Inviter un collaborateur
Créez une invitation pour une adresse e-mail et un rôle. La personne invitée reçoit un jeton (envoyé par e-mail dans un déploiement réel) qu’elle utilise pour accepter.
POST /invitations HTTP/1.1
Authorization: Bearer <access_token>
Content-Type: application/json
{ "email": "ada@acme.com", "role": "consultant" }
Renvoie 201 Created avec une InvitationResponse :
{
"id": "0190a1c2-...",
"account_id": "0190a1c2-...",
"email": "ada@acme.com",
"role": "consultant",
"status": "pending",
"expires_at": "2026-01-12T09:00:00Z"
}
Listez les invitations avec GET /invitations et annulez-en une avec DELETE /invitations/{id} (204).
Accepter une invitation
La personne invitée définit un mot de passe et son nom à l’aide du jeton d’invitation. C’est un point d’entrée public, et elle est connectée immédiatement.
POST /invitations/accept HTTP/1.1
Content-Type: application/json
{
"token": "<invitation-token>",
"password": "a-strong-password",
"full_name": "Ada Lovelace"
}
Renvoie 201 Created avec une AuthResponse complète (voir Authentification). Le consultant_id du nouvel utilisateur est null tant qu’aucun profil de consultant n’est relié. Un jeton expiré renvoie 410 Gone.
Créer un profil de consultant
Un consultant peut être créé de deux façons.
Relier un utilisateur existant
Utilisez l’user_id obtenu lorsque l’utilisateur s’est inscrit ou a accepté son invitation.
POST /consultants HTTP/1.1
Authorization: Bearer <access_token>
Content-Type: application/json
{
"full_name": "Ada Lovelace",
"user_id": "0190a1c2-...",
"title": "Senior Engineer",
"daily_cost": "450.00"
}
Inviter un nouvel utilisateur dans le même appel
À la place de l’user_id, transmettez invite_email (et éventuellement invite_role, par défaut consultant). Okouro envoie l’invitation et relie le consultant automatiquement une fois l’invitation acceptée. user_id et invite_email sont mutuellement exclusifs.
{
"full_name": "Ada Lovelace",
"invite_email": "ada@acme.com",
"title": "Senior Engineer"
}
Les deux renvoient 201 Created avec une ConsultantResponse :
{
"id": "0190a1c2-...",
"account_id": "0190a1c2-...",
"full_name": "Ada Lovelace",
"user_id": "0190a1c2-...",
"user_email": "ada@acme.com",
"manager_id": null,
"manager_full_name": null,
"title": "Senior Engineer",
"daily_cost": "450.00",
"picture": null,
"status": "inactive"
}
Notez que daily_cost est null lorsque l’appelant est un jeton de rôle consultant (voir Rôles et permissions).
Statut
Le status d’un consultant vaut active, bench ou inactive :
inactiveest la valeur que vous définissez à la création d’un profil.activeest calculé à partir de la présence d’affectations actives.benchest calculé (un consultant actif sans affectation en cours) et ne peut pas être défini directement.
Sur PUT /consultants/{id}, vous ne pouvez définir qu’active ou inactive ; envoyer bench est rejeté.
Désigner un responsable
Définissez manager_id sur un identifiant d’utilisateur pour faire de cet utilisateur le responsable d’équipe du consultant. Cet utilisateur acquiert des pouvoirs de revue sur les feuilles de temps, les congés et les frais de ce consultant (voir Rôles et permissions).
Mettre à jour et effacer des champs
PUT /consultants/{id} remplace le profil. Les champs qui représentent des liens ou des téléversements doivent être renvoyés pour être conservés ; omettre user_id, manager_id ou picture les efface. Ainsi, lors de la mise à jour d’un nom, renvoyez les user_id et manager_id existants que vous souhaitez conserver.
Trouver les utilisateurs non encore reliés
GET /users/unbound liste les utilisateurs qui n’ont pas encore de profil de consultant - les candidats naturels à relier lors de la création d’un consultant.
Photos de profil
picture est une data URL (data:<mime>;base64,<data>), limitée à 5 Mo en brut. Elle est facultative à la création comme à la mise à jour.
Points d’entrée en un coup d’œil
| Action | Méthode | Chemin | Succès |
|---|---|---|---|
| Lister les invitations | GET | /invitations | 200 |
| Inviter | POST | /invitations | 201 |
| Révoquer une invitation | DELETE | /invitations/{id} | 204 |
| Accepter une invitation | POST | /invitations/accept | 201 |
| Lister les consultants | GET | /consultants | 200 |
| Obtenir un consultant | GET | /consultants/{id} | 200 |
| Créer un consultant | POST | /consultants | 201 |
| Mettre à jour un consultant | PUT | /consultants/{id} | 200 |
| Supprimer un consultant | DELETE | /consultants/{id} | 204 |
| Lister les utilisateurs non reliés | GET | /users/unbound | 200 |
Une fois un consultant relié et affecté à une mission, passez à Suivre le temps et Dérouler une mission.