@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,143 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { calculateBusinessConfidence } from '../helpers/business-confidence.helper.js';
3
+ describe('calculateBusinessConfidence', () => {
4
+ const businessId1 = 'business-123';
5
+ const businessId2 = 'business-456';
6
+ const businessId3 = 'business-789';
7
+ describe('exact match - both non-null', () => {
8
+ it('should return 1.0 when both IDs match', () => {
9
+ const result = calculateBusinessConfidence(businessId1, businessId1);
10
+ expect(result).toBe(1.0);
11
+ });
12
+ it('should return 1.0 for different business IDs that match', () => {
13
+ const result = calculateBusinessConfidence(businessId2, businessId2);
14
+ expect(result).toBe(1.0);
15
+ });
16
+ it('should return 1.0 for UUID-like IDs that match', () => {
17
+ const uuidBusiness = '550e8400-e29b-41d4-a716-446655440000';
18
+ const result = calculateBusinessConfidence(uuidBusiness, uuidBusiness);
19
+ expect(result).toBe(1.0);
20
+ });
21
+ });
22
+ describe('one ID is null', () => {
23
+ it('should return 0.5 when transaction ID is null', () => {
24
+ const result = calculateBusinessConfidence(null, businessId1);
25
+ expect(result).toBe(0.5);
26
+ });
27
+ it('should return 0.5 when document ID is null', () => {
28
+ const result = calculateBusinessConfidence(businessId1, null);
29
+ expect(result).toBe(0.5);
30
+ });
31
+ it('should return 0.5 when transaction ID is null with different business ID', () => {
32
+ const result = calculateBusinessConfidence(null, businessId2);
33
+ expect(result).toBe(0.5);
34
+ });
35
+ it('should return 0.5 when document ID is null with different business ID', () => {
36
+ const result = calculateBusinessConfidence(businessId3, null);
37
+ expect(result).toBe(0.5);
38
+ });
39
+ });
40
+ describe('both IDs are null', () => {
41
+ it('should return 0.5 when both IDs are null', () => {
42
+ const result = calculateBusinessConfidence(null, null);
43
+ expect(result).toBe(0.5);
44
+ });
45
+ });
46
+ describe('mismatch - both non-null but different', () => {
47
+ it('should return 0.2 when IDs do not match', () => {
48
+ const result = calculateBusinessConfidence(businessId1, businessId2);
49
+ expect(result).toBe(0.2);
50
+ });
51
+ it('should return 0.2 for different business IDs', () => {
52
+ const result = calculateBusinessConfidence(businessId2, businessId3);
53
+ expect(result).toBe(0.2);
54
+ });
55
+ it('should return 0.2 for UUID-like IDs that do not match', () => {
56
+ const uuid1 = '550e8400-e29b-41d4-a716-446655440000';
57
+ const uuid2 = '660e8400-e29b-41d4-a716-446655440000';
58
+ const result = calculateBusinessConfidence(uuid1, uuid2);
59
+ expect(result).toBe(0.2);
60
+ });
61
+ it('should be case-sensitive for business IDs', () => {
62
+ const result = calculateBusinessConfidence('business-ABC', 'business-abc');
63
+ expect(result).toBe(0.2);
64
+ });
65
+ });
66
+ describe('various business ID formats', () => {
67
+ it('should work with numeric string IDs', () => {
68
+ const result = calculateBusinessConfidence('12345', '12345');
69
+ expect(result).toBe(1.0);
70
+ });
71
+ it('should work with alphanumeric IDs', () => {
72
+ const result = calculateBusinessConfidence('bus-abc-123', 'bus-abc-123');
73
+ expect(result).toBe(1.0);
74
+ });
75
+ it('should work with short IDs', () => {
76
+ const result = calculateBusinessConfidence('a', 'a');
77
+ expect(result).toBe(1.0);
78
+ });
79
+ it('should work with long UUIDs', () => {
80
+ const longUuid = '123e4567-e89b-12d3-a456-426614174000';
81
+ const result = calculateBusinessConfidence(longUuid, longUuid);
82
+ expect(result).toBe(1.0);
83
+ });
84
+ it('should detect mismatch with similar but different IDs', () => {
85
+ const result = calculateBusinessConfidence('business-123', 'business-124');
86
+ expect(result).toBe(0.2);
87
+ });
88
+ });
89
+ describe('return value validation', () => {
90
+ it('should return exactly 1.0, 0.5, or 0.2 (no other values)', () => {
91
+ const results = [
92
+ calculateBusinessConfidence(businessId1, businessId1), // 1.0
93
+ calculateBusinessConfidence(businessId1, businessId2), // 0.2
94
+ calculateBusinessConfidence(null, businessId1), // 0.5
95
+ calculateBusinessConfidence(businessId1, null), // 0.5
96
+ calculateBusinessConfidence(null, null), // 0.5
97
+ ];
98
+ results.forEach(result => {
99
+ expect([1.0, 0.5, 0.2]).toContain(result);
100
+ });
101
+ });
102
+ it('should return exact values without rounding issues', () => {
103
+ const exactMatch = calculateBusinessConfidence(businessId1, businessId1);
104
+ const oneNull = calculateBusinessConfidence(null, businessId1);
105
+ const mismatch = calculateBusinessConfidence(businessId1, businessId2);
106
+ expect(exactMatch === 1.0).toBe(true);
107
+ expect(oneNull === 0.5).toBe(true);
108
+ expect(mismatch === 0.2).toBe(true);
109
+ });
110
+ });
111
+ describe('symmetry', () => {
112
+ it('should return same result regardless of parameter order for matching IDs', () => {
113
+ expect(calculateBusinessConfidence(businessId1, businessId1)).toBe(calculateBusinessConfidence(businessId1, businessId1));
114
+ });
115
+ it('should return same result regardless of parameter order for mismatching IDs', () => {
116
+ expect(calculateBusinessConfidence(businessId1, businessId2)).toBe(calculateBusinessConfidence(businessId2, businessId1));
117
+ });
118
+ it('should return same result regardless of parameter order for null cases', () => {
119
+ expect(calculateBusinessConfidence(null, businessId1)).toBe(calculateBusinessConfidence(businessId1, null));
120
+ });
121
+ });
122
+ describe('edge cases', () => {
123
+ it('should handle empty string as a valid business ID', () => {
124
+ const result = calculateBusinessConfidence('', '');
125
+ expect(result).toBe(1.0);
126
+ });
127
+ it('should treat empty string as different from null', () => {
128
+ const result = calculateBusinessConfidence('', null);
129
+ expect(result).toBe(0.5);
130
+ });
131
+ it('should handle IDs with special characters', () => {
132
+ const specialId = 'business-id_with-special.chars@123';
133
+ const result = calculateBusinessConfidence(specialId, specialId);
134
+ expect(result).toBe(1.0);
135
+ });
136
+ it('should handle very long business IDs', () => {
137
+ const longId = 'a'.repeat(1000);
138
+ const result = calculateBusinessConfidence(longId, longId);
139
+ expect(result).toBe(1.0);
140
+ });
141
+ });
142
+ });
143
+ //# sourceMappingURL=business-confidence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-confidence.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/business-confidence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { isValidDocumentForMatching, isValidTransactionForMatching, isWithinDateWindow, } from '../helpers/candidate-filter.helper.js';
3
+ describe('Candidate Filter', () => {
4
+ describe('isValidTransactionForMatching', () => {
5
+ it('should include normal transactions', () => {
6
+ const transaction = {
7
+ id: 'tx-1',
8
+ is_fee: false,
9
+ amount: '100.00',
10
+ };
11
+ expect(isValidTransactionForMatching(transaction)).toBe(true);
12
+ });
13
+ it('should exclude fee transactions', () => {
14
+ const transaction = {
15
+ id: 'tx-2',
16
+ is_fee: true,
17
+ amount: '5.00',
18
+ };
19
+ expect(isValidTransactionForMatching(transaction)).toBe(false);
20
+ });
21
+ it('should handle transactions with various states', () => {
22
+ const validTransaction = {
23
+ id: 'tx-3',
24
+ is_fee: false,
25
+ amount: '250.50',
26
+ currency: 'USD',
27
+ };
28
+ expect(isValidTransactionForMatching(validTransaction)).toBe(true);
29
+ });
30
+ });
31
+ describe('isValidDocumentForMatching', () => {
32
+ it('should include valid documents', () => {
33
+ const document = {
34
+ id: 'doc-1',
35
+ total_amount: 100,
36
+ currency_code: 'USD',
37
+ type: 'INVOICE',
38
+ };
39
+ expect(isValidDocumentForMatching(document)).toBe(true);
40
+ });
41
+ it('should exclude documents with null total_amount', () => {
42
+ const document = {
43
+ id: 'doc-2',
44
+ total_amount: null,
45
+ currency_code: 'USD',
46
+ type: 'INVOICE',
47
+ };
48
+ expect(isValidDocumentForMatching(document)).toBe(false);
49
+ });
50
+ it('should exclude documents with undefined total_amount', () => {
51
+ const document = {
52
+ id: 'doc-3',
53
+ total_amount: undefined,
54
+ currency_code: 'USD',
55
+ type: 'INVOICE',
56
+ };
57
+ expect(isValidDocumentForMatching(document)).toBe(false);
58
+ });
59
+ it('should exclude documents with null currency_code', () => {
60
+ const document = {
61
+ id: 'doc-4',
62
+ total_amount: 100,
63
+ currency_code: null,
64
+ type: 'INVOICE',
65
+ };
66
+ expect(isValidDocumentForMatching(document)).toBe(false);
67
+ });
68
+ it('should exclude documents with empty currency_code', () => {
69
+ const document = {
70
+ id: 'doc-5',
71
+ total_amount: 100,
72
+ currency_code: null,
73
+ type: 'INVOICE',
74
+ };
75
+ expect(isValidDocumentForMatching(document)).toBe(false);
76
+ });
77
+ it('should include documents with zero amount (valid)', () => {
78
+ const document = {
79
+ id: 'doc-6',
80
+ total_amount: 0,
81
+ currency_code: 'EUR',
82
+ type: 'CREDIT_INVOICE',
83
+ };
84
+ expect(isValidDocumentForMatching(document)).toBe(true);
85
+ });
86
+ it('should include documents with negative amounts', () => {
87
+ const document = {
88
+ id: 'doc-7',
89
+ total_amount: -50,
90
+ currency_code: 'ILS',
91
+ type: 'CREDIT_INVOICE',
92
+ };
93
+ expect(isValidDocumentForMatching(document)).toBe(true);
94
+ });
95
+ });
96
+ describe('isWithinDateWindow', () => {
97
+ const referenceDate = new Date('2024-06-15');
98
+ it('should include same date', () => {
99
+ const candidateDate = new Date('2024-06-15');
100
+ expect(isWithinDateWindow(candidateDate, referenceDate)).toBe(true);
101
+ });
102
+ it('should include date 11 months before', () => {
103
+ const candidateDate = new Date('2023-07-15');
104
+ expect(isWithinDateWindow(candidateDate, referenceDate)).toBe(true);
105
+ });
106
+ it('should include date 11 months after', () => {
107
+ const candidateDate = new Date('2025-05-15');
108
+ expect(isWithinDateWindow(candidateDate, referenceDate)).toBe(true);
109
+ });
110
+ it('should include date exactly 12 months before', () => {
111
+ const candidateDate = new Date('2023-06-15');
112
+ expect(isWithinDateWindow(candidateDate, referenceDate)).toBe(true);
113
+ });
114
+ it('should include date exactly 12 months after', () => {
115
+ const candidateDate = new Date('2025-06-15');
116
+ expect(isWithinDateWindow(candidateDate, referenceDate)).toBe(true);
117
+ });
118
+ it('should exclude date 12 months + 1 day before', () => {
119
+ const candidateDate = new Date('2023-06-14');
120
+ expect(isWithinDateWindow(candidateDate, referenceDate)).toBe(false);
121
+ });
122
+ it('should exclude date 12 months + 1 day after', () => {
123
+ const candidateDate = new Date('2025-06-16');
124
+ expect(isWithinDateWindow(candidateDate, referenceDate)).toBe(false);
125
+ });
126
+ it('should handle different years', () => {
127
+ const candidateDate2023 = new Date('2023-09-01'); // 9+ months before
128
+ const candidateDate2025 = new Date('2025-03-01'); // 8+ months after
129
+ expect(isWithinDateWindow(candidateDate2023, referenceDate)).toBe(true);
130
+ expect(isWithinDateWindow(candidateDate2025, referenceDate)).toBe(true);
131
+ });
132
+ it('should handle edge cases around month boundaries - end of month', () => {
133
+ const refDate = new Date('2024-01-31');
134
+ const candidate11MonthsLater = new Date('2024-12-31'); // Exactly 11 months
135
+ expect(isWithinDateWindow(candidate11MonthsLater, refDate)).toBe(true);
136
+ });
137
+ it('should handle edge cases around month boundaries - February leap year', () => {
138
+ const refDate = new Date('2024-02-29'); // Leap year
139
+ const candidate = new Date('2023-03-01'); // Just over 12 months before
140
+ expect(isWithinDateWindow(candidate, refDate)).toBe(true);
141
+ });
142
+ it('should work with custom window - 6 months', () => {
143
+ const candidateDate3MonthsBefore = new Date('2024-03-15');
144
+ const candidateDate7MonthsBefore = new Date('2023-11-15');
145
+ expect(isWithinDateWindow(candidateDate3MonthsBefore, referenceDate, 6)).toBe(true);
146
+ expect(isWithinDateWindow(candidateDate7MonthsBefore, referenceDate, 6)).toBe(false);
147
+ });
148
+ it('should work with custom window - 3 months', () => {
149
+ const candidateDate2MonthsAfter = new Date('2024-08-15');
150
+ const candidateDate4MonthsAfter = new Date('2024-10-15');
151
+ expect(isWithinDateWindow(candidateDate2MonthsAfter, referenceDate, 3)).toBe(true);
152
+ expect(isWithinDateWindow(candidateDate4MonthsAfter, referenceDate, 3)).toBe(false);
153
+ });
154
+ it('should handle month boundary edge case - 12 months exactly', () => {
155
+ const refDate = new Date('2024-01-15');
156
+ const candidate12MonthsAfter = new Date('2025-01-15');
157
+ const candidateJustOver12Months = new Date('2025-01-16');
158
+ expect(isWithinDateWindow(candidate12MonthsAfter, refDate)).toBe(true);
159
+ expect(isWithinDateWindow(candidateJustOver12Months, refDate)).toBe(false);
160
+ });
161
+ it('should handle year transitions', () => {
162
+ const refDate = new Date('2024-01-01');
163
+ const candidateDate = new Date('2023-01-01'); // Exactly 12 months before
164
+ expect(isWithinDateWindow(candidateDate, refDate)).toBe(true);
165
+ });
166
+ it('should be inclusive on boundary dates', () => {
167
+ const refDate = new Date('2024-06-15');
168
+ const minBoundary = new Date('2023-06-15'); // -12 months
169
+ const maxBoundary = new Date('2025-06-15'); // +12 months
170
+ expect(isWithinDateWindow(minBoundary, refDate)).toBe(true);
171
+ expect(isWithinDateWindow(maxBoundary, refDate)).toBe(true);
172
+ });
173
+ it('should handle dates with time components', () => {
174
+ const refDate = new Date('2024-06-15T10:30:00');
175
+ const candidateDate = new Date('2024-06-15T23:59:59');
176
+ expect(isWithinDateWindow(candidateDate, refDate)).toBe(true);
177
+ });
178
+ it('should work with very small window - 1 month', () => {
179
+ const candidateDate1MonthBefore = new Date('2024-05-15');
180
+ const candidateDate2MonthsBefore = new Date('2024-04-15');
181
+ expect(isWithinDateWindow(candidateDate1MonthBefore, referenceDate, 1)).toBe(true);
182
+ expect(isWithinDateWindow(candidateDate2MonthsBefore, referenceDate, 1)).toBe(false);
183
+ });
184
+ });
185
+ });
186
+ //# sourceMappingURL=candidate-filter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-filter.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/candidate-filter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAE/C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,WAAW,GAAyB;gBACxC,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,QAAQ;aACjB,CAAC;YAEF,MAAM,CAAC,6BAA6B,CAAC,WAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,WAAW,GAAyB;gBACxC,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,MAAM;aACf,CAAC;YAEF,MAAM,CAAC,6BAA6B,CAAC,WAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,gBAAgB,GAAyB;gBAC7C,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,KAAK;aAChB,CAAC;YAEF,MAAM,CAAC,6BAA6B,CAAC,gBAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,QAAQ,GAAsB;gBAClC,EAAE,EAAE,OAAO;gBACX,YAAY,EAAE,GAAG;gBACjB,aAAa,EAAE,KAAK;gBACpB,IAAI,EAAE,SAAS;aAChB,CAAC;YAEF,MAAM,CAAC,0BAA0B,CAAC,QAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,QAAQ,GAAsB;gBAClC,EAAE,EAAE,OAAO;gBACX,YAAY,EAAE,IAAI;gBAClB,aAAa,EAAE,KAAK;gBACpB,IAAI,EAAE,SAAS;aAChB,CAAC;YAEF,MAAM,CAAC,0BAA0B,CAAC,QAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,QAAQ,GAAsB;gBAClC,EAAE,EAAE,OAAO;gBACX,YAAY,EAAE,SAAS;gBACvB,aAAa,EAAE,KAAK;gBACpB,IAAI,EAAE,SAAS;aAChB,CAAC;YAEF,MAAM,CAAC,0BAA0B,CAAC,QAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,QAAQ,GAAsB;gBAClC,EAAE,EAAE,OAAO;gBACX,YAAY,EAAE,GAAG;gBACjB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,SAAS;aAChB,CAAC;YAEF,MAAM,CAAC,0BAA0B,CAAC,QAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,QAAQ,GAAsB;gBAClC,EAAE,EAAE,OAAO;gBACX,YAAY,EAAE,GAAG;gBACjB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,SAAS;aAChB,CAAC;YAEF,MAAM,CAAC,0BAA0B,CAAC,QAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,QAAQ,GAAsB;gBAClC,EAAE,EAAE,OAAO;gBACX,YAAY,EAAE,CAAC;gBACf,aAAa,EAAE,KAAK;gBACpB,IAAI,EAAE,gBAAgB;aACvB,CAAC;YAEF,MAAM,CAAC,0BAA0B,CAAC,QAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,QAAQ,GAAsB;gBAClC,EAAE,EAAE,OAAO;gBACX,YAAY,EAAE,CAAC,EAAE;gBACjB,aAAa,EAAE,KAAK;gBACpB,IAAI,EAAE,gBAAgB;aACvB,CAAC;YAEF,MAAM,CAAC,0BAA0B,CAAC,QAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;QAE7C,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB;YACrE,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB;YAEpE,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,sBAAsB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,oBAAoB;YAE3E,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;YACpD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,6BAA6B;YAEvE,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,0BAA0B,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1D,MAAM,0BAA0B,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAE1D,MAAM,CAAC,kBAAkB,CAAC,0BAA0B,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpF,MAAM,CAAC,kBAAkB,CAAC,0BAA0B,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,yBAAyB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YACzD,MAAM,yBAAyB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAEzD,MAAM,CAAC,kBAAkB,CAAC,yBAAyB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnF,MAAM,CAAC,kBAAkB,CAAC,yBAAyB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,sBAAsB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,yBAAyB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAEzD,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,CAAC,kBAAkB,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,2BAA2B;YAEzE,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;YACzD,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;YAEzD,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAChD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAEtD,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,yBAAyB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YACzD,MAAM,0BAA0B,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAE1D,MAAM,CAAC,kBAAkB,CAAC,yBAAyB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnF,MAAM,CAAC,kBAAkB,CAAC,0BAA0B,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}