91 lines
3.0 KiB
JavaScript
91 lines
3.0 KiB
JavaScript
|
|
import assert from 'node:assert/strict'
|
||
|
|
import test from 'node:test'
|
||
|
|
|
||
|
|
import { mapExpenseClaimToRequest } from '../src/composables/useRequests.js'
|
||
|
|
|
||
|
|
test('progress steps show approval operator time and current stay duration', () => {
|
||
|
|
const originalNow = Date.now
|
||
|
|
Date.now = () => new Date('2026-05-20T05:00:00.000Z').getTime()
|
||
|
|
|
||
|
|
try {
|
||
|
|
const request = mapExpenseClaimToRequest({
|
||
|
|
id: 'claim-1',
|
||
|
|
claim_no: 'EXP-202605-001',
|
||
|
|
employee_name: '张三',
|
||
|
|
department_name: '市场部',
|
||
|
|
expense_type: 'transport',
|
||
|
|
reason: '交通报销',
|
||
|
|
location: '上海',
|
||
|
|
amount: 88,
|
||
|
|
invoice_count: 1,
|
||
|
|
occurred_at: '2026-05-20T01:00:00.000Z',
|
||
|
|
submitted_at: '2026-05-20T02:00:00.000Z',
|
||
|
|
created_at: '2026-05-20T01:30:00.000Z',
|
||
|
|
updated_at: '2026-05-20T03:30:00.000Z',
|
||
|
|
status: 'submitted',
|
||
|
|
approval_stage: '财务审批',
|
||
|
|
risk_flags_json: [
|
||
|
|
{
|
||
|
|
source: 'manual_approval',
|
||
|
|
operator: '李经理',
|
||
|
|
previous_approval_stage: '直属领导审批',
|
||
|
|
next_approval_stage: '财务审批',
|
||
|
|
created_at: '2026-05-20T03:30:00.000Z'
|
||
|
|
}
|
||
|
|
],
|
||
|
|
items: []
|
||
|
|
})
|
||
|
|
|
||
|
|
const leaderStep = request.progressSteps.find((step) => step.label === '直属领导审批')
|
||
|
|
const financeStep = request.progressSteps.find((step) => step.label === '财务审批')
|
||
|
|
const aiStep = request.progressSteps.find((step) => step.label === 'AI预审')
|
||
|
|
|
||
|
|
assert.equal(leaderStep.time, '李经理通过')
|
||
|
|
assert.match(leaderStep.detail, /2026-05-20/)
|
||
|
|
assert.match(leaderStep.title, /李经理审批通过/)
|
||
|
|
assert.equal(aiStep.time, 'AI预审通过')
|
||
|
|
assert.match(aiStep.detail, /2026-05-20/)
|
||
|
|
assert.equal(financeStep.current, true)
|
||
|
|
assert.equal(financeStep.time, '停留 1小时30分钟')
|
||
|
|
} finally {
|
||
|
|
Date.now = originalNow
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
test('current direct manager step shows how long the claim has stayed there', () => {
|
||
|
|
const originalNow = Date.now
|
||
|
|
Date.now = () => new Date('2026-05-20T05:15:00.000Z').getTime()
|
||
|
|
|
||
|
|
try {
|
||
|
|
const request = mapExpenseClaimToRequest({
|
||
|
|
id: 'claim-2',
|
||
|
|
claim_no: 'EXP-202605-002',
|
||
|
|
employee_name: '王五',
|
||
|
|
department_name: '市场部',
|
||
|
|
expense_type: 'office',
|
||
|
|
reason: '办公用品',
|
||
|
|
location: '上海',
|
||
|
|
amount: 128,
|
||
|
|
invoice_count: 1,
|
||
|
|
occurred_at: '2026-05-20T01:00:00.000Z',
|
||
|
|
submitted_at: '2026-05-20T02:00:00.000Z',
|
||
|
|
created_at: '2026-05-20T01:30:00.000Z',
|
||
|
|
updated_at: '2026-05-20T02:00:00.000Z',
|
||
|
|
status: 'submitted',
|
||
|
|
approval_stage: '直属领导审批',
|
||
|
|
risk_flags_json: [],
|
||
|
|
items: []
|
||
|
|
})
|
||
|
|
|
||
|
|
const leaderStep = request.progressSteps.find((step) => step.label === '直属领导审批')
|
||
|
|
const submitStep = request.progressSteps.find((step) => step.label === '待提交')
|
||
|
|
|
||
|
|
assert.equal(submitStep.time, '王五提交')
|
||
|
|
assert.match(submitStep.detail, /2026-05-20/)
|
||
|
|
assert.equal(leaderStep.current, true)
|
||
|
|
assert.equal(leaderStep.time, '停留 3小时15分钟')
|
||
|
|
} finally {
|
||
|
|
Date.now = originalNow
|
||
|
|
}
|
||
|
|
})
|