@accounter/server 0.0.8-alpha-20251102200443-d7162b8ce1dfc629b8b454df17dcec9ed005a052 → 0.0.8-alpha-20251102213150-c9d936f545d5351df0dc5326c2623266f1ad1f46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +47 -7
  2. package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +1 -1
  3. package/dist/server/src/__generated__/types.d.ts +77 -0
  4. package/dist/server/src/__generated__/types.js.map +1 -1
  5. package/dist/server/src/modules/charges-matcher/__generated__/types.d.ts +68 -0
  6. package/dist/server/src/modules/charges-matcher/__generated__/types.js +7 -0
  7. package/dist/server/src/modules/charges-matcher/__generated__/types.js.map +1 -0
  8. package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.d.ts +1 -0
  9. package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.js +218 -0
  10. package/dist/server/src/modules/charges-matcher/__tests__/amount-confidence.test.js.map +1 -0
  11. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.d.ts +1 -0
  12. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js +645 -0
  13. package/dist/server/src/modules/charges-matcher/__tests__/auto-match-integration.test.js.map +1 -0
  14. package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.d.ts +1 -0
  15. package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.js +530 -0
  16. package/dist/server/src/modules/charges-matcher/__tests__/auto-match.test.js.map +1 -0
  17. package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.d.ts +1 -0
  18. package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.js +143 -0
  19. package/dist/server/src/modules/charges-matcher/__tests__/business-confidence.test.js.map +1 -0
  20. package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.d.ts +1 -0
  21. package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.js +186 -0
  22. package/dist/server/src/modules/charges-matcher/__tests__/candidate-filter.test.js.map +1 -0
  23. package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.d.ts +1 -0
  24. package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.js +301 -0
  25. package/dist/server/src/modules/charges-matcher/__tests__/charge-validator.test.js.map +1 -0
  26. package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.d.ts +1 -0
  27. package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.js +127 -0
  28. package/dist/server/src/modules/charges-matcher/__tests__/currency-confidence.test.js.map +1 -0
  29. package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.d.ts +1 -0
  30. package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.js +246 -0
  31. package/dist/server/src/modules/charges-matcher/__tests__/date-confidence.test.js.map +1 -0
  32. package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.d.ts +1 -0
  33. package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.js +475 -0
  34. package/dist/server/src/modules/charges-matcher/__tests__/document-aggregator.test.js.map +1 -0
  35. package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.d.ts +1 -0
  36. package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.js +287 -0
  37. package/dist/server/src/modules/charges-matcher/__tests__/document-amount.test.js.map +1 -0
  38. package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.d.ts +1 -0
  39. package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.js +151 -0
  40. package/dist/server/src/modules/charges-matcher/__tests__/document-business.test.js.map +1 -0
  41. package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.d.ts +1 -0
  42. package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.js +550 -0
  43. package/dist/server/src/modules/charges-matcher/__tests__/match-scorer.test.js.map +1 -0
  44. package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.d.ts +1 -0
  45. package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.js +410 -0
  46. package/dist/server/src/modules/charges-matcher/__tests__/overall-confidence.test.js.map +1 -0
  47. package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.d.ts +1 -0
  48. package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js +504 -0
  49. package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js.map +1 -0
  50. package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.d.ts +1 -0
  51. package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.js +483 -0
  52. package/dist/server/src/modules/charges-matcher/__tests__/single-match.test.js.map +1 -0
  53. package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.d.ts +46 -0
  54. package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.js +143 -0
  55. package/dist/server/src/modules/charges-matcher/__tests__/test-helpers.js.map +1 -0
  56. package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.d.ts +1 -0
  57. package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.js +137 -0
  58. package/dist/server/src/modules/charges-matcher/__tests__/test-infrastructure.spec.js.map +1 -0
  59. package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.d.ts +1 -0
  60. package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.js +415 -0
  61. package/dist/server/src/modules/charges-matcher/__tests__/transaction-aggregator.test.js.map +1 -0
  62. package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.d.ts +7 -0
  63. package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.js +70 -0
  64. package/dist/server/src/modules/charges-matcher/helpers/amount-confidence.helper.js.map +1 -0
  65. package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.d.ts +7 -0
  66. package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.js +19 -0
  67. package/dist/server/src/modules/charges-matcher/helpers/business-confidence.helper.js.map +1 -0
  68. package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.d.ts +24 -0
  69. package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.js +45 -0
  70. package/dist/server/src/modules/charges-matcher/helpers/candidate-filter.helper.js.map +1 -0
  71. package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.d.ts +33 -0
  72. package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.js +65 -0
  73. package/dist/server/src/modules/charges-matcher/helpers/charge-validator.helper.js.map +1 -0
  74. package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.d.ts +7 -0
  75. package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.js +18 -0
  76. package/dist/server/src/modules/charges-matcher/helpers/currency-confidence.helper.js.map +1 -0
  77. package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.d.ts +7 -0
  78. package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.js +35 -0
  79. package/dist/server/src/modules/charges-matcher/helpers/date-confidence.helper.js.map +1 -0
  80. package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.d.ts +49 -0
  81. package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.js +58 -0
  82. package/dist/server/src/modules/charges-matcher/helpers/document-amount.helper.js.map +1 -0
  83. package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.d.ts +13 -0
  84. package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.js +37 -0
  85. package/dist/server/src/modules/charges-matcher/helpers/document-business.helper.js.map +1 -0
  86. package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.d.ts +42 -0
  87. package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.js +77 -0
  88. package/dist/server/src/modules/charges-matcher/helpers/overall-confidence.helper.js.map +1 -0
  89. package/dist/server/src/modules/charges-matcher/index.d.ts +3 -0
  90. package/dist/server/src/modules/charges-matcher/index.js +15 -0
  91. package/dist/server/src/modules/charges-matcher/index.js.map +1 -0
  92. package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.d.ts +48 -0
  93. package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.js +133 -0
  94. package/dist/server/src/modules/charges-matcher/providers/auto-match.provider.js.map +1 -0
  95. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.d.ts +38 -0
  96. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js +248 -0
  97. package/dist/server/src/modules/charges-matcher/providers/charges-matcher.provider.js.map +1 -0
  98. package/dist/server/src/modules/charges-matcher/providers/document-aggregator.d.ts +61 -0
  99. package/dist/server/src/modules/charges-matcher/providers/document-aggregator.js +153 -0
  100. package/dist/server/src/modules/charges-matcher/providers/document-aggregator.js.map +1 -0
  101. package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.d.ts +25 -0
  102. package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.js +114 -0
  103. package/dist/server/src/modules/charges-matcher/providers/match-scorer.provider.js.map +1 -0
  104. package/dist/server/src/modules/charges-matcher/providers/single-match.provider.d.ts +39 -0
  105. package/dist/server/src/modules/charges-matcher/providers/single-match.provider.js +189 -0
  106. package/dist/server/src/modules/charges-matcher/providers/single-match.provider.js.map +1 -0
  107. package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.d.ts +54 -0
  108. package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.js +93 -0
  109. package/dist/server/src/modules/charges-matcher/providers/transaction-aggregator.js.map +1 -0
  110. package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.d.ts +2 -0
  111. package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.js +22 -0
  112. package/dist/server/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.js.map +1 -0
  113. package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.d.ts +2 -0
  114. package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.js +24 -0
  115. package/dist/server/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.js.map +1 -0
  116. package/dist/server/src/modules/charges-matcher/resolvers/index.d.ts +2 -0
  117. package/dist/server/src/modules/charges-matcher/resolvers/index.js +11 -0
  118. package/dist/server/src/modules/charges-matcher/resolvers/index.js.map +1 -0
  119. package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.d.ts +2 -0
  120. package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.js +47 -0
  121. package/dist/server/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.js.map +1 -0
  122. package/dist/server/src/modules/charges-matcher/types.d.ts +179 -0
  123. package/dist/server/src/modules/charges-matcher/types.js +14 -0
  124. package/dist/server/src/modules/charges-matcher/types.js.map +1 -0
  125. package/dist/server/src/modules/documents/resolvers/document-suggestions.resolver.js +2 -2
  126. package/dist/server/src/modules/documents/resolvers/document-suggestions.resolver.js.map +1 -1
  127. package/dist/server/src/modules-app.js +2 -0
  128. package/dist/server/src/modules-app.js.map +1 -1
  129. package/dist/server/src/shared/types/index.d.ts +1 -1
  130. package/package.json +4 -4
  131. package/src/__generated__/types.ts +87 -0
  132. package/src/modules/charges-matcher/README.md +279 -0
  133. package/src/modules/charges-matcher/__generated__/types.ts +71 -0
  134. package/src/modules/charges-matcher/__tests__/amount-confidence.test.ts +260 -0
  135. package/src/modules/charges-matcher/__tests__/auto-match-integration.test.ts +714 -0
  136. package/src/modules/charges-matcher/__tests__/auto-match.test.ts +621 -0
  137. package/src/modules/charges-matcher/__tests__/business-confidence.test.ts +177 -0
  138. package/src/modules/charges-matcher/__tests__/candidate-filter.test.ts +238 -0
  139. package/src/modules/charges-matcher/__tests__/charge-validator.test.ts +374 -0
  140. package/src/modules/charges-matcher/__tests__/currency-confidence.test.ts +164 -0
  141. package/src/modules/charges-matcher/__tests__/date-confidence.test.ts +291 -0
  142. package/src/modules/charges-matcher/__tests__/document-aggregator.test.ts +614 -0
  143. package/src/modules/charges-matcher/__tests__/document-amount.test.ts +352 -0
  144. package/src/modules/charges-matcher/__tests__/document-business.test.ts +192 -0
  145. package/src/modules/charges-matcher/__tests__/match-scorer.test.ts +659 -0
  146. package/src/modules/charges-matcher/__tests__/overall-confidence.test.ts +502 -0
  147. package/src/modules/charges-matcher/__tests__/single-match-integration.test.ts +556 -0
  148. package/src/modules/charges-matcher/__tests__/single-match.test.ts +608 -0
  149. package/src/modules/charges-matcher/__tests__/test-helpers.ts +174 -0
  150. package/src/modules/charges-matcher/__tests__/test-infrastructure.spec.ts +177 -0
  151. package/src/modules/charges-matcher/__tests__/transaction-aggregator.test.ts +547 -0
  152. package/src/modules/charges-matcher/documentation/README.md +331 -0
  153. package/src/modules/charges-matcher/documentation/SPEC.md +1503 -0
  154. package/src/modules/charges-matcher/documentation/TODO.md +799 -0
  155. package/src/modules/charges-matcher/helpers/amount-confidence.helper.ts +88 -0
  156. package/src/modules/charges-matcher/helpers/business-confidence.helper.ts +23 -0
  157. package/src/modules/charges-matcher/helpers/candidate-filter.helper.ts +56 -0
  158. package/src/modules/charges-matcher/helpers/charge-validator.helper.ts +100 -0
  159. package/src/modules/charges-matcher/helpers/currency-confidence.helper.ts +22 -0
  160. package/src/modules/charges-matcher/helpers/date-confidence.helper.ts +41 -0
  161. package/src/modules/charges-matcher/helpers/document-amount.helper.ts +77 -0
  162. package/src/modules/charges-matcher/helpers/document-business.helper.ts +54 -0
  163. package/src/modules/charges-matcher/helpers/overall-confidence.helper.ts +90 -0
  164. package/src/modules/charges-matcher/index.ts +17 -0
  165. package/src/modules/charges-matcher/providers/auto-match.provider.ts +176 -0
  166. package/src/modules/charges-matcher/providers/charges-matcher.provider.ts +322 -0
  167. package/src/modules/charges-matcher/providers/document-aggregator.ts +211 -0
  168. package/src/modules/charges-matcher/providers/match-scorer.provider.ts +154 -0
  169. package/src/modules/charges-matcher/providers/single-match.provider.ts +252 -0
  170. package/src/modules/charges-matcher/providers/transaction-aggregator.ts +131 -0
  171. package/src/modules/charges-matcher/resolvers/auto-match-charges.resolver.ts +23 -0
  172. package/src/modules/charges-matcher/resolvers/find-charge-matches.resolver.ts +25 -0
  173. package/src/modules/charges-matcher/resolvers/index.ts +12 -0
  174. package/src/modules/charges-matcher/typeDefs/charges-matcher.graphql.ts +47 -0
  175. package/src/modules/charges-matcher/types.ts +200 -0
  176. package/src/modules/documents/resolvers/document-suggestions.resolver.ts +2 -2
  177. package/src/modules-app.ts +2 -0
  178. package/src/shared/types/index.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @accounter/server
2
2
 
3
- ## 0.0.8-alpha-20251102200443-d7162b8ce1dfc629b8b454df17dcec9ed005a052
3
+ ## 0.0.8-alpha-20251102213150-c9d936f545d5351df0dc5326c2623266f1ad1f46
4
4
 
5
5
  ### Patch Changes
6
6
 
@@ -249,6 +249,21 @@
249
249
  - Updated dependency [`ai@5.0.82` ↗︎](https://www.npmjs.com/package/ai/v/5.0.82) (from `5.0.81`,
250
250
  in `dependencies`)
251
251
 
252
+ - [#2647](https://github.com/Urigo/accounter-fullstack/pull/2647)
253
+ [`f171a4a`](https://github.com/Urigo/accounter-fullstack/commit/f171a4a83c5f30b0135c72991b4796677223ff39)
254
+ Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:
255
+ - Updated dependency
256
+ [`@ai-sdk/anthropic@2.0.40` ↗︎](https://www.npmjs.com/package/@ai-sdk/anthropic/v/2.0.40) (from
257
+ `2.0.39`, in `dependencies`)
258
+ - Updated dependency [`ai@5.0.86` ↗︎](https://www.npmjs.com/package/ai/v/5.0.86) (from `5.0.82`,
259
+ in `dependencies`)
260
+
261
+ - [#2654](https://github.com/Urigo/accounter-fullstack/pull/2654)
262
+ [`7fef068`](https://github.com/Urigo/accounter-fullstack/commit/7fef0682c7316153ae5ffde42f97ce7284dd4c9a)
263
+ Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:
264
+ - Updated dependency [`graphql@16.12.0` ↗︎](https://www.npmjs.com/package/graphql/v/16.12.0)
265
+ (from `16.11.0`, in `dependencies`)
266
+
252
267
  - [#2631](https://github.com/Urigo/accounter-fullstack/pull/2631)
253
268
  [`86c8b3e`](https://github.com/Urigo/accounter-fullstack/commit/86c8b3ebea4e3be0c0e99a108ec1cdad8b39e5d8)
254
269
  Thanks [@gilgardosh](https://github.com/gilgardosh)! - - **Database Schema Update**: A new
@@ -284,6 +299,29 @@
284
299
  retrieved 'adminContext.locality' instead of a hardcoded country name, improving flexibility and
285
300
  accuracy.
286
301
 
302
+ - [#2649](https://github.com/Urigo/accounter-fullstack/pull/2649)
303
+ [`c9d936f`](https://github.com/Urigo/accounter-fullstack/commit/c9d936f545d5351df0dc5326c2623266f1ad1f46)
304
+ Thanks [@gilgardosh](https://github.com/gilgardosh)! - \* **New Charges Auto-Matcher Module**: A
305
+ new GraphQL module `charges-matcher` has been introduced, complete with its directory structure,
306
+ TypeScript types, and GraphQL schema definitions for single-match and auto-match functionalities.
307
+ - **Comprehensive Documentation**: Detailed `SPEC.md`, `PROMPT_PLAN.md`, and `TODO.md` documents
308
+ have been added, outlining the technical specification, a 17-step implementation plan, and a
309
+ checklist for the transaction-document matching system.
310
+ - **Core Matching Logic Implemented**: Helper functions for calculating confidence scores based on
311
+ amount, currency, business ID, and date proximity have been implemented and thoroughly tested.
312
+ - **Data Aggregation Providers**: Providers for aggregating multiple transactions and documents
313
+ into single representations, including filtering, currency/business ID validation, and
314
+ description concatenation, are now in place.
315
+ - **Single-Match & Auto-Match Core Functions**: The core logic for finding single matches (with
316
+ date window filtering and tie-breaking) and for processing charges for auto-matching (including
317
+ merge direction determination and high-confidence thresholding) has been developed.
318
+ - **Robust Testing Infrastructure**: A comprehensive testing framework, including mock factories
319
+ and 494 passing unit and integration tests, has been established, ensuring high code coverage.
320
+ - **GraphQL Integration**: GraphQL resolvers for `findChargeMatches` and `autoMatchCharges`
321
+ mutations/queries have been added, and the module is registered in the main GraphQL application.
322
+ - **Type Safety Improvement**: The `amount` type in the `DocumentSuggestionsProto` interface has
323
+ been updated from `string` to `number` for enhanced type safety.
324
+
287
325
  - [#2629](https://github.com/Urigo/accounter-fullstack/pull/2629)
288
326
  [`6244c1b`](https://github.com/Urigo/accounter-fullstack/commit/6244c1bbafa7029f426bdaf796d830ff62cee006)
289
327
  Thanks [@gilgardosh](https://github.com/gilgardosh)! - - **Database Schema Update**: The
@@ -536,7 +574,7 @@
536
574
  improved performance.
537
575
 
538
576
  - [#2658](https://github.com/Urigo/accounter-fullstack/pull/2658)
539
- [`b70d33f`](https://github.com/Urigo/accounter-fullstack/commit/b70d33f11d467ddc5a8d6b2869e72653ec08249b)
577
+ [`7a898a0`](https://github.com/Urigo/accounter-fullstack/commit/7a898a0ff1ee15420ab2532370a1d2f618cc86ab)
540
578
  Thanks [@gilgardosh](https://github.com/gilgardosh)! - - Updated all type references from
541
579
  `definitions` to `$defs` (represented as `_DOLLAR_defs` in TypeScript)
542
580
  - Added client management operations (add, update, delete)
@@ -563,14 +601,16 @@
563
601
  where the configuration might be `undefined`.
564
602
  - Updated dependencies
565
603
  [[`1ae19c6`](https://github.com/Urigo/accounter-fullstack/commit/1ae19c6f8dabd995120862795284dab6e363dc79),
604
+ [`7fef068`](https://github.com/Urigo/accounter-fullstack/commit/7fef0682c7316153ae5ffde42f97ce7284dd4c9a),
566
605
  [`65e3c7f`](https://github.com/Urigo/accounter-fullstack/commit/65e3c7f01993eb4f41244a40feefefa08b31a4e6),
567
606
  [`65e3c7f`](https://github.com/Urigo/accounter-fullstack/commit/65e3c7f01993eb4f41244a40feefefa08b31a4e6),
568
607
  [`65e3c7f`](https://github.com/Urigo/accounter-fullstack/commit/65e3c7f01993eb4f41244a40feefefa08b31a4e6),
569
- [`b70d33f`](https://github.com/Urigo/accounter-fullstack/commit/b70d33f11d467ddc5a8d6b2869e72653ec08249b)]:
570
- - @accounter/green-invoice-graphql@0.8.2-alpha-20251102200443-d7162b8ce1dfc629b8b454df17dcec9ed005a052
571
- - @accounter/pcn874-generator@0.6.3-alpha-20251102200443-d7162b8ce1dfc629b8b454df17dcec9ed005a052
572
- - @accounter/shaam-uniform-format-generator@0.2.2-alpha-20251102200443-d7162b8ce1dfc629b8b454df17dcec9ed005a052
573
- - @accounter/shaam6111-generator@0.1.4-alpha-20251102200443-d7162b8ce1dfc629b8b454df17dcec9ed005a052
608
+ [`7a898a0`](https://github.com/Urigo/accounter-fullstack/commit/7a898a0ff1ee15420ab2532370a1d2f618cc86ab),
609
+ [`c9d936f`](https://github.com/Urigo/accounter-fullstack/commit/c9d936f545d5351df0dc5326c2623266f1ad1f46)]:
610
+ - @accounter/green-invoice-graphql@0.8.2-alpha-20251102213150-c9d936f545d5351df0dc5326c2623266f1ad1f46
611
+ - @accounter/pcn874-generator@0.6.3-alpha-20251102213150-c9d936f545d5351df0dc5326c2623266f1ad1f46
612
+ - @accounter/shaam-uniform-format-generator@0.2.2-alpha-20251102213150-c9d936f545d5351df0dc5326c2623266f1ad1f46
613
+ - @accounter/shaam6111-generator@0.1.4-alpha-20251102213150-c9d936f545d5351df0dc5326c2623266f1ad1f46
574
614
 
575
615
  ## 0.0.7
576
616
 
@@ -4,8 +4,8 @@ import type { GetMeshOptions } from '@graphql-mesh/runtime';
4
4
  import type { YamlConfig } from '@graphql-mesh/types';
5
5
  import { MeshHTTPHandler } from '@graphql-mesh/http';
6
6
  import { type ExecuteMeshFn, type SubscribeMeshFn, type MeshContext as BaseMeshContext, type MeshInstance } from '@graphql-mesh/runtime';
7
- import type { GreenInvoiceNewTypes } from './sources/GreenInvoiceNew/types';
8
7
  import type { GreenInvoiceTypes } from './sources/GreenInvoice/types';
8
+ import type { GreenInvoiceNewTypes } from './sources/GreenInvoiceNew/types';
9
9
  export type Maybe<T> = T | null;
10
10
  export type InputMaybe<T> = Maybe<T>;
11
11
  export type Exact<T extends {
@@ -362,6 +362,18 @@ export type AuditOpinionType =
362
362
  | 'UNQUALIFIED_WITH_GOING_CONCERN'
363
363
  /** Unqualified opinion with other emphases (בנוסח אחיד עם הפניות תשומת לב אחרת) */
364
364
  | 'UNQUALIFIED_WITH_OTHER_EMPHASES';
365
+ /** Result of the auto-match operation */
366
+ export type AutoMatchChargesResult = {
367
+ readonly __typename?: 'AutoMatchChargesResult';
368
+ /** Array of error messages encountered during the operation */
369
+ readonly errors: ReadonlyArray<Scalars['String']['output']>;
370
+ /** Array of charges that were merged, with their confidence scores */
371
+ readonly mergedCharges: ReadonlyArray<MergedCharge>;
372
+ /** Array of charge UUIDs that had multiple high-confidence matches and were skipped */
373
+ readonly skippedCharges: ReadonlyArray<Scalars['UUID']['output']>;
374
+ /** Total number of charges that were successfully matched and merged */
375
+ readonly totalMatches: Scalars['Int']['output'];
376
+ };
365
377
  /** transactions for balance report */
366
378
  export type BalanceTransactions = {
367
379
  readonly __typename?: 'BalanceTransactions';
@@ -839,6 +851,20 @@ export type ChargeFilter = {
839
851
  };
840
852
  /** filter charges by type */
841
853
  export type ChargeFilterType = 'ALL' | 'EXPENSE' | 'INCOME';
854
+ /** A single charge match with its confidence score */
855
+ export type ChargeMatch = {
856
+ readonly __typename?: 'ChargeMatch';
857
+ /** UUID of the matched charge */
858
+ readonly chargeId: Scalars['UUID']['output'];
859
+ /** Confidence score between 0.00 and 1.00 */
860
+ readonly confidenceScore: Scalars['Float']['output'];
861
+ };
862
+ /** Result of finding matches for a single charge */
863
+ export type ChargeMatchesResult = {
864
+ readonly __typename?: 'ChargeMatchesResult';
865
+ /** Array of up to 5 matches, ordered by confidence score (highest first) */
866
+ readonly matches: ReadonlyArray<ChargeMatch>;
867
+ };
842
868
  /** represent charge's metadata */
843
869
  export type ChargeMetadata = {
844
870
  readonly __typename?: 'ChargeMetadata';
@@ -2085,6 +2111,14 @@ export type MergeChargesByTransactionReferenceResult = {
2085
2111
  readonly errors?: Maybe<ReadonlyArray<Scalars['String']['output']>>;
2086
2112
  readonly success: Scalars['Boolean']['output'];
2087
2113
  };
2114
+ /** A charge that was successfully merged during auto-match */
2115
+ export type MergedCharge = {
2116
+ readonly __typename?: 'MergedCharge';
2117
+ /** UUID of the deleted/merged-away charge */
2118
+ readonly chargeId: Scalars['UUID']['output'];
2119
+ /** Confidence score that triggered the merge */
2120
+ readonly confidenceScore: Scalars['Float']['output'];
2121
+ };
2088
2122
  /** a misc expense */
2089
2123
  export type MiscExpense = {
2090
2124
  readonly __typename?: 'MiscExpense';
@@ -2142,6 +2176,8 @@ export type Mutation = {
2142
2176
  readonly addDeelContract: Scalars['Boolean']['output'];
2143
2177
  readonly addSortCode: Scalars['Boolean']['output'];
2144
2178
  readonly addTag: Scalars['Boolean']['output'];
2179
+ /** Automatically match all unmatched charges above the confidence threshold */
2180
+ readonly autoMatchCharges: AutoMatchChargesResult;
2145
2181
  readonly batchGenerateBusinessesOutOfTransactions: ReadonlyArray<Business>;
2146
2182
  readonly batchUpdateCharges: BatchUpdateChargesResult;
2147
2183
  readonly batchUploadDocuments: ReadonlyArray<UploadDocumentResult>;
@@ -2886,6 +2922,8 @@ export type Query = {
2886
2922
  /** get exchage rates by date */
2887
2923
  readonly exchangeRates?: Maybe<ExchangeRates>;
2888
2924
  readonly financialEntity: FinancialEntity;
2925
+ /** Find potential matches for a single unmatched charge */
2926
+ readonly findChargeMatches: ChargeMatchesResult;
2889
2927
  readonly gmailListenerStatus: Scalars['Boolean']['output'];
2890
2928
  readonly greenInvoiceClient: GreenInvoiceClient;
2891
2929
  readonly incomeExpenseChart: IncomeExpenseChart;
@@ -3065,6 +3103,10 @@ export type QueryFinancialEntityArgs = {
3065
3103
  id: Scalars['UUID']['input'];
3066
3104
  };
3067
3105
  /** query root */
3106
+ export type QueryFindChargeMatchesArgs = {
3107
+ chargeId: Scalars['UUID']['input'];
3108
+ };
3109
+ /** query root */
3068
3110
  export type QueryGreenInvoiceClientArgs = {
3069
3111
  clientId: Scalars['UUID']['input'];
3070
3112
  };
@@ -4142,6 +4184,7 @@ export type ResolversTypes = {
4142
4184
  AnnualId: ResolverTypeWrapper<AnnualId>;
4143
4185
  AnnualIdInput: AnnualIdInput;
4144
4186
  AuditOpinionType: AuditOpinionType;
4187
+ AutoMatchChargesResult: ResolverTypeWrapper<AutoMatchChargesResult>;
4145
4188
  BalanceTransactions: ResolverTypeWrapper<IGetNormalizedBalanceTransactionsResult>;
4146
4189
  BankDeposit: ResolverTypeWrapper<Omit<BankDeposit, 'transactions'> & {
4147
4190
  transactions: ReadonlyArray<ResolversTypes['Transaction']>;
@@ -4191,6 +4234,8 @@ export type ResolversTypes = {
4191
4234
  Charge: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Charge']>;
4192
4235
  ChargeFilter: ChargeFilter;
4193
4236
  ChargeFilterType: ChargeFilterType;
4237
+ ChargeMatch: ResolverTypeWrapper<ChargeMatch>;
4238
+ ChargeMatchesResult: ResolverTypeWrapper<ChargeMatchesResult>;
4194
4239
  ChargeMetadata: ResolverTypeWrapper<IGetChargesByIdsResult>;
4195
4240
  ChargeSortBy: ChargeSortBy;
4196
4241
  ChargeSortByField: ChargeSortByField;
@@ -4342,6 +4387,7 @@ export type ResolversTypes = {
4342
4387
  MergeChargesByTransactionReferenceResult: ResolverTypeWrapper<Omit<MergeChargesByTransactionReferenceResult, 'charges'> & {
4343
4388
  charges?: Maybe<ReadonlyArray<ResolversTypes['Charge']>>;
4344
4389
  }>;
4390
+ MergedCharge: ResolverTypeWrapper<MergedCharge>;
4345
4391
  MiscExpense: ResolverTypeWrapper<IGetExpensesByChargeIdsResult>;
4346
4392
  MissingChargeInfo: MissingChargeInfo;
4347
4393
  MonthlyVatCharge: ResolverTypeWrapper<IGetChargesByIdsResult>;
@@ -4512,6 +4558,7 @@ export type ResolversParentTypes = {
4512
4558
  AdminContextInput: AdminContextInput;
4513
4559
  AnnualId: AnnualId;
4514
4560
  AnnualIdInput: AnnualIdInput;
4561
+ AutoMatchChargesResult: AutoMatchChargesResult;
4515
4562
  BalanceTransactions: IGetNormalizedBalanceTransactionsResult;
4516
4563
  BankDeposit: Omit<BankDeposit, 'transactions'> & {
4517
4564
  transactions: ReadonlyArray<ResolversParentTypes['Transaction']>;
@@ -4556,6 +4603,8 @@ export type ResolversParentTypes = {
4556
4603
  CategorizeIntoExistingBusinessTripExpenseInput: CategorizeIntoExistingBusinessTripExpenseInput;
4557
4604
  Charge: ResolversInterfaceTypes<ResolversParentTypes>['Charge'];
4558
4605
  ChargeFilter: ChargeFilter;
4606
+ ChargeMatch: ChargeMatch;
4607
+ ChargeMatchesResult: ChargeMatchesResult;
4559
4608
  ChargeMetadata: IGetChargesByIdsResult;
4560
4609
  ChargeSortBy: ChargeSortBy;
4561
4610
  ChargeSuggestions: Omit<ChargeSuggestions, 'tags'> & {
@@ -4684,6 +4733,7 @@ export type ResolversParentTypes = {
4684
4733
  MergeChargesByTransactionReferenceResult: Omit<MergeChargesByTransactionReferenceResult, 'charges'> & {
4685
4734
  charges?: Maybe<ReadonlyArray<ResolversParentTypes['Charge']>>;
4686
4735
  };
4736
+ MergedCharge: MergedCharge;
4687
4737
  MiscExpense: IGetExpensesByChargeIdsResult;
4688
4738
  MonthlyVatCharge: IGetChargesByIdsResult;
4689
4739
  Mutation: {};
@@ -4928,6 +4978,13 @@ export type AnnualIdResolvers<ContextType = GraphQLModules.Context, ParentType e
4928
4978
  year?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
4929
4979
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
4930
4980
  };
4981
+ export type AutoMatchChargesResultResolvers<ContextType = GraphQLModules.Context, ParentType extends ResolversParentTypes['AutoMatchChargesResult'] = ResolversParentTypes['AutoMatchChargesResult']> = {
4982
+ errors?: Resolver<ReadonlyArray<ResolversTypes['String']>, ParentType, ContextType>;
4983
+ mergedCharges?: Resolver<ReadonlyArray<ResolversTypes['MergedCharge']>, ParentType, ContextType>;
4984
+ skippedCharges?: Resolver<ReadonlyArray<ResolversTypes['UUID']>, ParentType, ContextType>;
4985
+ totalMatches?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
4986
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
4987
+ };
4931
4988
  export type BalanceTransactionsResolvers<ContextType = GraphQLModules.Context, ParentType extends ResolversParentTypes['BalanceTransactions'] = ResolversParentTypes['BalanceTransactions']> = {
4932
4989
  amount?: Resolver<ResolversTypes['FinancialAmount'], ParentType, ContextType>;
4933
4990
  amountUsd?: Resolver<ResolversTypes['FinancialAmount'], ParentType, ContextType>;
@@ -5249,6 +5306,15 @@ export type ChargeResolvers<ContextType = GraphQLModules.Context, ParentType ext
5249
5306
  withholdingTax?: Resolver<Maybe<ResolversTypes['FinancialAmount']>, ParentType, ContextType>;
5250
5307
  yearsOfRelevance?: Resolver<Maybe<ReadonlyArray<ResolversTypes['YearOfRelevance']>>, ParentType, ContextType>;
5251
5308
  };
5309
+ export type ChargeMatchResolvers<ContextType = GraphQLModules.Context, ParentType extends ResolversParentTypes['ChargeMatch'] = ResolversParentTypes['ChargeMatch']> = {
5310
+ chargeId?: Resolver<ResolversTypes['UUID'], ParentType, ContextType>;
5311
+ confidenceScore?: Resolver<ResolversTypes['Float'], ParentType, ContextType>;
5312
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
5313
+ };
5314
+ export type ChargeMatchesResultResolvers<ContextType = GraphQLModules.Context, ParentType extends ResolversParentTypes['ChargeMatchesResult'] = ResolversParentTypes['ChargeMatchesResult']> = {
5315
+ matches?: Resolver<ReadonlyArray<ResolversTypes['ChargeMatch']>, ParentType, ContextType>;
5316
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
5317
+ };
5252
5318
  export type ChargeMetadataResolvers<ContextType = GraphQLModules.Context, ParentType extends ResolversParentTypes['ChargeMetadata'] = ResolversParentTypes['ChargeMetadata']> = {
5253
5319
  createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>;
5254
5320
  documentsCount?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
@@ -6148,6 +6214,11 @@ export type MergeChargesByTransactionReferenceResultResolvers<ContextType = Grap
6148
6214
  success?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;
6149
6215
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
6150
6216
  };
6217
+ export type MergedChargeResolvers<ContextType = GraphQLModules.Context, ParentType extends ResolversParentTypes['MergedCharge'] = ResolversParentTypes['MergedCharge']> = {
6218
+ chargeId?: Resolver<ResolversTypes['UUID'], ParentType, ContextType>;
6219
+ confidenceScore?: Resolver<ResolversTypes['Float'], ParentType, ContextType>;
6220
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
6221
+ };
6151
6222
  export type MiscExpenseResolvers<ContextType = GraphQLModules.Context, ParentType extends ResolversParentTypes['MiscExpense'] = ResolversParentTypes['MiscExpense']> = {
6152
6223
  amount?: Resolver<ResolversTypes['FinancialAmount'], ParentType, ContextType>;
6153
6224
  charge?: Resolver<ResolversTypes['Charge'], ParentType, ContextType>;
@@ -6209,6 +6280,7 @@ export type MutationResolvers<ContextType = GraphQLModules.Context, ParentType e
6209
6280
  addDeelContract?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType, RequireFields<MutationAddDeelContractArgs, 'businessId' | 'contractId' | 'contractStartDate' | 'contractorId' | 'contractorName'>>;
6210
6281
  addSortCode?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType, RequireFields<MutationAddSortCodeArgs, 'key' | 'name'>>;
6211
6282
  addTag?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType, RequireFields<MutationAddTagArgs, 'name'>>;
6283
+ autoMatchCharges?: Resolver<ResolversTypes['AutoMatchChargesResult'], ParentType, ContextType>;
6212
6284
  batchGenerateBusinessesOutOfTransactions?: Resolver<ReadonlyArray<ResolversTypes['Business']>, ParentType, ContextType>;
6213
6285
  batchUpdateCharges?: Resolver<ResolversTypes['BatchUpdateChargesResult'], ParentType, ContextType, RequireFields<MutationBatchUpdateChargesArgs, 'chargeIds' | 'fields'>>;
6214
6286
  batchUploadDocuments?: Resolver<ReadonlyArray<ResolversTypes['UploadDocumentResult']>, ParentType, ContextType, RequireFields<MutationBatchUploadDocumentsArgs, 'documents'>>;
@@ -6478,6 +6550,7 @@ export type QueryResolvers<ContextType = GraphQLModules.Context, ParentType exte
6478
6550
  employeesByEmployerId?: Resolver<ReadonlyArray<ResolversTypes['Employee']>, ParentType, ContextType, RequireFields<QueryEmployeesByEmployerIdArgs, 'employerId'>>;
6479
6551
  exchangeRates?: Resolver<Maybe<ResolversTypes['ExchangeRates']>, ParentType, ContextType, Partial<QueryExchangeRatesArgs>>;
6480
6552
  financialEntity?: Resolver<ResolversTypes['FinancialEntity'], ParentType, ContextType, RequireFields<QueryFinancialEntityArgs, 'id'>>;
6553
+ findChargeMatches?: Resolver<ResolversTypes['ChargeMatchesResult'], ParentType, ContextType, RequireFields<QueryFindChargeMatchesArgs, 'chargeId'>>;
6481
6554
  gmailListenerStatus?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;
6482
6555
  greenInvoiceClient?: Resolver<ResolversTypes['GreenInvoiceClient'], ParentType, ContextType, RequireFields<QueryGreenInvoiceClientArgs, 'clientId'>>;
6483
6556
  incomeExpenseChart?: Resolver<ResolversTypes['IncomeExpenseChart'], ParentType, ContextType, RequireFields<QueryIncomeExpenseChartArgs, 'filters'>>;
@@ -6963,6 +7036,7 @@ export type Resolvers<ContextType = GraphQLModules.Context> = {
6963
7036
  AdminBusiness?: AdminBusinessResolvers<ContextType>;
6964
7037
  AdminContext?: AdminContextResolvers<ContextType>;
6965
7038
  AnnualId?: AnnualIdResolvers<ContextType>;
7039
+ AutoMatchChargesResult?: AutoMatchChargesResultResolvers<ContextType>;
6966
7040
  BalanceTransactions?: BalanceTransactionsResolvers<ContextType>;
6967
7041
  BankDeposit?: BankDepositResolvers<ContextType>;
6968
7042
  BankDepositCharge?: BankDepositChargeResolvers<ContextType>;
@@ -6990,6 +7064,8 @@ export type Resolvers<ContextType = GraphQLModules.Context> = {
6990
7064
  BusinessTripTravelAndSubsistenceExpense?: BusinessTripTravelAndSubsistenceExpenseResolvers<ContextType>;
6991
7065
  CardFinancialAccount?: CardFinancialAccountResolvers<ContextType>;
6992
7066
  Charge?: ChargeResolvers<ContextType>;
7067
+ ChargeMatch?: ChargeMatchResolvers<ContextType>;
7068
+ ChargeMatchesResult?: ChargeMatchesResultResolvers<ContextType>;
6993
7069
  ChargeMetadata?: ChargeMetadataResolvers<ContextType>;
6994
7070
  ChargeSortByField?: ChargeSortByFieldResolvers;
6995
7071
  ChargeSuggestions?: ChargeSuggestionsResolvers<ContextType>;
@@ -7072,6 +7148,7 @@ export type Resolvers<ContextType = GraphQLModules.Context> = {
7072
7148
  MergeChargeResult?: MergeChargeResultResolvers<ContextType>;
7073
7149
  MergeChargeSuccessfulResult?: MergeChargeSuccessfulResultResolvers<ContextType>;
7074
7150
  MergeChargesByTransactionReferenceResult?: MergeChargesByTransactionReferenceResultResolvers<ContextType>;
7151
+ MergedCharge?: MergedChargeResolvers<ContextType>;
7075
7152
  MiscExpense?: MiscExpenseResolvers<ContextType>;
7076
7153
  MissingChargeInfo?: MissingChargeInfoResolvers;
7077
7154
  MonthlyVatCharge?: MonthlyVatChargeResolvers<ContextType>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/__generated__/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAs3BrD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAyX7B,OAAO,EAAE,QAAQ,EAAE,CAAC;AAuLpB,OAAO,EAAE,YAAY,EAAE,CAAC;AA2lCxB,OAAO,EAAE,iBAAiB,EAAE,CAAC;AA85D7B,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/__generated__/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAm5BrD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAyX7B,OAAO,EAAE,QAAQ,EAAE,CAAC;AAuLpB,OAAO,EAAE,YAAY,EAAE,CAAC;AAomCxB,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAw6D7B,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,68 @@
1
+ import * as Types from "../../../__generated__/types.js";
2
+ import * as gm from "graphql-modules";
3
+ export declare namespace ChargesMatcherModule {
4
+ interface DefinedFields {
5
+ Query: 'findChargeMatches';
6
+ Mutation: 'autoMatchCharges';
7
+ ChargeMatchesResult: 'matches';
8
+ ChargeMatch: 'chargeId' | 'confidenceScore';
9
+ AutoMatchChargesResult: 'totalMatches' | 'mergedCharges' | 'skippedCharges' | 'errors';
10
+ MergedCharge: 'chargeId' | 'confidenceScore';
11
+ }
12
+ export type Query = Pick<Types.Query, DefinedFields['Query']>;
13
+ export type ChargeMatchesResult = Pick<Types.ChargeMatchesResult, DefinedFields['ChargeMatchesResult']>;
14
+ export type UUID = Types.Uuid;
15
+ export type Mutation = Pick<Types.Mutation, DefinedFields['Mutation']>;
16
+ export type AutoMatchChargesResult = Pick<Types.AutoMatchChargesResult, DefinedFields['AutoMatchChargesResult']>;
17
+ export type ChargeMatch = Pick<Types.ChargeMatch, DefinedFields['ChargeMatch']>;
18
+ export type MergedCharge = Pick<Types.MergedCharge, DefinedFields['MergedCharge']>;
19
+ export type QueryResolvers = Pick<Types.QueryResolvers, DefinedFields['Query']>;
20
+ export type MutationResolvers = Pick<Types.MutationResolvers, DefinedFields['Mutation']>;
21
+ export type ChargeMatchesResultResolvers = Pick<Types.ChargeMatchesResultResolvers, DefinedFields['ChargeMatchesResult']>;
22
+ export type ChargeMatchResolvers = Pick<Types.ChargeMatchResolvers, DefinedFields['ChargeMatch']>;
23
+ export type AutoMatchChargesResultResolvers = Pick<Types.AutoMatchChargesResultResolvers, DefinedFields['AutoMatchChargesResult']>;
24
+ export type MergedChargeResolvers = Pick<Types.MergedChargeResolvers, DefinedFields['MergedCharge']>;
25
+ export interface Resolvers {
26
+ Query?: QueryResolvers;
27
+ Mutation?: MutationResolvers;
28
+ ChargeMatchesResult?: ChargeMatchesResultResolvers;
29
+ ChargeMatch?: ChargeMatchResolvers;
30
+ AutoMatchChargesResult?: AutoMatchChargesResultResolvers;
31
+ MergedCharge?: MergedChargeResolvers;
32
+ }
33
+ export interface MiddlewareMap {
34
+ '*'?: {
35
+ '*'?: gm.Middleware[];
36
+ };
37
+ Query?: {
38
+ '*'?: gm.Middleware[];
39
+ findChargeMatches?: gm.Middleware[];
40
+ };
41
+ Mutation?: {
42
+ '*'?: gm.Middleware[];
43
+ autoMatchCharges?: gm.Middleware[];
44
+ };
45
+ ChargeMatchesResult?: {
46
+ '*'?: gm.Middleware[];
47
+ matches?: gm.Middleware[];
48
+ };
49
+ ChargeMatch?: {
50
+ '*'?: gm.Middleware[];
51
+ chargeId?: gm.Middleware[];
52
+ confidenceScore?: gm.Middleware[];
53
+ };
54
+ AutoMatchChargesResult?: {
55
+ '*'?: gm.Middleware[];
56
+ totalMatches?: gm.Middleware[];
57
+ mergedCharges?: gm.Middleware[];
58
+ skippedCharges?: gm.Middleware[];
59
+ errors?: gm.Middleware[];
60
+ };
61
+ MergedCharge?: {
62
+ '*'?: gm.Middleware[];
63
+ chargeId?: gm.Middleware[];
64
+ confidenceScore?: gm.Middleware[];
65
+ };
66
+ }
67
+ export {};
68
+ }
@@ -0,0 +1,7 @@
1
+ export var ChargesMatcherModule;
2
+ (function (ChargesMatcherModule) {
3
+ ;
4
+ ;
5
+ ;
6
+ })(ChargesMatcherModule || (ChargesMatcherModule = {}));
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/__generated__/types.ts"],"names":[],"mappings":"AAEA,MAAM,KAAW,oBAAoB,CAoEpC;AApED,WAAiB,oBAAoB;IAQlC,CAAC;IAwBD,CAAC;IAmCD,CAAC;AACJ,CAAC,EApEgB,oBAAoB,KAApB,oBAAoB,QAoEpC"}
@@ -0,0 +1,218 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { calculateAmountConfidence } from '../helpers/amount-confidence.helper.js';
3
+ describe('calculateAmountConfidence', () => {
4
+ describe('exact matches', () => {
5
+ it('should return 1.0 for exact match with positive amounts', () => {
6
+ expect(calculateAmountConfidence(100, 100)).toBe(1.0);
7
+ expect(calculateAmountConfidence(50.5, 50.5)).toBe(1.0);
8
+ expect(calculateAmountConfidence(0.01, 0.01)).toBe(1.0);
9
+ });
10
+ it('should return 1.0 for exact match with negative amounts', () => {
11
+ expect(calculateAmountConfidence(-100, -100)).toBe(1.0);
12
+ expect(calculateAmountConfidence(-50.5, -50.5)).toBe(1.0);
13
+ });
14
+ it('should return 1.0 for zero amounts', () => {
15
+ expect(calculateAmountConfidence(0, 0)).toBe(1.0);
16
+ });
17
+ it('should return 1.0 for matching absolute values with different signs', () => {
18
+ // Since we compare absolute values, sign differences shouldn't matter for exact amounts
19
+ expect(calculateAmountConfidence(100, 100)).toBe(1.0);
20
+ expect(calculateAmountConfidence(-100, -100)).toBe(1.0);
21
+ });
22
+ });
23
+ describe('amounts within 1 unit', () => {
24
+ it('should return 0.9 for amounts within 0.5 units', () => {
25
+ expect(calculateAmountConfidence(100, 100.5)).toBe(0.9);
26
+ expect(calculateAmountConfidence(100.5, 100)).toBe(0.9);
27
+ expect(calculateAmountConfidence(50, 50.3)).toBe(0.9);
28
+ });
29
+ it('should return 0.9 for amounts at exactly 1 unit difference', () => {
30
+ expect(calculateAmountConfidence(100, 101)).toBe(0.9);
31
+ expect(calculateAmountConfidence(101, 100)).toBe(0.9);
32
+ expect(calculateAmountConfidence(50, 51)).toBe(0.9);
33
+ });
34
+ it('should return 0.9 for amounts just under 1 unit difference', () => {
35
+ expect(calculateAmountConfidence(100, 100.99)).toBe(0.9);
36
+ expect(calculateAmountConfidence(100.99, 100)).toBe(0.9);
37
+ });
38
+ it('should return 0.9 for negative amounts within 1 unit', () => {
39
+ expect(calculateAmountConfidence(-100, -100.5)).toBe(0.9);
40
+ expect(calculateAmountConfidence(-100, -101)).toBe(0.9);
41
+ });
42
+ });
43
+ describe('amounts with differences between 1 unit and 20%', () => {
44
+ it('should return value between 0.0 and 0.7 for 1.5 units difference', () => {
45
+ const confidence = calculateAmountConfidence(100, 101.5);
46
+ expect(confidence).toBeGreaterThan(0.0);
47
+ expect(confidence).toBeLessThan(0.7);
48
+ });
49
+ it('should return value between 0.0 and 0.7 for 2 units difference', () => {
50
+ const confidence = calculateAmountConfidence(100, 102);
51
+ expect(confidence).toBeGreaterThan(0.0);
52
+ expect(confidence).toBeLessThan(0.7);
53
+ });
54
+ it('should return value between 0.0 and 0.7 for 5 units difference (on 100)', () => {
55
+ const confidence = calculateAmountConfidence(100, 105);
56
+ expect(confidence).toBeGreaterThan(0.0);
57
+ expect(confidence).toBeLessThan(0.7);
58
+ // 5% difference should be roughly in the middle
59
+ expect(confidence).toBeGreaterThan(0.3);
60
+ });
61
+ it('should return value between 0.0 and 0.7 for 10 units difference (on 100)', () => {
62
+ const confidence = calculateAmountConfidence(100, 110);
63
+ expect(confidence).toBeGreaterThan(0.0);
64
+ expect(confidence).toBeLessThan(0.7);
65
+ // 10% difference should be lower
66
+ expect(confidence).toBeLessThan(0.4);
67
+ });
68
+ it('should demonstrate linear degradation', () => {
69
+ // For amounts where 1 unit = 1%, we can test linear degradation more precisely
70
+ // Starting from just over 1% to just under 20%
71
+ // At around 1% (just over 1 unit on 100): should be close to 0.7
72
+ const conf1 = calculateAmountConfidence(100, 101.5); // 1.5%
73
+ // At around 10% (middle of range): should be around 0.35
74
+ const conf10 = calculateAmountConfidence(100, 110); // 10%
75
+ // At around 19% (near end): should be close to 0.0
76
+ const conf19 = calculateAmountConfidence(100, 119); // 19%
77
+ // Verify degradation order
78
+ expect(conf1).toBeGreaterThan(conf10);
79
+ expect(conf10).toBeGreaterThan(conf19);
80
+ });
81
+ });
82
+ describe('amounts at exactly 20% difference', () => {
83
+ it('should return 0.0 for exactly 20% difference', () => {
84
+ expect(calculateAmountConfidence(100, 120)).toBe(0.0);
85
+ expect(calculateAmountConfidence(120, 100)).toBe(0.0);
86
+ expect(calculateAmountConfidence(50, 60)).toBe(0.0);
87
+ });
88
+ it('should return 0.0 for just under 20% difference (19.99%)', () => {
89
+ // Just under 20% should still be very close to 0
90
+ const confidence = calculateAmountConfidence(100, 119.9);
91
+ expect(confidence).toBeLessThanOrEqual(0.01);
92
+ });
93
+ });
94
+ describe('amounts beyond 20% difference', () => {
95
+ it('should return 0.0 for 25% difference', () => {
96
+ expect(calculateAmountConfidence(100, 125)).toBe(0.0);
97
+ });
98
+ it('should return 0.0 for 50% difference', () => {
99
+ expect(calculateAmountConfidence(100, 150)).toBe(0.0);
100
+ });
101
+ it('should return 0.0 for 100% difference', () => {
102
+ expect(calculateAmountConfidence(100, 200)).toBe(0.0);
103
+ });
104
+ it('should return 0.0 for very large differences', () => {
105
+ expect(calculateAmountConfidence(100, 1000)).toBe(0.0);
106
+ expect(calculateAmountConfidence(10, 500)).toBe(0.0);
107
+ });
108
+ });
109
+ describe('edge cases with negative amounts', () => {
110
+ it('should handle negative transaction amount', () => {
111
+ expect(calculateAmountConfidence(-100, -100)).toBe(1.0);
112
+ expect(calculateAmountConfidence(-100, -101)).toBe(0.9);
113
+ expect(calculateAmountConfidence(-100, -105)).toBeGreaterThan(0.0);
114
+ expect(calculateAmountConfidence(-100, -120)).toBe(0.0);
115
+ });
116
+ it('should handle negative document amount', () => {
117
+ expect(calculateAmountConfidence(-100, -100)).toBe(1.0);
118
+ expect(calculateAmountConfidence(-101, -100)).toBe(0.9);
119
+ });
120
+ it('should handle both amounts negative', () => {
121
+ expect(calculateAmountConfidence(-50, -50.5)).toBe(0.9);
122
+ expect(calculateAmountConfidence(-100, -110)).toBeGreaterThan(0.0);
123
+ });
124
+ });
125
+ describe('edge cases with very small amounts', () => {
126
+ it('should handle very small amounts correctly', () => {
127
+ expect(calculateAmountConfidence(0.1, 0.1)).toBe(1.0);
128
+ expect(calculateAmountConfidence(0.01, 0.01)).toBe(1.0);
129
+ });
130
+ it('should return 0.9 for small amounts within 1 unit', () => {
131
+ // Even though 1 unit is huge compared to 0.1, it should still return 0.9
132
+ expect(calculateAmountConfidence(0.1, 1.0)).toBe(0.9);
133
+ expect(calculateAmountConfidence(0.5, 1.5)).toBe(0.9);
134
+ });
135
+ it('should handle small amounts with percentage differences correctly', () => {
136
+ // 0.1 to 0.12 has a difference of 0.02, which is within 1 unit, so returns 0.9
137
+ expect(calculateAmountConfidence(0.1, 0.12)).toBe(0.9);
138
+ // 0.1 to 0.11 has a difference of 0.01, which is within 1 unit, so returns 0.9
139
+ expect(calculateAmountConfidence(0.1, 0.11)).toBe(0.9);
140
+ // 0.1 to 1.2 has >1 unit difference (1.1) and is also >20%, so returns 0.0
141
+ expect(calculateAmountConfidence(0.1, 1.2)).toBe(0.0);
142
+ });
143
+ });
144
+ describe('edge cases with zero', () => {
145
+ it('should handle zero in transaction amount', () => {
146
+ expect(calculateAmountConfidence(0, 0)).toBe(1.0);
147
+ });
148
+ it('should handle zero vs non-zero amounts', () => {
149
+ // 0 to 1 is within 1 unit
150
+ expect(calculateAmountConfidence(0, 1)).toBe(0.9);
151
+ expect(calculateAmountConfidence(1, 0)).toBe(0.9);
152
+ // 0 to >1 means one amount is 0, which makes percentage calculation undefined
153
+ // The spec requires us to handle this gracefully - since we can't calculate percentage
154
+ // and the difference is >1, we return 0.0
155
+ expect(calculateAmountConfidence(0, 2)).toBe(0.0);
156
+ });
157
+ });
158
+ describe('formula verification for linear degradation', () => {
159
+ it('should verify the linear formula in the middle range', () => {
160
+ // Using base amount of 100 for easier percentage calculation
161
+ // 1 unit = 1% on 100
162
+ // Range is from 1% to 20%
163
+ // Confidence degrades linearly from 0.7 to 0.0
164
+ // At 1% (101): should be close to 0.7 (but we're just over 1 unit)
165
+ const conf1 = calculateAmountConfidence(100, 101.01);
166
+ expect(conf1).toBeCloseTo(0.7, 1);
167
+ // At 10.5% (halfway between 1% and 20%): should be around 0.35
168
+ const conf10_5 = calculateAmountConfidence(100, 110.5);
169
+ expect(conf10_5).toBeCloseTo(0.35, 1);
170
+ // At 19.9% (just before 20%): should be close to 0.0
171
+ const conf19_9 = calculateAmountConfidence(100, 119.9);
172
+ expect(conf19_9).toBeCloseTo(0.0, 1);
173
+ });
174
+ it('should verify degradation is proportional across the range', () => {
175
+ // Calculate several points and verify linear relationship
176
+ const base = 100;
177
+ // Points at different percentages in the degradation range
178
+ const conf_2pct = calculateAmountConfidence(base, 102); // ~2%
179
+ const conf_5pct = calculateAmountConfidence(base, 105); // 5%
180
+ const conf_10pct = calculateAmountConfidence(base, 110); // 10%
181
+ const conf_15pct = calculateAmountConfidence(base, 115); // 15%
182
+ // Each should be progressively smaller
183
+ expect(conf_2pct).toBeGreaterThan(conf_5pct);
184
+ expect(conf_5pct).toBeGreaterThan(conf_10pct);
185
+ expect(conf_10pct).toBeGreaterThan(conf_15pct);
186
+ });
187
+ });
188
+ describe('return value precision', () => {
189
+ it('should return values rounded to 2 decimal places', () => {
190
+ const confidence = calculateAmountConfidence(100, 105);
191
+ // Check that the value has at most 2 decimal places
192
+ const decimalPlaces = (confidence.toString().split('.')[1] || '').length;
193
+ expect(decimalPlaces).toBeLessThanOrEqual(2);
194
+ });
195
+ it('should handle rounding correctly for edge values', () => {
196
+ // Test various amounts that might produce values needing rounding
197
+ const amounts = [
198
+ [100, 102.5],
199
+ [100, 107.3],
200
+ [100, 113.7],
201
+ [50, 53.3],
202
+ ];
203
+ amounts.forEach(([amt1, amt2]) => {
204
+ const confidence = calculateAmountConfidence(amt1, amt2);
205
+ const decimalPlaces = (confidence.toString().split('.')[1] || '').length;
206
+ expect(decimalPlaces).toBeLessThanOrEqual(2);
207
+ });
208
+ });
209
+ });
210
+ describe('symmetry', () => {
211
+ it('should return same confidence regardless of parameter order', () => {
212
+ expect(calculateAmountConfidence(100, 105)).toBe(calculateAmountConfidence(105, 100));
213
+ expect(calculateAmountConfidence(50, 60)).toBe(calculateAmountConfidence(60, 50));
214
+ expect(calculateAmountConfidence(100, 101)).toBe(calculateAmountConfidence(101, 100));
215
+ });
216
+ });
217
+ });
218
+ //# sourceMappingURL=amount-confidence.test.js.map