Configuration

Complete guide to configuring JK Billing. All settings are in config.lua.

Language

-- Language file to load from /lang (e.g. 'it', 'en').
Config.Locale = 'en'

Language files are located in the lang/ folder. You can duplicate en.lua to create your own translation.

Framework

Config.Framework = {
    -- Framework mode: auto | esx | qbcore | qbox | standalone
    mode = 'auto',
}

When set to auto, JK Billing detects your framework automatically by checking which core resource is started (es_extended, qb-core, qbx_core).

Billing Settings

Config.Billing = {
    -- Command used to open the billing UI.
    openCommand = 'invoices',
    -- Optional extra alias for the same command.
    openCommandAlias = 'fatture',
    -- Default keybind for opening the UI.
    openKey = 'F5',

    -- Minimum allowed invoice amount.
    minAmount = 1,
    -- Maximum allowed invoice amount.
    maxAmount = 50000000,
    -- Fallback reason text when none is provided.
    defaultReason = 'Service',

    -- Player account used when paying invoices (bank / cash).
    payFrom = 'bank',
    -- If true, allows paying even when balance is below amount.
    allowNegative = false,
}

Job Permissions

Control which jobs can issue society invoices:

Config.Billing.jobs = {
    -- If 'enabled' is empty => all jobs are allowed (except disabled).
    -- If 'enabled' has entries => only those jobs are allowed.
    enabled = {
        -- police = true,
        -- ambulance = true,
    },
    disabled = {
        unemployed = true,
    },
}

Logic: If enabled is empty, every job is allowed unless explicitly in disabled. If enabled has entries, only those jobs can issue society invoices.

Society Invoices

Config.Billing.societyInvoices = {
    -- Enable/disable society invoices tab and data.
    enabled = true,
    -- If true, only top grades can see society invoices.
    requireHighGrade = true,
    -- Number of highest grades allowed (when requireHighGrade = true).
    topGradesCount = 2,
    -- Optional explicit minimum grade per job (overrides topGradesCount).
    minGradeByJob = {
        police = 4,
        ambulance = 3,
        mechanic = 3,
    },

    -- Allow eligible high-grade players to pay invoices using society account.
    payFromSociety = {
        enabled = true,
        -- If true, society account payment is also allowed for personal invoices.
        allowPersonalInvoices = true,
    },
}

The system calculates the minimum allowed grade using topGradesCount from the maximum grade in the database. For example, if a job has max grade 5 and topGradesCount = 2, grades 4 and 5 can see society invoices. Use minGradeByJob to override this per-job.

Personal Invoices

Config.Billing.personalInvoices = {
    -- Enables issuing personal invoices (independent from job permissions).
    enabled = true,
}

When enabled, any player can send a personal invoice to another player. Payment goes directly to the issuer's bank account instead of a society account.

Product Catalog

Config.Billing.productCatalog = {
    -- Enable product catalog feature.
    enabled = true,
    -- Only high-grade players can manage catalog (same permissions as societyInvoices).
    requireHighGrade = true,
    -- Auto-fetch item images from inventory system.
    autoFetchItemImages = true,
    -- Force a specific inventory resource instead of auto-detection.
    -- Leave nil to auto-detect. Examples: 'ox_inventory', 'qb-inventory'
    inventoryResource = nil,
    -- Custom NUI image path template (advanced).
    -- Use {resource} and {item} as placeholders.
    inventoryImagePath = nil,
}

Tablets

Config.Tablets = {
    -- Enable the tablet catalog display system.
    enabled = true,
    -- Command to enter placement mode (admin only).
    command = 'jkplacetablet',
    -- Command to remove the nearest tablet (admin only).
    deleteCommand = 'jkremovetablet',
    -- Prop model used for the tablet object.
    model = 'prop_cs_tablet',
    -- Maximum distance (m) to interact with a placed tablet.
    interactDistance = 1.3,
    -- Distance (m) at which tablet props stream in/out.
    streamDistance = 20.0,
    -- Degrees per scroll step when rotating during placement.
    rotationStep = 5.0,
    -- Height adjustment per frame when pressing arrow keys.
    heightStep = 0.02,
    -- Maximum raycast distance for placement preview.
    maxPlaceDistance = 8.0,
}

Screenshots

Config.Screenshot = {
    -- Discord Webhook URL for uploading in-game screenshots.
    -- Create one in any Discord channel:
    --   Channel Settings → Integrations → Webhooks → New Webhook → Copy URL
    discordWebhook = 'https://discord.com/api/webhooks/YOUR_WEBHOOK_HERE',
}

Screenshots are used to capture product images in-game. The image is uploaded to Discord via webhook and stored as a URL in the product catalog.

ActivityManager Integration

Config.ActivityManager = {
    -- Enable integration with ActivityManager resource.
    enabled = true,
}

When enabled and the activitymanager resource is running, invoices are automatically synced to ActivityManager for jobs linked to a Discord guild.

Discord Logs

Config.DiscordLogs = {
    -- Discord Webhook URL for invoice logs (created & paid).
    -- Leave empty ('') to disable.
    -- You can use the SAME webhook for both, or two different ones.
    invoiceCreated = '',   -- Webhook for "Invoice Created" logs
    invoicePaid    = '',   -- Webhook for "Invoice Paid" logs
}