Okouro doc

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 :

  • inactive est la valeur que vous définissez à la création d’un profil.
  • active est calculé à partir de la présence d’affectations actives.
  • bench est 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

ActionMéthodeCheminSuccès
Lister les invitationsGET/invitations200
InviterPOST/invitations201
Révoquer une invitationDELETE/invitations/{id}204
Accepter une invitationPOST/invitations/accept201
Lister les consultantsGET/consultants200
Obtenir un consultantGET/consultants/{id}200
Créer un consultantPOST/consultants201
Mettre à jour un consultantPUT/consultants/{id}200
Supprimer un consultantDELETE/consultants/{id}204
Lister les utilisateurs non reliésGET/users/unbound200

Une fois un consultant relié et affecté à une mission, passez à Suivre le temps et Dérouler une mission.