@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,301 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { validateChargeForMatching, validateChargeIsUnmatched, isChargeMatched, hasOnlyTransactions, hasOnlyDocuments, } from '../helpers/charge-validator.helper.js';
3
+ import { createMockTransaction, createMockDocument } from './test-helpers.js';
4
+ describe('Charge Validator', () => {
5
+ describe('validateChargeForMatching', () => {
6
+ it('should pass for charge with transactions', () => {
7
+ const charge = {
8
+ id: 'charge-1',
9
+ owner_id: 'user-1',
10
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
11
+ documents: [],
12
+ };
13
+ expect(() => validateChargeForMatching(charge)).not.toThrow();
14
+ });
15
+ it('should pass for charge with documents', () => {
16
+ const charge = {
17
+ id: 'charge-1',
18
+ owner_id: 'user-1',
19
+ transactions: [],
20
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
21
+ };
22
+ expect(() => validateChargeForMatching(charge)).not.toThrow();
23
+ });
24
+ it('should pass for charge with both transactions and documents', () => {
25
+ const charge = {
26
+ id: 'charge-1',
27
+ owner_id: 'user-1',
28
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
29
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
30
+ };
31
+ expect(() => validateChargeForMatching(charge)).not.toThrow();
32
+ });
33
+ it('should throw if charge is null', () => {
34
+ expect(() => validateChargeForMatching(null)).toThrow('Charge is required');
35
+ });
36
+ it('should throw if charge is undefined', () => {
37
+ expect(() => validateChargeForMatching(undefined)).toThrow('Charge is required');
38
+ });
39
+ it('should throw if charge has no ID', () => {
40
+ const charge = {
41
+ id: '',
42
+ owner_id: 'user-1',
43
+ transactions: [createMockTransaction()],
44
+ documents: [],
45
+ };
46
+ expect(() => validateChargeForMatching(charge)).toThrow('Charge must have an ID');
47
+ });
48
+ it('should throw if charge has no owner_id', () => {
49
+ const charge = {
50
+ id: 'charge-1',
51
+ owner_id: null,
52
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
53
+ documents: [],
54
+ };
55
+ expect(() => validateChargeForMatching(charge)).toThrow('must have an owner_id');
56
+ });
57
+ it('should throw if charge has no transactions and no documents', () => {
58
+ const charge = {
59
+ id: 'charge-1',
60
+ owner_id: 'user-1',
61
+ transactions: [],
62
+ documents: [],
63
+ };
64
+ expect(() => validateChargeForMatching(charge)).toThrow('has no transactions or documents');
65
+ });
66
+ it('should throw if charge has undefined transactions and documents', () => {
67
+ const charge = {
68
+ id: 'charge-1',
69
+ owner_id: 'user-1',
70
+ transactions: undefined,
71
+ documents: undefined,
72
+ };
73
+ expect(() => validateChargeForMatching(charge)).toThrow('has no transactions or documents');
74
+ });
75
+ });
76
+ describe('isChargeMatched', () => {
77
+ it('should return true for charge with transactions and accounting documents', () => {
78
+ const charge = {
79
+ id: 'charge-1',
80
+ owner_id: 'user-1',
81
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
82
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
83
+ };
84
+ expect(isChargeMatched(charge)).toBe(true);
85
+ });
86
+ it('should return true for charge with CREDIT_INVOICE', () => {
87
+ const charge = {
88
+ id: 'charge-1',
89
+ owner_id: 'user-1',
90
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
91
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'CREDIT_INVOICE' })],
92
+ };
93
+ expect(isChargeMatched(charge)).toBe(true);
94
+ });
95
+ it('should return true for charge with RECEIPT', () => {
96
+ const charge = {
97
+ id: 'charge-1',
98
+ owner_id: 'user-1',
99
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
100
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'RECEIPT' })],
101
+ };
102
+ expect(isChargeMatched(charge)).toBe(true);
103
+ });
104
+ it('should return true for charge with INVOICE_RECEIPT', () => {
105
+ const charge = {
106
+ id: 'charge-1',
107
+ owner_id: 'user-1',
108
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
109
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE_RECEIPT' })],
110
+ };
111
+ expect(isChargeMatched(charge)).toBe(true);
112
+ });
113
+ it('should return false for charge with only transactions', () => {
114
+ const charge = {
115
+ id: 'charge-1',
116
+ owner_id: 'user-1',
117
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
118
+ documents: [],
119
+ };
120
+ expect(isChargeMatched(charge)).toBe(false);
121
+ });
122
+ it('should return false for charge with only documents', () => {
123
+ const charge = {
124
+ id: 'charge-1',
125
+ owner_id: 'user-1',
126
+ transactions: [],
127
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
128
+ };
129
+ expect(isChargeMatched(charge)).toBe(false);
130
+ });
131
+ it('should return false for charge with transactions and PROFORMA (non-accounting doc)', () => {
132
+ const charge = {
133
+ id: 'charge-1',
134
+ owner_id: 'user-1',
135
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
136
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'PROFORMA' })],
137
+ };
138
+ expect(isChargeMatched(charge)).toBe(false);
139
+ });
140
+ it('should return false for charge with transactions and OTHER (non-accounting doc)', () => {
141
+ const charge = {
142
+ id: 'charge-1',
143
+ owner_id: 'user-1',
144
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
145
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'OTHER' })],
146
+ };
147
+ expect(isChargeMatched(charge)).toBe(false);
148
+ });
149
+ it('should return false for charge with transactions and UNPROCESSED (non-accounting doc)', () => {
150
+ const charge = {
151
+ id: 'charge-1',
152
+ owner_id: 'user-1',
153
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
154
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'UNPROCESSED' })],
155
+ };
156
+ expect(isChargeMatched(charge)).toBe(false);
157
+ });
158
+ });
159
+ describe('hasOnlyTransactions', () => {
160
+ it('should return true for charge with only transactions', () => {
161
+ const charge = {
162
+ id: 'charge-1',
163
+ owner_id: 'user-1',
164
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
165
+ documents: [],
166
+ };
167
+ expect(hasOnlyTransactions(charge)).toBe(true);
168
+ });
169
+ it('should return true for charge with transactions and non-accounting documents', () => {
170
+ const charge = {
171
+ id: 'charge-1',
172
+ owner_id: 'user-1',
173
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
174
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'PROFORMA' })],
175
+ };
176
+ expect(hasOnlyTransactions(charge)).toBe(true);
177
+ });
178
+ it('should return false for charge with transactions and accounting documents', () => {
179
+ const charge = {
180
+ id: 'charge-1',
181
+ owner_id: 'user-1',
182
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
183
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
184
+ };
185
+ expect(hasOnlyTransactions(charge)).toBe(false);
186
+ });
187
+ it('should return false for charge with only documents', () => {
188
+ const charge = {
189
+ id: 'charge-1',
190
+ owner_id: 'user-1',
191
+ transactions: [],
192
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
193
+ };
194
+ expect(hasOnlyTransactions(charge)).toBe(false);
195
+ });
196
+ it('should return false for charge with no data', () => {
197
+ const charge = {
198
+ id: 'charge-1',
199
+ owner_id: 'user-1',
200
+ transactions: [],
201
+ documents: [],
202
+ };
203
+ expect(hasOnlyTransactions(charge)).toBe(false);
204
+ });
205
+ });
206
+ describe('hasOnlyDocuments', () => {
207
+ it('should return true for charge with only accounting documents', () => {
208
+ const charge = {
209
+ id: 'charge-1',
210
+ owner_id: 'user-1',
211
+ transactions: [],
212
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
213
+ };
214
+ expect(hasOnlyDocuments(charge)).toBe(true);
215
+ });
216
+ it('should return true for charge with CREDIT_INVOICE', () => {
217
+ const charge = {
218
+ id: 'charge-1',
219
+ owner_id: 'user-1',
220
+ transactions: [],
221
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'CREDIT_INVOICE' })],
222
+ };
223
+ expect(hasOnlyDocuments(charge)).toBe(true);
224
+ });
225
+ it('should return false for charge with only non-accounting documents', () => {
226
+ const charge = {
227
+ id: 'charge-1',
228
+ owner_id: 'user-1',
229
+ transactions: [],
230
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'PROFORMA' })],
231
+ };
232
+ expect(hasOnlyDocuments(charge)).toBe(false);
233
+ });
234
+ it('should return false for charge with transactions and documents', () => {
235
+ const charge = {
236
+ id: 'charge-1',
237
+ owner_id: 'user-1',
238
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
239
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
240
+ };
241
+ expect(hasOnlyDocuments(charge)).toBe(false);
242
+ });
243
+ it('should return false for charge with only transactions', () => {
244
+ const charge = {
245
+ id: 'charge-1',
246
+ owner_id: 'user-1',
247
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
248
+ documents: [],
249
+ };
250
+ expect(hasOnlyDocuments(charge)).toBe(false);
251
+ });
252
+ it('should return false for charge with no data', () => {
253
+ const charge = {
254
+ id: 'charge-1',
255
+ owner_id: 'user-1',
256
+ transactions: [],
257
+ documents: [],
258
+ };
259
+ expect(hasOnlyDocuments(charge)).toBe(false);
260
+ });
261
+ });
262
+ describe('validateChargeIsUnmatched', () => {
263
+ it('should pass for charge with only transactions', () => {
264
+ const charge = {
265
+ id: 'charge-1',
266
+ owner_id: 'user-1',
267
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
268
+ documents: [],
269
+ };
270
+ expect(() => validateChargeIsUnmatched(charge)).not.toThrow();
271
+ });
272
+ it('should pass for charge with only documents', () => {
273
+ const charge = {
274
+ id: 'charge-1',
275
+ owner_id: 'user-1',
276
+ transactions: [],
277
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
278
+ };
279
+ expect(() => validateChargeIsUnmatched(charge)).not.toThrow();
280
+ });
281
+ it('should throw for charge with both transactions and accounting documents', () => {
282
+ const charge = {
283
+ id: 'charge-1',
284
+ owner_id: 'user-1',
285
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
286
+ documents: [createMockDocument({ charge_id: 'charge-1', type: 'INVOICE' })],
287
+ };
288
+ expect(() => validateChargeIsUnmatched(charge)).toThrow('is already matched');
289
+ });
290
+ it('should propagate validation errors', () => {
291
+ const charge = {
292
+ id: 'charge-1',
293
+ owner_id: null,
294
+ transactions: [createMockTransaction({ charge_id: 'charge-1' })],
295
+ documents: [],
296
+ };
297
+ expect(() => validateChargeIsUnmatched(charge)).toThrow('must have an owner_id');
298
+ });
299
+ });
300
+ });
301
+ //# sourceMappingURL=charge-validator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charge-validator.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/charge-validator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { calculateCurrencyConfidence } from '../helpers/currency-confidence.helper.js';
3
+ describe('calculateCurrencyConfidence', () => {
4
+ describe('same currency', () => {
5
+ it('should return 1.0 for identical USD', () => {
6
+ expect(calculateCurrencyConfidence('USD', 'USD')).toBe(1.0);
7
+ });
8
+ it('should return 1.0 for identical EUR', () => {
9
+ expect(calculateCurrencyConfidence('EUR', 'EUR')).toBe(1.0);
10
+ });
11
+ it('should return 1.0 for identical ILS', () => {
12
+ expect(calculateCurrencyConfidence('ILS', 'ILS')).toBe(1.0);
13
+ });
14
+ it('should return 1.0 for identical GBP', () => {
15
+ expect(calculateCurrencyConfidence('GBP', 'GBP')).toBe(1.0);
16
+ });
17
+ it('should return 1.0 for identical USDC', () => {
18
+ expect(calculateCurrencyConfidence('USDC', 'USDC')).toBe(1.0);
19
+ });
20
+ it('should return 1.0 for identical GRT', () => {
21
+ expect(calculateCurrencyConfidence('GRT', 'GRT')).toBe(1.0);
22
+ });
23
+ it('should return 1.0 for identical ETH', () => {
24
+ expect(calculateCurrencyConfidence('ETH', 'ETH')).toBe(1.0);
25
+ });
26
+ });
27
+ describe('different currencies', () => {
28
+ it('should return 0.0 for USD vs EUR', () => {
29
+ expect(calculateCurrencyConfidence('USD', 'EUR')).toBe(0.0);
30
+ });
31
+ it('should return 0.0 for ILS vs USD', () => {
32
+ expect(calculateCurrencyConfidence('ILS', 'USD')).toBe(0.0);
33
+ });
34
+ it('should return 0.0 for EUR vs GBP', () => {
35
+ expect(calculateCurrencyConfidence('EUR', 'GBP')).toBe(0.0);
36
+ });
37
+ it('should return 0.0 for GRT vs ETH', () => {
38
+ expect(calculateCurrencyConfidence('GRT', 'ETH')).toBe(0.0);
39
+ });
40
+ it('should return 0.0 for USDC vs USD', () => {
41
+ expect(calculateCurrencyConfidence('USDC', 'USD')).toBe(0.0);
42
+ });
43
+ });
44
+ describe('case sensitivity', () => {
45
+ it('should be case-insensitive for uppercase vs lowercase', () => {
46
+ expect(calculateCurrencyConfidence('USD', 'usd')).toBe(1.0);
47
+ });
48
+ it('should be case-insensitive for lowercase vs uppercase', () => {
49
+ expect(calculateCurrencyConfidence('eur', 'EUR')).toBe(1.0);
50
+ });
51
+ it('should be case-insensitive for mixed case', () => {
52
+ expect(calculateCurrencyConfidence('Usd', 'UsD')).toBe(1.0);
53
+ });
54
+ it('should be case-insensitive for ILS variations', () => {
55
+ expect(calculateCurrencyConfidence('ILS', 'ils')).toBe(1.0);
56
+ expect(calculateCurrencyConfidence('ils', 'ILS')).toBe(1.0);
57
+ });
58
+ });
59
+ describe('edge cases with null and undefined', () => {
60
+ it('should return 0.2 when transaction currency is null', () => {
61
+ expect(calculateCurrencyConfidence(null, 'USD')).toBe(0.2);
62
+ });
63
+ it('should return 0.2 when document currency is null', () => {
64
+ expect(calculateCurrencyConfidence('USD', null)).toBe(0.2);
65
+ });
66
+ it('should return 0.2 when both currencies are null', () => {
67
+ expect(calculateCurrencyConfidence(null, null)).toBe(0.2);
68
+ });
69
+ it('should return 0.2 when transaction currency is undefined', () => {
70
+ expect(calculateCurrencyConfidence(undefined, 'USD')).toBe(0.2);
71
+ });
72
+ it('should return 0.2 when document currency is undefined', () => {
73
+ expect(calculateCurrencyConfidence('USD', undefined)).toBe(0.2);
74
+ });
75
+ it('should return 0.2 when both currencies are undefined', () => {
76
+ expect(calculateCurrencyConfidence(undefined, undefined)).toBe(0.2);
77
+ });
78
+ it('should return 0.2 when transaction is null and document is undefined', () => {
79
+ expect(calculateCurrencyConfidence(null, undefined)).toBe(0.2);
80
+ });
81
+ it('should return 0.2 when transaction is undefined and document is null', () => {
82
+ expect(calculateCurrencyConfidence(undefined, null)).toBe(0.2);
83
+ });
84
+ });
85
+ describe('edge cases with empty strings', () => {
86
+ it('should return 0.2 when transaction currency is empty string', () => {
87
+ expect(calculateCurrencyConfidence('', 'USD')).toBe(0.2);
88
+ });
89
+ it('should return 0.2 when document currency is empty string', () => {
90
+ expect(calculateCurrencyConfidence('USD', '')).toBe(0.2);
91
+ });
92
+ it('should return 0.2 when both currencies are empty strings', () => {
93
+ expect(calculateCurrencyConfidence('', '')).toBe(0.2);
94
+ });
95
+ });
96
+ describe('symmetry', () => {
97
+ it('should return same result regardless of parameter order for same currencies', () => {
98
+ expect(calculateCurrencyConfidence('USD', 'EUR')).toBe(calculateCurrencyConfidence('EUR', 'USD'));
99
+ });
100
+ it('should return same result regardless of parameter order for matching currencies', () => {
101
+ expect(calculateCurrencyConfidence('USD', 'USD')).toBe(calculateCurrencyConfidence('USD', 'USD'));
102
+ });
103
+ });
104
+ describe('return value validation', () => {
105
+ it('should return exactly 1.0, 0.2, or 0.0 (no other values)', () => {
106
+ const result1 = calculateCurrencyConfidence('USD', 'USD');
107
+ const result2 = calculateCurrencyConfidence('USD', 'EUR');
108
+ const result3 = calculateCurrencyConfidence(null, 'USD');
109
+ expect([1.0, 0.2, 0.0]).toContain(result1);
110
+ expect([1.0, 0.2, 0.0]).toContain(result2);
111
+ expect([1.0, 0.2, 0.0]).toContain(result3);
112
+ });
113
+ it('should return numbers with correct precision', () => {
114
+ const match = calculateCurrencyConfidence('USD', 'USD');
115
+ const mismatch = calculateCurrencyConfidence('USD', 'EUR');
116
+ const missing = calculateCurrencyConfidence(null, 'USD');
117
+ expect(match).toBe(1.0);
118
+ expect(mismatch).toBe(0.0);
119
+ expect(missing).toBe(0.2);
120
+ // Verify exact values
121
+ expect(match === 1.0).toBe(true);
122
+ expect(mismatch === 0.0).toBe(true);
123
+ expect(missing === 0.2).toBe(true);
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=currency-confidence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency-confidence.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/currency-confidence.test.ts"],"names":[],"mappings":"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"}