@open-mercato/core 0.4.2-canary-da2b080494 → 0.4.2-canary-19353c5970

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 (433) 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/[id]/edit/page.js +4 -1
  32. package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
  33. package/dist/modules/auth/backend/roles/page.js +3 -3
  34. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  35. package/dist/modules/auth/backend/users/[id]/edit/page.js +18 -3
  36. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  37. package/dist/modules/auth/backend/users/create/page.js +15 -2
  38. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  39. package/dist/modules/auth/backend/users/page.js +3 -3
  40. package/dist/modules/auth/backend/users/page.js.map +2 -2
  41. package/dist/modules/auth/cli.js +25 -11
  42. package/dist/modules/auth/cli.js.map +2 -2
  43. package/dist/modules/auth/commands/users.js +59 -2
  44. package/dist/modules/auth/commands/users.js.map +2 -2
  45. package/dist/modules/auth/data/validators.js +4 -2
  46. package/dist/modules/auth/data/validators.js.map +2 -2
  47. package/dist/modules/auth/frontend/reset/[token]/page.js +20 -10
  48. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  49. package/dist/modules/auth/lib/setup-app.js +23 -2
  50. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  51. package/dist/modules/auth/notifications.js +112 -0
  52. package/dist/modules/auth/notifications.js.map +7 -0
  53. package/dist/modules/auth/services/authService.js +3 -3
  54. package/dist/modules/auth/services/authService.js.map +2 -2
  55. package/dist/modules/business_rules/api/execute/route.js +7 -1
  56. package/dist/modules/business_rules/api/execute/route.js.map +2 -2
  57. package/dist/modules/business_rules/backend/rules/page.js +4 -0
  58. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  59. package/dist/modules/business_rules/backend/sets/page.js +3 -0
  60. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  61. package/dist/modules/business_rules/lib/rule-engine.js +33 -3
  62. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  63. package/dist/modules/business_rules/notifications.js +28 -0
  64. package/dist/modules/business_rules/notifications.js.map +7 -0
  65. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +37 -0
  66. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +7 -0
  67. package/dist/modules/catalog/components/PriceKindSettings.js +2 -0
  68. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  69. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  70. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  71. package/dist/modules/catalog/components/products/ProductsDataTable.js +2 -0
  72. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  73. package/dist/modules/catalog/notifications.js +28 -0
  74. package/dist/modules/catalog/notifications.js.map +7 -0
  75. package/dist/modules/catalog/subscribers/low-stock-notification.js +38 -0
  76. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +7 -0
  77. package/dist/modules/configs/cli.js +6 -0
  78. package/dist/modules/configs/cli.js.map +2 -2
  79. package/dist/modules/configs/components/CachePanel.js +4 -4
  80. package/dist/modules/configs/components/CachePanel.js.map +2 -2
  81. package/dist/modules/configs/lib/system-status.js +48 -1
  82. package/dist/modules/configs/lib/system-status.js.map +2 -2
  83. package/dist/modules/configs/lib/upgrade-actions.js +18 -0
  84. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  85. package/dist/modules/currencies/backend/currencies/page.js +3 -0
  86. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  87. package/dist/modules/currencies/backend/exchange-rates/page.js +2 -0
  88. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  89. package/dist/modules/customers/backend/customers/companies/page.js +3 -0
  90. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  91. package/dist/modules/customers/backend/customers/deals/page.js +3 -0
  92. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  93. package/dist/modules/customers/backend/customers/people/page.js +3 -0
  94. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  95. package/dist/modules/customers/commands/deals.js +31 -0
  96. package/dist/modules/customers/commands/deals.js.map +2 -2
  97. package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
  98. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  99. package/dist/modules/customers/notifications.js +48 -0
  100. package/dist/modules/customers/notifications.js.map +7 -0
  101. package/dist/modules/dashboards/cli.js +44 -5
  102. package/dist/modules/dashboards/cli.js.map +2 -2
  103. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +16 -11
  104. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
  105. package/dist/modules/dashboards/lib/role-widgets.js +58 -0
  106. package/dist/modules/dashboards/lib/role-widgets.js.map +7 -0
  107. package/dist/modules/dashboards/services/widgetDataService.js +139 -3
  108. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  109. package/dist/modules/dictionaries/components/DictionaryTable.js +2 -0
  110. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  111. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  112. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  113. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  114. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  115. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  116. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  117. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  118. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  119. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  120. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  121. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  122. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  123. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  124. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  125. package/dist/modules/notifications/acl.js +11 -0
  126. package/dist/modules/notifications/acl.js.map +7 -0
  127. package/dist/modules/notifications/api/[id]/action/route.js +74 -0
  128. package/dist/modules/notifications/api/[id]/action/route.js.map +7 -0
  129. package/dist/modules/notifications/api/[id]/dismiss/route.js +15 -0
  130. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +7 -0
  131. package/dist/modules/notifications/api/[id]/read/route.js +15 -0
  132. package/dist/modules/notifications/api/[id]/read/route.js.map +7 -0
  133. package/dist/modules/notifications/api/[id]/restore/route.js +53 -0
  134. package/dist/modules/notifications/api/[id]/restore/route.js.map +7 -0
  135. package/dist/modules/notifications/api/batch/route.js +17 -0
  136. package/dist/modules/notifications/api/batch/route.js.map +7 -0
  137. package/dist/modules/notifications/api/feature/route.js +17 -0
  138. package/dist/modules/notifications/api/feature/route.js.map +7 -0
  139. package/dist/modules/notifications/api/mark-all-read/route.js +35 -0
  140. package/dist/modules/notifications/api/mark-all-read/route.js.map +7 -0
  141. package/dist/modules/notifications/api/openapi.js +76 -0
  142. package/dist/modules/notifications/api/openapi.js.map +7 -0
  143. package/dist/modules/notifications/api/role/route.js +17 -0
  144. package/dist/modules/notifications/api/role/route.js.map +7 -0
  145. package/dist/modules/notifications/api/route.js +85 -0
  146. package/dist/modules/notifications/api/route.js.map +7 -0
  147. package/dist/modules/notifications/api/settings/route.js +155 -0
  148. package/dist/modules/notifications/api/settings/route.js.map +7 -0
  149. package/dist/modules/notifications/api/unread-count/route.js +38 -0
  150. package/dist/modules/notifications/api/unread-count/route.js.map +7 -0
  151. package/dist/modules/notifications/backend/config/notifications/page.js +10 -0
  152. package/dist/modules/notifications/backend/config/notifications/page.js.map +7 -0
  153. package/dist/modules/notifications/backend/config/notifications/page.meta.js +24 -0
  154. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +7 -0
  155. package/dist/modules/notifications/cli.js +16 -0
  156. package/dist/modules/notifications/cli.js.map +7 -0
  157. package/dist/modules/notifications/data/entities.js +112 -0
  158. package/dist/modules/notifications/data/entities.js.map +7 -0
  159. package/dist/modules/notifications/data/validators.js +98 -0
  160. package/dist/modules/notifications/data/validators.js.map +7 -0
  161. package/dist/modules/notifications/di.js +13 -0
  162. package/dist/modules/notifications/di.js.map +7 -0
  163. package/dist/modules/notifications/emails/NotificationEmail.js +58 -0
  164. package/dist/modules/notifications/emails/NotificationEmail.js.map +7 -0
  165. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +44 -0
  166. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +7 -0
  167. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +220 -0
  168. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +7 -0
  169. package/dist/modules/notifications/index.js +14 -0
  170. package/dist/modules/notifications/index.js.map +7 -0
  171. package/dist/modules/notifications/lib/deliveryConfig.js +107 -0
  172. package/dist/modules/notifications/lib/deliveryConfig.js.map +7 -0
  173. package/dist/modules/notifications/lib/deliveryStrategies.js +14 -0
  174. package/dist/modules/notifications/lib/deliveryStrategies.js.map +7 -0
  175. package/dist/modules/notifications/lib/events.js +12 -0
  176. package/dist/modules/notifications/lib/events.js.map +7 -0
  177. package/dist/modules/notifications/lib/notificationBuilder.js +66 -0
  178. package/dist/modules/notifications/lib/notificationBuilder.js.map +7 -0
  179. package/dist/modules/notifications/lib/notificationFactory.js +54 -0
  180. package/dist/modules/notifications/lib/notificationFactory.js.map +7 -0
  181. package/dist/modules/notifications/lib/notificationMapper.js +34 -0
  182. package/dist/modules/notifications/lib/notificationMapper.js.map +7 -0
  183. package/dist/modules/notifications/lib/notificationRecipients.js +35 -0
  184. package/dist/modules/notifications/lib/notificationRecipients.js.map +7 -0
  185. package/dist/modules/notifications/lib/notificationService.js +279 -0
  186. package/dist/modules/notifications/lib/notificationService.js.map +7 -0
  187. package/dist/modules/notifications/lib/routeHelpers.js +101 -0
  188. package/dist/modules/notifications/lib/routeHelpers.js.map +7 -0
  189. package/dist/modules/notifications/lib/safeHref.js +24 -0
  190. package/dist/modules/notifications/lib/safeHref.js.map +7 -0
  191. package/dist/modules/notifications/migrations/Migration20260123000001.js +70 -0
  192. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +7 -0
  193. package/dist/modules/notifications/migrations/Migration20260126150000.js +37 -0
  194. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +7 -0
  195. package/dist/modules/notifications/subscribers/deliver-notification.js +165 -0
  196. package/dist/modules/notifications/subscribers/deliver-notification.js.map +7 -0
  197. package/dist/modules/notifications/workers/create-notification.worker.js +70 -0
  198. package/dist/modules/notifications/workers/create-notification.worker.js.map +7 -0
  199. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  200. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  201. package/dist/modules/query_index/components/QueryIndexesTable.js +7 -1
  202. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  203. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  204. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  205. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  206. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  207. package/dist/modules/sales/backend/sales/channels/offers/page.js +2 -0
  208. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  209. package/dist/modules/sales/backend/sales/channels/page.js +2 -0
  210. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  211. package/dist/modules/sales/commands/documents.js +53 -0
  212. package/dist/modules/sales/commands/documents.js.map +2 -2
  213. package/dist/modules/sales/commands/payments.js +26 -0
  214. package/dist/modules/sales/commands/payments.js.map +2 -2
  215. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  216. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  217. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  218. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  219. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  220. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  221. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  222. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  223. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +2 -0
  224. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  225. package/dist/modules/sales/components/documents/AdjustmentsSection.js +2 -0
  226. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  227. package/dist/modules/sales/components/documents/PaymentsSection.js +2 -1
  228. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  229. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +2 -0
  230. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  231. package/dist/modules/sales/notifications.client.js +51 -0
  232. package/dist/modules/sales/notifications.client.js.map +7 -0
  233. package/dist/modules/sales/notifications.js +88 -0
  234. package/dist/modules/sales/notifications.js.map +7 -0
  235. package/dist/modules/sales/subscribers/quote-expiring-notification.js +38 -0
  236. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +7 -0
  237. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +137 -0
  238. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +7 -0
  239. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +137 -0
  240. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +7 -0
  241. package/dist/modules/sales/widgets/notifications/index.js +7 -0
  242. package/dist/modules/sales/widgets/notifications/index.js.map +7 -0
  243. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +60 -0
  244. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +7 -0
  245. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  246. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  247. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  248. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  249. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  250. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  251. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  252. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  253. package/dist/modules/staff/commands/leave-requests.js +79 -0
  254. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  255. package/dist/modules/staff/notifications.js +75 -0
  256. package/dist/modules/staff/notifications.js.map +7 -0
  257. package/dist/modules/workflows/backend/definitions/page.js +5 -0
  258. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  259. package/dist/modules/workflows/backend/instances/page.js +3 -0
  260. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  261. package/dist/modules/workflows/backend/tasks/page.js +3 -0
  262. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  263. package/dist/modules/workflows/lib/transition-handler.js +14 -6
  264. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  265. package/dist/modules/workflows/notifications.js +28 -0
  266. package/dist/modules/workflows/notifications.js.map +7 -0
  267. package/dist/modules/workflows/subscribers/task-assigned-notification.js +38 -0
  268. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +7 -0
  269. package/generated/entities/notification/index.ts +27 -0
  270. package/generated/entities.ids.generated.ts +5 -1
  271. package/generated/entity-fields-registry.ts +2 -0
  272. package/package.json +2 -2
  273. package/src/modules/api_docs/frontend/docs/api/page.tsx +3 -2
  274. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  275. package/src/modules/attachments/components/AttachmentLibrary.tsx +4 -0
  276. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +2 -0
  277. package/src/modules/auth/README.md +1 -1
  278. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
  279. package/src/modules/auth/api/admin/nav.ts +10 -6
  280. package/src/modules/auth/api/profile/route.ts +163 -0
  281. package/src/modules/auth/api/reset/confirm.ts +25 -2
  282. package/src/modules/auth/api/reset.ts +23 -0
  283. package/src/modules/auth/api/sidebar/preferences/route.ts +21 -12
  284. package/src/modules/auth/api/users/route.ts +5 -2
  285. package/src/modules/auth/backend/auth/profile/page.meta.ts +9 -0
  286. package/src/modules/auth/backend/auth/profile/page.tsx +174 -0
  287. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +4 -1
  288. package/src/modules/auth/backend/roles/page.tsx +3 -3
  289. package/src/modules/auth/backend/users/[id]/edit/page.tsx +22 -3
  290. package/src/modules/auth/backend/users/create/page.tsx +19 -2
  291. package/src/modules/auth/backend/users/page.tsx +3 -3
  292. package/src/modules/auth/cli.ts +38 -11
  293. package/src/modules/auth/commands/users.ts +73 -2
  294. package/src/modules/auth/data/validators.ts +5 -2
  295. package/src/modules/auth/frontend/reset/[token]/page.tsx +24 -11
  296. package/src/modules/auth/i18n/de.json +43 -1
  297. package/src/modules/auth/i18n/en.json +43 -1
  298. package/src/modules/auth/i18n/es.json +43 -1
  299. package/src/modules/auth/i18n/pl.json +43 -1
  300. package/src/modules/auth/lib/setup-app.ts +29 -2
  301. package/src/modules/auth/notifications.ts +109 -0
  302. package/src/modules/auth/services/authService.ts +4 -4
  303. package/src/modules/business_rules/api/execute/route.ts +8 -1
  304. package/src/modules/business_rules/backend/rules/page.tsx +4 -0
  305. package/src/modules/business_rules/backend/sets/page.tsx +3 -0
  306. package/src/modules/business_rules/i18n/en.json +3 -1
  307. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +51 -0
  308. package/src/modules/business_rules/lib/rule-engine.ts +57 -3
  309. package/src/modules/business_rules/notifications.ts +25 -0
  310. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +50 -0
  311. package/src/modules/catalog/components/PriceKindSettings.tsx +2 -0
  312. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  313. package/src/modules/catalog/components/products/ProductsDataTable.tsx +2 -0
  314. package/src/modules/catalog/i18n/en.json +3 -1
  315. package/src/modules/catalog/notifications.ts +25 -0
  316. package/src/modules/catalog/subscribers/low-stock-notification.ts +52 -0
  317. package/src/modules/configs/cli.ts +6 -0
  318. package/src/modules/configs/components/CachePanel.tsx +4 -4
  319. package/src/modules/configs/i18n/en.json +12 -2
  320. package/src/modules/configs/i18n/pl.json +12 -2
  321. package/src/modules/configs/lib/system-status.ts +48 -1
  322. package/src/modules/configs/lib/system-status.types.ts +1 -0
  323. package/src/modules/configs/lib/upgrade-actions.ts +18 -0
  324. package/src/modules/currencies/backend/currencies/page.tsx +3 -0
  325. package/src/modules/currencies/backend/exchange-rates/page.tsx +2 -0
  326. package/src/modules/customers/backend/customers/companies/page.tsx +3 -0
  327. package/src/modules/customers/backend/customers/deals/page.tsx +3 -0
  328. package/src/modules/customers/backend/customers/people/page.tsx +3 -0
  329. package/src/modules/customers/commands/deals.ts +39 -0
  330. package/src/modules/customers/components/CustomerTodosTable.tsx +1 -0
  331. package/src/modules/customers/i18n/en.json +5 -1
  332. package/src/modules/customers/notifications.ts +44 -0
  333. package/src/modules/dashboards/cli.ts +55 -5
  334. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +22 -11
  335. package/src/modules/dashboards/lib/role-widgets.ts +80 -0
  336. package/src/modules/dashboards/services/widgetDataService.ts +164 -4
  337. package/src/modules/dictionaries/components/DictionaryTable.tsx +2 -0
  338. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  339. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  340. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  341. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  342. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  343. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +3 -4
  344. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  345. package/src/modules/notifications/__tests__/deliver-notification.test.ts +195 -0
  346. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +19 -0
  347. package/src/modules/notifications/__tests__/notificationService.test.ts +208 -0
  348. package/src/modules/notifications/acl.ts +7 -0
  349. package/src/modules/notifications/api/[id]/action/route.ts +75 -0
  350. package/src/modules/notifications/api/[id]/dismiss/route.ts +12 -0
  351. package/src/modules/notifications/api/[id]/read/route.ts +12 -0
  352. package/src/modules/notifications/api/[id]/restore/route.ts +53 -0
  353. package/src/modules/notifications/api/batch/route.ts +14 -0
  354. package/src/modules/notifications/api/feature/route.ts +14 -0
  355. package/src/modules/notifications/api/mark-all-read/route.ts +34 -0
  356. package/src/modules/notifications/api/openapi.ts +76 -0
  357. package/src/modules/notifications/api/role/route.ts +14 -0
  358. package/src/modules/notifications/api/route.ts +92 -0
  359. package/src/modules/notifications/api/settings/route.ts +157 -0
  360. package/src/modules/notifications/api/unread-count/route.ts +38 -0
  361. package/src/modules/notifications/backend/config/notifications/page.meta.ts +22 -0
  362. package/src/modules/notifications/backend/config/notifications/page.tsx +12 -0
  363. package/src/modules/notifications/cli.ts +18 -0
  364. package/src/modules/notifications/data/entities.ts +99 -0
  365. package/src/modules/notifications/data/validators.ts +115 -0
  366. package/src/modules/notifications/di.ts +11 -0
  367. package/src/modules/notifications/emails/NotificationEmail.tsx +98 -0
  368. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +42 -0
  369. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +233 -0
  370. package/src/modules/notifications/i18n/de.json +50 -0
  371. package/src/modules/notifications/i18n/en.json +50 -0
  372. package/src/modules/notifications/i18n/es.json +50 -0
  373. package/src/modules/notifications/i18n/pl.json +50 -0
  374. package/src/modules/notifications/index.ts +12 -0
  375. package/src/modules/notifications/lib/deliveryConfig.ts +153 -0
  376. package/src/modules/notifications/lib/deliveryStrategies.ts +50 -0
  377. package/src/modules/notifications/lib/events.ts +48 -0
  378. package/src/modules/notifications/lib/notificationBuilder.ts +121 -0
  379. package/src/modules/notifications/lib/notificationFactory.ts +76 -0
  380. package/src/modules/notifications/lib/notificationMapper.ts +33 -0
  381. package/src/modules/notifications/lib/notificationRecipients.ts +83 -0
  382. package/src/modules/notifications/lib/notificationService.ts +414 -0
  383. package/src/modules/notifications/lib/routeHelpers.ts +151 -0
  384. package/src/modules/notifications/lib/safeHref.ts +29 -0
  385. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +300 -0
  386. package/src/modules/notifications/migrations/Migration20260123000001.ts +73 -0
  387. package/src/modules/notifications/migrations/Migration20260126150000.ts +39 -0
  388. package/src/modules/notifications/subscribers/deliver-notification.ts +204 -0
  389. package/src/modules/notifications/workers/create-notification.worker.ts +122 -0
  390. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  391. package/src/modules/query_index/components/QueryIndexesTable.tsx +8 -2
  392. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  393. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  394. package/src/modules/sales/backend/sales/channels/offers/page.tsx +2 -0
  395. package/src/modules/sales/backend/sales/channels/page.tsx +2 -0
  396. package/src/modules/sales/commands/documents.ts +65 -0
  397. package/src/modules/sales/commands/payments.ts +33 -0
  398. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  399. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  400. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  401. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  402. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +2 -0
  403. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +2 -0
  404. package/src/modules/sales/components/documents/PaymentsSection.tsx +2 -1
  405. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +2 -0
  406. package/src/modules/sales/i18n/de.json +20 -0
  407. package/src/modules/sales/i18n/en.json +25 -1
  408. package/src/modules/sales/i18n/es.json +20 -0
  409. package/src/modules/sales/i18n/pl.json +20 -0
  410. package/src/modules/sales/notifications.client.ts +65 -0
  411. package/src/modules/sales/notifications.ts +82 -0
  412. package/src/modules/sales/subscribers/quote-expiring-notification.ts +53 -0
  413. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +156 -0
  414. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +156 -0
  415. package/src/modules/sales/widgets/notifications/index.ts +2 -0
  416. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +81 -0
  417. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  418. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  419. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  420. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  421. package/src/modules/staff/commands/leave-requests.ts +94 -0
  422. package/src/modules/staff/i18n/de.json +4 -0
  423. package/src/modules/staff/i18n/en.json +9 -1
  424. package/src/modules/staff/i18n/es.json +4 -0
  425. package/src/modules/staff/i18n/pl.json +4 -0
  426. package/src/modules/staff/notifications.ts +71 -0
  427. package/src/modules/workflows/backend/definitions/page.tsx +5 -0
  428. package/src/modules/workflows/backend/instances/page.tsx +4 -1
  429. package/src/modules/workflows/backend/tasks/page.tsx +4 -1
  430. package/src/modules/workflows/i18n/en.json +3 -1
  431. package/src/modules/workflows/lib/transition-handler.ts +18 -6
  432. package/src/modules/workflows/notifications.ts +25 -0
  433. package/src/modules/workflows/subscribers/task-assigned-notification.ts +53 -0
@@ -21,6 +21,9 @@ import {
21
21
  } from '../data/validators'
22
22
  import { ensureOrganizationScope, ensureTenantScope, extractUndoPayload, requireTeamMember } from './shared'
23
23
  import { E } from '#generated/entities.ids.generated'
24
+ import { resolveNotificationService } from '../../notifications/lib/notificationService'
25
+ import { buildFeatureNotificationFromType, buildNotificationFromType } from '../../notifications/lib/notificationBuilder'
26
+ import { notificationTypes } from '../notifications'
24
27
 
25
28
  const leaveRequestCrudIndexer: CrudIndexerConfig<StaffLeaveRequest> = {
26
29
  entityType: E.staff.staff_leave_request,
@@ -258,6 +261,36 @@ const createLeaveRequestCommand: CommandHandler<StaffLeaveRequestCreateInput, {
258
261
  indexer: leaveRequestCrudIndexer,
259
262
  })
260
263
 
264
+ // Create notification for users who can approve/reject leave requests
265
+ try {
266
+ const notificationService = resolveNotificationService(ctx.container)
267
+ const typeDef = notificationTypes.find((type) => type.type === 'staff.leave_request.pending')
268
+ if (typeDef) {
269
+ const memberName = member.displayName || 'Team member'
270
+ const startDateStr = request.startDate.toLocaleDateString()
271
+ const endDateStr = request.endDate.toLocaleDateString()
272
+
273
+ const notificationInput = buildFeatureNotificationFromType(typeDef, {
274
+ requiredFeature: 'staff.leave_requests.manage',
275
+ bodyVariables: {
276
+ memberName,
277
+ startDate: startDateStr,
278
+ endDate: endDateStr,
279
+ },
280
+ sourceEntityType: 'staff:leave_request',
281
+ sourceEntityId: request.id,
282
+ linkHref: `/backend/staff/leave-requests/${request.id}`,
283
+ })
284
+
285
+ await notificationService.createForFeature(notificationInput, {
286
+ tenantId: request.tenantId,
287
+ organizationId: request.organizationId,
288
+ })
289
+ }
290
+ } catch {
291
+ // Notification creation is non-critical, don't fail the command
292
+ }
293
+
261
294
  return { requestId: request.id }
262
295
  },
263
296
  captureAfter: async (_input, result, ctx) => {
@@ -575,6 +608,36 @@ const acceptLeaveRequestCommand: CommandHandler<StaffLeaveRequestDecisionInput,
575
608
  ruleIds: createdRuleIds,
576
609
  })
577
610
 
611
+ // Send notification to the requester
612
+ if (request.submittedByUserId) {
613
+ try {
614
+ const notificationService = resolveNotificationService(ctx.container)
615
+ const typeDef = notificationTypes.find((type) => type.type === 'staff.leave_request.approved')
616
+ if (typeDef) {
617
+ const startDateStr = request.startDate.toLocaleDateString()
618
+ const endDateStr = request.endDate.toLocaleDateString()
619
+
620
+ const notificationInput = buildNotificationFromType(typeDef, {
621
+ recipientUserId: request.submittedByUserId,
622
+ bodyVariables: {
623
+ startDate: startDateStr,
624
+ endDate: endDateStr,
625
+ },
626
+ sourceEntityType: 'staff:leave_request',
627
+ sourceEntityId: request.id,
628
+ linkHref: `/backend/staff/leave-requests/${request.id}`,
629
+ })
630
+
631
+ await notificationService.create(notificationInput, {
632
+ tenantId: request.tenantId,
633
+ organizationId: request.organizationId,
634
+ })
635
+ }
636
+ } catch {
637
+ // Notification creation is non-critical, don't fail the command
638
+ }
639
+ }
640
+
578
641
  return { requestId: request.id, ruleIds: createdRuleIds }
579
642
  },
580
643
  buildLog: async ({ result, ctx, snapshots }) => {
@@ -696,6 +759,37 @@ const rejectLeaveRequestCommand: CommandHandler<StaffLeaveRequestDecisionInput,
696
759
  indexer: leaveRequestCrudIndexer,
697
760
  })
698
761
 
762
+ // Send notification to the requester
763
+ if (request.submittedByUserId) {
764
+ try {
765
+ const notificationService = resolveNotificationService(ctx.container)
766
+ const typeDef = notificationTypes.find((type) => type.type === 'staff.leave_request.rejected')
767
+ if (typeDef) {
768
+ const startDateStr = request.startDate.toLocaleDateString()
769
+ const endDateStr = request.endDate.toLocaleDateString()
770
+
771
+ const notificationInput = buildNotificationFromType(typeDef, {
772
+ recipientUserId: request.submittedByUserId,
773
+ bodyVariables: {
774
+ startDate: startDateStr,
775
+ endDate: endDateStr,
776
+ reason: request.decisionComment ?? '',
777
+ },
778
+ sourceEntityType: 'staff:leave_request',
779
+ sourceEntityId: request.id,
780
+ linkHref: `/backend/staff/leave-requests/${request.id}`,
781
+ })
782
+
783
+ await notificationService.create(notificationInput, {
784
+ tenantId: request.tenantId,
785
+ organizationId: request.organizationId,
786
+ })
787
+ }
788
+ } catch {
789
+ // Notification creation is non-critical, don't fail the command
790
+ }
791
+ }
792
+
699
793
  return { requestId: request.id }
700
794
  },
701
795
  async prepare(rawInput, ctx) {
@@ -797,6 +797,10 @@
797
797
  "staff.teams.tabs.details": "Details",
798
798
  "staff.teams.tabs.label": "Teamabschnitte",
799
799
  "staff.teams.tabs.members": "Teammitglieder",
800
+ "staff.notifications.leaveRequest.pending.title": "Urlaubsantrag ausstehend",
801
+ "staff.notifications.leaveRequest.pending.body": "{memberName} hat Urlaub vom {startDate} bis {endDate} beantragt",
802
+ "staff.notifications.leaveRequest.actions.approve": "Genehmigen",
803
+ "staff.notifications.leaveRequest.actions.reject": "Ablehnen",
800
804
  "staff.leaveRequests.page.title": "Urlaubsantr\u00e4ge",
801
805
  "staff.leaveRequests.page.description": "Urlaubsantr\u00e4ge des Teams pr\u00fcfen.",
802
806
  "staff.leaveRequests.my.title": "Meine Urlaubsantr\u00e4ge",
@@ -797,6 +797,10 @@
797
797
  "staff.teams.tabs.details": "Details",
798
798
  "staff.teams.tabs.label": "Team sections",
799
799
  "staff.teams.tabs.members": "Team members",
800
+ "staff.notifications.leaveRequest.pending.title": "Leave Request Pending",
801
+ "staff.notifications.leaveRequest.pending.body": "{memberName} has requested leave from {startDate} to {endDate}",
802
+ "staff.notifications.leaveRequest.actions.approve": "Approve",
803
+ "staff.notifications.leaveRequest.actions.reject": "Reject",
800
804
  "staff.leaveRequests.page.title": "Leave requests",
801
805
  "staff.leaveRequests.page.description": "Review leave requests from your team.",
802
806
  "staff.leaveRequests.my.title": "My leave requests",
@@ -874,5 +878,9 @@
874
878
  "staff.myAvailability.readOnly.body": "Use leave requests to request changes.",
875
879
  "staff.teamMembers.self.createTitle": "Create my profile",
876
880
  "staff.teamMembers.self.created": "Profile created.",
877
- "staff.teamMembers.self.exists": "Team member profile already exists."
881
+ "staff.teamMembers.self.exists": "Team member profile already exists.",
882
+ "staff.notifications.leaveRequest.approved.title": "Leave Request Approved",
883
+ "staff.notifications.leaveRequest.approved.body": "Your leave request from {startDate} to {endDate} has been approved",
884
+ "staff.notifications.leaveRequest.rejected.title": "Leave Request Rejected",
885
+ "staff.notifications.leaveRequest.rejected.body": "Your leave request from {startDate} to {endDate} has been rejected{reason, select, other { - {reason}}}"
878
886
  }
@@ -797,6 +797,10 @@
797
797
  "staff.teams.tabs.details": "Detalles",
798
798
  "staff.teams.tabs.label": "Secciones del equipo",
799
799
  "staff.teams.tabs.members": "Miembros del equipo",
800
+ "staff.notifications.leaveRequest.pending.title": "Solicitud de ausencia pendiente",
801
+ "staff.notifications.leaveRequest.pending.body": "{memberName} ha solicitado ausencia del {startDate} al {endDate}",
802
+ "staff.notifications.leaveRequest.actions.approve": "Aprobar",
803
+ "staff.notifications.leaveRequest.actions.reject": "Rechazar",
800
804
  "staff.leaveRequests.page.title": "Solicitudes de ausencia",
801
805
  "staff.leaveRequests.page.description": "Revisa las solicitudes de ausencia del equipo.",
802
806
  "staff.leaveRequests.my.title": "Mis solicitudes de ausencia",
@@ -797,6 +797,10 @@
797
797
  "staff.teams.tabs.details": "Szczeg\u00f3\u0142y",
798
798
  "staff.teams.tabs.label": "Sekcje zespo\u0142u",
799
799
  "staff.teams.tabs.members": "Cz\u0142onkowie zespo\u0142u",
800
+ "staff.notifications.leaveRequest.pending.title": "Wniosek urlopowy oczekuje",
801
+ "staff.notifications.leaveRequest.pending.body": "{memberName} zło\u017cył wniosek o urlop od {startDate} do {endDate}",
802
+ "staff.notifications.leaveRequest.actions.approve": "Zatwierd\u017a",
803
+ "staff.notifications.leaveRequest.actions.reject": "Odrzu\u0107",
800
804
  "staff.leaveRequests.page.title": "Wnioski urlopowe",
801
805
  "staff.leaveRequests.page.description": "Przegl\u0105daj wnioski urlopowe zespo\u0142u.",
802
806
  "staff.leaveRequests.my.title": "Moje wnioski urlopowe",
@@ -0,0 +1,71 @@
1
+ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'
2
+
3
+ export const notificationTypes: NotificationTypeDefinition[] = [
4
+ {
5
+ type: 'staff.leave_request.pending',
6
+ module: 'staff',
7
+ titleKey: 'staff.notifications.leaveRequest.pending.title',
8
+ bodyKey: 'staff.notifications.leaveRequest.pending.body',
9
+ icon: 'calendar-off',
10
+ severity: 'warning',
11
+ actions: [
12
+ {
13
+ id: 'approve',
14
+ labelKey: 'staff.notifications.leaveRequest.actions.approve',
15
+ variant: 'default',
16
+ icon: 'check',
17
+ commandId: 'staff.leave-requests.accept',
18
+ },
19
+ {
20
+ id: 'reject',
21
+ labelKey: 'staff.notifications.leaveRequest.actions.reject',
22
+ variant: 'destructive',
23
+ icon: 'x',
24
+ commandId: 'staff.leave-requests.reject',
25
+ },
26
+ ],
27
+ primaryActionId: 'approve',
28
+ linkHref: '/backend/staff/leave-requests/{sourceEntityId}',
29
+ expiresAfterHours: 168,
30
+ },
31
+ {
32
+ type: 'staff.leave_request.approved',
33
+ module: 'staff',
34
+ titleKey: 'staff.notifications.leaveRequest.approved.title',
35
+ bodyKey: 'staff.notifications.leaveRequest.approved.body',
36
+ icon: 'calendar-check',
37
+ severity: 'success',
38
+ actions: [
39
+ {
40
+ id: 'view',
41
+ labelKey: 'common.view',
42
+ variant: 'outline',
43
+ href: '/backend/staff/leave-requests/{sourceEntityId}',
44
+ icon: 'external-link',
45
+ },
46
+ ],
47
+ linkHref: '/backend/staff/leave-requests/{sourceEntityId}',
48
+ expiresAfterHours: 168, // 7 days
49
+ },
50
+ {
51
+ type: 'staff.leave_request.rejected',
52
+ module: 'staff',
53
+ titleKey: 'staff.notifications.leaveRequest.rejected.title',
54
+ bodyKey: 'staff.notifications.leaveRequest.rejected.body',
55
+ icon: 'calendar-x',
56
+ severity: 'warning',
57
+ actions: [
58
+ {
59
+ id: 'view',
60
+ labelKey: 'common.view',
61
+ variant: 'outline',
62
+ href: '/backend/staff/leave-requests/{sourceEntityId}',
63
+ icon: 'external-link',
64
+ },
65
+ ],
66
+ linkHref: '/backend/staff/leave-requests/{sourceEntityId}',
67
+ expiresAfterHours: 168, // 7 days
68
+ },
69
+ ]
70
+
71
+ export default notificationTypes
@@ -274,22 +274,27 @@ export default function WorkflowDefinitionsListPage() {
274
274
  <RowActions
275
275
  items={[
276
276
  {
277
+ id: 'edit',
277
278
  label: t('common.edit'),
278
279
  href: `/backend/definitions/${row.original.id}`,
279
280
  },
280
281
  {
282
+ id: 'edit-visual',
281
283
  label: t('workflows.actions.editVisually'),
282
284
  href: `/backend/definitions/visual-editor?id=${row.original.id}`,
283
285
  },
284
286
  {
287
+ id: row.original.enabled ? 'disable' : 'enable',
285
288
  label: row.original.enabled ? t('common.disable') : t('common.enable'),
286
289
  onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),
287
290
  },
288
291
  {
292
+ id: 'duplicate',
289
293
  label: t('common.duplicate'),
290
294
  onSelect: () => handleDuplicate(row.original),
291
295
  },
292
296
  {
297
+ id: 'delete',
293
298
  label: t('common.delete'),
294
299
  onSelect: () => handleDelete(row.original.id, row.original.workflowName),
295
300
  destructive: true,
@@ -266,8 +266,9 @@ export default function WorkflowInstancesListPage() {
266
266
  id: 'actions',
267
267
  header: '',
268
268
  cell: ({ row }) => {
269
- const items: Array<{label: string; href?: string; onSelect?: () => void}> = [
269
+ const items: Array<{ id: string; label: string; href?: string; onSelect?: () => void }> = [
270
270
  {
271
+ id: 'view',
271
272
  label: t('workflows.instances.actions.viewDetails'),
272
273
  href: `/backend/instances/${row.original.id}`,
273
274
  },
@@ -275,6 +276,7 @@ export default function WorkflowInstancesListPage() {
275
276
 
276
277
  if (row.original.status === 'RUNNING' || row.original.status === 'PAUSED') {
277
278
  items.push({
279
+ id: 'cancel',
278
280
  label: t('workflows.instances.actions.cancel'),
279
281
  onSelect: () => handleCancel(row.original.id, row.original.workflowId),
280
282
  })
@@ -282,6 +284,7 @@ export default function WorkflowInstancesListPage() {
282
284
 
283
285
  if (row.original.status === 'FAILED') {
284
286
  items.push({
287
+ id: 'retry',
285
288
  label: t('workflows.instances.actions.retry'),
286
289
  onSelect: () => handleRetry(row.original.id, row.original.workflowId),
287
290
  })
@@ -273,8 +273,9 @@ export default function UserTasksListPage() {
273
273
  id: 'actions',
274
274
  header: '',
275
275
  cell: ({ row }) => {
276
- const items: Array<{label: string; href?: string; onSelect?: () => void}> = [
276
+ const items: Array<{ id: string; label: string; href?: string; onSelect?: () => void }> = [
277
277
  {
278
+ id: 'view',
278
279
  label: t('workflows.tasks.actions.viewDetails'),
279
280
  href: `/backend/tasks/${row.original.id}`,
280
281
  },
@@ -288,6 +289,7 @@ export default function UserTasksListPage() {
288
289
  row.original.assignedToRoles.length > 0
289
290
  ) {
290
291
  items.push({
292
+ id: 'claim',
291
293
  label: t('workflows.tasks.actions.claim'),
292
294
  onSelect: () => handleClaim(row.original.id, row.original.taskName),
293
295
  })
@@ -296,6 +298,7 @@ export default function UserTasksListPage() {
296
298
  // Allow completing if task is in progress or pending
297
299
  if (row.original.status === 'PENDING' || row.original.status === 'IN_PROGRESS') {
298
300
  items.push({
301
+ id: 'complete',
299
302
  label: t('workflows.tasks.actions.complete'),
300
303
  href: `/backend/tasks/${row.original.id}`,
301
304
  })
@@ -676,5 +676,7 @@
676
676
  "success": "Sub-workflow completed successfully",
677
677
  "failed": "Sub-workflow failed"
678
678
  }
679
- }
679
+ },
680
+ "workflows.notifications.task.assigned.title": "Task Assigned",
681
+ "workflows.notifications.task.assigned.body": "You have been assigned to task \"{taskName}\" in workflow \"{workflowName}\"{dueDate, select, other { (due: {dueDate})}}"
680
682
  }
@@ -12,6 +12,7 @@
12
12
 
13
13
  import { EntityManager } from '@mikro-orm/core'
14
14
  import type { AwilixContainer } from 'awilix'
15
+ import type { EventBus } from '@open-mercato/events'
15
16
  import {
16
17
  WorkflowInstance,
17
18
  WorkflowDefinition,
@@ -271,6 +272,13 @@ export async function executeTransition(
271
272
  context: TransitionExecutionContext
272
273
  ): Promise<TransitionExecutionResult> {
273
274
  try {
275
+ let eventBus: Pick<EventBus, 'emitEvent'> | null = null
276
+ try {
277
+ eventBus = container.resolve('eventBus') as EventBus
278
+ } catch {
279
+ eventBus = null
280
+ }
281
+
274
282
  // First, evaluate if transition is valid
275
283
  const evaluation = await evaluateTransition(
276
284
  em,
@@ -294,7 +302,8 @@ export async function executeTransition(
294
302
  em,
295
303
  instance,
296
304
  transition,
297
- context
305
+ context,
306
+ eventBus
298
307
  )
299
308
 
300
309
  if (!preConditionsResult.allowed) {
@@ -505,7 +514,8 @@ export async function executeTransition(
505
514
  em,
506
515
  instance,
507
516
  transition,
508
- context
517
+ context,
518
+ eventBus
509
519
  )
510
520
 
511
521
  if (!postConditionsResult.allowed) {
@@ -659,7 +669,8 @@ async function evaluatePreConditions(
659
669
  em: EntityManager,
660
670
  instance: WorkflowInstance,
661
671
  transition: any,
662
- context: TransitionExecutionContext
672
+ context: TransitionExecutionContext,
673
+ eventBus: Pick<EventBus, 'emitEvent'> | null
663
674
  ): Promise<ruleEngine.RuleEngineResult> {
664
675
  try {
665
676
  // Load workflow definition to get workflow ID
@@ -698,7 +709,7 @@ async function evaluatePreConditions(
698
709
  }
699
710
 
700
711
  // Execute rules - only GUARD rules will affect the 'allowed' status
701
- const result = await ruleEngine.executeRules(em, ruleContext)
712
+ const result = await ruleEngine.executeRules(em, ruleContext, { eventBus })
702
713
 
703
714
  return result
704
715
  } catch (error) {
@@ -728,7 +739,8 @@ async function evaluatePostConditions(
728
739
  em: EntityManager,
729
740
  instance: WorkflowInstance,
730
741
  transition: any,
731
- context: TransitionExecutionContext
742
+ context: TransitionExecutionContext,
743
+ eventBus: Pick<EventBus, 'emitEvent'> | null
732
744
  ): Promise<ruleEngine.RuleEngineResult> {
733
745
  try {
734
746
  // Load workflow definition to get workflow ID
@@ -767,7 +779,7 @@ async function evaluatePostConditions(
767
779
  }
768
780
 
769
781
  // Execute rules
770
- const result = await ruleEngine.executeRules(em, ruleContext)
782
+ const result = await ruleEngine.executeRules(em, ruleContext, { eventBus })
771
783
 
772
784
  return result
773
785
  } catch (error) {
@@ -0,0 +1,25 @@
1
+ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'
2
+
3
+ export const notificationTypes: NotificationTypeDefinition[] = [
4
+ {
5
+ type: 'workflows.task.assigned',
6
+ module: 'workflows',
7
+ titleKey: 'workflows.notifications.task.assigned.title',
8
+ bodyKey: 'workflows.notifications.task.assigned.body',
9
+ icon: 'clipboard-list',
10
+ severity: 'info',
11
+ actions: [
12
+ {
13
+ id: 'view',
14
+ labelKey: 'common.view',
15
+ variant: 'outline',
16
+ href: '/backend/workflows/tasks/{sourceEntityId}',
17
+ icon: 'external-link',
18
+ },
19
+ ],
20
+ linkHref: '/backend/workflows/tasks/{sourceEntityId}',
21
+ expiresAfterHours: 168, // 7 days
22
+ },
23
+ ]
24
+
25
+ export default notificationTypes
@@ -0,0 +1,53 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import { resolveNotificationService } from '../../notifications/lib/notificationService'
3
+ import { buildNotificationFromType } from '../../notifications/lib/notificationBuilder'
4
+ import { notificationTypes } from '../notifications'
5
+
6
+ export const metadata = {
7
+ event: 'workflows.task.assigned',
8
+ persistent: true,
9
+ id: 'workflows:task-assigned-notification',
10
+ }
11
+
12
+ type TaskAssignedPayload = {
13
+ taskId: string
14
+ taskName: string
15
+ workflowName: string
16
+ assignedUserId: string
17
+ dueDate?: string | null
18
+ tenantId: string
19
+ organizationId?: string | null
20
+ }
21
+
22
+ type ResolverContext = {
23
+ resolve: <T = unknown>(name: string) => T
24
+ }
25
+
26
+ export default async function handle(payload: TaskAssignedPayload, ctx: ResolverContext) {
27
+ if (!payload.assignedUserId) return
28
+
29
+ try {
30
+ const notificationService = resolveNotificationService(ctx)
31
+ const typeDef = notificationTypes.find((type) => type.type === 'workflows.task.assigned')
32
+ if (!typeDef) return
33
+
34
+ const notificationInput = buildNotificationFromType(typeDef, {
35
+ recipientUserId: payload.assignedUserId,
36
+ bodyVariables: {
37
+ taskName: payload.taskName,
38
+ workflowName: payload.workflowName,
39
+ dueDate: payload.dueDate ?? '',
40
+ },
41
+ sourceEntityType: 'workflows:user_task',
42
+ sourceEntityId: payload.taskId,
43
+ linkHref: `/backend/workflows/tasks/${payload.taskId}`,
44
+ })
45
+
46
+ await notificationService.create(notificationInput, {
47
+ tenantId: payload.tenantId,
48
+ organizationId: payload.organizationId ?? null,
49
+ })
50
+ } catch (err) {
51
+ console.error('[workflows:task-assigned-notification] Failed to create notification:', err)
52
+ }
53
+ }