191 lines
5.1 KiB
TypeScript
191 lines
5.1 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import { describe, it } from 'node:test'
|
|
import {
|
|
MP_CONTRACT_MANAGE_TABS,
|
|
MP_CONTRACT_APPROVE_TABS,
|
|
buildContractListQuery,
|
|
buildContractCard,
|
|
formatContractMoney,
|
|
formatContractProductInfoForCard
|
|
} from './mp-crm-contract-card'
|
|
|
|
describe('tabs', () => {
|
|
it('manage has no status tabs (Web align); approve submitted/approved', () => {
|
|
assert.deepEqual(
|
|
MP_CONTRACT_MANAGE_TABS.map((x) => x.value),
|
|
['all']
|
|
)
|
|
assert.deepEqual(
|
|
MP_CONTRACT_APPROVE_TABS.map((x) => x.value),
|
|
['submitted', 'approved']
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('buildContractListQuery', () => {
|
|
it('manage always excludes invalid and ignores view status', () => {
|
|
assert.deepEqual(
|
|
buildContractListQuery({
|
|
mode: 'manage',
|
|
view: 'all',
|
|
pageNum: 1,
|
|
pageSize: 20,
|
|
keyword: ' 合同 ',
|
|
currentUserId: 'u1',
|
|
contractType: 'sale',
|
|
signDateBegin: '2026-10-01',
|
|
signDateEnd: '2026-10-31',
|
|
minAmount: 100,
|
|
maxAmount: 200000
|
|
}),
|
|
{
|
|
pageNum: 1,
|
|
pageSize: 20,
|
|
includeProducts: true,
|
|
keyword: '合同',
|
|
excludeStatus: 'invalid',
|
|
contractType: 'sale',
|
|
signDateBegin: '2026-10-01',
|
|
signDateEnd: '2026-10-31',
|
|
minAmount: 100,
|
|
maxAmount: 200000
|
|
}
|
|
)
|
|
const approving = buildContractListQuery({
|
|
mode: 'manage',
|
|
view: 'approving',
|
|
pageNum: 1,
|
|
pageSize: 20,
|
|
keyword: '',
|
|
currentUserId: 'u1'
|
|
})
|
|
assert.equal(approving.excludeStatus, 'invalid')
|
|
assert.equal(approving.includeProducts, true)
|
|
assert.equal('status' in approving, false)
|
|
})
|
|
|
|
it('omits empty optional business filters', () => {
|
|
assert.deepEqual(
|
|
buildContractListQuery({
|
|
mode: 'manage',
|
|
view: 'all',
|
|
pageNum: 1,
|
|
pageSize: 20,
|
|
keyword: '',
|
|
currentUserId: 'u1',
|
|
contractType: '',
|
|
signDateBegin: '',
|
|
signDateEnd: '',
|
|
minAmount: undefined,
|
|
maxAmount: undefined
|
|
}),
|
|
{ pageNum: 1, pageSize: 20, includeProducts: true, excludeStatus: 'invalid' }
|
|
)
|
|
})
|
|
|
|
it('approve submitted uses pendingApprovalUserId', () => {
|
|
const q = buildContractListQuery({
|
|
mode: 'approve',
|
|
view: 'submitted',
|
|
pageNum: 1,
|
|
pageSize: 20,
|
|
keyword: '',
|
|
currentUserId: 'u9'
|
|
})
|
|
assert.equal(q.pendingApprovalUserId, 'u9')
|
|
assert.equal(q.includeProducts, true)
|
|
})
|
|
|
|
it('approve approved uses approvedByUserId', () => {
|
|
const q = buildContractListQuery({
|
|
mode: 'approve',
|
|
view: 'approved',
|
|
pageNum: 1,
|
|
pageSize: 20,
|
|
keyword: 'x',
|
|
currentUserId: 'u9'
|
|
})
|
|
assert.equal(q.approvedByUserId, 'u9')
|
|
assert.equal(q.keyword, 'x')
|
|
assert.equal(q.includeProducts, true)
|
|
})
|
|
})
|
|
|
|
describe('buildContractCard', () => {
|
|
it('maps Web default list fields into preview/extra', () => {
|
|
const card = buildContractCard(
|
|
{
|
|
id: 'c1',
|
|
contractNo: 'HT001',
|
|
contractName: '硫酸销售合同',
|
|
customerName: '甲公司',
|
|
contractType: 'sale',
|
|
amount: 1000,
|
|
freight: 50,
|
|
barrelDeposit: 20,
|
|
status: 'draft',
|
|
signDate: '2026-10-01',
|
|
createTime: '2026-10-01 10:00:00',
|
|
ownerUserName: '张三',
|
|
attachmentFiles: 'a,b',
|
|
products: [{ productName: '硫酸', model: '98%', quantity: 10, unit: '吨' }]
|
|
},
|
|
{
|
|
statusLabel: '草稿',
|
|
contractTypeLabel: '销售合同',
|
|
unitLabel: (u) => (u === '吨' ? '吨' : u)
|
|
}
|
|
)
|
|
assert.equal(card.id, 'c1')
|
|
assert.equal(card.contractTitle, '硫酸销售合同')
|
|
assert.equal(card.customerName, '甲公司')
|
|
assert.equal(card.amountText, '¥1,070.00')
|
|
assert.equal(card.status, 'draft')
|
|
assert.equal(card.metaLine.includes('HT001'), false)
|
|
assert.deepEqual(
|
|
card.previewFields.map((f) => f.key),
|
|
[
|
|
'contractName',
|
|
'contractType',
|
|
'attachmentFiles',
|
|
'productInfo',
|
|
'totalContractAmount',
|
|
'amount',
|
|
'freight',
|
|
'barrelDeposit',
|
|
'ownerUserName',
|
|
'createTime'
|
|
]
|
|
)
|
|
assert.deepEqual(
|
|
card.extraFields.map((f) => f.key),
|
|
['contractNo', 'signDate']
|
|
)
|
|
assert.equal(card.previewFields.find((f) => f.key === 'attachmentFiles')?.value, '2 个')
|
|
assert.equal(
|
|
card.previewFields.find((f) => f.key === 'productInfo')?.value,
|
|
'硫酸 98% 10 吨'
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('formatContractProductInfoForCard', () => {
|
|
it('joins lines with semicolon', () => {
|
|
assert.equal(
|
|
formatContractProductInfoForCard([
|
|
{ productName: 'A', quantity: 1, unit: '吨' },
|
|
{ productName: 'B', model: 'X', quantity: 2 }
|
|
]),
|
|
'A 1 吨;B X 2'
|
|
)
|
|
assert.equal(formatContractProductInfoForCard([]), '—')
|
|
})
|
|
})
|
|
|
|
describe('formatContractMoney', () => {
|
|
it('formats and handles empty', () => {
|
|
assert.equal(formatContractMoney(1000), '¥1,000.00')
|
|
assert.equal(formatContractMoney(undefined), '—')
|
|
})
|
|
})
|