取消报销资产事前批准强制(08-30-reimbursement-assets-prior-approval-correction)
这个提交包含在:
@@ -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,
|
||||
|
||||
@@ -47,13 +47,13 @@ const ENABLED_EXPENSE_TYPES = [
|
||||
{ code: "business_marketing", name: "营销投放", category: "business", description: "经批准的营销推广或广告投放费用;请上传正式票据并说明渠道和期间。" },
|
||||
{ code: "business_meeting", name: "会议费", category: "business", description: "经批准举办或参加会议发生的费用;请上传正式票据并说明会议事项。" },
|
||||
{ code: "business_training_fee", name: "培训费", category: "business", description: "经批准参加或组织培训发生的费用;请上传正式票据并说明培训事项。" },
|
||||
{ code: "assets_equipment", name: "设备采购", category: "assets", description: "经事前批准由个人垫付的通用设备采购;请填写批准人、批准时间和可核验依据。" },
|
||||
{ code: "assets_furniture", name: "家具采购", category: "assets", description: "经事前批准由个人垫付的办公家具采购;请填写批准人、批准时间和可核验依据。" },
|
||||
{ code: "assets_equipment", name: "设备采购", category: "assets", description: "通用设备采购;请在明细说明中写明物品名称、实际使用人或责任人、存放位置,便于资产登记。" },
|
||||
{ code: "assets_furniture", name: "家具采购", category: "assets", description: "办公家具采购;请在明细说明中写明物品名称、实际使用人或责任人、存放位置,便于资产登记。" },
|
||||
{
|
||||
code: "assets_office_electronics",
|
||||
name: "办公电子设备",
|
||||
category: "assets",
|
||||
description: "单条明细金额达到 2,000 元的办公电子设备通常选择本类型,并填写事前批准依据。该门槛不等同于会计固定资产确认标准。",
|
||||
description: "单条明细金额达到 2,000 元的办公电子设备通常选择本类型;请在明细说明中写明物品名称、实际使用人或责任人、存放位置,便于资产登记。该门槛不等同于会计固定资产确认标准。",
|
||||
},
|
||||
{ code: "utilities", name: "水电费", category: "other", description: "办公或生产经营相关的水电费用;请上传正式票据并说明费用期间。" },
|
||||
{ code: "rent", name: "房租租赁费", category: "other", description: "经批准的场地、设备或其他租赁费用;请上传正式票据并说明租赁事项和期间。" },
|
||||
|
||||
在新工单中引用
屏蔽一个用户