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

# Script de Jobs FiveM — Sistema de Empregos Roleplay

> Configure empregos no seu servidor FiveM com hierarquia de cargos, salários automáticos, turnos e ações exclusivas por função para roleplay.

O módulo de **Jobs** adiciona um sistema completo de empregos ao seu servidor FiveM. Cada emprego tem hierarquia de cargos, salário configurável, ações exclusivas para membros e integração com outros módulos como Economia e Inventário.

## Funcionalidades

* Criação ilimitada de empregos via configuração
* Hierarquia de cargos (grades) com permissões individuais
* Salários automáticos por período configurável
* Ponto de trabalho (check-in/check-out) com blip no mapa
* Ações exclusivas para membros do emprego
* Integração com Economia para pagamento de salário
* Compatível com ESX e QBCore

## Configuração de Empregos

Defina seus empregos no `config.lua`. Cada emprego recebe uma chave única, um nome de exibição e um conjunto de cargos (`grades`) com salários individuais. O cargo com `isboss = true` tem acesso ao menu de gerenciamento do emprego.

```lua config.lua theme={null}
Config.Jobs = {
    ['police'] = {
        label = 'Polícia Militar',
        defaultDuty = false,       -- Inicia fora de serviço
        grades = {
            [0] = { label = 'Recruta',   salary = 200 },
            [1] = { label = 'Cabo',      salary = 300 },
            [2] = { label = 'Sargento',  salary = 450 },
            [3] = { label = 'Tenente',   salary = 600 },
            [4] = { label = 'Capitão',   salary = 800, isboss = true },
        },
    },
    ['mechanic'] = {
        label = 'Mecânico',
        defaultDuty = true,        -- Inicia em serviço automaticamente
        grades = {
            [0] = { label = 'Aprendiz', salary = 150 },
            [1] = { label = 'Mecânico', salary = 250 },
            [2] = { label = 'Chefe',    salary = 400, isboss = true },
        },
    },
}
```

## Configuração de Salários

Controle quando e como os salários são pagos. O campo `requireDuty` garante que somente membros que entraram em serviço com `/duty` recebam o pagamento.

```lua config.lua theme={null}
Config.SalaryConfig = {
    interval    = 30,       -- Intervalo de pagamento em minutos
    requireDuty = true,     -- Exige estar em serviço para receber
    paymentType = 'bank',   -- 'bank' para conta bancária ou 'cash' para dinheiro em mãos
    minOnDuty   = 1,        -- Mínimo de jogadores em serviço para o pagamento ocorrer
}
```

## Configuração do Ponto de Trabalho

Configure o local de check-in no mapa para cada emprego. O ponto `duty` é onde o jogador usa `/duty`; o ponto `boss` abre o menu de gerenciamento disponível apenas para o cargo chefe.

```lua config.lua theme={null}
Config.JobLocations = {
    ['police'] = {
        duty = vector3(441.1, -982.1, 30.7),   -- Local para /duty
        boss = vector3(440.0, -975.6, 30.7),    -- Acesso ao menu de chefe
        blip = { sprite = 60, color = 29, label = 'Polícia' },
    },
}
```

## Comandos do Módulo Jobs

| Comando                      | Permissão     | Descrição                            |
| ---------------------------- | ------------- | ------------------------------------ |
| `/duty`                      | Membro do job | Entra ou sai de serviço              |
| `/setjob [id] [job] [grade]` | `jobs.admin`  | Define o emprego de um jogador       |
| `/jobmenu`                   | Membro do job | Abre o menu do emprego               |
| `/payday`                    | `jobs.admin`  | Força pagamento de salários imediato |

<Note>
  O comando `/duty` só está disponível quando `Config.EnableDuty = true` no `config.lua`. Se essa opção estiver desativada, todos os membros são considerados em serviço o tempo todo.
</Note>

## API — Integrações via Exports e Eventos

Use os exports abaixo em outros recursos para interagir com o módulo de Jobs.

### Obter o Emprego de um Jogador (servidor)

```lua theme={null}
local jobData = exports['jobs']:GetPlayerJob(source)
-- Retorna: { name = 'police', label = 'Polícia Militar', grade = 2, gradeLabel = 'Sargento', salary = 450 }
```

### Definir o Emprego de um Jogador (servidor)

```lua theme={null}
exports['jobs']:SetPlayerJob(source, 'mechanic', 1)
-- Parâmetros: source (ID do jogador), jobName (string), grade (número)
```

### Evento disparado ao trocar de emprego (cliente)

```lua theme={null}
AddEventHandler('jobs:onJobChanged', function(newJob, oldJob)
    -- newJob e oldJob são tabelas com name, label, grade e gradeLabel
    print('Novo emprego: ' .. newJob.label)
end)
```

### Evento disparado ao entrar/sair de serviço (cliente)

```lua theme={null}
AddEventHandler('jobs:onDutyChanged', function(onDuty)
    -- onDuty: true (entrou em serviço) ou false (saiu de serviço)
    if onDuty then
        print('Você entrou em serviço.')
    end
end)
```

## Resolução de Problemas

| Problema                           | Causa provável                                           | Solução                                                                       |
| ---------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Salário não é pago                 | `requireDuty = true` e jogador não está em serviço       | Use `/duty` para entrar em serviço antes do intervalo de pagamento            |
| `/duty` não aparece                | `Config.EnableDuty = false`                              | Ative `Config.EnableDuty = true` no `config.lua`                              |
| Menu de chefe indisponível         | Cargo sem `isboss = true` ou localização não configurada | Adicione `isboss = true` ao cargo e configure `boss` em `Config.JobLocations` |
| Emprego não aparece para o jogador | Emprego não cadastrado em `Config.Jobs`                  | Verifique a chave do emprego e reinicie o recurso após salvar                 |
