@open-mercato/core 0.4.2-canary-bdaa640a68 → 0.4.2-canary-3b5064ce72

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 (497) 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/login.js +25 -6
  18. package/dist/modules/auth/api/login.js.map +2 -2
  19. package/dist/modules/auth/api/profile/route.js +157 -0
  20. package/dist/modules/auth/api/profile/route.js.map +7 -0
  21. package/dist/modules/auth/api/reset/confirm.js +25 -2
  22. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  23. package/dist/modules/auth/api/reset.js +23 -0
  24. package/dist/modules/auth/api/reset.js.map +2 -2
  25. package/dist/modules/auth/api/sidebar/preferences/route.js +14 -9
  26. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  27. package/dist/modules/auth/api/users/route.js +4 -2
  28. package/dist/modules/auth/api/users/route.js.map +2 -2
  29. package/dist/modules/auth/backend/auth/profile/page.js +141 -0
  30. package/dist/modules/auth/backend/auth/profile/page.js.map +7 -0
  31. package/dist/modules/auth/backend/auth/profile/page.meta.js +13 -0
  32. package/dist/modules/auth/backend/auth/profile/page.meta.js.map +7 -0
  33. package/dist/modules/auth/backend/roles/[id]/edit/page.js +4 -1
  34. package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
  35. package/dist/modules/auth/backend/roles/page.js +3 -3
  36. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  37. package/dist/modules/auth/backend/users/[id]/edit/page.js +18 -3
  38. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  39. package/dist/modules/auth/backend/users/create/page.js +15 -2
  40. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  41. package/dist/modules/auth/backend/users/page.js +3 -3
  42. package/dist/modules/auth/backend/users/page.js.map +2 -2
  43. package/dist/modules/auth/cli.js +25 -11
  44. package/dist/modules/auth/cli.js.map +2 -2
  45. package/dist/modules/auth/commands/users.js +59 -2
  46. package/dist/modules/auth/commands/users.js.map +2 -2
  47. package/dist/modules/auth/data/validators.js +6 -3
  48. package/dist/modules/auth/data/validators.js.map +2 -2
  49. package/dist/modules/auth/frontend/login.js +112 -3
  50. package/dist/modules/auth/frontend/login.js.map +2 -2
  51. package/dist/modules/auth/frontend/reset/[token]/page.js +20 -10
  52. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  53. package/dist/modules/auth/lib/setup-app.js +42 -8
  54. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  55. package/dist/modules/auth/notifications.js +112 -0
  56. package/dist/modules/auth/notifications.js.map +7 -0
  57. package/dist/modules/auth/services/authService.js +24 -3
  58. package/dist/modules/auth/services/authService.js.map +2 -2
  59. package/dist/modules/business_rules/api/execute/route.js +7 -1
  60. package/dist/modules/business_rules/api/execute/route.js.map +2 -2
  61. package/dist/modules/business_rules/backend/rules/page.js +4 -0
  62. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  63. package/dist/modules/business_rules/backend/sets/page.js +3 -0
  64. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  65. package/dist/modules/business_rules/cli.js +2 -1
  66. package/dist/modules/business_rules/cli.js.map +2 -2
  67. package/dist/modules/business_rules/lib/rule-engine.js +33 -3
  68. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  69. package/dist/modules/business_rules/notifications.js +28 -0
  70. package/dist/modules/business_rules/notifications.js.map +7 -0
  71. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +37 -0
  72. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +7 -0
  73. package/dist/modules/catalog/components/PriceKindSettings.js +2 -0
  74. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  75. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  76. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  77. package/dist/modules/catalog/components/products/ProductsDataTable.js +2 -0
  78. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  79. package/dist/modules/catalog/notifications.js +28 -0
  80. package/dist/modules/catalog/notifications.js.map +7 -0
  81. package/dist/modules/catalog/subscribers/low-stock-notification.js +38 -0
  82. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +7 -0
  83. package/dist/modules/configs/cli.js +6 -0
  84. package/dist/modules/configs/cli.js.map +2 -2
  85. package/dist/modules/configs/components/CachePanel.js +4 -4
  86. package/dist/modules/configs/components/CachePanel.js.map +2 -2
  87. package/dist/modules/configs/lib/system-status.js +48 -1
  88. package/dist/modules/configs/lib/system-status.js.map +2 -2
  89. package/dist/modules/configs/lib/upgrade-actions.js +18 -0
  90. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  91. package/dist/modules/currencies/backend/currencies/page.js +3 -0
  92. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  93. package/dist/modules/currencies/backend/exchange-rates/page.js +2 -0
  94. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  95. package/dist/modules/customers/backend/customers/companies/page.js +3 -0
  96. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  97. package/dist/modules/customers/backend/customers/deals/page.js +3 -0
  98. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  99. package/dist/modules/customers/backend/customers/people/page.js +3 -0
  100. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  101. package/dist/modules/customers/commands/deals.js +31 -0
  102. package/dist/modules/customers/commands/deals.js.map +2 -2
  103. package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
  104. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  105. package/dist/modules/customers/notifications.js +48 -0
  106. package/dist/modules/customers/notifications.js.map +7 -0
  107. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js +2 -1
  108. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js.map +2 -2
  109. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js +2 -1
  110. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js.map +2 -2
  111. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js +2 -1
  112. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js.map +2 -2
  113. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js +2 -1
  114. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js.map +2 -2
  115. package/dist/modules/dashboards/cli.js +44 -5
  116. package/dist/modules/dashboards/cli.js.map +2 -2
  117. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +16 -11
  118. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
  119. package/dist/modules/dashboards/lib/role-widgets.js +58 -0
  120. package/dist/modules/dashboards/lib/role-widgets.js.map +7 -0
  121. package/dist/modules/dashboards/services/widgetDataService.js +139 -3
  122. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  123. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js +2 -1
  124. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js.map +2 -2
  125. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js +2 -1
  126. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js.map +2 -2
  127. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js +2 -1
  128. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js.map +2 -2
  129. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js +2 -1
  130. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js.map +2 -2
  131. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +2 -1
  132. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
  133. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js +2 -1
  134. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js.map +2 -2
  135. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js +2 -1
  136. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js.map +2 -2
  137. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js +2 -1
  138. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js.map +2 -2
  139. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js +2 -1
  140. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js.map +2 -2
  141. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js +2 -1
  142. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js.map +2 -2
  143. package/dist/modules/dictionaries/components/DictionaryTable.js +2 -0
  144. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  145. package/dist/modules/directory/api/get/tenants/lookup.js +70 -0
  146. package/dist/modules/directory/api/get/tenants/lookup.js.map +7 -0
  147. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  148. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  149. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  150. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  151. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  152. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  153. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  154. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  155. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  156. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  157. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  158. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  159. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  160. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  161. package/dist/modules/notifications/acl.js +11 -0
  162. package/dist/modules/notifications/acl.js.map +7 -0
  163. package/dist/modules/notifications/api/[id]/action/route.js +74 -0
  164. package/dist/modules/notifications/api/[id]/action/route.js.map +7 -0
  165. package/dist/modules/notifications/api/[id]/dismiss/route.js +15 -0
  166. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +7 -0
  167. package/dist/modules/notifications/api/[id]/read/route.js +15 -0
  168. package/dist/modules/notifications/api/[id]/read/route.js.map +7 -0
  169. package/dist/modules/notifications/api/[id]/restore/route.js +53 -0
  170. package/dist/modules/notifications/api/[id]/restore/route.js.map +7 -0
  171. package/dist/modules/notifications/api/batch/route.js +17 -0
  172. package/dist/modules/notifications/api/batch/route.js.map +7 -0
  173. package/dist/modules/notifications/api/feature/route.js +17 -0
  174. package/dist/modules/notifications/api/feature/route.js.map +7 -0
  175. package/dist/modules/notifications/api/mark-all-read/route.js +35 -0
  176. package/dist/modules/notifications/api/mark-all-read/route.js.map +7 -0
  177. package/dist/modules/notifications/api/openapi.js +76 -0
  178. package/dist/modules/notifications/api/openapi.js.map +7 -0
  179. package/dist/modules/notifications/api/role/route.js +17 -0
  180. package/dist/modules/notifications/api/role/route.js.map +7 -0
  181. package/dist/modules/notifications/api/route.js +85 -0
  182. package/dist/modules/notifications/api/route.js.map +7 -0
  183. package/dist/modules/notifications/api/settings/route.js +155 -0
  184. package/dist/modules/notifications/api/settings/route.js.map +7 -0
  185. package/dist/modules/notifications/api/unread-count/route.js +38 -0
  186. package/dist/modules/notifications/api/unread-count/route.js.map +7 -0
  187. package/dist/modules/notifications/backend/config/notifications/page.js +10 -0
  188. package/dist/modules/notifications/backend/config/notifications/page.js.map +7 -0
  189. package/dist/modules/notifications/backend/config/notifications/page.meta.js +24 -0
  190. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +7 -0
  191. package/dist/modules/notifications/cli.js +16 -0
  192. package/dist/modules/notifications/cli.js.map +7 -0
  193. package/dist/modules/notifications/data/entities.js +112 -0
  194. package/dist/modules/notifications/data/entities.js.map +7 -0
  195. package/dist/modules/notifications/data/validators.js +98 -0
  196. package/dist/modules/notifications/data/validators.js.map +7 -0
  197. package/dist/modules/notifications/di.js +13 -0
  198. package/dist/modules/notifications/di.js.map +7 -0
  199. package/dist/modules/notifications/emails/NotificationEmail.js +58 -0
  200. package/dist/modules/notifications/emails/NotificationEmail.js.map +7 -0
  201. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +44 -0
  202. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +7 -0
  203. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +220 -0
  204. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +7 -0
  205. package/dist/modules/notifications/index.js +14 -0
  206. package/dist/modules/notifications/index.js.map +7 -0
  207. package/dist/modules/notifications/lib/deliveryConfig.js +107 -0
  208. package/dist/modules/notifications/lib/deliveryConfig.js.map +7 -0
  209. package/dist/modules/notifications/lib/deliveryStrategies.js +14 -0
  210. package/dist/modules/notifications/lib/deliveryStrategies.js.map +7 -0
  211. package/dist/modules/notifications/lib/events.js +12 -0
  212. package/dist/modules/notifications/lib/events.js.map +7 -0
  213. package/dist/modules/notifications/lib/notificationBuilder.js +66 -0
  214. package/dist/modules/notifications/lib/notificationBuilder.js.map +7 -0
  215. package/dist/modules/notifications/lib/notificationFactory.js +54 -0
  216. package/dist/modules/notifications/lib/notificationFactory.js.map +7 -0
  217. package/dist/modules/notifications/lib/notificationMapper.js +34 -0
  218. package/dist/modules/notifications/lib/notificationMapper.js.map +7 -0
  219. package/dist/modules/notifications/lib/notificationRecipients.js +35 -0
  220. package/dist/modules/notifications/lib/notificationRecipients.js.map +7 -0
  221. package/dist/modules/notifications/lib/notificationService.js +279 -0
  222. package/dist/modules/notifications/lib/notificationService.js.map +7 -0
  223. package/dist/modules/notifications/lib/routeHelpers.js +101 -0
  224. package/dist/modules/notifications/lib/routeHelpers.js.map +7 -0
  225. package/dist/modules/notifications/lib/safeHref.js +24 -0
  226. package/dist/modules/notifications/lib/safeHref.js.map +7 -0
  227. package/dist/modules/notifications/migrations/Migration20260123000001.js +70 -0
  228. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +7 -0
  229. package/dist/modules/notifications/migrations/Migration20260126150000.js +37 -0
  230. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +7 -0
  231. package/dist/modules/notifications/migrations/Migration20260129082610.js +13 -0
  232. package/dist/modules/notifications/migrations/Migration20260129082610.js.map +7 -0
  233. package/dist/modules/notifications/subscribers/deliver-notification.js +165 -0
  234. package/dist/modules/notifications/subscribers/deliver-notification.js.map +7 -0
  235. package/dist/modules/notifications/workers/create-notification.worker.js +70 -0
  236. package/dist/modules/notifications/workers/create-notification.worker.js.map +7 -0
  237. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  238. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  239. package/dist/modules/query_index/cli.js +63 -7
  240. package/dist/modules/query_index/cli.js.map +2 -2
  241. package/dist/modules/query_index/components/QueryIndexesTable.js +7 -1
  242. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  243. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  244. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  245. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  246. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  247. package/dist/modules/sales/backend/sales/channels/offers/page.js +2 -0
  248. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  249. package/dist/modules/sales/backend/sales/channels/page.js +2 -0
  250. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  251. package/dist/modules/sales/commands/documents.js +53 -0
  252. package/dist/modules/sales/commands/documents.js.map +2 -2
  253. package/dist/modules/sales/commands/payments.js +26 -0
  254. package/dist/modules/sales/commands/payments.js.map +2 -2
  255. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  256. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  257. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  258. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  259. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  260. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  261. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  262. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  263. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +2 -0
  264. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  265. package/dist/modules/sales/components/documents/AdjustmentsSection.js +2 -0
  266. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  267. package/dist/modules/sales/components/documents/PaymentsSection.js +2 -1
  268. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  269. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +2 -0
  270. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  271. package/dist/modules/sales/notifications.client.js +51 -0
  272. package/dist/modules/sales/notifications.client.js.map +7 -0
  273. package/dist/modules/sales/notifications.js +88 -0
  274. package/dist/modules/sales/notifications.js.map +7 -0
  275. package/dist/modules/sales/subscribers/quote-expiring-notification.js +38 -0
  276. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +7 -0
  277. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +137 -0
  278. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +7 -0
  279. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +137 -0
  280. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +7 -0
  281. package/dist/modules/sales/widgets/notifications/index.js +7 -0
  282. package/dist/modules/sales/widgets/notifications/index.js.map +7 -0
  283. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +60 -0
  284. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +7 -0
  285. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  286. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  287. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  288. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  289. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  290. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  291. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  292. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  293. package/dist/modules/staff/commands/leave-requests.js +79 -0
  294. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  295. package/dist/modules/staff/notifications.js +75 -0
  296. package/dist/modules/staff/notifications.js.map +7 -0
  297. package/dist/modules/workflows/backend/definitions/page.js +5 -0
  298. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  299. package/dist/modules/workflows/backend/instances/page.js +3 -0
  300. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  301. package/dist/modules/workflows/backend/tasks/page.js +3 -0
  302. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  303. package/dist/modules/workflows/cli.js +12 -12
  304. package/dist/modules/workflows/cli.js.map +2 -2
  305. package/dist/modules/workflows/lib/transition-handler.js +14 -6
  306. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  307. package/dist/modules/workflows/notifications.js +28 -0
  308. package/dist/modules/workflows/notifications.js.map +7 -0
  309. package/dist/modules/workflows/subscribers/task-assigned-notification.js +38 -0
  310. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +7 -0
  311. package/generated/entities/notification/index.ts +27 -0
  312. package/generated/entities.ids.generated.ts +5 -1
  313. package/generated/entity-fields-registry.ts +2 -0
  314. package/package.json +2 -2
  315. package/src/modules/api_docs/frontend/docs/api/page.tsx +3 -2
  316. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  317. package/src/modules/attachments/components/AttachmentLibrary.tsx +4 -0
  318. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +2 -0
  319. package/src/modules/auth/README.md +1 -1
  320. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
  321. package/src/modules/auth/api/__tests__/login.test.ts +2 -0
  322. package/src/modules/auth/api/admin/nav.ts +10 -6
  323. package/src/modules/auth/api/login.ts +26 -7
  324. package/src/modules/auth/api/profile/route.ts +163 -0
  325. package/src/modules/auth/api/reset/confirm.ts +25 -2
  326. package/src/modules/auth/api/reset.ts +23 -0
  327. package/src/modules/auth/api/sidebar/preferences/route.ts +21 -12
  328. package/src/modules/auth/api/users/route.ts +5 -2
  329. package/src/modules/auth/backend/auth/profile/page.meta.ts +9 -0
  330. package/src/modules/auth/backend/auth/profile/page.tsx +174 -0
  331. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +4 -1
  332. package/src/modules/auth/backend/roles/page.tsx +3 -3
  333. package/src/modules/auth/backend/users/[id]/edit/page.tsx +22 -3
  334. package/src/modules/auth/backend/users/create/page.tsx +19 -2
  335. package/src/modules/auth/backend/users/page.tsx +3 -3
  336. package/src/modules/auth/cli.ts +38 -11
  337. package/src/modules/auth/commands/users.ts +73 -2
  338. package/src/modules/auth/data/validators.ts +6 -2
  339. package/src/modules/auth/frontend/login.tsx +134 -5
  340. package/src/modules/auth/frontend/reset/[token]/page.tsx +24 -11
  341. package/src/modules/auth/i18n/de.json +48 -1
  342. package/src/modules/auth/i18n/en.json +48 -1
  343. package/src/modules/auth/i18n/es.json +48 -1
  344. package/src/modules/auth/i18n/pl.json +48 -1
  345. package/src/modules/auth/lib/setup-app.ts +58 -9
  346. package/src/modules/auth/notifications.ts +109 -0
  347. package/src/modules/auth/services/authService.ts +27 -4
  348. package/src/modules/business_rules/api/execute/route.ts +8 -1
  349. package/src/modules/business_rules/backend/rules/page.tsx +4 -0
  350. package/src/modules/business_rules/backend/sets/page.tsx +3 -0
  351. package/src/modules/business_rules/cli.ts +2 -1
  352. package/src/modules/business_rules/i18n/en.json +3 -1
  353. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +51 -0
  354. package/src/modules/business_rules/lib/rule-engine.ts +57 -3
  355. package/src/modules/business_rules/notifications.ts +25 -0
  356. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +50 -0
  357. package/src/modules/catalog/components/PriceKindSettings.tsx +2 -0
  358. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  359. package/src/modules/catalog/components/products/ProductsDataTable.tsx +2 -0
  360. package/src/modules/catalog/i18n/en.json +3 -1
  361. package/src/modules/catalog/notifications.ts +25 -0
  362. package/src/modules/catalog/subscribers/low-stock-notification.ts +52 -0
  363. package/src/modules/configs/cli.ts +6 -0
  364. package/src/modules/configs/components/CachePanel.tsx +4 -4
  365. package/src/modules/configs/i18n/en.json +12 -2
  366. package/src/modules/configs/i18n/pl.json +12 -2
  367. package/src/modules/configs/lib/system-status.ts +48 -1
  368. package/src/modules/configs/lib/system-status.types.ts +1 -0
  369. package/src/modules/configs/lib/upgrade-actions.ts +18 -0
  370. package/src/modules/currencies/backend/currencies/page.tsx +3 -0
  371. package/src/modules/currencies/backend/exchange-rates/page.tsx +2 -0
  372. package/src/modules/customers/backend/customers/companies/page.tsx +3 -0
  373. package/src/modules/customers/backend/customers/deals/page.tsx +3 -0
  374. package/src/modules/customers/backend/customers/people/page.tsx +3 -0
  375. package/src/modules/customers/commands/deals.ts +39 -0
  376. package/src/modules/customers/components/CustomerTodosTable.tsx +1 -0
  377. package/src/modules/customers/i18n/en.json +5 -1
  378. package/src/modules/customers/notifications.ts +44 -0
  379. package/src/modules/customers/widgets/dashboard/customer-todos/widget.ts +2 -2
  380. package/src/modules/customers/widgets/dashboard/new-customers/widget.ts +2 -2
  381. package/src/modules/customers/widgets/dashboard/new-deals/widget.ts +2 -2
  382. package/src/modules/customers/widgets/dashboard/next-interactions/widget.ts +2 -2
  383. package/src/modules/dashboards/cli.ts +55 -5
  384. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +22 -11
  385. package/src/modules/dashboards/lib/role-widgets.ts +80 -0
  386. package/src/modules/dashboards/services/widgetDataService.ts +164 -4
  387. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.ts +2 -2
  388. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.ts +2 -2
  389. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.ts +2 -2
  390. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.ts +2 -2
  391. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
  392. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.ts +2 -2
  393. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.ts +2 -2
  394. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.ts +2 -2
  395. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.ts +2 -2
  396. package/src/modules/dashboards/widgets/dashboard/top-products/widget.ts +2 -2
  397. package/src/modules/dictionaries/components/DictionaryTable.tsx +2 -0
  398. package/src/modules/directory/api/get/tenants/lookup.ts +75 -0
  399. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  400. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  401. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  402. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  403. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  404. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +3 -4
  405. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  406. package/src/modules/notifications/__tests__/deliver-notification.test.ts +195 -0
  407. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +19 -0
  408. package/src/modules/notifications/__tests__/notificationService.test.ts +208 -0
  409. package/src/modules/notifications/acl.ts +7 -0
  410. package/src/modules/notifications/api/[id]/action/route.ts +75 -0
  411. package/src/modules/notifications/api/[id]/dismiss/route.ts +12 -0
  412. package/src/modules/notifications/api/[id]/read/route.ts +12 -0
  413. package/src/modules/notifications/api/[id]/restore/route.ts +53 -0
  414. package/src/modules/notifications/api/batch/route.ts +14 -0
  415. package/src/modules/notifications/api/feature/route.ts +14 -0
  416. package/src/modules/notifications/api/mark-all-read/route.ts +34 -0
  417. package/src/modules/notifications/api/openapi.ts +76 -0
  418. package/src/modules/notifications/api/role/route.ts +14 -0
  419. package/src/modules/notifications/api/route.ts +92 -0
  420. package/src/modules/notifications/api/settings/route.ts +157 -0
  421. package/src/modules/notifications/api/unread-count/route.ts +38 -0
  422. package/src/modules/notifications/backend/config/notifications/page.meta.ts +22 -0
  423. package/src/modules/notifications/backend/config/notifications/page.tsx +12 -0
  424. package/src/modules/notifications/cli.ts +18 -0
  425. package/src/modules/notifications/data/entities.ts +99 -0
  426. package/src/modules/notifications/data/validators.ts +115 -0
  427. package/src/modules/notifications/di.ts +11 -0
  428. package/src/modules/notifications/emails/NotificationEmail.tsx +98 -0
  429. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +42 -0
  430. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +233 -0
  431. package/src/modules/notifications/i18n/de.json +50 -0
  432. package/src/modules/notifications/i18n/en.json +50 -0
  433. package/src/modules/notifications/i18n/es.json +50 -0
  434. package/src/modules/notifications/i18n/pl.json +50 -0
  435. package/src/modules/notifications/index.ts +12 -0
  436. package/src/modules/notifications/lib/deliveryConfig.ts +153 -0
  437. package/src/modules/notifications/lib/deliveryStrategies.ts +50 -0
  438. package/src/modules/notifications/lib/events.ts +48 -0
  439. package/src/modules/notifications/lib/notificationBuilder.ts +121 -0
  440. package/src/modules/notifications/lib/notificationFactory.ts +76 -0
  441. package/src/modules/notifications/lib/notificationMapper.ts +33 -0
  442. package/src/modules/notifications/lib/notificationRecipients.ts +83 -0
  443. package/src/modules/notifications/lib/notificationService.ts +414 -0
  444. package/src/modules/notifications/lib/routeHelpers.ts +151 -0
  445. package/src/modules/notifications/lib/safeHref.ts +29 -0
  446. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +336 -0
  447. package/src/modules/notifications/migrations/Migration20260123000001.ts +73 -0
  448. package/src/modules/notifications/migrations/Migration20260126150000.ts +39 -0
  449. package/src/modules/notifications/migrations/Migration20260129082610.ts +13 -0
  450. package/src/modules/notifications/subscribers/deliver-notification.ts +204 -0
  451. package/src/modules/notifications/workers/create-notification.worker.ts +122 -0
  452. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  453. package/src/modules/query_index/cli.ts +82 -13
  454. package/src/modules/query_index/components/QueryIndexesTable.tsx +8 -2
  455. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  456. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  457. package/src/modules/sales/backend/sales/channels/offers/page.tsx +2 -0
  458. package/src/modules/sales/backend/sales/channels/page.tsx +2 -0
  459. package/src/modules/sales/commands/documents.ts +65 -0
  460. package/src/modules/sales/commands/payments.ts +33 -0
  461. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  462. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  463. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  464. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  465. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +2 -0
  466. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +2 -0
  467. package/src/modules/sales/components/documents/PaymentsSection.tsx +2 -1
  468. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +2 -0
  469. package/src/modules/sales/i18n/de.json +20 -0
  470. package/src/modules/sales/i18n/en.json +25 -1
  471. package/src/modules/sales/i18n/es.json +20 -0
  472. package/src/modules/sales/i18n/pl.json +20 -0
  473. package/src/modules/sales/notifications.client.ts +65 -0
  474. package/src/modules/sales/notifications.ts +82 -0
  475. package/src/modules/sales/subscribers/quote-expiring-notification.ts +53 -0
  476. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +156 -0
  477. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +156 -0
  478. package/src/modules/sales/widgets/notifications/index.ts +2 -0
  479. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +81 -0
  480. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  481. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  482. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  483. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  484. package/src/modules/staff/commands/leave-requests.ts +94 -0
  485. package/src/modules/staff/i18n/de.json +4 -0
  486. package/src/modules/staff/i18n/en.json +9 -1
  487. package/src/modules/staff/i18n/es.json +4 -0
  488. package/src/modules/staff/i18n/pl.json +4 -0
  489. package/src/modules/staff/notifications.ts +71 -0
  490. package/src/modules/workflows/backend/definitions/page.tsx +5 -0
  491. package/src/modules/workflows/backend/instances/page.tsx +4 -1
  492. package/src/modules/workflows/backend/tasks/page.tsx +4 -1
  493. package/src/modules/workflows/cli.ts +12 -12
  494. package/src/modules/workflows/i18n/en.json +3 -1
  495. package/src/modules/workflows/lib/transition-handler.ts +18 -6
  496. package/src/modules/workflows/notifications.ts +25 -0
  497. package/src/modules/workflows/subscribers/task-assigned-notification.ts +53 -0
@@ -0,0 +1,81 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
5
+
6
+ type DocumentKind = 'order' | 'quote'
7
+
8
+ type DocumentTotals = {
9
+ grandTotalGrossAmount: number | null
10
+ currencyCode: string | null
11
+ }
12
+
13
+ type DocumentListResponse = {
14
+ items?: Array<{
15
+ grandTotalGrossAmount?: number | string | null
16
+ currencyCode?: string | null
17
+ }>
18
+ }
19
+
20
+ const REFRESH_INTERVAL_MS = 30000
21
+
22
+ function buildDocumentTotalsUrl(kind: DocumentKind, documentId: string) {
23
+ const params = new URLSearchParams({ id: documentId, page: '1', pageSize: '1' })
24
+ const collection = kind === 'order' ? 'orders' : 'quotes'
25
+ return `/api/sales/${collection}?${params.toString()}`
26
+ }
27
+
28
+ function extractTotals(payload: DocumentListResponse | null): DocumentTotals | null {
29
+ const item = payload?.items?.[0]
30
+ if (!item) return null
31
+ const rawAmount = item.grandTotalGrossAmount
32
+ let grandTotalGrossAmount: number | null = null
33
+ if (typeof rawAmount === 'number') {
34
+ grandTotalGrossAmount = Number.isNaN(rawAmount) ? null : rawAmount
35
+ } else if (typeof rawAmount === 'string' && rawAmount.trim().length) {
36
+ const parsed = Number(rawAmount)
37
+ grandTotalGrossAmount = Number.isNaN(parsed) ? null : parsed
38
+ }
39
+ return {
40
+ grandTotalGrossAmount,
41
+ currencyCode: typeof item.currencyCode === 'string' ? item.currencyCode : null,
42
+ }
43
+ }
44
+
45
+ export function useSalesDocumentTotals(kind: DocumentKind, documentId?: string | null) {
46
+ const [totals, setTotals] = React.useState<DocumentTotals | null>(null)
47
+
48
+ React.useEffect(() => {
49
+ if (!documentId) {
50
+ setTotals(null)
51
+ return
52
+ }
53
+
54
+ let active = true
55
+
56
+ const loadTotals = async () => {
57
+ try {
58
+ const call = await apiCall<DocumentListResponse>(buildDocumentTotalsUrl(kind, documentId))
59
+ if (!active) return
60
+ if (call.ok) {
61
+ const nextTotals = extractTotals(call.result ?? null)
62
+ setTotals(nextTotals)
63
+ }
64
+ } catch {
65
+ if (active) {
66
+ setTotals(null)
67
+ }
68
+ }
69
+ }
70
+
71
+ loadTotals()
72
+ const interval = setInterval(loadTotals, REFRESH_INTERVAL_MS)
73
+
74
+ return () => {
75
+ active = false
76
+ clearInterval(interval)
77
+ }
78
+ }, [kind, documentId])
79
+
80
+ return { totals }
81
+ }
@@ -434,7 +434,7 @@ export default function StaffTeamMembersPage() {
434
434
  <RowActions
435
435
  items={[
436
436
  { id: 'edit', label: labels.actions.edit, onSelect: () => { router.push(`/backend/staff/team-members/${row.id}`) } },
437
- { label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } },
437
+ { id: 'delete', label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } },
438
438
  ]}
439
439
  />
440
440
  ) : null}
@@ -345,8 +345,8 @@ export default function StaffTeamRolesPage() {
345
345
  rowActions={(row) => row.kind === 'role' ? (
346
346
  <RowActions
347
347
  items={[
348
- { label: labels.actions.edit, onSelect: () => { router.push(`/backend/staff/team-roles/${row.id}/edit`) } },
349
- { label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } },
348
+ { id: 'edit', label: labels.actions.edit, onSelect: () => { router.push(`/backend/staff/team-roles/${row.id}/edit`) } },
349
+ { id: 'delete', label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } },
350
350
  ]}
351
351
  />
352
352
  ) : null}
@@ -369,8 +369,8 @@ export default function StaffTeamEditPage({ params }: { params?: { id?: string }
369
369
  rowActions={(row) => (
370
370
  <RowActions
371
371
  items={[
372
- { label: memberLabels.actions.edit, onSelect: () => { router.push(`/backend/staff/team-members/${row.id}`) } },
373
- { label: memberLabels.actions.unassign, onSelect: () => { void handleUnassignMember(row) } },
372
+ { id: 'edit', label: memberLabels.actions.edit, onSelect: () => { router.push(`/backend/staff/team-members/${row.id}`) } },
373
+ { id: 'unassign', label: memberLabels.actions.unassign, onSelect: () => { void handleUnassignMember(row) } },
374
374
  ]}
375
375
  />
376
376
  )}
@@ -275,10 +275,10 @@ export default function StaffTeamsPage() {
275
275
  rowActions={(row) => (
276
276
  <RowActions
277
277
  items={[
278
- { label: labels.actions.edit, href: `/backend/staff/teams/${row.id}/edit` },
278
+ { id: 'edit', label: labels.actions.edit, href: `/backend/staff/teams/${row.id}/edit` },
279
279
  ...(row.memberCount > 0
280
280
  ? []
281
- : [{ label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } }]),
281
+ : [{ id: 'delete', label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } }]),
282
282
  ]}
283
283
  />
284
284
  )}
@@ -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
  })
@@ -56,7 +56,7 @@ const seedDemo: ModuleCli = {
56
56
  })
57
57
 
58
58
  if (existing) {
59
- console.log(`✓ Demo workflow '${demoData.workflowId}' already exists (ID: ${existing.id})`)
59
+ console.log(`ℹ️ Demo workflow '${demoData.workflowId}' already exists (ID: ${existing.id})`)
60
60
  return
61
61
  }
62
62
 
@@ -69,7 +69,7 @@ const seedDemo: ModuleCli = {
69
69
 
70
70
  await em.persistAndFlush(workflow)
71
71
 
72
- console.log(`✓ Seeded demo workflow: ${workflow.workflowName}`)
72
+ console.log(`✅ Seeded demo workflow: ${workflow.workflowName}`)
73
73
  console.log(` - ID: ${workflow.id}`)
74
74
  console.log(` - Workflow ID: ${workflow.workflowId}`)
75
75
  console.log(` - Version: ${workflow.version}`)
@@ -107,15 +107,15 @@ const seedDemoWithRules: ModuleCli = {
107
107
  return
108
108
  }
109
109
 
110
- console.log('Seeding demo workflow with guard rules...\n')
110
+ console.log('🧩 Seeding demo workflow with guard rules...\n')
111
111
 
112
112
  try {
113
113
  // Seed the workflow definition
114
- console.log('1. Seeding demo workflow...')
114
+ console.log('1. 🧩 Seeding demo workflow...')
115
115
  await seedDemo.run(rest)
116
116
 
117
117
  // Seed the guard rules
118
- console.log('\n2. Seeding guard rules...')
118
+ console.log('\n2. 🧠 Seeding guard rules...')
119
119
  const { resolve } = await createRequestContainer()
120
120
  const em = resolve<EntityManager>('em')
121
121
 
@@ -153,7 +153,7 @@ const seedDemoWithRules: ModuleCli = {
153
153
  seededCount++
154
154
  }
155
155
 
156
- console.log(`\n Demo workflow with guard rules seeded successfully!`)
156
+ console.log(`\n Demo workflow with guard rules seeded successfully!`)
157
157
  console.log(` - Workflow: checkout_simple_v1`)
158
158
  console.log(` - Guard rules seeded: ${seededCount}`)
159
159
  console.log(` - Guard rules skipped: ${skippedCount}`)
@@ -195,7 +195,7 @@ const seedSalesPipeline: ModuleCli = {
195
195
  })
196
196
 
197
197
  if (existing) {
198
- console.log(`✓ Sales pipeline workflow '${pipelineData.workflowId}' already exists (ID: ${existing.id})`)
198
+ console.log(`ℹ️ Sales pipeline workflow '${pipelineData.workflowId}' already exists (ID: ${existing.id})`)
199
199
  return
200
200
  }
201
201
 
@@ -208,7 +208,7 @@ const seedSalesPipeline: ModuleCli = {
208
208
 
209
209
  await em.persistAndFlush(workflow)
210
210
 
211
- console.log(`✓ Seeded sales pipeline workflow: ${workflow.workflowName}`)
211
+ console.log(`✅ Seeded sales pipeline workflow: ${workflow.workflowName}`)
212
212
  console.log(` - ID: ${workflow.id}`)
213
213
  console.log(` - Workflow ID: ${workflow.workflowId}`)
214
214
  console.log(` - Version: ${workflow.version}`)
@@ -255,7 +255,7 @@ const seedSimpleApproval: ModuleCli = {
255
255
  })
256
256
 
257
257
  if (existing) {
258
- console.log(`✓ Simple approval workflow '${approvalData.workflowId}' already exists (ID: ${existing.id})`)
258
+ console.log(`ℹ️ Simple approval workflow '${approvalData.workflowId}' already exists (ID: ${existing.id})`)
259
259
  return
260
260
  }
261
261
 
@@ -268,7 +268,7 @@ const seedSimpleApproval: ModuleCli = {
268
268
 
269
269
  await em.persistAndFlush(workflow)
270
270
 
271
- console.log(`✓ Seeded simple approval workflow: ${workflow.workflowName}`)
271
+ console.log(`✅ Seeded simple approval workflow: ${workflow.workflowName}`)
272
272
  console.log(` - ID: ${workflow.id}`)
273
273
  console.log(` - Workflow ID: ${workflow.workflowId}`)
274
274
  console.log(` - Version: ${workflow.version}`)
@@ -351,7 +351,7 @@ const seedAll: ModuleCli = {
351
351
  return
352
352
  }
353
353
 
354
- console.log('Seeding all example workflows...\n')
354
+ console.log('🧩 Seeding all example workflows...\n')
355
355
 
356
356
  try {
357
357
  // Seed demo checkout with rules
@@ -366,7 +366,7 @@ const seedAll: ModuleCli = {
366
366
  await seedSimpleApproval.run(rest)
367
367
  console.log('')
368
368
 
369
- console.log(' All example workflows seeded successfully!')
369
+ console.log(' All example workflows seeded successfully!')
370
370
  } catch (error) {
371
371
  console.error('Error seeding workflows:', error)
372
372
  throw error
@@ -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) {