取消报销资产事前批准强制(08-30-reimbursement-assets-prior-approval-correction)

这个提交包含在:
2026-08-30 12:44:58 +08:00
父节点 0f9f40389e
当前提交 36c86f1dca
共修改 17 个文件,包含 489 行新增和 130 行删除
+2 -40
查看文件
@@ -3667,15 +3667,6 @@ async function reimbursementRoutes(fastify) {
details: { expenseTypeId: "invalid_or_disabled" },
});
}
if (expenseType.category === "assets" && !body.assetPriorApprovalBasis?.trim()) {
throw new AppError({
code: "VALID_001",
message: "参数校验失败",
statusCode: 400,
details: { assetPriorApprovalBasis: "required_for_assets" },
});
}
const created = await tx.reimbursementItem.create({
data: {
reimbursement_id: reimbursementId,
@@ -3684,7 +3675,7 @@ async function reimbursementRoutes(fastify) {
amount: body.amount,
description: body.description,
asset_prior_approval_basis:
expenseType.category === "assets" ? body.assetPriorApprovalBasis.trim() : null,
expenseType.category === "assets" ? body.assetPriorApprovalBasis?.trim() || null : null,
created_by: request.employee.id,
updated_by: request.employee.id,
},
@@ -3827,15 +3818,6 @@ async function reimbursementRoutes(fastify) {
parsedBody.data.assetPriorApprovalBasis === undefined
? item.asset_prior_approval_basis
: parsedBody.data.assetPriorApprovalBasis;
if (expenseType.category === "assets" && !(targetApprovalBasis ?? "").trim()) {
throw new AppError({
code: "VALID_001",
message: "参数校验失败",
statusCode: 400,
details: { assetPriorApprovalBasis: "required_for_assets" },
});
}
const updated = await tx.reimbursementItem.update({
where: { id: parsedItemId.data },
data: {
@@ -3853,7 +3835,7 @@ async function reimbursementRoutes(fastify) {
: {}),
asset_prior_approval_basis:
expenseType.category === "assets"
? targetApprovalBasis.trim()
? targetApprovalBasis?.trim() || null
: null,
updated_by: request.employee.id,
},
@@ -4029,7 +4011,6 @@ async function reimbursementRoutes(fastify) {
select: {
id: true,
amount: true,
asset_prior_approval_basis: true,
expense_type: {
select: { code: true, category: true, requires_invoice: true },
},
@@ -4058,25 +4039,6 @@ async function reimbursementRoutes(fastify) {
details: { items: "positive_amount_required", itemIds: invalidAmountItems },
});
}
const missingAssetApprovalItemIds = reimbursementItems
.filter(
(item) =>
item.expense_type.category === "assets" &&
!item.asset_prior_approval_basis?.trim(),
)
.map((item) => item.id);
if (missingAssetApprovalItemIds.length) {
throw new AppError({
code: "VALID_001",
message: "参数校验失败",
statusCode: 400,
details: {
items: "asset_prior_approval_basis_required",
itemIds: missingAssetApprovalItemIds,
},
});
}
const invoiceGuardGate = await evaluateFeatureFlag({
prisma: tx,
config: fastify.config,