"use strict"; const path = require("path"); const assert = require("assert"); const ui = require(path.join(__dirname, "..", "web", "app.js")); assert.strictEqual(ui.fmtAbsMoney(-1280), "1,280.00"); assert.strictEqual(ui.fmtAbsMoney(1280), "1,280.00"); assert.strictEqual(ui.fmtAbsMoney("60.5"), "60.50"); assert.strictEqual(ui.eventIsNegative({ posting_kind: "reversal" }), true); assert.strictEqual(ui.eventIsNegative({ posting_kind: "normal", is_repayment: true }), true); assert.strictEqual(ui.eventIsNegative({ posting_kind: "normal", is_repayment: false }), false); assert.strictEqual(ui.cycleTab(0, 4, false), 1); assert.strictEqual(ui.cycleTab(3, 4, false), 0); assert.strictEqual(ui.cycleTab(0, 4, true), 3); assert.strictEqual(ui.cycleTab(2, 5, true), 1); assert.strictEqual(ui.cycleTab(0, 0, false), 0); assert.strictEqual(ui.drawerEscAction(1), "close"); assert.strictEqual(ui.drawerEscAction(0), "close"); assert.strictEqual(ui.drawerEscAction(2), "back"); assert.strictEqual(ui.drawerEscAction(3), "back"); const abs = ui.amountWithCurrency(1280, "CNY"); assert.ok(abs.includes("CNY")); assert.ok(abs.includes("1,280.00")); assert.ok(!abs.includes("+")); assert.ok(!abs.includes("−")); const repay = ui.amountWithCurrency(3200000, "CNY", { signed: true, negative: true }); assert.ok(repay.includes("−")); assert.ok(!repay.includes("+")); assert.ok(repay.includes("3,200,000.00")); assert.strictEqual(ui.resultDirection(10).label, "应收"); assert.strictEqual(ui.resultDirection(-10).label, "应付"); assert.strictEqual(ui.resultDirection(0).label, "持平"); assert.strictEqual(ui.isCompactAmount(1280), false); assert.strictEqual(ui.isCompactAmount(999999999), false); assert.strictEqual(ui.isCompactAmount(1000000000), true); assert.strictEqual(ui.isCompactAmount("123456789012345"), true); assert.ok(ui.amountWithCurrency("123456789012345", "CNY").includes("is-compact")); assert.ok(!ui.amountWithCurrency(1280, "CNY").includes("is-compact")); assert.strictEqual(ui.cashDirectionLabel("outgoing"), "转出"); assert.strictEqual(ui.cashDirectionLabel("incoming"), "转入"); assert.strictEqual(ui.relatedFlowLabel(null), "无关联流水"); assert.strictEqual(ui.relatedFlowLabel(""), "无关联流水"); assert.strictEqual(ui.relatedFlowLabel("42"), "42"); const subjectFields = ui.auditEvidenceFields("subject-review", { direction: "outgoing", effectiveAt: "2026-07-18T09:00:00", amount: "600", currency: "CNY", summary: "资金调拨", }); assert.deepStrictEqual(subjectFields.map((item) => item[0]), ["方向", "日期", "金额", "摘要"]); assert.strictEqual(subjectFields[0][1], "转出"); const manualFields = ui.auditEvidenceFields("manual-review", { counterpartyName: "乙公司", direction: "incoming", relatedSourceRowId: "", submittedBy: "出纳甲", attachmentName: "", amount: "80", currency: "CNY", summary: "补记", }); assert.deepStrictEqual( manualFields.map((item) => item[0]), ["对方公司名", "方向", "关联流水号", "提交人", "附件", "摘要", "金额"], ); assert.strictEqual(manualFields[0][1], "乙公司"); assert.strictEqual(manualFields[1][1], "转入"); assert.strictEqual(manualFields[2][1], "无关联流水"); assert.ok(ui.accountCell({ visibility: "visible", label: "中信 5316" }).includes("中信 5316")); assert.ok(ui.accountCell({ visibility: "masked" }).includes("按对方授权不可见")); assert.ok(ui.accountCell({ visibility: "missing" }).includes("源行缺失")); console.log("b44_ui_check ok");