27 lines
2.0 KiB
TypeScript
27 lines
2.0 KiB
TypeScript
import {it,expect} from 'vitest'
|
|
import {importGroupTree,printPreviewRows,summarizeReceiptGroups} from '../src/shared/receipt-groups'
|
|
import type {ImportRow} from '../src/shared/types'
|
|
function row(index:number,school='甲学校',errors:string[]=[]):ImportRow{
|
|
return {index,excelRow:index+2,errors,warnings:[],receipt:{date:'2026-10-19',school,grade:'高一',studentName:'学生'+index,customer:school+' 高一 学生'+index,item:'服务费',amountCents:(index+1)*100,cashier:'',reviewer:''}}
|
|
}
|
|
it('非连续行合并为同组,分组金额与勾选同步,错误行始终不计入可生成数据',()=>{
|
|
const rows=[row(0),row(1,'乙学校'),row(2),row(3,'甲学校',['日期无效'])],before=JSON.stringify(rows)
|
|
const [schoolA,schoolB]=importGroupTree(rows,new Set([2,3]))
|
|
expect(schoolA).toMatchObject({label:'甲学校',indices:[0,2],selectedCount:1,totalCents:400,selectedCents:300,invalidCount:1})
|
|
expect(schoolA.children[0].children[0]).toMatchObject({label:'服务费',indices:[0,2],selectedCount:1,invalidCount:1})
|
|
expect(schoolB).toMatchObject({label:'乙学校',indices:[1],selectedCount:0,totalCents:200,selectedCents:0})
|
|
expect(JSON.stringify(rows)).toBe(before)
|
|
expect(summarizeReceiptGroups(rows.filter(row=>!row.errors.length).map(row=>row.receipt))).toEqual([
|
|
{school:'甲学校',grade:'高一',item:'服务费',count:2,totalCents:400},
|
|
{school:'乙学校',grade:'高一',item:'服务费',count:1,totalCents:200}
|
|
])
|
|
})
|
|
it('A4 预览只显示所选同组收据,定位到所在页,最后一页不会混入其他学校',()=>{
|
|
const rows=[row(0),row(1,'乙学校'),row(2),row(3,'甲学校',['金额无效']),row(4)]
|
|
expect(printPreviewRows(rows,new Set([0,1,2,3,4]),2,2).map(row=>row.index)).toEqual([0,2])
|
|
expect(printPreviewRows(rows,new Set([0,1,2,4]),4,2).map(row=>row.index)).toEqual([4])
|
|
expect(printPreviewRows(rows,new Set([1,2,4]),2,2).map(row=>row.index)).toEqual([2,4])
|
|
expect(printPreviewRows(rows,new Set([1,2,4]),4,1).map(row=>row.index)).toEqual([4])
|
|
expect(printPreviewRows(rows,new Set(),0,2)).toEqual([])
|
|
})
|