文件
hyb-oa/server/prisma/migrations/20260918160000_business_numbering/migration.sql
T
wangsli 1f8d5b658a 完善借款、编号、付款与预算并发及验收(09-06-release-gate-integrity)
汇总已落盘的借款本金与还款、兼容历史编号的周期化编号、付款责任与回单核验、报销进度和排序、PWA/采购事务、错误原因与日期校验及ERP退役。
统一共享预算池锁序和锁后判断,恢复差旅原预算选择,补原因码固定夹具及反向完整性检查。
纳入配套迁移、测试、受管QA、分层验收合同、规约及任务记录;原始证据留在ignored artifacts。

关联任务:09-17-company-loan-principal-repayment、09-17-erp-exclusive-retirement、09-18-reimbursement-periodic-numbering、09-08-reimbursement-payment-closeout、09-18-local-concurrency-product-fixes、09-19-budget-pool-concurrency、09-05-error-explainability-payment-readiness。
预算补审由Claude定向验证2文件928项通过,原4446/28及r6结果仍仅对应各自历史输入;本轮未重跑测试。
完整新候选门禁、R1真实入口接入与12项公网义务仍开放。生产编号未启用、差旅仍冻结;不推送、不部署,不宣称发布资格。
2026-09-19 13:11:04 +08:00

52 行
2.4 KiB
PL/PgSQL

-- 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();