bmc_hub/migrations/1062_workflow_engine.sql

59 lines
4.0 KiB
MySQL
Raw Normal View History

-- Additive workflow storage. No historical time or financial data is modified.
ALTER TABLE customer_fixed_price_agreements ADD COLUMN IF NOT EXISTS workflow_coverage JSONB NOT NULL DEFAULT '{}';
ALTER TABLE customer_fixed_price_agreements ADD COLUMN IF NOT EXISTS monthly_price NUMERIC(12,2);
ALTER TABLE tticket_prepaid_cards ADD COLUMN IF NOT EXISTS workflow_coverage JSONB NOT NULL DEFAULT '{}';
CREATE TABLE IF NOT EXISTS bmc_workflow_resource_history (
id BIGSERIAL PRIMARY KEY,resource_type TEXT NOT NULL,resource_id BIGINT NOT NULL,
created_by TEXT,before_value JSONB NOT NULL,after_value JSONB NOT NULL,created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS bmc_workflows (
id BIGSERIAL PRIMARY KEY, name TEXT NOT NULL, customer_id TEXT,
priority INTEGER NOT NULL DEFAULT 100, enabled BOOLEAN NOT NULL DEFAULT FALSE,
active_version_id BIGINT, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS bmc_workflow_versions (
id BIGSERIAL PRIMARY KEY, workflow_id BIGINT NOT NULL REFERENCES bmc_workflows(id),
version INTEGER NOT NULL, definition JSONB NOT NULL, created_by TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(workflow_id,version)
);
DO $$ BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname='bmc_workflows_active_version_fk') THEN
ALTER TABLE bmc_workflows ADD CONSTRAINT bmc_workflows_active_version_fk FOREIGN KEY(active_version_id) REFERENCES bmc_workflow_versions(id);
END IF;
END $$;
CREATE TABLE IF NOT EXISTS bmc_workflow_events (
id TEXT PRIMARY KEY, event_key TEXT NOT NULL UNIQUE, trigger TEXT NOT NULL,
entity_type TEXT NOT NULL, entity_id TEXT NOT NULL, revision BIGINT NOT NULL DEFAULT 0,
context JSONB NOT NULL DEFAULT '{}', chain JSONB NOT NULL DEFAULT '[]',
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','processing','done','failed','superseded')),
attempts INTEGER NOT NULL DEFAULT 0, available_at TIMESTAMPTZ NOT NULL DEFAULT now(),
error TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS bmc_workflow_pending ON bmc_workflow_events(available_at) WHERE status='pending';
CREATE TABLE IF NOT EXISTS bmc_workflow_executions (
id BIGSERIAL PRIMARY KEY,event_id TEXT NOT NULL REFERENCES bmc_workflow_events(id),
mode TEXT NOT NULL CHECK(mode IN ('shadow','active')),result JSONB NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(event_id,mode)
);
CREATE TABLE IF NOT EXISTS bmc_billing_decisions (
id BIGSERIAL PRIMARY KEY,time_id BIGINT NOT NULL REFERENCES tmodule_times(id),revision BIGINT NOT NULL,
event_id TEXT REFERENCES bmc_workflow_events(id),status TEXT NOT NULL CHECK(status IN ('decided','manual_review','overridden','settled')),
method TEXT,details JSONB NOT NULL DEFAULT '{}',is_current BOOLEAN NOT NULL DEFAULT TRUE,
manual_override BOOLEAN NOT NULL DEFAULT FALSE,created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE UNIQUE INDEX IF NOT EXISTS bmc_billing_current ON bmc_billing_decisions(time_id) WHERE is_current;
CREATE TABLE IF NOT EXISTS bmc_workflow_effects (
id BIGSERIAL PRIMARY KEY,event_id TEXT NOT NULL REFERENCES bmc_workflow_events(id),action_key TEXT NOT NULL UNIQUE,
status TEXT NOT NULL DEFAULT 'planned',payload JSONB NOT NULL,result JSONB,created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS bmc_workflow_activation_history (
id BIGSERIAL PRIMARY KEY,workflow_id BIGINT NOT NULL REFERENCES bmc_workflows(id),
version_id BIGINT REFERENCES bmc_workflow_versions(id),previous_version_id BIGINT REFERENCES bmc_workflow_versions(id),
created_by TEXT,created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE OR REPLACE FUNCTION bmc_workflow_version_immutable() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN RAISE EXCEPTION 'Workflow versions are immutable; create a new version'; END $$;
DROP TRIGGER IF EXISTS bmc_workflow_version_immutable_trigger ON bmc_workflow_versions;
CREATE TRIGGER bmc_workflow_version_immutable_trigger BEFORE UPDATE OR DELETE ON bmc_workflow_versions
FOR EACH ROW EXECUTE FUNCTION bmc_workflow_version_immutable();