@open-mercato/core 0.4.2-canary-10c7a8bf2a → 0.4.2-canary-c84cff7ed5

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 (526) hide show
  1. package/dist/generated/entities/notification/index.js +57 -0
  2. package/dist/generated/entities/notification/index.js.map +7 -0
  3. package/dist/generated/entities.ids.generated.js +5 -1
  4. package/dist/generated/entities.ids.generated.js.map +2 -2
  5. package/dist/generated/entity-fields-registry.js +2 -0
  6. package/dist/generated/entity-fields-registry.js.map +2 -2
  7. package/dist/modules/api_docs/frontend/docs/api/page.js +3 -2
  8. package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
  9. package/dist/modules/api_keys/backend/api-keys/page.js +1 -1
  10. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  11. package/dist/modules/attachments/components/AttachmentLibrary.js +4 -0
  12. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  13. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +2 -0
  14. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  15. package/dist/modules/auth/api/admin/nav.js +4 -3
  16. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  17. package/dist/modules/auth/api/profile/route.js +157 -0
  18. package/dist/modules/auth/api/profile/route.js.map +7 -0
  19. package/dist/modules/auth/api/reset/confirm.js +25 -2
  20. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  21. package/dist/modules/auth/api/reset.js +23 -0
  22. package/dist/modules/auth/api/reset.js.map +2 -2
  23. package/dist/modules/auth/api/sidebar/preferences/route.js +14 -9
  24. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  25. package/dist/modules/auth/api/users/route.js +4 -2
  26. package/dist/modules/auth/api/users/route.js.map +2 -2
  27. package/dist/modules/auth/backend/auth/profile/page.js +141 -0
  28. package/dist/modules/auth/backend/auth/profile/page.js.map +7 -0
  29. package/dist/modules/auth/backend/auth/profile/page.meta.js +13 -0
  30. package/dist/modules/auth/backend/auth/profile/page.meta.js.map +7 -0
  31. package/dist/modules/auth/backend/roles/page.js +3 -3
  32. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  33. package/dist/modules/auth/backend/users/[id]/edit/page.js +14 -2
  34. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  35. package/dist/modules/auth/backend/users/create/page.js +15 -2
  36. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  37. package/dist/modules/auth/backend/users/page.js +3 -3
  38. package/dist/modules/auth/backend/users/page.js.map +2 -2
  39. package/dist/modules/auth/cli.js +13 -0
  40. package/dist/modules/auth/cli.js.map +2 -2
  41. package/dist/modules/auth/commands/users.js +59 -2
  42. package/dist/modules/auth/commands/users.js.map +2 -2
  43. package/dist/modules/auth/data/validators.js +4 -2
  44. package/dist/modules/auth/data/validators.js.map +2 -2
  45. package/dist/modules/auth/frontend/reset/[token]/page.js +20 -10
  46. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  47. package/dist/modules/auth/lib/setup-app.js +3 -0
  48. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  49. package/dist/modules/auth/notifications.js +112 -0
  50. package/dist/modules/auth/notifications.js.map +7 -0
  51. package/dist/modules/auth/services/authService.js +3 -3
  52. package/dist/modules/auth/services/authService.js.map +2 -2
  53. package/dist/modules/business_rules/backend/rules/page.js +4 -0
  54. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  55. package/dist/modules/business_rules/backend/sets/page.js +3 -0
  56. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  57. package/dist/modules/business_rules/notifications.js +28 -0
  58. package/dist/modules/business_rules/notifications.js.map +7 -0
  59. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +37 -0
  60. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +7 -0
  61. package/dist/modules/catalog/analytics.js +27 -0
  62. package/dist/modules/catalog/analytics.js.map +7 -0
  63. package/dist/modules/catalog/components/PriceKindSettings.js +2 -0
  64. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  65. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  66. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  67. package/dist/modules/catalog/components/products/ProductsDataTable.js +2 -0
  68. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  69. package/dist/modules/catalog/notifications.js +28 -0
  70. package/dist/modules/catalog/notifications.js.map +7 -0
  71. package/dist/modules/catalog/subscribers/low-stock-notification.js +38 -0
  72. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +7 -0
  73. package/dist/modules/configs/cli.js +6 -0
  74. package/dist/modules/configs/cli.js.map +2 -2
  75. package/dist/modules/configs/lib/upgrade-actions.js +18 -0
  76. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  77. package/dist/modules/currencies/backend/currencies/page.js +3 -0
  78. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  79. package/dist/modules/currencies/backend/exchange-rates/page.js +2 -0
  80. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  81. package/dist/modules/customers/analytics.js +50 -0
  82. package/dist/modules/customers/analytics.js.map +7 -0
  83. package/dist/modules/customers/backend/customers/companies/page.js +3 -0
  84. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  85. package/dist/modules/customers/backend/customers/deals/page.js +3 -0
  86. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  87. package/dist/modules/customers/backend/customers/people/page.js +3 -0
  88. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  89. package/dist/modules/customers/commands/deals.js +31 -0
  90. package/dist/modules/customers/commands/deals.js.map +2 -2
  91. package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
  92. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  93. package/dist/modules/customers/notifications.js +48 -0
  94. package/dist/modules/customers/notifications.js.map +7 -0
  95. package/dist/modules/dashboards/acl.js +2 -1
  96. package/dist/modules/dashboards/acl.js.map +2 -2
  97. package/dist/modules/dashboards/api/widgets/data/route.js +187 -0
  98. package/dist/modules/dashboards/api/widgets/data/route.js.map +7 -0
  99. package/dist/modules/dashboards/cli.js +173 -1
  100. package/dist/modules/dashboards/cli.js.map +2 -2
  101. package/dist/modules/dashboards/di.js +11 -0
  102. package/dist/modules/dashboards/di.js.map +7 -0
  103. package/dist/modules/dashboards/lib/aggregations.js +162 -0
  104. package/dist/modules/dashboards/lib/aggregations.js.map +7 -0
  105. package/dist/modules/dashboards/lib/formatters.js +34 -0
  106. package/dist/modules/dashboards/lib/formatters.js.map +7 -0
  107. package/dist/modules/dashboards/lib/role-widgets.js +58 -0
  108. package/dist/modules/dashboards/lib/role-widgets.js.map +7 -0
  109. package/dist/modules/dashboards/seed/analytics.js +383 -0
  110. package/dist/modules/dashboards/seed/analytics.js.map +7 -0
  111. package/dist/modules/dashboards/services/analyticsRegistry.js +52 -0
  112. package/dist/modules/dashboards/services/analyticsRegistry.js.map +7 -0
  113. package/dist/modules/dashboards/services/widgetDataService.js +207 -0
  114. package/dist/modules/dashboards/services/widgetDataService.js.map +7 -0
  115. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/config.js +18 -0
  116. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/config.js.map +7 -0
  117. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js +128 -0
  118. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js.map +7 -0
  119. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js +25 -0
  120. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js.map +7 -0
  121. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/config.js +18 -0
  122. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/config.js.map +7 -0
  123. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js +126 -0
  124. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js.map +7 -0
  125. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js +25 -0
  126. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js.map +7 -0
  127. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/config.js +18 -0
  128. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/config.js.map +7 -0
  129. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +151 -0
  130. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +7 -0
  131. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js +25 -0
  132. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js.map +7 -0
  133. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/config.js +18 -0
  134. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/config.js.map +7 -0
  135. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js +126 -0
  136. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js.map +7 -0
  137. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js +25 -0
  138. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js.map +7 -0
  139. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/config.js +16 -0
  140. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/config.js.map +7 -0
  141. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js +123 -0
  142. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js.map +7 -0
  143. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +25 -0
  144. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +7 -0
  145. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/config.js +18 -0
  146. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/config.js.map +7 -0
  147. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js +128 -0
  148. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js.map +7 -0
  149. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js +25 -0
  150. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js.map +7 -0
  151. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/config.js +21 -0
  152. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/config.js.map +7 -0
  153. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +211 -0
  154. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +7 -0
  155. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js +25 -0
  156. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js.map +7 -0
  157. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/config.js +19 -0
  158. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/config.js.map +7 -0
  159. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +131 -0
  160. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +7 -0
  161. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js +25 -0
  162. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js.map +7 -0
  163. package/dist/modules/dashboards/widgets/dashboard/top-customers/config.js +19 -0
  164. package/dist/modules/dashboards/widgets/dashboard/top-customers/config.js.map +7 -0
  165. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +153 -0
  166. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +7 -0
  167. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js +25 -0
  168. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js.map +7 -0
  169. package/dist/modules/dashboards/widgets/dashboard/top-products/config.js +22 -0
  170. package/dist/modules/dashboards/widgets/dashboard/top-products/config.js.map +7 -0
  171. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +180 -0
  172. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +7 -0
  173. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js +25 -0
  174. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js.map +7 -0
  175. package/dist/modules/dictionaries/components/DictionaryTable.js +2 -0
  176. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  177. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  178. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  179. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  180. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  181. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  182. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  183. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  184. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  185. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  186. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  187. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  188. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  189. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  190. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  191. package/dist/modules/notifications/acl.js +11 -0
  192. package/dist/modules/notifications/acl.js.map +7 -0
  193. package/dist/modules/notifications/api/[id]/action/route.js +74 -0
  194. package/dist/modules/notifications/api/[id]/action/route.js.map +7 -0
  195. package/dist/modules/notifications/api/[id]/dismiss/route.js +15 -0
  196. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +7 -0
  197. package/dist/modules/notifications/api/[id]/read/route.js +15 -0
  198. package/dist/modules/notifications/api/[id]/read/route.js.map +7 -0
  199. package/dist/modules/notifications/api/[id]/restore/route.js +53 -0
  200. package/dist/modules/notifications/api/[id]/restore/route.js.map +7 -0
  201. package/dist/modules/notifications/api/batch/route.js +17 -0
  202. package/dist/modules/notifications/api/batch/route.js.map +7 -0
  203. package/dist/modules/notifications/api/feature/route.js +17 -0
  204. package/dist/modules/notifications/api/feature/route.js.map +7 -0
  205. package/dist/modules/notifications/api/mark-all-read/route.js +35 -0
  206. package/dist/modules/notifications/api/mark-all-read/route.js.map +7 -0
  207. package/dist/modules/notifications/api/openapi.js +76 -0
  208. package/dist/modules/notifications/api/openapi.js.map +7 -0
  209. package/dist/modules/notifications/api/role/route.js +17 -0
  210. package/dist/modules/notifications/api/role/route.js.map +7 -0
  211. package/dist/modules/notifications/api/route.js +85 -0
  212. package/dist/modules/notifications/api/route.js.map +7 -0
  213. package/dist/modules/notifications/api/settings/route.js +155 -0
  214. package/dist/modules/notifications/api/settings/route.js.map +7 -0
  215. package/dist/modules/notifications/api/unread-count/route.js +38 -0
  216. package/dist/modules/notifications/api/unread-count/route.js.map +7 -0
  217. package/dist/modules/notifications/backend/config/notifications/page.js +10 -0
  218. package/dist/modules/notifications/backend/config/notifications/page.js.map +7 -0
  219. package/dist/modules/notifications/backend/config/notifications/page.meta.js +24 -0
  220. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +7 -0
  221. package/dist/modules/notifications/cli.js +16 -0
  222. package/dist/modules/notifications/cli.js.map +7 -0
  223. package/dist/modules/notifications/data/entities.js +112 -0
  224. package/dist/modules/notifications/data/entities.js.map +7 -0
  225. package/dist/modules/notifications/data/validators.js +94 -0
  226. package/dist/modules/notifications/data/validators.js.map +7 -0
  227. package/dist/modules/notifications/di.js +13 -0
  228. package/dist/modules/notifications/di.js.map +7 -0
  229. package/dist/modules/notifications/emails/NotificationEmail.js +58 -0
  230. package/dist/modules/notifications/emails/NotificationEmail.js.map +7 -0
  231. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +44 -0
  232. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +7 -0
  233. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +219 -0
  234. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +7 -0
  235. package/dist/modules/notifications/index.js +14 -0
  236. package/dist/modules/notifications/index.js.map +7 -0
  237. package/dist/modules/notifications/lib/deliveryConfig.js +105 -0
  238. package/dist/modules/notifications/lib/deliveryConfig.js.map +7 -0
  239. package/dist/modules/notifications/lib/events.js +12 -0
  240. package/dist/modules/notifications/lib/events.js.map +7 -0
  241. package/dist/modules/notifications/lib/notificationBuilder.js +66 -0
  242. package/dist/modules/notifications/lib/notificationBuilder.js.map +7 -0
  243. package/dist/modules/notifications/lib/notificationFactory.js +54 -0
  244. package/dist/modules/notifications/lib/notificationFactory.js.map +7 -0
  245. package/dist/modules/notifications/lib/notificationMapper.js +34 -0
  246. package/dist/modules/notifications/lib/notificationMapper.js.map +7 -0
  247. package/dist/modules/notifications/lib/notificationRecipients.js +35 -0
  248. package/dist/modules/notifications/lib/notificationRecipients.js.map +7 -0
  249. package/dist/modules/notifications/lib/notificationService.js +279 -0
  250. package/dist/modules/notifications/lib/notificationService.js.map +7 -0
  251. package/dist/modules/notifications/lib/routeHelpers.js +101 -0
  252. package/dist/modules/notifications/lib/routeHelpers.js.map +7 -0
  253. package/dist/modules/notifications/lib/safeHref.js +24 -0
  254. package/dist/modules/notifications/lib/safeHref.js.map +7 -0
  255. package/dist/modules/notifications/migrations/Migration20260123000001.js +70 -0
  256. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +7 -0
  257. package/dist/modules/notifications/migrations/Migration20260126150000.js +37 -0
  258. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +7 -0
  259. package/dist/modules/notifications/subscribers/deliver-notification.js +139 -0
  260. package/dist/modules/notifications/subscribers/deliver-notification.js.map +7 -0
  261. package/dist/modules/notifications/workers/create-notification.worker.js +70 -0
  262. package/dist/modules/notifications/workers/create-notification.worker.js.map +7 -0
  263. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  264. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  265. package/dist/modules/query_index/components/QueryIndexesTable.js +7 -1
  266. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  267. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  268. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  269. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  270. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  271. package/dist/modules/sales/analytics.js +67 -0
  272. package/dist/modules/sales/analytics.js.map +7 -0
  273. package/dist/modules/sales/backend/sales/channels/offers/page.js +2 -0
  274. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  275. package/dist/modules/sales/backend/sales/channels/page.js +2 -0
  276. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  277. package/dist/modules/sales/commands/documents.js +53 -0
  278. package/dist/modules/sales/commands/documents.js.map +2 -2
  279. package/dist/modules/sales/commands/payments.js +26 -0
  280. package/dist/modules/sales/commands/payments.js.map +2 -2
  281. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  282. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  283. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  284. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  285. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  286. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  287. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  288. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  289. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +2 -0
  290. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  291. package/dist/modules/sales/components/documents/AdjustmentsSection.js +2 -0
  292. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  293. package/dist/modules/sales/components/documents/PaymentsSection.js +2 -1
  294. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  295. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +2 -0
  296. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  297. package/dist/modules/sales/notifications.client.js +51 -0
  298. package/dist/modules/sales/notifications.client.js.map +7 -0
  299. package/dist/modules/sales/notifications.js +88 -0
  300. package/dist/modules/sales/notifications.js.map +7 -0
  301. package/dist/modules/sales/subscribers/quote-expiring-notification.js +38 -0
  302. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +7 -0
  303. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +137 -0
  304. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +7 -0
  305. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +137 -0
  306. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +7 -0
  307. package/dist/modules/sales/widgets/notifications/index.js +7 -0
  308. package/dist/modules/sales/widgets/notifications/index.js.map +7 -0
  309. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +60 -0
  310. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +7 -0
  311. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  312. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  313. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  314. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  315. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  316. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  317. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  318. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  319. package/dist/modules/staff/commands/leave-requests.js +79 -0
  320. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  321. package/dist/modules/staff/notifications.js +75 -0
  322. package/dist/modules/staff/notifications.js.map +7 -0
  323. package/dist/modules/workflows/backend/definitions/page.js +5 -0
  324. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  325. package/dist/modules/workflows/backend/instances/page.js +3 -0
  326. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  327. package/dist/modules/workflows/backend/tasks/page.js +3 -0
  328. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  329. package/dist/modules/workflows/notifications.js +28 -0
  330. package/dist/modules/workflows/notifications.js.map +7 -0
  331. package/dist/modules/workflows/subscribers/task-assigned-notification.js +38 -0
  332. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +7 -0
  333. package/generated/entities/notification/index.ts +27 -0
  334. package/generated/entities.ids.generated.ts +5 -1
  335. package/generated/entity-fields-registry.ts +2 -0
  336. package/package.json +2 -2
  337. package/src/modules/api_docs/frontend/docs/api/page.tsx +3 -2
  338. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  339. package/src/modules/attachments/components/AttachmentLibrary.tsx +4 -0
  340. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +2 -0
  341. package/src/modules/auth/api/admin/nav.ts +10 -6
  342. package/src/modules/auth/api/profile/route.ts +163 -0
  343. package/src/modules/auth/api/reset/confirm.ts +25 -2
  344. package/src/modules/auth/api/reset.ts +23 -0
  345. package/src/modules/auth/api/sidebar/preferences/route.ts +21 -12
  346. package/src/modules/auth/api/users/route.ts +5 -2
  347. package/src/modules/auth/backend/auth/profile/page.meta.ts +9 -0
  348. package/src/modules/auth/backend/auth/profile/page.tsx +174 -0
  349. package/src/modules/auth/backend/roles/page.tsx +3 -3
  350. package/src/modules/auth/backend/users/[id]/edit/page.tsx +18 -2
  351. package/src/modules/auth/backend/users/create/page.tsx +19 -2
  352. package/src/modules/auth/backend/users/page.tsx +3 -3
  353. package/src/modules/auth/cli.ts +14 -0
  354. package/src/modules/auth/commands/users.ts +73 -2
  355. package/src/modules/auth/data/validators.ts +5 -2
  356. package/src/modules/auth/frontend/reset/[token]/page.tsx +24 -11
  357. package/src/modules/auth/i18n/de.json +43 -1
  358. package/src/modules/auth/i18n/en.json +43 -1
  359. package/src/modules/auth/i18n/es.json +43 -1
  360. package/src/modules/auth/i18n/pl.json +43 -1
  361. package/src/modules/auth/lib/setup-app.ts +3 -0
  362. package/src/modules/auth/notifications.ts +109 -0
  363. package/src/modules/auth/services/authService.ts +4 -4
  364. package/src/modules/business_rules/backend/rules/page.tsx +4 -0
  365. package/src/modules/business_rules/backend/sets/page.tsx +3 -0
  366. package/src/modules/business_rules/i18n/en.json +3 -1
  367. package/src/modules/business_rules/notifications.ts +25 -0
  368. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +50 -0
  369. package/src/modules/catalog/analytics.ts +24 -0
  370. package/src/modules/catalog/components/PriceKindSettings.tsx +2 -0
  371. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  372. package/src/modules/catalog/components/products/ProductsDataTable.tsx +2 -0
  373. package/src/modules/catalog/i18n/en.json +3 -1
  374. package/src/modules/catalog/notifications.ts +25 -0
  375. package/src/modules/catalog/subscribers/low-stock-notification.ts +52 -0
  376. package/src/modules/configs/cli.ts +6 -0
  377. package/src/modules/configs/lib/upgrade-actions.ts +18 -0
  378. package/src/modules/currencies/backend/currencies/page.tsx +3 -0
  379. package/src/modules/currencies/backend/exchange-rates/page.tsx +2 -0
  380. package/src/modules/customers/analytics.ts +47 -0
  381. package/src/modules/customers/backend/customers/companies/page.tsx +3 -0
  382. package/src/modules/customers/backend/customers/deals/page.tsx +3 -0
  383. package/src/modules/customers/backend/customers/people/page.tsx +3 -0
  384. package/src/modules/customers/commands/deals.ts +39 -0
  385. package/src/modules/customers/components/CustomerTodosTable.tsx +1 -0
  386. package/src/modules/customers/i18n/en.json +5 -1
  387. package/src/modules/customers/notifications.ts +44 -0
  388. package/src/modules/dashboards/acl.ts +1 -0
  389. package/src/modules/dashboards/api/widgets/data/route.ts +221 -0
  390. package/src/modules/dashboards/cli.ts +204 -1
  391. package/src/modules/dashboards/di.ts +9 -0
  392. package/src/modules/dashboards/i18n/de.json +115 -1
  393. package/src/modules/dashboards/i18n/en.json +115 -1
  394. package/src/modules/dashboards/i18n/es.json +115 -1
  395. package/src/modules/dashboards/i18n/pl.json +115 -1
  396. package/src/modules/dashboards/lib/__tests__/aggregations.test.ts +327 -0
  397. package/src/modules/dashboards/lib/__tests__/formatters.test.ts +128 -0
  398. package/src/modules/dashboards/lib/aggregations.ts +225 -0
  399. package/src/modules/dashboards/lib/formatters.ts +36 -0
  400. package/src/modules/dashboards/lib/role-widgets.ts +80 -0
  401. package/src/modules/dashboards/seed/analytics.ts +405 -0
  402. package/src/modules/dashboards/services/analyticsRegistry.ts +79 -0
  403. package/src/modules/dashboards/services/widgetDataService.ts +329 -0
  404. package/src/modules/dashboards/widgets/dashboard/aov-kpi/config.ts +20 -0
  405. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.tsx +135 -0
  406. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.ts +24 -0
  407. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/config.ts +20 -0
  408. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.tsx +133 -0
  409. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.ts +24 -0
  410. package/src/modules/dashboards/widgets/dashboard/orders-by-status/config.ts +20 -0
  411. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +154 -0
  412. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.ts +24 -0
  413. package/src/modules/dashboards/widgets/dashboard/orders-kpi/config.ts +20 -0
  414. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.tsx +133 -0
  415. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.ts +24 -0
  416. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/config.ts +17 -0
  417. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.tsx +137 -0
  418. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +24 -0
  419. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/config.ts +20 -0
  420. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.tsx +135 -0
  421. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.ts +24 -0
  422. package/src/modules/dashboards/widgets/dashboard/revenue-trend/config.ts +24 -0
  423. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +220 -0
  424. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.ts +24 -0
  425. package/src/modules/dashboards/widgets/dashboard/sales-by-region/config.ts +21 -0
  426. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +131 -0
  427. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.ts +24 -0
  428. package/src/modules/dashboards/widgets/dashboard/top-customers/config.ts +21 -0
  429. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +161 -0
  430. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.ts +24 -0
  431. package/src/modules/dashboards/widgets/dashboard/top-products/config.ts +27 -0
  432. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +181 -0
  433. package/src/modules/dashboards/widgets/dashboard/top-products/widget.ts +24 -0
  434. package/src/modules/dictionaries/components/DictionaryTable.tsx +2 -0
  435. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  436. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  437. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  438. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  439. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  440. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +3 -4
  441. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  442. package/src/modules/notifications/acl.ts +7 -0
  443. package/src/modules/notifications/api/[id]/action/route.ts +75 -0
  444. package/src/modules/notifications/api/[id]/dismiss/route.ts +12 -0
  445. package/src/modules/notifications/api/[id]/read/route.ts +12 -0
  446. package/src/modules/notifications/api/[id]/restore/route.ts +53 -0
  447. package/src/modules/notifications/api/batch/route.ts +14 -0
  448. package/src/modules/notifications/api/feature/route.ts +14 -0
  449. package/src/modules/notifications/api/mark-all-read/route.ts +34 -0
  450. package/src/modules/notifications/api/openapi.ts +76 -0
  451. package/src/modules/notifications/api/role/route.ts +14 -0
  452. package/src/modules/notifications/api/route.ts +92 -0
  453. package/src/modules/notifications/api/settings/route.ts +157 -0
  454. package/src/modules/notifications/api/unread-count/route.ts +38 -0
  455. package/src/modules/notifications/backend/config/notifications/page.meta.ts +22 -0
  456. package/src/modules/notifications/backend/config/notifications/page.tsx +12 -0
  457. package/src/modules/notifications/cli.ts +18 -0
  458. package/src/modules/notifications/data/entities.ts +99 -0
  459. package/src/modules/notifications/data/validators.ts +110 -0
  460. package/src/modules/notifications/di.ts +11 -0
  461. package/src/modules/notifications/emails/NotificationEmail.tsx +98 -0
  462. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +42 -0
  463. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +231 -0
  464. package/src/modules/notifications/i18n/de.json +50 -0
  465. package/src/modules/notifications/i18n/en.json +50 -0
  466. package/src/modules/notifications/i18n/es.json +50 -0
  467. package/src/modules/notifications/i18n/pl.json +50 -0
  468. package/src/modules/notifications/index.ts +12 -0
  469. package/src/modules/notifications/lib/deliveryConfig.ts +145 -0
  470. package/src/modules/notifications/lib/events.ts +48 -0
  471. package/src/modules/notifications/lib/notificationBuilder.ts +121 -0
  472. package/src/modules/notifications/lib/notificationFactory.ts +76 -0
  473. package/src/modules/notifications/lib/notificationMapper.ts +33 -0
  474. package/src/modules/notifications/lib/notificationRecipients.ts +83 -0
  475. package/src/modules/notifications/lib/notificationService.ts +414 -0
  476. package/src/modules/notifications/lib/routeHelpers.ts +151 -0
  477. package/src/modules/notifications/lib/safeHref.ts +29 -0
  478. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +300 -0
  479. package/src/modules/notifications/migrations/Migration20260123000001.ts +73 -0
  480. package/src/modules/notifications/migrations/Migration20260126150000.ts +39 -0
  481. package/src/modules/notifications/subscribers/deliver-notification.ts +175 -0
  482. package/src/modules/notifications/workers/create-notification.worker.ts +122 -0
  483. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  484. package/src/modules/query_index/components/QueryIndexesTable.tsx +8 -2
  485. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  486. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  487. package/src/modules/sales/analytics.ts +64 -0
  488. package/src/modules/sales/backend/sales/channels/offers/page.tsx +2 -0
  489. package/src/modules/sales/backend/sales/channels/page.tsx +2 -0
  490. package/src/modules/sales/commands/documents.ts +65 -0
  491. package/src/modules/sales/commands/payments.ts +33 -0
  492. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  493. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  494. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  495. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  496. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +2 -0
  497. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +2 -0
  498. package/src/modules/sales/components/documents/PaymentsSection.tsx +2 -1
  499. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +2 -0
  500. package/src/modules/sales/i18n/de.json +20 -0
  501. package/src/modules/sales/i18n/en.json +25 -1
  502. package/src/modules/sales/i18n/es.json +20 -0
  503. package/src/modules/sales/i18n/pl.json +20 -0
  504. package/src/modules/sales/notifications.client.ts +65 -0
  505. package/src/modules/sales/notifications.ts +82 -0
  506. package/src/modules/sales/subscribers/quote-expiring-notification.ts +53 -0
  507. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +156 -0
  508. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +156 -0
  509. package/src/modules/sales/widgets/notifications/index.ts +2 -0
  510. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +81 -0
  511. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  512. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  513. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  514. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  515. package/src/modules/staff/commands/leave-requests.ts +94 -0
  516. package/src/modules/staff/i18n/de.json +4 -0
  517. package/src/modules/staff/i18n/en.json +9 -1
  518. package/src/modules/staff/i18n/es.json +4 -0
  519. package/src/modules/staff/i18n/pl.json +4 -0
  520. package/src/modules/staff/notifications.ts +71 -0
  521. package/src/modules/workflows/backend/definitions/page.tsx +5 -0
  522. package/src/modules/workflows/backend/instances/page.tsx +4 -1
  523. package/src/modules/workflows/backend/tasks/page.tsx +4 -1
  524. package/src/modules/workflows/i18n/en.json +3 -1
  525. package/src/modules/workflows/notifications.ts +25 -0
  526. package/src/modules/workflows/subscribers/task-assigned-notification.ts +53 -0
@@ -0,0 +1,221 @@
1
+ import { NextResponse } from 'next/server'
2
+ import { z } from 'zod'
3
+ import type { EntityManager } from '@mikro-orm/postgresql'
4
+ import type { CacheStrategy } from '@open-mercato/cache'
5
+ import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
6
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
7
+ import { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'
8
+ import {
9
+ createWidgetDataService,
10
+ type WidgetDataRequest,
11
+ WidgetDataValidationError,
12
+ } from '../../../services/widgetDataService'
13
+ import type { AnalyticsRegistry } from '../../../services/analyticsRegistry'
14
+ import type { OpenApiMethodDoc, OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
15
+ import { dashboardsTag, dashboardsErrorSchema } from '../../openapi'
16
+
17
+ export const metadata = {
18
+ POST: { requireAuth: true, requireFeatures: ['analytics.view'] },
19
+ }
20
+
21
+ const aggregateFunctionSchema = z.enum(['count', 'sum', 'avg', 'min', 'max'])
22
+ const dateGranularitySchema = z.enum(['day', 'week', 'month', 'quarter', 'year'])
23
+ const dateRangePresetSchema = z.enum([
24
+ 'today',
25
+ 'yesterday',
26
+ 'this_week',
27
+ 'last_week',
28
+ 'this_month',
29
+ 'last_month',
30
+ 'this_quarter',
31
+ 'last_quarter',
32
+ 'this_year',
33
+ 'last_year',
34
+ 'last_7_days',
35
+ 'last_30_days',
36
+ 'last_90_days',
37
+ ])
38
+
39
+ const filterOperatorSchema = z.enum([
40
+ 'eq',
41
+ 'neq',
42
+ 'gt',
43
+ 'gte',
44
+ 'lt',
45
+ 'lte',
46
+ 'in',
47
+ 'not_in',
48
+ 'is_null',
49
+ 'is_not_null',
50
+ ])
51
+
52
+ const widgetDataRequestSchema = z.object({
53
+ entityType: z.string().min(1),
54
+ metric: z.object({
55
+ field: z.string().min(1),
56
+ aggregate: aggregateFunctionSchema,
57
+ }),
58
+ groupBy: z
59
+ .object({
60
+ field: z.string().min(1),
61
+ granularity: dateGranularitySchema.optional(),
62
+ limit: z.number().int().min(1).max(100).optional(),
63
+ resolveLabels: z.boolean().optional(),
64
+ })
65
+ .optional(),
66
+ filters: z
67
+ .array(
68
+ z.object({
69
+ field: z.string().min(1),
70
+ operator: filterOperatorSchema,
71
+ value: z.unknown().optional(),
72
+ }),
73
+ )
74
+ .optional(),
75
+ dateRange: z
76
+ .object({
77
+ field: z.string().min(1),
78
+ preset: dateRangePresetSchema,
79
+ })
80
+ .optional(),
81
+ comparison: z
82
+ .object({
83
+ type: z.enum(['previous_period', 'previous_year']),
84
+ })
85
+ .optional(),
86
+ })
87
+
88
+ const widgetDataItemSchema = z.object({
89
+ groupKey: z.unknown(),
90
+ groupLabel: z.string().optional(),
91
+ value: z.number().nullable(),
92
+ })
93
+
94
+ const widgetDataResponseSchema = z.object({
95
+ value: z.number().nullable(),
96
+ data: z.array(widgetDataItemSchema),
97
+ comparison: z
98
+ .object({
99
+ value: z.number().nullable(),
100
+ change: z.number(),
101
+ direction: z.enum(['up', 'down', 'unchanged']),
102
+ })
103
+ .optional(),
104
+ metadata: z.object({
105
+ fetchedAt: z.string(),
106
+ recordCount: z.number(),
107
+ }),
108
+ })
109
+
110
+ export async function POST(req: Request) {
111
+ const auth = await getAuthFromRequest(req)
112
+ if (!auth) {
113
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
114
+ }
115
+
116
+ let body: unknown
117
+ try {
118
+ body = await req.json()
119
+ } catch {
120
+ return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 })
121
+ }
122
+
123
+ const parsed = widgetDataRequestSchema.safeParse(body)
124
+ if (!parsed.success) {
125
+ return NextResponse.json(
126
+ { error: 'Invalid request payload', issues: parsed.error.issues },
127
+ { status: 400 },
128
+ )
129
+ }
130
+
131
+ const container = await createRequestContainer()
132
+ const analyticsRegistry = container.resolve<AnalyticsRegistry>('analyticsRegistry')
133
+
134
+ const entityFeatures = analyticsRegistry.getRequiredFeatures(parsed.data.entityType)
135
+ if (entityFeatures && entityFeatures.length > 0) {
136
+ const rbacService = container.resolve<{
137
+ userHasAllFeatures: (
138
+ userId: string,
139
+ features: string[],
140
+ scope: { tenantId: string; organizationId?: string | null },
141
+ ) => Promise<boolean>
142
+ }>('rbacService')
143
+ const hasAccess = await rbacService.userHasAllFeatures(auth.sub, entityFeatures, {
144
+ tenantId: auth.tenantId!,
145
+ organizationId: auth.orgId,
146
+ })
147
+ if (!hasAccess) {
148
+ return NextResponse.json({ error: 'Forbidden' }, { status: 403 })
149
+ }
150
+ }
151
+
152
+ const em = (container.resolve('em') as EntityManager).fork({
153
+ clear: true,
154
+ freshEventManager: true,
155
+ useContext: true,
156
+ })
157
+
158
+ const tenantId = auth.tenantId ?? null
159
+ if (!tenantId) {
160
+ return NextResponse.json({ error: 'Tenant context is required' }, { status: 400 })
161
+ }
162
+
163
+ const scope = await resolveOrganizationScopeForRequest({ container, auth, request: req })
164
+
165
+ const organizationIds = (() => {
166
+ if (scope?.selectedId) return [scope.selectedId]
167
+ if (Array.isArray(scope?.filterIds) && scope.filterIds.length > 0) return scope.filterIds
168
+ if (scope?.allowedIds === null) return undefined
169
+ if (auth.orgId) return [auth.orgId]
170
+ return undefined
171
+ })()
172
+
173
+ try {
174
+ const cache = container.resolve<CacheStrategy>('cache')
175
+ const service = createWidgetDataService(em, { tenantId, organizationIds }, analyticsRegistry, cache)
176
+ const result = await service.fetchWidgetData(parsed.data as WidgetDataRequest)
177
+ return NextResponse.json(result)
178
+ } catch (err) {
179
+ console.error('[widgets/data] Error:', err)
180
+ if (err instanceof WidgetDataValidationError) {
181
+ return NextResponse.json({ error: err.message }, { status: 400 })
182
+ }
183
+ return NextResponse.json(
184
+ { error: 'An error occurred while processing your request' },
185
+ { status: 500 },
186
+ )
187
+ }
188
+ }
189
+
190
+ const widgetDataPostDoc: OpenApiMethodDoc = {
191
+ summary: 'Fetch aggregated data for dashboard widgets',
192
+ description:
193
+ 'Executes an aggregation query against the specified entity type and returns the result. Supports date range filtering, grouping, and period-over-period comparison.',
194
+ tags: [dashboardsTag],
195
+ requestBody: {
196
+ contentType: 'application/json',
197
+ schema: widgetDataRequestSchema,
198
+ description: 'Widget data request configuration specifying entity type, metric, filters, and grouping.',
199
+ },
200
+ responses: [
201
+ {
202
+ status: 200,
203
+ description: 'Aggregated data for the widget.',
204
+ schema: widgetDataResponseSchema,
205
+ },
206
+ ],
207
+ errors: [
208
+ { status: 400, description: 'Invalid request payload', schema: dashboardsErrorSchema },
209
+ { status: 401, description: 'Authentication required', schema: dashboardsErrorSchema },
210
+ { status: 403, description: 'Missing analytics.view feature', schema: dashboardsErrorSchema },
211
+ { status: 500, description: 'Internal server error', schema: dashboardsErrorSchema },
212
+ ],
213
+ }
214
+
215
+ export const openApi: OpenApiRouteDoc = {
216
+ tag: dashboardsTag,
217
+ summary: 'Widget data aggregation endpoint',
218
+ methods: {
219
+ POST: widgetDataPostDoc,
220
+ },
221
+ }
@@ -4,6 +4,8 @@ import type { EntityManager } from '@mikro-orm/postgresql'
4
4
  import { DashboardRoleWidgets } from '@open-mercato/core/modules/dashboards/data/entities'
5
5
  import { Role } from '@open-mercato/core/modules/auth/data/entities'
6
6
  import { loadAllWidgets } from '@open-mercato/core/modules/dashboards/lib/widgets'
7
+ import { appendWidgetsToRoles, resolveAnalyticsWidgetIds } from '@open-mercato/core/modules/dashboards/lib/role-widgets'
8
+ import { seedAnalyticsData } from './seed/analytics'
7
9
 
8
10
  type Args = Record<string, string>
9
11
 
@@ -119,4 +121,205 @@ const seedDefaults: ModuleCli = {
119
121
  },
120
122
  }
121
123
 
122
- export default [seedDefaults]
124
+ const enableAnalyticsWidgets: ModuleCli = {
125
+ command: 'enable-analytics-widgets',
126
+ async run(rest) {
127
+ const args = parseArgs(rest)
128
+ const tenantId = args.tenant || args.tenantId || null
129
+ const organizationId = args.organization || args.organizationId || args.org || null
130
+ const roleCsv = args.roles || 'admin,employee'
131
+ if (!tenantId) {
132
+ console.error('Usage: mercato dashboards enable-analytics-widgets --tenant <tenantId> [--org <orgId>] [--roles admin,employee]')
133
+ return
134
+ }
135
+
136
+ const roleNames = roleCsv
137
+ .split(',')
138
+ .map((name) => name.trim())
139
+ .filter(Boolean)
140
+
141
+ if (!roleNames.length) {
142
+ console.log('No roles provided, nothing to update.')
143
+ return
144
+ }
145
+
146
+ const { resolve } = await createRequestContainer()
147
+ const em = resolve('em') as EntityManager
148
+ const widgetIds = await resolveAnalyticsWidgetIds()
149
+
150
+ const updated = await appendWidgetsToRoles(em, {
151
+ tenantId,
152
+ organizationId,
153
+ roleNames,
154
+ widgetIds,
155
+ })
156
+
157
+ if (!updated) {
158
+ console.log('No dashboard role widgets updated.')
159
+ }
160
+ },
161
+ }
162
+
163
+ const seedAnalytics: ModuleCli = {
164
+ command: 'seed-analytics',
165
+ async run(rest) {
166
+ const args = parseArgs(rest)
167
+ const tenantId = args.tenant || args.tenantId || null
168
+ const organizationId = args.organization || args.organizationId || args.org || null
169
+ const months = args.months ? parseInt(args.months, 10) : 6
170
+ const ordersPerMonth = args.ordersPerMonth ? parseInt(args.ordersPerMonth, 10) : 50
171
+
172
+ if (!tenantId || !organizationId) {
173
+ console.error('Usage: mercato dashboards seed-analytics --tenant <tenantId> --organization <organizationId> [--months 6] [--ordersPerMonth 50]')
174
+ return
175
+ }
176
+
177
+ const { resolve } = await createRequestContainer()
178
+ const em = resolve('em') as EntityManager
179
+
180
+ console.log(`Seeding analytics data for ${months} months with ~${ordersPerMonth} orders/month...`)
181
+
182
+ try {
183
+ const result = await em.transactional(async (tem) =>
184
+ seedAnalyticsData(tem, { tenantId, organizationId }, { months, ordersPerMonth })
185
+ )
186
+
187
+ if (result.orders === 0) {
188
+ console.log('Analytics data already exists. Skipping seed.')
189
+ } else {
190
+ console.log(`Seeded analytics data:`)
191
+ console.log(` - Orders: ${result.orders}`)
192
+ console.log(` - Customers: ${result.customers}`)
193
+ console.log(` - Products: ${result.products}`)
194
+ console.log(` - Deals: ${result.deals}`)
195
+ }
196
+ } catch (error) {
197
+ console.error('Failed to seed analytics data:', error)
198
+ }
199
+ },
200
+ }
201
+
202
+ const debugAnalytics: ModuleCli = {
203
+ command: 'debug-analytics',
204
+ async run(rest) {
205
+ const args = parseArgs(rest)
206
+ const tenantId = args.tenant || args.tenantId || null
207
+ const organizationId = args.organization || args.organizationId || args.org || null
208
+
209
+ if (!tenantId) {
210
+ console.error('Usage: mercato dashboards debug-analytics --tenant <tenantId> [--organization <organizationId>]')
211
+ return
212
+ }
213
+
214
+ const { resolve } = await createRequestContainer()
215
+ const em = resolve('em') as EntityManager
216
+ const conn = em.getConnection()
217
+
218
+ console.log('Checking analytics data...\n')
219
+
220
+ const ordersResult = await conn.execute(
221
+ `SELECT COUNT(*) as total, MIN(placed_at) as earliest, MAX(placed_at) as latest
222
+ FROM sales_orders
223
+ WHERE tenant_id = ? AND order_number LIKE 'SO-ANALYTICS-%'`,
224
+ [tenantId]
225
+ )
226
+ console.log('Orders summary:', ordersResult[0])
227
+
228
+ const recentOrders = await conn.execute(
229
+ `SELECT order_number, placed_at, status, grand_total_gross_amount::numeric as total
230
+ FROM sales_orders
231
+ WHERE tenant_id = ? AND order_number LIKE 'SO-ANALYTICS-%'
232
+ ORDER BY placed_at DESC LIMIT 5`,
233
+ [tenantId]
234
+ )
235
+ console.log('\nRecent orders:', recentOrders)
236
+
237
+ const januaryOrders = await conn.execute(
238
+ `SELECT COUNT(*) as count, SUM(grand_total_gross_amount::numeric) as total
239
+ FROM sales_orders
240
+ WHERE tenant_id = ?
241
+ AND order_number LIKE 'SO-ANALYTICS-%'
242
+ AND placed_at >= '2026-01-01'
243
+ AND placed_at <= '2026-01-31 23:59:59'`,
244
+ [tenantId]
245
+ )
246
+ console.log('\nJanuary 2026 orders:', januaryOrders[0])
247
+
248
+ const allOrders = await conn.execute(
249
+ `SELECT COUNT(*) as count
250
+ FROM sales_orders
251
+ WHERE tenant_id = ?`,
252
+ [tenantId]
253
+ )
254
+ console.log('\nTotal orders in tenant:', allOrders[0])
255
+
256
+ const orgCheck = await conn.execute(
257
+ `SELECT organization_id, COUNT(*) as count
258
+ FROM sales_orders
259
+ WHERE tenant_id = ? AND order_number LIKE 'SO-ANALYTICS-%'
260
+ GROUP BY organization_id`,
261
+ [tenantId]
262
+ )
263
+ console.log('\nOrders by organization:', orgCheck)
264
+
265
+ if (organizationId) {
266
+ const orgOrders = await conn.execute(
267
+ `SELECT COUNT(*) as count, SUM(grand_total_gross_amount::numeric) as total
268
+ FROM sales_orders
269
+ WHERE tenant_id = ?
270
+ AND organization_id = ?
271
+ AND placed_at >= '2026-01-01'
272
+ AND placed_at <= '2026-01-31 23:59:59'`,
273
+ [tenantId, organizationId]
274
+ )
275
+ console.log(`\nJanuary orders for org ${organizationId}:`, orgOrders[0])
276
+ }
277
+
278
+ // Check for NULL placed_at
279
+ const nullPlacedAt = await conn.execute(
280
+ `SELECT COUNT(*) as count
281
+ FROM sales_orders
282
+ WHERE tenant_id = ? AND placed_at IS NULL`,
283
+ [tenantId]
284
+ )
285
+ console.log('\nOrders with NULL placed_at:', nullPlacedAt[0])
286
+
287
+ // Check non-analytics orders
288
+ const nonAnalytics = await conn.execute(
289
+ `SELECT order_number, placed_at, status, organization_id, grand_total_gross_amount::numeric as total
290
+ FROM sales_orders
291
+ WHERE tenant_id = ? AND order_number NOT LIKE 'SO-ANALYTICS-%'
292
+ ORDER BY placed_at DESC NULLS LAST LIMIT 10`,
293
+ [tenantId]
294
+ )
295
+ console.log('\nNon-analytics orders:', nonAnalytics)
296
+
297
+ // Simulate widget query
298
+ console.log('\n--- Simulating widget query for this_month ---')
299
+ const widgetQuery = await conn.execute(
300
+ `SELECT COALESCE(SUM(grand_total_gross_amount::numeric), 0) AS value
301
+ FROM sales_orders
302
+ WHERE tenant_id = ?
303
+ AND organization_id = ANY(?::uuid[])
304
+ AND deleted_at IS NULL
305
+ AND placed_at >= '2026-01-01'
306
+ AND placed_at <= '2026-01-31 23:59:59'`,
307
+ [tenantId, `{${organizationId}}`]
308
+ )
309
+ console.log('Widget query result (revenue sum):', widgetQuery[0])
310
+
311
+ const widgetCountQuery = await conn.execute(
312
+ `SELECT COUNT(*) AS value
313
+ FROM sales_orders
314
+ WHERE tenant_id = ?
315
+ AND organization_id = ANY(?::uuid[])
316
+ AND deleted_at IS NULL
317
+ AND placed_at >= '2026-01-01'
318
+ AND placed_at <= '2026-01-31 23:59:59'`,
319
+ [tenantId, `{${organizationId}}`]
320
+ )
321
+ console.log('Widget query result (order count):', widgetCountQuery[0])
322
+ },
323
+ }
324
+
325
+ export default [seedDefaults, enableAnalyticsWidgets, seedAnalytics, debugAnalytics]
@@ -0,0 +1,9 @@
1
+ import { asFunction } from 'awilix'
2
+ import type { AppContainer } from '@open-mercato/shared/lib/di/container'
3
+ import { createAnalyticsRegistry } from './services/analyticsRegistry'
4
+
5
+ export function register(container: AppContainer): void {
6
+ container.register({
7
+ analyticsRegistry: asFunction(() => createAnalyticsRegistry()).singleton(),
8
+ })
9
+ }
@@ -5,5 +5,119 @@
5
5
  "dashboards.widgets.flash.saved": "Dashboard-Widgets aktualisiert",
6
6
  "dashboards.widgets.mode.inherit": "Von Rollen übernehmen",
7
7
  "dashboards.widgets.mode.override": "Für diesen Benutzer überschreiben",
8
- "dashboards.widgets.mode.hint": "Dieser Benutzer erbt derzeit Widgets von seinen Rollen. Wechseln Sie zu \"Überschreiben\", um anzupassen."
8
+ "dashboards.widgets.mode.hint": "Dieser Benutzer erbt derzeit Widgets von seinen Rollen. Wechseln Sie zu \"Überschreiben\", um anzupassen.",
9
+
10
+ "dashboards.analytics.dateRange.today": "Heute",
11
+ "dashboards.analytics.dateRange.yesterday": "Gestern",
12
+ "dashboards.analytics.dateRange.thisWeek": "Diese Woche",
13
+ "dashboards.analytics.dateRange.lastWeek": "Letzte Woche",
14
+ "dashboards.analytics.dateRange.thisMonth": "Dieser Monat",
15
+ "dashboards.analytics.dateRange.lastMonth": "Letzter Monat",
16
+ "dashboards.analytics.dateRange.thisQuarter": "Dieses Quartal",
17
+ "dashboards.analytics.dateRange.lastQuarter": "Letztes Quartal",
18
+ "dashboards.analytics.dateRange.thisYear": "Dieses Jahr",
19
+ "dashboards.analytics.dateRange.lastYear": "Letztes Jahr",
20
+ "dashboards.analytics.dateRange.last7Days": "Letzte 7 Tage",
21
+ "dashboards.analytics.dateRange.last30Days": "Letzte 30 Tage",
22
+ "dashboards.analytics.dateRange.last90Days": "Letzte 90 Tage",
23
+
24
+ "dashboards.analytics.granularity.day": "Tag",
25
+ "dashboards.analytics.granularity.week": "Woche",
26
+ "dashboards.analytics.granularity.month": "Monat",
27
+ "dashboards.analytics.granularity.quarter": "Quartal",
28
+ "dashboards.analytics.granularity.year": "Jahr",
29
+ "dashboards.analytics.granularity.short.day": "T",
30
+ "dashboards.analytics.granularity.short.week": "W",
31
+ "dashboards.analytics.granularity.short.month": "M",
32
+ "dashboards.analytics.granularity.short.quarter": "Q",
33
+ "dashboards.analytics.granularity.short.year": "J",
34
+
35
+ "dashboards.analytics.chartVariant.pie": "Kreis",
36
+ "dashboards.analytics.chartVariant.donut": "Ring",
37
+
38
+ "dashboards.analytics.comparison.vsYesterday": "vs gestern",
39
+ "dashboards.analytics.comparison.vsDayBefore": "vs vorgestern",
40
+ "dashboards.analytics.comparison.vsLastWeek": "vs letzte Woche",
41
+ "dashboards.analytics.comparison.vsWeekBefore": "vs Woche davor",
42
+ "dashboards.analytics.comparison.vsLastMonth": "vs letzter Monat",
43
+ "dashboards.analytics.comparison.vsMonthBefore": "vs Monat davor",
44
+ "dashboards.analytics.comparison.vsLastQuarter": "vs letztes Quartal",
45
+ "dashboards.analytics.comparison.vsQuarterBefore": "vs Quartal davor",
46
+ "dashboards.analytics.comparison.vsLastYear": "vs letztes Jahr",
47
+ "dashboards.analytics.comparison.vsYearBefore": "vs Jahr davor",
48
+ "dashboards.analytics.comparison.vsPrevious7Days": "vs vorherige 7 Tage",
49
+ "dashboards.analytics.comparison.vsPrevious30Days": "vs vorherige 30 Tage",
50
+ "dashboards.analytics.comparison.vsPrevious90Days": "vs vorherige 90 Tage",
51
+ "dashboards.analytics.comparison.vsPreviousPeriod": "vs vorheriger Zeitraum",
52
+
53
+ "dashboards.analytics.settings.dateRange": "Zeitraum",
54
+ "dashboards.analytics.settings.showComparison": "Vergleich anzeigen",
55
+ "dashboards.analytics.settings.granularity": "Granularität",
56
+ "dashboards.analytics.settings.showArea": "Flächenfüllung anzeigen",
57
+ "dashboards.analytics.settings.limit": "Anzahl der Elemente",
58
+ "dashboards.analytics.settings.chartVariant": "Diagrammstil",
59
+ "dashboards.analytics.settings.chartLayout": "Diagramm-Layout",
60
+ "dashboards.analytics.settings.horizontal": "Horizontal",
61
+ "dashboards.analytics.settings.vertical": "Vertikal",
62
+
63
+ "dashboards.analytics.widgets.revenueKpi.title": "Umsatz",
64
+ "dashboards.analytics.widgets.revenueKpi.description": "Gesamtumsatz mit Periodenvergleich",
65
+ "dashboards.analytics.widgets.revenueKpi.error": "Umsatzdaten konnten nicht geladen werden",
66
+
67
+ "dashboards.analytics.widgets.ordersKpi.title": "Bestellungen",
68
+ "dashboards.analytics.widgets.ordersKpi.description": "Gesamtbestellungen mit Periodenvergleich",
69
+ "dashboards.analytics.widgets.ordersKpi.error": "Bestelldaten konnten nicht geladen werden",
70
+
71
+ "dashboards.analytics.widgets.aovKpi.title": "Durchschnittlicher Bestellwert",
72
+ "dashboards.analytics.widgets.aovKpi.description": "Durchschnittlicher Bestellwert mit Periodenvergleich",
73
+ "dashboards.analytics.widgets.aovKpi.error": "AOV-Daten konnten nicht geladen werden",
74
+
75
+ "dashboards.analytics.widgets.newCustomersKpi.title": "Kundenwachstum",
76
+ "dashboards.analytics.widgets.newCustomersKpi.description": "Anzahl neuer Kunden mit Periodenvergleich",
77
+ "dashboards.analytics.widgets.newCustomersKpi.error": "Daten zu neuen Kunden konnten nicht geladen werden",
78
+
79
+ "dashboards.analytics.widgets.revenueTrend.title": "Umsatztrend",
80
+ "dashboards.analytics.widgets.revenueTrend.description": "Umsatz im Zeitverlauf mit anpassbarer Granularität",
81
+ "dashboards.analytics.widgets.revenueTrend.error": "Umsatztrenddaten konnten nicht geladen werden",
82
+ "dashboards.analytics.widgets.revenueTrend.empty": "Keine Umsatzdaten für diesen Zeitraum",
83
+
84
+ "dashboards.analytics.widgets.topProducts.title": "Top-Produkte nach Umsatz",
85
+ "dashboards.analytics.widgets.topProducts.description": "Meistverkaufte Produkte nach Umsatz",
86
+ "dashboards.analytics.widgets.topProducts.error": "Produktdaten konnten nicht geladen werden",
87
+ "dashboards.analytics.widgets.topProducts.empty": "Keine Produktverkaufsdaten für diesen Zeitraum",
88
+
89
+ "dashboards.analytics.widgets.ordersByStatus.title": "Bestellungen nach Status",
90
+ "dashboards.analytics.widgets.ordersByStatus.description": "Verteilung der Bestellungen nach Status",
91
+ "dashboards.analytics.widgets.ordersByStatus.error": "Daten zu Bestellungen nach Status konnten nicht geladen werden",
92
+ "dashboards.analytics.widgets.ordersByStatus.empty": "Keine Bestellungen für diesen Zeitraum",
93
+
94
+ "dashboards.analytics.widgets.topCustomers.title": "Top-Kunden nach Umsatz",
95
+ "dashboards.analytics.widgets.topCustomers.description": "Top-Kunden nach Gesamtumsatz",
96
+ "dashboards.analytics.widgets.topCustomers.error": "Kundendaten konnten nicht geladen werden",
97
+ "dashboards.analytics.widgets.topCustomers.empty": "Keine Kundendaten für diesen Zeitraum",
98
+ "dashboards.analytics.widgets.topCustomers.column.customer": "Kunde",
99
+ "dashboards.analytics.widgets.topCustomers.column.revenue": "Umsatz",
100
+
101
+ "dashboards.analytics.widgets.pipelineSummary.title": "Pipeline-Übersicht",
102
+ "dashboards.analytics.widgets.pipelineSummary.description": "Deal-Wert nach Pipeline-Phase",
103
+ "dashboards.analytics.widgets.pipelineSummary.error": "Pipeline-Daten konnten nicht geladen werden",
104
+ "dashboards.analytics.widgets.pipelineSummary.empty": "Keine Deal-Daten für diesen Zeitraum",
105
+
106
+ "dashboards.analytics.widgets.salesByRegion.title": "Verkäufe nach Region",
107
+ "dashboards.analytics.widgets.salesByRegion.description": "Umsatzverteilung nach Versandregion",
108
+ "dashboards.analytics.widgets.salesByRegion.error": "Daten zu Verkäufen nach Region konnten nicht geladen werden",
109
+ "dashboards.analytics.widgets.salesByRegion.empty": "Keine regionalen Verkaufsdaten für diesen Zeitraum",
110
+
111
+ "dashboards.analytics.labels.unknown": "Unbekannt",
112
+ "dashboards.analytics.labels.unknownProduct": "Unbekanntes Produkt",
113
+ "dashboards.analytics.labels.unnamedProduct": "Unbenanntes Produkt",
114
+ "dashboards.analytics.labels.value": "Wert",
115
+
116
+ "dashboards.analytics.orderStatus.draft": "Entwurf",
117
+ "dashboards.analytics.orderStatus.pending": "Ausstehend",
118
+ "dashboards.analytics.orderStatus.confirmed": "Bestätigt",
119
+ "dashboards.analytics.orderStatus.processing": "In Bearbeitung",
120
+ "dashboards.analytics.orderStatus.shipped": "Versendet",
121
+ "dashboards.analytics.orderStatus.delivered": "Geliefert",
122
+ "dashboards.analytics.orderStatus.cancelled": "Storniert"
9
123
  }