This commit is contained in:
2026-08-12 17:45:45 +08:00
parent b3b8d94957
commit 8e8e123d23
15 changed files with 410 additions and 26 deletions
@@ -140,16 +140,12 @@ async function createAp(context, fixture, source, role) {
return value
}
async function findPayableBySource(context, feeSourceId) {
const listResponse = await context.request('GET', `${BASE}/payable-settlements?customerId=10001&page=1&pageSize=200`)
for (const item of rows(data(listResponse))) {
const detailResponse = await context.request('GET', `${BASE}/settlements/${settlementId(item)}`)
const value = data(detailResponse)
if (value?.direction === 'PAYABLE' && value?.lines?.some((line) => id(line.feeSourceId) === id(feeSourceId))) {
return { response: detailResponse, value }
}
}
return { response: listResponse, value: null }
async function recoverPayable(context, settlement, feeSourceId) {
if (!settlementId(settlement)) return null
const response = await context.request('GET', `${BASE}/settlements/${settlementId(settlement)}`)
const value = data(response)
return value?.direction === 'PAYABLE' && value?.lines?.some((line) => id(line.feeSourceId) === id(feeSourceId))
? { response, value } : null
}
function verifySettlementState(context, direction, role, response, value, expectedStatus) {
@@ -183,6 +179,13 @@ async function recoverExistingDemo(context, reportPath) {
const payableIds = ['307', '310']
const roles = ['apUnpaid', 'apPartial']
matrix.payableSettlements ??= {}
if (!settlementId(matrix.payableSettlements.apUnpaid)) {
matrix.payableSettlements.apUnpaid = { settlementId: process.env.FINANCE_DEMO_AP_UNPAID_ID }
}
if (!settlementId(matrix.payableSettlements.apPartial)) {
matrix.payableSettlements.apPartial = { settlementId: process.env.FINANCE_DEMO_AP_PARTIAL_ID }
}
for (let index = 0; index < roles.length; index += 1) {
const role = roles[index]
const detail = await sourceDetail(context, payableIds[index])
@@ -204,7 +207,8 @@ async function recoverExistingDemo(context, reportPath) {
continue
}
const approved = await approveAndInclude(context, { feeSourceId: payableIds[index] }, role)
const existing = approved?.statementGenerated === true ? await findPayableBySource(context, payableIds[index]) : null
const existing = approved?.statementGenerated === true
? await recoverPayable(context, matrix.payableSettlements[role], payableIds[index]) : null
const recoverySupplierId = role === 'apPartial'
? id(matrix.payableSettlements?.apPaid?.supplierId)
: id(fixture.supplier?.supplierId)
@@ -215,10 +219,10 @@ async function recoverExistingDemo(context, reportPath) {
`settlementId=${settlementId(existing.value)}, feeSourceId=${payableIds[index]}`)
if (!settlementId(settlement)) continue
if (role === 'apUnpaid') matrix.payableSettlements[role] = settlement
else {
else if (Number(settlement.paidAmount ?? 0) === 0) {
const amount = Math.max(0.01, Math.floor(outstanding(settlement) * 50) / 100)
matrix.payableSettlements[role] = (await pay(context, fixture, settlement, amount, role)).value
}
} else matrix.payableSettlements[role] = settlement
verifySettlementState(context, 'PAYABLE', role, detail.response, matrix.payableSettlements[role],
role === 'apUnpaid' ? 'UNPAID' : 'PARTIALLY_PAID')
}