> ## Documentation Index
> Fetch the complete documentation index at: https://help.agatabo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Préférences Utilisateur

> Gérer les informations de profil personnelles et le mot de passe

## Aperçu

Les **Préférences Utilisateur** vous permettent de gérer vos informations de profil personnelles et votre mot de passe. Ce sont des paramètres propres à l'utilisateur qui s'appliquent uniquement à votre compte, contrairement aux paramètres à l'échelle de l'organisation.

<Note>
  **Authentification requise** : Tous les endpoints exigent une authentification utilisateur (jeton d'accès valide).

  Ces endpoints agissent uniquement sur le profil de l'utilisateur authentifié. Aucune autorisation spéciale n'est requise au-delà de la connexion.
</Note>

***

## Points d'Accès API

### Obtenir Mon Profil

**Récupérer vos propres informations de profil :**

```http theme={null}
GET /users/me
Headers:
  Authorization: Bearer {accessToken}
```

**Réponse :**

```json theme={null}
{
  "message": "User profile fetched successfully",
  "user": {
    "id": "user-123",
    "name": "John Doe",
    "phone": "+250781234567",
    "email": "john.doe@example.com",
    "profilePhotoUrl": "https://example.com/photos/john.jpg",
    "createdAt": "2025-01-15T10:30:00.000Z"
  }
}
```

***

### Mettre à Jour Mon Profil

**Mettre à jour vos informations de profil :**

```http theme={null}
PUT /users/me
Headers:
  Authorization: Bearer {accessToken}
Body:
{
  "name": "John Doe",
  "email": "john.doe@example.com",
  "phone": "+250781234567",
  "profilePhotoUrl": "https://example.com/photos/john.jpg"
}
```

**Champs du corps de requête :**

| Champ             | Type   | Obligatoire | Validation                | Description               |
| ----------------- | ------ | ----------- | ------------------------- | ------------------------- |
| `name`            | string | Non         | -                         | Nom d'affichage           |
| `email`           | string | Non         | Format email valide       | Adresse email             |
| `phone`           | string | Non         | Numéro rwandais (+250...) | Numéro de téléphone       |
| `profilePhotoUrl` | string | Non         | URL valide                | URL de la photo de profil |

**Tous les champs sont optionnels** - incluez seulement les champs à mettre à jour.

**Réponse :**

```json theme={null}
{
  "message": "User updated successfully",
  "user": {
    "id": "user-123",
    "name": "John Doe",
    "phone": "+250781234567",
    "email": "john.doe@example.com",
    "profilePhotoUrl": "https://example.com/photos/john.jpg"
  }
}
```

**Cas d'erreur :**

| Statut | Message                                        | Cause                                             |
| ------ | ---------------------------------------------- | ------------------------------------------------- |
| 401    | "User not found"                               | Jeton invalide ou utilisateur supprimé            |
| 409    | "User with that email or phone already exists" | Conflit email/téléphone avec un autre utilisateur |

***

### Changer le Mot de Passe

**Mettre à jour votre mot de passe :**

```http theme={null}
POST /users/change-password
Headers:
  Authorization: Bearer {accessToken}
Body:
{
  "oldPassword": "current-password",
  "newPassword": "new-password"
}
```

**Champs du corps de requête :**

| Champ         | Type   | Obligatoire | Validation                               | Description                           |
| ------------- | ------ | ----------- | ---------------------------------------- | ------------------------------------- |
| `oldPassword` | string | Oui         | Doit correspondre au mot de passe actuel | Mot de passe actuel pour vérification |
| `newPassword` | string | Oui         | Minimum 6 caractères                     | Nouveau mot de passe                  |

**Réponse :**

```json theme={null}
{
  "message": "Password changed successfully."
}
```

**Cas d'erreur :**

| Statut | Message                    | Cause                                  |
| ------ | -------------------------- | -------------------------------------- |
| 401    | "User not found"           | Jeton invalide ou utilisateur supprimé |
| 401    | "User has no password set" | Compte créé sans mot de passe          |
| 401    | "Invalid old password"     | Mot de passe actuel incorrect          |

**Important** : Après un changement de mot de passe, les sessions existantes restent valides. L'utilisateur n'est PAS déconnecté automatiquement.

***

## Champs de Profil Modifiables

### Nom

**Champ** : `name`

**Description** : Votre nom d'affichage visible dans l'application

**Exemple** : "John Doe"

**Utilisation** :

* Apparaît sur les enregistrements de transactions
* Visible dans les journaux d'audit
* Affiché aux autres membres de l'organisation

**Recommandation** : Utilisez votre vrai nom pour la responsabilité

***

### Adresse Email

**Champ** : `email`

**Description** : Adresse email pour les notifications et la connexion

**Format** : Format email valide

**Exemple** : "[john.doe@example.com](mailto:john.doe@example.com)"

**Utilisation** :

* Identifiant de connexion (en plus du téléphone)
* Destinataire des notifications email (si l'organisation a activé l'email)
* Destination de réinitialisation du mot de passe

**Validation** : Doit être unique parmi tous les utilisateurs d'Agatabo (pas seulement votre organisation)

**Important** : Changer l'email ne nécessite pas de nouvelle vérification. Le nouvel email devient actif immédiatement.

***

### Numéro de Téléphone

**Champ** : `phone`

**Description** : Numéro de téléphone pour les notifications SMS et la connexion

**Format** : Numéro rwandais au format international

**Exemple** : "+250781234567"

**Validation** :

* Doit commencer par "+250"
* Doit être un format de numéro rwandais valide
* Doit être unique parmi tous les utilisateurs

**Utilisation** :

* Identifiant de connexion (en plus de l'email)
* Destinataire des notifications SMS (si l'organisation a activé les SMS)
* Destination de réinitialisation du mot de passe (via SMS)

**Recommandation** : Gardez le numéro de téléphone à jour pour la récupération du compte

***

### Photo de Profil

**Champ** : `profilePhotoUrl`

**Description** : URL vers votre photo de profil

**Format** : URL valide (http ou https)

**Exemple** : "[https://example.com/photos/profile.jpg](https://example.com/photos/profile.jpg)"

**Utilisation** :

* Affichée dans la barre de navigation
* Affichée dans les menus utilisateur

**Remarque** : Agatabo n'héberge pas les photos. Vous devez fournir une URL vers une image hébergée à l'extérieur.

***

### Mot de Passe

**Mis à jour via** : `POST /users/change-password` (endpoint séparé)

**Exigences** :

* Minimum 6 caractères
* Mot de passe actuel requis pour vérification

**Bonnes pratiques** :

* Utiliser un mélange de lettres, chiffres et symboles
* Ne pas réutiliser les mots de passe d'autres services
* Utiliser un gestionnaire de mots de passe pour des mots de passe forts
* Changer le mot de passe si vous suspectez un accès non autorisé

**Sécurité** : Les mots de passe sont hachés avec bcrypt. Ils ne sont jamais stockés ou transmis en texte clair.

***

## Champs Immuables

**Ces champs NE PEUVENT PAS être modifiés par les utilisateurs :**

### ID Utilisateur

**Champ** : `id`

**Description** : Identifiant unique généré par le système

**Exemple** : "user-abc123"

**Utilisation** : Références internes de base de données, paramètres API

***

### Créé Le

**Champ** : `createdAt`

**Description** : Horodatage de création du compte

**Format** : Date/heure ISO 8601

**Exemple** : "2025-01-15T10:30:00.000Z"

***

## Paramètres au Niveau Organisation

**Les éléments suivants ne sont PAS des préférences utilisateur** (contrôlés au niveau organisation) :

### Préférences de Notification

**Limite actuelle** : Les utilisateurs NE PEUVENT PAS se désabonner de types individuels de notifications.

**Fonctionnement** :

* L'administrateur de l'organisation active/désactive les notifications email pour toute l'organisation
* L'administrateur de l'organisation active/désactive les notifications SMS pour toute l'organisation
* Si activées, TOUS les utilisateurs avec email/téléphone reçoivent les notifications

**Solution de contournement** (non recommandée) :

* Retirer l'email/téléphone du profil pour arrêter les notifications
* Cela affecte la capacité de connexion (vous ne pourrez utiliser que l'identifiant restant)

Voir : [Paramètres de l'Organisation](/fr/tontines/settings/organization-settings)

***

### Préférences d'Affichage

**Actuellement NON disponible** :

Les fonctionnalités suivantes n'existent pas au niveau utilisateur ou organisation :

* Sélection de langue (le système utilise la langue du navigateur)
* Thème (mode clair/sombre)
* Format de date/heure personnalisé (utilise le paramètre organisation)
* Personnalisation de la mise en page du tableau de bord
* Filtres par défaut des rapports
* Préférence de fuseau horaire (utilise le fuseau horaire de l'organisation)

Elles peuvent être ajoutées dans de futures versions.

***

## Cas d'Utilisation Courants

### Mettre à Jour Votre Email

**Appel API :**

```bash theme={null}
curl -X PUT "/users/me" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "newemail@example.com"
  }'
```

**Résultat** : Email mis à jour immédiatement. Aucun email de vérification envoyé.

**Important** :

* Assurez-vous d'avoir accès au nouvel email (pour les futures réinitialisations de mot de passe)
* Le nouvel email ne doit pas être utilisé par un autre compte

***

### Mettre à Jour le Numéro de Téléphone

**Appel API :**

```bash theme={null}
curl -X PUT "/users/me" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+250787654321"
  }'
```

**Format du téléphone** :

* Doit commencer par "+250"
* Doit être un numéro rwandais valide
* Exemple : "+250781234567"

**Erreur de validation si** :

* Le téléphone ne correspond pas au format rwandais
* Le téléphone est déjà utilisé par un autre compte

***

### Changer le Mot de Passe

**Appel API :**

```bash theme={null}
curl -X POST "/users/change-password" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "oldPassword": "current-password",
    "newPassword": "new-strong-password-123"
  }'
```

**Résultat** : Mot de passe changé immédiatement. Les sessions existantes restent valides.

**Note de sécurité** : Les sessions ne sont PAS invalidées automatiquement. L'utilisateur reste connecté sur tous les appareils.

***

### Mettre à Jour Plusieurs Champs à la Fois

**Appel API :**

```bash theme={null}
curl -X PUT "/users/me" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jane Smith",
    "email": "jane.smith@example.com",
    "phone": "+250781234567",
    "profilePhotoUrl": "https://example.com/jane.jpg"
  }'
```

**Tous les champs sont optionnels** - incluez seulement ce que vous voulez mettre à jour.

***

## Flux de Réinitialisation du Mot de Passe

**Si vous avez oublié votre mot de passe :**

### Étape 1 : Demander la Réinitialisation

**Endpoint API :**

```http theme={null}
POST /users/reset-password
Body:
{
  "identifier": "john.doe@example.com"
}
```

**identifier** peut être :

* Adresse email
* Numéro de téléphone (commençant par "+")

**Réponse :**

```json theme={null}
{
  "message": "If an account with that identifier exists, a password reset link has been sent."
}
```

**Ce qui se passe** :

* Si l'identifiant est un email : lien de réinitialisation envoyé par email
* Si l'identifiant est un téléphone : lien de réinitialisation envoyé par SMS
* Si l'identifiant n'existe pas : même message retourné (sécurité - ne pas révéler l'existence du compte)

**Exemple d'email :**

Objet : "Reset your Agatabo password"

Corps : "Reset your Agatabo password: [https://agatabo.com/auth/reset-password?token=abc123xyz](https://agatabo.com/auth/reset-password?token=abc123xyz)..."

***

### Étape 2 : Confirmer la Réinitialisation

**Après avoir cliqué sur le lien de réinitialisation, soumettre le nouveau mot de passe :**

```http theme={null}
POST /users/reset-password/confirm
Body:
{
  "token": "abc123xyz",
  "newPassword": "new-password-here"
}
```

**Réponse :**

```json theme={null}
{
  "message": "Password reset successfully",
  "accessToken": "eyJhbGc...",
  "refreshToken": "eyJhbGc...",
  "user": {
    "id": "user-123",
    "name": "John Doe",
    "phone": "+250781234567",
    "email": "john.doe@example.com",
    "profilePhotoUrl": "https://example.com/photos/john.jpg",
    "userType": "user"
  }
}
```

**Important** :

* Toutes les sessions existantes sont invalidées (déconnexion de tous les appareils)
* Une nouvelle session est créée automatiquement (utilisateur connecté)
* Le jeton de réinitialisation ne peut être utilisé qu'une seule fois

***

## Bonnes Pratiques

<Note>
  **Gestion de vos préférences utilisateur :**

  **Mises à jour du profil :**

  * ✅ Garder email et téléphone à jour pour la récupération du compte
  * ✅ Utiliser un vrai nom pour la responsabilité
  * ✅ Vérifier immédiatement le changement email/téléphone (tester les notifications)
  * ✅ Mettre à jour la photo de profil depuis un hébergement fiable (pas de liens temporaires)

  **Sécurité du mot de passe :**

  * ✅ Utiliser au moins 10 caractères (même si le système accepte 6)
  * ✅ Inclure majuscules, minuscules, chiffres, symboles
  * ✅ Utiliser un mot de passe unique (pas réutilisé d'autres sites)
  * ✅ Utiliser un gestionnaire de mots de passe (LastPass, 1Password, Bitwarden)
  * ✅ Changer le mot de passe si une activité suspecte est détectée

  **Unicité email/téléphone :**

  * ✅ Un email = un compte Agatabo (impossible de partager entre comptes)
  * ✅ Un téléphone = un compte Agatabo
  * ✅ Pour utiliser le même email/téléphone ailleurs, le retirer d'abord du compte actuel

  **Réinitialisation du mot de passe :**

  * ✅ Vérifier le dossier spam si l'email de réinitialisation n'arrive pas
  * ✅ Attendre 5 minutes avant de demander une autre réinitialisation
  * ✅ Contacter l'administrateur si les emails de réinitialisation n'arrivent pas
  * ✅ Le jeton de réinitialisation expire après un délai limité (l'utiliser rapidement)

  **Confidentialité :**

  * ✅ Votre nom est visible par les autres membres de l'organisation
  * ✅ Email/téléphone visibles par les administrateurs de l'organisation
  * ✅ Le mot de passe n'est jamais visible par personne (chiffré)
  * ✅ La photo de profil ne doit pas contenir d'informations sensibles
</Note>

***

## Dépannage

**Q : Le changement d'email/téléphone indique "already exists"**

R : Erreur : "User with that email or phone already exists"

**Cause** : Un autre compte utilisateur possède déjà cet email ou téléphone.

**Solution** :

* Utiliser un autre email/téléphone
* Si vous possédez l'autre compte, retirer d'abord l'email/téléphone de cet autre compte
* Contacter l'administrateur si l'email/téléphone est incorrectement assigné ailleurs

***

**Q : Le changement de mot de passe indique "invalid old password"**

R : Erreur : "Invalid old password"

**Cause** : Mot de passe actuel saisi incorrectement.

**Solution** :

* Vérifier le mot de passe actuel (Caps Lock, disposition clavier)
* Si réellement oublié, utiliser le flux de réinitialisation du mot de passe
* Contacter l'administrateur si le compte est verrouillé

***

**Q : La mise à jour du profil ne se reflète pas immédiatement**

R : Vérifiez :

* La requête a-t-elle réussi ? (réponse 200)
* Essayez de vous déconnecter puis reconnecter
* Vider le cache du navigateur
* Vérifier si vous consultez des données en cache

***

**Q : Puis-je utiliser l'email/téléphone d'un compte supprimé ?**

R : Dépend de l'implémentation. Si le compte utilisateur a été supprimé :

* L'email/téléphone peut redevenir disponible
* Peut nécessiter une intervention administrateur
* Contacter le support si l'erreur persiste

***

**Q : Je veux désactiver les notifications seulement pour moi**

R : Impossible. Les notifications sont des paramètres à l'échelle de l'organisation.

**Options** :

* Demander à l'administrateur de désactiver les notifications pour toute l'organisation
* Retirer votre email/téléphone (affecte la capacité de connexion - non recommandé)

Voir : [Paramètres de l'Organisation](/fr/tontines/settings/organization-settings)

***

**Q : Email de réinitialisation du mot de passe non reçu**

R : Vérifiez :

* Dossier spam/courrier indésirable
* Adresse email correcte (pas de faute)
* Service email configuré pour l'organisation
* Attendre 5 minutes (la livraison email peut être retardée)

Contactez l'administrateur si toujours non reçu.

***

**Q : Je veux changer le fuseau horaire/format de date**

R : Ce sont des paramètres au niveau organisation, pas des préférences utilisateur.

Contactez un administrateur avec l'autorisation `settings:write`.

Voir : [Paramètres de l'Organisation](/fr/tontines/settings/organization-settings)

***

## Sujets Connexes

<CardGroup cols={2}>
  <Card title="Paramètres de l'Organisation" icon="gear" href="/fr/tontines/settings/organization-settings">
    Configuration à l'échelle de l'organisation
  </Card>

  <Card title="Gestion des Membres" icon="users" href="/fr/tontines/organization-users/managing-users">
    Mettre à jour les informations des membres (pour admins)
  </Card>

  <Card title="Autorisations" icon="shield" href="/fr/tontines/settings/permissions">
    Contrôle d'accès et rôles
  </Card>

  <Card title="Piste d'Audit" icon="file-magnifying-glass" href="/fr/tontines/advanced/audit-trail">
    Suivre les changements de profil
  </Card>
</CardGroup>
