@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,483 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { findMatches, } from '../providers/single-match.provider.js';
|
|
3
|
+
import { createMockTransaction, createMockDocument } from './test-helpers.js';
|
|
4
|
+
// Test user and business IDs
|
|
5
|
+
const USER_ID = 'user-123';
|
|
6
|
+
const BUSINESS_A = 'business-a';
|
|
7
|
+
const BUSINESS_B = 'business-b';
|
|
8
|
+
// Helper to create transaction charge
|
|
9
|
+
function createTxCharge(chargeId, transactions) {
|
|
10
|
+
return {
|
|
11
|
+
chargeId,
|
|
12
|
+
transactions,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
// Helper to create document charge
|
|
16
|
+
function createDocCharge(chargeId, documents) {
|
|
17
|
+
return {
|
|
18
|
+
chargeId,
|
|
19
|
+
documents,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
describe('Single-Match Provider', () => {
|
|
23
|
+
describe('findMatches', () => {
|
|
24
|
+
describe('Valid Transaction Charge → Finds Document Matches', () => {
|
|
25
|
+
it('should find matching document charges for transaction charge', () => {
|
|
26
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
27
|
+
createMockTransaction({
|
|
28
|
+
amount: "100",
|
|
29
|
+
currency: 'USD',
|
|
30
|
+
event_date: new Date('2024-01-15'),
|
|
31
|
+
}),
|
|
32
|
+
]);
|
|
33
|
+
const candidateCharges = [
|
|
34
|
+
createDocCharge('doc-charge-1', [
|
|
35
|
+
createMockDocument({
|
|
36
|
+
total_amount: 100,
|
|
37
|
+
currency_code: 'USD',
|
|
38
|
+
date: new Date('2024-01-15'),
|
|
39
|
+
}),
|
|
40
|
+
]),
|
|
41
|
+
createDocCharge('doc-charge-2', [
|
|
42
|
+
createMockDocument({
|
|
43
|
+
total_amount: 110,
|
|
44
|
+
currency_code: 'USD',
|
|
45
|
+
date: new Date('2024-01-16'),
|
|
46
|
+
}),
|
|
47
|
+
]),
|
|
48
|
+
];
|
|
49
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
50
|
+
expect(results).toHaveLength(2);
|
|
51
|
+
expect(results[0].chargeId).toBe('doc-charge-1'); // Perfect match
|
|
52
|
+
expect(results[0].confidenceScore).toBeGreaterThan(0.95);
|
|
53
|
+
expect(results[1].chargeId).toBe('doc-charge-2'); // Partial match
|
|
54
|
+
expect(results[1].confidenceScore).toBeLessThan(0.95);
|
|
55
|
+
});
|
|
56
|
+
it('should exclude transaction candidates when source is transaction', () => {
|
|
57
|
+
const sourceCharge = createTxCharge('tx-charge-1', [createMockTransaction()]);
|
|
58
|
+
const candidateCharges = [
|
|
59
|
+
createTxCharge('tx-charge-2', [createMockTransaction()]), // Should be excluded
|
|
60
|
+
createDocCharge('doc-charge-1', [createMockDocument()]), // Should be included
|
|
61
|
+
];
|
|
62
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
63
|
+
expect(results).toHaveLength(1);
|
|
64
|
+
expect(results[0].chargeId).toBe('doc-charge-1');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('Valid Document Charge → Finds Transaction Matches', () => {
|
|
68
|
+
it('should find matching transaction charges for document charge', () => {
|
|
69
|
+
const sourceCharge = createDocCharge('doc-charge-1', [
|
|
70
|
+
createMockDocument({
|
|
71
|
+
total_amount: 100,
|
|
72
|
+
currency_code: 'USD',
|
|
73
|
+
date: new Date('2024-01-15'),
|
|
74
|
+
}),
|
|
75
|
+
]);
|
|
76
|
+
const candidateCharges = [
|
|
77
|
+
createTxCharge('tx-charge-1', [
|
|
78
|
+
createMockTransaction({
|
|
79
|
+
amount: "100",
|
|
80
|
+
currency: 'USD',
|
|
81
|
+
event_date: new Date('2024-01-15'),
|
|
82
|
+
}),
|
|
83
|
+
]),
|
|
84
|
+
createTxCharge('tx-charge-2', [
|
|
85
|
+
createMockTransaction({
|
|
86
|
+
amount: "90",
|
|
87
|
+
currency: 'USD',
|
|
88
|
+
event_date: new Date('2024-01-16'),
|
|
89
|
+
}),
|
|
90
|
+
]),
|
|
91
|
+
];
|
|
92
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
93
|
+
expect(results).toHaveLength(2);
|
|
94
|
+
expect(results[0].chargeId).toBe('tx-charge-1'); // Perfect match
|
|
95
|
+
expect(results[1].chargeId).toBe('tx-charge-2'); // Partial match
|
|
96
|
+
});
|
|
97
|
+
it('should exclude document candidates when source is document', () => {
|
|
98
|
+
const sourceCharge = createDocCharge('doc-charge-1', [createMockDocument()]);
|
|
99
|
+
const candidateCharges = [
|
|
100
|
+
createDocCharge('doc-charge-2', [createMockDocument()]), // Should be excluded
|
|
101
|
+
createTxCharge('tx-charge-1', [createMockTransaction()]), // Should be included
|
|
102
|
+
];
|
|
103
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
104
|
+
expect(results).toHaveLength(1);
|
|
105
|
+
expect(results[0].chargeId).toBe('tx-charge-1');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe('Matched Charge Input → Throws Error', () => {
|
|
109
|
+
it('should throw error if source has both transactions and documents', () => {
|
|
110
|
+
const matchedCharge = {
|
|
111
|
+
chargeId: 'matched-charge',
|
|
112
|
+
transactions: [createMockTransaction()],
|
|
113
|
+
documents: [createMockDocument()],
|
|
114
|
+
};
|
|
115
|
+
expect(() => findMatches(matchedCharge, [], USER_ID)).toThrow(/already matched.*both transactions and documents/);
|
|
116
|
+
});
|
|
117
|
+
it('should throw error if source has neither transactions nor documents', () => {
|
|
118
|
+
const emptyCharge = {
|
|
119
|
+
chargeId: 'empty-charge',
|
|
120
|
+
transactions: [],
|
|
121
|
+
documents: [],
|
|
122
|
+
};
|
|
123
|
+
expect(() => findMatches(emptyCharge, [], USER_ID)).toThrow(/no transactions or documents/);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('Multiple Currencies in Source → Error Propagates', () => {
|
|
127
|
+
it('should throw error for source with mixed currencies', () => {
|
|
128
|
+
const mixedCurrencyCharge = createTxCharge('tx-charge-1', [
|
|
129
|
+
createMockTransaction({ currency: 'USD' }),
|
|
130
|
+
createMockTransaction({ currency: 'EUR' }),
|
|
131
|
+
]);
|
|
132
|
+
expect(() => findMatches(mixedCurrencyCharge, [], USER_ID)).toThrow(/failed validation.*multiple currencies/);
|
|
133
|
+
});
|
|
134
|
+
it('should throw error for source with multiple business IDs', () => {
|
|
135
|
+
const mixedBusinessCharge = createTxCharge('tx-charge-1', [
|
|
136
|
+
createMockTransaction({ business_id: BUSINESS_A }),
|
|
137
|
+
createMockTransaction({ business_id: BUSINESS_B }),
|
|
138
|
+
]);
|
|
139
|
+
expect(() => findMatches(mixedBusinessCharge, [], USER_ID)).toThrow(/failed validation.*multiple business/);
|
|
140
|
+
});
|
|
141
|
+
it('should throw error for source document with invalid business extraction', () => {
|
|
142
|
+
const invalidDocCharge = createDocCharge('doc-charge-1', [
|
|
143
|
+
createMockDocument({
|
|
144
|
+
creditor_id: 'other-user',
|
|
145
|
+
debtor_id: 'another-user',
|
|
146
|
+
}),
|
|
147
|
+
]);
|
|
148
|
+
expect(() => findMatches(invalidDocCharge, [], USER_ID)).toThrow(/failed validation/);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('No Candidates Found → Empty Array', () => {
|
|
152
|
+
it('should return empty array when no candidates provided', () => {
|
|
153
|
+
const sourceCharge = createTxCharge('tx-charge-1', [createMockTransaction()]);
|
|
154
|
+
const results = findMatches(sourceCharge, [], USER_ID);
|
|
155
|
+
expect(results).toEqual([]);
|
|
156
|
+
});
|
|
157
|
+
it('should return empty array when all candidates are same type', () => {
|
|
158
|
+
const sourceCharge = createTxCharge('tx-charge-1', [createMockTransaction()]);
|
|
159
|
+
const candidateCharges = [
|
|
160
|
+
createTxCharge('tx-charge-2', [createMockTransaction()]),
|
|
161
|
+
createTxCharge('tx-charge-3', [createMockTransaction()]),
|
|
162
|
+
];
|
|
163
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
164
|
+
expect(results).toEqual([]);
|
|
165
|
+
});
|
|
166
|
+
it('should return empty array when all candidates outside date window', () => {
|
|
167
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
168
|
+
createMockTransaction({ event_date: new Date('2024-01-15') }),
|
|
169
|
+
]);
|
|
170
|
+
const candidateCharges = [
|
|
171
|
+
createDocCharge('doc-charge-1', [
|
|
172
|
+
createMockDocument({ date: new Date('2023-01-01') }), // 1 year before
|
|
173
|
+
]),
|
|
174
|
+
createDocCharge('doc-charge-2', [
|
|
175
|
+
createMockDocument({ date: new Date('2025-02-01') }), // 1 year after
|
|
176
|
+
]),
|
|
177
|
+
];
|
|
178
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
179
|
+
expect(results).toEqual([]);
|
|
180
|
+
});
|
|
181
|
+
it('should return empty array when all candidates fail scoring', () => {
|
|
182
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
183
|
+
createMockTransaction({ currency: 'USD' }),
|
|
184
|
+
]);
|
|
185
|
+
// Candidates with mixed currencies will fail scoring
|
|
186
|
+
const candidateCharges = [
|
|
187
|
+
createDocCharge('doc-charge-1', [
|
|
188
|
+
createMockDocument({ currency_code: 'USD' }),
|
|
189
|
+
createMockDocument({ currency_code: 'EUR' }),
|
|
190
|
+
]),
|
|
191
|
+
];
|
|
192
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
193
|
+
expect(results).toEqual([]);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe('Candidate Count Handling', () => {
|
|
197
|
+
it('should return all candidates when fewer than 5', () => {
|
|
198
|
+
const sourceCharge = createTxCharge('tx-charge-1', [createMockTransaction()]);
|
|
199
|
+
const candidateCharges = [
|
|
200
|
+
createDocCharge('doc-charge-1', [createMockDocument()]),
|
|
201
|
+
createDocCharge('doc-charge-2', [createMockDocument()]),
|
|
202
|
+
createDocCharge('doc-charge-3', [createMockDocument()]),
|
|
203
|
+
];
|
|
204
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
205
|
+
expect(results).toHaveLength(3);
|
|
206
|
+
});
|
|
207
|
+
it('should return top 5 when more than 5 candidates', () => {
|
|
208
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
209
|
+
createMockTransaction({ amount: "100" }),
|
|
210
|
+
]);
|
|
211
|
+
const candidateCharges = [
|
|
212
|
+
createDocCharge('doc-charge-1', [createMockDocument({ total_amount: 100 })]), // Perfect
|
|
213
|
+
createDocCharge('doc-charge-2', [createMockDocument({ total_amount: 101 })]),
|
|
214
|
+
createDocCharge('doc-charge-3', [createMockDocument({ total_amount: 102 })]),
|
|
215
|
+
createDocCharge('doc-charge-4', [createMockDocument({ total_amount: 103 })]),
|
|
216
|
+
createDocCharge('doc-charge-5', [createMockDocument({ total_amount: 104 })]),
|
|
217
|
+
createDocCharge('doc-charge-6', [createMockDocument({ total_amount: 105 })]),
|
|
218
|
+
createDocCharge('doc-charge-7', [createMockDocument({ total_amount: 106 })]),
|
|
219
|
+
];
|
|
220
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
221
|
+
expect(results).toHaveLength(5);
|
|
222
|
+
expect(results[0].chargeId).toBe('doc-charge-1'); // Best match
|
|
223
|
+
});
|
|
224
|
+
it('should respect custom maxMatches option', () => {
|
|
225
|
+
const sourceCharge = createTxCharge('tx-charge-1', [createMockTransaction()]);
|
|
226
|
+
const candidateCharges = [
|
|
227
|
+
createDocCharge('doc-charge-1', [createMockDocument()]),
|
|
228
|
+
createDocCharge('doc-charge-2', [createMockDocument()]),
|
|
229
|
+
createDocCharge('doc-charge-3', [createMockDocument()]),
|
|
230
|
+
createDocCharge('doc-charge-4', [createMockDocument()]),
|
|
231
|
+
createDocCharge('doc-charge-5', [createMockDocument()]),
|
|
232
|
+
];
|
|
233
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID, { maxMatches: 3 });
|
|
234
|
+
expect(results).toHaveLength(3);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe('Tie-Breaking by Date Proximity', () => {
|
|
238
|
+
it('should use date proximity as tie-breaker when confidence scores equal', () => {
|
|
239
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
240
|
+
createMockTransaction({
|
|
241
|
+
amount: "100",
|
|
242
|
+
event_date: new Date('2024-01-15'),
|
|
243
|
+
}),
|
|
244
|
+
]);
|
|
245
|
+
// All have same amounts (same confidence), different dates
|
|
246
|
+
const candidateCharges = [
|
|
247
|
+
createDocCharge('doc-charge-far', [
|
|
248
|
+
createMockDocument({
|
|
249
|
+
total_amount: 100,
|
|
250
|
+
date: new Date('2024-01-05'), // 10 days away
|
|
251
|
+
}),
|
|
252
|
+
]),
|
|
253
|
+
createDocCharge('doc-charge-close', [
|
|
254
|
+
createMockDocument({
|
|
255
|
+
total_amount: 100,
|
|
256
|
+
date: new Date('2024-01-14'), // 1 day away
|
|
257
|
+
}),
|
|
258
|
+
]),
|
|
259
|
+
createDocCharge('doc-charge-medium', [
|
|
260
|
+
createMockDocument({
|
|
261
|
+
total_amount: 100,
|
|
262
|
+
date: new Date('2024-01-10'), // 5 days away
|
|
263
|
+
}),
|
|
264
|
+
]),
|
|
265
|
+
];
|
|
266
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
267
|
+
expect(results[0].chargeId).toBe('doc-charge-close'); // Closest date wins
|
|
268
|
+
expect(results[1].chargeId).toBe('doc-charge-medium');
|
|
269
|
+
expect(results[2].chargeId).toBe('doc-charge-far');
|
|
270
|
+
});
|
|
271
|
+
it('should include dateProximity in results', () => {
|
|
272
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
273
|
+
createMockTransaction({ event_date: new Date('2024-01-15') }),
|
|
274
|
+
]);
|
|
275
|
+
const candidateCharges = [
|
|
276
|
+
createDocCharge('doc-charge-1', [
|
|
277
|
+
createMockDocument({ date: new Date('2024-01-14') }), // 1 day
|
|
278
|
+
]),
|
|
279
|
+
];
|
|
280
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
281
|
+
expect(results[0].dateProximity).toBe(1);
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
describe('Date Window Filtering', () => {
|
|
285
|
+
it('should filter candidates outside 12-month window by default', () => {
|
|
286
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
287
|
+
createMockTransaction({ event_date: new Date('2024-01-15') }),
|
|
288
|
+
]);
|
|
289
|
+
const candidateCharges = [
|
|
290
|
+
createDocCharge('doc-inside', [
|
|
291
|
+
createMockDocument({ date: new Date('2024-06-15') }), // 5 months
|
|
292
|
+
]),
|
|
293
|
+
createDocCharge('doc-outside', [
|
|
294
|
+
createMockDocument({ date: new Date('2025-02-15') }), // 13 months
|
|
295
|
+
]),
|
|
296
|
+
];
|
|
297
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
298
|
+
expect(results).toHaveLength(1);
|
|
299
|
+
expect(results[0].chargeId).toBe('doc-inside');
|
|
300
|
+
});
|
|
301
|
+
it('should respect custom dateWindowMonths option', () => {
|
|
302
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
303
|
+
createMockTransaction({ event_date: new Date('2024-01-15') }),
|
|
304
|
+
]);
|
|
305
|
+
const candidateCharges = [
|
|
306
|
+
createDocCharge('doc-inside', [
|
|
307
|
+
createMockDocument({ date: new Date('2024-03-15') }), // 2 months
|
|
308
|
+
]),
|
|
309
|
+
createDocCharge('doc-outside', [
|
|
310
|
+
createMockDocument({ date: new Date('2024-05-15') }), // 4 months
|
|
311
|
+
]),
|
|
312
|
+
];
|
|
313
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID, {
|
|
314
|
+
dateWindowMonths: 3,
|
|
315
|
+
});
|
|
316
|
+
expect(results).toHaveLength(1);
|
|
317
|
+
expect(results[0].chargeId).toBe('doc-inside');
|
|
318
|
+
});
|
|
319
|
+
it('should include candidates on exact window boundary', () => {
|
|
320
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
321
|
+
createMockTransaction({ event_date: new Date('2024-01-15') }),
|
|
322
|
+
]);
|
|
323
|
+
const candidateCharges = [
|
|
324
|
+
createDocCharge('doc-boundary', [
|
|
325
|
+
createMockDocument({ date: new Date('2025-01-15') }), // Exactly 12 months
|
|
326
|
+
]),
|
|
327
|
+
];
|
|
328
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
329
|
+
expect(results).toHaveLength(1);
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
describe('Fee Transactions Excluded', () => {
|
|
333
|
+
it('should handle source with fee transactions via aggregator', () => {
|
|
334
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
335
|
+
createMockTransaction({ amount: "100", is_fee: false }),
|
|
336
|
+
createMockTransaction({ amount: "5", is_fee: true }), // Should be excluded by aggregator
|
|
337
|
+
]);
|
|
338
|
+
const candidateCharges = [
|
|
339
|
+
createDocCharge('doc-charge-1', [createMockDocument({ total_amount: 100 })]),
|
|
340
|
+
];
|
|
341
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
342
|
+
expect(results).toHaveLength(1);
|
|
343
|
+
expect(results[0].confidenceScore).toBeGreaterThan(0.95); // Matches 100, not 105
|
|
344
|
+
});
|
|
345
|
+
it('should throw error if all source transactions are fees', () => {
|
|
346
|
+
const allFeesCharge = createTxCharge('tx-charge-1', [
|
|
347
|
+
createMockTransaction({ is_fee: true }),
|
|
348
|
+
createMockTransaction({ is_fee: true }),
|
|
349
|
+
]);
|
|
350
|
+
expect(() => findMatches(allFeesCharge, [], USER_ID)).toThrow(/all transactions are marked as fees/);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
describe('Same ChargeId → Throws Error', () => {
|
|
354
|
+
it('should throw error when candidate has same chargeId as source', () => {
|
|
355
|
+
const sourceCharge = createTxCharge('same-charge-id', [createMockTransaction()]);
|
|
356
|
+
const candidateCharges = [
|
|
357
|
+
createDocCharge('same-charge-id', [createMockDocument()]), // Same ID!
|
|
358
|
+
];
|
|
359
|
+
expect(() => findMatches(sourceCharge, candidateCharges, USER_ID)).toThrow(/same ID as source charge/);
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
describe('Various Confidence Levels', () => {
|
|
363
|
+
it('should rank matches by confidence level correctly', () => {
|
|
364
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
365
|
+
createMockTransaction({
|
|
366
|
+
amount: "100",
|
|
367
|
+
currency: 'USD',
|
|
368
|
+
event_date: new Date('2024-01-15'),
|
|
369
|
+
business_id: BUSINESS_A,
|
|
370
|
+
}),
|
|
371
|
+
]);
|
|
372
|
+
const candidateCharges = [
|
|
373
|
+
// Perfect match - all fields align
|
|
374
|
+
createDocCharge('perfect', [
|
|
375
|
+
createMockDocument({
|
|
376
|
+
total_amount: 100,
|
|
377
|
+
currency_code: 'USD',
|
|
378
|
+
date: new Date('2024-01-15'),
|
|
379
|
+
creditor_id: BUSINESS_A,
|
|
380
|
+
debtor_id: USER_ID,
|
|
381
|
+
}),
|
|
382
|
+
]),
|
|
383
|
+
// Good match - date difference
|
|
384
|
+
createDocCharge('good', [
|
|
385
|
+
createMockDocument({
|
|
386
|
+
total_amount: 100,
|
|
387
|
+
currency_code: 'USD',
|
|
388
|
+
date: new Date('2024-01-20'), // 5 days off
|
|
389
|
+
creditor_id: BUSINESS_A,
|
|
390
|
+
debtor_id: USER_ID,
|
|
391
|
+
}),
|
|
392
|
+
]),
|
|
393
|
+
// Medium match - slight amount difference
|
|
394
|
+
createDocCharge('medium', [
|
|
395
|
+
createMockDocument({
|
|
396
|
+
total_amount: 100.5,
|
|
397
|
+
currency_code: 'USD',
|
|
398
|
+
date: new Date('2024-01-15'),
|
|
399
|
+
creditor_id: BUSINESS_A,
|
|
400
|
+
debtor_id: USER_ID,
|
|
401
|
+
}),
|
|
402
|
+
]),
|
|
403
|
+
// Poor match - business mismatch
|
|
404
|
+
createDocCharge('poor', [
|
|
405
|
+
createMockDocument({
|
|
406
|
+
total_amount: 100,
|
|
407
|
+
currency_code: 'USD',
|
|
408
|
+
date: new Date('2024-01-15'),
|
|
409
|
+
creditor_id: BUSINESS_B, // Different business
|
|
410
|
+
debtor_id: USER_ID,
|
|
411
|
+
}),
|
|
412
|
+
]),
|
|
413
|
+
];
|
|
414
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
415
|
+
expect(results).toHaveLength(4);
|
|
416
|
+
expect(results[0].chargeId).toBe('perfect');
|
|
417
|
+
expect(results[0].confidenceScore).toBeGreaterThan(0.95);
|
|
418
|
+
expect(results[1].chargeId).toBe('good');
|
|
419
|
+
expect(results[2].chargeId).toBe('medium');
|
|
420
|
+
expect(results[3].chargeId).toBe('poor');
|
|
421
|
+
});
|
|
422
|
+
it('should include component scores in results', () => {
|
|
423
|
+
const sourceCharge = createTxCharge('tx-charge-1', [createMockTransaction()]);
|
|
424
|
+
const candidateCharges = [
|
|
425
|
+
createDocCharge('doc-charge-1', [createMockDocument()]),
|
|
426
|
+
];
|
|
427
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
428
|
+
expect(results[0].components).toBeDefined();
|
|
429
|
+
expect(results[0].components.amount).toBeGreaterThanOrEqual(0);
|
|
430
|
+
expect(results[0].components.currency).toBeGreaterThanOrEqual(0);
|
|
431
|
+
expect(results[0].components.business).toBeGreaterThanOrEqual(0);
|
|
432
|
+
expect(results[0].components.date).toBeGreaterThanOrEqual(0);
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
describe('Edge Cases', () => {
|
|
436
|
+
it('should handle multiple transactions in source charge', () => {
|
|
437
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
438
|
+
createMockTransaction({ amount: "50" }),
|
|
439
|
+
createMockTransaction({ amount: "50" }),
|
|
440
|
+
]);
|
|
441
|
+
const candidateCharges = [
|
|
442
|
+
createDocCharge('doc-charge-1', [createMockDocument({ total_amount: 100 })]),
|
|
443
|
+
];
|
|
444
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
445
|
+
expect(results).toHaveLength(1);
|
|
446
|
+
expect(results[0].confidenceScore).toBeGreaterThan(0.95); // 50+50 = 100
|
|
447
|
+
});
|
|
448
|
+
it('should handle multiple documents in candidate charge', () => {
|
|
449
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
450
|
+
createMockTransaction({ amount: "100" }),
|
|
451
|
+
]);
|
|
452
|
+
const candidateCharges = [
|
|
453
|
+
createDocCharge('doc-charge-1', [
|
|
454
|
+
createMockDocument({ total_amount: 60 }),
|
|
455
|
+
createMockDocument({ total_amount: 40 }),
|
|
456
|
+
]),
|
|
457
|
+
];
|
|
458
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
459
|
+
expect(results).toHaveLength(1);
|
|
460
|
+
expect(results[0].confidenceScore).toBeGreaterThan(0.95); // 60+40 = 100
|
|
461
|
+
});
|
|
462
|
+
it('should handle negative amounts (credit transactions)', () => {
|
|
463
|
+
const sourceCharge = createTxCharge('tx-charge-1', [
|
|
464
|
+
createMockTransaction({ amount: "-100" }),
|
|
465
|
+
]);
|
|
466
|
+
const candidateCharges = [
|
|
467
|
+
createDocCharge('doc-charge-1', [
|
|
468
|
+
createMockDocument({
|
|
469
|
+
total_amount: 100,
|
|
470
|
+
type: 'CREDIT_INVOICE',
|
|
471
|
+
creditor_id: USER_ID, // User is creditor for credit invoice
|
|
472
|
+
debtor_id: BUSINESS_A,
|
|
473
|
+
}),
|
|
474
|
+
]),
|
|
475
|
+
];
|
|
476
|
+
const results = findMatches(sourceCharge, candidateCharges, USER_ID);
|
|
477
|
+
expect(results).toHaveLength(1);
|
|
478
|
+
expect(results[0].confidenceScore).toBeGreaterThan(0.9);
|
|
479
|
+
});
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
//# sourceMappingURL=single-match.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-match.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/single-match.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,WAAW,GACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,6BAA6B;AAC7B,MAAM,OAAO,GAAG,UAAU,CAAC;AAC3B,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,sCAAsC;AACtC,SAAS,cAAc,CACrB,QAAgB,EAChB,YAA2B;IAE3B,OAAO;QACL,QAAQ;QACR,YAAY;KACb,CAAC;AACJ,CAAC;AAED,mCAAmC;AACnC,SAAS,eAAe,CACtB,QAAgB,EAChB,SAAqB;IAErB,OAAO;QACL,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;YACjE,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;gBACtE,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC;wBACpB,MAAM,EAAE,KAAK;wBACb,QAAQ,EAAE,KAAK;wBACf,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;qBACnC,CAAC;iBACH,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,aAAa,EAAE,KAAK;4BACpB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;yBAC7B,CAAC;qBACH,CAAC;oBACF,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,aAAa,EAAE,KAAK;4BACpB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;yBAC7B,CAAC;qBACH,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB;gBAClE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB;gBAClE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;gBAC1E,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;gBAE9E,MAAM,gBAAgB,GAAG;oBACvB,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,qBAAqB;oBAC/E,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,qBAAqB;iBAC/E,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;YACjE,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;gBACtE,MAAM,YAAY,GAAG,eAAe,CAAC,cAAc,EAAE;oBACnD,kBAAkB,CAAC;wBACjB,YAAY,EAAE,GAAG;wBACjB,aAAa,EAAE,KAAK;wBACpB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;qBAC7B,CAAC;iBACH,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,cAAc,CAAC,aAAa,EAAE;wBAC5B,qBAAqB,CAAC;4BACpB,MAAM,EAAE,KAAK;4BACb,QAAQ,EAAE,KAAK;4BACf,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;yBACnC,CAAC;qBACH,CAAC;oBACF,cAAc,CAAC,aAAa,EAAE;wBAC5B,qBAAqB,CAAC;4BACpB,MAAM,EAAE,IAAI;4BACZ,QAAQ,EAAE,KAAK;4BACf,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;yBACnC,CAAC;qBACH,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB;gBACjE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB;YACnE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;gBACpE,MAAM,YAAY,GAAG,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;gBAE7E,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,qBAAqB;oBAC9E,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,qBAAqB;iBAChF,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;YACnD,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;gBAC1E,MAAM,aAAa,GAAG;oBACpB,QAAQ,EAAE,gBAAgB;oBAC1B,YAAY,EAAE,CAAC,qBAAqB,EAAE,CAAC;oBACvC,SAAS,EAAE,CAAC,kBAAkB,EAAE,CAAC;iBAC3B,CAAC;gBAET,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAC3D,kDAAkD,CACnD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;gBAC7E,MAAM,WAAW,GAAG;oBAClB,QAAQ,EAAE,cAAc;oBACxB,YAAY,EAAE,EAAE;oBAChB,SAAS,EAAE,EAAE;iBACP,CAAC;gBAET,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CACzD,8BAA8B,CAC/B,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAChE,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;gBAC7D,MAAM,mBAAmB,GAAG,cAAc,CAAC,aAAa,EAAE;oBACxD,qBAAqB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;oBAC1C,qBAAqB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;iBAC3C,CAAC,CAAC;gBAEH,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CACjE,wCAAwC,CACzC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;gBAClE,MAAM,mBAAmB,GAAG,cAAc,CAAC,aAAa,EAAE;oBACxD,qBAAqB,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;oBAClD,qBAAqB,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;iBACnD,CAAC,CAAC;gBAEH,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CACjE,sCAAsC,CACvC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;gBACjF,MAAM,gBAAgB,GAAG,eAAe,CAAC,cAAc,EAAE;oBACvD,kBAAkB,CAAC;wBACjB,WAAW,EAAE,YAAY;wBACzB,SAAS,EAAE,cAAc;qBAC1B,CAAC;iBACH,CAAC,CAAC;gBAEH,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACxF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;YACjD,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;gBAC/D,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;gBAE9E,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;gBAEvD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;gBACrE,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;gBAE9E,MAAM,gBAAgB,GAAG;oBACvB,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;oBACxD,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;iBACzD,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;gBAC3E,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;iBAC9D,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,gBAAgB;qBACvE,CAAC;oBACF,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,eAAe;qBACtE,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;gBACpE,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;iBAC3C,CAAC,CAAC;gBAEH,qDAAqD;gBACrD,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;wBAC5C,kBAAkB,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;qBAC7C,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;gBACxD,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;gBAE9E,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACvD,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACvD,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;iBACxD,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;gBACzD,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;iBACzC,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU;oBACxF,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC5E,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC5E,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC5E,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC5E,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC5E,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;iBAC7E,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa;YACjE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;gBACjD,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;gBAE9E,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACvD,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACvD,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACvD,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACvD,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;iBACxD,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;gBAExF,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;YAC9C,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;gBAC/E,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC;wBACpB,MAAM,EAAE,KAAK;wBACb,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;qBACnC,CAAC;iBACH,CAAC,CAAC;gBAEH,2DAA2D;gBAC3D,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,gBAAgB,EAAE;wBAChC,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,eAAe;yBAC9C,CAAC;qBACH,CAAC;oBACF,eAAe,CAAC,kBAAkB,EAAE;wBAClC,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,aAAa;yBAC5C,CAAC;qBACH,CAAC;oBACF,eAAe,CAAC,mBAAmB,EAAE;wBACnC,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,cAAc;yBAC7C,CAAC;qBACH,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB;gBAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBACtD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;gBACjD,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;iBAC9D,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,QAAQ;qBAC/D,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACrC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;gBACrE,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;iBAC9D,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,YAAY,EAAE;wBAC5B,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,WAAW;qBAClE,CAAC;oBACF,eAAe,CAAC,aAAa,EAAE;wBAC7B,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,YAAY;qBACnE,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;gBACvD,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;iBAC9D,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,YAAY,EAAE;wBAC5B,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,WAAW;qBAClE,CAAC;oBACF,eAAe,CAAC,aAAa,EAAE;wBAC7B,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,WAAW;qBAClE,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE;oBACnE,gBAAgB,EAAE,CAAC;iBACpB,CAAC,CAAC;gBAEH,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;gBAC5D,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;iBAC9D,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,oBAAoB;qBAC3E,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACzC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;gBACnE,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;oBACvD,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,mCAAmC;iBAC1F,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;iBAC7E,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB;YACnF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;gBAChE,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa,EAAE;oBAClD,qBAAqB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;oBACvC,qBAAqB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;iBACxC,CAAC,CAAC;gBAEH,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAC3D,qCAAqC,CACtC,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;YAC5C,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;gBACvE,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;gBAEjF,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,gBAAgB,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,WAAW;iBACvE,CAAC;gBAEF,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CACxE,0BAA0B,CAC3B,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACzC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;gBAC3D,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC;wBACpB,MAAM,EAAE,KAAK;wBACb,QAAQ,EAAE,KAAK;wBACf,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;wBAClC,WAAW,EAAE,UAAU;qBACxB,CAAC;iBACH,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,mCAAmC;oBACnC,eAAe,CAAC,SAAS,EAAE;wBACzB,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,aAAa,EAAE,KAAK;4BACpB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;4BAC5B,WAAW,EAAE,UAAU;4BACvB,SAAS,EAAE,OAAO;yBACnB,CAAC;qBACH,CAAC;oBACF,+BAA+B;oBAC/B,eAAe,CAAC,MAAM,EAAE;wBACtB,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,aAAa,EAAE,KAAK;4BACpB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,aAAa;4BAC3C,WAAW,EAAE,UAAU;4BACvB,SAAS,EAAE,OAAO;yBACnB,CAAC;qBACH,CAAC;oBACF,0CAA0C;oBAC1C,eAAe,CAAC,QAAQ,EAAE;wBACxB,kBAAkB,CAAC;4BACjB,YAAY,EAAE,KAAK;4BACnB,aAAa,EAAE,KAAK;4BACpB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;4BAC5B,WAAW,EAAE,UAAU;4BACvB,SAAS,EAAE,OAAO;yBACnB,CAAC;qBACH,CAAC;oBACF,iCAAiC;oBACjC,eAAe,CAAC,MAAM,EAAE;wBACtB,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,aAAa,EAAE,KAAK;4BACpB,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;4BAC5B,WAAW,EAAE,UAAU,EAAE,qBAAqB;4BAC9C,SAAS,EAAE,OAAO;yBACnB,CAAC;qBACH,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;gBACpD,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;gBAE9E,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;iBACxD,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBACjE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBACjE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;YAC1B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;gBAC9D,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;oBACvC,qBAAqB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;iBACxC,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;iBAC7E,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;YAC1E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;gBAC9D,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;iBACzC,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;wBACxC,kBAAkB,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;qBACzC,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;YAC1E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;gBAC9D,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE;oBACjD,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;iBAC1C,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG;oBACvB,eAAe,CAAC,cAAc,EAAE;wBAC9B,kBAAkB,CAAC;4BACjB,YAAY,EAAE,GAAG;4BACjB,IAAI,EAAE,gBAAgB;4BACtB,WAAW,EAAE,OAAO,EAAE,sCAAsC;4BAC5D,SAAS,EAAE,UAAU;yBACtB,CAAC;qBACH,CAAC;iBACH,CAAC;gBAEF,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Transaction, Document, ChargeMatch, AggregatedTransaction, AggregatedDocument, ConfidenceScores } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Factory for creating mock transactions for testing
|
|
4
|
+
*/
|
|
5
|
+
export declare function createMockTransaction(overrides?: Partial<Transaction>): Transaction;
|
|
6
|
+
/**
|
|
7
|
+
* Factory for creating mock documents for testing
|
|
8
|
+
*/
|
|
9
|
+
export declare function createMockDocument(overrides?: Partial<Document>): Document;
|
|
10
|
+
/**
|
|
11
|
+
* Factory for creating mock aggregated transaction data
|
|
12
|
+
*/
|
|
13
|
+
export declare function createMockAggregatedTransaction(overrides?: Partial<AggregatedTransaction>): AggregatedTransaction;
|
|
14
|
+
/**
|
|
15
|
+
* Factory for creating mock aggregated document data
|
|
16
|
+
*/
|
|
17
|
+
export declare function createMockAggregatedDocument(overrides?: Partial<AggregatedDocument>): AggregatedDocument;
|
|
18
|
+
/**
|
|
19
|
+
* Factory for creating mock confidence scores
|
|
20
|
+
*/
|
|
21
|
+
export declare function createMockConfidenceScores(overrides?: Partial<ConfidenceScores>): ConfidenceScores;
|
|
22
|
+
/**
|
|
23
|
+
* Factory for creating mock charge matches
|
|
24
|
+
*/
|
|
25
|
+
export declare function createMockChargeMatch(overrides?: Partial<ChargeMatch>): ChargeMatch;
|
|
26
|
+
/**
|
|
27
|
+
* Helper to calculate expected overall confidence score
|
|
28
|
+
* Formula: (amount × 0.4) + (currency × 0.2) + (business × 0.3) + (date × 0.1)
|
|
29
|
+
*/
|
|
30
|
+
export declare function calculateExpectedConfidence(scores: ConfidenceScores): number;
|
|
31
|
+
/**
|
|
32
|
+
* Helper to round confidence score to 2 decimal places
|
|
33
|
+
*/
|
|
34
|
+
export declare function roundConfidence(score: number): number;
|
|
35
|
+
/**
|
|
36
|
+
* Helper to validate a confidence score is within valid range
|
|
37
|
+
*/
|
|
38
|
+
export declare function isValidConfidenceScore(score: number): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Helper to check if a date is within N days of another date
|
|
41
|
+
*/
|
|
42
|
+
export declare function isWithinDays(date1: Date, date2: Date, days: number): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Helper to calculate days difference between two dates
|
|
45
|
+
*/
|
|
46
|
+
export declare function daysDifference(date1: Date, date2: Date): number;
|