# CAD Usage Guide - forge-docus
The CAD module stores transient operational state for dispatch activity, assignments, dispatch orders, support requests, group profiles, grouped views, and hydrated UI payloads. CAD state is in-memory and follows the active server or mission lifecycle.

Server Modules

# CAD Usage Guide

The CAD module stores transient operational state for dispatch activity, assignments, dispatch orders, support requests, group profiles, grouped views, and hydrated UI payloads. CAD state is in-memory and follows the active server or mission lifecycle.

# CAD Usage Guide

The CAD module stores transient operational state for dispatch activity, assignments, dispatch orders, support requests, group profiles, grouped views, and hydrated UI payloads. CAD state is in-memory and follows the active server or mission lifecycle.

## Data Model

Most CAD records are flexible JSON objects. The service normalizes important IDs and returns structured mutation results for higher-level workflows.

Common generated IDs:

- Orders: `cad-order:<sequence>`
- Requests: `cad-request:<sequence>`
- Assignments usually share a task ID or order ID.

## Commands

### Activity

Command | Arguments | Returns
--- | --- | ---
`cad:activity:append` | `activity_json` | `OK`.
`cad:activity:recent` | `limit` | Recent activity array JSON.

### Assignments

Command | Arguments | Returns
--- | --- | ---
`cad:assignments:list` | none | Assignment array JSON.
`cad:assignments:assign` | `entry_id`, `assignment_json` | Assignment mutation result JSON.
`cad:assignments:acknowledge` | `entry_id`, `patch_json` | Assignment mutation result JSON.
`cad:assignments:decline` | `entry_id`, `patch_json` | Assignment mutation result JSON and removes assignment.
`cad:assignments:upsert` | `entry_id`, `assignment_json` | `OK`.
`cad:assignments:delete` | `entry_id` | `OK`.

### Orders

Command | Arguments | Returns
--- | --- | ---
`cad:orders:list` | none | Order array JSON.
`cad:orders:create` | `order_seed_json` | Dispatch order mutation result JSON.
`cad:orders:create_from_context` | `context_json` | Dispatch order mutation result JSON.
`cad:orders:close` | `entry_id` | Dispatch order mutation result JSON and removes order/assignment.
`cad:orders:upsert` | `entry_id`, `order_json` | `OK`.
`cad:orders:delete` | `entry_id` | `OK`.

### Requests

Command | Arguments | Returns
--- | --- | ---
`cad:requests:list` | none | Request array JSON.
`cad:requests:submit` | `request_json` | Request mutation result JSON.
`cad:requests:submit_from_context` | `context_json` | Request mutation result JSON.
`cad:requests:close` | `entry_id` | Request mutation result JSON and removes request.
`cad:requests:upsert` | `entry_id`, `request_json` | `OK`.
`cad:requests:delete` | `entry_id` | `OK`.

### Profiles and Views

Command | Arguments | Returns
--- | --- | ---
`cad:profiles:list` | none | Profile array JSON.
`cad:profiles:update_from_context` | `context_json` | Profile mutation result JSON.
`cad:profiles:upsert` | `entry_id`, `profile_json` | `OK`.
`cad:profiles:delete` | `entry_id` | `OK`.
`cad:groups:build` | `groups_seed_json` | Group array JSON.
`cad:view:hydrate` | `hydrate_seed_json` | Hydrated CAD payload JSON.

## Submit a Support Request

    private _fields = createHashMapFromArray [
        ["pickup_location", "Grid 123456"],
        ["precedence", "urgent"],
        ["security", "secure"]
    ];

    private _context = createHashMapFromArray [
        ["type", "medevac_9line"],
        ["fields", _fields],
        ["groupId", "alpha"],
        ["groupCallsign", "Alpha 1-1"],
        ["submittedByUid", getPlayerUID player],
        ["submittedByName", name player],
        ["priority", "emergency"],
        ["position", getPosATL player],
        ["createdAt", diag_tickTime]
    ];

    private _result = "forge_server" callExtension ["cad:requests:submit_from_context", [
        toJSON _context
    ]];

Supported priority values are `routine`, `priority`, and `emergency`. Unknown values normalize to `priority`.

## Create a Dispatch Order

    private _context = createHashMapFromArray [
        ["assigneeGroupId", "bravo"],
        ["assigneeGroupCallsign", "Bravo 1-1"],
        ["targetGroupId", "alpha"],
        ["targetGroupCallsign", "Alpha 1-1"],
        ["targetPosition", getPosATL player],
        ["createdByUid", getPlayerUID player],
        ["createdByName", name player],
        ["requestId", "cad-request:1"],
        ["requestType", "logreq"],
        ["requestTitle", "LOGREQ | Alpha 1-1"],
        ["requestSummary", "Ammo resupply requested"],
        ["requestFields", createHashMap],
        ["note", "Support Alpha 1-1 at current position."],
        ["priority", "priority"],
        ["createdAt", diag_tickTime]
    ];

    private _result = "forge_server" callExtension ["cad:orders:create_from_context", [
        toJSON _context
    ]];

## Assignment Workflow

    private _assignment = createHashMapFromArray [
        ["groupId", "bravo"],
        ["assigneeGroupCallsign", "Bravo 1-1"],
        ["assignedByUid", getPlayerUID player],
        ["assignedByName", name player],
        ["assignedAt", diag_tickTime],
        ["state", "assigned"]
    ];

    "forge_server" callExtension ["cad:assignments:assign", [
        "task-123",
        toJSON _assignment
    ]];

    private _ack = createHashMapFromArray [
        ["state", "acknowledged"],
        ["acknowledgedByUid", getPlayerUID player],
        ["acknowledgedAt", diag_tickTime]
    ];

    "forge_server" callExtension ["cad:assignments:acknowledge", [
        "task-123",
        toJSON _ack
    ]];

## Hydrate the CAD UI

    private _session = createHashMapFromArray [
        ["uid", getPlayerUID player],
        ["orgId", "default"],
        ["isDispatcher", true],
        ["groupId", "alpha"],
        ["isLeader", true]
    ];

    private _seed = createHashMapFromArray [
        ["groups", _liveGroups],
        ["activeTasks", _activeTasks],
        ["session", _session]
    ];

    private _result = "forge_server" callExtension ["cad:view:hydrate", [toJSON _seed]];

## Error Handling

    private _payload = _result select 0;
    if (_payload find "Error:" == 0) exitWith {
        systemChat format ["CAD error: %1", _payload];
    };

Edit this page or Report an issue

Bank Usage Guide

The bank module stores player account balances, earnings, PINs, and transaction strings. The hot-state API also owns the active banking workflows used by the UI: deposit, withdraw, transfer, checkout charge, and PIN validation.

Economy Usage Guide

The economy server addon owns Arma-world service behavior for fuel, medical, and repair interactions. It does not own money state. Money mutations go through extension-backed bank and organization hot state before the world effect is applied.