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