@open-mercato/core 0.4.2-canary-3b5064ce72 → 0.4.2-canary-15e78de280

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 (512) hide show
  1. package/dist/generated/entities/api_key/index.js +2 -0
  2. package/dist/generated/entities/api_key/index.js.map +2 -2
  3. package/dist/generated/entities.ids.generated.js +1 -5
  4. package/dist/generated/entities.ids.generated.js.map +2 -2
  5. package/dist/generated/entity-fields-registry.js +0 -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/api_keys/data/entities.js +3 -0
  12. package/dist/modules/api_keys/data/entities.js.map +2 -2
  13. package/dist/modules/api_keys/migrations/Migration20260125204102.js +13 -0
  14. package/dist/modules/api_keys/migrations/Migration20260125204102.js.map +7 -0
  15. package/dist/modules/api_keys/services/apiKeyService.js +41 -0
  16. package/dist/modules/api_keys/services/apiKeyService.js.map +3 -3
  17. package/dist/modules/attachments/components/AttachmentLibrary.js +0 -4
  18. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  19. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +0 -2
  20. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  21. package/dist/modules/auth/api/admin/nav.js +3 -4
  22. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  23. package/dist/modules/auth/api/login.js +6 -25
  24. package/dist/modules/auth/api/login.js.map +2 -2
  25. package/dist/modules/auth/api/reset/confirm.js +2 -25
  26. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  27. package/dist/modules/auth/api/reset.js +0 -23
  28. package/dist/modules/auth/api/reset.js.map +2 -2
  29. package/dist/modules/auth/api/sidebar/preferences/route.js +9 -14
  30. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  31. package/dist/modules/auth/api/users/route.js +2 -4
  32. package/dist/modules/auth/api/users/route.js.map +2 -2
  33. package/dist/modules/auth/backend/roles/[id]/edit/page.js +1 -4
  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 +3 -18
  38. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  39. package/dist/modules/auth/backend/users/create/page.js +2 -15
  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 +11 -25
  44. package/dist/modules/auth/cli.js.map +2 -2
  45. package/dist/modules/auth/commands/users.js +2 -59
  46. package/dist/modules/auth/commands/users.js.map +2 -2
  47. package/dist/modules/auth/data/validators.js +3 -6
  48. package/dist/modules/auth/data/validators.js.map +2 -2
  49. package/dist/modules/auth/frontend/login.js +3 -112
  50. package/dist/modules/auth/frontend/login.js.map +2 -2
  51. package/dist/modules/auth/frontend/reset/[token]/page.js +10 -20
  52. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  53. package/dist/modules/auth/lib/setup-app.js +8 -42
  54. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  55. package/dist/modules/auth/services/authService.js +3 -24
  56. package/dist/modules/auth/services/authService.js.map +2 -2
  57. package/dist/modules/auth/services/rbacService.js.map +2 -2
  58. package/dist/modules/business_rules/api/execute/route.js +1 -7
  59. package/dist/modules/business_rules/api/execute/route.js.map +2 -2
  60. package/dist/modules/business_rules/backend/rules/page.js +0 -4
  61. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  62. package/dist/modules/business_rules/backend/sets/page.js +0 -3
  63. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  64. package/dist/modules/business_rules/cli.js +1 -2
  65. package/dist/modules/business_rules/cli.js.map +2 -2
  66. package/dist/modules/business_rules/lib/rule-engine.js +3 -33
  67. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  68. package/dist/modules/catalog/components/PriceKindSettings.js +0 -2
  69. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  70. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  71. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  72. package/dist/modules/catalog/components/products/ProductsDataTable.js +0 -2
  73. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  74. package/dist/modules/configs/cli.js +0 -6
  75. package/dist/modules/configs/cli.js.map +2 -2
  76. package/dist/modules/configs/components/CachePanel.js +4 -4
  77. package/dist/modules/configs/components/CachePanel.js.map +2 -2
  78. package/dist/modules/configs/lib/system-status.js +1 -48
  79. package/dist/modules/configs/lib/system-status.js.map +2 -2
  80. package/dist/modules/configs/lib/upgrade-actions.js +0 -18
  81. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  82. package/dist/modules/currencies/backend/currencies/page.js +0 -3
  83. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  84. package/dist/modules/currencies/backend/exchange-rates/page.js +0 -2
  85. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  86. package/dist/modules/customers/backend/customers/companies/page.js +0 -3
  87. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  88. package/dist/modules/customers/backend/customers/deals/page.js +0 -3
  89. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  90. package/dist/modules/customers/backend/customers/people/page.js +0 -3
  91. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  92. package/dist/modules/customers/commands/deals.js +0 -31
  93. package/dist/modules/customers/commands/deals.js.map +2 -2
  94. package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
  95. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  96. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js +1 -2
  97. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js.map +2 -2
  98. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js +1 -2
  99. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js.map +2 -2
  100. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js +1 -2
  101. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js.map +2 -2
  102. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js +1 -2
  103. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js.map +2 -2
  104. package/dist/modules/dashboards/cli.js +5 -44
  105. package/dist/modules/dashboards/cli.js.map +2 -2
  106. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +11 -16
  107. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
  108. package/dist/modules/dashboards/services/widgetDataService.js +3 -139
  109. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  110. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js +1 -2
  111. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js.map +2 -2
  112. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js +1 -2
  113. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js.map +2 -2
  114. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js +1 -2
  115. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js.map +2 -2
  116. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js +1 -2
  117. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js.map +2 -2
  118. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +1 -2
  119. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
  120. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js +1 -2
  121. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js.map +2 -2
  122. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js +1 -2
  123. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js.map +2 -2
  124. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js +1 -2
  125. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js.map +2 -2
  126. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js +1 -2
  127. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js.map +2 -2
  128. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js +1 -2
  129. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js.map +2 -2
  130. package/dist/modules/dictionaries/components/DictionaryTable.js +0 -2
  131. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  132. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  133. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  134. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  135. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  136. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  137. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  138. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  139. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  140. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  141. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  142. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  143. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  144. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  145. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  146. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  147. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  148. package/dist/modules/query_index/cli.js +7 -63
  149. package/dist/modules/query_index/cli.js.map +2 -2
  150. package/dist/modules/query_index/components/QueryIndexesTable.js +1 -7
  151. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  152. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  153. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  154. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  155. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  156. package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -2
  157. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  158. package/dist/modules/sales/backend/sales/channels/page.js +0 -2
  159. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  160. package/dist/modules/sales/commands/documents.js +0 -53
  161. package/dist/modules/sales/commands/documents.js.map +2 -2
  162. package/dist/modules/sales/commands/payments.js +0 -26
  163. package/dist/modules/sales/commands/payments.js.map +2 -2
  164. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  165. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  166. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  167. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  168. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  169. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  170. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  171. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  172. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -2
  173. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  174. package/dist/modules/sales/components/documents/AdjustmentsSection.js +0 -2
  175. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  176. package/dist/modules/sales/components/documents/PaymentsSection.js +1 -2
  177. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  178. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +0 -2
  179. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  180. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  181. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  182. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  183. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  184. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  185. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  186. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  187. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  188. package/dist/modules/staff/commands/leave-requests.js +0 -79
  189. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  190. package/dist/modules/workflows/backend/definitions/page.js +0 -5
  191. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  192. package/dist/modules/workflows/backend/instances/page.js +0 -3
  193. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  194. package/dist/modules/workflows/backend/tasks/page.js +0 -3
  195. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  196. package/dist/modules/workflows/cli.js +12 -12
  197. package/dist/modules/workflows/cli.js.map +2 -2
  198. package/dist/modules/workflows/lib/transition-handler.js +6 -14
  199. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  200. package/generated/entities/api_key/index.ts +1 -0
  201. package/generated/entities.ids.generated.ts +1 -5
  202. package/generated/entity-fields-registry.ts +0 -2
  203. package/package.json +2 -2
  204. package/src/modules/api_docs/frontend/docs/api/page.tsx +2 -3
  205. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  206. package/src/modules/api_keys/data/entities.ts +4 -0
  207. package/src/modules/api_keys/migrations/.snapshot-open-mercato.json +9 -0
  208. package/src/modules/api_keys/migrations/Migration20260125204102.ts +13 -0
  209. package/src/modules/api_keys/services/apiKeyService.ts +85 -0
  210. package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -4
  211. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +0 -2
  212. package/src/modules/auth/README.md +1 -1
  213. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
  214. package/src/modules/auth/api/__tests__/login.test.ts +0 -2
  215. package/src/modules/auth/api/admin/nav.ts +6 -10
  216. package/src/modules/auth/api/login.ts +7 -26
  217. package/src/modules/auth/api/reset/confirm.ts +2 -25
  218. package/src/modules/auth/api/reset.ts +0 -23
  219. package/src/modules/auth/api/sidebar/preferences/route.ts +12 -21
  220. package/src/modules/auth/api/users/route.ts +2 -5
  221. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +1 -4
  222. package/src/modules/auth/backend/roles/page.tsx +3 -3
  223. package/src/modules/auth/backend/users/[id]/edit/page.tsx +3 -22
  224. package/src/modules/auth/backend/users/create/page.tsx +2 -19
  225. package/src/modules/auth/backend/users/page.tsx +3 -3
  226. package/src/modules/auth/cli.ts +11 -38
  227. package/src/modules/auth/commands/users.ts +2 -73
  228. package/src/modules/auth/data/validators.ts +2 -6
  229. package/src/modules/auth/frontend/login.tsx +5 -134
  230. package/src/modules/auth/frontend/reset/[token]/page.tsx +11 -24
  231. package/src/modules/auth/i18n/de.json +1 -48
  232. package/src/modules/auth/i18n/en.json +1 -48
  233. package/src/modules/auth/i18n/es.json +1 -48
  234. package/src/modules/auth/i18n/pl.json +1 -48
  235. package/src/modules/auth/lib/setup-app.ts +9 -58
  236. package/src/modules/auth/services/authService.ts +4 -27
  237. package/src/modules/auth/services/rbacService.ts +1 -1
  238. package/src/modules/business_rules/api/execute/route.ts +1 -8
  239. package/src/modules/business_rules/backend/rules/page.tsx +0 -4
  240. package/src/modules/business_rules/backend/sets/page.tsx +0 -3
  241. package/src/modules/business_rules/cli.ts +1 -2
  242. package/src/modules/business_rules/i18n/en.json +1 -3
  243. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -51
  244. package/src/modules/business_rules/lib/rule-engine.ts +3 -57
  245. package/src/modules/catalog/components/PriceKindSettings.tsx +0 -2
  246. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  247. package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -2
  248. package/src/modules/catalog/i18n/en.json +1 -3
  249. package/src/modules/configs/cli.ts +0 -6
  250. package/src/modules/configs/components/CachePanel.tsx +4 -4
  251. package/src/modules/configs/i18n/en.json +2 -12
  252. package/src/modules/configs/i18n/pl.json +2 -12
  253. package/src/modules/configs/lib/system-status.ts +1 -48
  254. package/src/modules/configs/lib/system-status.types.ts +0 -1
  255. package/src/modules/configs/lib/upgrade-actions.ts +0 -18
  256. package/src/modules/currencies/backend/currencies/page.tsx +0 -3
  257. package/src/modules/currencies/backend/exchange-rates/page.tsx +0 -2
  258. package/src/modules/customers/backend/customers/companies/page.tsx +0 -3
  259. package/src/modules/customers/backend/customers/deals/page.tsx +0 -3
  260. package/src/modules/customers/backend/customers/people/page.tsx +0 -3
  261. package/src/modules/customers/commands/deals.ts +0 -39
  262. package/src/modules/customers/components/CustomerTodosTable.tsx +0 -1
  263. package/src/modules/customers/i18n/en.json +1 -5
  264. package/src/modules/customers/widgets/dashboard/customer-todos/widget.ts +2 -2
  265. package/src/modules/customers/widgets/dashboard/new-customers/widget.ts +2 -2
  266. package/src/modules/customers/widgets/dashboard/new-deals/widget.ts +2 -2
  267. package/src/modules/customers/widgets/dashboard/next-interactions/widget.ts +2 -2
  268. package/src/modules/dashboards/cli.ts +5 -55
  269. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +11 -22
  270. package/src/modules/dashboards/services/widgetDataService.ts +4 -164
  271. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.ts +2 -2
  272. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.ts +2 -2
  273. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.ts +2 -2
  274. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.ts +2 -2
  275. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
  276. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.ts +2 -2
  277. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.ts +2 -2
  278. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.ts +2 -2
  279. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.ts +2 -2
  280. package/src/modules/dashboards/widgets/dashboard/top-products/widget.ts +2 -2
  281. package/src/modules/dictionaries/components/DictionaryTable.tsx +0 -2
  282. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  283. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  284. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  285. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  286. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  287. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +4 -3
  288. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  289. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  290. package/src/modules/query_index/cli.ts +13 -82
  291. package/src/modules/query_index/components/QueryIndexesTable.tsx +2 -8
  292. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  293. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  294. package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -2
  295. package/src/modules/sales/backend/sales/channels/page.tsx +0 -2
  296. package/src/modules/sales/commands/documents.ts +0 -65
  297. package/src/modules/sales/commands/payments.ts +0 -33
  298. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  299. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  300. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  301. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  302. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -2
  303. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +0 -2
  304. package/src/modules/sales/components/documents/PaymentsSection.tsx +1 -2
  305. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +0 -2
  306. package/src/modules/sales/i18n/de.json +0 -20
  307. package/src/modules/sales/i18n/en.json +1 -25
  308. package/src/modules/sales/i18n/es.json +0 -20
  309. package/src/modules/sales/i18n/pl.json +0 -20
  310. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  311. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  312. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  313. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  314. package/src/modules/staff/commands/leave-requests.ts +0 -94
  315. package/src/modules/staff/i18n/de.json +0 -4
  316. package/src/modules/staff/i18n/en.json +1 -9
  317. package/src/modules/staff/i18n/es.json +0 -4
  318. package/src/modules/staff/i18n/pl.json +0 -4
  319. package/src/modules/workflows/backend/definitions/page.tsx +0 -5
  320. package/src/modules/workflows/backend/instances/page.tsx +1 -4
  321. package/src/modules/workflows/backend/tasks/page.tsx +1 -4
  322. package/src/modules/workflows/cli.ts +12 -12
  323. package/src/modules/workflows/i18n/en.json +1 -3
  324. package/src/modules/workflows/lib/transition-handler.ts +6 -18
  325. package/dist/generated/entities/notification/index.js +0 -57
  326. package/dist/generated/entities/notification/index.js.map +0 -7
  327. package/dist/modules/auth/api/profile/route.js +0 -157
  328. package/dist/modules/auth/api/profile/route.js.map +0 -7
  329. package/dist/modules/auth/backend/auth/profile/page.js +0 -141
  330. package/dist/modules/auth/backend/auth/profile/page.js.map +0 -7
  331. package/dist/modules/auth/backend/auth/profile/page.meta.js +0 -13
  332. package/dist/modules/auth/backend/auth/profile/page.meta.js.map +0 -7
  333. package/dist/modules/auth/notifications.js +0 -112
  334. package/dist/modules/auth/notifications.js.map +0 -7
  335. package/dist/modules/business_rules/notifications.js +0 -28
  336. package/dist/modules/business_rules/notifications.js.map +0 -7
  337. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +0 -37
  338. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +0 -7
  339. package/dist/modules/catalog/notifications.js +0 -28
  340. package/dist/modules/catalog/notifications.js.map +0 -7
  341. package/dist/modules/catalog/subscribers/low-stock-notification.js +0 -38
  342. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +0 -7
  343. package/dist/modules/customers/notifications.js +0 -48
  344. package/dist/modules/customers/notifications.js.map +0 -7
  345. package/dist/modules/dashboards/lib/role-widgets.js +0 -58
  346. package/dist/modules/dashboards/lib/role-widgets.js.map +0 -7
  347. package/dist/modules/directory/api/get/tenants/lookup.js +0 -70
  348. package/dist/modules/directory/api/get/tenants/lookup.js.map +0 -7
  349. package/dist/modules/notifications/acl.js +0 -11
  350. package/dist/modules/notifications/acl.js.map +0 -7
  351. package/dist/modules/notifications/api/[id]/action/route.js +0 -74
  352. package/dist/modules/notifications/api/[id]/action/route.js.map +0 -7
  353. package/dist/modules/notifications/api/[id]/dismiss/route.js +0 -15
  354. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +0 -7
  355. package/dist/modules/notifications/api/[id]/read/route.js +0 -15
  356. package/dist/modules/notifications/api/[id]/read/route.js.map +0 -7
  357. package/dist/modules/notifications/api/[id]/restore/route.js +0 -53
  358. package/dist/modules/notifications/api/[id]/restore/route.js.map +0 -7
  359. package/dist/modules/notifications/api/batch/route.js +0 -17
  360. package/dist/modules/notifications/api/batch/route.js.map +0 -7
  361. package/dist/modules/notifications/api/feature/route.js +0 -17
  362. package/dist/modules/notifications/api/feature/route.js.map +0 -7
  363. package/dist/modules/notifications/api/mark-all-read/route.js +0 -35
  364. package/dist/modules/notifications/api/mark-all-read/route.js.map +0 -7
  365. package/dist/modules/notifications/api/openapi.js +0 -76
  366. package/dist/modules/notifications/api/openapi.js.map +0 -7
  367. package/dist/modules/notifications/api/role/route.js +0 -17
  368. package/dist/modules/notifications/api/role/route.js.map +0 -7
  369. package/dist/modules/notifications/api/route.js +0 -85
  370. package/dist/modules/notifications/api/route.js.map +0 -7
  371. package/dist/modules/notifications/api/settings/route.js +0 -155
  372. package/dist/modules/notifications/api/settings/route.js.map +0 -7
  373. package/dist/modules/notifications/api/unread-count/route.js +0 -38
  374. package/dist/modules/notifications/api/unread-count/route.js.map +0 -7
  375. package/dist/modules/notifications/backend/config/notifications/page.js +0 -10
  376. package/dist/modules/notifications/backend/config/notifications/page.js.map +0 -7
  377. package/dist/modules/notifications/backend/config/notifications/page.meta.js +0 -24
  378. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +0 -7
  379. package/dist/modules/notifications/cli.js +0 -16
  380. package/dist/modules/notifications/cli.js.map +0 -7
  381. package/dist/modules/notifications/data/entities.js +0 -112
  382. package/dist/modules/notifications/data/entities.js.map +0 -7
  383. package/dist/modules/notifications/data/validators.js +0 -98
  384. package/dist/modules/notifications/data/validators.js.map +0 -7
  385. package/dist/modules/notifications/di.js +0 -13
  386. package/dist/modules/notifications/di.js.map +0 -7
  387. package/dist/modules/notifications/emails/NotificationEmail.js +0 -58
  388. package/dist/modules/notifications/emails/NotificationEmail.js.map +0 -7
  389. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +0 -44
  390. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +0 -7
  391. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +0 -220
  392. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +0 -7
  393. package/dist/modules/notifications/index.js +0 -14
  394. package/dist/modules/notifications/index.js.map +0 -7
  395. package/dist/modules/notifications/lib/deliveryConfig.js +0 -107
  396. package/dist/modules/notifications/lib/deliveryConfig.js.map +0 -7
  397. package/dist/modules/notifications/lib/deliveryStrategies.js +0 -14
  398. package/dist/modules/notifications/lib/deliveryStrategies.js.map +0 -7
  399. package/dist/modules/notifications/lib/events.js +0 -12
  400. package/dist/modules/notifications/lib/events.js.map +0 -7
  401. package/dist/modules/notifications/lib/notificationBuilder.js +0 -66
  402. package/dist/modules/notifications/lib/notificationBuilder.js.map +0 -7
  403. package/dist/modules/notifications/lib/notificationFactory.js +0 -54
  404. package/dist/modules/notifications/lib/notificationFactory.js.map +0 -7
  405. package/dist/modules/notifications/lib/notificationMapper.js +0 -34
  406. package/dist/modules/notifications/lib/notificationMapper.js.map +0 -7
  407. package/dist/modules/notifications/lib/notificationRecipients.js +0 -35
  408. package/dist/modules/notifications/lib/notificationRecipients.js.map +0 -7
  409. package/dist/modules/notifications/lib/notificationService.js +0 -279
  410. package/dist/modules/notifications/lib/notificationService.js.map +0 -7
  411. package/dist/modules/notifications/lib/routeHelpers.js +0 -101
  412. package/dist/modules/notifications/lib/routeHelpers.js.map +0 -7
  413. package/dist/modules/notifications/lib/safeHref.js +0 -24
  414. package/dist/modules/notifications/lib/safeHref.js.map +0 -7
  415. package/dist/modules/notifications/migrations/Migration20260123000001.js +0 -70
  416. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +0 -7
  417. package/dist/modules/notifications/migrations/Migration20260126150000.js +0 -37
  418. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +0 -7
  419. package/dist/modules/notifications/migrations/Migration20260129082610.js +0 -13
  420. package/dist/modules/notifications/migrations/Migration20260129082610.js.map +0 -7
  421. package/dist/modules/notifications/subscribers/deliver-notification.js +0 -165
  422. package/dist/modules/notifications/subscribers/deliver-notification.js.map +0 -7
  423. package/dist/modules/notifications/workers/create-notification.worker.js +0 -70
  424. package/dist/modules/notifications/workers/create-notification.worker.js.map +0 -7
  425. package/dist/modules/sales/notifications.client.js +0 -51
  426. package/dist/modules/sales/notifications.client.js.map +0 -7
  427. package/dist/modules/sales/notifications.js +0 -88
  428. package/dist/modules/sales/notifications.js.map +0 -7
  429. package/dist/modules/sales/subscribers/quote-expiring-notification.js +0 -38
  430. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +0 -7
  431. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -137
  432. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +0 -7
  433. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -137
  434. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +0 -7
  435. package/dist/modules/sales/widgets/notifications/index.js +0 -7
  436. package/dist/modules/sales/widgets/notifications/index.js.map +0 -7
  437. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +0 -60
  438. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +0 -7
  439. package/dist/modules/staff/notifications.js +0 -75
  440. package/dist/modules/staff/notifications.js.map +0 -7
  441. package/dist/modules/workflows/notifications.js +0 -28
  442. package/dist/modules/workflows/notifications.js.map +0 -7
  443. package/dist/modules/workflows/subscribers/task-assigned-notification.js +0 -38
  444. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +0 -7
  445. package/generated/entities/notification/index.ts +0 -27
  446. package/src/modules/auth/api/profile/route.ts +0 -163
  447. package/src/modules/auth/backend/auth/profile/page.meta.ts +0 -9
  448. package/src/modules/auth/backend/auth/profile/page.tsx +0 -174
  449. package/src/modules/auth/notifications.ts +0 -109
  450. package/src/modules/business_rules/notifications.ts +0 -25
  451. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +0 -50
  452. package/src/modules/catalog/notifications.ts +0 -25
  453. package/src/modules/catalog/subscribers/low-stock-notification.ts +0 -52
  454. package/src/modules/customers/notifications.ts +0 -44
  455. package/src/modules/dashboards/lib/role-widgets.ts +0 -80
  456. package/src/modules/directory/api/get/tenants/lookup.ts +0 -75
  457. package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -195
  458. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
  459. package/src/modules/notifications/__tests__/notificationService.test.ts +0 -208
  460. package/src/modules/notifications/acl.ts +0 -7
  461. package/src/modules/notifications/api/[id]/action/route.ts +0 -75
  462. package/src/modules/notifications/api/[id]/dismiss/route.ts +0 -12
  463. package/src/modules/notifications/api/[id]/read/route.ts +0 -12
  464. package/src/modules/notifications/api/[id]/restore/route.ts +0 -53
  465. package/src/modules/notifications/api/batch/route.ts +0 -14
  466. package/src/modules/notifications/api/feature/route.ts +0 -14
  467. package/src/modules/notifications/api/mark-all-read/route.ts +0 -34
  468. package/src/modules/notifications/api/openapi.ts +0 -76
  469. package/src/modules/notifications/api/role/route.ts +0 -14
  470. package/src/modules/notifications/api/route.ts +0 -92
  471. package/src/modules/notifications/api/settings/route.ts +0 -157
  472. package/src/modules/notifications/api/unread-count/route.ts +0 -38
  473. package/src/modules/notifications/backend/config/notifications/page.meta.ts +0 -22
  474. package/src/modules/notifications/backend/config/notifications/page.tsx +0 -12
  475. package/src/modules/notifications/cli.ts +0 -18
  476. package/src/modules/notifications/data/entities.ts +0 -99
  477. package/src/modules/notifications/data/validators.ts +0 -115
  478. package/src/modules/notifications/di.ts +0 -11
  479. package/src/modules/notifications/emails/NotificationEmail.tsx +0 -98
  480. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +0 -42
  481. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +0 -233
  482. package/src/modules/notifications/i18n/de.json +0 -50
  483. package/src/modules/notifications/i18n/en.json +0 -50
  484. package/src/modules/notifications/i18n/es.json +0 -50
  485. package/src/modules/notifications/i18n/pl.json +0 -50
  486. package/src/modules/notifications/index.ts +0 -12
  487. package/src/modules/notifications/lib/deliveryConfig.ts +0 -153
  488. package/src/modules/notifications/lib/deliveryStrategies.ts +0 -50
  489. package/src/modules/notifications/lib/events.ts +0 -48
  490. package/src/modules/notifications/lib/notificationBuilder.ts +0 -121
  491. package/src/modules/notifications/lib/notificationFactory.ts +0 -76
  492. package/src/modules/notifications/lib/notificationMapper.ts +0 -33
  493. package/src/modules/notifications/lib/notificationRecipients.ts +0 -83
  494. package/src/modules/notifications/lib/notificationService.ts +0 -414
  495. package/src/modules/notifications/lib/routeHelpers.ts +0 -151
  496. package/src/modules/notifications/lib/safeHref.ts +0 -29
  497. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +0 -336
  498. package/src/modules/notifications/migrations/Migration20260123000001.ts +0 -73
  499. package/src/modules/notifications/migrations/Migration20260126150000.ts +0 -39
  500. package/src/modules/notifications/migrations/Migration20260129082610.ts +0 -13
  501. package/src/modules/notifications/subscribers/deliver-notification.ts +0 -204
  502. package/src/modules/notifications/workers/create-notification.worker.ts +0 -122
  503. package/src/modules/sales/notifications.client.ts +0 -65
  504. package/src/modules/sales/notifications.ts +0 -82
  505. package/src/modules/sales/subscribers/quote-expiring-notification.ts +0 -53
  506. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -156
  507. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -156
  508. package/src/modules/sales/widgets/notifications/index.ts +0 -2
  509. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +0 -81
  510. package/src/modules/staff/notifications.ts +0 -71
  511. package/src/modules/workflows/notifications.ts +0 -25
  512. package/src/modules/workflows/subscribers/task-assigned-notification.ts +0 -53
@@ -654,57 +654,6 @@ describe('Rule Engine (Unit Tests)', () => {
654
654
  expect(result.errors).toBeDefined()
655
655
  expect(result.errors![0]).toContain('Rule count limit exceeded')
656
656
  })
657
-
658
- test('should emit execution_failed event when rule evaluation fails', async () => {
659
- const mockRule: Partial<BusinessRule> = {
660
- id: 'rule-1',
661
- ruleId: 'TEST-001',
662
- ruleName: 'Test Rule',
663
- ruleType: 'ACTION',
664
- entityType: 'WorkOrder',
665
- conditionExpression: { field: 'status', operator: '=', value: 'RELEASED' },
666
- enabled: true,
667
- tenantId: testTenantId,
668
- organizationId: testOrgId,
669
- }
670
-
671
- mockEm.find.mockResolvedValue([mockRule as BusinessRule])
672
- mockEm.create.mockReturnValue({ id: 'log-1' } as any)
673
- mockEm.persistAndFlush.mockResolvedValue(undefined)
674
-
675
- jest.mocked(ruleEvaluator.evaluateSingleRule).mockResolvedValue({
676
- rule: mockRule as BusinessRule,
677
- conditionsPassed: false,
678
- evaluationCompleted: false,
679
- evaluationTime: 1,
680
- error: 'Evaluation error',
681
- })
682
-
683
- const eventBus = { emitEvent: jest.fn().mockResolvedValue(undefined) }
684
-
685
- const context: RuleEngineContext = {
686
- entityType: 'WorkOrder',
687
- entityId: testEntityId,
688
- data: { status: 'RELEASED' },
689
- tenantId: testTenantId,
690
- organizationId: testOrgId,
691
- dryRun: false,
692
- }
693
-
694
- await ruleEngine.executeRules(mockEm, context, { eventBus })
695
-
696
- expect(eventBus.emitEvent).toHaveBeenCalledWith(
697
- 'business_rules.rule.execution_failed',
698
- expect.objectContaining({
699
- ruleId: 'TEST-001',
700
- ruleName: 'Test Rule',
701
- entityType: 'WorkOrder',
702
- errorMessage: 'Evaluation error',
703
- tenantId: testTenantId,
704
- organizationId: testOrgId,
705
- })
706
- )
707
- })
708
657
  })
709
658
 
710
659
  describe('logRuleExecution', () => {
@@ -1,5 +1,4 @@
1
1
  import type { EntityManager } from '@mikro-orm/core'
2
- import type { EventBus } from '@open-mercato/events'
3
2
  import { BusinessRule, RuleExecutionLog, type RuleType } from '../data/entities'
4
3
  import * as ruleEvaluator from './rule-evaluator'
5
4
  import * as actionExecutor from './action-executor'
@@ -86,19 +85,6 @@ export interface RuleDiscoveryOptions {
86
85
  ruleType?: RuleType
87
86
  }
88
87
 
89
- export type RuleEngineExecutionOptions = {
90
- eventBus?: Pick<EventBus, 'emitEvent'> | null
91
- }
92
-
93
- type RuleExecutionFailedPayload = {
94
- ruleId: string
95
- ruleName: string
96
- entityType?: string | null
97
- errorMessage?: string | null
98
- tenantId: string
99
- organizationId?: string | null
100
- }
101
-
102
88
  /**
103
89
  * Execute a function with a timeout
104
90
  */
@@ -127,8 +113,7 @@ async function withTimeout<T>(
127
113
  */
128
114
  export async function executeRules(
129
115
  em: EntityManager,
130
- context: RuleEngineContext,
131
- options: RuleEngineExecutionOptions = {}
116
+ context: RuleEngineContext
132
117
  ): Promise<RuleEngineResult> {
133
118
  // Validate input
134
119
  const validation = ruleEngineContextSchema.safeParse(context)
@@ -174,7 +159,7 @@ export async function executeRules(
174
159
  const executionPromise = (async () => {
175
160
  for (const rule of rules) {
176
161
  try {
177
- const ruleResult = await executeSingleRule(em, rule, context, options)
162
+ const ruleResult = await executeSingleRule(em, rule, context)
178
163
  executedRules.push(ruleResult)
179
164
 
180
165
  if (ruleResult.logId) {
@@ -192,17 +177,6 @@ export async function executeRules(
192
177
  `Unexpected error in rule execution [ruleId=${rule.ruleId}, type=${rule.ruleType}]: ${errorMessage}`
193
178
  )
194
179
 
195
- if (!context.dryRun) {
196
- await emitRuleExecutionFailed(options.eventBus, {
197
- ruleId: rule.ruleId,
198
- ruleName: rule.ruleName,
199
- entityType: context.entityType ?? null,
200
- errorMessage,
201
- tenantId: context.tenantId,
202
- organizationId: context.organizationId ?? null,
203
- })
204
- }
205
-
206
180
  executedRules.push({
207
181
  rule,
208
182
  conditionResult: false,
@@ -259,8 +233,7 @@ export async function executeRules(
259
233
  export async function executeSingleRule(
260
234
  em: EntityManager,
261
235
  rule: BusinessRule,
262
- context: RuleEngineContext,
263
- options: RuleEngineExecutionOptions = {}
236
+ context: RuleEngineContext
264
237
  ): Promise<RuleExecutionResult> {
265
238
  const startTime = Date.now()
266
239
 
@@ -296,15 +269,6 @@ export async function executeSingleRule(
296
269
  executionTime,
297
270
  error: result.error,
298
271
  })
299
-
300
- await emitRuleExecutionFailed(options.eventBus, {
301
- ruleId: rule.ruleId,
302
- ruleName: rule.ruleName,
303
- entityType: context.entityType ?? null,
304
- errorMessage: result.error ?? null,
305
- tenantId: context.tenantId,
306
- organizationId: context.organizationId ?? null,
307
- })
308
272
  }
309
273
 
310
274
  return {
@@ -382,15 +346,6 @@ export async function executeSingleRule(
382
346
  executionTime,
383
347
  error: enhancedError,
384
348
  })
385
-
386
- await emitRuleExecutionFailed(options.eventBus, {
387
- ruleId: rule.ruleId,
388
- ruleName: rule.ruleName,
389
- entityType: context.entityType ?? null,
390
- errorMessage: enhancedError,
391
- tenantId: context.tenantId,
392
- organizationId: context.organizationId ?? null,
393
- })
394
349
  }
395
350
 
396
351
  return {
@@ -589,12 +544,3 @@ export async function logRuleExecution(
589
544
 
590
545
  return log.id
591
546
  }
592
-
593
- async function emitRuleExecutionFailed(
594
- eventBus: Pick<EventBus, 'emitEvent'> | null | undefined,
595
- payload: RuleExecutionFailedPayload
596
- ): Promise<void> {
597
- if (!eventBus?.emitEvent) return
598
-
599
- await eventBus.emitEvent('business_rules.rule.execution_failed', payload).catch(() => undefined)
600
- }
@@ -420,12 +420,10 @@ export function PriceKindSettings() {
420
420
  <RowActions
421
421
  items={[
422
422
  {
423
- id: 'edit',
424
423
  label: t('catalog.priceKinds.actions.edit', 'Edit'),
425
424
  onSelect: () => openDialog({ mode: 'edit', entry }),
426
425
  },
427
426
  {
428
- id: 'delete',
429
427
  label: t('catalog.priceKinds.actions.delete', 'Delete'),
430
428
  destructive: true,
431
429
  onSelect: () => { void handleDelete(entry) },
@@ -221,8 +221,8 @@ export default function CategoriesDataTable() {
221
221
  canManage ? (
222
222
  <RowActions
223
223
  items={[
224
- { id: 'edit', label: t('catalog.categories.list.actions.edit', 'Edit'), href: `/backend/catalog/categories/${row.id}/edit` },
225
- { id: 'delete', label: t('catalog.categories.list.actions.delete', 'Delete'), destructive: true, onSelect: () => handleDelete(row) },
224
+ { label: t('catalog.categories.list.actions.edit', 'Edit'), href: `/backend/catalog/categories/${row.id}/edit` },
225
+ { label: t('catalog.categories.list.actions.delete', 'Delete'), destructive: true, onSelect: () => handleDelete(row) },
226
226
  ]}
227
227
  />
228
228
  ) : null
@@ -650,12 +650,10 @@ export default function ProductsDataTable() {
650
650
  <RowActions
651
651
  items={[
652
652
  {
653
- id: 'edit',
654
653
  label: t('catalog.products.table.actions.edit', 'Edit'),
655
654
  href: `/backend/catalog/products/${row.id}`,
656
655
  },
657
656
  {
658
- id: 'delete',
659
657
  label: t('catalog.products.table.actions.delete', 'Delete'),
660
658
  destructive: true,
661
659
  onSelect: () => {
@@ -681,7 +681,5 @@
681
681
  "deleteError": "Failed to delete variant."
682
682
  }
683
683
  }
684
- },
685
- "catalog.notifications.product.lowStock.title": "Low Stock Alert",
686
- "catalog.notifications.product.lowStock.body": "{productName}{sku, select, other { ({sku})}} is running low on stock ({currentStock} remaining, threshold: {threshold})"
684
+ }
687
685
  }
@@ -2,7 +2,6 @@ import type { ModuleCli } from '@open-mercato/shared/modules/registry'
2
2
  import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
3
3
  import type { ModuleConfigService } from './lib/module-config-service'
4
4
  import { parseBooleanToken } from '@open-mercato/shared/lib/boolean'
5
- import { DEFAULT_NOTIFICATION_DELIVERY_CONFIG, NOTIFICATIONS_DELIVERY_CONFIG_KEY } from '../notifications/lib/deliveryConfig'
6
5
 
7
6
  function envDisablesAutoIndexing(): boolean {
8
7
  const raw = process.env.DISABLE_VECTOR_SEARCH_AUTOINDEXING
@@ -32,11 +31,6 @@ const restoreDefaults: ModuleCli = {
32
31
  name: 'auto_index_enabled',
33
32
  value: defaultEnabled,
34
33
  },
35
- {
36
- moduleId: 'notifications',
37
- name: NOTIFICATIONS_DELIVERY_CONFIG_KEY,
38
- value: DEFAULT_NOTIFICATION_DELIVERY_CONFIG,
39
- },
40
34
  ],
41
35
  { force: true },
42
36
  )
@@ -194,7 +194,7 @@ export function CachePanel() {
194
194
  <header className="space-y-1">
195
195
  <h2 className="text-lg font-semibold">{t('configs.cache.title', 'Cache overview')}</h2>
196
196
  <p className="text-sm text-muted-foreground">
197
- {t('configs.cache.description', 'Inspect cached responses and clear segments when necessary.')}
197
+ {t('configs.cache.description', 'Inspect cached CRUD responses and clear segments when necessary.')}
198
198
  </p>
199
199
  </header>
200
200
  <div className="flex items-center gap-2 text-sm text-muted-foreground">
@@ -211,7 +211,7 @@ export function CachePanel() {
211
211
  <header className="space-y-1">
212
212
  <h2 className="text-lg font-semibold">{t('configs.cache.title', 'Cache overview')}</h2>
213
213
  <p className="text-sm text-muted-foreground">
214
- {t('configs.cache.description', 'Inspect cached responses and clear segments when necessary.')}
214
+ {t('configs.cache.description', 'Inspect cached CRUD responses and clear segments when necessary.')}
215
215
  </p>
216
216
  </header>
217
217
  <div className="rounded border border-red-200 bg-red-50 p-3 text-sm text-red-700">
@@ -235,7 +235,7 @@ export function CachePanel() {
235
235
  <div className="space-y-1">
236
236
  <h2 className="text-lg font-semibold">{t('configs.cache.title', 'Cache overview')}</h2>
237
237
  <p className="text-sm text-muted-foreground">
238
- {t('configs.cache.description', 'Inspect cached responses and clear segments when necessary.')}
238
+ {t('configs.cache.description', 'Inspect cached CRUD responses and clear segments when necessary.')}
239
239
  </p>
240
240
  {stats ? (
241
241
  <>
@@ -342,7 +342,7 @@ export function CachePanel() {
342
342
  </div>
343
343
  ) : (
344
344
  <p className="text-sm text-muted-foreground">
345
- {t('configs.cache.empty', 'No cached responses for this tenant.')}
345
+ {t('configs.cache.empty', 'No cached CRUD responses for this tenant.')}
346
346
  </p>
347
347
  )}
348
348
  </div>
@@ -35,14 +35,14 @@
35
35
  "configs.systemStatus.actions.purgeCacheUnavailable": "Cache service is unavailable.",
36
36
  "configs.config.nav.cache": "Cache",
37
37
  "configs.cache.title": "Cache overview",
38
- "configs.cache.description": "Inspect cached responses and clear segments when necessary.",
38
+ "configs.cache.description": "Inspect cached CRUD responses and clear segments when necessary.",
39
39
  "configs.cache.loading": "Loading cache statistics…",
40
40
  "configs.cache.loadError": "Failed to load cache statistics.",
41
41
  "configs.cache.retry": "Retry",
42
42
  "configs.cache.refresh": "Refresh",
43
43
  "configs.cache.generatedAt": "Stats generated {{timestamp}}",
44
44
  "configs.cache.totalEntries": "{{count}} cached entries",
45
- "configs.cache.empty": "No cached responses for this tenant.",
45
+ "configs.cache.empty": "No cached CRUD responses for this tenant.",
46
46
  "configs.cache.purgeAll": "Purge all cache",
47
47
  "configs.cache.purgeAllLoading": "Purging…",
48
48
  "configs.cache.purgeAllConfirm": "Purge all cached entries for this tenant?",
@@ -64,8 +64,6 @@
64
64
  "configs.systemStatus.categories.profilingDescription": "Flags that control request and query profiling outputs.",
65
65
  "configs.systemStatus.categories.logging": "Logging",
66
66
  "configs.systemStatus.categories.loggingDescription": "Tune verbosity and SQL logging for diagnostics.",
67
- "configs.systemStatus.categories.security": "Security",
68
- "configs.systemStatus.categories.securityDescription": "Password policy requirements enforced at login and user creation.",
69
67
  "configs.systemStatus.categories.caching": "Caching",
70
68
  "configs.systemStatus.categories.cachingDescription": "Cache providers and TTL controls for backend responses.",
71
69
  "configs.systemStatus.categories.queryIndex": "Query index",
@@ -86,14 +84,6 @@
86
84
  "configs.systemStatus.variables.logVerbosity.description": "Overrides structured log verbosity such as debug or trace.",
87
85
  "configs.systemStatus.variables.logLevel.label": "Log level",
88
86
  "configs.systemStatus.variables.logLevel.description": "Fallback log level applied when verbosity is not set.",
89
- "configs.systemStatus.variables.passwordMinLength.label": "Password min length",
90
- "configs.systemStatus.variables.passwordMinLength.description": "Minimum number of characters required for passwords.",
91
- "configs.systemStatus.variables.passwordRequireDigit.label": "Password requires digit",
92
- "configs.systemStatus.variables.passwordRequireDigit.description": "Require at least one numeric character.",
93
- "configs.systemStatus.variables.passwordRequireUppercase.label": "Password requires uppercase",
94
- "configs.systemStatus.variables.passwordRequireUppercase.description": "Require at least one uppercase letter.",
95
- "configs.systemStatus.variables.passwordRequireSpecial.label": "Password requires special",
96
- "configs.systemStatus.variables.passwordRequireSpecial.description": "Require at least one special character.",
97
87
  "configs.systemStatus.variables.enableCrudApiCache.label": "CRUD API cache",
98
88
  "configs.systemStatus.variables.enableCrudApiCache.description": "Enable the CRUD API response cache layer.",
99
89
  "configs.systemStatus.variables.cacheStrategy.label": "Cache strategy",
@@ -35,14 +35,14 @@
35
35
  "configs.systemStatus.actions.purgeCacheUnavailable": "Usługa pamięci podręcznej jest niedostępna.",
36
36
  "configs.config.nav.cache": "Pamięć podręczna",
37
37
  "configs.cache.title": "Podgląd pamięci podręcznej",
38
- "configs.cache.description": "Przeglądaj zapisane odpowiedzi i czyść segmenty w razie potrzeby.",
38
+ "configs.cache.description": "Przeglądaj zapisane odpowiedzi CRUD i czyść segmenty w razie potrzeby.",
39
39
  "configs.cache.loading": "Ładowanie statystyk pamięci podręcznej…",
40
40
  "configs.cache.loadError": "Nie udało się wczytać statystyk pamięci podręcznej.",
41
41
  "configs.cache.retry": "Spróbuj ponownie",
42
42
  "configs.cache.refresh": "Odśwież",
43
43
  "configs.cache.generatedAt": "Statystyki z {{timestamp}}",
44
44
  "configs.cache.totalEntries": "{{count}} wpisów w pamięci podręcznej",
45
- "configs.cache.empty": "Brak zapisanych odpowiedzi dla tego tenanta.",
45
+ "configs.cache.empty": "Brak zapisanych odpowiedzi CRUD dla tego tenanta.",
46
46
  "configs.cache.purgeAll": "Wyczyść całą pamięć",
47
47
  "configs.cache.purgeAllLoading": "Czyszczenie…",
48
48
  "configs.cache.purgeAllConfirm": "Wyczyścić wszystkie wpisy pamięci podręcznej dla tego tenanta?",
@@ -64,8 +64,6 @@
64
64
  "configs.systemStatus.categories.profilingDescription": "Flagi sterujące generowaniem danych z profilowania zapytań i żądań.",
65
65
  "configs.systemStatus.categories.logging": "Logowanie",
66
66
  "configs.systemStatus.categories.loggingDescription": "Dostosuj poziom logowania i zapisywanie zapytań SQL na potrzeby diagnostyki.",
67
- "configs.systemStatus.categories.security": "Bezpieczeństwo",
68
- "configs.systemStatus.categories.securityDescription": "Wymagania polityki haseł stosowane przy logowaniu i tworzeniu użytkowników.",
69
67
  "configs.systemStatus.categories.caching": "Buforowanie",
70
68
  "configs.systemStatus.categories.cachingDescription": "Mechanizmy cache oraz kontrola czasu życia odpowiedzi backendu.",
71
69
  "configs.systemStatus.categories.queryIndex": "Indeks zapytań",
@@ -86,14 +84,6 @@
86
84
  "configs.systemStatus.variables.logVerbosity.description": "Nadpisuje poziom szczegółowości logów, np. debug lub trace.",
87
85
  "configs.systemStatus.variables.logLevel.label": "Poziom logowania",
88
86
  "configs.systemStatus.variables.logLevel.description": "Domyślny poziom logowania używany, gdy nie ustawiono szczegółowości.",
89
- "configs.systemStatus.variables.passwordMinLength.label": "Minimalna długość hasła",
90
- "configs.systemStatus.variables.passwordMinLength.description": "Minimalna liczba znaków wymagana w haśle.",
91
- "configs.systemStatus.variables.passwordRequireDigit.label": "Hasło wymaga cyfry",
92
- "configs.systemStatus.variables.passwordRequireDigit.description": "Wymagaj co najmniej jednej cyfry.",
93
- "configs.systemStatus.variables.passwordRequireUppercase.label": "Hasło wymaga wielkiej litery",
94
- "configs.systemStatus.variables.passwordRequireUppercase.description": "Wymagaj co najmniej jednej wielkiej litery.",
95
- "configs.systemStatus.variables.passwordRequireSpecial.label": "Hasło wymaga znaku specjalnego",
96
- "configs.systemStatus.variables.passwordRequireSpecial.description": "Wymagaj co najmniej jednego znaku specjalnego.",
97
87
  "configs.systemStatus.variables.enableCrudApiCache.label": "Cache API CRUD",
98
88
  "configs.systemStatus.variables.enableCrudApiCache.description": "Włącza warstwę buforowania odpowiedzi API CRUD.",
99
89
  "configs.systemStatus.variables.cacheStrategy.label": "Strategia cache",
@@ -19,14 +19,7 @@ type SystemStatusVariableDefinition = {
19
19
  defaultValue: string | null
20
20
  }
21
21
 
22
- const CATEGORY_ORDER: SystemStatusCategoryKey[] = [
23
- 'profiling',
24
- 'logging',
25
- 'security',
26
- 'caching',
27
- 'query_index',
28
- 'entities',
29
- ]
22
+ const CATEGORY_ORDER: SystemStatusCategoryKey[] = ['profiling', 'logging', 'caching', 'query_index', 'entities']
30
23
 
31
24
  const CATEGORY_METADATA: Record<
32
25
  SystemStatusCategoryKey,
@@ -40,10 +33,6 @@ const CATEGORY_METADATA: Record<
40
33
  labelKey: 'configs.systemStatus.categories.logging',
41
34
  descriptionKey: 'configs.systemStatus.categories.loggingDescription',
42
35
  },
43
- security: {
44
- labelKey: 'configs.systemStatus.categories.security',
45
- descriptionKey: 'configs.systemStatus.categories.securityDescription',
46
- },
47
36
  caching: {
48
37
  labelKey: 'configs.systemStatus.categories.caching',
49
38
  descriptionKey: 'configs.systemStatus.categories.cachingDescription',
@@ -124,42 +113,6 @@ export const SYSTEM_STATUS_VARIABLES: SystemStatusVariableDefinition[] = [
124
113
  docUrl: `${SYSTEM_STATUS_DOC_BASE}#log_level`,
125
114
  defaultValue: '',
126
115
  },
127
- {
128
- key: 'OM_PASSWORD_MIN_LENGTH',
129
- category: 'security',
130
- kind: 'string',
131
- labelKey: 'configs.systemStatus.variables.passwordMinLength.label',
132
- descriptionKey: 'configs.systemStatus.variables.passwordMinLength.description',
133
- docUrl: `${SYSTEM_STATUS_DOC_BASE}#om_password_min_length`,
134
- defaultValue: '6',
135
- },
136
- {
137
- key: 'OM_PASSWORD_REQUIRE_DIGIT',
138
- category: 'security',
139
- kind: 'boolean',
140
- labelKey: 'configs.systemStatus.variables.passwordRequireDigit.label',
141
- descriptionKey: 'configs.systemStatus.variables.passwordRequireDigit.description',
142
- docUrl: `${SYSTEM_STATUS_DOC_BASE}#om_password_require_digit`,
143
- defaultValue: 'true',
144
- },
145
- {
146
- key: 'OM_PASSWORD_REQUIRE_UPPERCASE',
147
- category: 'security',
148
- kind: 'boolean',
149
- labelKey: 'configs.systemStatus.variables.passwordRequireUppercase.label',
150
- descriptionKey: 'configs.systemStatus.variables.passwordRequireUppercase.description',
151
- docUrl: `${SYSTEM_STATUS_DOC_BASE}#om_password_require_uppercase`,
152
- defaultValue: 'true',
153
- },
154
- {
155
- key: 'OM_PASSWORD_REQUIRE_SPECIAL',
156
- category: 'security',
157
- kind: 'boolean',
158
- labelKey: 'configs.systemStatus.variables.passwordRequireSpecial.label',
159
- descriptionKey: 'configs.systemStatus.variables.passwordRequireSpecial.description',
160
- docUrl: `${SYSTEM_STATUS_DOC_BASE}#om_password_require_special`,
161
- defaultValue: 'true',
162
- },
163
116
  {
164
117
  key: 'ENABLE_CRUD_API_CACHE',
165
118
  category: 'caching',
@@ -1,7 +1,6 @@
1
1
  export type SystemStatusCategoryKey =
2
2
  | 'profiling'
3
3
  | 'logging'
4
- | 'security'
5
4
  | 'caching'
6
5
  | 'query_index'
7
6
  | 'entities'
@@ -11,7 +11,6 @@ import { seedExampleWorkflows } from '@open-mercato/core/modules/workflows/lib/s
11
11
  import { seedPlannerAvailabilityRuleSetDefaults, seedPlannerUnavailabilityReasons } from '@open-mercato/core/modules/planner/lib/seeds'
12
12
  import { seedResourcesAddressTypes, seedResourcesCapacityUnits, seedResourcesResourceExamples } from '@open-mercato/core/modules/resources/lib/seeds'
13
13
  import { seedStaffTeamExamples } from '@open-mercato/core/modules/staff/lib/seeds'
14
- import { appendWidgetsToRoles, resolveAnalyticsWidgetIds } from '@open-mercato/core/modules/dashboards/lib/role-widgets'
15
14
  import { collectCrudCacheStats, purgeCrudCacheSegment } from '@open-mercato/shared/lib/crud/cache-stats'
16
15
  import { isCrudCacheEnabled, resolveCrudCache } from '@open-mercato/shared/lib/crud/cache'
17
16
  import * as semver from 'semver'
@@ -371,23 +370,6 @@ export const upgradeActions: UpgradeActionDefinition[] = [
371
370
  await reindexModules(em, ['planner', 'staff', 'resources'], { tenantId, organizationId, vectorService })
372
371
  },
373
372
  },
374
- {
375
- id: 'configs.upgrades.dashboards.analytics_widgets',
376
- version: '0.4.2',
377
- messageKey: 'upgrades.v042.message',
378
- ctaKey: 'upgrades.v042.cta',
379
- successKey: 'upgrades.v042.success',
380
- loadingKey: 'upgrades.v042.loading',
381
- async run({ em, tenantId, organizationId }) {
382
- const widgetIds = await resolveAnalyticsWidgetIds()
383
- await appendWidgetsToRoles(em, {
384
- tenantId,
385
- organizationId,
386
- roleNames: ['admin', 'employee'],
387
- widgetIds,
388
- })
389
- },
390
- },
391
373
  ]
392
374
 
393
375
  export function actionsUpToVersion(version: string): UpgradeActionDefinition[] {
@@ -256,14 +256,12 @@ export default function CurrenciesPage() {
256
256
  <RowActions
257
257
  items={[
258
258
  {
259
- id: 'edit',
260
259
  label: t('common.edit'),
261
260
  href: `/backend/currencies/${row.id}`,
262
261
  },
263
262
  ...(!row.isBase
264
263
  ? [
265
264
  {
266
- id: 'set-base',
267
265
  label: t('currencies.list.actions.setBase'),
268
266
  onSelect: () => handleSetBase(row),
269
267
  },
@@ -272,7 +270,6 @@ export default function CurrenciesPage() {
272
270
  ...(!row.isBase
273
271
  ? [
274
272
  {
275
- id: 'delete',
276
273
  label: t('common.delete'),
277
274
  destructive: true,
278
275
  onSelect: () => handleDelete(row),
@@ -279,12 +279,10 @@ export default function ExchangeRatesPage() {
279
279
  <RowActions
280
280
  items={[
281
281
  {
282
- id: 'edit',
283
282
  label: t('common.edit'),
284
283
  href: `/backend/exchange-rates/${row.id}`,
285
284
  },
286
285
  {
287
- id: 'delete',
288
286
  label: t('common.delete'),
289
287
  destructive: true,
290
288
  onSelect: () => handleDelete(row),
@@ -597,17 +597,14 @@ export default function CustomersCompaniesPage() {
597
597
  <RowActions
598
598
  items={[
599
599
  {
600
- id: 'view',
601
600
  label: t('customers.companies.list.actions.view'),
602
601
  onSelect: () => { router.push(`/backend/customers/companies/${row.id}`) },
603
602
  },
604
603
  {
605
- id: 'open-new-tab',
606
604
  label: t('customers.companies.list.actions.openInNewTab'),
607
605
  onSelect: () => window.open(`/backend/customers/companies/${row.id}`, '_blank', 'noopener'),
608
606
  },
609
607
  {
610
- id: 'delete',
611
608
  label: t('customers.companies.list.actions.delete'),
612
609
  destructive: true,
613
610
  onSelect: () => handleDelete(row),
@@ -889,12 +889,10 @@ export default function CustomersDealsPage() {
889
889
  <RowActions
890
890
  items={[
891
891
  {
892
- id: 'edit',
893
892
  label: t('customers.deals.list.actions.edit', 'Edit'),
894
893
  onSelect: () => { router.push(`/backend/customers/deals/${row.id}`) },
895
894
  },
896
895
  {
897
- id: 'open-new-tab',
898
896
  label: t('customers.deals.list.actions.openInNewTab', 'Open in new tab'),
899
897
  onSelect: () => {
900
898
  if (typeof window !== 'undefined') {
@@ -903,7 +901,6 @@ export default function CustomersDealsPage() {
903
901
  },
904
902
  },
905
903
  {
906
- id: 'delete',
907
904
  label: isDeleting
908
905
  ? t('customers.deals.list.actions.deleting', 'Deleting…')
909
906
  : t('customers.deals.list.actions.delete', 'Delete'),
@@ -614,17 +614,14 @@ export default function CustomersPeoplePage() {
614
614
  <RowActions
615
615
  items={[
616
616
  {
617
- id: 'view',
618
617
  label: t('customers.people.list.actions.view'),
619
618
  onSelect: () => { router.push(`/backend/customers/people/${row.id}`) },
620
619
  },
621
620
  {
622
- id: 'open-new-tab',
623
621
  label: t('customers.people.list.actions.openInNewTab'),
624
622
  onSelect: () => window.open(`/backend/customers/people/${row.id}`, '_blank', 'noopener'),
625
623
  },
626
624
  {
627
- id: 'delete',
628
625
  label: t('customers.people.list.actions.delete'),
629
626
  destructive: true,
630
627
  onSelect: () => handleDelete(row),
@@ -35,9 +35,6 @@ import { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'
35
35
  import type { CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'
36
36
  import { E } from '#generated/entities.ids.generated'
37
37
  import { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
38
- import { resolveNotificationService } from '../../notifications/lib/notificationService'
39
- import { buildNotificationFromType } from '../../notifications/lib/notificationBuilder'
40
- import { notificationTypes } from '../notifications'
41
38
 
42
39
  const DEAL_ENTITY_ID = 'customers:customer_deal'
43
40
  const dealCrudIndexer: CrudIndexerConfig<CustomerDeal> = {
@@ -284,8 +281,6 @@ const updateDealCommand: CommandHandler<DealUpdateInput, { dealId: string }> = {
284
281
  ensureTenantScope(ctx, record.tenantId)
285
282
  ensureOrganizationScope(ctx, record.organizationId)
286
283
 
287
- const previousStatus = record.status
288
-
289
284
  if (parsed.title !== undefined) record.title = parsed.title
290
285
  if (parsed.description !== undefined) record.description = parsed.description ?? null
291
286
  if (parsed.status !== undefined) record.status = parsed.status ?? record.status
@@ -324,40 +319,6 @@ const updateDealCommand: CommandHandler<DealUpdateInput, { dealId: string }> = {
324
319
  indexer: dealCrudIndexer,
325
320
  })
326
321
 
327
- // Send notifications for deal won/lost status changes
328
- const newStatus = record.status
329
- const normalizedStatus = newStatus === 'win' ? 'won' : newStatus === 'loose' ? 'lost' : newStatus
330
- if (previousStatus !== newStatus && (normalizedStatus === 'won' || normalizedStatus === 'lost') && record.ownerUserId) {
331
- try {
332
- const notificationService = resolveNotificationService(ctx.container)
333
- const notificationType = normalizedStatus === 'won' ? 'customers.deal.won' : 'customers.deal.lost'
334
- const typeDef = notificationTypes.find((type) => type.type === notificationType)
335
- if (typeDef) {
336
- const valueDisplay = record.valueAmount && record.valueCurrency
337
- ? `${record.valueCurrency} ${record.valueAmount}`
338
- : ''
339
-
340
- const notificationInput = buildNotificationFromType(typeDef, {
341
- recipientUserId: record.ownerUserId,
342
- bodyVariables: {
343
- dealTitle: record.title,
344
- dealValue: valueDisplay,
345
- },
346
- sourceEntityType: 'customers:customer_deal',
347
- sourceEntityId: record.id,
348
- linkHref: `/backend/customers/deals/${record.id}`,
349
- })
350
-
351
- await notificationService.create(notificationInput, {
352
- tenantId: record.tenantId,
353
- organizationId: record.organizationId,
354
- })
355
- }
356
- } catch {
357
- // Notification creation is non-critical, don't fail the command
358
- }
359
- }
360
-
361
322
  return { dealId: record.id }
362
323
  },
363
324
  buildLog: async ({ snapshots, ctx }) => {
@@ -253,7 +253,6 @@ export function CustomerTodosTable(): React.JSX.Element {
253
253
  <RowActions
254
254
  items={[
255
255
  {
256
- id: 'open-customer',
257
256
  label: t('customers.workPlan.customerTodos.table.actions.openCustomer'),
258
257
  href: customerLink,
259
258
  },
@@ -943,9 +943,5 @@
943
943
  "customers.workPlan.customerTodos.table.state.empty": "No customer tasks yet.",
944
944
  "customers.workPlan.customerTodos.table.error.load": "Failed to load customer tasks.",
945
945
  "customers.workPlan.customerTodos.table.export.view": "Exports the current list with filters and visible columns.",
946
- "customers.workPlan.customerTodos.table.export.full": "Exports every linked task field, including hidden attributes.",
947
- "customers.notifications.deal.won.title": "Deal Won",
948
- "customers.notifications.deal.won.body": "{dealTitle} has been marked as won{dealValue, select, other { ({dealValue})}}",
949
- "customers.notifications.deal.lost.title": "Deal Lost",
950
- "customers.notifications.deal.lost.body": "{dealTitle} has been marked as lost"
946
+ "customers.workPlan.customerTodos.table.export.full": "Exports every linked task field, including hidden attributes."
951
947
  }