@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,174 @@
1
+ import type {
2
+ Transaction,
3
+ Document,
4
+ ChargeMatch,
5
+ AggregatedTransaction,
6
+ AggregatedDocument,
7
+ ConfidenceScores,
8
+ } from '../types.js';
9
+ import type { currency, document_type } from '@modules/documents/types.js';
10
+
11
+ /**
12
+ * Factory for creating mock transactions for testing
13
+ */
14
+ export function createMockTransaction(overrides: Partial<Transaction> = {}): Transaction {
15
+ const defaultTransaction: Transaction = {
16
+ id: `tx-${Math.random()}`,
17
+ account_id: 'account-1',
18
+ charge_id: 'charge-1',
19
+ source_id: 'source-1',
20
+ source_description: 'Test transaction',
21
+ currency: 'USD' as currency,
22
+ event_date: new Date('2024-01-15'),
23
+ debit_date: new Date('2024-01-16'),
24
+ debit_date_override: null,
25
+ debit_timestamp: new Date('2024-01-16T10:00:00Z'),
26
+ amount: '100.00',
27
+ current_balance: '1000.00',
28
+ business_id: 'business-a',
29
+ created_at: new Date('2024-01-15T08:00:00Z'),
30
+ updated_at: new Date('2024-01-15T08:00:00Z'),
31
+ is_fee: false,
32
+ counter_account: 'counter-1',
33
+ currency_rate: '1.0',
34
+ origin_key: 'test-origin',
35
+ source_origin: 'test-bank',
36
+ source_reference: 'test-ref-001',
37
+ };
38
+
39
+ return { ...defaultTransaction, ...overrides };
40
+ }
41
+
42
+ /**
43
+ * Factory for creating mock documents for testing
44
+ */
45
+ export function createMockDocument(overrides: Partial<Document> = {}): Document {
46
+ const defaultDocument: Document = {
47
+ id: `doc-${Math.random()}`,
48
+ charge_id: 'charge-1',
49
+ creditor_id: 'business-a',
50
+ debtor_id: 'user-123',
51
+ currency_code: 'USD' as currency,
52
+ date: new Date('2024-01-14'),
53
+ total_amount: 100.0,
54
+ type: 'INVOICE' as document_type,
55
+ vat_amount: 17.0,
56
+ no_vat_amount: '83.00',
57
+ serial_number: 'INV-001',
58
+ is_reviewed: false,
59
+ created_at: new Date('2024-01-14T08:00:00Z'),
60
+ modified_at: new Date('2024-01-14T08:00:00Z'),
61
+ image_url: null,
62
+ file_url: null,
63
+ allocation_number: null,
64
+ exchange_rate_override: null,
65
+ file_hash: null,
66
+ vat_report_date_override: null,
67
+ };
68
+
69
+ return { ...defaultDocument, ...overrides };
70
+ }
71
+
72
+ /**
73
+ * Factory for creating mock aggregated transaction data
74
+ */
75
+ export function createMockAggregatedTransaction(
76
+ overrides: Partial<AggregatedTransaction> = {},
77
+ ): AggregatedTransaction {
78
+ const defaultAggregated: AggregatedTransaction = {
79
+ amount: 100.0,
80
+ currency: 'USD' as currency,
81
+ businessId: 'business-a',
82
+ date: new Date('2024-01-15'),
83
+ debitDate: new Date('2024-01-16'),
84
+ description: 'Test transaction',
85
+ };
86
+
87
+ return { ...defaultAggregated, ...overrides };
88
+ }
89
+
90
+ /**
91
+ * Factory for creating mock aggregated document data
92
+ */
93
+ export function createMockAggregatedDocument(
94
+ overrides: Partial<AggregatedDocument> = {},
95
+ ): AggregatedDocument {
96
+ const defaultAggregated: AggregatedDocument = {
97
+ amount: 100.0,
98
+ currency: 'USD' as currency,
99
+ businessId: 'business-a',
100
+ date: new Date('2024-01-14'),
101
+ description: 'INV-001',
102
+ type: 'INVOICE' as document_type,
103
+ businessIsCreditor: false,
104
+ };
105
+
106
+ return { ...defaultAggregated, ...overrides };
107
+ }
108
+
109
+ /**
110
+ * Factory for creating mock confidence scores
111
+ */
112
+ export function createMockConfidenceScores(
113
+ overrides: Partial<ConfidenceScores> = {},
114
+ ): ConfidenceScores {
115
+ const defaultScores: ConfidenceScores = {
116
+ amount: 1.0,
117
+ currency: 1.0,
118
+ business: 1.0,
119
+ date: 1.0,
120
+ };
121
+
122
+ return { ...defaultScores, ...overrides };
123
+ }
124
+
125
+ /**
126
+ * Factory for creating mock charge matches
127
+ */
128
+ export function createMockChargeMatch(overrides: Partial<ChargeMatch> = {}): ChargeMatch {
129
+ const defaultMatch: ChargeMatch = {
130
+ chargeId: '00000000-0000-0000-0000-000000000099',
131
+ confidenceScore: 0.95,
132
+ };
133
+
134
+ return { ...defaultMatch, ...overrides };
135
+ }
136
+
137
+ /**
138
+ * Helper to calculate expected overall confidence score
139
+ * Formula: (amount × 0.4) + (currency × 0.2) + (business × 0.3) + (date × 0.1)
140
+ */
141
+ export function calculateExpectedConfidence(scores: ConfidenceScores): number {
142
+ return scores.amount * 0.4 + scores.currency * 0.2 + scores.business * 0.3 + scores.date * 0.1;
143
+ }
144
+
145
+ /**
146
+ * Helper to round confidence score to 2 decimal places
147
+ */
148
+ export function roundConfidence(score: number): number {
149
+ return Math.round(score * 100) / 100;
150
+ }
151
+
152
+ /**
153
+ * Helper to validate a confidence score is within valid range
154
+ */
155
+ export function isValidConfidenceScore(score: number): boolean {
156
+ return score >= 0.0 && score <= 1.0;
157
+ }
158
+
159
+ /**
160
+ * Helper to check if a date is within N days of another date
161
+ */
162
+ export function isWithinDays(date1: Date, date2: Date, days: number): boolean {
163
+ const diffMs = Math.abs(date1.getTime() - date2.getTime());
164
+ const diffDays = diffMs / (1000 * 60 * 60 * 24);
165
+ return diffDays <= days;
166
+ }
167
+
168
+ /**
169
+ * Helper to calculate days difference between two dates
170
+ */
171
+ export function daysDifference(date1: Date, date2: Date): number {
172
+ const diffMs = Math.abs(date1.getTime() - date2.getTime());
173
+ return Math.floor(diffMs / (1000 * 60 * 60 * 24));
174
+ }
@@ -0,0 +1,177 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ createMockTransaction,
4
+ createMockDocument,
5
+ createMockAggregatedTransaction,
6
+ createMockAggregatedDocument,
7
+ createMockConfidenceScores,
8
+ calculateExpectedConfidence,
9
+ roundConfidence,
10
+ isValidConfidenceScore,
11
+ daysDifference,
12
+ isWithinDays,
13
+ } from './test-helpers.js';
14
+
15
+ describe('Charges Matcher - Test Infrastructure', () => {
16
+ describe('Mock Factories', () => {
17
+ it('should create a valid mock transaction with defaults', () => {
18
+ const transaction = createMockTransaction();
19
+
20
+ expect(transaction.id).toBeDefined();
21
+ expect(transaction.charge_id).toBeDefined();
22
+ expect(transaction.amount).toBe('100.00');
23
+ expect(transaction.currency).toBe('USD');
24
+ expect(transaction.is_fee).toBe(false);
25
+ });
26
+
27
+ it('should create a mock transaction with overrides', () => {
28
+ const transaction = createMockTransaction({
29
+ amount: '250.00',
30
+ currency: 'USD',
31
+ is_fee: true,
32
+ });
33
+
34
+ expect(transaction.amount).toBe('250.00');
35
+ expect(transaction.currency).toBe('USD');
36
+ expect(transaction.is_fee).toBe(true);
37
+ });
38
+
39
+ it('should create a valid mock document with defaults', () => {
40
+ const document = createMockDocument();
41
+
42
+ expect(document.id).toBeDefined();
43
+ expect(document.charge_id).toBeDefined();
44
+ expect(document.total_amount).toBe(100.0);
45
+ expect(document.currency_code).toBe('USD');
46
+ expect(document.type).toBe('INVOICE');
47
+ });
48
+
49
+ it('should create a mock document with overrides', () => {
50
+ const document = createMockDocument({
51
+ total_amount: 500.0,
52
+ type: 'RECEIPT',
53
+ serial_number: 'REC-123',
54
+ });
55
+
56
+ expect(document.total_amount).toBe(500.0);
57
+ expect(document.type).toBe('RECEIPT');
58
+ expect(document.serial_number).toBe('REC-123');
59
+ });
60
+
61
+ it('should create aggregated transaction data', () => {
62
+ const aggregated = createMockAggregatedTransaction({
63
+ amount: 150.0,
64
+ description: 'Payment for services',
65
+ });
66
+
67
+ expect(aggregated.amount).toBe(150.0);
68
+ expect(aggregated.description).toBe('Payment for services');
69
+ });
70
+
71
+ it('should create aggregated document data', () => {
72
+ const aggregated = createMockAggregatedDocument({
73
+ amount: 200.0,
74
+ businessIsCreditor: true,
75
+ });
76
+
77
+ expect(aggregated.amount).toBe(200.0);
78
+ expect(aggregated.businessIsCreditor).toBe(true);
79
+ });
80
+ });
81
+
82
+ describe('Confidence Calculation Helpers', () => {
83
+ it('should calculate expected confidence with perfect scores', () => {
84
+ const scores = createMockConfidenceScores({
85
+ amount: 1.0,
86
+ currency: 1.0,
87
+ business: 1.0,
88
+ date: 1.0,
89
+ });
90
+
91
+ const confidence = calculateExpectedConfidence(scores);
92
+ expect(confidence).toBeCloseTo(1.0, 10);
93
+ });
94
+
95
+ it('should calculate expected confidence with mixed scores', () => {
96
+ const scores = createMockConfidenceScores({
97
+ amount: 0.9, // 40% weight
98
+ currency: 1.0, // 20% weight
99
+ business: 0.5, // 30% weight
100
+ date: 0.8, // 10% weight
101
+ });
102
+
103
+ // (0.9 * 0.4) + (1.0 * 0.2) + (0.5 * 0.3) + (0.8 * 0.1)
104
+ // = 0.36 + 0.2 + 0.15 + 0.08 = 0.79
105
+ const confidence = calculateExpectedConfidence(scores);
106
+ expect(confidence).toBe(0.79);
107
+ });
108
+
109
+ it('should calculate expected confidence with zero scores', () => {
110
+ const scores = createMockConfidenceScores({
111
+ amount: 0.0,
112
+ currency: 0.0,
113
+ business: 0.0,
114
+ date: 0.0,
115
+ });
116
+
117
+ const confidence = calculateExpectedConfidence(scores);
118
+ expect(confidence).toBe(0.0);
119
+ });
120
+
121
+ it('should round confidence to 2 decimal places', () => {
122
+ expect(roundConfidence(0.956789)).toBe(0.96);
123
+ expect(roundConfidence(0.951)).toBe(0.95);
124
+ expect(roundConfidence(0.9)).toBe(0.9);
125
+ expect(roundConfidence(1.0)).toBe(1.0);
126
+ });
127
+
128
+ it('should validate confidence scores', () => {
129
+ expect(isValidConfidenceScore(0.0)).toBe(true);
130
+ expect(isValidConfidenceScore(0.5)).toBe(true);
131
+ expect(isValidConfidenceScore(1.0)).toBe(true);
132
+ expect(isValidConfidenceScore(-0.1)).toBe(false);
133
+ expect(isValidConfidenceScore(1.1)).toBe(false);
134
+ });
135
+ });
136
+
137
+ describe('Date Helpers', () => {
138
+ it('should calculate days difference correctly', () => {
139
+ const date1 = new Date('2024-01-15');
140
+ const date2 = new Date('2024-01-20');
141
+
142
+ expect(daysDifference(date1, date2)).toBe(5);
143
+ });
144
+
145
+ it('should handle same dates', () => {
146
+ const date = new Date('2024-01-15');
147
+
148
+ expect(daysDifference(date, date)).toBe(0);
149
+ });
150
+
151
+ it('should calculate difference regardless of order', () => {
152
+ const date1 = new Date('2024-01-15');
153
+ const date2 = new Date('2024-01-10');
154
+
155
+ expect(daysDifference(date1, date2)).toBe(5);
156
+ expect(daysDifference(date2, date1)).toBe(5);
157
+ });
158
+
159
+ it('should check if dates are within N days', () => {
160
+ const date1 = new Date('2024-01-15');
161
+ const date2 = new Date('2024-01-20');
162
+
163
+ expect(isWithinDays(date1, date2, 5)).toBe(true);
164
+ expect(isWithinDays(date1, date2, 4)).toBe(false);
165
+ expect(isWithinDays(date1, date2, 10)).toBe(true);
166
+ });
167
+
168
+ it('should handle 12-month window check', () => {
169
+ const date1 = new Date('2024-01-15');
170
+ const date2 = new Date('2024-12-15');
171
+ const date3 = new Date('2025-02-15');
172
+
173
+ expect(isWithinDays(date1, date2, 365)).toBe(true);
174
+ expect(isWithinDays(date1, date3, 365)).toBe(false);
175
+ });
176
+ });
177
+ });