@open-mercato/core 0.4.2-canary-c71ef83148 → 0.4.2-canary-f821f89ef6

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 (632) hide show
  1. package/dist/generated/entities/workflow_event_trigger/index.js +33 -0
  2. package/dist/generated/entities/workflow_event_trigger/index.js.map +7 -0
  3. package/dist/generated/entities.ids.generated.js +2 -5
  4. package/dist/generated/entities.ids.generated.js.map +2 -2
  5. package/dist/generated/entity-fields-registry.js +2 -2
  6. package/dist/generated/entity-fields-registry.js.map +2 -2
  7. package/dist/modules/api_docs/frontend/docs/api/page.js +2 -3
  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 +0 -4
  12. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  13. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +0 -2
  14. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  15. package/dist/modules/auth/api/admin/nav.js +3 -4
  16. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  17. package/dist/modules/auth/api/login.js +6 -25
  18. package/dist/modules/auth/api/login.js.map +2 -2
  19. package/dist/modules/auth/api/reset/confirm.js +2 -25
  20. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  21. package/dist/modules/auth/api/reset.js +0 -23
  22. package/dist/modules/auth/api/reset.js.map +2 -2
  23. package/dist/modules/auth/api/sidebar/preferences/route.js +9 -14
  24. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  25. package/dist/modules/auth/api/users/route.js +2 -4
  26. package/dist/modules/auth/api/users/route.js.map +2 -2
  27. package/dist/modules/auth/backend/roles/[id]/edit/page.js +1 -4
  28. package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
  29. package/dist/modules/auth/backend/roles/page.js +3 -3
  30. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  31. package/dist/modules/auth/backend/users/[id]/edit/page.js +3 -18
  32. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  33. package/dist/modules/auth/backend/users/create/page.js +2 -15
  34. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  35. package/dist/modules/auth/backend/users/page.js +3 -3
  36. package/dist/modules/auth/backend/users/page.js.map +2 -2
  37. package/dist/modules/auth/cli.js +11 -25
  38. package/dist/modules/auth/cli.js.map +2 -2
  39. package/dist/modules/auth/commands/users.js +2 -59
  40. package/dist/modules/auth/commands/users.js.map +2 -2
  41. package/dist/modules/auth/data/validators.js +3 -6
  42. package/dist/modules/auth/data/validators.js.map +2 -2
  43. package/dist/modules/auth/events.js +30 -0
  44. package/dist/modules/auth/events.js.map +7 -0
  45. package/dist/modules/auth/frontend/login.js +3 -105
  46. package/dist/modules/auth/frontend/login.js.map +2 -2
  47. package/dist/modules/auth/frontend/reset/[token]/page.js +10 -20
  48. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  49. package/dist/modules/auth/lib/setup-app.js +8 -42
  50. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  51. package/dist/modules/auth/services/authService.js +3 -24
  52. package/dist/modules/auth/services/authService.js.map +2 -2
  53. package/dist/modules/business_rules/api/execute/[ruleId]/route.js +145 -0
  54. package/dist/modules/business_rules/api/execute/[ruleId]/route.js.map +7 -0
  55. package/dist/modules/business_rules/api/execute/route.js +1 -7
  56. package/dist/modules/business_rules/api/execute/route.js.map +2 -2
  57. package/dist/modules/business_rules/backend/rules/page.js +0 -4
  58. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  59. package/dist/modules/business_rules/backend/sets/page.js +0 -3
  60. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  61. package/dist/modules/business_rules/cli.js +1 -2
  62. package/dist/modules/business_rules/cli.js.map +2 -2
  63. package/dist/modules/business_rules/data/validators.js +34 -0
  64. package/dist/modules/business_rules/data/validators.js.map +2 -2
  65. package/dist/modules/business_rules/index.js +21 -1
  66. package/dist/modules/business_rules/index.js.map +2 -2
  67. package/dist/modules/business_rules/lib/rule-engine.js +185 -34
  68. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  69. package/dist/modules/catalog/components/PriceKindSettings.js +0 -2
  70. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  71. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  72. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  73. package/dist/modules/catalog/components/products/ProductsDataTable.js +0 -2
  74. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  75. package/dist/modules/catalog/events.js +34 -0
  76. package/dist/modules/catalog/events.js.map +7 -0
  77. package/dist/modules/configs/cli.js +0 -6
  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 +1 -48
  82. package/dist/modules/configs/lib/system-status.js.map +2 -2
  83. package/dist/modules/configs/lib/upgrade-actions.js +0 -18
  84. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  85. package/dist/modules/currencies/backend/currencies/page.js +0 -3
  86. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  87. package/dist/modules/currencies/backend/exchange-rates/page.js +0 -2
  88. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  89. package/dist/modules/customers/backend/customers/companies/page.js +0 -3
  90. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  91. package/dist/modules/customers/backend/customers/deals/page.js +0 -3
  92. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  93. package/dist/modules/customers/backend/customers/people/page.js +0 -3
  94. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  95. package/dist/modules/customers/commands/deals.js +0 -31
  96. package/dist/modules/customers/commands/deals.js.map +2 -2
  97. package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
  98. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  99. package/dist/modules/customers/events.js +49 -0
  100. package/dist/modules/customers/events.js.map +7 -0
  101. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js +1 -2
  102. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js.map +2 -2
  103. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js +1 -2
  104. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js.map +2 -2
  105. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js +1 -2
  106. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js.map +2 -2
  107. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js +1 -2
  108. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js.map +2 -2
  109. package/dist/modules/dashboards/cli.js +5 -44
  110. package/dist/modules/dashboards/cli.js.map +2 -2
  111. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +11 -16
  112. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
  113. package/dist/modules/dashboards/services/widgetDataService.js +3 -139
  114. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  115. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js +1 -2
  116. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js.map +2 -2
  117. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js +1 -2
  118. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js.map +2 -2
  119. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js +1 -2
  120. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js.map +2 -2
  121. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js +1 -2
  122. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js.map +2 -2
  123. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +1 -2
  124. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
  125. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js +1 -2
  126. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js.map +2 -2
  127. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js +1 -2
  128. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js.map +2 -2
  129. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js +1 -2
  130. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js.map +2 -2
  131. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js +1 -2
  132. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js.map +2 -2
  133. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js +1 -2
  134. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js.map +2 -2
  135. package/dist/modules/dictionaries/components/DictionaryTable.js +0 -2
  136. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  137. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  138. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  139. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  140. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  141. package/dist/modules/directory/events.js +23 -0
  142. package/dist/modules/directory/events.js.map +7 -0
  143. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  144. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  145. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  146. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  147. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  148. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  149. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  150. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  151. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  152. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  153. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  154. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  155. package/dist/modules/query_index/cli.js +7 -63
  156. package/dist/modules/query_index/cli.js.map +2 -2
  157. package/dist/modules/query_index/components/QueryIndexesTable.js +1 -7
  158. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  159. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  160. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  161. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  162. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  163. package/dist/modules/sales/acl.js +1 -0
  164. package/dist/modules/sales/acl.js.map +2 -2
  165. package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -2
  166. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  167. package/dist/modules/sales/backend/sales/channels/page.js +0 -2
  168. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  169. package/dist/modules/sales/backend/sales/documents/[id]/page.js +12 -0
  170. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  171. package/dist/modules/sales/commands/documents.js +62 -53
  172. package/dist/modules/sales/commands/documents.js.map +2 -2
  173. package/dist/modules/sales/commands/payments.js +0 -26
  174. package/dist/modules/sales/commands/payments.js.map +2 -2
  175. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  176. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  177. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  178. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  179. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  180. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  181. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  182. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  183. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -2
  184. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  185. package/dist/modules/sales/components/documents/AdjustmentsSection.js +0 -2
  186. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  187. package/dist/modules/sales/components/documents/PaymentsSection.js +1 -2
  188. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  189. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +0 -2
  190. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  191. package/dist/modules/sales/events.js +63 -0
  192. package/dist/modules/sales/events.js.map +7 -0
  193. package/dist/modules/sales/lib/dictionaries.js +3 -0
  194. package/dist/modules/sales/lib/dictionaries.js.map +2 -2
  195. package/dist/modules/sales/lib/frontend/documentDataEvents.js +25 -0
  196. package/dist/modules/sales/lib/frontend/documentDataEvents.js.map +7 -0
  197. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  198. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  199. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  200. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  201. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  202. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  203. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  204. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  205. package/dist/modules/staff/commands/leave-requests.js +0 -79
  206. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  207. package/dist/modules/workflows/acl.js +2 -0
  208. package/dist/modules/workflows/acl.js.map +2 -2
  209. package/dist/modules/workflows/api/instances/route.js +18 -6
  210. package/dist/modules/workflows/api/instances/route.js.map +2 -2
  211. package/dist/modules/workflows/api/tasks/route.js +6 -1
  212. package/dist/modules/workflows/api/tasks/route.js.map +2 -2
  213. package/dist/modules/workflows/backend/definitions/[id]/page.js +9 -1
  214. package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
  215. package/dist/modules/workflows/backend/definitions/[id]/page.meta.js +1 -1
  216. package/dist/modules/workflows/backend/definitions/[id]/page.meta.js.map +2 -2
  217. package/dist/modules/workflows/backend/definitions/create/page.js +24 -15
  218. package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
  219. package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
  220. package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
  221. package/dist/modules/workflows/backend/definitions/page.js +0 -5
  222. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  223. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +150 -132
  224. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  225. package/dist/modules/workflows/backend/definitions/visual-editor/page.meta.js +1 -1
  226. package/dist/modules/workflows/backend/definitions/visual-editor/page.meta.js.map +2 -2
  227. package/dist/modules/workflows/backend/events/[id]/page.js +1 -1
  228. package/dist/modules/workflows/backend/events/[id]/page.js.map +2 -2
  229. package/dist/modules/workflows/backend/events/[id]/page.meta.js +2 -2
  230. package/dist/modules/workflows/backend/events/[id]/page.meta.js.map +2 -2
  231. package/dist/modules/workflows/backend/instances/[id]/page.meta.js +2 -2
  232. package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +2 -2
  233. package/dist/modules/workflows/backend/instances/page.js +0 -3
  234. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  235. package/dist/modules/workflows/backend/tasks/[id]/page.js +1 -1
  236. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  237. package/dist/modules/workflows/backend/tasks/[id]/page.meta.js +2 -2
  238. package/dist/modules/workflows/backend/tasks/[id]/page.meta.js.map +2 -2
  239. package/dist/modules/workflows/backend/tasks/page.js +5 -9
  240. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  241. package/dist/modules/workflows/cli.js +93 -15
  242. package/dist/modules/workflows/cli.js.map +3 -3
  243. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +481 -0
  244. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +7 -0
  245. package/dist/modules/workflows/components/EventTriggersEditor.js +553 -0
  246. package/dist/modules/workflows/components/EventTriggersEditor.js.map +7 -0
  247. package/dist/modules/workflows/data/entities.js +64 -1
  248. package/dist/modules/workflows/data/entities.js.map +2 -2
  249. package/dist/modules/workflows/data/validators.js +115 -0
  250. package/dist/modules/workflows/data/validators.js.map +2 -2
  251. package/dist/modules/workflows/events.js +38 -0
  252. package/dist/modules/workflows/events.js.map +7 -0
  253. package/dist/modules/workflows/examples/checkout-demo-definition.json +1 -5
  254. package/dist/modules/workflows/examples/order-approval-definition.json +257 -0
  255. package/dist/modules/workflows/examples/order-approval-guard-rules.json +32 -0
  256. package/dist/modules/workflows/lib/activity-executor.js +75 -13
  257. package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
  258. package/dist/modules/workflows/lib/event-trigger-service.js +308 -0
  259. package/dist/modules/workflows/lib/event-trigger-service.js.map +7 -0
  260. package/dist/modules/workflows/lib/graph-utils.js +71 -2
  261. package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
  262. package/dist/modules/workflows/lib/seeds.js +22 -5
  263. package/dist/modules/workflows/lib/seeds.js.map +2 -2
  264. package/dist/modules/workflows/lib/start-validator.js +33 -23
  265. package/dist/modules/workflows/lib/start-validator.js.map +2 -2
  266. package/dist/modules/workflows/lib/transition-handler.js +161 -57
  267. package/dist/modules/workflows/lib/transition-handler.js.map +3 -3
  268. package/dist/modules/workflows/migrations/Migration20260123143500.js +36 -0
  269. package/dist/modules/workflows/migrations/Migration20260123143500.js.map +7 -0
  270. package/dist/modules/workflows/subscribers/event-trigger.js +78 -0
  271. package/dist/modules/workflows/subscribers/event-trigger.js.map +7 -0
  272. package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js +323 -0
  273. package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js.map +7 -0
  274. package/dist/modules/workflows/widgets/injection/order-approval/widget.js +17 -0
  275. package/dist/modules/workflows/widgets/injection/order-approval/widget.js.map +7 -0
  276. package/dist/modules/workflows/widgets/injection-table.js +19 -0
  277. package/dist/modules/workflows/widgets/injection-table.js.map +7 -0
  278. package/generated/entities/workflow_event_trigger/index.ts +15 -0
  279. package/generated/entities.ids.generated.ts +2 -5
  280. package/generated/entity-fields-registry.ts +2 -2
  281. package/package.json +2 -2
  282. package/src/modules/api_docs/frontend/docs/api/page.tsx +2 -3
  283. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  284. package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -4
  285. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +0 -2
  286. package/src/modules/auth/README.md +1 -1
  287. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
  288. package/src/modules/auth/api/__tests__/login.test.ts +0 -2
  289. package/src/modules/auth/api/admin/nav.ts +6 -10
  290. package/src/modules/auth/api/login.ts +7 -26
  291. package/src/modules/auth/api/reset/confirm.ts +2 -25
  292. package/src/modules/auth/api/reset.ts +0 -23
  293. package/src/modules/auth/api/sidebar/preferences/route.ts +12 -21
  294. package/src/modules/auth/api/users/route.ts +2 -5
  295. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +1 -4
  296. package/src/modules/auth/backend/roles/page.tsx +3 -3
  297. package/src/modules/auth/backend/users/[id]/edit/page.tsx +3 -22
  298. package/src/modules/auth/backend/users/create/page.tsx +2 -19
  299. package/src/modules/auth/backend/users/page.tsx +3 -3
  300. package/src/modules/auth/cli.ts +11 -38
  301. package/src/modules/auth/commands/users.ts +2 -73
  302. package/src/modules/auth/data/validators.ts +2 -6
  303. package/src/modules/auth/events.ts +39 -0
  304. package/src/modules/auth/frontend/login.tsx +5 -131
  305. package/src/modules/auth/frontend/reset/[token]/page.tsx +11 -24
  306. package/src/modules/auth/i18n/de.json +1 -48
  307. package/src/modules/auth/i18n/en.json +1 -48
  308. package/src/modules/auth/i18n/es.json +1 -48
  309. package/src/modules/auth/i18n/pl.json +1 -48
  310. package/src/modules/auth/lib/setup-app.ts +9 -58
  311. package/src/modules/auth/services/authService.ts +4 -27
  312. package/src/modules/business_rules/api/execute/[ruleId]/route.ts +163 -0
  313. package/src/modules/business_rules/api/execute/route.ts +1 -8
  314. package/src/modules/business_rules/backend/rules/page.tsx +0 -4
  315. package/src/modules/business_rules/backend/sets/page.tsx +0 -3
  316. package/src/modules/business_rules/cli.ts +1 -2
  317. package/src/modules/business_rules/data/validators.ts +40 -0
  318. package/src/modules/business_rules/i18n/en.json +1 -3
  319. package/src/modules/business_rules/index.ts +25 -0
  320. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -51
  321. package/src/modules/business_rules/lib/rule-engine.ts +277 -51
  322. package/src/modules/catalog/components/PriceKindSettings.tsx +0 -2
  323. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  324. package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -2
  325. package/src/modules/catalog/events.ts +45 -0
  326. package/src/modules/catalog/i18n/en.json +1 -3
  327. package/src/modules/configs/cli.ts +0 -6
  328. package/src/modules/configs/components/CachePanel.tsx +4 -4
  329. package/src/modules/configs/i18n/en.json +2 -12
  330. package/src/modules/configs/i18n/pl.json +2 -12
  331. package/src/modules/configs/lib/system-status.ts +1 -48
  332. package/src/modules/configs/lib/system-status.types.ts +0 -1
  333. package/src/modules/configs/lib/upgrade-actions.ts +0 -18
  334. package/src/modules/currencies/backend/currencies/page.tsx +0 -3
  335. package/src/modules/currencies/backend/exchange-rates/page.tsx +0 -2
  336. package/src/modules/customers/backend/customers/companies/page.tsx +0 -3
  337. package/src/modules/customers/backend/customers/deals/page.tsx +0 -3
  338. package/src/modules/customers/backend/customers/people/page.tsx +0 -3
  339. package/src/modules/customers/commands/deals.ts +0 -39
  340. package/src/modules/customers/components/CustomerTodosTable.tsx +0 -1
  341. package/src/modules/customers/events.ts +63 -0
  342. package/src/modules/customers/i18n/en.json +1 -5
  343. package/src/modules/customers/widgets/dashboard/customer-todos/widget.ts +2 -2
  344. package/src/modules/customers/widgets/dashboard/new-customers/widget.ts +2 -2
  345. package/src/modules/customers/widgets/dashboard/new-deals/widget.ts +2 -2
  346. package/src/modules/customers/widgets/dashboard/next-interactions/widget.ts +2 -2
  347. package/src/modules/dashboards/cli.ts +5 -55
  348. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +11 -22
  349. package/src/modules/dashboards/services/widgetDataService.ts +4 -164
  350. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.ts +2 -2
  351. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.ts +2 -2
  352. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.ts +2 -2
  353. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.ts +2 -2
  354. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
  355. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.ts +2 -2
  356. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.ts +2 -2
  357. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.ts +2 -2
  358. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.ts +2 -2
  359. package/src/modules/dashboards/widgets/dashboard/top-products/widget.ts +2 -2
  360. package/src/modules/dictionaries/components/DictionaryTable.tsx +0 -2
  361. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  362. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  363. package/src/modules/directory/events.ts +31 -0
  364. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  365. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  366. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  367. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +4 -3
  368. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  369. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  370. package/src/modules/query_index/cli.ts +13 -82
  371. package/src/modules/query_index/components/QueryIndexesTable.tsx +2 -8
  372. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  373. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  374. package/src/modules/sales/acl.ts +1 -0
  375. package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -2
  376. package/src/modules/sales/backend/sales/channels/page.tsx +0 -2
  377. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +16 -0
  378. package/src/modules/sales/commands/documents.ts +70 -62
  379. package/src/modules/sales/commands/payments.ts +0 -33
  380. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  381. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  382. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  383. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  384. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -2
  385. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +0 -2
  386. package/src/modules/sales/components/documents/PaymentsSection.tsx +1 -2
  387. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +0 -2
  388. package/src/modules/sales/events.ts +82 -0
  389. package/src/modules/sales/i18n/de.json +0 -20
  390. package/src/modules/sales/i18n/en.json +1 -25
  391. package/src/modules/sales/i18n/es.json +0 -20
  392. package/src/modules/sales/i18n/pl.json +0 -20
  393. package/src/modules/sales/lib/dictionaries.ts +3 -0
  394. package/src/modules/sales/lib/frontend/documentDataEvents.ts +28 -0
  395. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  396. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  397. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  398. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  399. package/src/modules/staff/commands/leave-requests.ts +0 -94
  400. package/src/modules/staff/i18n/de.json +0 -4
  401. package/src/modules/staff/i18n/en.json +1 -9
  402. package/src/modules/staff/i18n/es.json +0 -4
  403. package/src/modules/staff/i18n/pl.json +0 -4
  404. package/src/modules/workflows/acl.ts +2 -0
  405. package/src/modules/workflows/api/__tests__/instances.route.test.ts +5 -2
  406. package/src/modules/workflows/api/instances/route.ts +21 -7
  407. package/src/modules/workflows/api/tasks/route.ts +7 -1
  408. package/src/modules/workflows/backend/definitions/[id]/page.meta.ts +1 -1
  409. package/src/modules/workflows/backend/definitions/[id]/page.tsx +9 -0
  410. package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
  411. package/src/modules/workflows/backend/definitions/create/page.tsx +9 -0
  412. package/src/modules/workflows/backend/definitions/page.tsx +0 -5
  413. package/src/modules/workflows/backend/definitions/visual-editor/page.meta.ts +1 -1
  414. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +21 -3
  415. package/src/modules/workflows/backend/events/[id]/page.meta.ts +2 -2
  416. package/src/modules/workflows/backend/events/[id]/page.tsx +1 -1
  417. package/src/modules/workflows/backend/instances/[id]/page.meta.ts +2 -2
  418. package/src/modules/workflows/backend/instances/page.tsx +1 -4
  419. package/src/modules/workflows/backend/tasks/[id]/page.meta.ts +2 -2
  420. package/src/modules/workflows/backend/tasks/[id]/page.tsx +1 -1
  421. package/src/modules/workflows/backend/tasks/page.tsx +6 -10
  422. package/src/modules/workflows/cli.ts +123 -12
  423. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +581 -0
  424. package/src/modules/workflows/components/EventTriggersEditor.tsx +664 -0
  425. package/src/modules/workflows/data/entities.ts +124 -0
  426. package/src/modules/workflows/data/validators.ts +138 -0
  427. package/src/modules/workflows/events.ts +49 -0
  428. package/src/modules/workflows/examples/checkout-demo-definition.json +1 -5
  429. package/src/modules/workflows/examples/order-approval-definition.json +257 -0
  430. package/src/modules/workflows/examples/order-approval-guard-rules.json +32 -0
  431. package/src/modules/workflows/i18n/en.json +72 -3
  432. package/src/modules/workflows/lib/__tests__/activity-executor.test.ts +43 -36
  433. package/src/modules/workflows/lib/__tests__/transition-handler.test.ts +170 -90
  434. package/src/modules/workflows/lib/activity-executor.ts +129 -16
  435. package/src/modules/workflows/lib/event-trigger-service.ts +557 -0
  436. package/src/modules/workflows/lib/graph-utils.ts +117 -2
  437. package/src/modules/workflows/lib/seeds.ts +34 -8
  438. package/src/modules/workflows/lib/start-validator.ts +38 -28
  439. package/src/modules/workflows/lib/transition-handler.ts +212 -71
  440. package/src/modules/workflows/migrations/Migration20260123143500.ts +38 -0
  441. package/src/modules/workflows/subscribers/event-trigger.ts +109 -0
  442. package/src/modules/workflows/widgets/injection/order-approval/widget.client.tsx +446 -0
  443. package/src/modules/workflows/widgets/injection/order-approval/widget.ts +16 -0
  444. package/src/modules/workflows/widgets/injection-table.ts +21 -0
  445. package/dist/generated/entities/notification/index.js +0 -57
  446. package/dist/generated/entities/notification/index.js.map +0 -7
  447. package/dist/modules/auth/api/profile/route.js +0 -157
  448. package/dist/modules/auth/api/profile/route.js.map +0 -7
  449. package/dist/modules/auth/backend/auth/profile/page.js +0 -141
  450. package/dist/modules/auth/backend/auth/profile/page.js.map +0 -7
  451. package/dist/modules/auth/backend/auth/profile/page.meta.js +0 -13
  452. package/dist/modules/auth/backend/auth/profile/page.meta.js.map +0 -7
  453. package/dist/modules/auth/notifications.js +0 -112
  454. package/dist/modules/auth/notifications.js.map +0 -7
  455. package/dist/modules/business_rules/notifications.js +0 -28
  456. package/dist/modules/business_rules/notifications.js.map +0 -7
  457. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +0 -37
  458. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +0 -7
  459. package/dist/modules/catalog/notifications.js +0 -28
  460. package/dist/modules/catalog/notifications.js.map +0 -7
  461. package/dist/modules/catalog/subscribers/low-stock-notification.js +0 -38
  462. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +0 -7
  463. package/dist/modules/customers/notifications.js +0 -48
  464. package/dist/modules/customers/notifications.js.map +0 -7
  465. package/dist/modules/dashboards/lib/role-widgets.js +0 -58
  466. package/dist/modules/dashboards/lib/role-widgets.js.map +0 -7
  467. package/dist/modules/directory/api/get/tenants/lookup.js +0 -70
  468. package/dist/modules/directory/api/get/tenants/lookup.js.map +0 -7
  469. package/dist/modules/notifications/acl.js +0 -11
  470. package/dist/modules/notifications/acl.js.map +0 -7
  471. package/dist/modules/notifications/api/[id]/action/route.js +0 -74
  472. package/dist/modules/notifications/api/[id]/action/route.js.map +0 -7
  473. package/dist/modules/notifications/api/[id]/dismiss/route.js +0 -15
  474. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +0 -7
  475. package/dist/modules/notifications/api/[id]/read/route.js +0 -15
  476. package/dist/modules/notifications/api/[id]/read/route.js.map +0 -7
  477. package/dist/modules/notifications/api/[id]/restore/route.js +0 -53
  478. package/dist/modules/notifications/api/[id]/restore/route.js.map +0 -7
  479. package/dist/modules/notifications/api/batch/route.js +0 -17
  480. package/dist/modules/notifications/api/batch/route.js.map +0 -7
  481. package/dist/modules/notifications/api/feature/route.js +0 -17
  482. package/dist/modules/notifications/api/feature/route.js.map +0 -7
  483. package/dist/modules/notifications/api/mark-all-read/route.js +0 -35
  484. package/dist/modules/notifications/api/mark-all-read/route.js.map +0 -7
  485. package/dist/modules/notifications/api/openapi.js +0 -76
  486. package/dist/modules/notifications/api/openapi.js.map +0 -7
  487. package/dist/modules/notifications/api/role/route.js +0 -17
  488. package/dist/modules/notifications/api/role/route.js.map +0 -7
  489. package/dist/modules/notifications/api/route.js +0 -85
  490. package/dist/modules/notifications/api/route.js.map +0 -7
  491. package/dist/modules/notifications/api/settings/route.js +0 -155
  492. package/dist/modules/notifications/api/settings/route.js.map +0 -7
  493. package/dist/modules/notifications/api/unread-count/route.js +0 -38
  494. package/dist/modules/notifications/api/unread-count/route.js.map +0 -7
  495. package/dist/modules/notifications/backend/config/notifications/page.js +0 -10
  496. package/dist/modules/notifications/backend/config/notifications/page.js.map +0 -7
  497. package/dist/modules/notifications/backend/config/notifications/page.meta.js +0 -24
  498. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +0 -7
  499. package/dist/modules/notifications/cli.js +0 -16
  500. package/dist/modules/notifications/cli.js.map +0 -7
  501. package/dist/modules/notifications/data/entities.js +0 -112
  502. package/dist/modules/notifications/data/entities.js.map +0 -7
  503. package/dist/modules/notifications/data/validators.js +0 -98
  504. package/dist/modules/notifications/data/validators.js.map +0 -7
  505. package/dist/modules/notifications/di.js +0 -13
  506. package/dist/modules/notifications/di.js.map +0 -7
  507. package/dist/modules/notifications/emails/NotificationEmail.js +0 -58
  508. package/dist/modules/notifications/emails/NotificationEmail.js.map +0 -7
  509. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +0 -44
  510. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +0 -7
  511. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +0 -220
  512. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +0 -7
  513. package/dist/modules/notifications/index.js +0 -14
  514. package/dist/modules/notifications/index.js.map +0 -7
  515. package/dist/modules/notifications/lib/deliveryConfig.js +0 -107
  516. package/dist/modules/notifications/lib/deliveryConfig.js.map +0 -7
  517. package/dist/modules/notifications/lib/deliveryStrategies.js +0 -14
  518. package/dist/modules/notifications/lib/deliveryStrategies.js.map +0 -7
  519. package/dist/modules/notifications/lib/events.js +0 -12
  520. package/dist/modules/notifications/lib/events.js.map +0 -7
  521. package/dist/modules/notifications/lib/notificationBuilder.js +0 -66
  522. package/dist/modules/notifications/lib/notificationBuilder.js.map +0 -7
  523. package/dist/modules/notifications/lib/notificationFactory.js +0 -54
  524. package/dist/modules/notifications/lib/notificationFactory.js.map +0 -7
  525. package/dist/modules/notifications/lib/notificationMapper.js +0 -34
  526. package/dist/modules/notifications/lib/notificationMapper.js.map +0 -7
  527. package/dist/modules/notifications/lib/notificationRecipients.js +0 -35
  528. package/dist/modules/notifications/lib/notificationRecipients.js.map +0 -7
  529. package/dist/modules/notifications/lib/notificationService.js +0 -279
  530. package/dist/modules/notifications/lib/notificationService.js.map +0 -7
  531. package/dist/modules/notifications/lib/routeHelpers.js +0 -101
  532. package/dist/modules/notifications/lib/routeHelpers.js.map +0 -7
  533. package/dist/modules/notifications/lib/safeHref.js +0 -24
  534. package/dist/modules/notifications/lib/safeHref.js.map +0 -7
  535. package/dist/modules/notifications/migrations/Migration20260123000001.js +0 -70
  536. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +0 -7
  537. package/dist/modules/notifications/migrations/Migration20260126150000.js +0 -37
  538. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +0 -7
  539. package/dist/modules/notifications/migrations/Migration20260129082610.js +0 -13
  540. package/dist/modules/notifications/migrations/Migration20260129082610.js.map +0 -7
  541. package/dist/modules/notifications/subscribers/deliver-notification.js +0 -165
  542. package/dist/modules/notifications/subscribers/deliver-notification.js.map +0 -7
  543. package/dist/modules/notifications/workers/create-notification.worker.js +0 -70
  544. package/dist/modules/notifications/workers/create-notification.worker.js.map +0 -7
  545. package/dist/modules/sales/notifications.client.js +0 -51
  546. package/dist/modules/sales/notifications.client.js.map +0 -7
  547. package/dist/modules/sales/notifications.js +0 -88
  548. package/dist/modules/sales/notifications.js.map +0 -7
  549. package/dist/modules/sales/subscribers/quote-expiring-notification.js +0 -38
  550. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +0 -7
  551. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -137
  552. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +0 -7
  553. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -137
  554. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +0 -7
  555. package/dist/modules/sales/widgets/notifications/index.js +0 -7
  556. package/dist/modules/sales/widgets/notifications/index.js.map +0 -7
  557. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +0 -60
  558. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +0 -7
  559. package/dist/modules/staff/notifications.js +0 -75
  560. package/dist/modules/staff/notifications.js.map +0 -7
  561. package/dist/modules/workflows/notifications.js +0 -28
  562. package/dist/modules/workflows/notifications.js.map +0 -7
  563. package/dist/modules/workflows/subscribers/task-assigned-notification.js +0 -38
  564. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +0 -7
  565. package/generated/entities/notification/index.ts +0 -27
  566. package/src/modules/auth/api/profile/route.ts +0 -163
  567. package/src/modules/auth/backend/auth/profile/page.meta.ts +0 -9
  568. package/src/modules/auth/backend/auth/profile/page.tsx +0 -174
  569. package/src/modules/auth/notifications.ts +0 -109
  570. package/src/modules/business_rules/notifications.ts +0 -25
  571. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +0 -50
  572. package/src/modules/catalog/notifications.ts +0 -25
  573. package/src/modules/catalog/subscribers/low-stock-notification.ts +0 -52
  574. package/src/modules/customers/notifications.ts +0 -44
  575. package/src/modules/dashboards/lib/role-widgets.ts +0 -80
  576. package/src/modules/directory/api/get/tenants/lookup.ts +0 -75
  577. package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -195
  578. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
  579. package/src/modules/notifications/__tests__/notificationService.test.ts +0 -208
  580. package/src/modules/notifications/acl.ts +0 -7
  581. package/src/modules/notifications/api/[id]/action/route.ts +0 -75
  582. package/src/modules/notifications/api/[id]/dismiss/route.ts +0 -12
  583. package/src/modules/notifications/api/[id]/read/route.ts +0 -12
  584. package/src/modules/notifications/api/[id]/restore/route.ts +0 -53
  585. package/src/modules/notifications/api/batch/route.ts +0 -14
  586. package/src/modules/notifications/api/feature/route.ts +0 -14
  587. package/src/modules/notifications/api/mark-all-read/route.ts +0 -34
  588. package/src/modules/notifications/api/openapi.ts +0 -76
  589. package/src/modules/notifications/api/role/route.ts +0 -14
  590. package/src/modules/notifications/api/route.ts +0 -92
  591. package/src/modules/notifications/api/settings/route.ts +0 -157
  592. package/src/modules/notifications/api/unread-count/route.ts +0 -38
  593. package/src/modules/notifications/backend/config/notifications/page.meta.ts +0 -22
  594. package/src/modules/notifications/backend/config/notifications/page.tsx +0 -12
  595. package/src/modules/notifications/cli.ts +0 -18
  596. package/src/modules/notifications/data/entities.ts +0 -99
  597. package/src/modules/notifications/data/validators.ts +0 -115
  598. package/src/modules/notifications/di.ts +0 -11
  599. package/src/modules/notifications/emails/NotificationEmail.tsx +0 -98
  600. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +0 -42
  601. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +0 -233
  602. package/src/modules/notifications/i18n/de.json +0 -50
  603. package/src/modules/notifications/i18n/en.json +0 -50
  604. package/src/modules/notifications/i18n/es.json +0 -50
  605. package/src/modules/notifications/i18n/pl.json +0 -50
  606. package/src/modules/notifications/index.ts +0 -12
  607. package/src/modules/notifications/lib/deliveryConfig.ts +0 -153
  608. package/src/modules/notifications/lib/deliveryStrategies.ts +0 -50
  609. package/src/modules/notifications/lib/events.ts +0 -48
  610. package/src/modules/notifications/lib/notificationBuilder.ts +0 -121
  611. package/src/modules/notifications/lib/notificationFactory.ts +0 -76
  612. package/src/modules/notifications/lib/notificationMapper.ts +0 -33
  613. package/src/modules/notifications/lib/notificationRecipients.ts +0 -83
  614. package/src/modules/notifications/lib/notificationService.ts +0 -414
  615. package/src/modules/notifications/lib/routeHelpers.ts +0 -151
  616. package/src/modules/notifications/lib/safeHref.ts +0 -29
  617. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +0 -336
  618. package/src/modules/notifications/migrations/Migration20260123000001.ts +0 -73
  619. package/src/modules/notifications/migrations/Migration20260126150000.ts +0 -39
  620. package/src/modules/notifications/migrations/Migration20260129082610.ts +0 -13
  621. package/src/modules/notifications/subscribers/deliver-notification.ts +0 -204
  622. package/src/modules/notifications/workers/create-notification.worker.ts +0 -122
  623. package/src/modules/sales/notifications.client.ts +0 -65
  624. package/src/modules/sales/notifications.ts +0 -82
  625. package/src/modules/sales/subscribers/quote-expiring-notification.ts +0 -53
  626. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -156
  627. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -156
  628. package/src/modules/sales/widgets/notifications/index.ts +0 -2
  629. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +0 -81
  630. package/src/modules/staff/notifications.ts +0 -71
  631. package/src/modules/workflows/notifications.ts +0 -25
  632. package/src/modules/workflows/subscribers/task-assigned-notification.ts +0 -53
@@ -2,26 +2,12 @@
2
2
  "auth.signIn": "Iniciar sesión",
3
3
  "auth.email": "Correo electrónico",
4
4
  "auth.password": "Contraseña",
5
- "auth.password.requirements.help": "Requisitos de la contraseña: {requirements}",
6
- "auth.password.requirements.minLength": "Al menos {min} caracteres",
7
- "auth.password.requirements.digit": "Un número",
8
- "auth.password.requirements.uppercase": "Una letra mayúscula",
9
- "auth.password.requirements.special": "Un carácter especial",
10
- "auth.password.requirements.separator": ", ",
11
5
  "auth.sendResetLink": "Enviar enlace de restablecimiento",
12
6
  "auth.resetPassword": "Restablecer contraseña",
13
- "auth.reset.title": "Establecer una nueva contraseña",
14
- "auth.reset.subtitle": "Elige una contraseña segura para tu cuenta.",
15
- "auth.reset.form.password": "Nueva contraseña",
16
- "auth.reset.form.loading": "...",
17
- "auth.reset.form.submit": "Actualizar contraseña",
18
- "auth.reset.errors.failed": "No se pudo restablecer la contraseña",
19
7
  "auth.usersRoles": "Usuarios y roles",
20
8
  "auth.manageAuthSettings": "Administra la configuración de autenticación.",
21
9
  "auth.login.errors.permissionDenied": "No tienes permiso para acceder a esta área. Ponte en contacto con tu administrador.",
22
10
  "auth.login.errors.invalidCredentials": "Correo electrónico o contraseña no válidos",
23
- "auth.login.errors.tenantRequired": "Usa el enlace de inicio de sesión proporcionado con la activación de tu inquilino para continuar.",
24
- "auth.login.errors.tenantInvalid": "No se encontró el inquilino. Borra la selección e inténtalo de nuevo.",
25
11
  "auth.login.errors.generic": "Se produjo un error. Inténtalo de nuevo.",
26
12
  "auth.login.logoAlt": "Logotipo de Open Mercato",
27
13
  "auth.login.brandName": "Open Mercato",
@@ -29,9 +15,6 @@
29
15
  "auth.login.requireRoleMessage": "El acceso requiere el rol: {roles}",
30
16
  "auth.login.requireRolesMessage": "El acceso requiere uno de los siguientes roles: {roles}",
31
17
  "auth.login.featureDenied": "No tienes acceso a esta funcionalidad ({feature}). Ponte en contacto con tu administrador.",
32
- "auth.login.tenantBanner": "Estás iniciando sesión en el inquilino {tenant}.",
33
- "auth.login.tenantLoading": "Cargando detalles del inquilino...",
34
- "auth.login.tenantClear": "Borrar",
35
18
  "auth.login.rememberMe": "Recordarme",
36
19
  "auth.login.loading": "Cargando...",
37
20
  "auth.login.forgotPassword": "¿Olvidaste tu contraseña?",
@@ -97,21 +80,6 @@
97
80
  "auth.users.form.errors.load": "No se pudieron cargar los datos del usuario",
98
81
  "auth.users.form.errors.aclUpdate": "No se pudo actualizar el control de acceso del usuario",
99
82
  "auth.users.form.errors.delete": "No se pudo eliminar el usuario",
100
- "auth.profile.title": "Perfil",
101
- "auth.profile.subtitle": "Cambiar contraseña",
102
- "auth.profile.form.email": "Correo electrónico",
103
- "auth.profile.form.password": "Nueva contraseña",
104
- "auth.profile.form.confirmPassword": "Confirmar nueva contraseña",
105
- "auth.profile.form.save": "Guardar cambios",
106
- "auth.profile.form.loading": "Cargando perfil...",
107
- "auth.profile.form.errors.load": "No se pudo cargar el perfil.",
108
- "auth.profile.form.errors.save": "No se pudo actualizar el perfil.",
109
- "auth.profile.form.errors.invalid": "Actualización de perfil inválida.",
110
- "auth.profile.form.errors.passwordMismatch": "Las contraseñas no coinciden.",
111
- "auth.profile.form.errors.passwordRequirements": "La contraseña debe cumplir los requisitos.",
112
- "auth.profile.form.errors.noChanges": "No hay cambios para guardar.",
113
- "auth.profile.form.errors.emailRequired": "El correo electrónico es obligatorio.",
114
- "auth.profile.form.success": "Perfil actualizado.",
115
83
  "auth.users.list.error.load": "No se pudieron cargar los usuarios",
116
84
  "auth.users.list.error.delete": "No se pudo eliminar el usuario",
117
85
  "auth.users.flash.created": "Usuario creado",
@@ -127,20 +95,5 @@
127
95
  "auth.email.resetPassword.title": "Restablecer tu contraseña",
128
96
  "auth.email.resetPassword.body": "Haz clic en el siguiente enlace para establecer una nueva contraseña. Este enlace caducará en 60 minutos.",
129
97
  "auth.email.resetPassword.cta": "Establecer nueva contraseña",
130
- "auth.email.resetPassword.hint": "Si no solicitaste esto, puedes ignorar este correo de forma segura.",
131
- "auth.notifications.passwordReset.requested.title": "Solicitud de restablecimiento de contraseña",
132
- "auth.notifications.passwordReset.requested.body": "Se ha enviado un enlace de restablecimiento de contraseña a tu correo electrónico",
133
- "auth.notifications.passwordReset.completed.title": "Contraseña cambiada correctamente",
134
- "auth.notifications.passwordReset.completed.body": "Tu contraseña se actualizó correctamente",
135
- "auth.notifications.account.locked.title": "Cuenta bloqueada",
136
- "auth.notifications.account.locked.body": "Tu cuenta ha sido bloqueada por razones de seguridad. Ponte en contacto con soporte.",
137
- "auth.notifications.login.newDevice.title": "Nuevo inicio de sesión detectado",
138
- "auth.notifications.login.newDevice.body": "Se detectó un inicio de sesión desde un dispositivo no reconocido en tu cuenta",
139
- "auth.notifications.role.assigned.title": "Nuevo rol asignado",
140
- "auth.notifications.role.assigned.body": "Se te ha asignado un nuevo rol con permisos adicionales",
141
- "auth.notifications.role.revoked.title": "Rol eliminado",
142
- "auth.notifications.role.revoked.body": "Se ha eliminado un rol de tu cuenta",
143
- "auth.actions.contactSupport": "Contactar soporte",
144
- "auth.actions.viewSessions": "Ver sesiones",
145
- "auth.actions.viewPermissions": "Ver permisos"
98
+ "auth.email.resetPassword.hint": "Si no solicitaste esto, puedes ignorar este correo de forma segura."
146
99
  }
@@ -2,26 +2,12 @@
2
2
  "auth.signIn": "Zaloguj się",
3
3
  "auth.email": "Email",
4
4
  "auth.password": "Hasło",
5
- "auth.password.requirements.help": "Wymagania hasła: {requirements}",
6
- "auth.password.requirements.minLength": "Co najmniej {min} znaków",
7
- "auth.password.requirements.digit": "Jedna cyfra",
8
- "auth.password.requirements.uppercase": "Jedna wielka litera",
9
- "auth.password.requirements.special": "Jeden znak specjalny",
10
- "auth.password.requirements.separator": ", ",
11
5
  "auth.sendResetLink": "Wyślij link resetujący",
12
6
  "auth.resetPassword": "Resetuj hasło",
13
- "auth.reset.title": "Ustaw nowe hasło",
14
- "auth.reset.subtitle": "Wybierz silne hasło dla swojego konta.",
15
- "auth.reset.form.password": "Nowe hasło",
16
- "auth.reset.form.loading": "...",
17
- "auth.reset.form.submit": "Zaktualizuj hasło",
18
- "auth.reset.errors.failed": "Nie udało się zresetować hasła",
19
7
  "auth.usersRoles": "Użytkownicy i role",
20
8
  "auth.manageAuthSettings": "Zarządzaj ustawieniami uwierzytelniania.",
21
9
  "auth.login.errors.permissionDenied": "Nie masz uprawnień do tego obszaru. Skontaktuj się z administratorem.",
22
10
  "auth.login.errors.invalidCredentials": "Nieprawidłowy email lub hasło",
23
- "auth.login.errors.tenantRequired": "Użyj linku logowania z aktywacji najemcy, aby kontynuować.",
24
- "auth.login.errors.tenantInvalid": "Nie znaleziono najemcy. Wyczyść wybór i spróbuj ponownie.",
25
11
  "auth.login.errors.generic": "Wystąpił błąd. Spróbuj ponownie.",
26
12
  "auth.login.logoAlt": "Logo Open Mercato",
27
13
  "auth.login.brandName": "Open Mercato",
@@ -29,9 +15,6 @@
29
15
  "auth.login.requireRoleMessage": "Dostęp wymaga roli: {roles}",
30
16
  "auth.login.requireRolesMessage": "Dostęp wymaga jednej z następujących ról: {roles}",
31
17
  "auth.login.featureDenied": "Nie masz dostępu do tej funkcji ({feature}). Skontaktuj się z administratorem.",
32
- "auth.login.tenantBanner": "Logujesz się do najemcy {tenant}.",
33
- "auth.login.tenantLoading": "Ładowanie szczegółów najemcy...",
34
- "auth.login.tenantClear": "Wyczyść",
35
18
  "auth.login.rememberMe": "Zapamiętaj mnie",
36
19
  "auth.login.loading": "Ładowanie...",
37
20
  "auth.login.forgotPassword": "Nie pamiętasz hasła?",
@@ -97,21 +80,6 @@
97
80
  "auth.users.form.errors.load": "Nie udało się wczytać danych użytkownika",
98
81
  "auth.users.form.errors.aclUpdate": "Nie udało się zaktualizować uprawnień użytkownika",
99
82
  "auth.users.form.errors.delete": "Nie udało się usunąć użytkownika",
100
- "auth.profile.title": "Profil",
101
- "auth.profile.subtitle": "Zmiana hasła",
102
- "auth.profile.form.email": "Email",
103
- "auth.profile.form.password": "Nowe hasło",
104
- "auth.profile.form.confirmPassword": "Potwierdź nowe hasło",
105
- "auth.profile.form.save": "Zapisz zmiany",
106
- "auth.profile.form.loading": "Ładowanie profilu...",
107
- "auth.profile.form.errors.load": "Nie udało się wczytać profilu.",
108
- "auth.profile.form.errors.save": "Nie udało się zaktualizować profilu.",
109
- "auth.profile.form.errors.invalid": "Nieprawidłowa aktualizacja profilu.",
110
- "auth.profile.form.errors.passwordMismatch": "Hasła nie są zgodne.",
111
- "auth.profile.form.errors.passwordRequirements": "Hasło musi spełniać wymagania.",
112
- "auth.profile.form.errors.noChanges": "Brak zmian do zapisania.",
113
- "auth.profile.form.errors.emailRequired": "Email jest wymagany.",
114
- "auth.profile.form.success": "Profil zaktualizowany.",
115
83
  "auth.users.list.error.load": "Nie udało się wczytać użytkowników",
116
84
  "auth.users.list.error.delete": "Nie udało się usunąć użytkownika",
117
85
  "auth.users.flash.created": "Użytkownik utworzony",
@@ -127,20 +95,5 @@
127
95
  "auth.email.resetPassword.title": "Zresetuj swoje hasło",
128
96
  "auth.email.resetPassword.body": "Kliknij poniższy link, aby ustawić nowe hasło. Link wygaśnie za 60 minut.",
129
97
  "auth.email.resetPassword.cta": "Ustaw nowe hasło",
130
- "auth.email.resetPassword.hint": "Jeśli nie prosiłeś o tę wiadomość, możesz ją bezpiecznie zignorować.",
131
- "auth.notifications.passwordReset.requested.title": "Żądanie resetu hasła",
132
- "auth.notifications.passwordReset.requested.body": "Link do resetu hasła został wysłany na Twój adres e-mail",
133
- "auth.notifications.passwordReset.completed.title": "Hasło zmienione pomyślnie",
134
- "auth.notifications.passwordReset.completed.body": "Twoje hasło zostało pomyślnie zaktualizowane",
135
- "auth.notifications.account.locked.title": "Konto zablokowane",
136
- "auth.notifications.account.locked.body": "Twoje konto zostało zablokowane z powodów bezpieczeństwa. Skontaktuj się z pomocą techniczną.",
137
- "auth.notifications.login.newDevice.title": "Wykryto logowanie z nowego urządzenia",
138
- "auth.notifications.login.newDevice.body": "Wykryto logowanie z nieznanego urządzenia na Twoim koncie",
139
- "auth.notifications.role.assigned.title": "Przypisano nową rolę",
140
- "auth.notifications.role.assigned.body": "Przypisano Ci nową rolę z dodatkowymi uprawnieniami",
141
- "auth.notifications.role.revoked.title": "Rola usunięta",
142
- "auth.notifications.role.revoked.body": "Z Twojego konta usunięto rolę",
143
- "auth.actions.contactSupport": "Skontaktuj się z pomocą",
144
- "auth.actions.viewSessions": "Zobacz sesje",
145
- "auth.actions.viewPermissions": "Zobacz uprawnienia"
98
+ "auth.email.resetPassword.hint": "Jeśli nie prosiłeś o tę wiadomość, możesz ją bezpiecznie zignorować."
146
99
  }
@@ -16,7 +16,6 @@ import { DEFAULT_ENCRYPTION_MAPS } from '@open-mercato/core/modules/entities/lib
16
16
  import { createKmsService } from '@open-mercato/shared/lib/encryption/kms'
17
17
  import { TenantDataEncryptionService } from '@open-mercato/shared/lib/encryption/tenantDataEncryptionService'
18
18
  import { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
19
- import { parseBooleanToken } from '@open-mercato/shared/lib/boolean'
20
19
 
21
20
  const DEFAULT_ROLE_NAMES = ['employee', 'admin', 'superadmin'] as const
22
21
  const DEMO_SUPERADMIN_EMAIL = 'superadmin@acme.com'
@@ -88,11 +87,6 @@ type PrimaryUserInput = {
88
87
  confirm?: boolean
89
88
  }
90
89
 
91
- const DERIVED_EMAIL_ENV = {
92
- admin: 'OM_INIT_ADMIN_EMAIL',
93
- employee: 'OM_INIT_EMPLOYEE_EMAIL',
94
- } as const
95
-
96
90
  export type SetupInitialTenantOptions = {
97
91
  orgName: string
98
92
  primaryUser: PrimaryUserInput
@@ -176,28 +170,16 @@ export async function setupInitialTenant(
176
170
  })
177
171
 
178
172
  if (!existingUser) {
179
- const baseUsers: Array<{
180
- email: string
181
- roles: string[]
182
- name?: string | null
183
- passwordHash?: string | null
184
- }> = [
173
+ const baseUsers: Array<{ email: string; roles: string[]; name?: string | null }> = [
185
174
  { email: primaryUser.email, roles: primaryRoles, name: resolvePrimaryName(primaryUser) },
186
175
  ]
187
176
  if (includeDerivedUsers) {
188
- const [, domain] = String(primaryUser.email).split('@')
189
- const adminOverride = readEnvValue(DERIVED_EMAIL_ENV.admin)
190
- const employeeOverride = readEnvValue(DERIVED_EMAIL_ENV.employee)
191
- const adminEmail = adminOverride ?? (domain ? `admin@${domain}` : '')
192
- const employeeEmail = employeeOverride ?? (domain ? `employee@${domain}` : '')
193
- const adminPassword = readEnvValue('OM_INIT_ADMIN_PASSWORD')
194
- const employeePassword = readEnvValue('OM_INIT_EMPLOYEE_PASSWORD')
195
- const adminPasswordHash = adminPassword ? await resolvePasswordHash({ email: adminEmail, password: adminPassword }) : null
196
- const employeePasswordHash = employeePassword
197
- ? await resolvePasswordHash({ email: employeeEmail, password: employeePassword })
198
- : null
199
- addUniqueBaseUser(baseUsers, { email: adminEmail, roles: ['admin'], passwordHash: adminPasswordHash })
200
- addUniqueBaseUser(baseUsers, { email: employeeEmail, roles: ['employee'], passwordHash: employeePasswordHash })
177
+ const [local, domain] = String(primaryUser.email).split('@')
178
+ const isSuperadminLocal = (local || '').toLowerCase() === 'superadmin' && !!domain
179
+ if (isSuperadminLocal) {
180
+ baseUsers.push({ email: `admin@${domain}`, roles: ['admin'] })
181
+ baseUsers.push({ email: `employee@${domain}`, roles: ['employee'] })
182
+ }
201
183
  }
202
184
  const passwordHash = await resolvePasswordHash(primaryUser)
203
185
 
@@ -289,14 +271,13 @@ export async function setupInitialTenant(
289
271
  }
290
272
 
291
273
  for (const base of baseUsers) {
292
- const resolvedPasswordHash = base.passwordHash ?? passwordHash
293
274
  let user = await tem.findOne(User, { email: base.email })
294
275
  const confirm = primaryUser.confirm ?? true
295
276
  const encryptedPayload = encryptionService
296
277
  ? await encryptionService.encryptEntityPayload('auth:user', { email: base.email }, tenantId, organizationId)
297
278
  : { email: base.email, emailHash: computeEmailHash(base.email) }
298
279
  if (user) {
299
- user.passwordHash = resolvedPasswordHash
280
+ user.passwordHash = passwordHash
300
281
  user.organizationId = organizationId
301
282
  user.tenantId = tenantId
302
283
  if (isTenantDataEncryptionEnabled()) {
@@ -311,7 +292,7 @@ export async function setupInitialTenant(
311
292
  user = tem.create(User, {
312
293
  email: (encryptedPayload as any).email ?? base.email,
313
294
  emailHash: isTenantDataEncryptionEnabled() ? (encryptedPayload as any).emailHash ?? computeEmailHash(base.email) : undefined,
314
- passwordHash: resolvedPasswordHash,
295
+ passwordHash,
315
296
  organizationId,
316
297
  tenantId,
317
298
  name: base.name ?? undefined,
@@ -359,34 +340,6 @@ function resolvePrimaryName(input: PrimaryUserInput): string | null {
359
340
  return null
360
341
  }
361
342
 
362
- function readEnvValue(key: string): string | undefined {
363
- const value = process.env[key]
364
- if (typeof value !== 'string') return undefined
365
- const trimmed = value.trim()
366
- return trimmed.length > 0 ? trimmed : undefined
367
- }
368
-
369
- function addUniqueBaseUser(
370
- baseUsers: Array<{ email: string; roles: string[]; name?: string | null; passwordHash?: string | null }>,
371
- entry: { email: string; roles: string[]; name?: string | null; passwordHash?: string | null },
372
- ) {
373
- if (!entry.email) return
374
- const normalized = entry.email.toLowerCase()
375
- if (baseUsers.some((user) => user.email.toLowerCase() === normalized)) return
376
- baseUsers.push(entry)
377
- }
378
-
379
- function isDemoModeEnabled(): boolean {
380
- const parsed = parseBooleanToken(process.env.DEMO_MODE ?? '')
381
- return parsed === false ? false : true
382
- }
383
-
384
- function shouldKeepDemoSuperadminDuringInit(): boolean {
385
- if (process.env.OM_INIT_FLOW !== 'true') return false
386
- if (!readEnvValue('OM_INIT_SUPERADMIN_EMAIL')) return false
387
- return isDemoModeEnabled()
388
- }
389
-
390
343
  async function resolvePasswordHash(input: PrimaryUserInput): Promise<string | null> {
391
344
  if (typeof input.hashedPassword === 'string') return input.hashedPassword
392
345
  if (input.password) return hash(input.password, 10)
@@ -443,7 +396,6 @@ async function ensureDefaultRoleAcls(
443
396
  'dashboards.admin.assign-widgets',
444
397
  'analytics.view',
445
398
  'api_keys.*',
446
- 'notifications.manage',
447
399
  'perspectives.use',
448
400
  'perspectives.role_defaults',
449
401
  'business_rules.*',
@@ -535,7 +487,6 @@ async function ensureRoleAclFor(
535
487
 
536
488
  async function deactivateDemoSuperAdminIfSelfOnboardingEnabled(em: EntityManager) {
537
489
  if (process.env.SELF_SERVICE_ONBOARDING_ENABLED !== 'true') return
538
- if (shouldKeepDemoSuperadminDuringInit()) return
539
490
  try {
540
491
  const user = await em.findOne(User, { email: DEMO_SUPERADMIN_EMAIL })
541
492
  if (!user) return
@@ -18,29 +18,6 @@ export class AuthService {
18
18
  } as any)
19
19
  }
20
20
 
21
- async findUsersByEmail(email: string) {
22
- const emailHash = computeEmailHash(email)
23
- return this.em.find(User, {
24
- deletedAt: null,
25
- $or: [
26
- { email },
27
- { emailHash },
28
- ],
29
- } as any)
30
- }
31
-
32
- async findUserByEmailAndTenant(email: string, tenantId: string) {
33
- const emailHash = computeEmailHash(email)
34
- return this.em.findOne(User, {
35
- tenantId,
36
- deletedAt: null,
37
- $or: [
38
- { email },
39
- { emailHash },
40
- ],
41
- } as any)
42
- }
43
-
44
21
  async verifyPassword(user: User, password: string) {
45
22
  if (!user.passwordHash) return false
46
23
  return compare(password, user.passwordHash)
@@ -98,15 +75,15 @@ export class AuthService {
98
75
  return { user, token }
99
76
  }
100
77
 
101
- async confirmPasswordReset(token: string, newPassword: string): Promise<User | null> {
78
+ async confirmPasswordReset(token: string, newPassword: string) {
102
79
  const now = new Date()
103
80
  const row = await this.em.findOne(PasswordReset, { token })
104
- if (!row || (row.usedAt && row.usedAt <= now) || row.expiresAt <= now) return null
81
+ if (!row || (row.usedAt && row.usedAt <= now) || row.expiresAt <= now) return false
105
82
  const user = await this.em.findOne(User, { id: row.user.id })
106
- if (!user) return null
83
+ if (!user) return false
107
84
  user.passwordHash = await hash(newPassword, 10)
108
85
  row.usedAt = new Date()
109
86
  await this.em.flush()
110
- return user
87
+ return true
111
88
  }
112
89
  }
@@ -0,0 +1,163 @@
1
+ import { NextResponse } from 'next/server'
2
+ import { z } from 'zod'
3
+ import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
4
+ import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
5
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
6
+ import type { EntityManager } from '@mikro-orm/postgresql'
7
+ import * as ruleEngine from '../../../lib/rule-engine'
8
+
9
+ const executeByIdRequestSchema = z.object({
10
+ data: z.any(),
11
+ dryRun: z.boolean().optional().default(false),
12
+ entityType: z.string().optional(),
13
+ entityId: z.string().optional(),
14
+ eventType: z.string().optional(),
15
+ })
16
+
17
+ const executeByIdResponseSchema = z.object({
18
+ success: z.boolean(),
19
+ ruleId: z.string(),
20
+ ruleName: z.string(),
21
+ conditionResult: z.boolean(),
22
+ actionsExecuted: z.object({
23
+ success: z.boolean(),
24
+ results: z.array(z.object({
25
+ type: z.string(),
26
+ success: z.boolean(),
27
+ error: z.string().optional(),
28
+ })),
29
+ }).nullable(),
30
+ executionTime: z.number(),
31
+ error: z.string().optional(),
32
+ logId: z.string().optional(),
33
+ })
34
+
35
+ const errorResponseSchema = z.object({
36
+ error: z.string(),
37
+ })
38
+
39
+ const routeMetadata = {
40
+ POST: { requireAuth: true, requireFeatures: ['business_rules.execute'] },
41
+ }
42
+
43
+ export const metadata = routeMetadata
44
+
45
+ interface RouteContext {
46
+ params: Promise<{ ruleId: string }>
47
+ }
48
+
49
+ export async function POST(req: Request, context: RouteContext) {
50
+ const auth = await getAuthFromRequest(req)
51
+ if (!auth) {
52
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
53
+ }
54
+
55
+ const params = await context.params
56
+ const ruleId = params.ruleId
57
+
58
+ if (!ruleId || !z.uuid().safeParse(ruleId).success) {
59
+ return NextResponse.json({ error: 'Invalid rule ID' }, { status: 400 })
60
+ }
61
+
62
+ const container = await createRequestContainer()
63
+ const em = container.resolve('em') as EntityManager
64
+
65
+ let body: any
66
+ try {
67
+ body = await req.json()
68
+ } catch {
69
+ return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 })
70
+ }
71
+
72
+ const parsed = executeByIdRequestSchema.safeParse(body)
73
+ if (!parsed.success) {
74
+ const errors = parsed.error.issues.map(e => `${e.path.join('.')}: ${e.message}`)
75
+ return NextResponse.json({ error: `Validation failed: ${errors.join(', ')}` }, { status: 400 })
76
+ }
77
+
78
+ const { data, dryRun, entityType, entityId, eventType } = parsed.data
79
+
80
+ const execContext: ruleEngine.DirectRuleExecutionContext = {
81
+ ruleId,
82
+ data,
83
+ user: {
84
+ id: auth.sub,
85
+ email: auth.email,
86
+ role: (auth.role as string) ?? undefined,
87
+ },
88
+ tenantId: auth.tenantId ?? '',
89
+ organizationId: auth.orgId ?? '',
90
+ executedBy: auth.sub ?? auth.email ?? undefined,
91
+ dryRun,
92
+ entityType,
93
+ entityId,
94
+ eventType,
95
+ }
96
+
97
+ try {
98
+ const result = await ruleEngine.executeRuleById(em, execContext)
99
+
100
+ const response = {
101
+ success: result.success,
102
+ ruleId: result.ruleId,
103
+ ruleName: result.ruleName,
104
+ conditionResult: result.conditionResult,
105
+ actionsExecuted: result.actionsExecuted ? {
106
+ success: result.actionsExecuted.success,
107
+ results: result.actionsExecuted.results.map(ar => ({
108
+ type: ar.action.type,
109
+ success: ar.success,
110
+ error: ar.error,
111
+ })),
112
+ } : null,
113
+ executionTime: result.executionTime,
114
+ error: result.error,
115
+ logId: result.logId,
116
+ }
117
+
118
+ // Return appropriate status based on result
119
+ const status = result.success ? 200 : (result.error === 'Rule not found' ? 404 : 200)
120
+ return NextResponse.json(response, { status })
121
+ } catch (error) {
122
+ const errorMessage = error instanceof Error ? error.message : String(error)
123
+ return NextResponse.json(
124
+ { error: `Rule execution failed: ${errorMessage}` },
125
+ { status: 500 }
126
+ )
127
+ }
128
+ }
129
+
130
+ export const openApi: OpenApiRouteDoc = {
131
+ tag: 'Business Rules',
132
+ summary: 'Execute a specific business rule by ID',
133
+ methods: {
134
+ POST: {
135
+ summary: 'Execute a specific rule by its database UUID',
136
+ description: 'Directly executes a specific business rule identified by its UUID, bypassing the normal entityType/eventType discovery mechanism. Useful for workflows and targeted rule execution.',
137
+ pathParams: z.object({
138
+ ruleId: z.string().uuid().describe('The database UUID of the business rule to execute'),
139
+ }),
140
+ requestBody: {
141
+ contentType: 'application/json',
142
+ schema: executeByIdRequestSchema,
143
+ },
144
+ responses: [
145
+ {
146
+ status: 200,
147
+ description: 'Rule executed successfully',
148
+ schema: executeByIdResponseSchema,
149
+ },
150
+ {
151
+ status: 404,
152
+ description: 'Rule not found',
153
+ schema: errorResponseSchema,
154
+ },
155
+ ],
156
+ errors: [
157
+ { status: 400, description: 'Invalid request payload or rule ID', schema: errorResponseSchema },
158
+ { status: 401, description: 'Unauthorized', schema: errorResponseSchema },
159
+ { status: 500, description: 'Execution error', schema: errorResponseSchema },
160
+ ],
161
+ },
162
+ },
163
+ }
@@ -4,7 +4,6 @@ import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
4
4
  import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
5
5
  import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
6
6
  import type { EntityManager } from '@mikro-orm/postgresql'
7
- import type { EventBus } from '@open-mercato/events'
8
7
  import { ruleEngineContextSchema } from '../../data/validators'
9
8
  import * as ruleEngine from '../../lib/rule-engine'
10
9
 
@@ -47,12 +46,6 @@ export async function POST(req: Request) {
47
46
 
48
47
  const container = await createRequestContainer()
49
48
  const em = container.resolve('em') as EntityManager
50
- let eventBus: EventBus | null = null
51
- try {
52
- eventBus = container.resolve('eventBus') as EventBus
53
- } catch {
54
- eventBus = null
55
- }
56
49
 
57
50
  let body: any
58
51
  try {
@@ -92,7 +85,7 @@ export async function POST(req: Request) {
92
85
  }
93
86
 
94
87
  try {
95
- const result = await ruleEngine.executeRules(em, context, { eventBus })
88
+ const result = await ruleEngine.executeRules(em, context)
96
89
 
97
90
  const response = {
98
91
  allowed: result.allowed,
@@ -264,17 +264,14 @@ export default function RulesListPage() {
264
264
  <RowActions
265
265
  items={[
266
266
  {
267
- id: 'edit',
268
267
  label: t('common.edit'),
269
268
  href: `/backend/rules/${row.original.id}`,
270
269
  },
271
270
  {
272
- id: row.original.enabled ? 'disable' : 'enable',
273
271
  label: row.original.enabled ? t('common.disable') : t('common.enable'),
274
272
  onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),
275
273
  },
276
274
  {
277
- id: 'duplicate',
278
275
  label: t('common.duplicate'),
279
276
  onSelect: () => {
280
277
  // TODO: Implement duplicate functionality in Step 5.2
@@ -282,7 +279,6 @@ export default function RulesListPage() {
282
279
  },
283
280
  },
284
281
  {
285
- id: 'delete',
286
282
  label: t('common.delete'),
287
283
  onSelect: () => handleDelete(row.original.id, row.original.ruleName),
288
284
  destructive: true,
@@ -196,17 +196,14 @@ export default function RuleSetsListPage() {
196
196
  <RowActions
197
197
  items={[
198
198
  {
199
- id: 'edit',
200
199
  label: t('common.edit'),
201
200
  href: `/backend/sets/${row.original.id}`,
202
201
  },
203
202
  {
204
- id: row.original.enabled ? 'disable' : 'enable',
205
203
  label: row.original.enabled ? t('common.disable') : t('common.enable'),
206
204
  onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),
207
205
  },
208
206
  {
209
- id: 'delete',
210
207
  label: t('common.delete'),
211
208
  onSelect: () => handleDelete(row.original.id, row.original.setName),
212
209
  destructive: true,
@@ -44,7 +44,6 @@ const seedGuardRules: ModuleCli = {
44
44
  const rulesPath = path.join(__dirname, '../workflows/examples', 'guard-rules-example.json')
45
45
  const rulesData = JSON.parse(fs.readFileSync(rulesPath, 'utf8'))
46
46
 
47
- console.log('🧠 Seeding guard rules...')
48
47
  let seededCount = 0
49
48
  let skippedCount = 0
50
49
 
@@ -74,7 +73,7 @@ const seedGuardRules: ModuleCli = {
74
73
  seededCount++
75
74
  }
76
75
 
77
- console.log(`\n Guard rules seeding complete:`)
76
+ console.log(`\n Guard rules seeding complete:`)
78
77
  console.log(` - Seeded: ${seededCount}`)
79
78
  console.log(` - Skipped (existing): ${skippedCount}`)
80
79
  console.log(` - Total: ${rulesData.length}`)
@@ -287,3 +287,43 @@ export const ruleDiscoveryOptionsSchema = z.object({
287
287
  })
288
288
 
289
289
  export type RuleDiscoveryOptionsInput = z.infer<typeof ruleDiscoveryOptionsSchema>
290
+
291
+ // Direct Rule Execution Context Schema (for executing a specific rule by ID)
292
+ export const directRuleExecutionContextSchema = z.object({
293
+ ruleId: z.uuid('ruleId must be a valid UUID'),
294
+ data: z.any(),
295
+ user: z.looseObject({
296
+ id: z.string().optional(),
297
+ email: z.string().optional(),
298
+ role: z.string().optional(),
299
+ }).optional(),
300
+ tenantId: z.uuid('tenantId must be a valid UUID'),
301
+ organizationId: z.uuid('organizationId must be a valid UUID'),
302
+ executedBy: z.string().optional(),
303
+ dryRun: z.boolean().optional(),
304
+ entityType: z.string().optional(),
305
+ entityId: z.string().optional(),
306
+ eventType: z.string().optional(),
307
+ })
308
+
309
+ export type DirectRuleExecutionContextInput = z.infer<typeof directRuleExecutionContextSchema>
310
+
311
+ // Rule ID Execution Context Schema (for executing a specific rule by its string rule_id identifier)
312
+ export const ruleIdExecutionContextSchema = z.object({
313
+ ruleId: z.string().min(1, 'ruleId must be a non-empty string').max(50),
314
+ data: z.any(),
315
+ user: z.looseObject({
316
+ id: z.string().optional(),
317
+ email: z.string().optional(),
318
+ role: z.string().optional(),
319
+ }).optional(),
320
+ tenantId: z.uuid('tenantId must be a valid UUID'),
321
+ organizationId: z.uuid('organizationId must be a valid UUID'),
322
+ executedBy: z.string().optional(),
323
+ dryRun: z.boolean().optional(),
324
+ entityType: z.string().optional(),
325
+ entityId: z.string().optional(),
326
+ eventType: z.string().optional(),
327
+ })
328
+
329
+ export type RuleIdExecutionContextInput = z.infer<typeof ruleIdExecutionContextSchema>
@@ -367,7 +367,5 @@
367
367
  "business_rules.components.conditionRow.field.comparisonPlaceholder": "e.g., user.role",
368
368
  "business_rules.components.conditionRow.value.help": "Use JSON for arrays: [\"a\",\"b\"]",
369
369
  "business_rules.components.conditionRow.field.comparisonHelp": "Field path to compare with",
370
- "business_rules.components.conditionRow.deleteCondition": "Delete condition",
371
- "businessRules.notifications.rule.executionFailed.title": "Business Rule Failed",
372
- "businessRules.notifications.rule.executionFailed.body": "Rule \"{ruleName}\" failed to execute{entityType, select, other { on {entityType}}}: {errorMessage}"
370
+ "business_rules.components.conditionRow.deleteCondition": "Delete condition"
373
371
  }