@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,475 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { aggregateDocuments, } from '../providers/document-aggregator.js';
3
+ describe('Document Aggregator', () => {
4
+ const USER_ID = 'user-123';
5
+ // Helper to create test documents
6
+ const createDocument = (overrides = {}) => ({
7
+ id: 'doc-' + Math.random().toString(36).substr(2, 9),
8
+ charge_id: 'charge-123',
9
+ creditor_id: USER_ID, // Default: user is creditor
10
+ debtor_id: 'business-1', // Default: business is debtor
11
+ currency_code: 'USD',
12
+ date: new Date('2024-01-15'),
13
+ total_amount: 100,
14
+ type: 'INVOICE',
15
+ serial_number: null,
16
+ image_url: null,
17
+ file_url: null,
18
+ ...overrides,
19
+ });
20
+ describe('Single Document', () => {
21
+ it('should return single document with normalized amount', () => {
22
+ const document = createDocument({
23
+ total_amount: 150.5,
24
+ currency_code: 'USD',
25
+ creditor_id: USER_ID,
26
+ debtor_id: 'business-1',
27
+ type: 'INVOICE',
28
+ date: new Date('2024-01-15'),
29
+ serial_number: 'INV-001',
30
+ });
31
+ const result = aggregateDocuments([document], USER_ID);
32
+ expect(result.amount).toBe(150.5); // Positive: business is debtor
33
+ expect(result.currency).toBe('USD');
34
+ expect(result.businessId).toBe('business-1');
35
+ expect(result.date).toEqual(new Date('2024-01-15'));
36
+ expect(result.type).toBe('INVOICE');
37
+ expect(result.description).toBe('INV-001');
38
+ });
39
+ it('should normalize amount when business is creditor', () => {
40
+ const document = createDocument({
41
+ total_amount: 200,
42
+ creditor_id: 'business-1', // Business is creditor
43
+ debtor_id: USER_ID, // User is debtor
44
+ type: 'INVOICE',
45
+ });
46
+ const result = aggregateDocuments([document], USER_ID);
47
+ expect(result.amount).toBe(-200); // Negative: business is creditor
48
+ expect(result.businessId).toBe('business-1');
49
+ });
50
+ it('should handle credit invoice normalization', () => {
51
+ const document = createDocument({
52
+ total_amount: 100,
53
+ creditor_id: 'business-1', // Business is creditor
54
+ debtor_id: USER_ID, // User is debtor
55
+ type: 'CREDIT_INVOICE',
56
+ });
57
+ const result = aggregateDocuments([document], USER_ID);
58
+ expect(result.amount).toBe(100); // Positive: double negation (-1 * -1)
59
+ expect(result.type).toBe('CREDIT_INVOICE');
60
+ });
61
+ it('should use file_url as description when serial_number is null', () => {
62
+ const document = createDocument({
63
+ serial_number: null,
64
+ file_url: 'https://example.com/files/invoice_2024.pdf',
65
+ });
66
+ const result = aggregateDocuments([document], USER_ID);
67
+ expect(result.description).toBe('invoice_2024.pdf');
68
+ });
69
+ it('should use image_url as description when both serial_number and file_url are null', () => {
70
+ const document = createDocument({
71
+ serial_number: null,
72
+ file_url: null,
73
+ image_url: 'https://example.com/images/scan_001.jpg',
74
+ });
75
+ const result = aggregateDocuments([document], USER_ID);
76
+ expect(result.description).toBe('scan_001.jpg');
77
+ });
78
+ it('should use document ID as fallback description', () => {
79
+ const document = createDocument({
80
+ id: 'doc-abc123def456',
81
+ serial_number: null,
82
+ file_url: null,
83
+ image_url: null,
84
+ });
85
+ const result = aggregateDocuments([document], USER_ID);
86
+ expect(result.description).toBe('Doc-doc-abc1');
87
+ });
88
+ });
89
+ describe('Multiple Invoices', () => {
90
+ it('should sum normalized amounts correctly', () => {
91
+ const documents = [
92
+ createDocument({ total_amount: 100, type: 'INVOICE' }), // +100
93
+ createDocument({ total_amount: 200, type: 'INVOICE' }), // +200
94
+ createDocument({ total_amount: 50, type: 'INVOICE' }), // +50
95
+ ];
96
+ const result = aggregateDocuments(documents, USER_ID);
97
+ expect(result.amount).toBe(350);
98
+ expect(result.type).toBe('INVOICE');
99
+ });
100
+ it('should handle mixed regular and credit invoices', () => {
101
+ const documents = [
102
+ createDocument({
103
+ total_amount: 500,
104
+ type: 'INVOICE',
105
+ creditor_id: USER_ID,
106
+ debtor_id: 'business-1',
107
+ }), // +500
108
+ createDocument({
109
+ total_amount: 100,
110
+ type: 'CREDIT_INVOICE',
111
+ creditor_id: USER_ID,
112
+ debtor_id: 'business-1',
113
+ }), // -100
114
+ ];
115
+ const result = aggregateDocuments(documents, USER_ID);
116
+ expect(result.amount).toBe(400); // 500 - 100
117
+ });
118
+ it('should handle invoices where business is creditor', () => {
119
+ const documents = [
120
+ createDocument({
121
+ total_amount: 200,
122
+ creditor_id: 'business-1',
123
+ debtor_id: USER_ID,
124
+ }), // -200
125
+ createDocument({
126
+ total_amount: 100,
127
+ creditor_id: 'business-1',
128
+ debtor_id: USER_ID,
129
+ }), // -100
130
+ ];
131
+ const result = aggregateDocuments(documents, USER_ID);
132
+ expect(result.amount).toBe(-300);
133
+ });
134
+ });
135
+ describe('Multiple Receipts', () => {
136
+ it('should sum receipt amounts correctly', () => {
137
+ const documents = [
138
+ createDocument({ total_amount: 50, type: 'RECEIPT' }),
139
+ createDocument({ total_amount: 75, type: 'RECEIPT' }),
140
+ ];
141
+ const result = aggregateDocuments(documents, USER_ID);
142
+ expect(result.amount).toBe(125);
143
+ expect(result.type).toBe('RECEIPT');
144
+ });
145
+ it('should handle invoice-receipts', () => {
146
+ const documents = [
147
+ createDocument({ total_amount: 100, type: 'INVOICE_RECEIPT' }),
148
+ createDocument({ total_amount: 150, type: 'INVOICE_RECEIPT' }),
149
+ ];
150
+ const result = aggregateDocuments(documents, USER_ID);
151
+ expect(result.amount).toBe(250);
152
+ expect(result.type).toBe('INVOICE_RECEIPT');
153
+ });
154
+ });
155
+ describe('Type Priority Filtering', () => {
156
+ it('should use only invoices when both invoices and receipts exist', () => {
157
+ const documents = [
158
+ createDocument({ total_amount: 100, type: 'INVOICE', serial_number: 'INV-001' }),
159
+ createDocument({ total_amount: 200, type: 'RECEIPT', serial_number: 'REC-001' }),
160
+ createDocument({ total_amount: 50, type: 'INVOICE', serial_number: 'INV-002' }),
161
+ ];
162
+ const result = aggregateDocuments(documents, USER_ID);
163
+ expect(result.amount).toBe(150); // Only invoices: 100 + 50
164
+ expect(result.type).toBe('INVOICE');
165
+ expect(result.description).toContain('INV-001');
166
+ expect(result.description).toContain('INV-002');
167
+ expect(result.description).not.toContain('REC-001'); // Receipt excluded
168
+ });
169
+ it('should use only credit invoices when both credit invoices and receipts exist', () => {
170
+ const documents = [
171
+ createDocument({ total_amount: 100, type: 'CREDIT_INVOICE' }),
172
+ createDocument({ total_amount: 200, type: 'RECEIPT' }),
173
+ createDocument({ total_amount: 50, type: 'CREDIT_INVOICE' }),
174
+ ];
175
+ const result = aggregateDocuments(documents, USER_ID);
176
+ // Credit invoices with user as creditor (business debtor): negate
177
+ expect(result.amount).toBe(-150); // -(100 + 50)
178
+ expect(result.type).toBe('CREDIT_INVOICE');
179
+ });
180
+ it('should use only invoices/credit-invoices when mixed with invoice-receipts', () => {
181
+ const documents = [
182
+ createDocument({ total_amount: 100, type: 'INVOICE' }),
183
+ createDocument({ total_amount: 200, type: 'INVOICE_RECEIPT' }), // Should be excluded
184
+ createDocument({ total_amount: 50, type: 'CREDIT_INVOICE' }),
185
+ ];
186
+ const result = aggregateDocuments(documents, USER_ID);
187
+ expect(result.amount).toBe(50); // 100 - 50 (credit invoice negates)
188
+ });
189
+ it('should use receipts when no invoices exist', () => {
190
+ const documents = [
191
+ createDocument({ total_amount: 100, type: 'RECEIPT' }),
192
+ createDocument({ total_amount: 50, type: 'INVOICE_RECEIPT' }),
193
+ ];
194
+ const result = aggregateDocuments(documents, USER_ID);
195
+ expect(result.amount).toBe(150);
196
+ expect(result.type).toBe('RECEIPT');
197
+ });
198
+ });
199
+ describe('Currency Validation', () => {
200
+ it('should throw error with multiple currencies', () => {
201
+ const documents = [
202
+ createDocument({ currency_code: 'USD' }),
203
+ createDocument({ currency_code: 'EUR' }),
204
+ ];
205
+ expect(() => aggregateDocuments(documents, USER_ID)).toThrow('Cannot aggregate documents: multiple currencies found (USD, EUR)');
206
+ });
207
+ it('should throw error with three different currencies', () => {
208
+ const documents = [
209
+ createDocument({ currency_code: 'USD' }),
210
+ createDocument({ currency_code: 'EUR' }),
211
+ createDocument({ currency_code: 'GBP' }),
212
+ ];
213
+ expect(() => aggregateDocuments(documents, USER_ID)).toThrow(/multiple currencies found/);
214
+ });
215
+ it('should not throw when all have same currency', () => {
216
+ const documents = [
217
+ createDocument({ currency_code: 'ILS' }),
218
+ createDocument({ currency_code: 'ILS' }),
219
+ createDocument({ currency_code: 'ILS' }),
220
+ ];
221
+ expect(() => aggregateDocuments(documents, USER_ID)).not.toThrow();
222
+ });
223
+ it('should throw error when all currencies are null', () => {
224
+ const documents = [
225
+ createDocument({ currency_code: null }),
226
+ createDocument({ currency_code: null }),
227
+ ];
228
+ expect(() => aggregateDocuments(documents, USER_ID)).toThrow('Cannot aggregate documents: all documents have null currency_code');
229
+ });
230
+ it('should ignore currency of filtered-out receipts', () => {
231
+ const documents = [
232
+ createDocument({ currency_code: 'USD', type: 'INVOICE' }),
233
+ createDocument({ currency_code: 'EUR', type: 'RECEIPT' }), // Different currency but will be filtered
234
+ createDocument({ currency_code: 'USD', type: 'INVOICE' }),
235
+ ];
236
+ const result = aggregateDocuments(documents, USER_ID);
237
+ expect(result.currency).toBe('USD');
238
+ });
239
+ });
240
+ describe('Business ID Validation', () => {
241
+ it('should throw error with multiple different business IDs', () => {
242
+ const documents = [
243
+ createDocument({ debtor_id: 'business-1', creditor_id: USER_ID }),
244
+ createDocument({ debtor_id: 'business-2', creditor_id: USER_ID }),
245
+ ];
246
+ expect(() => aggregateDocuments(documents, USER_ID)).toThrow('Cannot aggregate documents: multiple business IDs found (business-1, business-2)');
247
+ });
248
+ it('should return null when all business IDs are null', () => {
249
+ const documents = [
250
+ createDocument({ debtor_id: null, creditor_id: USER_ID }),
251
+ createDocument({ debtor_id: null, creditor_id: USER_ID }),
252
+ ];
253
+ const result = aggregateDocuments(documents, USER_ID);
254
+ expect(result.businessId).toBeNull();
255
+ });
256
+ it('should return single non-null business ID', () => {
257
+ const documents = [
258
+ createDocument({ debtor_id: 'business-1', creditor_id: USER_ID }),
259
+ createDocument({ debtor_id: null, creditor_id: USER_ID }),
260
+ createDocument({ debtor_id: null, creditor_id: USER_ID }),
261
+ ];
262
+ const result = aggregateDocuments(documents, USER_ID);
263
+ expect(result.businessId).toBe('business-1');
264
+ });
265
+ it('should not throw when all have same business ID', () => {
266
+ const documents = [
267
+ createDocument({ debtor_id: 'business-1', creditor_id: USER_ID }),
268
+ createDocument({ debtor_id: 'business-1', creditor_id: USER_ID }),
269
+ ];
270
+ const result = aggregateDocuments(documents, USER_ID);
271
+ expect(result.businessId).toBe('business-1');
272
+ });
273
+ });
274
+ describe('Date Selection', () => {
275
+ it('should select latest date', () => {
276
+ const documents = [
277
+ createDocument({ date: new Date('2024-01-10') }),
278
+ createDocument({ date: new Date('2024-03-15') }), // Latest
279
+ createDocument({ date: new Date('2024-02-20') }),
280
+ ];
281
+ const result = aggregateDocuments(documents, USER_ID);
282
+ expect(result.date).toEqual(new Date('2024-03-15'));
283
+ });
284
+ it('should handle dates spanning years', () => {
285
+ const documents = [
286
+ createDocument({ date: new Date('2023-12-31') }),
287
+ createDocument({ date: new Date('2024-02-01') }), // Latest
288
+ createDocument({ date: new Date('2024-01-15') }),
289
+ ];
290
+ const result = aggregateDocuments(documents, USER_ID);
291
+ expect(result.date).toEqual(new Date('2024-02-01'));
292
+ });
293
+ it('should handle same date for all documents', () => {
294
+ const documents = [
295
+ createDocument({ date: new Date('2024-01-15') }),
296
+ createDocument({ date: new Date('2024-01-15') }),
297
+ ];
298
+ const result = aggregateDocuments(documents, USER_ID);
299
+ expect(result.date).toEqual(new Date('2024-01-15'));
300
+ });
301
+ it('should throw error when all dates are null', () => {
302
+ const documents = [
303
+ createDocument({ date: null }),
304
+ createDocument({ date: null }),
305
+ ];
306
+ expect(() => aggregateDocuments(documents, USER_ID)).toThrow('Cannot aggregate documents: all documents have null date');
307
+ });
308
+ it('should handle mix of null and valid dates', () => {
309
+ const documents = [
310
+ createDocument({ date: null }),
311
+ createDocument({ date: new Date('2024-01-15') }),
312
+ createDocument({ date: new Date('2024-02-20') }), // Latest
313
+ ];
314
+ const result = aggregateDocuments(documents, USER_ID);
315
+ expect(result.date).toEqual(new Date('2024-02-20'));
316
+ });
317
+ });
318
+ describe('Description Concatenation', () => {
319
+ it('should concatenate serial numbers with line breaks', () => {
320
+ const documents = [
321
+ createDocument({ serial_number: 'INV-001' }),
322
+ createDocument({ serial_number: 'INV-002' }),
323
+ createDocument({ serial_number: 'INV-003' }),
324
+ ];
325
+ const result = aggregateDocuments(documents, USER_ID);
326
+ expect(result.description).toBe('INV-001\nINV-002\nINV-003');
327
+ });
328
+ it('should prefer serial_number over file URLs', () => {
329
+ const documents = [
330
+ createDocument({ serial_number: 'INV-001', file_url: 'file1.pdf' }),
331
+ createDocument({ serial_number: null, file_url: 'file2.pdf' }),
332
+ ];
333
+ const result = aggregateDocuments(documents, USER_ID);
334
+ expect(result.description).toBe('INV-001\nfile2.pdf');
335
+ });
336
+ it('should use image URLs when no serial or file URL', () => {
337
+ const documents = [
338
+ createDocument({ serial_number: null, file_url: null, image_url: 'img1.jpg' }),
339
+ createDocument({ serial_number: null, file_url: null, image_url: 'img2.jpg' }),
340
+ ];
341
+ const result = aggregateDocuments(documents, USER_ID);
342
+ expect(result.description).toBe('img1.jpg\nimg2.jpg');
343
+ });
344
+ it('should fallback to document ID when no other identifiers', () => {
345
+ const documents = [
346
+ createDocument({
347
+ id: 'doc-abc123',
348
+ serial_number: null,
349
+ file_url: null,
350
+ image_url: null,
351
+ }),
352
+ createDocument({ id: 'doc-def456', serial_number: 'INV-001' }),
353
+ ];
354
+ const result = aggregateDocuments(documents, USER_ID);
355
+ expect(result.description).toContain('Doc-doc-abc1');
356
+ expect(result.description).toContain('INV-001');
357
+ });
358
+ it('should handle empty descriptions gracefully', () => {
359
+ const documents = [
360
+ createDocument({ serial_number: ' ', file_url: null, image_url: null, id: 'doc-123' }),
361
+ ];
362
+ const result = aggregateDocuments(documents, USER_ID);
363
+ expect(result.description).toBe('Doc-doc-123');
364
+ });
365
+ });
366
+ describe('Business Extraction Error Propagation', () => {
367
+ it('should propagate error when both creditor and debtor are user', () => {
368
+ const documents = [
369
+ createDocument({
370
+ creditor_id: USER_ID,
371
+ debtor_id: USER_ID, // Invalid: both are user
372
+ }),
373
+ ];
374
+ expect(() => aggregateDocuments(documents, USER_ID)).toThrow(/both creditor_id and debtor_id equal to user ID/);
375
+ });
376
+ it('should propagate error when neither creditor nor debtor is user', () => {
377
+ const documents = [
378
+ createDocument({
379
+ creditor_id: 'business-1',
380
+ debtor_id: 'business-2', // Invalid: neither is user
381
+ }),
382
+ ];
383
+ expect(() => aggregateDocuments(documents, USER_ID)).toThrow(/neither creditor_id nor debtor_id equal to user ID/);
384
+ });
385
+ it('should propagate error when both IDs are null', () => {
386
+ const documents = [
387
+ createDocument({
388
+ creditor_id: null,
389
+ debtor_id: null, // Invalid: both null
390
+ }),
391
+ ];
392
+ expect(() => aggregateDocuments(documents, USER_ID)).toThrow(/both creditor_id and debtor_id as null/);
393
+ });
394
+ });
395
+ describe('Input Validation', () => {
396
+ it('should throw error for empty array', () => {
397
+ expect(() => aggregateDocuments([], USER_ID)).toThrow('Cannot aggregate documents: array is empty');
398
+ });
399
+ it('should throw error for null input', () => {
400
+ expect(() => aggregateDocuments(null, USER_ID)).toThrow('Cannot aggregate documents: array is empty');
401
+ });
402
+ it('should throw error for undefined input', () => {
403
+ expect(() => aggregateDocuments(undefined, USER_ID)).toThrow('Cannot aggregate documents: array is empty');
404
+ });
405
+ });
406
+ describe('Complex Scenarios', () => {
407
+ it('should handle real-world mixed document scenario', () => {
408
+ const documents = [
409
+ createDocument({
410
+ total_amount: 1000,
411
+ type: 'INVOICE',
412
+ creditor_id: USER_ID,
413
+ debtor_id: 'business-abc',
414
+ date: new Date('2024-01-15'),
415
+ serial_number: 'INV-2024-001',
416
+ currency_code: 'USD',
417
+ }),
418
+ createDocument({
419
+ total_amount: 500,
420
+ type: 'RECEIPT', // Will be filtered out
421
+ creditor_id: USER_ID,
422
+ debtor_id: 'business-abc',
423
+ date: new Date('2024-01-20'),
424
+ serial_number: 'REC-2024-001',
425
+ currency_code: 'EUR', // Different currency but will be filtered
426
+ }),
427
+ createDocument({
428
+ total_amount: 200,
429
+ type: 'CREDIT_INVOICE',
430
+ creditor_id: USER_ID,
431
+ debtor_id: 'business-abc',
432
+ date: new Date('2024-01-25'), // Latest
433
+ serial_number: 'CRD-2024-001',
434
+ currency_code: 'USD',
435
+ }),
436
+ ];
437
+ const result = aggregateDocuments(documents, USER_ID);
438
+ expect(result.amount).toBe(800); // 1000 - 200 (credit invoice)
439
+ expect(result.currency).toBe('USD');
440
+ expect(result.businessId).toBe('business-abc');
441
+ expect(result.date).toEqual(new Date('2024-01-25')); // Latest among invoices
442
+ expect(result.type).toBe('INVOICE'); // First invoice type
443
+ expect(result.description).toContain('INV-2024-001');
444
+ expect(result.description).toContain('CRD-2024-001');
445
+ expect(result.description).not.toContain('REC-2024-001'); // Receipt excluded
446
+ });
447
+ it('should handle documents with null business IDs', () => {
448
+ const documents = [
449
+ createDocument({
450
+ total_amount: 100,
451
+ creditor_id: USER_ID,
452
+ debtor_id: null, // No business
453
+ }),
454
+ createDocument({
455
+ total_amount: 200,
456
+ creditor_id: USER_ID,
457
+ debtor_id: null, // No business
458
+ }),
459
+ ];
460
+ const result = aggregateDocuments(documents, USER_ID);
461
+ expect(result.amount).toBe(300);
462
+ expect(result.businessId).toBeNull();
463
+ });
464
+ it('should handle cryptocurrency documents', () => {
465
+ const documents = [
466
+ createDocument({ total_amount: 0.5, currency_code: 'ETH' }),
467
+ createDocument({ total_amount: 0.3, currency_code: 'ETH' }),
468
+ ];
469
+ const result = aggregateDocuments(documents, USER_ID);
470
+ expect(result.amount).toBe(0.8);
471
+ expect(result.currency).toBe('ETH');
472
+ });
473
+ });
474
+ });
475
+ //# sourceMappingURL=document-aggregator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-aggregator.test.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__tests__/document-aggregator.test.ts"],"names":[],"mappings":"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"}