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

# fuelstations

> Gestão empresarial de postos de combustível: jogadores compram um posto, definem o preço por litro, gerenciam estoque, banco interno, funcionários, melhorias e abastecem o estoque via cargas de importação/exportação com caminhão.

O **fuelstations** transforma cada posto de combustível num negócio gerenciável. Cada posto pode ser comprado por um jogador, que ganha uma NUI (via `ox_target` no atendente) com módulos: Início, Estoque (preço/litro), Banco (caixa do posto), Abastecimento (cargas import/export por caminhão), Melhorias (estoque/caminhão/relacionamento) e Funcionários. O estoque é consumido quando clientes abastecem (o `engine` chama `UpdateStock`). Postos vazios por muitos dias são retomados pelo governo.

<Note>A aba de "Empregos" (`OfferJobs`) está marcada como `TODO` (não implementada no servidor).</Note>

## Funcionalidades

<CardGroup cols={2}>
  <Card title="Compra de Posto" icon="store">
    Jogadores compram um dos 27 postos disponíveis e tornam-se donos do negócio.
  </Card>

  <Card title="Estoque e Preço" icon="gas-pump">
    Defina o preço por litro dentro da faixa configurada e gerencie o estoque consumido por clientes.
  </Card>

  <Card title="Banco do Posto" icon="building-columns">
    Caixa próprio com depósito, saque e transferência, aplicando as taxas configuradas.
  </Card>

  <Card title="Abastecimento por Caminhão" icon="truck">
    Cargas de importação/exportação que reabastecem o estoque, com pontos de coleta por pacote.
  </Card>

  <Card title="Melhorias" icon="arrow-up-right-dots">
    Níveis cumulativos de estoque máximo, capacidade de caminhão e desconto na importação.
  </Card>

  <Card title="Funcionários" icon="users">
    Convites, hierarquia e demissões, com permissões por nível hierárquico.
  </Card>
</CardGroup>

***

## Dependências

<CardGroup cols={2}>
  <Card title="vrp" icon="cube">Framework base.</Card>
  <Card title="oxmysql" icon="database">Persistência de dados.</Card>
  <Card title="ox_target" icon="crosshairs">Interação com o atendente.</Card>
  <Card title="garages" icon="warehouse">Caminhão de entrega.</Card>
  <Card title="engine" icon="gas-pump">Consome o estoque ao abastecer.</Card>
  <Card title="inventory" icon="box">Buff Dexterity.</Card>
</CardGroup>

***

## Configuração

<AccordionGroup>
  <Accordion title="shared-side/shared.lua — tabela Config" icon="sliders">
    ```lua theme={null}
    Config.DefaulName = "Posto de Combustível"
    Config.EmptyDaysStock = 3            -- dias vazio até retomada do governo (0 = desativa)
    Config.MinPricePerLiter = 1.0; Config.MaxPricePerLiter = 25.0; Config.DefaultPricePerLiter = 5.0
    Config.DefaultMaxStock = 10000

    Config.ItemGallon = "WEAPON_PETROLCAN"; Config.ItemGallonFuel = "WEAPON_PETROLCAN_AMMO"
    Config.GallonFuelAmount = 5000; Config.PriceGallon = 500; Config.StockGallon = 50

    Config.BankTaxWithdraw = 1.0; Config.BankTaxTransfer = 1.0   -- 1.0 = sem taxa

    Config.Replenishments = {            -- cargas (import/export)
        { Name = "Abastecimento Pequeno", Amount = 100, Import = 375, Export = 700, Package = "Small" },
        -- Médio, Grande
    }

    Config.Upgrades = {                  -- níveis (efeito cumulativo)
        Stock = { { Amount = 250, Price = 5000 }, ... },         -- + estoque máximo
        Truck = { { Amount = 10, Price = 5000 }, ... },          -- % a mais por carga
        Relationship = { { Amount = 5, Price = 5000 }, ... },    -- % desconto na importação
    }

    Config.Permissions = {               -- nível hierárquico mín. por ação (-1=ninguém, 0=todos, N=nível<=N)
        Stock = { View = 0, Edit = 1 }, Bank = { View = 0, Deposit = 0, Withdraw = 1, Transfer = 1 }, ...
    }
    ```
  </Accordion>

  <Accordion title="shared-side/shared.lua — Locations (postos)" icon="map-pin">
    ```lua theme={null}
    Locations = {
        FuelStation01 = {                -- a CHAVE é a Permission (grupo) do posto
            Price = 100000,              -- preço de compra do estabelecimento
            Model = "cs_jimmyboston", Coords = vec4(...), Anim = {...},
            BlipCoords = vec3(...), Delivery = vec3(...),
            Packages = { Small = vec3(...), Medium = vec3(...), Large = vec3(...) },  -- pontos de coleta da carga
        },
        -- FuelStation01 a FuelStation27 (27 postos)
    }
    ```
  </Accordion>
</AccordionGroup>

***

## Comandos

A interação normal é por `ox_target` no atendente. O recurso registra apenas um comando, de depuração:

| Comando        | Permissão | Descrição                                                                                                                                   |
| -------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `/testrequest` | Nenhuma   | Dispara um `vRP.Request` de teste e imprime o resultado no console (`[FUEL DEBUG]`). Útil para validar se o prompt da HUD está funcionando. |

<Warning>
  `/testrequest` não valida permissão. Remova-o de `server-side/core.lua` antes de abrir o servidor ao público.
</Warning>

***

## Exports

```lua theme={null}
exports.fuelstations:UpdateStock(Departmenty, Amount, Mode, Value, Customer)
-- Mode "-" consome estoque (+ soma Value ao caixa), outro repõe. Usado pelo engine.
```

***

## Eventos

`Tunnel.bindInterface("fuelstations", Core)` no servidor. Os callbacks de NUI do cliente repassam as chamadas para essa interface via `vSERVER`.

### Recebidos no servidor

| Evento                             | Descrição                                             |
| ---------------------------------- | ----------------------------------------------------- |
| `fuelstations:Open(Permission)`    | Valida permissão e abre a NUI do posto.               |
| `fuelstations:Gallon(Departmenty)` | Compra/abastece o galão de combustível.               |
| `Connect(Passport, source)`        | Conexão do jogador (sincroniza blips/dados do posto). |
| `Disconnect(Passport)`             | Desconexão do jogador.                                |

### Cliente

| Evento                                             | Descrição                                           |
| -------------------------------------------------- | --------------------------------------------------- |
| `fuelstations:Connect(Table)`                      | Recebe os dados dos postos e cria interação/blips.  |
| `fuelstations:Blip(Permission, Name, Color, Blip)` | Cria/atualiza o blip do posto.                      |
| `fuelstations:Opened`                              | Sinaliza que a NUI foi aberta.                      |
| `fuelstations:Notify(Title, Message, Type)`        | Exibe notificação na NUI.                           |
| `fuelstations:Init(Routes)`                        | Inicia a carga de abastecimento (rota do caminhão). |
| `fuelstations:Finish(Routes)`                      | Finaliza a carga de abastecimento.                  |

### NUI Callbacks

| Evento              | Descrição                                                    |
| ------------------- | ------------------------------------------------------------ |
| `Close`             | Fecha a NUI e libera o foco.                                 |
| `Home`              | Carrega a tela inicial do posto.                             |
| `Update`            | Atualiza dados gerais do posto.                              |
| `Stock`             | Retorna o estoque e o preço por litro.                       |
| `UpdateStock`       | Altera o preço por litro.                                    |
| `Bank`              | Retorna o caixa do posto e o histórico.                      |
| `DepositBank`       | Deposita no caixa do posto.                                  |
| `WithdrawBank`      | Saca do caixa do posto (aplica `BankTaxWithdraw`).           |
| `TransferBank`      | Transfere do caixa do posto (aplica `BankTaxTransfer`).      |
| `Replenishment`     | Lista as opções de carga (import/export).                    |
| `StartShipment`     | Inicia uma carga de abastecimento.                           |
| `FinishShipment`    | Finaliza uma carga de abastecimento.                         |
| `OfferJobs`         | Lista as ofertas de emprego (marcado como TODO no servidor). |
| `CreateJob`         | Cria uma oferta de emprego.                                  |
| `UpdateJob`         | Atualiza uma oferta de emprego.                              |
| `DestroyJob`        | Remove uma oferta de emprego.                                |
| `Upgrades`          | Lista as melhorias disponíveis.                              |
| `BuyUpgrade`        | Compra uma melhoria.                                         |
| `Employees`         | Lista os funcionários do posto.                              |
| `InviteEmployee`    | Convida um funcionário.                                      |
| `HierarchyEmployee` | Altera o cargo/nível de um funcionário.                      |
| `DismissEmployee`   | Demite um funcionário.                                       |
| `Jobs`              | Lista os trabalhos/serviços disponíveis.                     |
| `StartJob`          | Inicia um trabalho.                                          |
| `FinishJob`         | Finaliza um trabalho.                                        |

***

## Banco de Dados

| Tabela / origem                       | Uso                                                                                                            |
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| `fuelstations_creative`               | Estado do posto (`Stock`, `FuelPrice`, `MoneyEarned`, `Visits`, `Empty`...). Criada automaticamente por posto. |
| `painel_creative_transactions`        | Histórico do banco do posto (compartilhada, filtrada por `Permission`).                                        |
| `FuelStations:<Permission>` (srvdata) | Upgrades/histórico; caixa do posto na permissão `Bank`.                                                        |

***

## Customização

* **Postos:** `Locations` (chave = Permission; `Price`, `Coords`, `Packages`).
* **Economia:** `MinPricePerLiter`/`MaxPricePerLiter`, `DefaultMaxStock`, `Replenishments`, `Upgrades`.
* **Galão:** `ItemGallon`/`GallonFuelAmount`/`PriceGallon`/`StockGallon`.
* **Permissões:** `Config.Permissions` (ou `OtherPermissions` por posto).
* **Retomada por inatividade:** `EmptyDaysStock`.
