feat(P19ERP2-3,P19ERP2-4): 新增采购ERP轨道接口与详情挂件

这个提交包含在:
2026-03-08 23:50:11 +08:00
父节点 486660df06
当前提交 69c831d578
共修改 5 个文件,包含 707 行新增和 1 行删除
@@ -0,0 +1,59 @@
const integrationsRoutes = require('../../../src/routes/integrations');
describe('Integrations procurement ERP route helpers', () => {
const {
canReadPurchaseRequest,
ensureProcurementTargetEligible,
normalizeProcurementTargets,
} = integrationsRoutes.__testables;
it('normalizes procurement targets in fixed order', () => {
expect(
normalizeProcurementTargets({
targets: ['archive_summary', 'commitment_journal', 'archive_summary'],
}),
).toEqual(['commitment_journal', 'archive_summary']);
});
it('respects purchase read permission rules', () => {
const purchaseRequest = {
applicant_id: 'employee-1',
submitter_id: 'employee-2',
};
expect(
canReadPurchaseRequest(
{ employee: { id: 'employee-1', permissionCodes: ['procurement.view_own'] } },
purchaseRequest,
),
).toBe(true);
expect(
canReadPurchaseRequest(
{ employee: { id: 'other', permissionCodes: ['procurement.view_own'] } },
purchaseRequest,
),
).toBe(false);
expect(
canReadPurchaseRequest(
{ employee: { id: 'other', permissionCodes: ['integration.manage', 'procurement.view_all'] } },
purchaseRequest,
),
).toBe(true);
});
it('rejects commitment target when purchase is not approved', () => {
expect(() =>
ensureProcurementTargetEligible('commitment_journal', {
purchaseRequest: { status: 'reviewing' },
}),
).toThrow('参数校验失败');
});
it('rejects archive targets when archive is missing', () => {
expect(() =>
ensureProcurementTargetEligible('accrual_journal', {
purchaseRequest: { status: 'approved', order_archive: null },
}),
).toThrow('参数校验失败');
});
});