# Organization Usage Guide The organization module stores organization records, members, assets, fleet entries, and credit lines. Durable commands manage persisted records directly. Hot-state commands support the active organization UI workflows. ## Storage Model Core organization: ```json { "id": "default", "owner": "server", "name": "Default Organization", "funds": 0.0, "reputation": 0, "credit_lines": {} } ``` Hot organization: ```json { "id": "default", "owner": "server", "name": "Default Organization", "funds": 0.0, "reputation": 0, "credit_lines": {}, "assets": {}, "fleet": {}, "members": {}, "pending_invites": {} } ``` Rules validated by the Rust service: - `id` must be non-empty and contain only alphanumeric characters or `_`. - `owner` must be `server` or a 17-digit Steam UID. - `name` cannot be empty, cannot exceed 100 characters, and cannot contain control characters. - `funds`, reputation, and credit line amounts cannot be negative. - Player registration is rejected when the player already belongs to a non-default organization. ## Durable Commands
Command Arguments Returns
org:create org_id , org_json Organization JSON.
org:get org_id Organization JSON.
org:update org_id , patch_json Updated organization JSON.
org:exists org_id true or false .
org:delete org_id OK .
org:assets:get org_id Asset map JSON.
org:assets:update org_id , assets_json Updated asset map JSON.
org:fleet:get org_id Fleet map JSON.
org:fleet:update org_id , fleet_json Updated fleet map JSON.
org:members:get org_id Member array JSON.
org:members:add org_id , member_uid OK .
org:members:remove org_id , member_uid OK .
## Create an Organization The command key is authoritative for `id`. ```sqf private _org = createHashMapFromArray [ ["id", _orgId], ["owner", getPlayerUID player], ["name", "Spearnet Logistics"], ["funds", 0], ["reputation", 0], ["credit_lines", createHashMap] ]; private _result = "forge_server" callExtension ["org:create", [ _orgId, toJSON _org ]]; ``` ## Update Organization Funds ```sqf private _patch = createHashMapFromArray [ ["funds", 5000], ["reputation", 10] ]; private _result = "forge_server" callExtension ["org:update", [ _orgId, toJSON _patch ]]; ``` Supported durable patch fields are `id`, `owner`, `name`, `funds`, `reputation`, and `credit_lines`. ## Assets and Fleet Assets are grouped by category, then classname. ```sqf private _assets = createHashMapFromArray [ ["ammo", createHashMapFromArray [ ["ACE_30Rnd_65x39_caseless_mag", createHashMapFromArray [ ["classname", "ACE_30Rnd_65x39_caseless_mag"], ["type", "ammo"], ["quantity", 20] ]] ]] ]; "forge_server" callExtension ["org:assets:update", [_orgId, toJSON _assets]]; ``` Fleet is keyed by an internal fleet entry ID. ```sqf private _fleet = createHashMapFromArray [ ["B_Truck_01_transport_F_0", createHashMapFromArray [ ["classname", "B_Truck_01_transport_F"], ["name", "Transport Truck"], ["type", "cars"], ["status", "Ready"], ["damage", "0%"] ]] ]; "forge_server" callExtension ["org:fleet:update", [_orgId, toJSON _fleet]]; ``` ## Hot-State Commands
Command Arguments Returns
org:hot:init org_id Hot organization JSON.
org:hot:get org_id Hot organization JSON.
org:hot:override org_id , hot_org_json Hot organization JSON.
org:hot:ensure_member context_json Hot organization JSON.
org:hot:member_invites member_uid Invite array JSON.
org:hot:register context_json Register result JSON.
org:hot:invite_member context_json Invite result JSON.
org:hot:accept_invite context_json Invite decision result JSON.
org:hot:decline_invite context_json Invite decision result JSON.
org:hot:assign_credit_line context_json Mutation result JSON.
org:hot:repay_credit_line context_json Repayment result JSON.
org:hot:charge_checkout context_json Mutation result JSON.
org:hot:add_assets context_json , assets_json Mutation result JSON.
org:hot:add_fleet context_json , fleet_json Mutation result JSON.
org:hot:leave context_json Leave result JSON.
org:hot:disband context_json Disband result JSON.
org:hot:save org_id Current hot organization JSON and async durable save.
org:hot:remove org_id OK .
## Register from UI Context ```sqf private _context = createHashMapFromArray [ ["requesterUid", getPlayerUID player], ["requesterName", name player], ["orgId", _orgId], ["orgName", "Spearnet Logistics"], ["existingOrgId", "default"] ]; private _result = "forge_server" callExtension ["org:hot:register", [toJSON _context]]; ``` ## Invite and Accept ```sqf private _invite = createHashMapFromArray [ ["requesterUid", getPlayerUID player], ["requesterName", name player], ["orgId", _orgId], ["requesterIsDefaultOrgCeo", false], ["targetUid", _targetUid], ["targetName", _targetName], ["targetOrgId", "default"] ]; "forge_server" callExtension ["org:hot:invite_member", [toJSON _invite]]; private _decision = createHashMapFromArray [ ["requesterUid", _targetUid], ["requesterName", _targetName], ["orgId", _orgId], ["existingOrgId", "default"] ]; "forge_server" callExtension ["org:hot:accept_invite", [toJSON _decision]]; ``` ## Credit Line Checkout ```sqf private _credit = createHashMapFromArray [ ["requesterUid", getPlayerUID player], ["orgId", _orgId], ["requesterIsDefaultOrgCeo", false], ["memberUid", _memberUid], ["memberName", _memberName], ["amount", 1000] ]; "forge_server" callExtension ["org:hot:assign_credit_line", [toJSON _credit]]; private _charge = createHashMapFromArray [ ["requesterUid", _memberUid], ["orgId", _orgId], ["requesterIsDefaultOrgCeo", false], ["source", "credit_line"], ["amount", 250], ["commit", true] ]; "forge_server" callExtension ["org:hot:charge_checkout", [toJSON _charge]]; ``` ## Error Handling ```sqf private _payload = _result select 0; if (_payload find "Error:" == 0) exitWith { systemChat format ["Organization error: %1", _payload]; }; ```