fix(finance): 历史归档订单退款跳过期间校验
归档订单退款不进入财务口径,不应被历史月份/退款月份的关账状态阻断; 非归档订单退款仍严格校验期间。
This commit is contained in:
@@ -143,8 +143,16 @@ export async function createManualRefund(
|
||||
errorCode: 'order_refund_order_not_found',
|
||||
})
|
||||
}
|
||||
await assertBasisPeriodOpen(client, order.basis_at, '退款')
|
||||
await assertRefundMonthOpen(client, '退款', toChinaDate(refundedAt || now))
|
||||
const activeItems = await client.query<{ total: number }>(
|
||||
`SELECT COUNT(*)::int AS total FROM order_items
|
||||
WHERE order_id = $1 AND fulfillment_status <> 'archived'`,
|
||||
[orderId],
|
||||
)
|
||||
if (Number(activeItems.rows[0]?.total || 0) > 0) {
|
||||
// 只有断代后订单才影响财务;历史归档订单退款不校验期间。
|
||||
await assertBasisPeriodOpen(client, order.basis_at, '退款')
|
||||
await assertRefundMonthOpen(client, '退款', toChinaDate(refundedAt || now))
|
||||
}
|
||||
|
||||
const itemsResult = await client.query<{
|
||||
id: number
|
||||
@@ -398,8 +406,15 @@ export async function voidOrderRefund(
|
||||
errorCode: 'order_refund_already_voided',
|
||||
})
|
||||
}
|
||||
await assertBasisPeriodOpen(client, row.basis_at, '撤销退款')
|
||||
await assertRefundMonthOpen(client, '撤销退款')
|
||||
const activeItems = await client.query<{ total: number }>(
|
||||
`SELECT COUNT(*)::int AS total FROM order_items
|
||||
WHERE order_id = $1 AND fulfillment_status <> 'archived'`,
|
||||
[row.order_id],
|
||||
)
|
||||
if (Number(activeItems.rows[0]?.total || 0) > 0) {
|
||||
await assertBasisPeriodOpen(client, row.basis_at, '撤销退款')
|
||||
await assertRefundMonthOpen(client, '撤销退款')
|
||||
}
|
||||
await client.query(
|
||||
`
|
||||
UPDATE order_refunds
|
||||
@@ -666,8 +681,8 @@ export async function approveAndRecordKuaishouRefund(
|
||||
})
|
||||
}
|
||||
|
||||
const existingItem = await query<{ id: number }>(
|
||||
`SELECT id FROM order_items WHERE id = $1 AND order_id = $2 LIMIT 1`,
|
||||
const existingItem = await query<{ id: number; fulfillment_status: string }>(
|
||||
`SELECT id, fulfillment_status FROM order_items WHERE id = $1 AND order_id = $2 LIMIT 1`,
|
||||
[orderItemId, orderId],
|
||||
)
|
||||
if (!existingItem.rows[0]) {
|
||||
@@ -682,7 +697,8 @@ export async function approveAndRecordKuaishouRefund(
|
||||
`SELECT COALESCE(paid_at, created_at) AS basis_at FROM orders WHERE id = $1 LIMIT 1`,
|
||||
[orderId],
|
||||
)
|
||||
if (basis.rows[0]?.basis_at) {
|
||||
const platformItemArchived = existingItem.rows[0]?.fulfillment_status === 'archived'
|
||||
if (!platformItemArchived && basis.rows[0]?.basis_at) {
|
||||
const basisDate = toChinaDate(String(basis.rows[0].basis_at))
|
||||
const periodKey = basisDate.slice(0, 7)
|
||||
const period = await query<{ status: string }>(
|
||||
@@ -697,12 +713,14 @@ export async function approveAndRecordKuaishouRefund(
|
||||
}
|
||||
}
|
||||
|
||||
// 退款当天所属期间也必须开着,否则退款冲减会静默丢失。
|
||||
// 退款当天所属期间也必须开着,否则退款冲减会静默丢失(历史归档订单除外)。
|
||||
const refundPeriodKey = CHINA_DATE_FORMATTER.format(new Date()).slice(0, 7)
|
||||
const refundPeriod = await query<{ status: string }>(
|
||||
`SELECT status FROM finance_periods WHERE period_key = $1 LIMIT 1`,
|
||||
[refundPeriodKey],
|
||||
)
|
||||
const refundPeriod = platformItemArchived
|
||||
? { rows: [] as Array<{ status: string }> }
|
||||
: await query<{ status: string }>(
|
||||
`SELECT status FROM finance_periods WHERE period_key = $1 LIMIT 1`,
|
||||
[refundPeriodKey],
|
||||
)
|
||||
if (refundPeriod.rows[0]?.status === 'closed') {
|
||||
throw createHttpError(`退款所属期间 ${refundPeriodKey} 已关账,请先反关账后再退款`, {
|
||||
statusCode: 409,
|
||||
|
||||
Reference in New Issue
Block a user