> 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/configuration.md).

# Configuration

## ⚙️ Configuration complète du script

Le fichier `config.lua` permet de personnaliser entièrement le fonctionnement de **BSensei MultiJob** selon les besoins de ton serveur.

Tu peux notamment modifier la limite de métiers, le système hors service, le menu patron, les commandes administrateur ou encore les notifications.

***

### 📁 Localisation du fichier

Le fichier se trouve ici :

```
BSensei_multijob/config.lua
```

***

### 🌍 Langue du script

Sélectionne la langue utilisée pour les textes et notifications :

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

Langues incluses :

```
fr
en
```

Exemple pour utiliser l’anglais :

```lua
Config.Locale = "en"
```

***

### 🗄️ Gestion automatique de la base de données

Cette section contrôle l’initialisation du script au démarrage :

```lua
Config.Startup = {
    autoCreateDatabase = true,
    delay = 1000,
}
```

#### `autoCreateDatabase`

Permet au script de créer automatiquement les tables nécessaires si elles n’existent pas.

```lua
autoCreateDatabase = true
```

* `true` : création automatique activée
* `false` : le fichier SQL doit être importé manuellement

#### `delay`

Délai avant l’initialisation de la base de données, exprimé en millisecondes.

```lua
delay = 1000
```

💡 Augmente légèrement cette valeur si ta base de données met du temps à démarrer.

***

### 💼 Chargement dynamique des métiers

Le script récupère automatiquement les métiers présents dans les tables ESX `jobs` et `job_grades`.

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

    offDutyPrefix = "off",
    offDutySeparator = "",
}
```

#### `blacklist`

Liste des métiers qui ne doivent pas apparaître dans le menu MultiJob.

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

Pour masquer plusieurs métiers :

```lua
blacklist = {
    ["unemployed"] = true,
    ["admin"] = true,
    ["staff"] = true,
}
```

#### `offDutyPrefix`

Préfixe utilisé pour reconnaître les métiers hors service.

```lua
offDutyPrefix = "off"
```

Exemples reconnus :

```
offpolice
offambulance
offsheriff
```

#### `offDutySeparator`

Caractère placé entre le préfixe et le métier.

```lua
offDutySeparator = ""
```

Avec cette configuration :

```
offpolice
```

Avec un séparateur `_` :

```lua
offDutySeparator = "_"
```

Le métier attendu devient :

```
off_police
```

***

### 🔢 Limite de métiers

Cette section permet de choisir combien de métiers chaque joueur peut conserver.

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

    bypassGroups = {
        ["admin"] = true,
        ["superadmin"] = true,
    }
}
```

#### `enabled`

Active ou désactive la limite :

```lua
enabled = true
```

* `true` : limite active
* `false` : nombre de métiers illimité

#### `maxJobs`

Nombre maximal de métiers enregistrés par joueur :

```lua
maxJobs = 2
```

#### `bypassGroups`

Groupes ESX pouvant dépasser la limite :

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

Pour ajouter un groupe :

```lua
["owner"] = true,
```

***

### 🗑️ Suppression des métiers

Permet aux joueurs de supprimer un métier depuis leur menu.

```lua
Config.PlayerDelete = {
    enabled = true,
    keepAtLeastOneJob = false,
}
```

#### `enabled`

```lua
enabled = true
```

* `true` : suppression autorisée
* `false` : bouton de suppression désactivé

#### `keepAtLeastOneJob`

Empêche le joueur de supprimer son dernier métier enregistré.

```lua
keepAtLeastOneJob = false
```

Pour obliger chaque joueur à conserver au moins un métier :

```lua
keepAtLeastOneJob = true
```

***

### 🟢 Gestion du service

Cette section contrôle le passage en service et hors service.

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

#### `useOffJobIfExists`

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

```lua
useOffJobIfExists = true
```

Exemple :

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

#### `fallbackJob`

Métier appliqué si aucune version hors service n’existe :

```lua
fallbackJob = "unemployed"
```

#### `fallbackGrade`

Grade appliqué au métier de secours :

```lua
fallbackGrade = 0
```

***

### 🔄 Synchronisation avec les menus patron externes

Cette section assure la compatibilité avec les scripts qui utilisent `xPlayer.setJob`.

```lua
Config.ExternalJobSync = {
    enabled = true,
    bossMenuName = nil,
    addOrUpdateOnExternalSetJob = true,
    removePreviousJobOnExternalUnemployed = true,
    closePreviousShiftOnExternalJob = true,
    debug = false,
}
```

#### `enabled`

Active la synchronisation avec les systèmes externes :

```lua
enabled = true
```

#### `bossMenuName`

Nom affiché lorsqu’un joueur doit utiliser un menu patron externe.

```lua
bossMenuName = nil
```

`nil` utilise le texte par défaut présent dans `locale.lua`.

Exemple personnalisé :

```lua
bossMenuName = "Neon Boss"
```

#### `addOrUpdateOnExternalSetJob`

Ajoute ou met à jour automatiquement le métier lorsqu’un autre script utilise `setJob`.

```lua
addOrUpdateOnExternalSetJob = true
```

#### `removePreviousJobOnExternalUnemployed`

Considère un passage vers `unemployed` comme un licenciement.

```lua
removePreviousJobOnExternalUnemployed = true
```

#### `closePreviousShiftOnExternalJob`

Ferme automatiquement le temps de service lorsqu’un joueur change de métier depuis un script externe.

```lua
closePreviousShiftOnExternalJob = true
```

#### `debug`

Affiche les informations de synchronisation dans la console :

```lua
debug = false
```

***

### 👔 Statistiques du menu patron

Cette section contrôle les informations accessibles aux patrons.

```lua
Config.BossStats = {
    enabled = true,
    requireOnDuty = true,

    bossGradeNames = {
        ["boss"] = true,
        ["patron"] = true,
    },

    minimumGradeByJob = {},

    display = {
        showOnlineStatus = true,
        showTechnicalIdentifier = false,
    },

    bonus = {
        enabled = true,
        defaultRatePerHour = 250,
        ratePerHourByJob = {},
        roundTo = 1,
        maxBonus = 0,
    }
}
```

#### `enabled`

Active ou désactive les statistiques patron :

```lua
enabled = true
```

#### `requireOnDuty`

Oblige le patron à être en service pour consulter les employés :

```lua
requireOnDuty = true
```

#### `bossGradeNames`

Noms techniques des grades considérés comme patrons :

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

Tu peux ajouter d’autres grades :

```lua
["director"] = true,
["gerant"] = true,
```

#### `minimumGradeByJob`

Permet de définir manuellement le grade minimum nécessaire pour un métier précis.

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

💡 Cette option est utile lorsqu’aucun grade ne s’appelle `boss` ou `patron`.

***

### 👥 Affichage des employés

```lua
display = {
    showOnlineStatus = true,
    showTechnicalIdentifier = false,
}
```

#### `showOnlineStatus`

Affiche si l’employé est connecté :

```lua
showOnlineStatus = true
```

#### `showTechnicalIdentifier`

Affiche l’identifiant technique du joueur :

```lua
showTechnicalIdentifier = false
```

⚠️ Il est conseillé de laisser cette option sur `false` pour une interface plus propre.

***

### 💰 Estimation des primes

Le menu patron peut calculer une estimation de prime selon le temps de service de la semaine.

```lua
bonus = {
    enabled = true,
    defaultRatePerHour = 250,
    ratePerHourByJob = {},
    roundTo = 1,
    maxBonus = 0,
}
```

#### `enabled`

Active le calcul des primes :

```lua
enabled = true
```

#### `defaultRatePerHour`

Montant attribué pour chaque heure travaillée :

```lua
defaultRatePerHour = 250
```

#### `ratePerHourByJob`

Permet de définir un montant différent selon le métier :

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

#### `roundTo`

Arrondit le montant calculé :

```lua
roundTo = 1
```

Exemple pour arrondir à la dizaine :

```lua
roundTo = 10
```

#### `maxBonus`

Définit le montant maximal d’une prime :

```lua
maxBonus = 0
```

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

Exemple avec une limite de 5 000 $ :

```lua
maxBonus = 5000
```

***

### 📋 Configuration du menu

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

    display = {
        showMetadata = true,
        showTechnicalJobName = true,
        showSessionWhenActive = true,
        showBossTag = true,
    },

    icons = {
        employeeHeader = "user-tie",
        employee = "user",
        employees = "users",
        boss = "users-gear",
        job = "briefcase",
        onDuty = "user-check",
        dutyOn = "toggle-on",
        dutyOff = "toggle-off",
        delete = "trash",
        back = "arrow-left",
        info = "circle-info",
    }
}
```

#### `command`

Commande permettant d’ouvrir le menu :

```lua
command = "multijob"
```

Le joueur utilisera :

```
/multijob
```

#### `key`

Touche utilisée par défaut :

```lua
key = "F4"
```

#### `enableKeyMapping`

Autorise les joueurs à modifier la touche dans les paramètres FiveM :

```lua
enableKeyMapping = true
```

***

### 👁️ Options d’affichage

```lua
display = {
    showMetadata = true,
    showTechnicalJobName = true,
    showSessionWhenActive = true,
    showBossTag = true,
}
```

* `showMetadata` : affiche les informations complémentaires
* `showTechnicalJobName` : affiche le nom technique du métier
* `showSessionWhenActive` : affiche le temps de la session active
* `showBossTag` : affiche une indication pour les métiers patron

***

### 🎨 Icônes du menu

Les icônes utilisent les noms **Font Awesome** compatibles avec `ox_lib`.

Exemple :

```lua
icons = {
    job = "briefcase",
    dutyOn = "toggle-on",
    dutyOff = "toggle-off",
    delete = "trash",
}
```

Tu peux remplacer les valeurs par d’autres icônes Font Awesome.

⚠️ Utilise uniquement des noms d’icônes valides.

***

### 🛡️ Commandes administrateur

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

    allowedGroups = {
        ["admin"] = true,
        ["superadmin"] = true,
    },

    commands = {
        add = "mjadd",
        remove = "mjremove",
        grade = "mjgrade",
        import = "mjimport",
        refresh = "mjrefreshjobs",
        fire = "mjfire",
    }
}
```

#### `enabled`

Active ou désactive les commandes administrateur :

```lua
enabled = true
```

#### `allowedGroups`

Groupes autorisés à utiliser les commandes :

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

#### Commandes disponibles

| Commande         | Fonction                           |
| ---------------- | ---------------------------------- |
| `/mjadd`         | Ajouter un métier à un joueur      |
| `/mjremove`      | Retirer un métier                  |
| `/mjgrade`       | Modifier le grade d’un métier      |
| `/mjimport`      | Importer un métier existant        |
| `/mjrefreshjobs` | Recharger la liste des métiers ESX |
| `/mjfire`        | Licencier un joueur                |

Les noms des commandes peuvent être modifiés librement :

```lua
commands = {
    add = "jobadd",
    remove = "jobremove",
    grade = "jobgrade",
    import = "jobimport",
    refresh = "jobrefresh",
    fire = "jobfire",
}
```

***

### 🔔 Système de notifications

```lua
Config.Notifications = {
    system = "ox_lib",
    position = "top",
    duration = 4500,
    playSound = false,

    resources = {
        esx = "es_extended",
        okokNotify = "okokNotify",
    }
}
```

Systèmes disponibles :

```
ox_lib
esx
okokNotify
custom
```

#### `position`

Position des notifications `ox_lib` :

```lua
position = "top"
```

#### `duration`

Durée d’affichage en millisecondes :

```lua
duration = 4500
```

#### `playSound`

Active ou désactive le son des notifications :

```lua
playSound = false
```

Pour utiliser un autre système, sélectionne :

```lua
system = "custom"
```

Puis modifie uniquement le fichier `editable.lua`.

***

### 🕒 Formats d’affichage

```lua
Config.Formats = {
    time = "%02dh%02d",
    date = "%d/%m/%Y",

    money = {
        symbol = "$",
        symbolPosition = "before",
        thousandsSeparator = "",
    }
}
```

#### Format du temps

```lua
time = "%02dh%02d"
```

Exemple affiché :

```
02h35
```

#### Format de la date

```lua
date = "%d/%m/%Y"
```

Exemple affiché :

```
13/07/2026
```

#### Format de l’argent

```lua
money = {
    symbol = "$",
    symbolPosition = "before",
    thousandsSeparator = "",
}
```

Pour afficher l’euro après le montant :

```lua
money = {
    symbol = "€",
    symbolPosition = "after",
    thousandsSeparator = " ",
}
```

Résultat :

```
1 500 €
```

***

### 🔧 Réglage technique

```lua
Config.Internal = {
    setJobProtectionMs = 1500,
}
```

Cette valeur protège les changements de métier contre les conflits avec d’autres ressources utilisant `setJob`.

```lua
setJobProtectionMs = 1500
```

⚠️ Modifie cette valeur uniquement si une autre ressource applique les changements de métier avec un délai inhabituel.

***

### 🧰 Exemple de configuration personnalisée

Voici un exemple adapté à un serveur RP avec deux métiers maximum :

```lua
Config.Locale = "fr"

Config.Startup = {
    autoCreateDatabase = true,
    delay = 1000,
}

Config.JobLimit = {
    enabled = true,
    maxJobs = 2,

    bypassGroups = {
        ["admin"] = true,
        ["superadmin"] = true,
        ["owner"] = true,
    }
}

Config.PlayerDelete = {
    enabled = true,
    keepAtLeastOneJob = true,
}

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

Config.BossStats.enabled = true
Config.BossStats.requireOnDuty = true
Config.BossStats.bonus.defaultRatePerHour = 300
Config.BossStats.bonus.maxBonus = 5000

Config.Menu.command = "multijob"
Config.Menu.key = "F4"
Config.Menu.enableKeyMapping = true

Config.Notifications = {
    system = "ox_lib",
    position = "top",
    duration = 4500,
    playSound = false,

    resources = {
        esx = "es_extended",
        okokNotify = "okokNotify",
    }
}

Config.Formats.money = {
    symbol = "$",
    symbolPosition = "before",
    thousandsSeparator = " ",
}
```

***

➡️ **Étape suivante : Traduction**


---

# 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/configuration.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.
