@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.
Files changed (178) hide show
  1. package/CHANGELOG.md +47 -7
  2. package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +1 -1
  3. package/dist/server/src/__generated__/types.d.ts +77 -0
  4. package/dist/server/src/__generated__/types.js.map +1 -1
  5. package/dist/server/src/modules/charges-matcher/__generated__/types.d.ts +68 -0
  6. package/dist/server/src/modules/charges-matcher/__generated__/types.js +7 -0
  7. package/dist/server/src/modules/charges-matcher/__generated__/types.js.map +1 -0
  8. package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.d.ts +1 -0
  9. package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.js +218 -0
  10. package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.js.map +1 -0
  11. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.d.ts +1 -0
  12. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js +645 -0
  13. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js.map +1 -0
  14. package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.d.ts +1 -0
  15. package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.js +530 -0
  16. package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.js.map +1 -0
  17. package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.d.ts +1 -0
  18. package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.js +143 -0
  19. package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.js.map +1 -0
  20. package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.d.ts +1 -0
  21. package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.js +186 -0
  22. package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.js.map +1 -0
  23. package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.d.ts +1 -0
  24. package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.js +301 -0
  25. package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.js.map +1 -0
  26. package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.d.ts +1 -0
  27. package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.js +127 -0
  28. package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.js.map +1 -0
  29. package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.d.ts +1 -0
  30. package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.js +246 -0
  31. package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.js.map +1 -0
  32. package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.d.ts +1 -0
  33. package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.js +475 -0
  34. package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.js.map +1 -0
  35. package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.d.ts +1 -0
  36. package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.js +287 -0
  37. package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.js.map +1 -0
  38. package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.d.ts +1 -0
  39. package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.js +151 -0
  40. package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.js.map +1 -0
  41. package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.d.ts +1 -0
  42. package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.js +550 -0
  43. package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.js.map +1 -0
  44. package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.d.ts +1 -0
  45. package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.js +410 -0
  46. package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.js.map +1 -0
  47. package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.d.ts +1 -0
  48. package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js +504 -0
  49. package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js.map +1 -0
  50. package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.d.ts +1 -0
  51. package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.js +483 -0
  52. package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.js.map +1 -0
  53. package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.d.ts +46 -0
  54. package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.js +143 -0
  55. package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.js.map +1 -0
  56. package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.d.ts +1 -0
  57. package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.js +137 -0
  58. package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.js.map +1 -0
  59. package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.d.ts +1 -0
  60. package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.js +415 -0
  61. package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.js.map +1 -0
  62. package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.d.ts +7 -0
  63. package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.js +70 -0
  64. package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.js.map +1 -0
  65. package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.d.ts +7 -0
  66. package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.js +19 -0
  67. package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.js.map +1 -0
  68. package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.d.ts +24 -0
  69. package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.js +45 -0
  70. package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.js.map +1 -0
  71. package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.d.ts +33 -0
  72. package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.js +65 -0
  73. package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.js.map +1 -0
  74. package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.d.ts +7 -0
  75. package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.js +18 -0
  76. package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.js.map +1 -0
  77. package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.d.ts +7 -0
  78. package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.js +35 -0
  79. package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.js.map +1 -0
  80. package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.d.ts +49 -0
  81. package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.js +58 -0
  82. package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.js.map +1 -0
  83. package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.d.ts +13 -0
  84. package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.js +37 -0
  85. package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.js.map +1 -0
  86. package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.d.ts +42 -0
  87. package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.js +77 -0
  88. package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.js.map +1 -0
  89. package/dist/server/src/modules/charges-matcher/index.d.ts +3 -0
  90. package/dist/server/src/modules/charges-matcher/index.js +15 -0
  91. package/dist/server/src/modules/charges-matcher/index.js.map +1 -0
  92. package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.d.ts +48 -0
  93. package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.js +133 -0
  94. package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.js.map +1 -0
  95. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.d.ts +38 -0
  96. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js +248 -0
  97. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js.map +1 -0
  98. package/dist/server/src/modules/charges-matcher/providers/document-aggregator.d.ts +61 -0
  99. package/dist/server/src/modules/charges-matcher/providers/document-aggregator.js +153 -0
  100. package/dist/server/src/modules/charges-matcher/providers/document-aggregator.js.map +1 -0
  101. package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.d.ts +25 -0
  102. package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.js +114 -0
  103. package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.js.map +1 -0
  104. package/dist/server/src/modules/charges-matcher/providers/single-match.provider.d.ts +39 -0
  105. package/dist/server/src/modules/charges-matcher/providers/single-match.provider.js +189 -0
  106. package/dist/server/src/modules/charges-matcher/providers/single-match.provider.js.map +1 -0
  107. package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.d.ts +54 -0
  108. package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.js +93 -0
  109. package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.js.map +1 -0
  110. package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.d.ts +2 -0
  111. package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.js +22 -0
  112. package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.js.map +1 -0
  113. package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.d.ts +2 -0
  114. package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.js +24 -0
  115. package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.js.map +1 -0
  116. package/dist/server/src/modules/charges-matcher/resolvers/index.d.ts +2 -0
  117. package/dist/server/src/modules/charges-matcher/resolvers/index.js +11 -0
  118. package/dist/server/src/modules/charges-matcher/resolvers/index.js.map +1 -0
  119. package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.d.ts +2 -0
  120. package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.js +47 -0
  121. package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.js.map +1 -0
  122. package/dist/server/src/modules/charges-matcher/types.d.ts +179 -0
  123. package/dist/server/src/modules/charges-matcher/types.js +14 -0
  124. package/dist/server/src/modules/charges-matcher/types.js.map +1 -0
  125. package/dist/server/src/modules/documents/resolvers/document-suggestions.resolver.js +2 -2
  126. package/dist/server/src/modules/documents/resolvers/document-suggestions.resolver.js.map +1 -1
  127. package/dist/server/src/modules-app.js +2 -0
  128. package/dist/server/src/modules-app.js.map +1 -1
  129. package/dist/server/src/shared/types/index.d.ts +1 -1
  130. package/package.json +4 -4
  131. package/src/__generated__/types.ts +87 -0
  132. package/src/modules/charges-matcher/README.md +279 -0
  133. package/src/modules/charges-matcher/__generated__/types.ts +71 -0
  134. package/src/modules/charges-matcher/__tests__/amount-confidence.test.ts +260 -0
  135. package/src/modules/charges-matcher/__tests__/auto-match-integration.test.ts +714 -0
  136. package/src/modules/charges-matcher/__tests__/auto-match.test.ts +621 -0
  137. package/src/modules/charges-matcher/__tests__/business-confidence.test.ts +177 -0
  138. package/src/modules/charges-matcher/__tests__/candidate-filter.test.ts +238 -0
  139. package/src/modules/charges-matcher/__tests__/charge-validator.test.ts +374 -0
  140. package/src/modules/charges-matcher/__tests__/currency-confidence.test.ts +164 -0
  141. package/src/modules/charges-matcher/__tests__/date-confidence.test.ts +291 -0
  142. package/src/modules/charges-matcher/__tests__/document-aggregator.test.ts +614 -0
  143. package/src/modules/charges-matcher/__tests__/document-amount.test.ts +352 -0
  144. package/src/modules/charges-matcher/__tests__/document-business.test.ts +192 -0
  145. package/src/modules/charges-matcher/__tests__/match-scorer.test.ts +659 -0
  146. package/src/modules/charges-matcher/__tests__/overall-confidence.test.ts +502 -0
  147. package/src/modules/charges-matcher/__tests__/single-match-integration.test.ts +556 -0
  148. package/src/modules/charges-matcher/__tests__/single-match.test.ts +608 -0
  149. package/src/modules/charges-matcher/__tests__/test-helpers.ts +174 -0
  150. package/src/modules/charges-matcher/__tests__/test-infrastructure.spec.ts +177 -0
  151. package/src/modules/charges-matcher/__tests__/transaction-aggregator.test.ts +547 -0
  152. package/src/modules/charges-matcher/documentation/README.md +331 -0
  153. package/src/modules/charges-matcher/documentation/SPEC.md +1503 -0
  154. package/src/modules/charges-matcher/documentation/TODO.md +799 -0
  155. package/src/modules/charges-matcher/helpers/amount-confidence.helper.ts +88 -0
  156. package/src/modules/charges-matcher/helpers/business-confidence.helper.ts +23 -0
  157. package/src/modules/charges-matcher/helpers/candidate-filter.helper.ts +56 -0
  158. package/src/modules/charges-matcher/helpers/charge-validator.helper.ts +100 -0
  159. package/src/modules/charges-matcher/helpers/currency-confidence.helper.ts +22 -0
  160. package/src/modules/charges-matcher/helpers/date-confidence.helper.ts +41 -0
  161. package/src/modules/charges-matcher/helpers/document-amount.helper.ts +77 -0
  162. package/src/modules/charges-matcher/helpers/document-business.helper.ts +54 -0
  163. package/src/modules/charges-matcher/helpers/overall-confidence.helper.ts +90 -0
  164. package/src/modules/charges-matcher/index.ts +17 -0
  165. package/src/modules/charges-matcher/providers/auto-match.provider.ts +176 -0
  166. package/src/modules/charges-matcher/providers/charges-matcher.provider.ts +322 -0
  167. package/src/modules/charges-matcher/providers/document-aggregator.ts +211 -0
  168. package/src/modules/charges-matcher/providers/match-scorer.provider.ts +154 -0
  169. package/src/modules/charges-matcher/providers/single-match.provider.ts +252 -0
  170. package/src/modules/charges-matcher/providers/transaction-aggregator.ts +131 -0
  171. package/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.ts +23 -0
  172. package/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.ts +25 -0
  173. package/src/modules/charges-matcher/resolvers/index.ts +12 -0
  174. package/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.ts +47 -0
  175. package/src/modules/charges-matcher/types.ts +200 -0
  176. package/src/modules/documents/resolvers/document-suggestions.resolver.ts +2 -2
  177. package/src/modules-app.ts +2 -0
  178. 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":"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"}
@@ -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;