Services: Admin-Compliance, Backend-Compliance, AI-Compliance-SDK, Consent-SDK, Developer-Portal, PCA-Platform, DSMS Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
169 lines
6.7 KiB
SQL
169 lines
6.7 KiB
SQL
-- Migration 004: UCCA Escalation Workflow
|
|
-- Implements E0-E3 escalation levels with DSB routing
|
|
|
|
-- ============================================================================
|
|
-- Escalation Levels (Reference)
|
|
-- ============================================================================
|
|
-- E0: Auto-Approve - Only INFO rules triggered, Risk < 20
|
|
-- E1: Team-Lead Review - WARN rules OR Risk 20-40
|
|
-- E2: DSB Consultation - Art. 9 data OR Risk 40-60 OR DSFA recommended
|
|
-- E3: DSB + Legal - BLOCK rules OR Risk > 60 OR Art. 22 risk
|
|
|
|
-- ============================================================================
|
|
-- Escalation Queue Table
|
|
-- ============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS ucca_escalations (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES compliance_tenants(id) ON DELETE CASCADE,
|
|
assessment_id UUID NOT NULL REFERENCES ucca_assessments(id) ON DELETE CASCADE,
|
|
|
|
-- Escalation Level
|
|
escalation_level VARCHAR(10) NOT NULL CHECK (escalation_level IN ('E0', 'E1', 'E2', 'E3')),
|
|
escalation_reason TEXT NOT NULL,
|
|
|
|
-- Routing
|
|
assigned_to UUID, -- User ID of assignee (DSB, Team Lead, etc.)
|
|
assigned_role VARCHAR(50), -- Role for assignment (dsb, team_lead, legal)
|
|
assigned_at TIMESTAMPTZ,
|
|
|
|
-- Status
|
|
status VARCHAR(30) NOT NULL DEFAULT 'pending'
|
|
CHECK (status IN ('pending', 'assigned', 'in_review', 'approved', 'rejected', 'returned')),
|
|
|
|
-- Review
|
|
reviewer_id UUID,
|
|
reviewer_notes TEXT,
|
|
reviewed_at TIMESTAMPTZ,
|
|
|
|
-- Decision
|
|
decision VARCHAR(20) CHECK (decision IN ('approve', 'reject', 'modify', 'escalate')),
|
|
decision_notes TEXT,
|
|
decision_at TIMESTAMPTZ,
|
|
|
|
-- Conditions for approval
|
|
conditions JSONB DEFAULT '[]', -- Array of conditions that must be met
|
|
|
|
-- Timestamps
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
due_date TIMESTAMPTZ, -- SLA deadline
|
|
|
|
-- Notifications sent
|
|
notification_sent BOOLEAN DEFAULT FALSE,
|
|
notification_sent_at TIMESTAMPTZ
|
|
);
|
|
|
|
-- ============================================================================
|
|
-- Escalation History (Audit Trail)
|
|
-- ============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS ucca_escalation_history (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
escalation_id UUID NOT NULL REFERENCES ucca_escalations(id) ON DELETE CASCADE,
|
|
|
|
-- What changed
|
|
action VARCHAR(50) NOT NULL, -- created, assigned, reviewed, decided, escalated, etc.
|
|
old_status VARCHAR(30),
|
|
new_status VARCHAR(30),
|
|
old_level VARCHAR(10),
|
|
new_level VARCHAR(10),
|
|
|
|
-- Who and when
|
|
actor_id UUID NOT NULL,
|
|
actor_role VARCHAR(50),
|
|
notes TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- ============================================================================
|
|
-- DSB Assignment Pool
|
|
-- ============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS ucca_dsb_pool (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES compliance_tenants(id) ON DELETE CASCADE,
|
|
user_id UUID NOT NULL,
|
|
user_name VARCHAR(255) NOT NULL,
|
|
user_email VARCHAR(255) NOT NULL,
|
|
role VARCHAR(50) NOT NULL DEFAULT 'dsb', -- dsb, deputy_dsb, legal
|
|
is_active BOOLEAN DEFAULT TRUE,
|
|
max_concurrent_reviews INT DEFAULT 10,
|
|
current_reviews INT DEFAULT 0,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
|
UNIQUE(tenant_id, user_id)
|
|
);
|
|
|
|
-- ============================================================================
|
|
-- SLA Configuration per Escalation Level
|
|
-- ============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS ucca_escalation_sla (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES compliance_tenants(id) ON DELETE CASCADE,
|
|
escalation_level VARCHAR(10) NOT NULL CHECK (escalation_level IN ('E0', 'E1', 'E2', 'E3')),
|
|
|
|
-- SLA settings
|
|
response_hours INT NOT NULL DEFAULT 24, -- Hours to first response
|
|
resolution_hours INT NOT NULL DEFAULT 72, -- Hours to resolution
|
|
|
|
-- Notification settings
|
|
notify_on_creation BOOLEAN DEFAULT TRUE,
|
|
notify_on_approaching_sla BOOLEAN DEFAULT TRUE,
|
|
notify_on_sla_breach BOOLEAN DEFAULT TRUE,
|
|
approaching_sla_hours INT DEFAULT 8, -- Notify X hours before SLA breach
|
|
|
|
-- Auto-escalation
|
|
auto_escalate_on_breach BOOLEAN DEFAULT FALSE,
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
|
UNIQUE(tenant_id, escalation_level)
|
|
);
|
|
|
|
-- ============================================================================
|
|
-- Indexes
|
|
-- ============================================================================
|
|
|
|
-- Fast lookup by tenant and status
|
|
CREATE INDEX idx_ucca_escalations_tenant_status ON ucca_escalations(tenant_id, status);
|
|
|
|
-- Fast lookup by assignee
|
|
CREATE INDEX idx_ucca_escalations_assigned ON ucca_escalations(assigned_to, status);
|
|
|
|
-- Fast lookup by assessment
|
|
CREATE INDEX idx_ucca_escalations_assessment ON ucca_escalations(assessment_id);
|
|
|
|
-- SLA monitoring (find escalations approaching or past due date)
|
|
CREATE INDEX idx_ucca_escalations_due ON ucca_escalations(due_date) WHERE status NOT IN ('approved', 'rejected');
|
|
|
|
-- History lookup
|
|
CREATE INDEX idx_ucca_escalation_history_escalation ON ucca_escalation_history(escalation_id);
|
|
|
|
-- DSB pool lookup
|
|
CREATE INDEX idx_ucca_dsb_pool_tenant ON ucca_dsb_pool(tenant_id, is_active);
|
|
|
|
-- ============================================================================
|
|
-- Default SLA Values (inserted on first use)
|
|
-- ============================================================================
|
|
|
|
-- Note: These will be inserted per-tenant when needed via application logic
|
|
-- E0: Auto-approve, no SLA
|
|
-- E1: 24h response, 72h resolution
|
|
-- E2: 8h response, 48h resolution
|
|
-- E3: 4h response, 24h resolution (urgent)
|
|
|
|
-- ============================================================================
|
|
-- Comments
|
|
-- ============================================================================
|
|
|
|
COMMENT ON TABLE ucca_escalations IS 'UCCA escalation queue for assessments requiring review';
|
|
COMMENT ON COLUMN ucca_escalations.escalation_level IS 'E0=Auto, E1=Team, E2=DSB, E3=DSB+Legal';
|
|
COMMENT ON COLUMN ucca_escalations.conditions IS 'JSON array of conditions required for approval';
|
|
COMMENT ON TABLE ucca_escalation_history IS 'Audit trail of all escalation state changes';
|
|
COMMENT ON TABLE ucca_dsb_pool IS 'Pool of DSB/Legal reviewers for assignment';
|
|
COMMENT ON TABLE ucca_escalation_sla IS 'SLA configuration per escalation level per tenant';
|