-- Additive only: existing identifiers and both old counters and drafts stay intact. CREATE TABLE "business_number_policies" ( "version" INTEGER PRIMARY KEY CHECK ("version" = 2), "effective_at" TIMESTAMP(3) NOT NULL, "enabled" BOOLEAN NOT NULL DEFAULT false, "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_by" UUID NOT NULL, "reference" TEXT NOT NULL ); CREATE TABLE "business_number_counters" ( "key" TEXT PRIMARY KEY, "current_number" BIGINT NOT NULL DEFAULT 0 CHECK ("current_number" >= 0), "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE "purchase_requests" ADD COLUMN "numbering_version" INTEGER NOT NULL DEFAULT 1 CHECK ("numbering_version" IN (1, 2)); -- No INSERT into policy; activation is a separate, explicitly authorized operation. -- Keep the original eligibility and issued high-water durable across rollback or -- accidental administrative resets. A pause changes only policy.enabled. CREATE FUNCTION guard_business_numbering_history() RETURNS trigger AS $$ BEGIN IF TG_OP = 'DELETE' THEN RAISE EXCEPTION 'business numbering history cannot be deleted' USING ERRCODE = '23514'; END IF; IF TG_TABLE_NAME = 'business_number_policies' THEN IF NEW.version <> OLD.version OR NEW.effective_at <> OLD.effective_at THEN RAISE EXCEPTION 'business numbering activation is immutable' USING ERRCODE = '23514'; END IF; ELSIF TG_TABLE_NAME = 'business_number_counters' THEN IF NEW.key <> OLD.key OR NEW.current_number < OLD.current_number THEN RAISE EXCEPTION 'business numbering high-water cannot decrease' USING ERRCODE = '23514'; END IF; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER business_number_policy_history BEFORE UPDATE OR DELETE ON business_number_policies FOR EACH ROW EXECUTE FUNCTION guard_business_numbering_history(); CREATE TRIGGER business_number_counter_history BEFORE UPDATE OR DELETE ON business_number_counters FOR EACH ROW EXECUTE FUNCTION guard_business_numbering_history(); CREATE FUNCTION guard_purchase_numbering_version() RETURNS trigger AS $$ BEGIN IF NEW.numbering_version <> OLD.numbering_version THEN RAISE EXCEPTION 'purchase numbering eligibility is immutable' USING ERRCODE = '23514'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER purchase_numbering_version BEFORE UPDATE OF numbering_version ON purchase_requests FOR EACH ROW EXECUTE FUNCTION guard_purchase_numbering_version();