@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,504 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { createMockTransaction, createMockDocument } from './test-helpers.js';
3
+ // Mock the module imports to avoid dependency issues
4
+ vi.mock('graphql-modules', () => ({
5
+ Injectable: () => (target) => target,
6
+ Inject: () => (target, propertyKey, parameterIndex) => { },
7
+ Injector: class {
8
+ },
9
+ Scope: { Operation: 'Operation' },
10
+ CONTEXT: Symbol('CONTEXT'),
11
+ }));
12
+ vi.mock('@modules/charges/providers/charges.provider.js', () => ({
13
+ ChargesProvider: class {
14
+ },
15
+ }));
16
+ vi.mock('@modules/documents/providers/documents.provider.js', () => ({
17
+ DocumentsProvider: class {
18
+ },
19
+ }));
20
+ vi.mock('@modules/transactions/providers/transactions.provider.js', () => ({
21
+ TransactionsProvider: class {
22
+ },
23
+ }));
24
+ vi.mock('@shared/helpers', () => ({
25
+ dateToTimelessDateString: (date) => date.toISOString().split('T')[0],
26
+ }));
27
+ // Import after mocking
28
+ const { ChargesMatcherProvider } = await import('../providers/charges-matcher.provider.js');
29
+ // Test constants
30
+ const ADMIN_BUSINESS_ID = 'user-123';
31
+ // Mock charge object
32
+ function createCharge(id, ownerId) {
33
+ return {
34
+ id,
35
+ owner_id: ownerId,
36
+ transactions_min_event_date: new Date('2024-01-15'),
37
+ transactions_max_event_date: new Date('2024-01-15'),
38
+ };
39
+ }
40
+ describe('ChargesMatcherProvider - Integration Tests', () => {
41
+ describe('findMatchesForCharge', () => {
42
+ it('should find matches for transaction charge with mock data', async () => {
43
+ // Setup mock data
44
+ const sourceChargeId = 'tx-charge-1';
45
+ const sourceTransactions = [
46
+ createMockTransaction({
47
+ charge_id: sourceChargeId,
48
+ amount: "100",
49
+ currency: 'USD',
50
+ event_date: new Date('2024-01-15'),
51
+ }),
52
+ ];
53
+ const candidateCharge1Id = 'doc-charge-1';
54
+ const candidateDocuments1 = [
55
+ createMockDocument({
56
+ charge_id: candidateCharge1Id,
57
+ total_amount: 100,
58
+ currency_code: 'USD',
59
+ date: new Date('2024-01-15'),
60
+ }),
61
+ ];
62
+ const candidateCharge2Id = 'doc-charge-2';
63
+ const candidateDocuments2 = [
64
+ createMockDocument({
65
+ charge_id: candidateCharge2Id,
66
+ total_amount: 110,
67
+ currency_code: 'USD',
68
+ date: new Date('2024-01-16'),
69
+ }),
70
+ ];
71
+ // Mock providers
72
+ const mockChargesProvider = {
73
+ getChargeByIdLoader: {
74
+ load: vi.fn((id) => {
75
+ if (id === sourceChargeId)
76
+ return Promise.resolve(createCharge(id, ADMIN_BUSINESS_ID));
77
+ if (id === candidateCharge1Id)
78
+ return Promise.resolve(createCharge(id, ADMIN_BUSINESS_ID));
79
+ if (id === candidateCharge2Id)
80
+ return Promise.resolve(createCharge(id, ADMIN_BUSINESS_ID));
81
+ return Promise.resolve(new Error('Charge not found'));
82
+ }),
83
+ },
84
+ getChargesByFilters: vi.fn(() => Promise.resolve([
85
+ createCharge(candidateCharge1Id, ADMIN_BUSINESS_ID),
86
+ createCharge(candidateCharge2Id, ADMIN_BUSINESS_ID),
87
+ ])),
88
+ };
89
+ const mockTransactionsProvider = {
90
+ transactionsByChargeIDLoader: {
91
+ load: vi.fn((id) => {
92
+ if (id === sourceChargeId)
93
+ return Promise.resolve(sourceTransactions);
94
+ return Promise.resolve([]);
95
+ }),
96
+ },
97
+ };
98
+ const mockDocumentsProvider = {
99
+ getDocumentsByChargeIdLoader: {
100
+ load: vi.fn((id) => {
101
+ if (id === sourceChargeId)
102
+ return Promise.resolve([]);
103
+ if (id === candidateCharge1Id)
104
+ return Promise.resolve(candidateDocuments1);
105
+ if (id === candidateCharge2Id)
106
+ return Promise.resolve(candidateDocuments2);
107
+ return Promise.resolve([]);
108
+ }),
109
+ },
110
+ };
111
+ const mockInjector = {
112
+ get: vi.fn((token) => {
113
+ if (token.name === 'ChargesProvider')
114
+ return mockChargesProvider;
115
+ if (token.name === 'TransactionsProvider')
116
+ return mockTransactionsProvider;
117
+ if (token.name === 'DocumentsProvider')
118
+ return mockDocumentsProvider;
119
+ return null;
120
+ }),
121
+ };
122
+ // Execute
123
+ const provider = new ChargesMatcherProvider();
124
+ const result = await provider.findMatchesForCharge(sourceChargeId, { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector });
125
+ // Verify
126
+ expect(result.matches).toHaveLength(2);
127
+ expect(result.matches[0].chargeId).toBe(candidateCharge1Id); // Perfect match
128
+ expect(result.matches[0].confidenceScore).toBeGreaterThan(0.95);
129
+ expect(result.matches[1].chargeId).toBe(candidateCharge2Id); // Partial match
130
+ expect(result.matches[1].confidenceScore).toBeLessThan(0.95);
131
+ });
132
+ it('should find matches for document charge with mock data', async () => {
133
+ // Setup mock data
134
+ const sourceChargeId = 'doc-charge-1';
135
+ const sourceDocuments = [
136
+ createMockDocument({
137
+ charge_id: sourceChargeId,
138
+ total_amount: 200,
139
+ currency_code: 'USD',
140
+ date: new Date('2024-02-15'),
141
+ }),
142
+ ];
143
+ const candidateCharge1Id = 'tx-charge-1';
144
+ const candidateTransactions1 = [
145
+ createMockTransaction({
146
+ charge_id: candidateCharge1Id,
147
+ amount: "200",
148
+ currency: 'USD',
149
+ event_date: new Date('2024-02-15'),
150
+ }),
151
+ ];
152
+ const candidateCharge2Id = 'tx-charge-2';
153
+ const candidateTransactions2 = [
154
+ createMockTransaction({
155
+ charge_id: candidateCharge2Id,
156
+ amount: "195",
157
+ currency: 'USD',
158
+ event_date: new Date('2024-02-16'),
159
+ }),
160
+ ];
161
+ // Mock providers
162
+ const mockChargesProvider = {
163
+ getChargeByIdLoader: {
164
+ load: vi.fn((id) => {
165
+ if (id === sourceChargeId)
166
+ return Promise.resolve(createCharge(id, ADMIN_BUSINESS_ID));
167
+ return Promise.resolve(createCharge(id, ADMIN_BUSINESS_ID));
168
+ }),
169
+ },
170
+ getChargesByFilters: vi.fn(() => Promise.resolve([
171
+ createCharge(candidateCharge1Id, ADMIN_BUSINESS_ID),
172
+ createCharge(candidateCharge2Id, ADMIN_BUSINESS_ID),
173
+ ])),
174
+ };
175
+ const mockTransactionsProvider = {
176
+ transactionsByChargeIDLoader: {
177
+ load: vi.fn((id) => {
178
+ if (id === candidateCharge1Id)
179
+ return Promise.resolve(candidateTransactions1);
180
+ if (id === candidateCharge2Id)
181
+ return Promise.resolve(candidateTransactions2);
182
+ return Promise.resolve([]);
183
+ }),
184
+ },
185
+ };
186
+ const mockDocumentsProvider = {
187
+ getDocumentsByChargeIdLoader: {
188
+ load: vi.fn((id) => {
189
+ if (id === sourceChargeId)
190
+ return Promise.resolve(sourceDocuments);
191
+ return Promise.resolve([]);
192
+ }),
193
+ },
194
+ };
195
+ const mockInjector = {
196
+ get: vi.fn((token) => {
197
+ if (token.name === 'ChargesProvider')
198
+ return mockChargesProvider;
199
+ if (token.name === 'TransactionsProvider')
200
+ return mockTransactionsProvider;
201
+ if (token.name === 'DocumentsProvider')
202
+ return mockDocumentsProvider;
203
+ return null;
204
+ }),
205
+ };
206
+ // Execute
207
+ const provider = new ChargesMatcherProvider();
208
+ const result = await provider.findMatchesForCharge(sourceChargeId, { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector });
209
+ // Verify
210
+ expect(result.matches).toHaveLength(2);
211
+ expect(result.matches[0].chargeId).toBe(candidateCharge1Id);
212
+ expect(result.matches[0].confidenceScore).toBeGreaterThan(0.95);
213
+ });
214
+ it('should throw error if charge not found', async () => {
215
+ const mockChargesProvider = {
216
+ getChargeByIdLoader: {
217
+ load: vi.fn(() => Promise.resolve(new Error('Not found'))),
218
+ },
219
+ };
220
+ const mockInjector = {
221
+ get: vi.fn((token) => {
222
+ if (token.name === 'ChargesProvider')
223
+ return mockChargesProvider;
224
+ return null;
225
+ }),
226
+ };
227
+ const provider = new ChargesMatcherProvider();
228
+ await expect(provider.findMatchesForCharge('non-existent', { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector })).rejects.toThrow(/Source charge not found/);
229
+ });
230
+ it('should throw error if charge is already matched', async () => {
231
+ const chargeId = 'matched-charge';
232
+ const mockChargesProvider = {
233
+ getChargeByIdLoader: {
234
+ load: vi.fn(() => Promise.resolve(createCharge(chargeId, ADMIN_BUSINESS_ID))),
235
+ },
236
+ };
237
+ const mockTransactionsProvider = {
238
+ transactionsByChargeIDLoader: {
239
+ load: vi.fn(() => Promise.resolve([createMockTransaction()])),
240
+ },
241
+ };
242
+ const mockDocumentsProvider = {
243
+ getDocumentsByChargeIdLoader: {
244
+ load: vi.fn(() => Promise.resolve([createMockDocument()])),
245
+ },
246
+ };
247
+ const mockInjector = {
248
+ get: vi.fn((token) => {
249
+ if (token.name === 'ChargesProvider')
250
+ return mockChargesProvider;
251
+ if (token.name === 'TransactionsProvider')
252
+ return mockTransactionsProvider;
253
+ if (token.name === 'DocumentsProvider')
254
+ return mockDocumentsProvider;
255
+ return null;
256
+ }),
257
+ };
258
+ const provider = new ChargesMatcherProvider();
259
+ await expect(provider.findMatchesForCharge(chargeId, { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector })).rejects.toThrow(/already matched/);
260
+ });
261
+ it('should throw error if charge has no transactions or documents', async () => {
262
+ const chargeId = 'empty-charge';
263
+ const mockChargesProvider = {
264
+ getChargeByIdLoader: {
265
+ load: vi.fn(() => Promise.resolve(createCharge(chargeId, ADMIN_BUSINESS_ID))),
266
+ },
267
+ };
268
+ const mockTransactionsProvider = {
269
+ transactionsByChargeIDLoader: {
270
+ load: vi.fn(() => Promise.resolve([])),
271
+ },
272
+ };
273
+ const mockDocumentsProvider = {
274
+ getDocumentsByChargeIdLoader: {
275
+ load: vi.fn(() => Promise.resolve([])),
276
+ },
277
+ };
278
+ const mockInjector = {
279
+ get: vi.fn((token) => {
280
+ if (token.name === 'ChargesProvider')
281
+ return mockChargesProvider;
282
+ if (token.name === 'TransactionsProvider')
283
+ return mockTransactionsProvider;
284
+ if (token.name === 'DocumentsProvider')
285
+ return mockDocumentsProvider;
286
+ return null;
287
+ }),
288
+ };
289
+ const provider = new ChargesMatcherProvider();
290
+ await expect(provider.findMatchesForCharge(chargeId, { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector })).rejects.toThrow(/no transactions or documents/);
291
+ });
292
+ it('should return empty matches if no candidates found', async () => {
293
+ const sourceChargeId = 'tx-charge-only';
294
+ const mockChargesProvider = {
295
+ getChargeByIdLoader: {
296
+ load: vi.fn(() => Promise.resolve(createCharge(sourceChargeId, ADMIN_BUSINESS_ID))),
297
+ },
298
+ getChargesByFilters: vi.fn(() => Promise.resolve([])),
299
+ };
300
+ const mockTransactionsProvider = {
301
+ transactionsByChargeIDLoader: {
302
+ load: vi.fn(() => Promise.resolve([createMockTransaction()])),
303
+ },
304
+ };
305
+ const mockDocumentsProvider = {
306
+ getDocumentsByChargeIdLoader: {
307
+ load: vi.fn(() => Promise.resolve([])),
308
+ },
309
+ };
310
+ const mockInjector = {
311
+ get: vi.fn((token) => {
312
+ if (token.name === 'ChargesProvider')
313
+ return mockChargesProvider;
314
+ if (token.name === 'TransactionsProvider')
315
+ return mockTransactionsProvider;
316
+ if (token.name === 'DocumentsProvider')
317
+ return mockDocumentsProvider;
318
+ return null;
319
+ }),
320
+ };
321
+ const provider = new ChargesMatcherProvider();
322
+ const result = await provider.findMatchesForCharge(sourceChargeId, { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector });
323
+ expect(result.matches).toEqual([]);
324
+ });
325
+ it('should filter out matched candidates (having both transactions and documents)', async () => {
326
+ const sourceChargeId = 'tx-charge-1';
327
+ const matchedCandidateId = 'matched-charge';
328
+ const validCandidateId = 'doc-charge-1';
329
+ const mockChargesProvider = {
330
+ getChargeByIdLoader: {
331
+ load: vi.fn(() => Promise.resolve(createCharge(sourceChargeId, ADMIN_BUSINESS_ID))),
332
+ },
333
+ getChargesByFilters: vi.fn(() => Promise.resolve([
334
+ createCharge(matchedCandidateId, ADMIN_BUSINESS_ID),
335
+ createCharge(validCandidateId, ADMIN_BUSINESS_ID),
336
+ ])),
337
+ };
338
+ const mockTransactionsProvider = {
339
+ transactionsByChargeIDLoader: {
340
+ load: vi.fn((id) => {
341
+ if (id === sourceChargeId)
342
+ return Promise.resolve([createMockTransaction()]);
343
+ if (id === matchedCandidateId)
344
+ return Promise.resolve([createMockTransaction()]); // Has transactions
345
+ return Promise.resolve([]);
346
+ }),
347
+ },
348
+ };
349
+ const mockDocumentsProvider = {
350
+ getDocumentsByChargeIdLoader: {
351
+ load: vi.fn((id) => {
352
+ if (id === matchedCandidateId)
353
+ return Promise.resolve([createMockDocument()]); // Also has documents - MATCHED
354
+ if (id === validCandidateId)
355
+ return Promise.resolve([createMockDocument()]); // Only documents - VALID
356
+ return Promise.resolve([]);
357
+ }),
358
+ },
359
+ };
360
+ const mockInjector = {
361
+ get: vi.fn((token) => {
362
+ if (token.name === 'ChargesProvider')
363
+ return mockChargesProvider;
364
+ if (token.name === 'TransactionsProvider')
365
+ return mockTransactionsProvider;
366
+ if (token.name === 'DocumentsProvider')
367
+ return mockDocumentsProvider;
368
+ return null;
369
+ }),
370
+ };
371
+ const provider = new ChargesMatcherProvider();
372
+ const result = await provider.findMatchesForCharge(sourceChargeId, { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector });
373
+ // Should only include validCandidateId, not matchedCandidateId
374
+ expect(result.matches).toHaveLength(1);
375
+ expect(result.matches[0].chargeId).toBe(validCandidateId);
376
+ });
377
+ it('should handle date window filtering correctly', async () => {
378
+ const sourceChargeId = 'tx-charge-1';
379
+ const sourceDate = new Date('2024-06-15');
380
+ const withinWindowId = 'doc-charge-within';
381
+ const outsideWindowId = 'doc-charge-outside';
382
+ const mockChargesProvider = {
383
+ getChargeByIdLoader: {
384
+ load: vi.fn(() => Promise.resolve(createCharge(sourceChargeId, ADMIN_BUSINESS_ID))),
385
+ },
386
+ getChargesByFilters: vi.fn(params => {
387
+ // Verify date window parameters
388
+ expect(params.fromAnyDate).toBeDefined();
389
+ expect(params.toAnyDate).toBeDefined();
390
+ return Promise.resolve([
391
+ createCharge(withinWindowId, ADMIN_BUSINESS_ID),
392
+ createCharge(outsideWindowId, ADMIN_BUSINESS_ID),
393
+ ]);
394
+ }),
395
+ };
396
+ const mockTransactionsProvider = {
397
+ transactionsByChargeIDLoader: {
398
+ load: vi.fn((id) => {
399
+ if (id === sourceChargeId) {
400
+ return Promise.resolve([createMockTransaction({ event_date: sourceDate })]);
401
+ }
402
+ return Promise.resolve([]);
403
+ }),
404
+ },
405
+ };
406
+ const mockDocumentsProvider = {
407
+ getDocumentsByChargeIdLoader: {
408
+ load: vi.fn((id) => {
409
+ if (id === sourceChargeId)
410
+ return Promise.resolve([]);
411
+ if (id === withinWindowId) {
412
+ // Within 12-month window
413
+ return Promise.resolve([
414
+ createMockDocument({ date: new Date('2024-06-20') }),
415
+ ]);
416
+ }
417
+ if (id === outsideWindowId) {
418
+ // Outside 12-month window
419
+ return Promise.resolve([
420
+ createMockDocument({ date: new Date('2025-07-15') }),
421
+ ]);
422
+ }
423
+ return Promise.resolve([]);
424
+ }),
425
+ },
426
+ };
427
+ const mockInjector = {
428
+ get: vi.fn((token) => {
429
+ if (token.name === 'ChargesProvider')
430
+ return mockChargesProvider;
431
+ if (token.name === 'TransactionsProvider')
432
+ return mockTransactionsProvider;
433
+ if (token.name === 'DocumentsProvider')
434
+ return mockDocumentsProvider;
435
+ return null;
436
+ }),
437
+ };
438
+ const provider = new ChargesMatcherProvider();
439
+ const result = await provider.findMatchesForCharge(sourceChargeId, { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector });
440
+ // Should only include candidate within window
441
+ expect(result.matches).toHaveLength(1);
442
+ expect(result.matches[0].chargeId).toBe(withinWindowId);
443
+ });
444
+ it('should throw error if user ID not in context', async () => {
445
+ const mockInjector = {
446
+ get: vi.fn(() => null), // No user
447
+ };
448
+ const provider = new ChargesMatcherProvider();
449
+ await expect(provider.findMatchesForCharge('any-id', { adminContext: { defaultAdminBusinessId: null }, injector: mockInjector })).rejects.toThrow(/Admin business not found in context/);
450
+ });
451
+ it('should return top 5 matches when more candidates exist', async () => {
452
+ const sourceChargeId = 'tx-charge-1';
453
+ // Create 7 candidate charges
454
+ const candidateIds = Array.from({ length: 7 }, (_, i) => `doc-charge-${i + 1}`);
455
+ const mockChargesProvider = {
456
+ getChargeByIdLoader: {
457
+ load: vi.fn(() => Promise.resolve(createCharge(sourceChargeId, ADMIN_BUSINESS_ID))),
458
+ },
459
+ getChargesByFilters: vi.fn(() => Promise.resolve(candidateIds.map(id => createCharge(id, ADMIN_BUSINESS_ID)))),
460
+ };
461
+ const mockTransactionsProvider = {
462
+ transactionsByChargeIDLoader: {
463
+ load: vi.fn((id) => {
464
+ if (id === sourceChargeId) {
465
+ return Promise.resolve([createMockTransaction({ amount: "100" })]);
466
+ }
467
+ return Promise.resolve([]);
468
+ }),
469
+ },
470
+ };
471
+ const mockDocumentsProvider = {
472
+ getDocumentsByChargeIdLoader: {
473
+ load: vi.fn((id) => {
474
+ if (id === sourceChargeId)
475
+ return Promise.resolve([]);
476
+ // Create documents with varying amounts for different confidence scores
477
+ const index = parseInt(id.split('-')[2]);
478
+ return Promise.resolve([createMockDocument({ total_amount: 100 + index })]);
479
+ }),
480
+ },
481
+ };
482
+ const mockInjector = {
483
+ get: vi.fn((token) => {
484
+ if (token.name === 'ChargesProvider')
485
+ return mockChargesProvider;
486
+ if (token.name === 'TransactionsProvider')
487
+ return mockTransactionsProvider;
488
+ if (token.name === 'DocumentsProvider')
489
+ return mockDocumentsProvider;
490
+ return null;
491
+ }),
492
+ };
493
+ const provider = new ChargesMatcherProvider();
494
+ const result = await provider.findMatchesForCharge(sourceChargeId, { adminContext: { defaultAdminBusinessId: ADMIN_BUSINESS_ID }, injector: mockInjector });
495
+ // Should return maximum of 5 matches
496
+ expect(result.matches).toHaveLength(5);
497
+ // Verify sorted by confidence (descending)
498
+ for (let i = 0; i < result.matches.length - 1; i++) {
499
+ expect(result.matches[i].confidenceScore).toBeGreaterThanOrEqual(result.matches[i + 1].confidenceScore);
500
+ }
501
+ });
502
+ });
503
+ });
504
+ //# sourceMappingURL=single-match-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-match-integration.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/single-match-integration.test.ts"],"names":[],"mappings":"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"}