@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,410 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { calculateOverallConfidence, } from '../helpers/overall-confidence.helper.js';
3
+ describe('Overall Confidence Calculator', () => {
4
+ describe('Perfect Matches', () => {
5
+ it('should return 1.0 when all components are 1.0', () => {
6
+ const components = {
7
+ amount: 1.0,
8
+ currency: 1.0,
9
+ business: 1.0,
10
+ date: 1.0,
11
+ };
12
+ expect(calculateOverallConfidence(components)).toBe(1.0);
13
+ });
14
+ it('should return 1.0 when all components are exactly 1.0', () => {
15
+ const result = calculateOverallConfidence({
16
+ amount: 1.0,
17
+ currency: 1.0,
18
+ business: 1.0,
19
+ date: 1.0,
20
+ });
21
+ expect(result).toBe(1.0);
22
+ expect(typeof result).toBe('number');
23
+ });
24
+ });
25
+ describe('Zero Matches', () => {
26
+ it('should return 0.0 when all components are 0.0', () => {
27
+ const components = {
28
+ amount: 0.0,
29
+ currency: 0.0,
30
+ business: 0.0,
31
+ date: 0.0,
32
+ };
33
+ expect(calculateOverallConfidence(components)).toBe(0.0);
34
+ });
35
+ });
36
+ describe('Weighted Formula Verification', () => {
37
+ it('should correctly apply amount weight (0.4)', () => {
38
+ // Only amount is 1.0, others are 0.0
39
+ const result = calculateOverallConfidence({
40
+ amount: 1.0,
41
+ currency: 0.0,
42
+ business: 0.0,
43
+ date: 0.0,
44
+ });
45
+ expect(result).toBe(0.4);
46
+ });
47
+ it('should correctly apply currency weight (0.2)', () => {
48
+ // Only currency is 1.0, others are 0.0
49
+ const result = calculateOverallConfidence({
50
+ amount: 0.0,
51
+ currency: 1.0,
52
+ business: 0.0,
53
+ date: 0.0,
54
+ });
55
+ expect(result).toBe(0.2);
56
+ });
57
+ it('should correctly apply business weight (0.3)', () => {
58
+ // Only business is 1.0, others are 0.0
59
+ const result = calculateOverallConfidence({
60
+ amount: 0.0,
61
+ currency: 0.0,
62
+ business: 1.0,
63
+ date: 0.0,
64
+ });
65
+ expect(result).toBe(0.3);
66
+ });
67
+ it('should correctly apply date weight (0.1)', () => {
68
+ // Only date is 1.0, others are 0.0
69
+ const result = calculateOverallConfidence({
70
+ amount: 0.0,
71
+ currency: 0.0,
72
+ business: 0.0,
73
+ date: 1.0,
74
+ });
75
+ expect(result).toBe(0.1);
76
+ });
77
+ it('should verify weights sum to 1.0', () => {
78
+ // When all components are 1.0, result should be 1.0
79
+ // This verifies: 0.4 + 0.2 + 0.3 + 0.1 = 1.0
80
+ const result = calculateOverallConfidence({
81
+ amount: 1.0,
82
+ currency: 1.0,
83
+ business: 1.0,
84
+ date: 1.0,
85
+ });
86
+ expect(result).toBe(1.0);
87
+ });
88
+ });
89
+ describe('Mixed Confidence Scenarios', () => {
90
+ it('should handle typical good match (all high)', () => {
91
+ const result = calculateOverallConfidence({
92
+ amount: 0.9,
93
+ currency: 1.0,
94
+ business: 1.0,
95
+ date: 1.0,
96
+ });
97
+ // (0.9 × 0.4) + (1.0 × 0.2) + (1.0 × 0.3) + (1.0 × 0.1) = 0.96
98
+ expect(result).toBe(0.96);
99
+ });
100
+ it('should handle partial match (mixed scores)', () => {
101
+ const result = calculateOverallConfidence({
102
+ amount: 0.9,
103
+ currency: 1.0,
104
+ business: 0.5,
105
+ date: 0.8,
106
+ });
107
+ // (0.9 × 0.4) + (1.0 × 0.2) + (0.5 × 0.3) + (0.8 × 0.1)
108
+ // = 0.36 + 0.2 + 0.15 + 0.08 = 0.79
109
+ expect(result).toBe(0.79);
110
+ });
111
+ it('should handle uncertain business with good other factors', () => {
112
+ const result = calculateOverallConfidence({
113
+ amount: 1.0,
114
+ currency: 1.0,
115
+ business: 0.5,
116
+ date: 1.0,
117
+ });
118
+ // (1.0 × 0.4) + (1.0 × 0.2) + (0.5 × 0.3) + (1.0 × 0.1)
119
+ // = 0.4 + 0.2 + 0.15 + 0.1 = 0.85
120
+ expect(result).toBe(0.85);
121
+ });
122
+ it('should handle missing currency with good match otherwise', () => {
123
+ const result = calculateOverallConfidence({
124
+ amount: 1.0,
125
+ currency: 0.2, // Missing currency penalty
126
+ business: 1.0,
127
+ date: 1.0,
128
+ });
129
+ // (1.0 × 0.4) + (0.2 × 0.2) + (1.0 × 0.3) + (1.0 × 0.1)
130
+ // = 0.4 + 0.04 + 0.3 + 0.1 = 0.84
131
+ expect(result).toBe(0.84);
132
+ });
133
+ it('should handle business mismatch with good amount/currency', () => {
134
+ const result = calculateOverallConfidence({
135
+ amount: 1.0,
136
+ currency: 1.0,
137
+ business: 0.2, // Mismatch
138
+ date: 1.0,
139
+ });
140
+ // (1.0 × 0.4) + (1.0 × 0.2) + (0.2 × 0.3) + (1.0 × 0.1)
141
+ // = 0.4 + 0.2 + 0.06 + 0.1 = 0.76
142
+ expect(result).toBe(0.76);
143
+ });
144
+ it('should handle old date with perfect other factors', () => {
145
+ const result = calculateOverallConfidence({
146
+ amount: 1.0,
147
+ currency: 1.0,
148
+ business: 1.0,
149
+ date: 0.0, // 30+ days apart
150
+ });
151
+ // (1.0 × 0.4) + (1.0 × 0.2) + (1.0 × 0.3) + (0.0 × 0.1)
152
+ // = 0.4 + 0.2 + 0.3 + 0.0 = 0.9
153
+ expect(result).toBe(0.9);
154
+ });
155
+ });
156
+ describe('Auto-Match Threshold Scenarios', () => {
157
+ it('should identify clear auto-match candidate (≥0.95)', () => {
158
+ const result = calculateOverallConfidence({
159
+ amount: 1.0,
160
+ currency: 1.0,
161
+ business: 1.0,
162
+ date: 0.5,
163
+ });
164
+ // (1.0 × 0.4) + (1.0 × 0.2) + (1.0 × 0.3) + (0.5 × 0.1)
165
+ // = 0.4 + 0.2 + 0.3 + 0.05 = 0.95
166
+ expect(result).toBe(0.95);
167
+ expect(result).toBeGreaterThanOrEqual(0.95);
168
+ });
169
+ it('should identify borderline case (just below threshold)', () => {
170
+ const result = calculateOverallConfidence({
171
+ amount: 0.9,
172
+ currency: 1.0,
173
+ business: 1.0,
174
+ date: 0.9,
175
+ });
176
+ // (0.9 × 0.4) + (1.0 × 0.2) + (1.0 × 0.3) + (0.9 × 0.1)
177
+ // = 0.36 + 0.2 + 0.3 + 0.09 = 0.95
178
+ expect(result).toBe(0.95);
179
+ });
180
+ it('should identify case just above threshold', () => {
181
+ const result = calculateOverallConfidence({
182
+ amount: 1.0,
183
+ currency: 1.0,
184
+ business: 1.0,
185
+ date: 0.6,
186
+ });
187
+ // (1.0 × 0.4) + (1.0 × 0.2) + (1.0 × 0.3) + (0.6 × 0.1)
188
+ // = 0.4 + 0.2 + 0.3 + 0.06 = 0.96
189
+ expect(result).toBe(0.96);
190
+ expect(result).toBeGreaterThan(0.95);
191
+ });
192
+ });
193
+ describe('Decimal Precision', () => {
194
+ it('should round to 2 decimal places', () => {
195
+ const result = calculateOverallConfidence({
196
+ amount: 0.333,
197
+ currency: 0.667,
198
+ business: 0.555,
199
+ date: 0.444,
200
+ });
201
+ // (0.333 × 0.4) + (0.667 × 0.2) + (0.555 × 0.3) + (0.444 × 0.1)
202
+ // = 0.1332 + 0.1334 + 0.1665 + 0.0444 = 0.4775
203
+ expect(result).toBe(0.48);
204
+ });
205
+ it('should handle rounding edge case (0.445 rounds to 0.45)', () => {
206
+ const result = calculateOverallConfidence({
207
+ amount: 0.5,
208
+ currency: 0.5,
209
+ business: 0.5,
210
+ date: 0.0,
211
+ });
212
+ // (0.5 × 0.4) + (0.5 × 0.2) + (0.5 × 0.3) + (0.0 × 0.1)
213
+ // = 0.2 + 0.1 + 0.15 + 0.0 = 0.45
214
+ expect(result).toBe(0.45);
215
+ });
216
+ it('should handle precise calculation without floating point errors', () => {
217
+ const result = calculateOverallConfidence({
218
+ amount: 0.1,
219
+ currency: 0.2,
220
+ business: 0.3,
221
+ date: 0.4,
222
+ });
223
+ // (0.1 × 0.4) + (0.2 × 0.2) + (0.3 × 0.3) + (0.4 × 0.1)
224
+ // = 0.04 + 0.04 + 0.09 + 0.04 = 0.21
225
+ expect(result).toBe(0.21);
226
+ });
227
+ });
228
+ describe('Edge Cases', () => {
229
+ it('should handle all components at 0.5', () => {
230
+ const result = calculateOverallConfidence({
231
+ amount: 0.5,
232
+ currency: 0.5,
233
+ business: 0.5,
234
+ date: 0.5,
235
+ });
236
+ // (0.5 × 0.4) + (0.5 × 0.2) + (0.5 × 0.3) + (0.5 × 0.1)
237
+ // = 0.2 + 0.1 + 0.15 + 0.05 = 0.5
238
+ expect(result).toBe(0.5);
239
+ });
240
+ it('should handle very small non-zero values', () => {
241
+ const result = calculateOverallConfidence({
242
+ amount: 0.01,
243
+ currency: 0.01,
244
+ business: 0.01,
245
+ date: 0.01,
246
+ });
247
+ // (0.01 × 0.4) + (0.01 × 0.2) + (0.01 × 0.3) + (0.01 × 0.1)
248
+ // = 0.004 + 0.002 + 0.003 + 0.001 = 0.01
249
+ expect(result).toBe(0.01);
250
+ });
251
+ it('should handle values very close to 1.0', () => {
252
+ const result = calculateOverallConfidence({
253
+ amount: 0.99,
254
+ currency: 0.99,
255
+ business: 0.99,
256
+ date: 0.99,
257
+ });
258
+ // (0.99 × 0.4) + (0.99 × 0.2) + (0.99 × 0.3) + (0.99 × 0.1)
259
+ // = 0.396 + 0.198 + 0.297 + 0.099 = 0.99
260
+ expect(result).toBe(0.99);
261
+ });
262
+ });
263
+ describe('Validation - Missing Components', () => {
264
+ it('should throw error when amount is null', () => {
265
+ expect(() => calculateOverallConfidence({
266
+ amount: null,
267
+ currency: 1.0,
268
+ business: 1.0,
269
+ date: 1.0,
270
+ })).toThrow('Amount confidence is required');
271
+ });
272
+ it('should throw error when currency is null', () => {
273
+ expect(() => calculateOverallConfidence({
274
+ amount: 1.0,
275
+ currency: null,
276
+ business: 1.0,
277
+ date: 1.0,
278
+ })).toThrow('Currency confidence is required');
279
+ });
280
+ it('should throw error when business is null', () => {
281
+ expect(() => calculateOverallConfidence({
282
+ amount: 1.0,
283
+ currency: 1.0,
284
+ business: null,
285
+ date: 1.0,
286
+ })).toThrow('Business confidence is required');
287
+ });
288
+ it('should throw error when date is null', () => {
289
+ expect(() => calculateOverallConfidence({
290
+ amount: 1.0,
291
+ currency: 1.0,
292
+ business: 1.0,
293
+ date: null,
294
+ })).toThrow('Date confidence is required');
295
+ });
296
+ it('should throw error when amount is undefined', () => {
297
+ expect(() => calculateOverallConfidence({
298
+ amount: undefined,
299
+ currency: 1.0,
300
+ business: 1.0,
301
+ date: 1.0,
302
+ })).toThrow('Amount confidence is required');
303
+ });
304
+ it('should throw error when multiple components are null', () => {
305
+ expect(() => calculateOverallConfidence({
306
+ amount: null,
307
+ currency: null,
308
+ business: 1.0,
309
+ date: 1.0,
310
+ })).toThrow('Amount confidence is required');
311
+ });
312
+ });
313
+ describe('Validation - Out of Range', () => {
314
+ it('should throw error when amount is negative', () => {
315
+ expect(() => calculateOverallConfidence({
316
+ amount: -0.1,
317
+ currency: 1.0,
318
+ business: 1.0,
319
+ date: 1.0,
320
+ })).toThrow('Amount confidence must be between 0.0 and 1.0');
321
+ });
322
+ it('should throw error when amount exceeds 1.0', () => {
323
+ expect(() => calculateOverallConfidence({
324
+ amount: 1.1,
325
+ currency: 1.0,
326
+ business: 1.0,
327
+ date: 1.0,
328
+ })).toThrow('Amount confidence must be between 0.0 and 1.0');
329
+ });
330
+ it('should throw error when currency is negative', () => {
331
+ expect(() => calculateOverallConfidence({
332
+ amount: 1.0,
333
+ currency: -0.5,
334
+ business: 1.0,
335
+ date: 1.0,
336
+ })).toThrow('Currency confidence must be between 0.0 and 1.0');
337
+ });
338
+ it('should throw error when business exceeds 1.0', () => {
339
+ expect(() => calculateOverallConfidence({
340
+ amount: 1.0,
341
+ currency: 1.0,
342
+ business: 2.0,
343
+ date: 1.0,
344
+ })).toThrow('Business confidence must be between 0.0 and 1.0');
345
+ });
346
+ it('should throw error when date is negative', () => {
347
+ expect(() => calculateOverallConfidence({
348
+ amount: 1.0,
349
+ currency: 1.0,
350
+ business: 1.0,
351
+ date: -1.0,
352
+ })).toThrow('Date confidence must be between 0.0 and 1.0');
353
+ });
354
+ it('should throw error with correct component name', () => {
355
+ expect(() => calculateOverallConfidence({
356
+ amount: 1.0,
357
+ currency: 1.0,
358
+ business: 5.0,
359
+ date: 1.0,
360
+ })).toThrow(/Business confidence/);
361
+ });
362
+ });
363
+ describe('Real-World Scenarios', () => {
364
+ it('should handle typical invoice match', () => {
365
+ // Exact amount, currency, business match, 2 days apart
366
+ const result = calculateOverallConfidence({
367
+ amount: 1.0,
368
+ currency: 1.0,
369
+ business: 1.0,
370
+ date: 0.93, // ~2 days difference
371
+ });
372
+ // (1.0 × 0.4) + (1.0 × 0.2) + (1.0 × 0.3) + (0.93 × 0.1) = 0.993
373
+ expect(result).toBe(0.99);
374
+ });
375
+ it('should handle receipt with missing business', () => {
376
+ // Good amount/currency, no business ID, same day
377
+ const result = calculateOverallConfidence({
378
+ amount: 1.0,
379
+ currency: 1.0,
380
+ business: 0.5, // Unknown business
381
+ date: 1.0,
382
+ });
383
+ // (1.0 × 0.4) + (1.0 × 0.2) + (0.5 × 0.3) + (1.0 × 0.1) = 0.85
384
+ expect(result).toBe(0.85);
385
+ });
386
+ it('should handle cross-currency near match', () => {
387
+ // Good amount, no currency match, good business/date
388
+ const result = calculateOverallConfidence({
389
+ amount: 0.9,
390
+ currency: 0.0, // Different currency
391
+ business: 1.0,
392
+ date: 1.0,
393
+ });
394
+ // (0.9 × 0.4) + (0.0 × 0.2) + (1.0 × 0.3) + (1.0 × 0.1) = 0.76
395
+ expect(result).toBe(0.76);
396
+ });
397
+ it('should handle delayed receipt (15 days)', () => {
398
+ // Perfect match except date
399
+ const result = calculateOverallConfidence({
400
+ amount: 1.0,
401
+ currency: 1.0,
402
+ business: 1.0,
403
+ date: 0.5, // 15 days difference
404
+ });
405
+ // (1.0 × 0.4) + (1.0 × 0.2) + (1.0 × 0.3) + (0.5 × 0.1) = 0.95
406
+ expect(result).toBe(0.95);
407
+ });
408
+ });
409
+ });
410
+ //# sourceMappingURL=overall-confidence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overall-confidence.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/overall-confidence.test.ts"],"names":[],"mappings":"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"}