CREATE TABLE IF NOT EXISTS staff_outbox ( id VARCHAR(26) PRIMARY KEY CHECK (id ~ '^[0-9A-HJKMNP-TV-Z]{26}$'), tenant_id VARCHAR(26) NOT NULL CHECK (tenant_id ~ '^[0-9A-HJKMNP-TV-Z]{26}$'), event_type TEXT NOT NULL, event_version INTEGER NOT NULL CHECK (event_version > 0), payload JSONB NOT NULL, correlation_id VARCHAR(26) NOT NULL, causation_id VARCHAR(26), occurred_at TIMESTAMPTZ NOT NULL, published_at TIMESTAMPTZ, attempts INTEGER NOT NULL DEFAULT 0, last_error TEXT ); CREATE INDEX staff_outbox_pending_idx ON staff_outbox (tenant_id, occurred_at) WHERE published_at IS NULL; CREATE TABLE IF NOT EXISTS staff_inbox ( event_id VARCHAR(26) NOT NULL, tenant_id VARCHAR(26) NOT NULL, event_type TEXT NOT NULL, event_version INTEGER NOT NULL, correlation_id VARCHAR(26) NOT NULL, causation_id VARCHAR(26), received_at TIMESTAMPTZ NOT NULL DEFAULT now(), processed_at TIMESTAMPTZ, PRIMARY KEY (tenant_id, event_id) ); CREATE TABLE IF NOT EXISTS staff_idempotency_keys ( tenant_id VARCHAR(26) NOT NULL, key TEXT NOT NULL, request_hash TEXT NOT NULL, response_status INTEGER, response_body JSONB, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), expires_at TIMESTAMPTZ NOT NULL, PRIMARY KEY (tenant_id, key) ); CREATE TABLE IF NOT EXISTS staff_audit_log ( id VARCHAR(26) PRIMARY KEY, tenant_id VARCHAR(26) NOT NULL, actor_id VARCHAR(26) NOT NULL, action TEXT NOT NULL, entity_type TEXT NOT NULL, entity_id VARCHAR(26), old_values JSONB, new_values JSONB, correlation_id VARCHAR(26) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX staff_audit_tenant_time_idx ON staff_audit_log (tenant_id, created_at DESC); ALTER TABLE staff_outbox ENABLE ROW LEVEL SECURITY; ALTER TABLE staff_outbox FORCE ROW LEVEL SECURITY; CREATE POLICY staff_outbox_tenant_isolation ON staff_outbox USING (tenant_id = current_setting('app.tenant_id', true)) WITH CHECK (tenant_id = current_setting('app.tenant_id', true)); ALTER TABLE staff_inbox ENABLE ROW LEVEL SECURITY; ALTER TABLE staff_inbox FORCE ROW LEVEL SECURITY; CREATE POLICY staff_inbox_tenant_isolation ON staff_inbox USING (tenant_id = current_setting('app.tenant_id', true)) WITH CHECK (tenant_id = current_setting('app.tenant_id', true)); ALTER TABLE staff_idempotency_keys ENABLE ROW LEVEL SECURITY; ALTER TABLE staff_idempotency_keys FORCE ROW LEVEL SECURITY; CREATE POLICY staff_idempotency_tenant_isolation ON staff_idempotency_keys USING (tenant_id = current_setting('app.tenant_id', true)) WITH CHECK (tenant_id = current_setting('app.tenant_id', true)); ALTER TABLE staff_audit_log ENABLE ROW LEVEL SECURITY; ALTER TABLE staff_audit_log FORCE ROW LEVEL SECURITY; CREATE POLICY staff_audit_tenant_isolation ON staff_audit_log USING (tenant_id = current_setting('app.tenant_id', true)) WITH CHECK (tenant_id = current_setting('app.tenant_id', true));