From dea83b892f85ebe4f86fddef9b7970ee963f25e5 Mon Sep 17 00:00:00 2001 From: shunli Date: Tue, 28 Apr 2026 19:39:34 +0800 Subject: [PATCH] =?UTF-8?q?R72-A1=20=E5=BB=BA=E6=A1=A3=E6=8A=A5=E9=94=80?= =?UTF-8?q?=E6=92=A4=E5=9B=9E=E9=87=8A=E6=94=BE=E5=8F=91=E7=A5=A8=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=90=88=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...8_19-34-41-r72-reimbursement-withdraw-invoice-release.csv | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv diff --git a/issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv b/issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv new file mode 100644 index 00000000..d086a8d8 --- /dev/null +++ b/issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv @@ -0,0 +1,5 @@ +"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes" +"A1","R72 执行合同建档与范围冻结","创建并校验 R72 合同,仅承接“报销撤回后释放已绑定发票回票池”这一条闭环修复,并补对应后端回归;不承接 OCR 提取、重复发票查重、票池工作台增强、Prisma 迁移或审批流重构。","issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv 列完整且通过校验;A2-A4 依赖顺序清晰;Notes 明确本轮无 schema 变更且只做最小状态释放。","命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv。检查:12 列完整、Dependencies 为 JSON 数组字符串、Files 为实际路径或哨兵值。","manual","DONE","DONE","DONE","issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv","[]","回滚路径:删除本 CSV;不影响业务运行。2026-04-28:合同已写入并通过 validate_issues_csv.py 校验。" +"A2","报销撤回时释放已绑定发票并补后端回归","在 server 侧保持现有“仅 reviewing 可撤回、仅申请人/提交人可撤回、审批人已处理后不可撤回”规则不变;当报销从 reviewing 撤回到 draft 时,自动把 linked_reimbursement_id 命中的 bound 发票恢复为 available,并清空 linked_reimbursement_id / linked_item_id;补 focused route test 覆盖 submit 后撤回再重绑的核心闭环。","POST /api/reimbursements/:id/withdraw 成功后,关联 bound 发票状态回到 available,linked_reimbursement_id 与 linked_item_id 归空;原有 withdraw 拒绝条件不回归;同一张发票可再次用于该报销或其他草稿报销绑定;不新增数据库字段,不改变提交前必须绑定发票规则。","命令:cd server && npm run prisma:validate && node --check src/routes/reimbursements.js && npm test -- tests/unit/routes/reimbursements.withdraw.test.js。业务:员工已有 reviewing 报销且已绑定发票 -> 撤回 -> 发票回到票池可绑定 -> 再次绑定同张发票成功。","manual","DOING","TODO","TODO","server/src/routes/reimbursements.js|server/tests/unit/routes/reimbursements.withdraw.test.js","[""A1""]","涉及报销状态流与票据绑定关系,回滚路径:撤回 withdraw 中的 invoicePool.updateMany 释放逻辑及新增测试;无 schema 迁移。" +"A3","撤回释放闭环 reviewer 复核","对 A2 做独立行为复核,确认修复只影响撤回成功路径,不放宽 withdraw 权限、不绕过审批已处理阻断,也不误释放其他报销单绑定的发票。","review 结论覆盖:withdraw 权限边界、reviewing->draft 状态转换、invoice_pool 释放 where 条件是否只命中当前报销、失败路径下发票状态是否保持原状、与 delete 释放逻辑是否一致。","人工 review:对照 server/src/routes/reimbursements.js 中 delete/withdraw 两段释放逻辑与新增测试断言,输出 reviewer 结论;若发现跨报销误释放、失败路径提前释放或权限回归,则 A4 前必须先修复。","manual","TODO","TODO","TODO","server/src/routes/reimbursements.js|server/tests/unit/routes/reimbursements.withdraw.test.js","[""A2""]","本 Issue 只输出 review 结论,不新增业务需求。" +"A4","R72 定向回归与状态回填","执行 R72 定向自动化回归,并把本轮开发、review、regression 状态回填到 Issue CSV;确认该修复不影响既有报销详情与发票绑定能力。","A2/A3 测试与复核通过后,本 CSV 状态回填完整;withdraw 释放闭环通过;既有 invoice upload/bind 与 reimbursement detail 相关测试不回归。","命令:cd server && npm run prisma:validate && node --check src/routes/reimbursements.js && npm test -- tests/unit/routes/reimbursements.withdraw.test.js tests/unit/routes/reimbursements.detail.test.js tests/unit/routes/invoicePool.travel-bind.test.js。业务:撤回释放后,同张发票重新出现在可绑定集合,不影响已存在详情展示字段。","manual","TODO","TODO","TODO","issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv|server/tests/unit/routes/reimbursements.withdraw.test.js|server/tests/unit/routes/reimbursements.detail.test.js|server/tests/unit/routes/invoicePool.travel-bind.test.js","[""A2"",""A3""]","已知不在本轮范围:client build chunk warnings、OCR 可信度分层、重复发票查重。"