Before installing or updating, make sure sky_base and sky_jobs_base are up to date.
Current
Version 0.3.1
Highlights
Fixed an issue where DOJ failed to initialize when shared dependencies took more than 60 seconds to load.
Fixed an issue where opening a document-template list could block an immediate template selection or a parallel request from another registry.
Updated unchanged standard document templates so newly created documents use their current English layouts while custom templates and existing document versions are preserved.
Notable Changes
Improved DOJ startup so a failed migration is reported without aborting the entire initializer.
Fixed Prepare decision to select the Arrest Warrant or Search Warrant template from the submitted document versions and to use Judicial Letterhead for other or mixed submissions.
Fixed decision-draft recovery so unsaved drafts from different court filings remain separate.
Fixed hearing calendar entries using a German title prefix on servers configured for another language.
Optimized courtroom display textures to reduce their streaming-memory requirement.
Fixed an issue where document sharing and court handovers omitted eligible police and sheriff factions.
Other Changes
Updated the release package to keep its dependency bootstrap editable for support.
Removed the Source reference field from the document-template editor.
Fixed private draft recovery when creating a new document template.
Update InstructionsA guided update for server owners0.3.00.3.1
Guided update
Update sky_dojjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_dojjob 0.3.0 → 0.3.1, including the later October 6 template, calendar and display fixes. Use the current 0.3.1 download; an earlier 0.3.1 package can have the same version number. Back up the database, resources, custom configuration, translations and saved Job Configurator/Creator data. Validate on staging and stop the server for replacement. Install Base 1.45.1, then Jobs Base 1.48.1, then the matching updates for installed consumers. Complete earlier migrations first when upgrading from a version older than 0.3.0.
Phase 2 of 5
Replace files
Delete the entire sky_dojjob/source/ folder and insert the supplied replacement, including its generated interface. Replace sky_dojjob/fxmanifest.lua and sky_dojjob/import.sql from the same current package. Replace sky_dojjob/stream/sky_doj_display_materials.ytd and sky_dojjob/stream/sky_doj_display_materials+hi.ytd. Refresh the complete sky_dojjob/config/locales/ tree and merge custom translations. Use the supplied editable source/dependencies.lua; do not restore an older custom dependency bootstrap. Install source and manifest together.
Phase 3 of 5
Merge config
No DOJ plaintext option, Job Configurator key or configuration default is added, removed, renamed or reset by 0.3.1. Keep your existing configuration, jobs, grades, locations and saved overrides. Config.AutoExecuteQuery in sky_dojjob/config/config.lua remains true by default; retain your selected automatic/manual database policy as described below. Config.UseJobConfigurator remains true by default. Keep your selected language in sky_base/config/config.lua; DOJ uses that language for newly created/updated hearing calendar entries. No configuration import or reset is required. /jobconfig does not install schema, update runtime files or reload manifests.
Optional diagnostics remain disabled by default. If support requests a recording, put setr sky_profiler 1 before the Sky ensure lines in server.cfg, perform a full server restart, run profiler record 1000, wait for profiler status to show completion, then run profiler saveJSON sky-startup-hotfix.json. Disable with setr sky_profiler 0 and another full server restart. This is not a /jobconfig setting; recording and upload do not start automatically.
Phase 4 of 5
SQL & items
SQL data update. No new table or column is introduced by this 0.3.1 update. It does update the standard-template catalogue and its published-version choices. Back up the active database first. On MariaDB, Config.AutoExecuteQuery = true in sky_dojjob/config/config.lua applies the catalogue update during startup. With automatic migrations disabled, keep the job stopped, select the existing server database, and execute only the complete section between -- Generated reviewed template catalogue (scripts/generate_template_catalog.py). and -- End generated reviewed template catalogue. from the current sky_dojjob/import.sql, including both marker comments. Stop at the end marker; do not execute the rest of import.sql or replay a full import for this existing-0.3.0 update. The bounded section updates data and contains no schema statements. Choose automatic setup or this manual catalogue route. MySQL 8 installations must keep the existing manual policy with Config.AutoExecuteQuery = false, because the automatic migration file still contains an existing MariaDB-specific column statement; the bounded catalogue section does not contain that statement.
Unchanged system-owned defaults receive the current published English layouts. Customer-created or customized latest/published versions, private templates, deleted templates and code/key collisions are not overwritten or automatically restored. Older immutable template/document versions and already-created documents remain available. Default German names change to their English names only where the stored name still matches the prior default; custom display names remain. Do not delete templates, document history, saved jobs or Creator data to apply this update. Existing migration failures still require their original database error to be repaired; continuing initialization does not create a missing schema.
Calendar data. On startup, the resource converts existing DOJ hearing entries whose title exactly matches Verhandlung <public reference> to the selected language, including when automatic schema migrations are disabled. User-defined titles and other calendar event sources remain unchanged. Newly created and updated hearing entries use the selected language. No manual calendar SQL is required.
Items. No item definition, inventory registration or item image changes are required for this update. Preserve existing registrations.
Assets. Replace both supplied display texture dictionaries, sky_dojjob/stream/sky_doj_display_materials.ytd and sky_dojjob/stream/sky_doj_display_materials+hi.ytd. No new model or texture name requires registration. Do not retain either previous dictionary. Earlier release requirements remain applicable to older installations.
Faction document sharing. The existing document-sharing rules now supply eligible faction recipients, including police and sheriff, for documents and court handovers. Existing explicit faction shares can be read again without a database migration. Document-sharing feature exclusions on either issuing or receiving jobs, explicit recipients, clearance and duty checks remain enforced. Sharing a document does not grant access to its source case file. No new setting, role assignment or permission grant is required.
Phase 5 of 5
Restart & test
Perform a full server restart so changed manifests and file lists are reloaded. Start the framework, database connector and configured providers first, then Base 1.45.1, Jobs Base 1.48.1 and installed consumers; reconnect clients. Confirm that the DOJ tablet, existing locations and saved overrides load. Dependency startup no longer aborts merely because 60 seconds elapsed; migration warnings remain actionable, and failure to load saved settings remains a visible initialization error.
Open a document-template list and immediately select a template; check another authorized registry as well. Confirm that a new document from an unchanged stock Arrest Warrant uses its current English layout and fields. Confirm that a deliberately customized template and an existing signed document retain their previous contents. As an authorized judge, prepare a decision for separate Arrest Warrant and Search Warrant submissions, then a mixed/other submission: the first two must select the matching template, and the mixed/other case must use Judicial Letterhead. Leave separate unsaved drafts in two filings and reopen them to verify recovery remains separate. The required matching template must be available and published; a missing template produces an error instead of selecting an unrelated template.
Check a hearing calendar entry on the selected language and confirm that a custom event title is retained. Visit a configured courtroom display to check its materials after replacement. If a feature remains unavailable, collect the first error, preceding console lines and actual installed versions. These are customer/staging checks to perform, not a claim of completed live gameplay or database acceptance.
On staging, share a test document with an eligible police faction and sheriff faction. Confirm they appear in the document-sharing and court-handover recipient choices and that authorized recipients can list and read the explicit share. Confirm an unrelated faction cannot read it, existing clearance/duty restrictions still apply and revoking the share removes access. Keep existing document-sharing feature exclusions; do not enable a faction you intentionally excluded merely to perform this update.
Version 0.3.0
Highlights
Added a bail-deposit workflow that lets authorized police and DOJ staff issue bail and lets DOJ release or forfeit confirmed deposits.
Added saved court deadlines and follow-ups with overdue filters and reminders.
Added automatic neutral incarceration documents for new successful Sky Policejob admissions.
Notable Changes
Added court assignment to eligible judges who are offline, using the existing DOJ roles and roster.
Added persistent handover receipts, ordered action history and police feedback on executed court decisions.
Added central Billing to the DOJ file Explorer with eligible installment plans and shared price-catalogue choices.
Added Sky Billing support for configured invoice-based fines and taxes, with fine completion tied to confirmed payment.
Improved the file Explorer with back/forward navigation and saved list/grid choices for each folder.
Improved shared-document browsing by grouping authorized documents by type and their associated citizen or vehicle.
Added a separate courthouse location point for the map blip so its position can be changed independently of the boss menu.
Fixed an issue where failed document-template loads appeared as an empty template list, with retry and another template selection now available after an error.
Other Changes
Improved handover lists with clearer deadline states, follow-up information and helpful action labels.
Added the DOJ inventory merge template and item icons to the downloadable resource folder.
Added a supplied background image for DOJ archive storage.
Fixed an issue where the Finance app could be rejected as an unknown tablet route.
Fixed an issue where startup requests could arrive before DOJ menus and tablet callbacks were ready.
Improved configuration updates so unrelated world placements and identical tablet definitions are not rebuilt after every save.
Improved database startup by skipping document-column upgrades that were already complete.
Fixed an issue where database collation differences could prevent workspace, sharing or role access queries from loading.
Improved tablet form fields with content-sized descriptions and clearer select actions.
Improved invoice submission by keeping the selected catalogue price and retry reference after failed replies.
Update InstructionsA guided update for server owners0.2.10.3.0
Guided update
Update sky_dojjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_dojjob0.2.1 → 0.3.0. Before replacing files, confirm that your customer download platform provides the versions below and check each downloaded resource's fxmanifest.lua; published documentation or a source tag alone does not establish that its customer download has been uploaded. Complete earlier migrations first if upgrading from an older version. Back up the database, resources, custom config, translations and saved Job Configurator/Creator data. Validate the update on staging before applying it to your production server. Stop the server during replacement. Install Sky Base 1.45.0, then Sky Jobs Base 1.48.0, then the matching releases for your installed jobs and Crime. Keep provider dependencies and optional integrations compatible; preserve saved overrides and existing records.
Phase 2 of 5
Replace files
Use the complete 0.3.0 release package. Delete the entire sky_dojjob/source/ folder and insert its new version; do not merge old generated interface files. Replace sky_dojjob/fxmanifest.lua from the same package. Refresh the complete sky_dojjob/config/locales/ tree and merge your custom translations into the new files. Keep your selected shared language in sky_base/config/config.lua. Install the following shipped paths from that package, merging custom configuration into the updated public files rather than restoring old complete files:
In sky_dojjob/config/config.lua, there are no changed, added or removed options since 0.2.1. Preserve your existing Jobs, RecordsAccess/functional-role bindings, Courtrooms, Printers, Registry, Elections, Banking, Conditions, Taxes and Finance choices. No new Config.Bail table is required.
Replace sky_dojjob/config/init.lua from the same download. For custom registry callbacks, merge the new leading readiness line into each affected file while preserving your existing callback bodies:
if not Citizen.Await(SkyJobsReady) then return end
Affected paths: sky_dojjob/config/registry/client/businesses.lua, sky_dojjob/config/registry/client/marriages.lua, sky_dojjob/config/registry/server/businesses.lua, sky_dojjob/config/registry/server/licenses.lua, sky_dojjob/config/registry/server/marriages.lua and sky_dojjob/config/registry/server/name_changes.lua. Do not restore an old init/registry file over these startup changes.
Existing payment choices. Config.Conditions.finePaymentMode remains "bank" by default for immediate bank debit. If you intentionally use "billing", the selected Sky Base billing provider handles the invoice; when sky_base/config/config.lua has Config.billing = "sky", that invoice is followed until confirmed payment and the fine then completes. Config.Conditions.billingSocietyJob remains the configured destination job (default "doj"). Config.Taxes.paymentMode remains "direct" by default; "bills" now also supports Sky Billing. Creating/submitting a tax invoice is not proof that the taxpayer has paid.
In /jobconfig → DOJ, preserve saved overrides. For the optional invoice path, Finance → dojFinePaymentMode uses "bank" or "billing"; dojFineSociety owns the fine destination. Taxes → dojTaxPaymentMode uses "direct" or "bills"; keep the existing dojTaxCurrency/society configuration. The existing Finance settings dojTreasuryJob, dojFinanceJobs and dojFinanceLimit keep their meanings. Tablet and Finance feature switches remain tablet and finance. No new courtroom, role, printer, registry or election setting needs to be added/reset for this update.
Bail access. The central Billing form can issue bail for an authorized police or configured DOJ job. Keep the Tablet and Finance features enabled if using this workflow, with a valid issuer society account and central billing issue permission. The DOJ Finance app's Bail section uses the existing permissions: View Finance to list deposits, Transfer Finance to release/refund, Seize Finance to forfeit. These are existing permissions, not new IDs needing reassignment. Refunds need a supported player-bank payment integration; they remain pending when the recipient is offline and can complete on their next login. Forfeiture sends the paid deposit to its issuing job's society account after the authorized DOJ decision. Bail issuance does not by itself release a person from jail. Existing ordinary invoices are not retrospectively converted into held bail deposits.
Optional police integration. Keep the existing Config.Conditions.policeResource (default "sky_policejob") and police-reader access choices. With the matching Sky Policejob 1.37.0 update, new successful admissions can create neutral Incarceration Record documents linked to the person's police/DOJ record, and authorized police recipients can report execution results on shared court decisions. DOJ remains usable without Policejob; do not install or enable Policejob merely to apply the core DOJ update. Existing banking investigation providers keep their current configuration; the added bail workflow needs their actual player payment support rather than a new forced banking provider.
Use the matching updated sky_jobs_base together with DOJ. The additional configuration update routing does not change DOJ settings, saved overrides, inventory items or SQL requirements.
Courthouse location / map blip. A new job-owned location point is available. In /jobconfig, select the DOJ job and its location, then place Location / map blip independently of the boss-menu interaction. Enable the wanted map blip under Job → Blips. This is saved location data, not a new coordinate setting in config/config.lua. Existing locations and points are retained; until you place the new point, the existing legacy/first-point fallback remains. If you use the standalone Courthouse Creator instead of Job Configurator, place the same courthouse/map-blip point there. Install the matching Jobs Base locale update for these labels. No new plaintext default, SQL migration or reset of saved locations is required.
Optional diagnostics are disabled by default. If support requests a recording, put setr sky_profiler 1 before the Sky ensure lines in server.cfg, then restart the server. Run profiler record 1000, wait for profiler status to show that recording has completed, then run profiler saveJSON sky-release-profile.json. Disable diagnostics with setr sky_profiler 0 and another server restart. This is not a /jobconfig setting; no recording or upload starts automatically.
For an older explicit profiler package, replace any previously modified public config/provider/compatibility files with the supplied versions and merge your intentional customizations. In this release package, profiler preparation preserves all files outside source/ byte for byte except fxmanifest.lua; the functional config changes listed in this guide still require their own merge.
Phase 4 of 5
SQL & items
Database: automatic route - MariaDB. Back up the active database before updating. On MariaDB, Config.AutoExecuteQuery = true in sky_dojjob/config/config.lua runs the matching schema additions and neutral INC template update on startup. Start updated Base, Jobs Base, optional Policejob and then DOJ. No manual SQL is needed for that route. /jobconfig does not install tables, item definitions or runtime files. The automatic DOJ migration still contains an existing MariaDB-specific column statement; use the manual route below for MySQL 8.
Database: manual route - MariaDB. With Config.AutoExecuteQuery = false, keep job resources stopped and apply the additive schema block below and the INC catalogue update described after it, or use the combined MariaDB file MariaDB existing-database SQL download once instead. Select the database used by the server first. This is an existing-0.2.1 upgrade; a fresh MariaDB installation uses the updated sky_dojjob/import.sql. Do not run a destructive reset script or delete existing tables. Choose automatic setup or one complete manual route, not both; do not run both database dialects.
CREATE TABLE IF NOT EXISTS `sky_doj_bail_deposits` (
`id` CHAR(36) NOT NULL,
`invoice_id` BIGINT UNSIGNED NULL,
`issuer_job` VARCHAR(64) NOT NULL,
`issuer_name` VARCHAR(120) NOT NULL,
`payer_identifier` VARCHAR(128) NOT NULL,
`payer_name` VARCHAR(120) NOT NULL,
`case_reference` VARCHAR(100) NOT NULL,
`amount` INT UNSIGNED NOT NULL,
`reason` VARCHAR(500) NOT NULL,
`created_by_identifier` VARCHAR(128) NOT NULL,
`created_by_name` VARCHAR(120) NOT NULL,
`decision` VARCHAR(16) NOT NULL DEFAULT '',
`decision_request_key` VARBINARY(128) NOT NULL DEFAULT '',
`decision_reason` VARCHAR(500) NOT NULL DEFAULT '',
`decided_by_identifier` VARCHAR(128) NULL,
`decided_by_name` VARCHAR(120) NULL,
`decided_at` DATETIME NULL,
`ledger_recorded_at` DATETIME NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_doj_bail_invoice` (`invoice_id`),
KEY `idx_doj_bail_case` (`case_reference`, `created_at`),
KEY `idx_doj_bail_payer` (`payer_identifier`, `created_at`),
KEY `idx_doj_bail_decision` (`decision`, `created_at`)
) ENGINE=InnoDB;
ALTER TABLE `sky_doj_application_details` ADD COLUMN IF NOT EXISTS `due_at_utc` DATETIME NULL;
ALTER TABLE `sky_doj_application_details` ADD COLUMN IF NOT EXISTS `remind_at_utc` DATETIME NULL;
ALTER TABLE `sky_doj_application_details` ADD COLUMN IF NOT EXISTS `time_zone` VARCHAR(64) NULL;
ALTER TABLE `sky_doj_filing_entries` ADD COLUMN IF NOT EXISTS `transition_json` LONGTEXT NULL;
ALTER TABLE `sky_doj_handover_routes` ADD COLUMN IF NOT EXISTS `filing_revision` INT NOT NULL DEFAULT 0;
CREATE TABLE IF NOT EXISTS `sky_doj_route_receipts` (
`route_id` CHAR(36) NOT NULL,
`created_by_identifier` VARCHAR(128) NOT NULL,
`created_by_name` VARCHAR(120) NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`route_id`),
FOREIGN KEY (`route_id`) REFERENCES `sky_doj_handover_routes` (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `sky_doj_court_reminders` (
`id` CHAR(36) NOT NULL,
`filing_id` CHAR(36) NOT NULL,
`recipient_identifier` VARCHAR(128) NOT NULL,
`kind` VARCHAR(16) NOT NULL,
`scheduled_at_utc` DATETIME NOT NULL,
`acknowledged_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_court_reminder` (`filing_id`, `recipient_identifier`, `kind`, `scheduled_at_utc`),
FOREIGN KEY (`filing_id`) REFERENCES `sky_doj_filings` (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `sky_doj_execution_reports` (
`id` CHAR(36) NOT NULL,
`delivery_id` CHAR(36) NOT NULL,
`status` VARCHAR(24) NOT NULL,
`body` LONGTEXT NOT NULL,
`created_by_identifier` VARCHAR(128) NOT NULL,
`created_by_name` VARCHAR(120) NOT NULL,
`created_by_job` VARCHAR(64) NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
FOREIGN KEY (`delivery_id`) REFERENCES `sky_doj_decision_deliveries` (`id`)
) ENGINE=InnoDB;
ALTER TABLE `sky_doj_filing_entries` ADD COLUMN IF NOT EXISTS `sequence` INT NOT NULL DEFAULT 0;
For this MariaDB manual route, also apply the new INC catalogue update from the updated sky_dojjob/import.sql: it starts with the START TRANSACTION immediately preceding the SET @doj_review_template lookup where template_code = 'INC' or template_key = 'doj-inc', and ends at the second COMMIT before -- End generated reviewed template catalogue. The complete block creates/reviews and publishes the shipped neutral template while retaining customer-edited templates. The combined MariaDB existing-database SQL download file already includes that schema and the exact INC block; run the combined file or the schema plus INC blocks, not both.
Database: manual route - MySQL 8. Keep Config.AutoExecuteQuery = false and job resources stopped. For an existing 0.2.1 database, use MySQL 8 existing-database SQL download once instead of the MariaDB file. It contains the full guarded schema below plus the exact same complete INC update. Select the server's database first and run the entire file in one SQL session. Column checks use INFORMATION_SCHEMA.COLUMNS and DATABASE(); table definitions, defaults, existing data, charset/collation ownership and the INC update remain the same. This file is an existing-installation upgrade, not a fresh-install schema.
If applying blocks instead of the combined MySQL file, run the full schema below followed by the same complete INC catalogue block identified above, in one session. Do not run the combined file as well. Keep automatic setup disabled after the manual update so startup does not enter the existing MariaDB-specific automatic step.
CREATE TABLE IF NOT EXISTS `sky_doj_bail_deposits` (
`id` CHAR(36) NOT NULL,
`invoice_id` BIGINT UNSIGNED NULL,
`issuer_job` VARCHAR(64) NOT NULL,
`issuer_name` VARCHAR(120) NOT NULL,
`payer_identifier` VARCHAR(128) NOT NULL,
`payer_name` VARCHAR(120) NOT NULL,
`case_reference` VARCHAR(100) NOT NULL,
`amount` INT UNSIGNED NOT NULL,
`reason` VARCHAR(500) NOT NULL,
`created_by_identifier` VARCHAR(128) NOT NULL,
`created_by_name` VARCHAR(120) NOT NULL,
`decision` VARCHAR(16) NOT NULL DEFAULT '',
`decision_request_key` VARBINARY(128) NOT NULL DEFAULT '',
`decision_reason` VARCHAR(500) NOT NULL DEFAULT '',
`decided_by_identifier` VARCHAR(128) NULL,
`decided_by_name` VARCHAR(120) NULL,
`decided_at` DATETIME NULL,
`ledger_recorded_at` DATETIME NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_doj_bail_invoice` (`invoice_id`),
KEY `idx_doj_bail_case` (`case_reference`, `created_at`),
KEY `idx_doj_bail_payer` (`payer_identifier`, `created_at`),
KEY `idx_doj_bail_decision` (`decision`, `created_at`)
) ENGINE=InnoDB;
SET @sky_release_add_column = IF(
EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'sky_doj_application_details' AND COLUMN_NAME = 'due_at_utc'),
'SELECT 1',
'ALTER TABLE `sky_doj_application_details` ADD COLUMN `due_at_utc` DATETIME NULL'
);
PREPARE sky_release_add_column FROM @sky_release_add_column;
EXECUTE sky_release_add_column;
DEALLOCATE PREPARE sky_release_add_column;
SET @sky_release_add_column = IF(
EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'sky_doj_application_details' AND COLUMN_NAME = 'remind_at_utc'),
'SELECT 1',
'ALTER TABLE `sky_doj_application_details` ADD COLUMN `remind_at_utc` DATETIME NULL'
);
PREPARE sky_release_add_column FROM @sky_release_add_column;
EXECUTE sky_release_add_column;
DEALLOCATE PREPARE sky_release_add_column;
SET @sky_release_add_column = IF(
EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'sky_doj_application_details' AND COLUMN_NAME = 'time_zone'),
'SELECT 1',
'ALTER TABLE `sky_doj_application_details` ADD COLUMN `time_zone` VARCHAR(64) NULL'
);
PREPARE sky_release_add_column FROM @sky_release_add_column;
EXECUTE sky_release_add_column;
DEALLOCATE PREPARE sky_release_add_column;
SET @sky_release_add_column = IF(
EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'sky_doj_filing_entries' AND COLUMN_NAME = 'transition_json'),
'SELECT 1',
'ALTER TABLE `sky_doj_filing_entries` ADD COLUMN `transition_json` LONGTEXT NULL'
);
PREPARE sky_release_add_column FROM @sky_release_add_column;
EXECUTE sky_release_add_column;
DEALLOCATE PREPARE sky_release_add_column;
SET @sky_release_add_column = IF(
EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'sky_doj_handover_routes' AND COLUMN_NAME = 'filing_revision'),
'SELECT 1',
'ALTER TABLE `sky_doj_handover_routes` ADD COLUMN `filing_revision` INT NOT NULL DEFAULT 0'
);
PREPARE sky_release_add_column FROM @sky_release_add_column;
EXECUTE sky_release_add_column;
DEALLOCATE PREPARE sky_release_add_column;
CREATE TABLE IF NOT EXISTS `sky_doj_route_receipts` (
`route_id` CHAR(36) NOT NULL,
`created_by_identifier` VARCHAR(128) NOT NULL,
`created_by_name` VARCHAR(120) NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`route_id`),
FOREIGN KEY (`route_id`) REFERENCES `sky_doj_handover_routes` (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `sky_doj_court_reminders` (
`id` CHAR(36) NOT NULL,
`filing_id` CHAR(36) NOT NULL,
`recipient_identifier` VARCHAR(128) NOT NULL,
`kind` VARCHAR(16) NOT NULL,
`scheduled_at_utc` DATETIME NOT NULL,
`acknowledged_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_court_reminder` (`filing_id`, `recipient_identifier`, `kind`, `scheduled_at_utc`),
FOREIGN KEY (`filing_id`) REFERENCES `sky_doj_filings` (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `sky_doj_execution_reports` (
`id` CHAR(36) NOT NULL,
`delivery_id` CHAR(36) NOT NULL,
`status` VARCHAR(24) NOT NULL,
`body` LONGTEXT NOT NULL,
`created_by_identifier` VARCHAR(128) NOT NULL,
`created_by_name` VARCHAR(120) NOT NULL,
`created_by_job` VARCHAR(64) NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
FOREIGN KEY (`delivery_id`) REFERENCES `sky_doj_decision_deliveries` (`id`)
) ENGINE=InnoDB;
SET @sky_release_add_column = IF(
EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'sky_doj_filing_entries' AND COLUMN_NAME = 'sequence'),
'SELECT 1',
'ALTER TABLE `sky_doj_filing_entries` ADD COLUMN `sequence` INT NOT NULL DEFAULT 0'
);
PREPARE sky_release_add_column FROM @sky_release_add_column;
EXECUTE sky_release_add_column;
DEALLOCATE PREPARE sky_release_add_column;
New tables are sky_doj_bail_deposits (held bail/decisions), sky_doj_route_receipts (handover receipt), sky_doj_court_reminders (per-person reminder acknowledgements) and sky_doj_execution_reports (police execution feedback). Existing sky_doj_application_details gains nullable due_at_utc DATETIME, remind_at_utc DATETIME and time_zone VARCHAR(64); sky_doj_filing_entries gains transition_json LONGTEXT NULL and sequence INT NOT NULL DEFAULT 0; sky_doj_handover_routes gains filing_revision INT NOT NULL DEFAULT 0. Existing rows remain, with the new nullable values empty and sequence/filing_revision 0. No conversion of timezone-less legacy due_at values is guessed: open affected active handovers/drafts after the update and re-save wanted deadlines/follow-ups in the tablet's displayed local timezone. Old deadlines are shown as legacy values until reviewed; UTC deadlines drive the new overdue/follow-up filters and notifications. This update also stops repeating already-completed document-column upgrades; those older columns are not a second new migration.
Documents. Confirm that the Criminal Justice document templates include a published Incarceration Record (INC). Custom or deleted template choices are retained; review a customized INC template before relying on automated booking documents. The automatic Policejob import uses new admission events and stable booking references. It does not rebuild or alter historic case documents.
Inventory items. The DOJ item merge template and both icons are now shipped inside sky_dojjob/config/inventory/. The old repository-level inventory/items_ox.lua was outside the customer resource; there is no old shipped file to delete or rename. For ox_inventory or Qbox with ox_inventory, merge the following entries into the existing item table in ox_inventory/data/items.lua without replacing your full catalogue:
["doj_law_book"] = {
label = "Law book",
weight = 500,
stack = false,
close = true,
consume = 0,
description = "A law book with an archived edition. Use it to read.",
client = { image = "doj_law_book.png" },
},
["doj_document"] = {
label = "Printed document",
weight = 10,
stack = false,
close = true,
consume = 0,
description = "A printed DOJ document. Use it to read the issued copy.",
client = { image = "doj_document.png" },
},
Copy sky_dojjob/config/inventory/doj_document.png and doj_law_book.png to ox_inventory/web/images/ under those same names. For CodeM V2, the verified destination is codem-inventory-images/images/ and the item definitions must omit the item client block; use the provider format described by sky_dojjob/config/inventory/README.md. For other supported metadata-capable providers, keep their installed definitions and use the provider-specific format/image path in the DOJ inventory reference. Standard ESX/VRP inventory adapters do not provide the individual metadata required for printed copies and archived law-book editions. Both DOJ items must be non-stackable, reusable and retain metadata; DOJ owns their Use actions. This resource file is a copy/merge template, not an automatic item installer.
Register certificates still use job_document from Jobs Base. Optional printer supplies and containers remain printer_paper, printer_ink, sky_briefcase and sky_case_folder from Jobs Base; do not substitute doj_document for job_document. Existing renamed DOJ item settings must match inventory names and the Jobs Base briefcase allowlist.
Assets and locales. Install the generated sky_dojjob/config/img/storage_background.webp from the release download for the DOJ archive background. Update sky_dojjob/config/locales/* completely, retain custom wording separately, and replace the entire source folder plus fxmanifest.lua from the same download. Existing DOJ streamed props and courtroom/printer definitions have no new asset migration. The global language stays in Sky Base's Config.locale; Hungarian is not a newly added language in this release.
Provider/order. Use the coordinated sky_base 1.45.0 and sky_jobs_base 1.48.0 updates first; if using Policejob document/decision integration, update sky_policejob to 1.37.0 before starting DOJ 0.3.0. Preserve intentional external billing/banking selections. Central invoice and bail workflows rely on matching Jobs Base billing schema/configuration, which must be installed through its own update instructions.
Document-template loading. The editor now distinguishes an empty published-template catalogue from a failed load of a listed template. After an error, use Try again or select another template. A database-load error asks for the server log; this does not repair an unavailable database or prove that the affected customer's stored templates load. Keep the updated DOJ product locales and built interface together.
Phase 5 of 5
Restart & test
Start your framework, database connector and configured providers first, then Base, Jobs Base and the updated job resources in dependency order. Reconnect clients. After a complete restart, check startup has no database/dependency errors and the DOJ Finance app opens. With authorized staff, issue and pay a test bail invoice, verify it is held, then test one release/refund or forfeiture and confirm the final destination; do not treat ordinary invoices as bail. Confirm the viewer/transfer/seize permissions work for the intended roles. Open a handover, assign an eligible offline judge, save a future deadline and follow-up, and check the receipt/history, local date display and reminder behavior. Review/re-save any legacy deadline you want to remain active. If using Policejob, perform one new admission and check the person's generated INC document, then view a shared granted decision as an authorized police recipient and submit execution feedback. Print a saved DOJ document and use its issued copy; use one law book to capture its edition, transfer/store both items and confirm their metadata still opens. Check the archive background and folder navigation/list-grid preferences.
Save the DOJ profile after changing a permitted job or feature; confirm DOJ app access updates after application. If Police is installed, save a Police reader job and confirm it can access the intended DOJ reader apps while DOJ-only case files remain restricted.
Move the courthouse's Location / map blip point and confirm that its enabled map marker moves without moving the boss-menu interaction. In the document editor, test one published template and, on a staging failure, check that retry and another template selection remain available. If the affected server still reports a database error, collect its server log at the moment From template is opened; the demo browser and source tests do not establish that customer's database result.
If a check fails, keep the update on staging and collect the installed resource versions, selected provider, effective saved setting and the first relevant startup or action error. A successful source test, build or copy does not establish live FiveM, provider or customer acceptance.
Version 0.2.1
Highlights
Changed DOJ startup back to the previous shared-dependency loading behavior.
Other Changes
Updated the bundled Hungarian translations.
Changed Files
sky_dojjob/config/locales/*
sky_dojjob/fxmanifest.lua
sky_dojjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners0.2.00.2.1
Guided update
Update sky_dojjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_dojjob0.2.0 → 0.2.1. Complete earlier migrations first if upgrading from an older version. Back up the database, resources, custom configuration and saved job/Creator data. Stop the server for the coordinated update. Install Base 1.44.1, then Jobs Base 1.47.1, then the matching hotfixes for your installed Sky jobs and Crime.
Phase 2 of 5
Replace files
Use the 0.2.1 download. Delete the entire sky_dojjob/source/ folder and insert the new folder. Replace sky_dojjob/fxmanifest.lua from that same package. Refresh the complete sky_dojjob/config/locales/ tree and reapply custom translations. Keep the new source and manifest together; do not merge old generated interface files into them.
Phase 3 of 5
Merge config
No configuration values or Job Configurator setting keys are added, removed or reset by this hotfix. Keep your current settings and saved overrides. Hungarian uses the existing Config.locale = "hu" setting in sky_base/config/config.lua; leave your selected language unchanged if you do not want to switch. Update the matching Base, Jobs Base and installed resource locale folders together.
Optional diagnostics stay disabled by default. If support requests a recording, put setr sky_profiler 1 before the Sky ensure lines in server.cfg, restart, run profiler record 1000, wait for profiler status to show completion, then run profiler saveJSON sky-hotfix-profile.json. Disable with setr sky_profiler 0 and another restart. This is not a /jobconfig option; nothing is recorded or uploaded automatically.
Phase 4 of 5
SQL & items
No new SQL import, item definition, inventory image or stream asset is required for this hotfix. Keep saved job/Creator data; do not reset or reimport it. Required earlier migrations still apply when upgrading from an older release.
Phase 5 of 5
Restart & test
Start your framework, database connector and configured providers first, then Base 1.44.1, Jobs Base 1.47.1 and the updated jobs/Crime. Reconnect clients. Open /jobconfig and the DOJ tablet, then check the courtroom functions you normally use. If startup still fails, collect the first error and its preceding log lines together with the installed versions.
Version 0.2.0
Highlights
Added managed team workspaces with folder structures and access assigned to individual employees, units, grades, functional roles or an entire job.
Added case handovers for tasks or changes of responsibility, with recipient selection, acceptance, questions, forwarding, decisions and a recorded history.
Added Finance for faction balances, treasury payments and collections, with a history of DOJ operations and citizen bank investigations where the selected banking provider supports them.
Added file-based civil registers and printable certificates for name changes, marriages and divorces, selected licenses and businesses.
Notable Changes
Improved courtroom display rendering and added nearby annotation controls, larger displays, projection screens and a movable 150-inch smartboard that can be pushed from its rear handle.
Added authorized Bodycam and CCTV recordings as courtroom evidence through Sky Jobs Base.
Added redacted text copies of native DOJ documents and folder ZIP archives stored in the workspace while preserving their originals.
Added assignment of loose documents to a numbered case and transfer of case responsibility without changing existing document references.
Added saved functional roles and audience controls for team workspace structures, folder access and ordering.
Restored individual document sharing from personal and shared workspaces.
Added access to permitted Mechanic vehicle reports from the Vehicles directory, including inspection history and signature information.
Added supported citizen account freezes and license management with separate permissions for those actions.
Added independent copies of shared and personal document templates, preserving the selected version's layout and fields for further editing.
Added certificate templates that automatically publish supplied updates while preserving custom layouts, deleted templates and previously issued documents.
Changed election recording to allow one vote per character without an election secret; migration preserves old vote totals and closes published ballots containing legacy votes.
Improved printer output counters and added configurable retention of printed documents across restarts.
Improved printed item labels with document and case references, and made collection failures visible without repeating the same error.
Improved legal-code formatting with custom typography and clearer validation errors while retaining unsaved input.
Other Changes
Added Hungarian translations for DOJ menus and messages.
Fixed an issue where courthouse interaction settings were not consistently saved or applied to markers, map icons, NPCs, labels and interaction distances.
Fixed an issue where renaming a smartboard location left its interaction prompt with the old name.
Improved File Explorer and handover loading by reducing repeated requests and providing clearer loading, empty and error states.
Improved case list readability with visible case numbers and a more compact handover layout.
Fixed document images positioned relative to text so they follow the surrounding text or table content.
Improved tablet forms and dialogs on high-resolution displays, and fixed the hearing list layout beside its details.
Improved resource initialization with the shared Sky imports and clearer database-startup diagnostics.
Update InstructionsA guided update for server owners0.1.10.2.0
Guided update
Update sky_dojjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_dojjob0.1.1 → 0.2.0. Complete earlier required schema installation first if your installed version is older. Prepare Base 1.44.0, Jobs Base 1.47.0 and the complete DOJ 0.2.0 download for the same maintenance window. Follow the Base and Jobs Base update instructions too.
Before stopping the server
Download Sky DOJ Job 0.2.0 and the matching sky_base 1.44.0 and sky_jobs_base 1.47.0 packages. Prepare these companion updates now; replace them together during the maintenance steps below.
Record Config.AutoExecuteQuery from sky_dojjob/config/config.lua. true selects the automatic database update; false requires the manual SQL update below. Keep your chosen value when merging the new configuration. This startup setting is read before the later in-game configuration is applied.
Record your existing /jobconfig settings, roles, shared-workspace access and Creator placements. Collect completed printer output before maintenance. In particular, check each printer's deleteCopiesAfterRestart setting: if enabled, this update removes its uncollected completed DOJ output on initialization. The default is false; copies already in an inventory are not removed.
Finish active court sessions and give players time to save their work. Tell election administrators that published elections containing old votes will be closed by the update, with their results retained. They must start a new election if voting needs to continue after the update.
Keep the existing private election secret with the backup. The new voting system no longer uses it, but it is still needed if the entire installation is restored to 0.1.1.
Stop and back up
Stop FXServer so players and resources cannot write during the update. Back up the database, the existing resource folders and configuration, saved job settings/Creator data, and your inventory storage with its item metadata. Use a consistent backup of these parts before proceeding.
In your database tool, select the server's existing database and run SELECT DATABASE();. Save the election status and vote totals from these read-only queries so you can compare them after migration:
SELECT id, election_key, status, version, closed_at
FROM sky_doj_elections
ORDER BY id;
SELECT election_id, option_id, COUNT(*) AS votes
FROM sky_doj_election_votes
GROUP BY election_id, option_id
ORDER BY election_id, option_id;
Use the complete downloads and follow their own update instructions. These are the matching dependency releases for this update. Keep your configured framework, database and optional provider resources ahead of the Sky resources in the server start order.
ensure sky_base
ensure sky_jobs_base
# Start the compatible optional job/provider resources you actually use here.
ensure sky_dojjob
Keep the compatible Police resource running for citizen searches, bank investigations against real characters, Police case imports and Police-backed conditions. Keep Mechanic running when using its permitted vehicle reports. Their data remains subject to the source job's access rules. A missing banking, billing or license capability cannot be enabled by a DOJ feature switch.
Phase 2 of 5
Replace files
Use the matching 0.2.0 package. Delete the complete old sky_dojjob/source/ folder and insert the new folder, including the built interface. Replace sky_dojjob/fxmanifest.lua from the same download. Refresh the complete sky_dojjob/config/locales/ tree, then merge your custom translations back. Do not merge old generated interface files into the new source/ folder.
Replace sky_dojjob/README.md, sky_dojjob/import.sql and the supplied sky_dojjob/stream/ tree. Copying import.sql does not execute it. Preserve any separate custom assets deliberately. No files outside source/ are removed or renamed in this release.
Replace the manifest with the version from the same 0.2.0 download and merge the changes below into sky_dojjob/config/config.lua. Install all these new files in the exact locations shown:
Copy the matching server/client hook files from the download; the field definitions alone are not sufficient. Keep any custom register keys and custom hook changes. Update sky_dojjob/config/locales/* from the same download, carrying over your translations. No configuration file is deleted or renamed in this update. The old Config.RegistryCatalogassignment moves out of config.lua; its legacy records are not deleted.
The display model catalogues and the register field/hook files still need these file updates when /jobconfig is enabled. Those definitions are not replaced by editing a saved setting. Keep existing courthouse, room, screen and printer placements; adding a model type does not require re-importing or recreating existing placements.
Phase 3 of 5
Merge config
Hungarian language
Refresh the complete resource locale folder from this download, including hu.lua, and carry over your custom translations. To use Hungarian, set the existing Config.locale value to "hu" in sky_base/config/config.lua; its supplied default remains "en". Keep your current value if you are not changing language. This is the shared Sky language setting, so update the matching Base, Jobs Base and installed job locale folders together. Jobs Base supplies the Hungarian /jobconfig translations too. No new /jobconfig language setting, saved-job reset or database migration is required for this language addition. Apply the normal restart and reconnect steps at the end of this update.
If you use /jobconfig
Keep Config.UseJobConfigurator = true. Saved managed values take precedence over local Lua values. Untouched/defaulted values follow the new supplied defaults. In particular, Finance is new and enabled, and Registry changes from disabled to enabled. An old false equal to the old default may never have been stored as an override. After the update, explicitly save Registry as disabled if you want to keep it off. Asset taxes remain disabled by default.
Prepare your choices for the following areas now, and update the Lua files while the server is stopped. After the updated resources and migrations have started successfully, keep player access restricted for maintenance, open /jobconfig, select DOJ, and apply/check these choices. Run any deliberate /jobconfigimport only at that point:
Area
Setting or feature
Old state → new supplied value / action
Features
finance
Absent → true; choose whether to expose Finance to authorized staff.
Features
civilRegistries
false → true; review the effective saved value.
Finance → Treasury job
dojTreasuryJob
New → doj. Use the registered Sky job that owns the treasury.
Finance → Visible factions
dojFinanceJobs
New → police, ambulance, fire, mechanic. Use actual registered job keys; the treasury is included separately.
Finance → Transfer limit
dojFinanceLimit
New → 10000000, per transfer or collection.
Finance → Condition fine payment
dojFinePaymentMode
New → bank. Choose billing to keep external invoice delivery.
Finance → Fine recipient
dojFineSociety
Newly managed setting for the existing Conditions.billingSocietyJob; supplied value remains doj. Carry over any custom recipient from your old Lua configuration.
Courtroom → Move courtroom board
dojCourtroomBoardMove
New → F; players' personal bindings remain separate.
Registry → License registers
dojRegistryLicenses
New → { definitions = { { type = "weapon", label = "Weapon licenses" } } }. Select supported provider license types and their display names.
Registry → Registry file access
dojRegistryAccess
New → { definitions = {} }. Empty inherits the supplied file access rules; add overrides for enabled state, jobs/groups and read/edit clearance.
Registry → DOJ registers
dojRegistryCatalog
The old eight-entry default becomes { definitions = {} }. Keep the actual legacy definitions you still use. Stored overrides remain effective; old inherited defaults may need to be entered again.
Interactions
The 23 interaction IDs in the complete block below
New saved appearance controls for markers, map icons, NPCs, labels and interaction distances. Review custom appearance values; positions stay in Courthouses.
Courthouses
Existing courtroom/public display placements
Keep their IDs. Add the optional larger displays or mobile board only where wanted.
The license-type choices come from the configured provider. dojRegistryLicenseOptions is a live selection list, not a value to save or paste into configuration. Register fields, templates, permission IDs and Create/Update/Remove functions remain in the Lua definition/hook files.
Import is optional and deliberate. Editing managed Lua values does not overwrite your saved configuration. If you choose /jobconfigimport sky_dojjob, first prepare the entire local config and keep a backup: import applies local jobs, settings, feature switches and interaction values together. It is not a selective import of only the new settings. Do not use Default data/reset as a routine update step. You can set the new values directly in their own /jobconfig sections instead.
Exact config.lua changes
Use these changes directly when Config.UseJobConfigurator = false. When it is true, keep the file definitions current and make managed choices in /jobconfig as described above. Preserve your existing values elsewhere in the file.
Finance and fines
Config.Finance did not exist. Add the complete block:
Config.Finance = {
treasuryJob = "doj",
-- Only registered Sky jobs in this list are visible and available for transfers.
allowedJobs = { "police", "ambulance", "fire", "mechanic" },
maxTransferAmount = 10000000,
}
Config.Conditions.finePaymentMode did not exist. Add this line after the existing Config.Conditions = { ... } block, or add the same member inside it:
Config.Conditions.finePaymentMode = "bank"
The old fine path submitted an external bill. The new default attempts an immediate bank payment. To retain invoices, use "billing" instead of "bank" (or choose Invoice in /jobconfig). An invoice being accepted is not confirmation that it has been paid. Bank payment needs a supported adapter, an online target and sufficient funds. Keep Config.Conditions.billingSocietyJob at your actual receiving job; its supplied value remains "doj", but it is now also managed by dojFineSociety. Config.Conditions.policeResource is unchanged.
Config.ToggleFeatures.finance is new; Config.ToggleFeatures.civilRegistries changes from false to true. Add/update these two members of the existing feature table without resetting other features:
Put standalone assignments after the existing Config.ToggleFeatures = { ... } block. You may choose false for either feature. taxes = false is unchanged.
Mobile board key
Config.Keybinds did not exist. Add the full block:
Config.Keybinds = { dojCourtroomBoardMove = "F" }
This is the default grab/release key. The supplied mobile board uses the rear handle. Moving it is temporary; restarting the resource returns it to the saved placement. Keep the stable board_93/sky_doj_court_board_93 IDs even though the current board is 150 inches.
Courtroom evidence models
Replace the props list inside Config.Courtroom.presentation with the following list, keeping any additional custom model entries you need. The first three model IDs and their location suffixes stay unchanged. Their obsolete overlay values are removed:
Existing model
Removed scale
Removed screenOffset
sky_doj_court_tv_55
0.625
{ x = 0.0, y = -0.040, z = 0.0 }
sky_doj_court_tv_75
0.85
{ x = 0.0, y = -0.045, z = 0.0 }
sky_doj_court_monitor_27
0.32
{ x = 0.0, y = -0.036, z = 0.49 }
The five additional entries did not exist: 100/120/150-inch displays, the mobile board and projection display. The assignment below is also copyable after the complete Config.Courtroom block:
Update the matching streamed model/material files from the download. Do not keep the old overlay fields on the three supplied entries. Other Config.Courtroom.presentation values are unchanged, including alwaysVisible = true, renderDistance = 48.0, its intervals and resolution.
Public display models
Keep the existing first four entries of Config.PublicDisplays.props (sky_doj_wall_tv_55, sky_doj_wall_tv_75, sky_doj_desk_monitor_27, sky_doj_floor_terminal_43) unchanged. Add these four complete entries inside that list, before its closing brace; each is new:
{
name = "sky_doj_wall_tv_100",
locationType = "public_display_wall_100",
labelKey = "workshopConfig.locations.publicDisplayWall100",
view = {
targetOffset = {
z = 0,
y = -0.0515,
x = 0,
},
cameraOffset = {
z = 0,
y = -1.973,
x = 0,
},
interactionDistance = 2.75,
},
label = "Public display - 100-inch wall TV",
textureDictionary = "sky_doj_wall_tv_100",
},
{
name = "sky_doj_wall_tv_120",
locationType = "public_display_wall_120",
labelKey = "workshopConfig.locations.publicDisplayWall120",
view = {
targetOffset = {
z = 0,
y = -0.0515,
x = 0,
},
cameraOffset = {
z = 0,
y = -2.368,
x = 0,
},
interactionDistance = 3,
},
label = "Public display - 120-inch wall TV",
textureDictionary = "sky_doj_wall_tv_120",
},
{
name = "sky_doj_wall_tv_150",
locationType = "public_display_wall_150",
labelKey = "workshopConfig.locations.publicDisplayWall150",
view = {
targetOffset = {
z = 0,
y = -0.0515,
x = 0,
},
cameraOffset = {
z = 0,
y = -2.96,
x = 0,
},
interactionDistance = 3.5,
},
label = "Public display - 150-inch wall TV",
textureDictionary = "sky_doj_wall_tv_150",
},
{
name = "sky_doj_projection_screen_01",
locationType = "public_display_projection",
labelKey = "workshopConfig.locations.publicDisplayProjection",
view = {
targetOffset = {
z = 0,
y = -0.014,
x = 0,
},
cameraOffset = {
z = 0,
y = -4,
x = 0,
},
interactionDistance = 4.5,
},
label = "Public display - 4.5 m projection screen",
textureDictionary = "sky_doj_projection_screen_01",
},
Keep their name, textureDictionary, locationType and labelKey values together. The per-model view.interactionDistance, targetOffset and cameraOffset values above are part of the new definitions. Existing public display settings and placements are not otherwise reset.
Interaction appearance
Config.Interactions did not exist. Add this complete table as a top-level assignment. It supplies all 23 interaction overrides. A missing distance in an entry deliberately inherits that type's definition; do not add a guessed value.
With /jobconfig enabled, use its Interactions editor for effective overrides. Without it, change these entries in Lua. For a custom model, keep its own definition and add an interaction override only if you need to change its appearance. This table changes appearance and interaction range, not saved world coordinates or courtroom associations.
Elections
Remove pepperConvar = "sky_dojjob_election_pepper", from Config.Elections. That option is retired; the other election configuration is unchanged. There is no new secret option to add.
Keep your pre-update election backup. Apply the matching 0.2.0 database migration while the old resource is stopped. Only after the new implementation and migration are installed should you remove the old set sky_dojjob_election_pepper "..." line from server.cfg. Do not remove it from a server still running 0.1.1. The migration preserves existing vote totals and closes published elections containing legacy votes; review those ballots before starting new voting. Do not copy or publish the old secret in an update notice.
Register configuration
Remove the old Config.RegistryCatalog = { ... } assignment from config/config.lua. The new config/registry.lua loads afterwards and owns registry settings. Its complete supplied contents are:
-- With UseJobConfigurator enabled, edit Registry settings in /jobconfig.
-- Import loads these local values; Reset restores the shipped defaults.
Config.Registry = {}
-- Empty means: use access settings from each definition in config/registry/.
Config.RegistryAccess = { definitions = {} }
-- Each entry is a separate register. Select a license from the sky_base provider
-- and give the register a name. Only these license types may be issued here.
-- Removing an entry hides its register; existing licenses and records are kept.
Config.RegistryLicenses = { definitions = {
{ type = "weapon", label = "Weapon licenses" },
} }
-- Optional legacy workflows. Existing saved overrides and records are retained.
Config.RegistryCatalog = { definitions = {} }
Exact changes:
Config.Registry is new and initialized once here; the four definition files below fill it afterwards.
Config.RegistryAccess.definitions is new and empty. Each definition supplies enabled = true, groups = { "doj" }, jobs = {}, minimumLevel = 1, editLevel = 1 unless overridden. Removing an override restores those file defaults; use enabled = false to disable a register deliberately.
Config.RegistryLicenses.definitions is new and initially contains only weapon / Weapon licenses. Add only license types supported by your selected Sky Base license provider. Removing a type hides its register; it does not revoke licenses or delete records. An empty list hides all license registers.
Config.RegistryCatalog.definitions previously held notarial_contracts, powers_of_attorney, name_changes, company_registry, association_registry, licensing, administrative_decisions and administrative_objections; the new supplied list is empty. This remains a separate optional legacy catalogue.
Preserve any legacy registers you use
Existing saved dojRegistryCatalog overrides remain effective. If you inherited the old catalogue without an override, or run without /jobconfig, transfer the definitions you actually use into the new location. Keep their existing keys, access and custom names. The complete old standard catalogue is shown below so it can be retained when needed. Put it in config/registry.lua instead of its empty Config.RegistryCatalog assignment, or enter the equivalent values under /jobconfig → DOJ → Registry → DOJ registers. Do not add it as a second conflicting assignment.
The legacy register tables remain separate from the new file-based records. Keeping a definition exposes its legacy workflow again; it does not convert or replay old entries through the new name/license hooks. Do not rename an old persistent key to a new one as a migration shortcut.
New file-defined register tables
These four complete new definition tables are supplied in the named files. Keep the matching server hooks listed above. Field IDs and register keys identify saved data; retain them when adjusting labels or access. The Permission.* values are supplied by the resource and should not be replaced with invented numbers.
The supplied template keys are doj-rnc (name change), doj-rmc (marriage), doj-rdc (divorce), doj-rlc (license) and doj-rbc (business). Custom replacement templates must be published before use. The marriage status selects marriage versus divorce output. Register certificates use the shared job_document printer item; this does not replace the existing doj_document and doj_law_book items. Follow the separate item and SQL steps for this release.
Roles, accounts, integrations and placements
Case-file access: keep your existing RecordsAuthorization.mappingVersion and technical grade_name assignments. They have no changed Lua default in this update. For an installation without a configured access mapping, first set real values under /jobconfig → DOJ → Case-file access (dojRecordsMappingVersion, dojRecordsProsecutionGradeKeys, dojRecordsJudiciaryGradeKeys, dojRecordsCourtAdministrationGradeKeys). With the configurator off, use the existing Config.RecordsAuthorization table. Then an on-duty manager with Manage roles (shared permission 2) can open Case Files and set up the new functional roles. Keep at least one assigned manager when saving the policy. A saved functional-role policy takes precedence over grade fallback; changing Lua defaults will not overwrite it.
Register access: file-based register writes require the court-administration functional role plus the file's action permission and clearance. Business/marriage changes require Manage case files (2306); name changes require Authorize name changes (2318); license-register changes require Authorize licensing (2327). Read permissions remain separate. Registry file access does not bypass the normal job/duty/role checks. Person lookup follows the authorized Police Citizens directory; name/license changes need a real supported framework character.
Finance permissions: assign only the actions intended for your staff: View Finance 2340, Transfer Finance 2341, Collect Finance 2342, View bank accounts 2343, Freeze bank accounts 2344, Manage citizen licenses 2345. These do not get granted by enabling the Finance feature. Citizen license management and license-register authorization are different permission paths.
Accounts:treasuryJob, allowedJobs and the fine recipient use registered Sky job keys, not raw bank account IDs. Preserve the jobs' existing societyAccount settings. Choosing a new job name does not create a job, business or bank account. Check the selected provider before making real transfers; account lookup, statements and freezes are separate capabilities. For providers without supported direct personal bank payment, choose billing for fines.
Register integrations: name changes use the selected framework name-change adapter; licenses use the selected license provider. Complete holder import requires provider support for online and offline holders. An incomplete-list notice does not mean nobody owns a license. Marriage records do not change surnames; business records do not create framework jobs or accounts.
Screens and room groups: keep existing Creator entries and their IDs. Add new display types to the intended courtroom group or public location. The mobile board keeps board_93/sky_doj_court_board_93; its label changes do not change identity. Update the streamed assets together with the config. No courthouse MLO or predefined room/printer placement is added by this update.
Evidence media: retain Config.Courtroom.allowedMediaHosts and allowAllHttps choices; their defaults are still {} and false. Add the exact approved HTTPS hosts you use. Bodycam/CCTV evidence additionally needs access to the Jobs Base source recording; the URL allowlist alone grants no record access.
Printers: keep existing DOJ job printer entries. DOJ's printerSettings.paperEnabled = false, capacity 100, refill item printer_paper and refill amount 25 are unchanged. Printer retention is a shared per-printer setting, deleteCopiesAfterRestart, managed in the job's printer editor. Review that value for each printer. Only ready output on opted-in printers is removed at restart; collected items are preserved. Do not add this option as a new global DOJ Config.PrintedDocuments key.
Optional performance diagnostics
Extra profiler information remains disabled by default. If support requests a recording, prepare setr sky_profiler 1 in server.cfg before the Sky ensure lines. Finish all remaining file, configuration, inventory and SQL steps before starting the server through the update sequence below. After the completed update has started and passed its checks, run profiler record 1000 in the server console, wait until profiler status reports completion, then run profiler saveJSON sky-doj-profile.json. Share the file only when requested. To disable the extra information afterward, change the line to setr sky_profiler 0 and restart again. If enabling it later on an already updated server, add the same line and restart before recording. This is not a /jobconfig setting; enabling it does not record or upload anything automatically.
Keep source/ and fxmanifest.lua from the same download even when diagnostics are disabled. Profiler processing changes only source Lua and the manifest. If an older profiler package changed public files outside source/, restore those files once from the clean current download and reapply your own customizations.
Phase 4 of 5
SQL & items
Inventory items and printer supplies
Register certificates use the shared job_document item. Existing DOJ document copies continue to use doj_document, and law books continue to use doj_law_book. Do not rename or convert existing items to another type. All three need unique, reusable inventory items with preserved individual metadata; existing issued copies and law editions must retain their identifiers.
For ox_inventory, merge this entry from sky_jobs_base/config/inventory/items_ox.lua into the existing table in ox_inventory/data/items.lua if it is not already installed. Correct an existing entry rather than adding the same key twice:
Copy sky_jobs_base/config/inventory/job_document.png to ox_inventory/web/images/job_document.png. If paper or ink consumption is enabled for a printer, also merge printer_paper and printer_ink from the same Jobs Base item file and copy their matching PNG files to the inventory image directory. Use the configured refill names if you customized them. The supplied definitions use stackable refill items with consume = 0; the printer workflow handles consumption.
Keep the existing doj_document and doj_law_book definitions and their PNG files. Their defaults remain non-stackable and non-consuming, with weights of 10 and 500. The DOJ inventory guide provides the definitions and downloadable icons if they are missing. For another supported inventory, add equivalent entries using that inventory's own format and metadata support. Restart/reload item definitions according to the inventory's normal process. Sky registers the usable actions; do not add a second usable-item callback.
Briefcases and portable case folders are optional Jobs Base items, not a new DOJ certificate requirement. Keep their existing contents and metadata if installed.
Assets and media
Replace the supplied DOJ display models, texture dictionaries and stream/sky_doj_props.ytyp together from the same package. Keep every numbered courtroom model variant supplied in stream/; they belong to the separate display instances. The updated source/ also supplies the certificate font/layout media and courtroom UI. No extra font installation or courthouse MLO is required.
Existing Creator placements remain. Configure the larger displays, projection screen or mobile smartboard only where you want to use them. The mobile board is a 150-inch display even though its model is named sky_doj_court_board_93. Its default movement key is F from the rear handle; existing player key-binding overrides still apply. Moving it changes the temporary position, and a resource restart returns it to the saved placement.
Keep Config.Courtroom.allowedMediaHosts aligned with the exact HTTPS hosts used by your evidence media. The default list is empty; allowAllHttps, allowInsecureMedia and allowNuiMedia are false. List the required hosts instead of enabling broad media access just to make a test pass. Verify a real evidence URL from each configured service after starting. Existing saved /jobconfig overrides also apply to managed courtroom settings.
Database changes
The update adds 19 tables and removes no existing table. New storage covers managed workspaces and permissions, functional roles, handovers and court submissions, immutable redacted/disclosed copies, case placement/responsibility/source links, and the DOJ Finance operation history.
The following existing columns change:
Table
0.1.1
0.2.0
sky_doj_case_files
No record_kind
Adds record_kind VARCHAR(16) NOT NULL DEFAULT 'case'; existing case numbers remain unchanged.
sky_doj_workspace_template_versions
No audience_json
Adds audience_json LONGTEXT NULL.
sky_doj_workspace_template_nodes
No applied_sort_order
Adds applied_sort_order INT NULL.
sky_doj_police_imports
No source identity fields
Adds nullable source_job_id VARCHAR(64), source_type VARCHAR(64) and source_key VARCHAR(128).
sky_doj_election_votes
voter_key BINARY(32) NOT NULL and unique key uq_sky_doj_election_vote_voter (election_id, voter_key)
Replaces them with char_id VARCHAR(128) NULL and unique key uq_sky_doj_election_vote_char (election_id, char_id).
sky_doj_elections
voter_pepper_fingerprint BINARY(32) NULL
Removes this column.
The new nullable columns have no explicit non-null default. Old votes remain with char_id = NULL, because their former keys cannot be converted back to character IDs. Their election/option links and vote totals are preserved. Only published elections containing those old votes are closed; their version increases by one and the migration records the closure. Other election statuses remain unchanged. New votes store the character ID and allow one vote per character per election.
Existing personal workspace storage keys and contents remain. Ownership is pre-registered for legacy owners associated with one job; the personal workspace is also registered when its owner opens the workspace. The default register certificate templates are installed/published while custom template revisions, deleted templates and previously issued document versions are preserved.
Automatic update — Config.AutoExecuteQuery = true
Keep Config.AutoExecuteQuery = true in sky_dojjob/config/config.lua. No separate manual import is required for an intact 0.1.1 database.
Finish the file, configuration and item changes first. Start the database/framework/inventory dependencies, then sky_base, sky_jobs_base and sky_dojjob, with player access still restricted for maintenance.
Let the resource finish starting. Check for database errors as well as the migration messages; a single migration-complete line does not replace the checks below. The automatic path creates the new tables, adds missing columns, replaces the voting key/index, registers existing personal workspaces and seeds the supplied templates.
Run the database checks below before opening the server to players. Use /jobconfig only after the resources have started successfully, while maintenance is still active.
Manual update — Config.AutoExecuteQuery = false
Keep FXServer stopped and Config.AutoExecuteQuery = false. Open the complete sky_dojjob/import.sql from the 0.2.0 download in your database tool, using the server's existing database.
Execute it as a SQL script with support for DELIMITER, stored routines and the supplied MariaDB SQL syntax. The database account must be able to perform the supplied schema changes, create/call/drop the temporary upgrade procedures, and write the migrated/seeded data. Use script execution that stops on errors, and inspect the complete result. Do not send the entire file as one ordinary SQL statement or skip failed statements.
Run the full file once. Its CREATE TABLE IF NOT EXISTS statements create the new tables; its separate ALTER, conditional workspace upgrades and election procedure update existing tables. Copying only the new CREATE TABLE definitions would leave an existing server incompletely upgraded.
Run the database checks below while the server is still stopped. On an SQL error or a mismatch, keep the server stopped, preserve the error and diagnose the incomplete step. Do not delete a table or its rows to force the import through. Restore the consistent backup if the update must be abandoned; changing only the Lua files back does not undo a migrated database. Schema changes are not all rolled back by a SQL ROLLBACK.
After the checks pass, continue to Restart and verify below. Keep FXServer stopped until that step; the manual SQL update is now complete.
Database verification
Run these checks against the database you backed up. On the automatic path, do this after the successful first start; on the manual path, do this after the import and before starting FXServer.
Re-run the election queries saved before migration. Every (election_id, option_id) total must match. Published elections that had votes must now be closed; published elections without votes and other previous statuses stay unchanged. Existing vote rows with a null character ID are valid historical votes and must not be deleted or assigned guessed IDs.
Confirm that the seven new columns exist with the expected definitions:
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND (
(TABLE_NAME = 'sky_doj_case_files' AND COLUMN_NAME = 'record_kind')
OR (TABLE_NAME = 'sky_doj_workspace_template_versions' AND COLUMN_NAME = 'audience_json')
OR (TABLE_NAME = 'sky_doj_workspace_template_nodes' AND COLUMN_NAME = 'applied_sort_order')
OR (TABLE_NAME = 'sky_doj_police_imports' AND COLUMN_NAME IN ('source_job_id', 'source_type', 'source_key'))
OR (TABLE_NAME = 'sky_doj_election_votes' AND COLUMN_NAME = 'char_id')
)
ORDER BY TABLE_NAME, COLUMN_NAME;
Confirm that this returns no rows:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND (
(TABLE_NAME = 'sky_doj_election_votes' AND COLUMN_NAME = 'voter_key')
OR (TABLE_NAME = 'sky_doj_elections' AND COLUMN_NAME = 'voter_pepper_fingerprint')
);
Check the voting index. The result must contain uq_sky_doj_election_vote_char, NON_UNIQUE = 0 and columns election_id,char_id; the old voter-key index must be absent:
SELECT INDEX_NAME, NON_UNIQUE,
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS indexed_columns
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sky_doj_election_votes'
GROUP BY INDEX_NAME, NON_UNIQUE
ORDER BY INDEX_NAME;
Confirm that all 19 new tables exist; this query must return 19:
SELECT COUNT(*) AS new_table_count
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME IN (
'sky_doj_functional_roles', 'sky_doj_workspaces',
'sky_doj_workspace_acl_scopes', 'sky_doj_workspace_grants',
'sky_doj_workflow_commands', 'sky_doj_application_details',
'sky_doj_filings', 'sky_doj_filing_entries', 'sky_doj_filing_receipts',
'sky_doj_assignments', 'sky_doj_decision_deliveries',
'sky_doj_redacted_versions', 'sky_doj_disclosure_packages',
'sky_doj_handover_routes', 'sky_doj_case_file_relations',
'sky_doj_case_custody', 'sky_doj_case_custody_handoffs',
'sky_doj_case_source_links', 'sky_doj_finance_operations'
);
sky_doj_courtroom_evidence.file_snapshot_json LONGTEXT NULL already belongs to 0.1.1 and must still exist. It is not a new 0.2.0 column. If it is absent, the installed schema does not match the 0.1.1 starting point; resolve that discrepancy before proceeding with a manual update.
Phase 5 of 5
Restart & test
With the automatic SQL path, the updated resources are already running from the database step; keep maintenance active and continue with the checks below. With the manual SQL path, start the database/framework/inventory and configured providers, Base 1.44.0, Jobs Base 1.47.0, the compatible optional Sky jobs you use and DOJ 0.2.0 now. Resolve startup and migration errors while player access is restricted for maintenance.
After all resources have started, connect while maintenance is still active. Perform the applicable checks for the modules and integrations you use; keep deliberately disabled features off. Use an authorized on-duty DOJ character and then a character without the corresponding access:
Open existing case files and personal/shared folders. Verify case numbers, document references, stored layouts and access. If enabled, open /jobconfig now to finish the documented role bindings, functional-role setup and saved configuration checks; confirm that a restricted character cannot use the same protected action.
Open the register list, save an allowed test record and preview its certificate. Confirm the correct published template is available. Verify an existing customized template still has its intended layout; deliberately deleted templates must stay deleted.
Print one register certificate, collect it from the selected physical printer, then read that actual inventory copy. Also read an existing doj_document and law-book item. Check their labels, content and metadata after transfer using your normal test characters. A plain administrator-created item without a copy identifier is not a printing test.
Check the configured printer's output count and chosen restart-retention behavior. With retention enabled, a completed uncollected test copy should remain after a controlled restart; with deleteCopiesAfterRestart = true, uncollected completed output should be cleared. Previously collected inventory documents must still read correctly.
Compare the migrated election totals and statuses, then use a new test election to check one vote per character. Do not reopen a legacy election containing old votes by changing its database status.
Open permitted Mechanic vehicle reports, test the configured evidence host on a courtroom display and try the smartboard's rear handle. Confirm nearby viewers receive the presentation and unauthorized actions are rejected.
Test the Finance actions you actually enable against their configured banking/billing providers and role permissions. A submitted bill is not proof of payment. Keep the server in maintenance if any required dependency, migration, item, saved access rule or configured integration fails.
Confirm your intended Finance/Registry feature choices, custom fine recipient and legacy register definitions survived. If /jobconfig is enabled, verify its saved interaction appearance and ranges as well as the unchanged courthouse/printer positions. Test one ordinary handover with selected documents, then a separate transfer of case responsibility with authorized test characters: accepting responsibility gives access to the whole case, including unselected and future content. Existing independent grants remain. Check that neighboring private folders remain inaccessible. If a Finance operation requests administrator review, reconcile its operation history with the provider before attempting another payment.
Version 0.1.1
Highlights
Added a DOJ tablet with numbered case files, citizen and vehicle records, personal folders and shared agency documents.
Added hearing schedules and courtroom sessions with participants, evidence presentation and public courthouse information screens.
Added legal codes, a Fine Catalogue, structured court conditions and digital elections.
Notable Changes
Added document layout controls, reusable fields, document references and published template versions that remain attached to the documents created from them.
Added staff signature lines and targeted participant signature requests, with eligibility checks for the document version being signed.
Added document attachments, independent copies, moving files, search and folders for organizing case material.
Added browser-assisted uploads of local files for document attachments, with time-limited upload sessions.
Added personal workspace sharing, shortcuts and reusable folder templates, with markers for folders created during setup.
Added restoration of personal document drafts after reopening the editor.
Added court document templates for Police and authorized imports of Police activity records.
Added document sharing and revocation while keeping separately issued copies and prints tied to their original content.
Added printer collection and readable inventory documents, plus law-book items that retain their issued edition.
Added legal-code editing with rich text, DOCX import, saved versions and a public reader.
Added a shared DOJ and Police offence catalogue with fine and sentence calculations.
Added hearing participants, courtroom scheduling, attendance and self check-in.
Added courtroom role stations, admitted evidence, independent evidence screens, annotations, jury votes, personal witness oaths, a microphone and a judge's gavel.
Added public hearing displays with configurable subject and judge visibility, separate from private case access.
Added election drafts, answer options, voting periods, staff results and in-world digital voting booths.
Added court conditions with deadlines, evidence and violation tracking, including optional billing and Police integrations.
Added optional civil-registry workflows with supported name and license changes; the registry module remains disabled by default in this historical version.
Added optional vehicle and property taxes, disabled by default.
Other Changes
Added in-game configuration for DOJ jobs, courthouses, available modules and access settings through /jobconfig.
Added prosecution, judiciary and court-administration access based on configured technical grade names, duty and action permissions.
Added automatic database setup and the corresponding manual SQL file for the implemented systems.
Added localized interfaces and supplied courtroom display, voting-booth and gavel assets.
Added configurable Miranda text and clearer guidance for technical grade assignments.
Improved document, attachment and sharing checks so access changes are applied to the affected actions.
Setup Notes
Configure the role mapping, printers and courtroom placements for your server. Case-file access requires a mapping version and the actual technical grade names. Civil registries and asset taxes are disabled by default in this version; the Citizens and Vehicles directories are separate from the registry toggle.
Elections in this version require a private sky_dojjob_election_pepper server setting for elections: 32–512 characters without whitespace or control characters. Published elections are bound to that secret. Do not remove or rotate it on an installation still using this implementation. Character-based voting, Finance, case handovers, saved functional roles and the later register certificates were added in 0.2.0.
Use the installation instructions supplied with your download and keep sky_base and sky_jobs_base up to date. Back up existing configuration, database records, saved settings and inventory metadata before updating an installed server.
Keep the election secret while using this version. Apply the newer 0.2.0 settings only with their matching update instructions above.