> For the complete documentation index, see [llms.txt](https://cactus-code.gitbook.io/cactus-code-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cactus-code.gitbook.io/cactus-code-docs/documentation/scripts/boss-menu/config.md).

# Config

```lua
--[[
    ================================================================
                        CACTUS BOSS MENU
    ================================================================
    
    RedM multi-framework boss menu with employee management.
    Works with RSG-Core and VORP Core — auto-detected at startup.

    Companies are defined statically in this config file.
    Adjust the settings below to match your server.
]]

Config = {}

-- ================================================================
--  GENERAL
-- ================================================================

Config.Locale       = 'en'             -- 'en' | 'fr' | 'th'
Config.Debug        = false            -- Print debug info to console
Config.Timezone     = 'Europe/Paris'   -- IANA timezone for the UI clock
Config.DateFormat   = 'EU'             -- 'EU' (DD/MM/YYYY) | 'US' (MM/DD/YYYY) | 'ISO' (YYYY-MM-DD)

-- ================================================================
--  NOTIFICATIONS
-- ================================================================

Config.NotificationSystem   = 'auto'        -- 'auto' | 'rsg' | 'vorp' | 'redem' | 'bln' | 'nui' | 'none'
Config.NotificationPosition = 'top-center'  -- 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'
-- 'auto' uses Bridge.Notify — recommended, works with both frameworks.
-- Custom systems can be added in shared/config_notifications.lua.

-- ================================================================
--  INTERACTION SYSTEM
-- ================================================================

Config.InteractionSystem = 'prompt'
-- How players interact with the boss-menu marker / NPC:
--   'prompt'          Native RedM prompt (G key)                no dependency
--   'ox_target'       ox_target 3D eye system                   requires ox_target + ox_lib
--   'pc_interaction'  pc_interaction ALT-menu                   requires pc_interaction

-- ================================================================
--  FRAMEWORK
-- ================================================================

Config.RSGCoreResourceName  = 'rsg-core'    -- Exact resource name for RSG-Core on your server
Config.VORPCoreResourceName = 'vorp_core'   -- Exact resource name for VORP Core on your server

-- Config.Framework = 'rsg'
-- Uncomment the line above ONLY if auto-detection fails ('rsg' or 'vorp').

-- ================================================================
--  SALARY SYSTEM
-- ================================================================

Config.PaycheckSystem = 'bossmenu'
-- 'bossmenu'   Pays from company account, logs in history. Framework salary set to 0 automatically.
-- 'native'     Uses the framework's own paycheck system (RSG-Core / VORP default).
-- 'disabled'   No automatic salary — manual payments only.

Config.TimeToReceivedSalary  = 15       -- Minutes between each paycheck (only while on duty)
Config.PayFromCompanyAccount = true     -- true = salary drawn from company funds | false = free salary
Config.AllowNegativeBalance  = false    -- true = companies can go into debt | false = blocks payment

-- ================================================================
--  HISTORY
-- ================================================================

Config.HistoryLimit = 200               -- Max transactions shown per company

-- ================================================================
--  DATABASE CLEANUP
-- ================================================================

Config.CleanOrphanedCompanies = false
-- If true, companies that no longer have a matching job in the database will be deleted on startup.
-- WARNING: this permanently removes all data (balance, history, grades) for those companies.

-- ================================================================
--  RECRUITMENT
-- ================================================================

Config.RecruitmentRadius    = 5.0           -- Detection radius around the boss menu (meters)
Config.DefaultRecruitGrade  = 0             -- Grade assigned on hire (0 = lowest)

-- ================================================================
--  DISMISSAL
-- ================================================================

Config.UnemployedJob = 'unemployed'
Config.UnemployedGrade = 0
Config.UnemployedLabel = 'Unemployed'

-- ================================================================
--  MENU PROMPT
-- ================================================================

Config.MenuKey = 0x760A9C6F             -- [G] key
Config.PromptText = 'Open management menu'
--https://github.com/femga/rdr3_discoveries/tree/a63669efcfea34915c53dbd29724a2a7103f822f/Controls
-- ================================================================
--  JOB OFFER POPUP
-- ================================================================

Config.JobOffer = {
    enabled = true,         -- Show confirmation popup when recruited
    timeout = 30000,        -- Time before auto-decline (ms)
    title = 'JOB OFFER',
    acceptText = 'ACCEPT',
    refuseText = 'REFUSE'
}

-- ================================================================
--  NOTIFICATION MESSAGES
-- ================================================================

Config.Notifications = {
    notBoss = 'You don\'t have the necessary permissions',
    noCompany = 'You don\'t have a company',
    playerNotFound = 'Player not found',
    actionSuccess = 'Action completed successfully',
    actionFailed = 'Action failed',
    insufficientFunds = 'Insufficient funds',
    salaryPaid = 'Salary paid: $%s',
    recruited = 'You recruited %s',
    fired = 'You fired %s',
    promoted = 'You promoted %s',
    demoted = 'You demoted %s'
}

-- ================================================================
--  COMPANIES (static definitions)
-- ================================================================
--[[
    Add your companies below. Each company needs:
    - label: Display name
    - maxSalary: Maximum salary per payment
    - minGradeToEditGrades: Min grade to modify grades
    - defaultPermissions: Who can do what (grade number or true/false)
    - grades: List of ranks with salaries
    - bossMenu: Location coords and interaction distance
]]

Config.Companies = {

    ['police'] = {
        label = 'Police Department',
        maxSalary = 5000,
        minGradeToEditGrades = 7,
        
        -- Storage configuration
        storage = {
            id = 'police_storage',
            name = 'Police Storage',
            shared = true
        },
        
        defaultPermissions = {
            openBossMenu = 0,
            recruit = 7,
            promote = 7,
            fire = 7,
            manageMoney = 7,
            manageGold = 7,
            viewHistory = 7,
            viewFullHistory = 7,
            editGrades = 7,
            upgradeStorage = 7,
            accessInventory = 7,
            editAvatars = true,
            manageEmployeeGrade = 7,
            canSeePromoteButton = 7,
            canSeeDemoteButton = 7,
            canSeeManageButton = 7,
            canSeeFireButton = 7,
            canGiveBonus = 7,
            canSeeBonusButton = 7,
        },
        
        grades = {
            [0] = { name = 'Recruit', salary = 50 },
            [1] = { name = 'Officer', salary = 75 },
            [2] = { name = 'Corporal', salary = 100 },
            [3] = { name = 'Sergeant', salary = 125 },
            [4] = { name = 'Lieutenant', salary = 150 },
            [5] = { name = 'Captain', salary = 175 },
            [6] = { name = 'Commander', salary = 200 },
            [7] = { name = 'Sheriff', salary = 250 },
            [8] = { name = 'Under-Sheriff', salary = 300 },
            [9] = { name = 'Chief of Police', salary = 400 }
        },
        
        bossMenu = {
            coords = vector3(-277.0536, 803.9293, 119.3800),
            distance = 2.0
        },
    },

    ['banker'] = {
        label = 'Saint Denis Bank',
        maxSalary = 3000,
        minGradeToEditGrades = 4,
        
        -- Storage configuration
        storage = {
            id = 'banker_storage',
            name = 'Bank Storage',
            shared = true
        },
        
        defaultPermissions = {
            openBossMenu = 0,
            recruit = 4,
            promote = 4,
            fire = 4,
            manageMoney = 3,
            manageGold = 4,
            viewHistory = 2,
            viewFullHistory = 4,
            editGrades = 4,
            upgradeStorage = 4,
            accessInventory = 3,
            editAvatars = true,
            manageEmployeeGrade = 4,
            canSeePromoteButton = 4,
            canSeeDemoteButton = 4,
            canSeeManageButton = 3,
            canSeeFireButton = 4,
            canGiveBonus = 3,
            canSeeBonusButton = 3,
        },
        
        grades = {
            [0] = { name = 'Intern', salary = 30 },
            [1] = { name = 'Teller', salary = 50 },
            [2] = { name = 'Senior Teller', salary = 75 },
            [3] = { name = 'Account Manager', salary = 100 },
            [4] = { name = 'Branch Manager', salary = 150 },
            [5] = { name = 'Bank Director', salary = 250 }
        },
        
        bossMenu = {
            coords = vector3(2650.5525, -1305.2253, 52.2637),
            distance = 2.0
        },
    },

    ['farmer2'] = {
        label = 'Clary Ranch',
        maxSalary = 1500,
        minGradeToEditGrades = 3,
        
        -- Storage configuration
        storage = {
            id = 'farmer2_storage',
            name = 'Ranch Storage',
            shared = true
        },
        
        defaultPermissions = {
            openBossMenu = 0,
            recruit = 3,
            promote = 3,
            fire = 3,
            manageMoney = 2,
            manageGold = 3,
            viewHistory = 1,
            viewFullHistory = 3,
            editGrades = 3,
            upgradeStorage = 3,
            accessInventory = 1,
            editAvatars = true,
            manageEmployeeGrade = 3,
            canSeePromoteButton = 3,
            canSeeDemoteButton = 3,
            canSeeManageButton = 2,
            canSeeFireButton = 3,
            canGiveBonus = 2,
            canSeeBonusButton = 2,
        },
        
        grades = {
            [0] = { name = 'Farmhand', salary = 20 },
            [1] = { name = 'Stableboy', salary = 35 },
            [2] = { name = 'Foreman', salary = 60 },
            [3] = { name = 'Ranch Manager', salary = 100 },
            [4] = { name = 'Farm Owner', salary = 150 }
        },
        
        bossMenu = {
            coords = vector3(1380.5688, -872.1642, 69.3157),
            distance = 2.0
        },
    },

    -- Add more companies here...
    
}



-- ================================================================
--  DEBUG (internal)
-- ================================================================

function DebugPrint(...)
    if Config.Debug then
        print('[Cactus BossMenu]', ...)
    end
end
-- Show confirmation popup when recruited
    timeout = 30000,        -- Time before auto-decline (ms)
    title = 'JOB OFFER',
    acceptText = 'ACCEPT',
    refuseText = 'REFUSE'
}

-- ================================================================
--                    NOTIFICATION MESSAGES                         
-- ================================================================

Config.Notifications = {
    notBoss = 'You don\'t have the necessary permissions',
    noCompany = 'You don\'t have a company',
    playerNotFound = 'Player not found',
    actionSuccess = 'Action completed successfully',
    actionFailed = 'Action failed',
    insufficientFunds = 'Insufficient funds',
    salaryPaid = 'Salary paid: $%s',
    recruited = 'You recruited %s',
    fired = 'You fired %s',
    promoted = 'You promoted %s',
    demoted = 'You demoted %s'
}

-- ================================================================
--                       COMPANIES LIST                             
-- ================================================================
--[[
    Add your companies below. Each company needs:
    - label: Display name
    - maxSalary: Maximum salary per payment
    - minGradeToEditGrades: Min grade to modify grades
    - defaultPermissions: Who can do what (grade number or true/false)
    - grades: List of ranks with salaries
    - bossMenu: Location coords and interaction distance
]]

Config.Companies = {

    ['police'] = {
        label = 'Police Department',
        maxSalary = 5000,
        minGradeToEditGrades = 7,
        
        -- Storage configuration
        storage = {
            id = 'police_storage',
            name = 'Police Storage',
            shared = true
        },
        
        defaultPermissions = {
            openBossMenu = 0,
            recruit = 7,
            promote = 7,
            fire = 7,
            manageMoney = 7,
            manageGold = 7,
            viewHistory = 7,
            viewFullHistory = 7,
            editGrades = 7,
            upgradeStorage = 7,
            accessInventory = 7,
            editAvatars = true,
            manageEmployeeGrade = 7,
            canSeePromoteButton = 7,
            canSeeDemoteButton = 7,
            canSeeManageButton = 7,
            canSeeFireButton = 7,
            canGiveBonus = 7,
            canSeeBonusButton = 7,
        },
        
        grades = {
            [0] = { name = 'Recruit', salary = 50 },
            [1] = { name = 'Officer', salary = 75 },
            [2] = { name = 'Corporal', salary = 100 },
            [3] = { name = 'Sergeant', salary = 125 },
            [4] = { name = 'Lieutenant', salary = 150 },
            [5] = { name = 'Captain', salary = 175 },
            [6] = { name = 'Commander', salary = 200 },
            [7] = { name = 'Sheriff', salary = 250 },
            [8] = { name = 'Under-Sheriff', salary = 300 },
            [9] = { name = 'Chief of Police', salary = 400 }
        },
        
        bossMenu = {
            coords = vector3(-274.7878, 794.9952, 118.6653),
            distance = 2.0
        },
    },

    ['banker'] = {
        label = 'Saint Denis Bank',
        maxSalary = 3000,
        minGradeToEditGrades = 4,
        
        -- Storage configuration
        storage = {
            id = 'banker_storage',
            name = 'Bank Storage',
            shared = true
        },
        
        defaultPermissions = {
            openBossMenu = 0,
            recruit = 4,
            promote = 4,
            fire = 4,
            manageMoney = 3,
            manageGold = 4,
            viewHistory = 2,
            viewFullHistory = 4,
            editGrades = 4,
            upgradeStorage = 4,
            accessInventory = 3,
            editAvatars = true,
            manageEmployeeGrade = 4,
            canSeePromoteButton = 4,
            canSeeDemoteButton = 4,
            canSeeManageButton = 3,
            canSeeFireButton = 4,
            canGiveBonus = 3,
            canSeeBonusButton = 3,
        },
        
        grades = {
            [0] = { name = 'Intern', salary = 30 },
            [1] = { name = 'Teller', salary = 50 },
            [2] = { name = 'Senior Teller', salary = 75 },
            [3] = { name = 'Account Manager', salary = 100 },
            [4] = { name = 'Branch Manager', salary = 150 },
            [5] = { name = 'Bank Director', salary = 250 }
        },
        
        bossMenu = {
            coords = vector3(2650.5525, -1305.2253, 52.2637),
            distance = 2.0
        },
    },

    ['farmer2'] = {
        label = 'Clary Ranch',
        maxSalary = 1500,
        minGradeToEditGrades = 3,
        
        -- Storage configuration
        storage = {
            id = 'farmer2_storage',
            name = 'Ranch Storage',
            shared = true
        },
        
        defaultPermissions = {
            openBossMenu = 0,
            recruit = 3,
            promote = 3,
            fire = 3,
            manageMoney = 2,
            manageGold = 3,
            viewHistory = 1,
            viewFullHistory = 3,
            editGrades = 3,
            upgradeStorage = 3,
            accessInventory = 1,
            editAvatars = true,
            manageEmployeeGrade = 3,
            canSeePromoteButton = 3,
            canSeeDemoteButton = 3,
            canSeeManageButton = 2,
            canSeeFireButton = 3,
            canGiveBonus = 2,
            canSeeBonusButton = 2,
        },
        
        grades = {
            [0] = { name = 'Farmhand', salary = 20 },
            [1] = { name = 'Stableboy', salary = 35 },
            [2] = { name = 'Foreman', salary = 60 },
            [3] = { name = 'Ranch Manager', salary = 100 },
            [4] = { name = 'Farm Owner', salary = 150 }
        },
        
        bossMenu = {
            coords = vector3(1380.5688, -872.1642, 69.3157),
            distance = 2.0
        },
    },

    -- Add more companies here...
    
}



-- ================================================================
--                     DEBUG FUNCTION                               
-- ================================================================

function DebugPrint(...)
    if Config.Debug then
        print('[Cactus BossMenu]', ...)
    end
end

```


---

# 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://cactus-code.gitbook.io/cactus-code-docs/documentation/scripts/boss-menu/config.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.
