@accounter/server 0.0.8-alpha-20251102200443-d7162b8ce1dfc629b8b454df17dcec9ed005a052 → 0.0.8-alpha-20251103003648-f6467c8cb9c739ec4439c260bccc7325f6a761ae

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 (185) hide show
  1. package/CHANGELOG.md +47 -7
  2. package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +7 -7
  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/green-invoice/helpers/contract-to-draft.helper.js +1 -1
  128. package/dist/server/src/modules/green-invoice/helpers/contract-to-draft.helper.js.map +1 -1
  129. package/dist/server/src/modules/green-invoice/helpers/green-invoice.helper.d.ts +1 -1
  130. package/dist/server/src/modules/green-invoice/helpers/green-invoice.helper.js +1 -1
  131. package/dist/server/src/modules/green-invoice/helpers/green-invoice.helper.js.map +1 -1
  132. package/dist/server/src/modules-app.js +2 -0
  133. package/dist/server/src/modules-app.js.map +1 -1
  134. package/dist/server/src/shared/types/index.d.ts +1 -1
  135. package/package.json +4 -4
  136. package/src/__generated__/types.ts +87 -0
  137. package/src/modules/charges-matcher/README.md +279 -0
  138. package/src/modules/charges-matcher/__generated__/types.ts +71 -0
  139. package/src/modules/charges-matcher/__tests__/amount-confidence.test.ts +260 -0
  140. package/src/modules/charges-matcher/__tests__/auto-match-integration.test.ts +714 -0
  141. package/src/modules/charges-matcher/__tests__/auto-match.test.ts +621 -0
  142. package/src/modules/charges-matcher/__tests__/business-confidence.test.ts +177 -0
  143. package/src/modules/charges-matcher/__tests__/candidate-filter.test.ts +238 -0
  144. package/src/modules/charges-matcher/__tests__/charge-validator.test.ts +374 -0
  145. package/src/modules/charges-matcher/__tests__/currency-confidence.test.ts +164 -0
  146. package/src/modules/charges-matcher/__tests__/date-confidence.test.ts +291 -0
  147. package/src/modules/charges-matcher/__tests__/document-aggregator.test.ts +614 -0
  148. package/src/modules/charges-matcher/__tests__/document-amount.test.ts +352 -0
  149. package/src/modules/charges-matcher/__tests__/document-business.test.ts +192 -0
  150. package/src/modules/charges-matcher/__tests__/match-scorer.test.ts +659 -0
  151. package/src/modules/charges-matcher/__tests__/overall-confidence.test.ts +502 -0
  152. package/src/modules/charges-matcher/__tests__/single-match-integration.test.ts +556 -0
  153. package/src/modules/charges-matcher/__tests__/single-match.test.ts +608 -0
  154. package/src/modules/charges-matcher/__tests__/test-helpers.ts +174 -0
  155. package/src/modules/charges-matcher/__tests__/test-infrastructure.spec.ts +177 -0
  156. package/src/modules/charges-matcher/__tests__/transaction-aggregator.test.ts +547 -0
  157. package/src/modules/charges-matcher/documentation/README.md +331 -0
  158. package/src/modules/charges-matcher/documentation/SPEC.md +1503 -0
  159. package/src/modules/charges-matcher/documentation/TODO.md +799 -0
  160. package/src/modules/charges-matcher/helpers/amount-confidence.helper.ts +88 -0
  161. package/src/modules/charges-matcher/helpers/business-confidence.helper.ts +23 -0
  162. package/src/modules/charges-matcher/helpers/candidate-filter.helper.ts +56 -0
  163. package/src/modules/charges-matcher/helpers/charge-validator.helper.ts +100 -0
  164. package/src/modules/charges-matcher/helpers/currency-confidence.helper.ts +22 -0
  165. package/src/modules/charges-matcher/helpers/date-confidence.helper.ts +41 -0
  166. package/src/modules/charges-matcher/helpers/document-amount.helper.ts +77 -0
  167. package/src/modules/charges-matcher/helpers/document-business.helper.ts +54 -0
  168. package/src/modules/charges-matcher/helpers/overall-confidence.helper.ts +90 -0
  169. package/src/modules/charges-matcher/index.ts +17 -0
  170. package/src/modules/charges-matcher/providers/auto-match.provider.ts +176 -0
  171. package/src/modules/charges-matcher/providers/charges-matcher.provider.ts +322 -0
  172. package/src/modules/charges-matcher/providers/document-aggregator.ts +211 -0
  173. package/src/modules/charges-matcher/providers/match-scorer.provider.ts +154 -0
  174. package/src/modules/charges-matcher/providers/single-match.provider.ts +252 -0
  175. package/src/modules/charges-matcher/providers/transaction-aggregator.ts +131 -0
  176. package/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.ts +23 -0
  177. package/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.ts +25 -0
  178. package/src/modules/charges-matcher/resolvers/index.ts +12 -0
  179. package/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.ts +47 -0
  180. package/src/modules/charges-matcher/types.ts +200 -0
  181. package/src/modules/documents/resolvers/document-suggestions.resolver.ts +2 -2
  182. package/src/modules/green-invoice/helpers/contract-to-draft.helper.ts +1 -1
  183. package/src/modules/green-invoice/helpers/green-invoice.helper.ts +1 -1
  184. package/src/modules-app.ts +2 -0
  185. package/src/shared/types/index.ts +1 -1
@@ -0,0 +1,550 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { scoreMatch, selectTransactionDate, } from '../providers/match-scorer.provider.js';
3
+ import { createMockTransaction, createMockDocument } from './test-helpers.js';
4
+ // Test user ID
5
+ const USER_ID = 'user-123';
6
+ const BUSINESS_ID = 'business-abc';
7
+ describe('Match Scorer', () => {
8
+ describe('selectTransactionDate', () => {
9
+ const transaction = {
10
+ amount: 100,
11
+ currency: 'USD',
12
+ businessId: BUSINESS_ID,
13
+ date: new Date('2024-01-15'), // event_date
14
+ debitDate: new Date('2024-01-20'), // debit_date
15
+ description: 'Test',
16
+ };
17
+ it('should use event_date for INVOICE', () => {
18
+ const result = selectTransactionDate(transaction, 'INVOICE');
19
+ expect(result).toEqual(new Date('2024-01-15'));
20
+ });
21
+ it('should use event_date for CREDIT_INVOICE', () => {
22
+ const result = selectTransactionDate(transaction, 'CREDIT_INVOICE');
23
+ expect(result).toEqual(new Date('2024-01-15'));
24
+ });
25
+ it('should use event_date for RECEIPT', () => {
26
+ const result = selectTransactionDate(transaction, 'RECEIPT');
27
+ expect(result).toEqual(new Date('2024-01-15'));
28
+ });
29
+ it('should use event_date for INVOICE_RECEIPT', () => {
30
+ const result = selectTransactionDate(transaction, 'INVOICE_RECEIPT');
31
+ expect(result).toEqual(new Date('2024-01-15'));
32
+ });
33
+ it('should use event_date for RECEIPT when debitDate is null', () => {
34
+ const txWithoutDebitDate = { ...transaction, debitDate: null };
35
+ const result = selectTransactionDate(txWithoutDebitDate, 'RECEIPT');
36
+ expect(result).toEqual(new Date('2024-01-15'));
37
+ });
38
+ it('should use event_date for OTHER', () => {
39
+ const result = selectTransactionDate(transaction, 'OTHER');
40
+ expect(result).toEqual(new Date('2024-01-15'));
41
+ });
42
+ it('should use event_date for PROFORMA', () => {
43
+ const result = selectTransactionDate(transaction, 'PROFORMA');
44
+ expect(result).toEqual(new Date('2024-01-15'));
45
+ });
46
+ it('should use event_date for UNPROCESSED', () => {
47
+ const result = selectTransactionDate(transaction, 'UNPROCESSED');
48
+ expect(result).toEqual(new Date('2024-01-15'));
49
+ });
50
+ });
51
+ describe('scoreMatch', () => {
52
+ describe('Perfect Matches', () => {
53
+ it('should score perfect match close to 1.0', () => {
54
+ const txCharge = {
55
+ chargeId: 'charge-tx-1',
56
+ transactions: [
57
+ createMockTransaction({
58
+ amount: '100.00',
59
+ currency: 'USD',
60
+ event_date: new Date('2024-01-15'),
61
+ business_id: BUSINESS_ID,
62
+ }),
63
+ ],
64
+ };
65
+ const docCharge = {
66
+ chargeId: 'charge-doc-1',
67
+ documents: [
68
+ createMockDocument({
69
+ total_amount: 100,
70
+ currency_code: 'USD',
71
+ date: new Date('2024-01-15'),
72
+ creditor_id: BUSINESS_ID,
73
+ debtor_id: USER_ID,
74
+ type: 'INVOICE',
75
+ }),
76
+ ],
77
+ };
78
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
79
+ expect(result.chargeId).toBe('charge-doc-1');
80
+ expect(result.confidenceScore).toBeGreaterThan(0.95);
81
+ expect(result.components.amount).toBe(1.0);
82
+ expect(result.components.currency).toBe(1.0);
83
+ expect(result.components.business).toBe(1.0);
84
+ expect(result.components.date).toBe(1.0);
85
+ });
86
+ it('should handle receipt matching with event_date', () => {
87
+ const txCharge = {
88
+ chargeId: 'charge-tx-2',
89
+ transactions: [
90
+ createMockTransaction({
91
+ amount: "200.00",
92
+ event_date: new Date('2024-01-10'),
93
+ debit_date: new Date('2024-01-15'),
94
+ debit_timestamp: null,
95
+ }),
96
+ ],
97
+ };
98
+ const docCharge = {
99
+ chargeId: 'charge-doc-2',
100
+ documents: [
101
+ createMockDocument({
102
+ total_amount: 200,
103
+ date: new Date('2024-01-15'),
104
+ type: 'RECEIPT',
105
+ }),
106
+ ],
107
+ };
108
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
109
+ expect(result.confidenceScore).toBeGreaterThan(0.80);
110
+ expect(result.components.date).toBeCloseTo(0.83, 1);
111
+ });
112
+ });
113
+ describe('Partial Matches', () => {
114
+ it('should handle amount mismatch', () => {
115
+ const txCharge = {
116
+ chargeId: 'charge-tx-3',
117
+ transactions: [createMockTransaction({ amount: "100.00" })],
118
+ };
119
+ const docCharge = {
120
+ chargeId: 'charge-doc-3',
121
+ documents: [createMockDocument({ total_amount: 110 })], // 10% difference
122
+ };
123
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
124
+ expect(result.components.amount).toBeLessThan(1.0);
125
+ expect(result.components.amount).toBeGreaterThan(0.0);
126
+ expect(result.confidenceScore).toBeLessThan(0.95);
127
+ });
128
+ it('should handle currency mismatch', () => {
129
+ const txCharge = {
130
+ chargeId: 'charge-tx-4',
131
+ transactions: [createMockTransaction({ currency: 'USD' })],
132
+ };
133
+ const docCharge = {
134
+ chargeId: 'charge-doc-4',
135
+ documents: [createMockDocument({ currency_code: 'EUR' })],
136
+ };
137
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
138
+ expect(result.components.currency).toBe(0.0); // Different currencies = 0.0
139
+ // Overall confidence can still be decent if other factors match
140
+ expect(result.confidenceScore).toBeLessThan(1.0);
141
+ });
142
+ it('should handle business mismatch', () => {
143
+ const txCharge = {
144
+ chargeId: 'charge-tx-5',
145
+ transactions: [createMockTransaction({ business_id: 'business-1' })],
146
+ };
147
+ const docCharge = {
148
+ chargeId: 'charge-doc-5',
149
+ documents: [
150
+ createMockDocument({
151
+ creditor_id: 'business-2',
152
+ debtor_id: USER_ID,
153
+ }),
154
+ ],
155
+ };
156
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
157
+ expect(result.components.business).toBe(0.2);
158
+ });
159
+ it('should handle date difference', () => {
160
+ const txCharge = {
161
+ chargeId: 'charge-tx-6',
162
+ transactions: [
163
+ createMockTransaction({
164
+ event_date: new Date('2024-01-01'),
165
+ }),
166
+ ],
167
+ };
168
+ const docCharge = {
169
+ chargeId: 'charge-doc-6',
170
+ documents: [
171
+ createMockDocument({
172
+ date: new Date('2024-01-16'), // 15 days difference
173
+ }),
174
+ ],
175
+ };
176
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
177
+ expect(result.components.date).toBe(0.5); // 15/30 = 0.5
178
+ });
179
+ });
180
+ describe('Date Type Selection', () => {
181
+ it('should use event_date for INVOICE matching', () => {
182
+ const txCharge = {
183
+ chargeId: 'charge-tx-7',
184
+ transactions: [
185
+ createMockTransaction({
186
+ event_date: new Date('2024-01-15'),
187
+ debit_date: new Date('2024-01-20'), // Different date
188
+ }),
189
+ ],
190
+ };
191
+ const docCharge = {
192
+ chargeId: 'charge-doc-7',
193
+ documents: [
194
+ createMockDocument({
195
+ date: new Date('2024-01-15'), // Matches event_date
196
+ type: 'INVOICE',
197
+ }),
198
+ ],
199
+ };
200
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
201
+ expect(result.components.date).toBe(1.0); // Should match event_date
202
+ });
203
+ it('should use event_date for RECEIPT matching', () => {
204
+ const txCharge = {
205
+ chargeId: 'charge-tx-8',
206
+ transactions: [
207
+ createMockTransaction({
208
+ event_date: new Date('2024-01-10'),
209
+ debit_date: new Date('2024-01-15'),
210
+ debit_timestamp: null,
211
+ }),
212
+ ],
213
+ };
214
+ const docCharge = {
215
+ chargeId: 'charge-doc-8',
216
+ documents: [
217
+ createMockDocument({
218
+ date: new Date('2024-01-15'), // Matches debit_date
219
+ type: 'RECEIPT',
220
+ }),
221
+ ],
222
+ };
223
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
224
+ expect(result.components.date).toBeCloseTo(0.83, 1);
225
+ });
226
+ it('should fall back to event_date for RECEIPT when debit_date is null', () => {
227
+ const txCharge = {
228
+ chargeId: 'charge-tx-9',
229
+ transactions: [
230
+ createMockTransaction({
231
+ event_date: new Date('2024-01-15'),
232
+ debit_date: null,
233
+ debit_timestamp: null,
234
+ }),
235
+ ],
236
+ };
237
+ const docCharge = {
238
+ chargeId: 'charge-doc-9',
239
+ documents: [
240
+ createMockDocument({
241
+ date: new Date('2024-01-15'),
242
+ type: 'RECEIPT',
243
+ }),
244
+ ],
245
+ };
246
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
247
+ expect(result.components.date).toBe(1.0);
248
+ });
249
+ });
250
+ describe('Flexible Document Types (PROFORMA/OTHER/UNPROCESSED)', () => {
251
+ it('should use event_date for PROFORMA and use better score', () => {
252
+ const txCharge = {
253
+ chargeId: 'charge-tx-10',
254
+ transactions: [
255
+ createMockTransaction({
256
+ event_date: new Date('2024-01-01'), // Far from document date
257
+ debit_date: new Date('2024-01-15'), // Matches document date
258
+ debit_timestamp: null,
259
+ }),
260
+ ],
261
+ };
262
+ const docCharge = {
263
+ chargeId: 'charge-doc-10',
264
+ documents: [
265
+ createMockDocument({
266
+ date: new Date('2024-01-15'),
267
+ type: 'PROFORMA',
268
+ }),
269
+ ],
270
+ };
271
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
272
+ // Should use event_date (2024-01-01) vs latest doc date (2024-01-15) = 14 days
273
+ // Date confidence: 1.0 - 14/30 = 0.53
274
+ expect(result.components.date).toBeCloseTo(0.53, 1);
275
+ });
276
+ it('should handle OTHER type with both dates', () => {
277
+ const txCharge = {
278
+ chargeId: 'charge-tx-11',
279
+ transactions: [
280
+ createMockTransaction({
281
+ event_date: new Date('2024-01-10'),
282
+ debit_date: new Date('2024-01-25'), // Far from document
283
+ }),
284
+ ],
285
+ };
286
+ const docCharge = {
287
+ chargeId: 'charge-doc-11',
288
+ documents: [
289
+ createMockDocument({
290
+ date: new Date('2024-01-10'), // Matches event_date
291
+ type: 'OTHER',
292
+ }),
293
+ ],
294
+ };
295
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
296
+ // Should use event_date since it matches better
297
+ expect(result.components.date).toBe(1.0);
298
+ });
299
+ it('should handle UNPROCESSED type', () => {
300
+ const txCharge = {
301
+ chargeId: 'charge-tx-12',
302
+ transactions: [
303
+ createMockTransaction({
304
+ event_date: new Date('2024-01-15'),
305
+ debit_date: new Date('2024-01-15'),
306
+ debit_timestamp: null,
307
+ }),
308
+ ],
309
+ };
310
+ const docCharge = {
311
+ chargeId: 'charge-doc-12',
312
+ documents: [
313
+ createMockDocument({
314
+ date: new Date('2024-01-15'),
315
+ type: 'UNPROCESSED',
316
+ }),
317
+ ],
318
+ };
319
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
320
+ expect(result.components.date).toBe(1.0);
321
+ });
322
+ it('should handle flexible type without debit_date', () => {
323
+ const txCharge = {
324
+ chargeId: 'charge-tx-13',
325
+ transactions: [
326
+ createMockTransaction({
327
+ event_date: new Date('2024-01-15'),
328
+ debit_date: null,
329
+ debit_timestamp: null,
330
+ }),
331
+ ],
332
+ };
333
+ const docCharge = {
334
+ chargeId: 'charge-doc-13',
335
+ documents: [
336
+ createMockDocument({
337
+ date: new Date('2024-01-15'),
338
+ type: 'OTHER',
339
+ }),
340
+ ],
341
+ };
342
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
343
+ // Should only use event_date
344
+ expect(result.components.date).toBe(1.0);
345
+ });
346
+ });
347
+ describe('Amount Variations', () => {
348
+ it('should handle small amount differences', () => {
349
+ const txCharge = {
350
+ chargeId: 'charge-tx-14',
351
+ transactions: [createMockTransaction({ amount: "100.00" })],
352
+ };
353
+ const docCharge = {
354
+ chargeId: 'charge-doc-14',
355
+ documents: [createMockDocument({ total_amount: 100.5 })], // 0.5 difference
356
+ };
357
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
358
+ expect(result.components.amount).toBeGreaterThanOrEqual(0.9); // Within 1 unit = exactly 0.9
359
+ });
360
+ it('should handle large amount differences', () => {
361
+ const txCharge = {
362
+ chargeId: 'charge-tx-15',
363
+ transactions: [createMockTransaction({ amount: "100.00" })],
364
+ };
365
+ const docCharge = {
366
+ chargeId: 'charge-doc-15',
367
+ documents: [createMockDocument({ total_amount: 150 })], // 50% difference
368
+ };
369
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
370
+ expect(result.components.amount).toBe(0.0);
371
+ });
372
+ });
373
+ describe('Integration Tests', () => {
374
+ it('should handle multiple transactions and documents', () => {
375
+ const txCharge = {
376
+ chargeId: 'charge-tx-16',
377
+ transactions: [
378
+ createMockTransaction({ amount: "50.00", source_description: 'Part 1' }),
379
+ createMockTransaction({ amount: "50.00", source_description: 'Part 2' }),
380
+ ],
381
+ };
382
+ const docCharge = {
383
+ chargeId: 'charge-doc-16',
384
+ documents: [
385
+ createMockDocument({ total_amount: 100, serial_number: 'INV-001' }),
386
+ ],
387
+ };
388
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
389
+ expect(result.components.amount).toBe(1.0); // 50 + 50 = 100
390
+ expect(result.confidenceScore).toBeGreaterThan(0.95);
391
+ });
392
+ it('should handle credit invoice (negative amounts)', () => {
393
+ const txCharge = {
394
+ chargeId: 'charge-tx-17',
395
+ transactions: [createMockTransaction({ amount: "-100.00" })],
396
+ };
397
+ const docCharge = {
398
+ chargeId: 'charge-doc-17',
399
+ documents: [
400
+ createMockDocument({
401
+ total_amount: 100,
402
+ type: 'CREDIT_INVOICE',
403
+ creditor_id: USER_ID, // Business is debtor
404
+ debtor_id: BUSINESS_ID,
405
+ }),
406
+ ],
407
+ };
408
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
409
+ expect(result.components.amount).toBe(1.0);
410
+ });
411
+ it('should handle real-world scenario with slight variations', () => {
412
+ const txCharge = {
413
+ chargeId: 'charge-tx-18',
414
+ transactions: [
415
+ createMockTransaction({
416
+ amount: "1234.56",
417
+ currency: 'USD',
418
+ event_date: new Date('2024-03-15'),
419
+ debit_date: new Date('2024-03-17'),
420
+ business_id: 'vendor-xyz',
421
+ }),
422
+ ],
423
+ };
424
+ const docCharge = {
425
+ chargeId: 'charge-doc-18',
426
+ documents: [
427
+ createMockDocument({
428
+ total_amount: 1234.5,
429
+ currency_code: 'USD',
430
+ date: new Date('2024-03-16'), // 1 day difference from tx event_date
431
+ creditor_id: 'vendor-xyz',
432
+ debtor_id: USER_ID,
433
+ type: 'INVOICE',
434
+ }),
435
+ ],
436
+ };
437
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
438
+ expect(result.components.amount).toBeGreaterThanOrEqual(0.9); // Within 1 unit = 0.9
439
+ expect(result.components.currency).toBe(1.0);
440
+ expect(result.components.business).toBe(1.0);
441
+ expect(result.components.date).toBeGreaterThan(0.95); // 1 day = 0.97
442
+ expect(result.confidenceScore).toBeGreaterThanOrEqual(0.9);
443
+ });
444
+ });
445
+ describe('Error Propagation', () => {
446
+ it('should throw error for mixed currencies in transactions', () => {
447
+ const txCharge = {
448
+ chargeId: 'charge-tx-19',
449
+ transactions: [
450
+ createMockTransaction({ currency: 'USD' }),
451
+ createMockTransaction({ currency: 'EUR' }),
452
+ ],
453
+ };
454
+ const docCharge = {
455
+ chargeId: 'charge-doc-19',
456
+ documents: [createMockDocument()],
457
+ };
458
+ expect(() => scoreMatch(txCharge, docCharge, USER_ID)).toThrow(/multiple currencies/);
459
+ });
460
+ it('should throw error for mixed currencies in documents', () => {
461
+ const txCharge = {
462
+ chargeId: 'charge-tx-20',
463
+ transactions: [createMockTransaction()],
464
+ };
465
+ const docCharge = {
466
+ chargeId: 'charge-doc-20',
467
+ documents: [
468
+ createMockDocument({ currency_code: 'USD' }),
469
+ createMockDocument({ currency_code: 'EUR' }),
470
+ ],
471
+ };
472
+ expect(() => scoreMatch(txCharge, docCharge, USER_ID)).toThrow(/multiple currencies/);
473
+ });
474
+ it('should throw error for multiple business IDs in transactions', () => {
475
+ const txCharge = {
476
+ chargeId: 'charge-tx-21',
477
+ transactions: [
478
+ createMockTransaction({ business_id: 'business-1' }),
479
+ createMockTransaction({ business_id: 'business-2' }),
480
+ ],
481
+ };
482
+ const docCharge = {
483
+ chargeId: 'charge-doc-21',
484
+ documents: [createMockDocument()],
485
+ };
486
+ expect(() => scoreMatch(txCharge, docCharge, USER_ID)).toThrow(/multiple business/);
487
+ });
488
+ it('should throw error for invalid document business extraction', () => {
489
+ const txCharge = {
490
+ chargeId: 'charge-tx-22',
491
+ transactions: [createMockTransaction()],
492
+ };
493
+ const docCharge = {
494
+ chargeId: 'charge-doc-22',
495
+ documents: [
496
+ createMockDocument({
497
+ creditor_id: 'other-user',
498
+ debtor_id: 'another-user',
499
+ }),
500
+ ],
501
+ };
502
+ expect(() => scoreMatch(txCharge, docCharge, USER_ID)).toThrow();
503
+ });
504
+ });
505
+ describe('Edge Cases', () => {
506
+ it('should handle null business IDs', () => {
507
+ const txCharge = {
508
+ chargeId: 'charge-tx-23',
509
+ transactions: [createMockTransaction({ business_id: null })],
510
+ };
511
+ const docCharge = {
512
+ chargeId: 'charge-doc-23',
513
+ documents: [
514
+ createMockDocument({
515
+ creditor_id: USER_ID,
516
+ debtor_id: null,
517
+ }),
518
+ ],
519
+ };
520
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
521
+ expect(result.components.business).toBe(0.5);
522
+ });
523
+ it('should handle zero amounts', () => {
524
+ const txCharge = {
525
+ chargeId: 'charge-tx-24',
526
+ transactions: [createMockTransaction({ amount: '0.00' })],
527
+ };
528
+ const docCharge = {
529
+ chargeId: 'charge-doc-24',
530
+ documents: [createMockDocument({ total_amount: 0 })],
531
+ };
532
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
533
+ expect(result.components.amount).toBe(1.0);
534
+ });
535
+ it('should handle very large amounts', () => {
536
+ const txCharge = {
537
+ chargeId: 'charge-tx-25',
538
+ transactions: [createMockTransaction({ amount: '1000000.00' })],
539
+ };
540
+ const docCharge = {
541
+ chargeId: 'charge-doc-25',
542
+ documents: [createMockDocument({ total_amount: 1000000 })],
543
+ };
544
+ const result = scoreMatch(txCharge, docCharge, USER_ID);
545
+ expect(result.components.amount).toBe(1.0);
546
+ });
547
+ });
548
+ });
549
+ });
550
+ //# sourceMappingURL=match-scorer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-scorer.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/match-scorer.test.ts"],"names":[],"mappings":"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"}