Database & SQL
Finals Management uses oxmysql for all relational persistence.
1. Automated Bootstrap (Config.SqlBootstrap)
When Config.SqlBootstrap.enabled = true is active in config.lua, table creation scripts run automatically upon server startup:
Lua
Config.SqlBootstrap = {
enabled = true,
waitMs = 30000,
}Manual SQL execution is only required if your database user lacks CREATE TABLE privileges.
2. Database Tables & Schemas
A. Duty Sessions (finalsdutysessions.sql)
Records historical duty stints for payroll and auditing:
SQL
CREATE TABLE IF NOT EXISTS `finals_duty_sessions` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`citizenid` VARCHAR(64) NOT NULL,
`job` VARCHAR(50) NOT NULL,
`grade` INT NOT NULL DEFAULT 0,
`clock_in` DATETIME NOT NULL,
`clock_out` DATETIME DEFAULT NULL,
`total_seconds` INT DEFAULT 0,
INDEX `idx_citizenid_job` (`citizenid`, `job`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;B. Recruitment Portals (finals_applications.sql)
Stores questionnaire templates and civilian submissions:
SQL
CREATE TABLE IF NOT EXISTS `finals_applications_questions` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`job` VARCHAR(50) NOT NULL UNIQUE,
`questions_json` LONGTEXT NOT NULL,
`interview_location` VARCHAR(255) DEFAULT '',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `finals_applications_filings` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`job` VARCHAR(50) NOT NULL,
`citizenid` VARCHAR(64) NOT NULL,
`applicant_name` VARCHAR(128) NOT NULL,
`answers_json` LONGTEXT NOT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'pending',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX `idx_job_status` (`job`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;C. Digital Employment Offers (finalshirepending.sql)
Maintains pending digital employment contracts and signature data:
SQL
CREATE TABLE IF NOT EXISTS `finals_hire_pending` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`job` VARCHAR(50) NOT NULL,
`grade` INT NOT NULL DEFAULT 0,
`citizenid` VARCHAR(64) NOT NULL,
`boss_citizenid` VARCHAR(64) NOT NULL,
`boss_signature` MEDIUMTEXT NOT NULL,
`candidate_signature` MEDIUMTEXT DEFAULT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'pending',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`expires_at` TIMESTAMP NULL DEFAULT NULL,
INDEX `idx_hire_pending` (`citizenid`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;D. Uncollected Paychecks (finalspendingpaychecks.sql)
Stores payroll balances for collection clerk NPC or tablet redemption:
SQL
CREATE TABLE IF NOT EXISTS `finals_pending_paychecks` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`citizenid` VARCHAR(64) NOT NULL,
`job` VARCHAR(50) NOT NULL,
`amount` INT NOT NULL DEFAULT 0,
`money_type` VARCHAR(20) NOT NULL DEFAULT 'bank',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX `idx_citizenid` (`citizenid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;E. Built-in Society Ledger (finalsownsociety.sql)
Used when Config.SocietyBridge.mode = 'own_system':
SQL
CREATE TABLE IF NOT EXISTS `finals_own_society` (
`job` VARCHAR(50) NOT NULL PRIMARY KEY,
`balance` BIGINT NOT NULL DEFAULT 0,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;