fix: 制单备注补充报销用途(09-04-reimbursement-state-gap-finance-view)
这个提交包含在:
@@ -1,5 +1,18 @@
|
||||
# 报销状态空隙与财务处理视角:实施计划
|
||||
|
||||
## 2026-09-12 备注自解释增量
|
||||
|
||||
用户批准按“报销款+完整报销编号”修改、测试后部署,随后明确批准六文件提交推送、补齐当前版本本地配对备份和独立镜像;不删除旧制品、不异机传输、不操作真实付款。基于7bfc2546,只改生成器备注列并同步付款合同,不增加姓名、截断或未经银行核实的上限。
|
||||
|
||||
- [x] 新断言先在旧实现失败;修改后单测与真实BIFF8生成/读回及付款路由回归。
|
||||
- [x] 复核差异、语法及治理;已获提交推送授权,实际提交与发布结果另记本轮发布回执。
|
||||
- [ ] 刷新候选/生产版本/迁移/磁盘/备份/独立镜像预检;退路缺失先报告,不擅自补写或清理。
|
||||
- [ ] existing部署后核公网版本、资源、运行时代码摘要及生成逻辑;不操作真人单据或银行。
|
||||
|
||||
执行回执:旧代码15项中3项按预期失败;运行时修改一行后,使用既有BIFF8解释器,在server执行 `npm test -- tests/unit/services/paymentOrderXls.test.js tests/unit/documentSequence.service.test.js tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/services/paymentBatchReadiness.test.js`,121/121通过、退出0。生成实际BIFF8并读回,备注为“报销款 ”+完整编号,姓名只在收款人列,同人同账号两单仍独立。语法检查、Trellis治理、process-contract baseline及git diff --check通过;主会话复核确认仅一列映射变化,无权限/审批/迁移变化,不冒充独立review。
|
||||
|
||||
证据:artifacts/qa-layout/purpose-remark-red.log、purpose-remark-tests.log、purpose-remark-governance.log、purpose-remark-process.log。部署准备只读回读见purpose-remark-preconditions.json:当时生产7bfc2546,磁盘35.85GiB;最新自动备份完整性通过但对应1eeda7cd,既有回滚目录无当前7bfc2546镜像匹配项。用户随后明确授权补齐当前版本退路并提交推送,不重复索取同一授权;补齐后仍须绑定新候选、刷新正式门禁并保留银行导入/恢复覆盖限制。实际补齐、推送、部署与只读验收状态以artifacts/qa-layout/purpose-remark-release回执为准,不将准备完成写成部署完成。
|
||||
|
||||
## 2026-09-12 整体宽度修正
|
||||
|
||||
本地验证后用户明确同意复核并提交这六个文件、准备发布。本轮仅提交该增量,不推送、不部署;下文未提交状态为验证结束时的历史记录,实际提交标识以Git及本地发布准备回执为准。
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
## Goal
|
||||
|
||||
### 2026-09-12 最新备注方案(已批准修改、测试后部署)
|
||||
|
||||
用途保持“报销款”,备注改为“报销款 ”+完整报销编号,不加姓名。该方案是用户采纳的产品选择,不是国内系统调研结论,也不证明银行长度/导入接受性。一单一行、批次多单、快照及编号不变;不操作真实付款,不重写已下载文件。提交推送授权单独确认,部署按正式existing及新候选预检进行。
|
||||
|
||||
### 2026-09-12 整体宽度统一(已批准本地实施)
|
||||
|
||||
报销详情标题与正文、付款详情使用同一外层宽度和边距,移除报销正文独有的1280px居中限制。正文自适应、桌面侧栏320px及手机单列不变。复用当前任务;验收1280/1440/1920px两页整体左右边界及报销标题/正文边界,390px无横向溢出。只维护现有布局,不引入新视觉方案;不改权限或业务动作,提交、部署另批。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## 2026-09-11 已批准备注增量
|
||||
|
||||
最新确认仅修改buildPaymentOrderRows的备注列,使用已验证且已trim的entityCode,不再拼接姓名和用途。收款户名列的payeeName仍来自组批冻结的snapshot_json.payee.name;路由将归属人的收款信息冻结为payee,生成器不另查现职员工/提交人。每个batch item保持一行,即使姓名/收款账号相同也不合并;一个批次仍允许多张报销单。姓名或单号为空沿现有blockers整批拒绝。
|
||||
最新确认仅修改buildPaymentOrderRows的备注列,使用“报销款 ”与已验证且已trim的entityCode拼接,不再拼接姓名。收款户名列的payeeName仍来自组批冻结的snapshot_json.payee.name;路由将归属人的收款信息冻结为payee,生成器不另查现职员工/提交人。每个batch item保持一行,即使姓名/收款账号相同也不合并;一个批次仍允许多张报销单。姓名或单号为空沿现有blockers整批拒绝。
|
||||
|
||||
不改模板列宽/格式、不缩写或截断、不引入未经银行证明的长度阈值。测试使用合成姓名,逐列xlrd读回用途、备注及文字类型,并证明同名两单独立对应、旧序号不重排。BX/PB编号规则本轮不改;编号说明以PRD最新节为准,不将日期前缀误当每日重置的证据。
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
| 9 | 客户方流水号 | 批次号+行号,稳定、唯一并满足长度限制 |
|
||||
| 10 | 金额 | 已批准批次项金额,数值且两位小数 |
|
||||
| 11 | 用途 | 报销款,不复制工资/公积金用途 |
|
||||
| 12 | 备注 | 仅完整报销单号,不重复姓名或用途(09-11最新确认) |
|
||||
| 12 | 备注 | “报销款 ”+完整报销单号,不重复姓名(09-12最新确认) |
|
||||
| 13–15 | 短信标志/手机/附加信息 | 0、不通知,后两列空;不读样例手机号 |
|
||||
|
||||
用户三个 input 文档的表头完全一致,空白模板与内置模板相同,账号列为文本。检查原件只提取结构与摘要,原件不改、不重新保存、不复制真实行到测试夹具。工资及公积金样例仅用于确定文件格式,不暗中扩为新业务。
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
## Goal
|
||||
|
||||
### 2026-09-11 制单备注与编号解释(最新精简方案已批准,增量未部署)
|
||||
### 2026-09-12 制单备注与编号解释(自解释方案已批准,增量未部署)
|
||||
|
||||
- 最新确认覆盖此前姓名拼接方案:用途继续为“报销款”;每行备注仅该行完整报销编号,例如“BX-20260828-0014”。收款人姓名仍单独来自冻结快照,不在备注重复。增量实施与验证记录归当前09-04任务,不另建task。
|
||||
- 最新确认覆盖此前仅编号方案:用途继续为“报销款”;每行备注为“报销款 ”+完整报销编号,例如“报销款 BX-20260828-0014”。收款人姓名仍单独来自冻结快照,不在备注重复。这是产品选择,不冒充行业调研结论。增量实施与验证记录归当前09-04任务,不另建task。
|
||||
- 现有一单一行保持,不按收款人合并转账;同一批次同一收款人的多张单仍逐行对应完整编号。缺少姓名或单号继续整批拒绝,不猜测、不截断。
|
||||
- 保留BIFF8模板、15列、用途、金额、账号文本、客户流水号、排序、权限/复核/审计与下载行为;不修改历史文件、历史单号、计数器或生产配置,不新增迁移。
|
||||
- 编号只标识创建顺序,不表示此前单据已经报销/付款。BX当前生成器优先既有序列配置,回退resetPeriod=none;PB按日三位流水,从001起。不能把讨论中的“若按日则0001起”直接改成重置生产BX或将PB扩位;周期变化另行确认。本轮仅解释并保留现状,生产具体BX序列配置未查询。
|
||||
|
||||
@@ -156,7 +156,7 @@ function buildPaymentOrderRows(config, batch) {
|
||||
serial,
|
||||
Number(amount.toFixed(2)),
|
||||
"报销款",
|
||||
entityCode,
|
||||
`报销款 ${entityCode}`,
|
||||
"0",
|
||||
"",
|
||||
"",
|
||||
|
||||
@@ -43,7 +43,7 @@ function buildBatch(overrides = {}) {
|
||||
}
|
||||
|
||||
describe("payment order BIFF8 generator", () => {
|
||||
it("keeps document-only remarks and separate transfers for the same frozen payee account", () => {
|
||||
it("keeps reimbursement-purpose remarks and separate transfers for the same frozen payee account", () => {
|
||||
const batch = buildBatch();
|
||||
for (const item of batch.items) {
|
||||
item.snapshot_json.payee.name = " 合成收款人 ";
|
||||
@@ -53,8 +53,8 @@ describe("payment order BIFF8 generator", () => {
|
||||
}
|
||||
const result = buildPaymentOrderRows(config, batch);
|
||||
expect(result.rows.map((row) => row.slice(10, 12))).toEqual([
|
||||
["报销款", "BX-20260802-0001"],
|
||||
["报销款", "BX-20260802-0002"],
|
||||
["报销款", "报销款 BX-20260802-0001"],
|
||||
["报销款", "报销款 BX-20260802-0002"],
|
||||
]);
|
||||
expect(result.rows.map((row) => row[5])).toEqual(["合成收款人", "合成收款人"]);
|
||||
expect(result.rows[0][4]).toBe(result.rows[1][4]);
|
||||
@@ -72,7 +72,7 @@ describe("payment order BIFF8 generator", () => {
|
||||
batch.items[0].entity_code = ` ${code} `;
|
||||
const row = buildPaymentOrderRows(config, batch).rows[0];
|
||||
expect(row[5]).toBe(name);
|
||||
expect(row[11]).toBe(code);
|
||||
expect(row[11]).toBe(`报销款 ${code}`);
|
||||
});
|
||||
|
||||
it.each([
|
||||
@@ -126,10 +126,10 @@ describe("payment order BIFF8 generator", () => {
|
||||
expect(parsed.rows).toHaveLength(2);
|
||||
expect(parsed.rows[0]).toEqual([
|
||||
"1", payerAccount, "合成测试公司", "01", payeeAccount, "甲", "中国建设银行", "",
|
||||
"PB-20260802-002-R001", 1.2, "报销款", "BX-20260802-0001", "0", "", "",
|
||||
"PB-20260802-002-R001", 1.2, "报销款", "报销款 BX-20260802-0001", "0", "", "",
|
||||
]);
|
||||
expect(parsed.rows[1][9]).toBe(2);
|
||||
expect(parsed.rows[1].slice(10, 12)).toEqual(["报销款", "BX-20260802-0002"]);
|
||||
expect(parsed.rows[1].slice(10, 12)).toEqual(["报销款", "报销款 BX-20260802-0002"]);
|
||||
});
|
||||
|
||||
it("fails the whole export and reports every blocking payee issue", () => {
|
||||
|
||||
在新工单中引用
屏蔽一个用户