| CREATE TABLE IF NOT EXISTS migrations ( |
| id TEXT PRIMARY KEY, |
| description TEXT, |
| applied_at TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS tenants ( |
| tenant_id TEXT PRIMARY KEY, |
| name TEXT NOT NULL, |
| industry TEXT DEFAULT 'logistics', |
| deployment_mode TEXT DEFAULT 'hosted', |
| status TEXT DEFAULT 'active', |
| created_at TEXT NOT NULL, |
| updated_at TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS jobs ( |
| job_id TEXT PRIMARY KEY, |
| tenant_id TEXT NOT NULL, |
| job_type TEXT NOT NULL, |
| state TEXT NOT NULL, |
| payload_json TEXT, |
| result_json TEXT, |
| error_json TEXT, |
| created_at TEXT NOT NULL, |
| updated_at TEXT NOT NULL, |
| started_at TEXT, |
| finished_at TEXT |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS runs ( |
| run_id TEXT PRIMARY KEY, |
| tenant_id TEXT NOT NULL, |
| job_id TEXT, |
| vertical TEXT DEFAULT 'logistics', |
| state TEXT NOT NULL, |
| output_dir TEXT, |
| manifest_json TEXT, |
| created_at TEXT NOT NULL, |
| updated_at TEXT NOT NULL, |
| started_at TEXT, |
| finished_at TEXT |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS findings ( |
| finding_id TEXT PRIMARY KEY, |
| tenant_id TEXT NOT NULL, |
| run_id TEXT NOT NULL, |
| title TEXT, |
| entity_id TEXT, |
| entity_type TEXT, |
| archetype TEXT, |
| severity TEXT, |
| confidence REAL, |
| drift_score REAL, |
| finding_json TEXT, |
| created_at TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS evidence ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| tenant_id TEXT NOT NULL, |
| run_id TEXT NOT NULL, |
| finding_id TEXT NOT NULL, |
| metric TEXT, |
| source_file TEXT, |
| baseline_value REAL, |
| current_value REAL, |
| change_pct REAL, |
| confidence REAL, |
| evidence_json TEXT, |
| created_at TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS reports ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| tenant_id TEXT NOT NULL, |
| run_id TEXT NOT NULL, |
| report_type TEXT NOT NULL, |
| path TEXT NOT NULL, |
| created_at TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS feedback ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| tenant_id TEXT NOT NULL, |
| run_id TEXT, |
| finding_id TEXT, |
| user_id TEXT, |
| feedback_type TEXT, |
| notes TEXT, |
| created_at TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS audit_logs ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| timestamp TEXT NOT NULL, |
| tenant_id TEXT NOT NULL, |
| user_id TEXT, |
| action TEXT NOT NULL, |
| resource_type TEXT, |
| resource_id TEXT, |
| outcome TEXT, |
| metadata_json TEXT |
| ); |
|
|
| CREATE INDEX IF NOT EXISTS idx_jobs_tenant_state ON jobs(tenant_id, state); |
| CREATE INDEX IF NOT EXISTS idx_runs_tenant_state ON runs(tenant_id, state); |
| CREATE INDEX IF NOT EXISTS idx_findings_tenant_run ON findings(tenant_id, run_id); |
| CREATE INDEX IF NOT EXISTS idx_audit_logs_tenant_time ON audit_logs(tenant_id, timestamp); |
|
|