> For the complete documentation index, see [llms.txt](https://bsensei-script.gitbook.io/bsensei-script-documentation-officiel-fivem/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bsensei-script.gitbook.io/bsensei-script-documentation-officiel-fivem/systemes-and-gestion/bsensei-multijob-gestion-complete-des-metiers/faq-and-problemes-frequents.md).

# FAQ & problèmes fréquents

## ❓ FAQ & problèmes fréquents

Cette page regroupe les problèmes les plus courants rencontrés avec **BSensei MultiJob** ainsi que les vérifications à effectuer avant de contacter le support.

***

### 📋 Le menu MultiJob ne s’ouvre pas

Vérifie que les ressources suivantes sont démarrées avant le script :

```
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure BSensei_multijob
```

Contrôle également la configuration du menu :

```lua
Config.Menu = {
    command = "multijob",
    key = "F4",
    enableKeyMapping = true,
}
```

Teste l’ouverture avec la commande :

```
/multijob
```

Si la commande fonctionne mais pas la touche, ouvre les paramètres FiveM :

```
Paramètres → Raccourcis clavier → FiveM
```

Recherche ensuite :

```
Ouvrir le menu multi-job
```

💡 Un joueur peut avoir remplacé la touche `F4` par une autre dans ses paramètres.

***

### 💼 Aucun métier n’apparaît dans le menu

Vérifie que le joueur possède bien un métier valide dans ESX.

Les métiers doivent exister dans les tables suivantes :

```
jobs
job_grades
```

Contrôle également que le métier n’est pas présent dans la liste noire :

```lua
Config.DynamicJobs.blacklist = {
    ["unemployed"] = true,
}
```

Pour recharger les métiers ESX sans redémarrer le serveur :

```
/mjrefreshjobs
```

Tu peux également importer le métier actif d’un joueur :

```
/mjimport
```

⚠️ Les commandes administrateur doivent être activées et ton groupe doit être autorisé.

***

### 🔄 Le métier actif n’est pas synchronisé

Vérifie que la synchronisation externe est activée :

```lua
Config.ExternalJobSync = {
    enabled = true,
    addOrUpdateOnExternalSetJob = true,
    removePreviousJobOnExternalUnemployed = true,
    closePreviousShiftOnExternalJob = true,
}
```

Cette option permet de détecter les changements effectués par :

* un menu patron externe ;
* une commande administrative ;
* un script de recrutement ;
* un script utilisant `xPlayer.setJob`.

Pour afficher davantage d’informations dans la console :

```lua
Config.ExternalJobSync.debug = true
```

Une fois le test terminé, désactive le debug :

```lua
Config.ExternalJobSync.debug = false
```

***

### 🆕 Un métier donné par un autre script n’apparaît pas

Assure-toi que cette option est activée :

```lua
Config.ExternalJobSync.addOrUpdateOnExternalSetJob = true
```

Le métier doit également exister dans les tables ESX :

```
jobs
job_grades
```

Vérifie que le script externe utilise correctement :

```lua
xPlayer.setJob(jobName, grade)
```

Pour tester manuellement, utilise la commande administrateur :

```
/mjadd
```

***

### 🚫 Le script indique que la limite de métiers est atteinte

Vérifie la limite configurée :

```lua
Config.JobLimit = {
    enabled = true,
    maxJobs = 2,
}
```

Avec cette configuration, chaque joueur peut conserver deux métiers maximum.

Pour augmenter la limite :

```lua
Config.JobLimit.maxJobs = 3
```

Pour désactiver complètement la limite :

```lua
Config.JobLimit.enabled = false
```

Certains groupes peuvent dépasser la limite :

```lua
Config.JobLimit.bypassGroups = {
    ["admin"] = true,
    ["superadmin"] = true,
}
```

⚠️ Le nom du groupe doit correspondre exactement au groupe ESX du joueur.

***

### 🗑️ Impossible de supprimer un métier

Vérifie que la suppression est activée :

```lua
Config.PlayerDelete.enabled = true
```

Si cette option est activée :

```lua
Config.PlayerDelete.keepAtLeastOneJob = true
```

Le joueur ne pourra pas supprimer son dernier métier.

Pour autoriser la suppression de tous les métiers :

```lua
Config.PlayerDelete.keepAtLeastOneJob = false
```

💡 La suppression depuis le menu retire le métier du MultiJob. Elle ne supprime pas le métier de la base de données ESX.

***

### 👻 Un métier supprimé réapparaît

Cela peut arriver lorsqu’un autre script redonne automatiquement le métier au joueur.

Vérifie les ressources utilisant :

```lua
xPlayer.setJob
```

Contrôle également cette option :

```lua
Config.ExternalJobSync.addOrUpdateOnExternalSetJob = true
```

Lorsqu’elle est activée, tout métier donné par un script externe est automatiquement ajouté au MultiJob.

Si nécessaire, supprime le métier avec la commande administrateur :

```
/mjremove
```

Puis vérifie qu’aucun autre script ne le redonne à la connexion.

***

### 🟢 La prise de service ne fonctionne pas

Vérifie la configuration hors service :

```lua
Config.OffDuty = {
    useOffJobIfExists = true,
    fallbackJob = "unemployed",
    fallbackGrade = 0,
}
```

Le script recherche une version hors service du métier.

Exemple :

```
police → offpolice
ambulance → offambulance
```

Le format dépend de ces options :

```lua
Config.DynamicJobs.offDutyPrefix = "off"
Config.DynamicJobs.offDutySeparator = ""
```

Avec un séparateur `_` :

```lua
Config.DynamicJobs.offDutySeparator = "_"
```

Le métier hors service attendu devient :

```
off_police
```

⚠️ Le métier hors service et ses grades doivent exister dans la base de données.

***

### 💤 Le joueur passe en `unemployed` hors service

Cela signifie qu’aucune version hors service du métier n’a été trouvée.

Le script utilise alors :

```lua
Config.OffDuty.fallbackJob = "unemployed"
Config.OffDuty.fallbackGrade = 0
```

Pour utiliser un véritable métier hors service, ajoute par exemple :

```
police
offpolice
```

Les deux métiers doivent posséder des grades compatibles dans `job_grades`.

***

### 📊 Le temps de travail n’est pas enregistré

Vérifie que `oxmysql` fonctionne correctement :

```
ensure oxmysql
ensure BSensei_multijob
```

Contrôle également :

* que les tables du script existent ;
* que le joueur a correctement pris son service ;
* que la session précédente a été fermée ;
* qu’aucune erreur SQL n’apparaît dans la console ;
* que l’identifiant ESX du joueur est valide.

Une session peut être fermée automatiquement lors d’un changement externe grâce à :

```lua
Config.ExternalJobSync.closePreviousShiftOnExternalJob = true
```

⚠️ Ne modifie pas manuellement les données de temps pendant qu’un joueur est connecté.

***

### ⏱️ Le temps de la session reste actif

Le joueur doit quitter correctement son service ou changer de métier depuis le MultiJob.

Vérifie cette option :

```lua
Config.ExternalJobSync.closePreviousShiftOnExternalJob = true
```

Elle permet de fermer la session lorsqu’un script externe modifie le métier actif.

Après une déconnexion anormale, le script doit également régulariser la session lors de la prochaine connexion.

Consulte la console serveur si une session reste bloquée.

***

### 👔 Le menu patron n’apparaît pas

Vérifie que les statistiques patron sont activées :

```lua
Config.BossStats.enabled = true
```

Le grade du joueur doit être reconnu comme patron :

```lua
Config.BossStats.bossGradeNames = {
    ["boss"] = true,
    ["patron"] = true,
}
```

Pour ajouter un autre nom de grade :

```lua
Config.BossStats.bossGradeNames["gerant"] = true
```

Tu peux également définir un grade minimum pour un métier précis :

```lua
Config.BossStats.minimumGradeByJob = {
    ["police"] = 4,
    ["ambulance"] = 3,
}
```

⚠️ Utilise le numéro du grade ESX et non son label visible.

***

### 🔴 Le patron doit être en service

Cette restriction est contrôlée ici :

```lua
Config.BossStats.requireOnDuty = true
```

Avec `true`, le patron doit être en service pour consulter les employés.

Pour autoriser l’accès hors service :

```lua
Config.BossStats.requireOnDuty = false
```

***

### 👥 Aucun employé n’apparaît dans le menu patron

Vérifie que les employés possèdent bien le métier concerné dans le MultiJob.

Contrôle également :

* le nom technique du métier ;
* les données enregistrées dans la base ;
* le grade du patron ;
* la synchronisation avec les scripts externes ;
* les erreurs SQL dans la console serveur.

Le nom technique doit être identique partout.

✅ Exemple correct :

```
mechanic
```

❌ Exemple incorrect :

```
mecano
mechanic_job
```

***

### 💰 La prime estimée est incorrecte

Vérifie le montant horaire par défaut :

```lua
Config.BossStats.bonus.defaultRatePerHour = 250
```

Tu peux définir un montant différent selon le métier :

```lua
Config.BossStats.bonus.ratePerHourByJob = {
    ["police"] = 300,
    ["ambulance"] = 350,
    ["mechanic"] = 200,
}
```

Contrôle également l’arrondi :

```lua
Config.BossStats.bonus.roundTo = 1
```

Et la limite maximale :

```lua
Config.BossStats.bonus.maxBonus = 0
```

`0` signifie qu’aucune limite n’est appliquée.

⚠️ La prime affichée est une estimation basée sur le temps de service enregistré.

***

### 🛡️ Les commandes administrateur ne fonctionnent pas

Vérifie qu’elles sont activées :

```lua
Config.AdminCommands.enabled = true
```

Ton groupe doit être autorisé :

```lua
Config.AdminCommands.allowedGroups = {
    ["admin"] = true,
    ["superadmin"] = true,
}
```

Commandes disponibles :

```
/mjadd
/mjremove
/mjgrade
/mjimport
/mjrefreshjobs
/mjfire
```

Vérifie également que les noms n’ont pas été modifiés dans :

```lua
Config.AdminCommands.commands
```

***

### 🔥 Un joueur licencié conserve encore son métier

Vérifie que le licenciement externe envoie le joueur vers :

```
unemployed
```

Cette option doit être activée :

```lua
Config.ExternalJobSync.removePreviousJobOnExternalUnemployed = true
```

Elle permet au script de détecter qu’un passage vers `unemployed` correspond à un licenciement.

Tu peux également retirer manuellement le métier :

```
/mjfire
```

ou :

```
/mjremove
```

***

### 🔔 Les notifications ne s’affichent pas

Vérifie le système sélectionné :

```lua
Config.Notifications.system = "ox_lib"
```

Systèmes disponibles :

```
ox_lib
esx
okokNotify
custom
```

Assure-toi que la ressource choisie démarre avant MultiJob.

Exemple avec `okokNotify` :

```
ensure okokNotify
ensure BSensei_multijob
```

Pour un système personnalisé, vérifie :

```
BSensei_multijob/editable.lua
```

***

### 🌍 Les textes restent dans la mauvaise langue

Vérifie la langue sélectionnée :

```lua
Config.Locale = "fr"
```

Assure-toi que la langue existe dans :

```
BSensei_multijob/locale.lua
```

Après une modification :

```
restart BSensei_multijob
```

⚠️ Ne renomme pas les clés de traduction et conserve les variables `%s`.

***

### 🗄️ Erreur SQL au démarrage

Vérifie que la connexion `oxmysql` fonctionne et que les tables ont été créées.

Si la création automatique est activée :

```lua
Config.Startup.autoCreateDatabase = true
```

Tu peux augmenter le délai d’initialisation :

```lua
Config.Startup.delay = 2000
```

Erreurs courantes :

```
Table doesn't exist
Unknown column
Duplicate entry
Column cannot be null
```

En cas d’erreur, compare la structure de la table avec le fichier SQL fourni.

⚠️ Effectue une sauvegarde de la base de données avant toute modification.

***

### 📁 Erreur après avoir renommé le dossier

Utilise le nom recommandé :

```
BSensei_multijob
```

Évite :

* les espaces ;
* les accents ;
* les parenthèses ;
* les numéros de version ;
* les doubles dossiers.

✅ Bon exemple :

```
resources/[bsensei]/BSensei_multijob
```

❌ Mauvais exemple :

```
resources/[bsensei]/BSensei_multijob_v1.0/BSensei_multijob
```

***

### 🧪 Vérification rapide

Pour vérifier l’installation, utilise cette procédure :

```
refresh
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure BSensei_multijob
```

Connecte-toi ensuite et teste :

```
/multijob
```

Puis contrôle :

1. L’affichage des métiers
2. Le changement de métier actif
3. La prise et la fin de service
4. La sauvegarde après reconnexion
5. La suppression d’un métier
6. Le menu patron
7. Les commandes administrateur
8. Les notifications

***

### 🚨 Avant de contacter le support

Prépare les informations suivantes :

* ton framework
* ton système d’inventaire
* ton système de notifications
* ton dispatch
* une capture de l’erreur
* les logs client F8
* les logs de la console serveur
* les modifications effectuées dans `config.lua`

💡 Ne transmets jamais tes clés privées, tokens Discord ou informations sensibles.

***

### 📞 Besoin d’aide supplémentaire ?

Si tu as suivi toute la doc et que le problème persiste :

💬 Rejoins le support :\
👉 <https://discord.gg/4kQQJPyJPJ>

***

© **BSensei Scripts** · Tous droits réservés.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://bsensei-script.gitbook.io/bsensei-script-documentation-officiel-fivem/systemes-and-gestion/bsensei-multijob-gestion-complete-des-metiers/faq-and-problemes-frequents.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
