@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,174 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Transaction,
|
|
3
|
+
Document,
|
|
4
|
+
ChargeMatch,
|
|
5
|
+
AggregatedTransaction,
|
|
6
|
+
AggregatedDocument,
|
|
7
|
+
ConfidenceScores,
|
|
8
|
+
} from '../types.js';
|
|
9
|
+
import type { currency, document_type } from '@modules/documents/types.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Factory for creating mock transactions for testing
|
|
13
|
+
*/
|
|
14
|
+
export function createMockTransaction(overrides: Partial<Transaction> = {}): Transaction {
|
|
15
|
+
const defaultTransaction: Transaction = {
|
|
16
|
+
id: `tx-${Math.random()}`,
|
|
17
|
+
account_id: 'account-1',
|
|
18
|
+
charge_id: 'charge-1',
|
|
19
|
+
source_id: 'source-1',
|
|
20
|
+
source_description: 'Test transaction',
|
|
21
|
+
currency: 'USD' as currency,
|
|
22
|
+
event_date: new Date('2024-01-15'),
|
|
23
|
+
debit_date: new Date('2024-01-16'),
|
|
24
|
+
debit_date_override: null,
|
|
25
|
+
debit_timestamp: new Date('2024-01-16T10:00:00Z'),
|
|
26
|
+
amount: '100.00',
|
|
27
|
+
current_balance: '1000.00',
|
|
28
|
+
business_id: 'business-a',
|
|
29
|
+
created_at: new Date('2024-01-15T08:00:00Z'),
|
|
30
|
+
updated_at: new Date('2024-01-15T08:00:00Z'),
|
|
31
|
+
is_fee: false,
|
|
32
|
+
counter_account: 'counter-1',
|
|
33
|
+
currency_rate: '1.0',
|
|
34
|
+
origin_key: 'test-origin',
|
|
35
|
+
source_origin: 'test-bank',
|
|
36
|
+
source_reference: 'test-ref-001',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return { ...defaultTransaction, ...overrides };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Factory for creating mock documents for testing
|
|
44
|
+
*/
|
|
45
|
+
export function createMockDocument(overrides: Partial<Document> = {}): Document {
|
|
46
|
+
const defaultDocument: Document = {
|
|
47
|
+
id: `doc-${Math.random()}`,
|
|
48
|
+
charge_id: 'charge-1',
|
|
49
|
+
creditor_id: 'business-a',
|
|
50
|
+
debtor_id: 'user-123',
|
|
51
|
+
currency_code: 'USD' as currency,
|
|
52
|
+
date: new Date('2024-01-14'),
|
|
53
|
+
total_amount: 100.0,
|
|
54
|
+
type: 'INVOICE' as document_type,
|
|
55
|
+
vat_amount: 17.0,
|
|
56
|
+
no_vat_amount: '83.00',
|
|
57
|
+
serial_number: 'INV-001',
|
|
58
|
+
is_reviewed: false,
|
|
59
|
+
created_at: new Date('2024-01-14T08:00:00Z'),
|
|
60
|
+
modified_at: new Date('2024-01-14T08:00:00Z'),
|
|
61
|
+
image_url: null,
|
|
62
|
+
file_url: null,
|
|
63
|
+
allocation_number: null,
|
|
64
|
+
exchange_rate_override: null,
|
|
65
|
+
file_hash: null,
|
|
66
|
+
vat_report_date_override: null,
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return { ...defaultDocument, ...overrides };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Factory for creating mock aggregated transaction data
|
|
74
|
+
*/
|
|
75
|
+
export function createMockAggregatedTransaction(
|
|
76
|
+
overrides: Partial<AggregatedTransaction> = {},
|
|
77
|
+
): AggregatedTransaction {
|
|
78
|
+
const defaultAggregated: AggregatedTransaction = {
|
|
79
|
+
amount: 100.0,
|
|
80
|
+
currency: 'USD' as currency,
|
|
81
|
+
businessId: 'business-a',
|
|
82
|
+
date: new Date('2024-01-15'),
|
|
83
|
+
debitDate: new Date('2024-01-16'),
|
|
84
|
+
description: 'Test transaction',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return { ...defaultAggregated, ...overrides };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Factory for creating mock aggregated document data
|
|
92
|
+
*/
|
|
93
|
+
export function createMockAggregatedDocument(
|
|
94
|
+
overrides: Partial<AggregatedDocument> = {},
|
|
95
|
+
): AggregatedDocument {
|
|
96
|
+
const defaultAggregated: AggregatedDocument = {
|
|
97
|
+
amount: 100.0,
|
|
98
|
+
currency: 'USD' as currency,
|
|
99
|
+
businessId: 'business-a',
|
|
100
|
+
date: new Date('2024-01-14'),
|
|
101
|
+
description: 'INV-001',
|
|
102
|
+
type: 'INVOICE' as document_type,
|
|
103
|
+
businessIsCreditor: false,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
return { ...defaultAggregated, ...overrides };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Factory for creating mock confidence scores
|
|
111
|
+
*/
|
|
112
|
+
export function createMockConfidenceScores(
|
|
113
|
+
overrides: Partial<ConfidenceScores> = {},
|
|
114
|
+
): ConfidenceScores {
|
|
115
|
+
const defaultScores: ConfidenceScores = {
|
|
116
|
+
amount: 1.0,
|
|
117
|
+
currency: 1.0,
|
|
118
|
+
business: 1.0,
|
|
119
|
+
date: 1.0,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
return { ...defaultScores, ...overrides };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Factory for creating mock charge matches
|
|
127
|
+
*/
|
|
128
|
+
export function createMockChargeMatch(overrides: Partial<ChargeMatch> = {}): ChargeMatch {
|
|
129
|
+
const defaultMatch: ChargeMatch = {
|
|
130
|
+
chargeId: '00000000-0000-0000-0000-000000000099',
|
|
131
|
+
confidenceScore: 0.95,
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
return { ...defaultMatch, ...overrides };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Helper to calculate expected overall confidence score
|
|
139
|
+
* Formula: (amount × 0.4) + (currency × 0.2) + (business × 0.3) + (date × 0.1)
|
|
140
|
+
*/
|
|
141
|
+
export function calculateExpectedConfidence(scores: ConfidenceScores): number {
|
|
142
|
+
return scores.amount * 0.4 + scores.currency * 0.2 + scores.business * 0.3 + scores.date * 0.1;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Helper to round confidence score to 2 decimal places
|
|
147
|
+
*/
|
|
148
|
+
export function roundConfidence(score: number): number {
|
|
149
|
+
return Math.round(score * 100) / 100;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Helper to validate a confidence score is within valid range
|
|
154
|
+
*/
|
|
155
|
+
export function isValidConfidenceScore(score: number): boolean {
|
|
156
|
+
return score >= 0.0 && score <= 1.0;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Helper to check if a date is within N days of another date
|
|
161
|
+
*/
|
|
162
|
+
export function isWithinDays(date1: Date, date2: Date, days: number): boolean {
|
|
163
|
+
const diffMs = Math.abs(date1.getTime() - date2.getTime());
|
|
164
|
+
const diffDays = diffMs / (1000 * 60 * 60 * 24);
|
|
165
|
+
return diffDays <= days;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Helper to calculate days difference between two dates
|
|
170
|
+
*/
|
|
171
|
+
export function daysDifference(date1: Date, date2: Date): number {
|
|
172
|
+
const diffMs = Math.abs(date1.getTime() - date2.getTime());
|
|
173
|
+
return Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
174
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
createMockTransaction,
|
|
4
|
+
createMockDocument,
|
|
5
|
+
createMockAggregatedTransaction,
|
|
6
|
+
createMockAggregatedDocument,
|
|
7
|
+
createMockConfidenceScores,
|
|
8
|
+
calculateExpectedConfidence,
|
|
9
|
+
roundConfidence,
|
|
10
|
+
isValidConfidenceScore,
|
|
11
|
+
daysDifference,
|
|
12
|
+
isWithinDays,
|
|
13
|
+
} from './test-helpers.js';
|
|
14
|
+
|
|
15
|
+
describe('Charges Matcher - Test Infrastructure', () => {
|
|
16
|
+
describe('Mock Factories', () => {
|
|
17
|
+
it('should create a valid mock transaction with defaults', () => {
|
|
18
|
+
const transaction = createMockTransaction();
|
|
19
|
+
|
|
20
|
+
expect(transaction.id).toBeDefined();
|
|
21
|
+
expect(transaction.charge_id).toBeDefined();
|
|
22
|
+
expect(transaction.amount).toBe('100.00');
|
|
23
|
+
expect(transaction.currency).toBe('USD');
|
|
24
|
+
expect(transaction.is_fee).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should create a mock transaction with overrides', () => {
|
|
28
|
+
const transaction = createMockTransaction({
|
|
29
|
+
amount: '250.00',
|
|
30
|
+
currency: 'USD',
|
|
31
|
+
is_fee: true,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
expect(transaction.amount).toBe('250.00');
|
|
35
|
+
expect(transaction.currency).toBe('USD');
|
|
36
|
+
expect(transaction.is_fee).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should create a valid mock document with defaults', () => {
|
|
40
|
+
const document = createMockDocument();
|
|
41
|
+
|
|
42
|
+
expect(document.id).toBeDefined();
|
|
43
|
+
expect(document.charge_id).toBeDefined();
|
|
44
|
+
expect(document.total_amount).toBe(100.0);
|
|
45
|
+
expect(document.currency_code).toBe('USD');
|
|
46
|
+
expect(document.type).toBe('INVOICE');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should create a mock document with overrides', () => {
|
|
50
|
+
const document = createMockDocument({
|
|
51
|
+
total_amount: 500.0,
|
|
52
|
+
type: 'RECEIPT',
|
|
53
|
+
serial_number: 'REC-123',
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
expect(document.total_amount).toBe(500.0);
|
|
57
|
+
expect(document.type).toBe('RECEIPT');
|
|
58
|
+
expect(document.serial_number).toBe('REC-123');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should create aggregated transaction data', () => {
|
|
62
|
+
const aggregated = createMockAggregatedTransaction({
|
|
63
|
+
amount: 150.0,
|
|
64
|
+
description: 'Payment for services',
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
expect(aggregated.amount).toBe(150.0);
|
|
68
|
+
expect(aggregated.description).toBe('Payment for services');
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('should create aggregated document data', () => {
|
|
72
|
+
const aggregated = createMockAggregatedDocument({
|
|
73
|
+
amount: 200.0,
|
|
74
|
+
businessIsCreditor: true,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
expect(aggregated.amount).toBe(200.0);
|
|
78
|
+
expect(aggregated.businessIsCreditor).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('Confidence Calculation Helpers', () => {
|
|
83
|
+
it('should calculate expected confidence with perfect scores', () => {
|
|
84
|
+
const scores = createMockConfidenceScores({
|
|
85
|
+
amount: 1.0,
|
|
86
|
+
currency: 1.0,
|
|
87
|
+
business: 1.0,
|
|
88
|
+
date: 1.0,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const confidence = calculateExpectedConfidence(scores);
|
|
92
|
+
expect(confidence).toBeCloseTo(1.0, 10);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('should calculate expected confidence with mixed scores', () => {
|
|
96
|
+
const scores = createMockConfidenceScores({
|
|
97
|
+
amount: 0.9, // 40% weight
|
|
98
|
+
currency: 1.0, // 20% weight
|
|
99
|
+
business: 0.5, // 30% weight
|
|
100
|
+
date: 0.8, // 10% weight
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// (0.9 * 0.4) + (1.0 * 0.2) + (0.5 * 0.3) + (0.8 * 0.1)
|
|
104
|
+
// = 0.36 + 0.2 + 0.15 + 0.08 = 0.79
|
|
105
|
+
const confidence = calculateExpectedConfidence(scores);
|
|
106
|
+
expect(confidence).toBe(0.79);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should calculate expected confidence with zero scores', () => {
|
|
110
|
+
const scores = createMockConfidenceScores({
|
|
111
|
+
amount: 0.0,
|
|
112
|
+
currency: 0.0,
|
|
113
|
+
business: 0.0,
|
|
114
|
+
date: 0.0,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const confidence = calculateExpectedConfidence(scores);
|
|
118
|
+
expect(confidence).toBe(0.0);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('should round confidence to 2 decimal places', () => {
|
|
122
|
+
expect(roundConfidence(0.956789)).toBe(0.96);
|
|
123
|
+
expect(roundConfidence(0.951)).toBe(0.95);
|
|
124
|
+
expect(roundConfidence(0.9)).toBe(0.9);
|
|
125
|
+
expect(roundConfidence(1.0)).toBe(1.0);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('should validate confidence scores', () => {
|
|
129
|
+
expect(isValidConfidenceScore(0.0)).toBe(true);
|
|
130
|
+
expect(isValidConfidenceScore(0.5)).toBe(true);
|
|
131
|
+
expect(isValidConfidenceScore(1.0)).toBe(true);
|
|
132
|
+
expect(isValidConfidenceScore(-0.1)).toBe(false);
|
|
133
|
+
expect(isValidConfidenceScore(1.1)).toBe(false);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('Date Helpers', () => {
|
|
138
|
+
it('should calculate days difference correctly', () => {
|
|
139
|
+
const date1 = new Date('2024-01-15');
|
|
140
|
+
const date2 = new Date('2024-01-20');
|
|
141
|
+
|
|
142
|
+
expect(daysDifference(date1, date2)).toBe(5);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('should handle same dates', () => {
|
|
146
|
+
const date = new Date('2024-01-15');
|
|
147
|
+
|
|
148
|
+
expect(daysDifference(date, date)).toBe(0);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('should calculate difference regardless of order', () => {
|
|
152
|
+
const date1 = new Date('2024-01-15');
|
|
153
|
+
const date2 = new Date('2024-01-10');
|
|
154
|
+
|
|
155
|
+
expect(daysDifference(date1, date2)).toBe(5);
|
|
156
|
+
expect(daysDifference(date2, date1)).toBe(5);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('should check if dates are within N days', () => {
|
|
160
|
+
const date1 = new Date('2024-01-15');
|
|
161
|
+
const date2 = new Date('2024-01-20');
|
|
162
|
+
|
|
163
|
+
expect(isWithinDays(date1, date2, 5)).toBe(true);
|
|
164
|
+
expect(isWithinDays(date1, date2, 4)).toBe(false);
|
|
165
|
+
expect(isWithinDays(date1, date2, 10)).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('should handle 12-month window check', () => {
|
|
169
|
+
const date1 = new Date('2024-01-15');
|
|
170
|
+
const date2 = new Date('2024-12-15');
|
|
171
|
+
const date3 = new Date('2025-02-15');
|
|
172
|
+
|
|
173
|
+
expect(isWithinDays(date1, date2, 365)).toBe(true);
|
|
174
|
+
expect(isWithinDays(date1, date3, 365)).toBe(false);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
});
|