@accounter/server 0.0.8-alpha-20251102200443-d7162b8ce1dfc629b8b454df17dcec9ed005a052 → 0.0.8-alpha-20251102213150-c9d936f545d5351df0dc5326c2623266f1ad1f46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -7
- package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +1 -1
- package/dist/server/src/__generated__/types.d.ts +77 -0
- package/dist/server/src/__generated__/types.js.map +1 -1
- package/dist/server/src/modules/charges-matcher/__generated__/types.d.ts +68 -0
- package/dist/server/src/modules/charges-matcher/__generated__/types.js +7 -0
- package/dist/server/src/modules/charges-matcher/__generated__/types.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.js +218 -0
- package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js +645 -0
- package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.js +530 -0
- package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.js +143 -0
- package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.js +186 -0
- package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.js +301 -0
- package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.js +127 -0
- package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.js +246 -0
- package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.js +475 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.js +287 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.js +151 -0
- package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.js +550 -0
- package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.js +410 -0
- package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js +504 -0
- package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.js +483 -0
- package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.d.ts +46 -0
- package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.js +143 -0
- package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.js +137 -0
- package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.d.ts +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.js +415 -0
- package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.d.ts +7 -0
- package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.js +70 -0
- package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.d.ts +7 -0
- package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.js +19 -0
- package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.d.ts +24 -0
- package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.js +45 -0
- package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.d.ts +33 -0
- package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.js +65 -0
- package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.d.ts +7 -0
- package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.js +18 -0
- package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.d.ts +7 -0
- package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.js +35 -0
- package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.d.ts +49 -0
- package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.js +58 -0
- package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.d.ts +13 -0
- package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.js +37 -0
- package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.d.ts +42 -0
- package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.js +77 -0
- package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/index.d.ts +3 -0
- package/dist/server/src/modules/charges-matcher/index.js +15 -0
- package/dist/server/src/modules/charges-matcher/index.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.d.ts +48 -0
- package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.js +133 -0
- package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.d.ts +38 -0
- package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js +248 -0
- package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/providers/document-aggregator.d.ts +61 -0
- package/dist/server/src/modules/charges-matcher/providers/document-aggregator.js +153 -0
- package/dist/server/src/modules/charges-matcher/providers/document-aggregator.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.d.ts +25 -0
- package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.js +114 -0
- package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/providers/single-match.provider.d.ts +39 -0
- package/dist/server/src/modules/charges-matcher/providers/single-match.provider.js +189 -0
- package/dist/server/src/modules/charges-matcher/providers/single-match.provider.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.d.ts +54 -0
- package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.js +93 -0
- package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.d.ts +2 -0
- package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.js +22 -0
- package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.d.ts +2 -0
- package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.js +24 -0
- package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/resolvers/index.d.ts +2 -0
- package/dist/server/src/modules/charges-matcher/resolvers/index.js +11 -0
- package/dist/server/src/modules/charges-matcher/resolvers/index.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.d.ts +2 -0
- package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.js +47 -0
- package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/types.d.ts +179 -0
- package/dist/server/src/modules/charges-matcher/types.js +14 -0
- package/dist/server/src/modules/charges-matcher/types.js.map +1 -0
- package/dist/server/src/modules/documents/resolvers/document-suggestions.resolver.js +2 -2
- package/dist/server/src/modules/documents/resolvers/document-suggestions.resolver.js.map +1 -1
- package/dist/server/src/modules-app.js +2 -0
- package/dist/server/src/modules-app.js.map +1 -1
- package/dist/server/src/shared/types/index.d.ts +1 -1
- package/package.json +4 -4
- package/src/__generated__/types.ts +87 -0
- package/src/modules/charges-matcher/README.md +279 -0
- package/src/modules/charges-matcher/__generated__/types.ts +71 -0
- package/src/modules/charges-matcher/__tests__/amount-confidence.test.ts +260 -0
- package/src/modules/charges-matcher/__tests__/auto-match-integration.test.ts +714 -0
- package/src/modules/charges-matcher/__tests__/auto-match.test.ts +621 -0
- package/src/modules/charges-matcher/__tests__/business-confidence.test.ts +177 -0
- package/src/modules/charges-matcher/__tests__/candidate-filter.test.ts +238 -0
- package/src/modules/charges-matcher/__tests__/charge-validator.test.ts +374 -0
- package/src/modules/charges-matcher/__tests__/currency-confidence.test.ts +164 -0
- package/src/modules/charges-matcher/__tests__/date-confidence.test.ts +291 -0
- package/src/modules/charges-matcher/__tests__/document-aggregator.test.ts +614 -0
- package/src/modules/charges-matcher/__tests__/document-amount.test.ts +352 -0
- package/src/modules/charges-matcher/__tests__/document-business.test.ts +192 -0
- package/src/modules/charges-matcher/__tests__/match-scorer.test.ts +659 -0
- package/src/modules/charges-matcher/__tests__/overall-confidence.test.ts +502 -0
- package/src/modules/charges-matcher/__tests__/single-match-integration.test.ts +556 -0
- package/src/modules/charges-matcher/__tests__/single-match.test.ts +608 -0
- package/src/modules/charges-matcher/__tests__/test-helpers.ts +174 -0
- package/src/modules/charges-matcher/__tests__/test-infrastructure.spec.ts +177 -0
- package/src/modules/charges-matcher/__tests__/transaction-aggregator.test.ts +547 -0
- package/src/modules/charges-matcher/documentation/README.md +331 -0
- package/src/modules/charges-matcher/documentation/SPEC.md +1503 -0
- package/src/modules/charges-matcher/documentation/TODO.md +799 -0
- package/src/modules/charges-matcher/helpers/amount-confidence.helper.ts +88 -0
- package/src/modules/charges-matcher/helpers/business-confidence.helper.ts +23 -0
- package/src/modules/charges-matcher/helpers/candidate-filter.helper.ts +56 -0
- package/src/modules/charges-matcher/helpers/charge-validator.helper.ts +100 -0
- package/src/modules/charges-matcher/helpers/currency-confidence.helper.ts +22 -0
- package/src/modules/charges-matcher/helpers/date-confidence.helper.ts +41 -0
- package/src/modules/charges-matcher/helpers/document-amount.helper.ts +77 -0
- package/src/modules/charges-matcher/helpers/document-business.helper.ts +54 -0
- package/src/modules/charges-matcher/helpers/overall-confidence.helper.ts +90 -0
- package/src/modules/charges-matcher/index.ts +17 -0
- package/src/modules/charges-matcher/providers/auto-match.provider.ts +176 -0
- package/src/modules/charges-matcher/providers/charges-matcher.provider.ts +322 -0
- package/src/modules/charges-matcher/providers/document-aggregator.ts +211 -0
- package/src/modules/charges-matcher/providers/match-scorer.provider.ts +154 -0
- package/src/modules/charges-matcher/providers/single-match.provider.ts +252 -0
- package/src/modules/charges-matcher/providers/transaction-aggregator.ts +131 -0
- package/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.ts +23 -0
- package/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.ts +25 -0
- package/src/modules/charges-matcher/resolvers/index.ts +12 -0
- package/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.ts +47 -0
- package/src/modules/charges-matcher/types.ts +200 -0
- package/src/modules/documents/resolvers/document-suggestions.resolver.ts +2 -2
- package/src/modules-app.ts +2 -0
- package/src/shared/types/index.ts +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount-confidence.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/amount-confidence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { createMockTransaction, createMockDocument } from './test-helpers.js';
|
|
3
|
+
// Mock the module imports
|
|
4
|
+
vi.mock('graphql-modules', () => ({
|
|
5
|
+
Injectable: () => (target) => target,
|
|
6
|
+
Injector: class {
|
|
7
|
+
},
|
|
8
|
+
Scope: { Operation: 'Operation' },
|
|
9
|
+
}));
|
|
10
|
+
vi.mock('@modules/charges/providers/charges.provider.js', () => ({
|
|
11
|
+
ChargesProvider: class {
|
|
12
|
+
},
|
|
13
|
+
}));
|
|
14
|
+
vi.mock('@modules/documents/providers/documents.provider.js', () => ({
|
|
15
|
+
DocumentsProvider: class {
|
|
16
|
+
},
|
|
17
|
+
}));
|
|
18
|
+
vi.mock('@modules/transactions/providers/transactions.provider.js', () => ({
|
|
19
|
+
TransactionsProvider: class {
|
|
20
|
+
},
|
|
21
|
+
}));
|
|
22
|
+
vi.mock('@modules/charges/helpers/merge-charges.hepler.js', () => ({
|
|
23
|
+
mergeChargesExecutor: vi.fn(),
|
|
24
|
+
}));
|
|
25
|
+
vi.mock('@shared/helpers', () => ({
|
|
26
|
+
dateToTimelessDateString: (date) => date.toISOString().split('T')[0],
|
|
27
|
+
}));
|
|
28
|
+
// Import after mocking
|
|
29
|
+
const { ChargesMatcherProvider } = await import('../providers/charges-matcher.provider.js');
|
|
30
|
+
const { mergeChargesExecutor } = await import('../../charges/helpers/merge-charges.hepler.js');
|
|
31
|
+
// Test constants
|
|
32
|
+
const ADMIN_BUSINESS_ID = 'user-123';
|
|
33
|
+
const BUSINESS_A = 'business-a';
|
|
34
|
+
// Helper to create charge
|
|
35
|
+
function createCharge(id, ownerId) {
|
|
36
|
+
return {
|
|
37
|
+
id,
|
|
38
|
+
owner_id: ownerId,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
describe('ChargesMatcherProvider - Auto-Match Integration', () => {
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
vi.clearAllMocks();
|
|
44
|
+
});
|
|
45
|
+
describe('autoMatchCharges', () => {
|
|
46
|
+
it('should return 0 matches when database is empty', async () => {
|
|
47
|
+
const mockChargesProvider = {
|
|
48
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([])),
|
|
49
|
+
};
|
|
50
|
+
const mockTransactionsProvider = {
|
|
51
|
+
transactionsByChargeIDLoader: {
|
|
52
|
+
load: vi.fn(() => Promise.resolve([])),
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
const mockDocumentsProvider = {
|
|
56
|
+
getDocumentsByChargeIdLoader: {
|
|
57
|
+
load: vi.fn(() => Promise.resolve([])),
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const mockInjector = {
|
|
61
|
+
get: vi.fn((token) => {
|
|
62
|
+
if (token.name === 'ChargesProvider')
|
|
63
|
+
return mockChargesProvider;
|
|
64
|
+
if (token.name === 'TransactionsProvider')
|
|
65
|
+
return mockTransactionsProvider;
|
|
66
|
+
if (token.name === 'DocumentsProvider')
|
|
67
|
+
return mockDocumentsProvider;
|
|
68
|
+
return null;
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
71
|
+
const provider = new ChargesMatcherProvider();
|
|
72
|
+
const result = await provider.autoMatchCharges({
|
|
73
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
74
|
+
injector: mockInjector,
|
|
75
|
+
});
|
|
76
|
+
expect(result.totalMatches).toBe(0);
|
|
77
|
+
expect(result.mergedCharges).toEqual([]);
|
|
78
|
+
expect(result.skippedCharges).toEqual([]);
|
|
79
|
+
expect(result.errors).toEqual([]);
|
|
80
|
+
});
|
|
81
|
+
it('should return 0 matches when all charges are already matched', async () => {
|
|
82
|
+
const matchedChargeId = 'matched-charge-1';
|
|
83
|
+
const mockChargesProvider = {
|
|
84
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([createCharge(matchedChargeId, ADMIN_BUSINESS_ID)])),
|
|
85
|
+
};
|
|
86
|
+
const mockTransactionsProvider = {
|
|
87
|
+
transactionsByChargeIDLoader: {
|
|
88
|
+
load: vi.fn(() => Promise.resolve([createMockTransaction()])),
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const mockDocumentsProvider = {
|
|
92
|
+
getDocumentsByChargeIdLoader: {
|
|
93
|
+
load: vi.fn(() => Promise.resolve([createMockDocument()])),
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
const mockInjector = {
|
|
97
|
+
get: vi.fn((token) => {
|
|
98
|
+
if (token.name === 'ChargesProvider')
|
|
99
|
+
return mockChargesProvider;
|
|
100
|
+
if (token.name === 'TransactionsProvider')
|
|
101
|
+
return mockTransactionsProvider;
|
|
102
|
+
if (token.name === 'DocumentsProvider')
|
|
103
|
+
return mockDocumentsProvider;
|
|
104
|
+
return null;
|
|
105
|
+
}),
|
|
106
|
+
};
|
|
107
|
+
const provider = new ChargesMatcherProvider();
|
|
108
|
+
const result = await provider.autoMatchCharges({
|
|
109
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
110
|
+
injector: mockInjector,
|
|
111
|
+
});
|
|
112
|
+
expect(result.totalMatches).toBe(0);
|
|
113
|
+
expect(result.mergedCharges).toEqual([]);
|
|
114
|
+
expect(result.skippedCharges).toEqual([]);
|
|
115
|
+
});
|
|
116
|
+
it('should execute merge for single unmatched charge with good match', async () => {
|
|
117
|
+
const txChargeId = 'tx-charge-1';
|
|
118
|
+
const docChargeId = 'doc-charge-1';
|
|
119
|
+
const mockChargesProvider = {
|
|
120
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([
|
|
121
|
+
createCharge(txChargeId, ADMIN_BUSINESS_ID),
|
|
122
|
+
createCharge(docChargeId, ADMIN_BUSINESS_ID),
|
|
123
|
+
])),
|
|
124
|
+
};
|
|
125
|
+
const mockTransactionsProvider = {
|
|
126
|
+
transactionsByChargeIDLoader: {
|
|
127
|
+
load: vi.fn((id) => {
|
|
128
|
+
if (id === txChargeId) {
|
|
129
|
+
return Promise.resolve([
|
|
130
|
+
createMockTransaction({
|
|
131
|
+
charge_id: txChargeId,
|
|
132
|
+
amount: "100",
|
|
133
|
+
currency: 'USD',
|
|
134
|
+
event_date: new Date('2024-01-15'),
|
|
135
|
+
}),
|
|
136
|
+
]);
|
|
137
|
+
}
|
|
138
|
+
return Promise.resolve([]);
|
|
139
|
+
}),
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
const mockDocumentsProvider = {
|
|
143
|
+
getDocumentsByChargeIdLoader: {
|
|
144
|
+
load: vi.fn((id) => {
|
|
145
|
+
if (id === docChargeId) {
|
|
146
|
+
return Promise.resolve([
|
|
147
|
+
createMockDocument({
|
|
148
|
+
charge_id: docChargeId,
|
|
149
|
+
total_amount: 100,
|
|
150
|
+
currency_code: 'USD',
|
|
151
|
+
date: new Date('2024-01-15'),
|
|
152
|
+
}),
|
|
153
|
+
]);
|
|
154
|
+
}
|
|
155
|
+
return Promise.resolve([]);
|
|
156
|
+
}),
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
const mockInjector = {
|
|
160
|
+
get: vi.fn((token) => {
|
|
161
|
+
if (token.name === 'ChargesProvider')
|
|
162
|
+
return mockChargesProvider;
|
|
163
|
+
if (token.name === 'TransactionsProvider')
|
|
164
|
+
return mockTransactionsProvider;
|
|
165
|
+
if (token.name === 'DocumentsProvider')
|
|
166
|
+
return mockDocumentsProvider;
|
|
167
|
+
return null;
|
|
168
|
+
}),
|
|
169
|
+
};
|
|
170
|
+
const provider = new ChargesMatcherProvider();
|
|
171
|
+
const result = await provider.autoMatchCharges({
|
|
172
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
173
|
+
injector: mockInjector,
|
|
174
|
+
});
|
|
175
|
+
expect(result.totalMatches).toBe(1);
|
|
176
|
+
expect(result.mergedCharges).toHaveLength(1);
|
|
177
|
+
expect(result.mergedCharges[0].confidenceScore).toBeGreaterThanOrEqual(0.95);
|
|
178
|
+
expect(result.skippedCharges).toEqual([]);
|
|
179
|
+
expect(result.errors).toEqual([]);
|
|
180
|
+
// Verify merge was called
|
|
181
|
+
expect(mergeChargesExecutor).toHaveBeenCalledTimes(1);
|
|
182
|
+
});
|
|
183
|
+
it('should skip charges with ambiguous matches', async () => {
|
|
184
|
+
const txChargeId = 'tx-charge-1';
|
|
185
|
+
const docCharge1Id = 'doc-charge-1';
|
|
186
|
+
const docCharge2Id = 'doc-charge-2';
|
|
187
|
+
const mockChargesProvider = {
|
|
188
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([
|
|
189
|
+
createCharge(txChargeId, ADMIN_BUSINESS_ID),
|
|
190
|
+
createCharge(docCharge1Id, ADMIN_BUSINESS_ID),
|
|
191
|
+
createCharge(docCharge2Id, ADMIN_BUSINESS_ID),
|
|
192
|
+
])),
|
|
193
|
+
};
|
|
194
|
+
const mockTransactionsProvider = {
|
|
195
|
+
transactionsByChargeIDLoader: {
|
|
196
|
+
load: vi.fn((id) => {
|
|
197
|
+
if (id === txChargeId) {
|
|
198
|
+
return Promise.resolve([
|
|
199
|
+
createMockTransaction({
|
|
200
|
+
charge_id: txChargeId,
|
|
201
|
+
amount: "100",
|
|
202
|
+
currency: 'USD',
|
|
203
|
+
event_date: new Date('2024-01-15'),
|
|
204
|
+
}),
|
|
205
|
+
]);
|
|
206
|
+
}
|
|
207
|
+
return Promise.resolve([]);
|
|
208
|
+
}),
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
const mockDocumentsProvider = {
|
|
212
|
+
getDocumentsByChargeIdLoader: {
|
|
213
|
+
load: vi.fn((id) => {
|
|
214
|
+
if (id === docCharge1Id) {
|
|
215
|
+
return Promise.resolve([
|
|
216
|
+
createMockDocument({
|
|
217
|
+
charge_id: docCharge1Id,
|
|
218
|
+
total_amount: 100,
|
|
219
|
+
currency_code: 'USD',
|
|
220
|
+
date: new Date('2024-01-15'),
|
|
221
|
+
}),
|
|
222
|
+
]);
|
|
223
|
+
}
|
|
224
|
+
if (id === docCharge2Id) {
|
|
225
|
+
return Promise.resolve([
|
|
226
|
+
createMockDocument({
|
|
227
|
+
charge_id: docCharge2Id,
|
|
228
|
+
total_amount: 100,
|
|
229
|
+
currency_code: 'USD',
|
|
230
|
+
date: new Date('2024-01-15'),
|
|
231
|
+
}),
|
|
232
|
+
]);
|
|
233
|
+
}
|
|
234
|
+
return Promise.resolve([]);
|
|
235
|
+
}),
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
const mockInjector = {
|
|
239
|
+
get: vi.fn((token) => {
|
|
240
|
+
if (token.name === 'ChargesProvider')
|
|
241
|
+
return mockChargesProvider;
|
|
242
|
+
if (token.name === 'TransactionsProvider')
|
|
243
|
+
return mockTransactionsProvider;
|
|
244
|
+
if (token.name === 'DocumentsProvider')
|
|
245
|
+
return mockDocumentsProvider;
|
|
246
|
+
return null;
|
|
247
|
+
}),
|
|
248
|
+
};
|
|
249
|
+
const provider = new ChargesMatcherProvider();
|
|
250
|
+
const result = await provider.autoMatchCharges({
|
|
251
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
252
|
+
injector: mockInjector,
|
|
253
|
+
});
|
|
254
|
+
// The transaction charge should find 2 identical doc matches and skip (ambiguous)
|
|
255
|
+
// But the doc charges will also match each other with high confidence
|
|
256
|
+
// Since processing is sequential, one doc will match the other doc
|
|
257
|
+
// So we expect: 1 match (doc1-doc2), and tx skipped due to ambiguity
|
|
258
|
+
expect(result.totalMatches).toBe(1);
|
|
259
|
+
expect(result.skippedCharges).toHaveLength(1);
|
|
260
|
+
expect(result.skippedCharges[0]).toBe(txChargeId);
|
|
261
|
+
expect(mergeChargesExecutor).toHaveBeenCalledTimes(1);
|
|
262
|
+
});
|
|
263
|
+
it('should process multiple unmatched charges correctly', async () => {
|
|
264
|
+
const tx1Id = 'tx-charge-1';
|
|
265
|
+
const doc1Id = 'doc-charge-1';
|
|
266
|
+
const tx2Id = 'tx-charge-2';
|
|
267
|
+
const doc2Id = 'doc-charge-2';
|
|
268
|
+
const mockChargesProvider = {
|
|
269
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([
|
|
270
|
+
createCharge(tx1Id, ADMIN_BUSINESS_ID),
|
|
271
|
+
createCharge(doc1Id, ADMIN_BUSINESS_ID),
|
|
272
|
+
createCharge(tx2Id, ADMIN_BUSINESS_ID),
|
|
273
|
+
createCharge(doc2Id, ADMIN_BUSINESS_ID),
|
|
274
|
+
])),
|
|
275
|
+
};
|
|
276
|
+
const mockTransactionsProvider = {
|
|
277
|
+
transactionsByChargeIDLoader: {
|
|
278
|
+
load: vi.fn((id) => {
|
|
279
|
+
if (id === tx1Id) {
|
|
280
|
+
return Promise.resolve([
|
|
281
|
+
createMockTransaction({ charge_id: tx1Id, amount: "100", currency: 'USD' }),
|
|
282
|
+
]);
|
|
283
|
+
}
|
|
284
|
+
if (id === tx2Id) {
|
|
285
|
+
return Promise.resolve([
|
|
286
|
+
createMockTransaction({ charge_id: tx2Id, amount: "200", currency: 'EUR' }),
|
|
287
|
+
]);
|
|
288
|
+
}
|
|
289
|
+
return Promise.resolve([]);
|
|
290
|
+
}),
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
const mockDocumentsProvider = {
|
|
294
|
+
getDocumentsByChargeIdLoader: {
|
|
295
|
+
load: vi.fn((id) => {
|
|
296
|
+
if (id === doc1Id) {
|
|
297
|
+
return Promise.resolve([
|
|
298
|
+
createMockDocument({ charge_id: doc1Id, total_amount: 100, currency_code: 'USD' }),
|
|
299
|
+
]);
|
|
300
|
+
}
|
|
301
|
+
if (id === doc2Id) {
|
|
302
|
+
return Promise.resolve([
|
|
303
|
+
createMockDocument({ charge_id: doc2Id, total_amount: 200, currency_code: 'EUR' }),
|
|
304
|
+
]);
|
|
305
|
+
}
|
|
306
|
+
return Promise.resolve([]);
|
|
307
|
+
}),
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
const mockInjector = {
|
|
311
|
+
get: vi.fn((token) => {
|
|
312
|
+
if (token.name === 'ChargesProvider')
|
|
313
|
+
return mockChargesProvider;
|
|
314
|
+
if (token.name === 'TransactionsProvider')
|
|
315
|
+
return mockTransactionsProvider;
|
|
316
|
+
if (token.name === 'DocumentsProvider')
|
|
317
|
+
return mockDocumentsProvider;
|
|
318
|
+
return null;
|
|
319
|
+
}),
|
|
320
|
+
};
|
|
321
|
+
const provider = new ChargesMatcherProvider();
|
|
322
|
+
const result = await provider.autoMatchCharges({
|
|
323
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
324
|
+
injector: mockInjector,
|
|
325
|
+
});
|
|
326
|
+
expect(result.totalMatches).toBe(2);
|
|
327
|
+
expect(result.mergedCharges).toHaveLength(2);
|
|
328
|
+
expect(mergeChargesExecutor).toHaveBeenCalledTimes(2);
|
|
329
|
+
});
|
|
330
|
+
it('should capture errors during merge but continue processing', async () => {
|
|
331
|
+
const tx1Id = 'tx-charge-1';
|
|
332
|
+
const doc1Id = 'doc-charge-1';
|
|
333
|
+
const tx2Id = 'tx-charge-2'; // This will have no match
|
|
334
|
+
const mockChargesProvider = {
|
|
335
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([
|
|
336
|
+
createCharge(tx1Id, ADMIN_BUSINESS_ID),
|
|
337
|
+
createCharge(doc1Id, ADMIN_BUSINESS_ID),
|
|
338
|
+
createCharge(tx2Id, ADMIN_BUSINESS_ID),
|
|
339
|
+
])),
|
|
340
|
+
};
|
|
341
|
+
const mockTransactionsProvider = {
|
|
342
|
+
transactionsByChargeIDLoader: {
|
|
343
|
+
load: vi.fn((id) => {
|
|
344
|
+
if (id === tx1Id) {
|
|
345
|
+
return Promise.resolve([
|
|
346
|
+
createMockTransaction({
|
|
347
|
+
charge_id: id,
|
|
348
|
+
amount: "100",
|
|
349
|
+
currency: 'USD',
|
|
350
|
+
event_date: new Date('2024-01-15'),
|
|
351
|
+
}),
|
|
352
|
+
]);
|
|
353
|
+
}
|
|
354
|
+
if (id === tx2Id) {
|
|
355
|
+
return Promise.resolve([
|
|
356
|
+
createMockTransaction({
|
|
357
|
+
charge_id: id,
|
|
358
|
+
amount: "999",
|
|
359
|
+
currency: 'GBP',
|
|
360
|
+
event_date: new Date('2024-03-15'),
|
|
361
|
+
}),
|
|
362
|
+
]);
|
|
363
|
+
}
|
|
364
|
+
return Promise.resolve([]);
|
|
365
|
+
}),
|
|
366
|
+
},
|
|
367
|
+
};
|
|
368
|
+
const mockDocumentsProvider = {
|
|
369
|
+
getDocumentsByChargeIdLoader: {
|
|
370
|
+
load: vi.fn((id) => {
|
|
371
|
+
if (id === doc1Id) {
|
|
372
|
+
return Promise.resolve([
|
|
373
|
+
createMockDocument({
|
|
374
|
+
charge_id: id,
|
|
375
|
+
total_amount: 100,
|
|
376
|
+
currency_code: 'USD',
|
|
377
|
+
date: new Date('2024-01-15'),
|
|
378
|
+
}),
|
|
379
|
+
]);
|
|
380
|
+
}
|
|
381
|
+
return Promise.resolve([]);
|
|
382
|
+
}),
|
|
383
|
+
},
|
|
384
|
+
};
|
|
385
|
+
// Mock merge to fail on first call, succeed on second
|
|
386
|
+
mergeChargesExecutor.mockImplementationOnce(() => {
|
|
387
|
+
throw new Error('Merge failed for test');
|
|
388
|
+
});
|
|
389
|
+
mergeChargesExecutor.mockImplementationOnce(() => Promise.resolve());
|
|
390
|
+
const mockInjector = {
|
|
391
|
+
get: vi.fn((token) => {
|
|
392
|
+
if (token.name === 'ChargesProvider')
|
|
393
|
+
return mockChargesProvider;
|
|
394
|
+
if (token.name === 'TransactionsProvider')
|
|
395
|
+
return mockTransactionsProvider;
|
|
396
|
+
if (token.name === 'DocumentsProvider')
|
|
397
|
+
return mockDocumentsProvider;
|
|
398
|
+
return null;
|
|
399
|
+
}),
|
|
400
|
+
};
|
|
401
|
+
const provider = new ChargesMatcherProvider();
|
|
402
|
+
const result = await provider.autoMatchCharges({
|
|
403
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
404
|
+
injector: mockInjector,
|
|
405
|
+
});
|
|
406
|
+
// tx1 finds doc1, merge fails → error captured, charges not marked as merged
|
|
407
|
+
// doc1 finds tx1, merge succeeds → totalMatches++, charges marked as merged
|
|
408
|
+
// tx2 has no match → silent
|
|
409
|
+
expect(result.totalMatches).toBe(1);
|
|
410
|
+
expect(result.errors).toHaveLength(1);
|
|
411
|
+
expect(result.errors[0]).toContain('Failed to merge');
|
|
412
|
+
expect(mergeChargesExecutor).toHaveBeenCalledTimes(2);
|
|
413
|
+
});
|
|
414
|
+
it('should verify merge direction keeps transaction charge', async () => {
|
|
415
|
+
const txChargeId = 'tx-charge-1';
|
|
416
|
+
const docChargeId = 'doc-charge-1';
|
|
417
|
+
const mockChargesProvider = {
|
|
418
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([
|
|
419
|
+
createCharge(txChargeId, ADMIN_BUSINESS_ID),
|
|
420
|
+
createCharge(docChargeId, ADMIN_BUSINESS_ID),
|
|
421
|
+
])),
|
|
422
|
+
};
|
|
423
|
+
const mockTransactionsProvider = {
|
|
424
|
+
transactionsByChargeIDLoader: {
|
|
425
|
+
load: vi.fn((id) => {
|
|
426
|
+
if (id === txChargeId) {
|
|
427
|
+
return Promise.resolve([createMockTransaction({ charge_id: txChargeId })]);
|
|
428
|
+
}
|
|
429
|
+
return Promise.resolve([]);
|
|
430
|
+
}),
|
|
431
|
+
},
|
|
432
|
+
};
|
|
433
|
+
const mockDocumentsProvider = {
|
|
434
|
+
getDocumentsByChargeIdLoader: {
|
|
435
|
+
load: vi.fn((id) => {
|
|
436
|
+
if (id === docChargeId) {
|
|
437
|
+
return Promise.resolve([createMockDocument({ charge_id: docChargeId })]);
|
|
438
|
+
}
|
|
439
|
+
return Promise.resolve([]);
|
|
440
|
+
}),
|
|
441
|
+
},
|
|
442
|
+
};
|
|
443
|
+
const mockInjector = {
|
|
444
|
+
get: vi.fn((token) => {
|
|
445
|
+
if (token.name === 'ChargesProvider')
|
|
446
|
+
return mockChargesProvider;
|
|
447
|
+
if (token.name === 'TransactionsProvider')
|
|
448
|
+
return mockTransactionsProvider;
|
|
449
|
+
if (token.name === 'DocumentsProvider')
|
|
450
|
+
return mockDocumentsProvider;
|
|
451
|
+
return null;
|
|
452
|
+
}),
|
|
453
|
+
};
|
|
454
|
+
const provider = new ChargesMatcherProvider();
|
|
455
|
+
await provider.autoMatchCharges({
|
|
456
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
457
|
+
injector: mockInjector,
|
|
458
|
+
});
|
|
459
|
+
// Verify merge was called with doc charge being merged into tx charge
|
|
460
|
+
expect(mergeChargesExecutor).toHaveBeenCalledWith([docChargeId], txChargeId, mockInjector);
|
|
461
|
+
});
|
|
462
|
+
it('should exclude merged charges from further processing in same run', async () => {
|
|
463
|
+
const tx1Id = 'tx-charge-1';
|
|
464
|
+
const doc1Id = 'doc-charge-1';
|
|
465
|
+
const tx2Id = 'tx-charge-2';
|
|
466
|
+
const mockChargesProvider = {
|
|
467
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([
|
|
468
|
+
createCharge(tx1Id, ADMIN_BUSINESS_ID),
|
|
469
|
+
createCharge(doc1Id, ADMIN_BUSINESS_ID),
|
|
470
|
+
createCharge(tx2Id, ADMIN_BUSINESS_ID),
|
|
471
|
+
])),
|
|
472
|
+
};
|
|
473
|
+
const mockTransactionsProvider = {
|
|
474
|
+
transactionsByChargeIDLoader: {
|
|
475
|
+
load: vi.fn((id) => {
|
|
476
|
+
if (id === tx1Id || id === tx2Id) {
|
|
477
|
+
return Promise.resolve([createMockTransaction({ charge_id: id, amount: "100" })]);
|
|
478
|
+
}
|
|
479
|
+
return Promise.resolve([]);
|
|
480
|
+
}),
|
|
481
|
+
},
|
|
482
|
+
};
|
|
483
|
+
const mockDocumentsProvider = {
|
|
484
|
+
getDocumentsByChargeIdLoader: {
|
|
485
|
+
load: vi.fn((id) => {
|
|
486
|
+
if (id === doc1Id) {
|
|
487
|
+
return Promise.resolve([createMockDocument({ charge_id: doc1Id, total_amount: 100 })]);
|
|
488
|
+
}
|
|
489
|
+
return Promise.resolve([]);
|
|
490
|
+
}),
|
|
491
|
+
},
|
|
492
|
+
};
|
|
493
|
+
const mockInjector = {
|
|
494
|
+
get: vi.fn((token) => {
|
|
495
|
+
if (token.name === 'ChargesProvider')
|
|
496
|
+
return mockChargesProvider;
|
|
497
|
+
if (token.name === 'TransactionsProvider')
|
|
498
|
+
return mockTransactionsProvider;
|
|
499
|
+
if (token.name === 'DocumentsProvider')
|
|
500
|
+
return mockDocumentsProvider;
|
|
501
|
+
return null;
|
|
502
|
+
}),
|
|
503
|
+
};
|
|
504
|
+
const provider = new ChargesMatcherProvider();
|
|
505
|
+
const result = await provider.autoMatchCharges({
|
|
506
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
507
|
+
injector: mockInjector,
|
|
508
|
+
});
|
|
509
|
+
// Should only merge tx1 with doc1, tx2 should have no match
|
|
510
|
+
expect(result.totalMatches).toBe(1);
|
|
511
|
+
expect(mergeChargesExecutor).toHaveBeenCalledTimes(1);
|
|
512
|
+
});
|
|
513
|
+
it('should handle mixed scenarios: some match, some skip, some no-match', async () => {
|
|
514
|
+
const perfectMatchTx = 'tx-perfect';
|
|
515
|
+
const perfectMatchDoc = 'doc-perfect';
|
|
516
|
+
const ambiguousTx = 'tx-ambiguous';
|
|
517
|
+
const ambiguousDoc1 = 'doc-ambiguous-1';
|
|
518
|
+
const ambiguousDoc2 = 'doc-ambiguous-2';
|
|
519
|
+
const noMatchTx = 'tx-no-match';
|
|
520
|
+
const mockChargesProvider = {
|
|
521
|
+
getChargesByFilters: vi.fn(() => Promise.resolve([
|
|
522
|
+
createCharge(perfectMatchTx, ADMIN_BUSINESS_ID),
|
|
523
|
+
createCharge(perfectMatchDoc, ADMIN_BUSINESS_ID),
|
|
524
|
+
createCharge(ambiguousTx, ADMIN_BUSINESS_ID),
|
|
525
|
+
createCharge(ambiguousDoc1, ADMIN_BUSINESS_ID),
|
|
526
|
+
createCharge(ambiguousDoc2, ADMIN_BUSINESS_ID),
|
|
527
|
+
createCharge(noMatchTx, ADMIN_BUSINESS_ID),
|
|
528
|
+
])),
|
|
529
|
+
};
|
|
530
|
+
const mockTransactionsProvider = {
|
|
531
|
+
transactionsByChargeIDLoader: {
|
|
532
|
+
load: vi.fn((id) => {
|
|
533
|
+
if (id === perfectMatchTx) {
|
|
534
|
+
return Promise.resolve([
|
|
535
|
+
createMockTransaction({
|
|
536
|
+
charge_id: id,
|
|
537
|
+
amount: "100",
|
|
538
|
+
currency: 'USD',
|
|
539
|
+
event_date: new Date('2024-01-15'),
|
|
540
|
+
}),
|
|
541
|
+
]);
|
|
542
|
+
}
|
|
543
|
+
if (id === ambiguousTx) {
|
|
544
|
+
return Promise.resolve([
|
|
545
|
+
createMockTransaction({
|
|
546
|
+
charge_id: id,
|
|
547
|
+
amount: "200",
|
|
548
|
+
currency: 'EUR',
|
|
549
|
+
event_date: new Date('2024-02-15'),
|
|
550
|
+
}),
|
|
551
|
+
]);
|
|
552
|
+
}
|
|
553
|
+
if (id === noMatchTx) {
|
|
554
|
+
return Promise.resolve([
|
|
555
|
+
createMockTransaction({
|
|
556
|
+
charge_id: id,
|
|
557
|
+
amount: "500",
|
|
558
|
+
currency: 'GBP',
|
|
559
|
+
event_date: new Date('2024-03-15'),
|
|
560
|
+
}),
|
|
561
|
+
]);
|
|
562
|
+
}
|
|
563
|
+
return Promise.resolve([]);
|
|
564
|
+
}),
|
|
565
|
+
},
|
|
566
|
+
};
|
|
567
|
+
const mockDocumentsProvider = {
|
|
568
|
+
getDocumentsByChargeIdLoader: {
|
|
569
|
+
load: vi.fn((id) => {
|
|
570
|
+
if (id === perfectMatchDoc) {
|
|
571
|
+
return Promise.resolve([
|
|
572
|
+
createMockDocument({
|
|
573
|
+
charge_id: id,
|
|
574
|
+
total_amount: 100,
|
|
575
|
+
currency_code: 'USD',
|
|
576
|
+
date: new Date('2024-01-15'),
|
|
577
|
+
}),
|
|
578
|
+
]);
|
|
579
|
+
}
|
|
580
|
+
if (id === ambiguousDoc1) {
|
|
581
|
+
return Promise.resolve([
|
|
582
|
+
createMockDocument({
|
|
583
|
+
charge_id: id,
|
|
584
|
+
total_amount: 200,
|
|
585
|
+
currency_code: 'EUR',
|
|
586
|
+
date: new Date('2024-02-15'),
|
|
587
|
+
vat_amount: 10, // Different VAT
|
|
588
|
+
}),
|
|
589
|
+
]);
|
|
590
|
+
}
|
|
591
|
+
if (id === ambiguousDoc2) {
|
|
592
|
+
return Promise.resolve([
|
|
593
|
+
createMockDocument({
|
|
594
|
+
charge_id: id,
|
|
595
|
+
total_amount: 200,
|
|
596
|
+
currency_code: 'EUR',
|
|
597
|
+
date: new Date('2024-02-15'),
|
|
598
|
+
vat_amount: 20, // Different VAT - but this won't affect matching score
|
|
599
|
+
}),
|
|
600
|
+
]);
|
|
601
|
+
}
|
|
602
|
+
return Promise.resolve([]);
|
|
603
|
+
}),
|
|
604
|
+
},
|
|
605
|
+
};
|
|
606
|
+
const mockInjector = {
|
|
607
|
+
get: vi.fn((token) => {
|
|
608
|
+
if (token.name === 'ChargesProvider')
|
|
609
|
+
return mockChargesProvider;
|
|
610
|
+
if (token.name === 'TransactionsProvider')
|
|
611
|
+
return mockTransactionsProvider;
|
|
612
|
+
if (token.name === 'DocumentsProvider')
|
|
613
|
+
return mockDocumentsProvider;
|
|
614
|
+
return null;
|
|
615
|
+
}),
|
|
616
|
+
};
|
|
617
|
+
mergeChargesExecutor.mockImplementation(() => Promise.resolve());
|
|
618
|
+
const provider = new ChargesMatcherProvider();
|
|
619
|
+
const result = await provider.autoMatchCharges({
|
|
620
|
+
adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID },
|
|
621
|
+
injector: mockInjector,
|
|
622
|
+
});
|
|
623
|
+
// Expected results:
|
|
624
|
+
// - perfectMatchTx finds perfectMatchDoc → merge (1)
|
|
625
|
+
// - perfectMatchDoc → already merged, skip processing
|
|
626
|
+
// - ambiguousTx finds 2 docs (ambiguousDoc1, ambiguousDoc2) → skipped due to ambiguity
|
|
627
|
+
// - ambiguousDoc1 finds ambiguousDoc2 (tx was skipped, not merged) → merge (2)
|
|
628
|
+
// - ambiguousDoc2 → already merged, skip processing
|
|
629
|
+
// - noMatchTx → no match, silent
|
|
630
|
+
// Total: 2 successful matches, 1 skipped charge (tx-ambiguous)
|
|
631
|
+
expect(result.totalMatches).toBe(2);
|
|
632
|
+
expect(result.mergedCharges).toHaveLength(2);
|
|
633
|
+
expect(result.skippedCharges).toHaveLength(1);
|
|
634
|
+
expect(result.skippedCharges[0]).toBe(ambiguousTx);
|
|
635
|
+
expect(mergeChargesExecutor).toHaveBeenCalledTimes(2);
|
|
636
|
+
});
|
|
637
|
+
it('should throw error if admin business ID not found in context', async () => {
|
|
638
|
+
const provider = new ChargesMatcherProvider();
|
|
639
|
+
await expect(provider.autoMatchCharges({
|
|
640
|
+
adminContext: { defaultAdminBusinessId: null },
|
|
641
|
+
})).rejects.toThrow(/Admin business not found/);
|
|
642
|
+
});
|
|
643
|
+
});
|
|
644
|
+
});
|
|
645
|
+
//# sourceMappingURL=auto-match-integration.test.js.map
|