Add daily AI health score calculation (0-100) for both operating and reserve funds. Scores include trajectory tracking, factor analysis, recommendations, and data readiness checks. Dashboard displays graphical RingProgress gauges with color-coded scores, trend indicators, and expandable detail popovers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
35 lines
1.3 KiB
SQL
35 lines
1.3 KiB
SQL
-- Migration: Add health_scores table to all tenant schemas
|
|
-- This table stores AI-derived operating and reserve fund health scores
|
|
|
|
DO $$
|
|
DECLARE
|
|
tenant RECORD;
|
|
BEGIN
|
|
FOR tenant IN
|
|
SELECT schema_name FROM shared.organizations WHERE status = 'active'
|
|
LOOP
|
|
EXECUTE format(
|
|
'CREATE TABLE IF NOT EXISTS %I.health_scores (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
score_type VARCHAR(20) NOT NULL CHECK (score_type IN (''operating'', ''reserve'')),
|
|
score INTEGER NOT NULL CHECK (score >= 0 AND score <= 100),
|
|
previous_score INTEGER,
|
|
trajectory VARCHAR(20) CHECK (trajectory IN (''improving'', ''stable'', ''declining'')),
|
|
label VARCHAR(30),
|
|
summary TEXT,
|
|
factors JSONB,
|
|
recommendations JSONB,
|
|
missing_data JSONB,
|
|
status VARCHAR(20) NOT NULL DEFAULT ''complete'' CHECK (status IN (''complete'', ''pending'', ''error'')),
|
|
response_time_ms INTEGER,
|
|
calculated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
)', tenant.schema_name
|
|
);
|
|
EXECUTE format(
|
|
'CREATE INDEX IF NOT EXISTS idx_%s_hs_type_calc ON %I.health_scores(score_type, calculated_at DESC)',
|
|
replace(tenant.schema_name, '.', '_'), tenant.schema_name
|
|
);
|
|
END LOOP;
|
|
END $$;
|