@open-mercato/core 0.7.0 → 0.7.1-develop.7103.1.41ff100d93

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 (847) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/helpers/integration/api.js +13 -1
  3. package/dist/helpers/integration/api.js.map +2 -2
  4. package/dist/helpers/integration/communicationChannelsFixtures.js +19 -0
  5. package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
  6. package/dist/modules/api_keys/api/keys/route.js +1 -1
  7. package/dist/modules/api_keys/api/keys/route.js.map +2 -2
  8. package/dist/modules/api_keys/backend/api-keys/page.js +3 -1
  9. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  10. package/dist/modules/api_keys/di.js +9 -0
  11. package/dist/modules/api_keys/di.js.map +7 -0
  12. package/dist/modules/api_keys/services/principalService.js +31 -0
  13. package/dist/modules/api_keys/services/principalService.js.map +7 -0
  14. package/dist/modules/attachments/api/route.js +2 -2
  15. package/dist/modules/attachments/api/route.js.map +2 -2
  16. package/dist/modules/attachments/components/AttachmentLibrary.js +2 -0
  17. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  18. package/dist/modules/attachments/di.js +11 -1
  19. package/dist/modules/attachments/di.js.map +2 -2
  20. package/dist/modules/attachments/index.js.map +1 -1
  21. package/dist/modules/attachments/lib/attachment-service.js +313 -0
  22. package/dist/modules/attachments/lib/attachment-service.js.map +7 -0
  23. package/dist/modules/attachments/lib/scoped-upload-service.js +15 -2
  24. package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
  25. package/dist/modules/attachments/lib/upload-limits.js +6 -2
  26. package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
  27. package/dist/modules/audit_logs/backend/audit-logs/page.js +6 -0
  28. package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
  29. package/dist/modules/audit_logs/lib/display-helpers.js +19 -11
  30. package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
  31. package/dist/modules/audit_logs/services/actionLogService.js +57 -12
  32. package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
  33. package/dist/modules/auth/acl.js +30 -5
  34. package/dist/modules/auth/acl.js.map +2 -2
  35. package/dist/modules/auth/api/feature-check.js +8 -2
  36. package/dist/modules/auth/api/feature-check.js.map +2 -2
  37. package/dist/modules/auth/api/login.js +4 -1
  38. package/dist/modules/auth/api/login.js.map +2 -2
  39. package/dist/modules/auth/api/reset/validate.js +55 -0
  40. package/dist/modules/auth/api/reset/validate.js.map +7 -0
  41. package/dist/modules/auth/api/roles/acl/route.js +28 -33
  42. package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
  43. package/dist/modules/auth/api/session/refresh.js +25 -1
  44. package/dist/modules/auth/api/session/refresh.js.map +2 -2
  45. package/dist/modules/auth/api/users/acl/route.js +96 -51
  46. package/dist/modules/auth/api/users/acl/route.js.map +2 -2
  47. package/dist/modules/auth/api/users/route.js +13 -5
  48. package/dist/modules/auth/api/users/route.js.map +2 -2
  49. package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +5 -1
  50. package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
  51. package/dist/modules/auth/backend/roles/page.js +3 -1
  52. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  53. package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +5 -1
  54. package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
  55. package/dist/modules/auth/backend/users/page.js +2 -1
  56. package/dist/modules/auth/backend/users/page.js.map +2 -2
  57. package/dist/modules/auth/commands/acl.js +254 -0
  58. package/dist/modules/auth/commands/acl.js.map +7 -0
  59. package/dist/modules/auth/components/AclEditor.js +39 -30
  60. package/dist/modules/auth/components/AclEditor.js.map +2 -2
  61. package/dist/modules/auth/data/entities.js.map +2 -2
  62. package/dist/modules/auth/data/validators.js +5 -1
  63. package/dist/modules/auth/data/validators.js.map +2 -2
  64. package/dist/modules/auth/di.js +35 -9
  65. package/dist/modules/auth/di.js.map +2 -2
  66. package/dist/modules/auth/frontend/reset/[token]/page.js +46 -0
  67. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  68. package/dist/modules/auth/lib/grantChecks.js.map +2 -2
  69. package/dist/modules/auth/lib/userIdFilter.js +16 -0
  70. package/dist/modules/auth/lib/userIdFilter.js.map +7 -0
  71. package/dist/modules/auth/services/authService.js +16 -2
  72. package/dist/modules/auth/services/authService.js.map +2 -2
  73. package/dist/modules/auth/services/principalService.js +200 -0
  74. package/dist/modules/auth/services/principalService.js.map +7 -0
  75. package/dist/modules/auth/services/rbacService.js +67 -24
  76. package/dist/modules/auth/services/rbacService.js.map +3 -3
  77. package/dist/modules/auth/services/roleOrganizationScope.js +41 -0
  78. package/dist/modules/auth/services/roleOrganizationScope.js.map +7 -0
  79. package/dist/modules/business_rules/backend/logs/page.js +3 -1
  80. package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
  81. package/dist/modules/business_rules/backend/rules/page.js +3 -1
  82. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  83. package/dist/modules/business_rules/backend/sets/page.js +3 -1
  84. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  85. package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
  86. package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
  87. package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
  88. package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
  89. package/dist/modules/catalog/ai-agents.js +1 -1
  90. package/dist/modules/catalog/ai-agents.js.map +1 -1
  91. package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
  92. package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
  93. package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +5 -2
  94. package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
  95. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -0
  96. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  97. package/dist/modules/catalog/components/products/ProductsDataTable.js +7 -1
  98. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  99. package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +2 -0
  100. package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
  101. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +9 -1
  102. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
  103. package/dist/modules/communication_channels/api/post/test-seed/route.js +95 -10
  104. package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
  105. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +3 -0
  106. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
  107. package/dist/modules/communication_channels/commands/ingest-inbound-message.js +14 -1
  108. package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
  109. package/dist/modules/communication_channels/di.js +7 -1
  110. package/dist/modules/communication_channels/di.js.map +2 -2
  111. package/dist/modules/communication_channels/lib/email-capabilities.js +4 -1
  112. package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
  113. package/dist/modules/communication_channels/lib/outbound-recipient.js +33 -0
  114. package/dist/modules/communication_channels/lib/outbound-recipient.js.map +7 -0
  115. package/dist/modules/communication_channels/lib/resolve-channel-type.js +51 -0
  116. package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +7 -0
  117. package/dist/modules/communication_channels/lib/test-seed.js +41 -2
  118. package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
  119. package/dist/modules/configs/lib/system-status.js +9 -0
  120. package/dist/modules/configs/lib/system-status.js.map +2 -2
  121. package/dist/modules/currencies/backend/currencies/page.js +3 -1
  122. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  123. package/dist/modules/currencies/backend/exchange-rates/page.js +3 -1
  124. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  125. package/dist/modules/currencies/services/rateFetchingService.js +6 -1
  126. package/dist/modules/currencies/services/rateFetchingService.js.map +2 -2
  127. package/dist/modules/customer_accounts/api/admin/domain-mappings.js +9 -0
  128. package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
  129. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +3 -1
  130. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
  131. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +3 -1
  132. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
  133. package/dist/modules/customer_accounts/services/domainMappingService.js +10 -0
  134. package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
  135. package/dist/modules/customers/ai-tools/companies-pack.js +4 -1
  136. package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
  137. package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
  138. package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
  139. package/dist/modules/customers/ai-tools/deals-pack.js +52 -6
  140. package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
  141. package/dist/modules/customers/ai-tools/people-pack.js +4 -1
  142. package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
  143. package/dist/modules/customers/api/activities/route.js +48 -6
  144. package/dist/modules/customers/api/activities/route.js.map +2 -2
  145. package/dist/modules/customers/api/companies/[id]/people/route.js +20 -64
  146. package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
  147. package/dist/modules/customers/api/companies/[id]/route.js +17 -94
  148. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  149. package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +8 -5
  150. package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
  151. package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
  152. package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
  153. package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
  154. package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
  155. package/dist/modules/customers/api/deals/[id]/route.js +8 -25
  156. package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
  157. package/dist/modules/customers/api/deals/[id]/stats/route.js +3 -22
  158. package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
  159. package/dist/modules/customers/api/deals/aggregate/route.js +14 -9
  160. package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
  161. package/dist/modules/customers/api/deals/map/route.js +5 -5
  162. package/dist/modules/customers/api/deals/map/route.js.map +2 -2
  163. package/dist/modules/customers/api/deals/route.js +38 -1
  164. package/dist/modules/customers/api/deals/route.js.map +2 -2
  165. package/dist/modules/customers/api/entity-roles-factory.js +4 -4
  166. package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
  167. package/dist/modules/customers/api/interactions/route.js +3 -1
  168. package/dist/modules/customers/api/interactions/route.js.map +2 -2
  169. package/dist/modules/customers/api/interactions/tasks/route.js +27 -4
  170. package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
  171. package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +4 -3
  172. package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
  173. package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
  174. package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
  175. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
  176. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
  177. package/dist/modules/customers/api/people/[id]/route.js +11 -10
  178. package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
  179. package/dist/modules/customers/api/people/check-phone/route.js +51 -9
  180. package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
  181. package/dist/modules/customers/api/todos/route.js +30 -5
  182. package/dist/modules/customers/api/todos/route.js.map +2 -2
  183. package/dist/modules/customers/backend/customers/companies/page.js +4 -2
  184. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  185. package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
  186. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  187. package/dist/modules/customers/backend/customers/deals/page.js +5 -2
  188. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  189. package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +4 -13
  190. package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
  191. package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +85 -14
  192. package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
  193. package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +18 -0
  194. package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +7 -0
  195. package/dist/modules/customers/backend/customers/people/page.js +4 -2
  196. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  197. package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +9 -3
  198. package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
  199. package/dist/modules/customers/commands/deals.js +21 -34
  200. package/dist/modules/customers/commands/deals.js.map +2 -2
  201. package/dist/modules/customers/commands/interactions.js.map +1 -1
  202. package/dist/modules/customers/commands/personCompanyLinks.js +131 -2
  203. package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
  204. package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
  205. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  206. package/dist/modules/customers/components/DealsKpiStrip.js +7 -6
  207. package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
  208. package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
  209. package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
  210. package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
  211. package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
  212. package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
  213. package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
  214. package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
  215. package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
  216. package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
  217. package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
  218. package/dist/modules/customers/components/calendar/EventPeekPopover.js +3 -2
  219. package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
  220. package/dist/modules/customers/components/calendar/editor/PeopleField.js +40 -5
  221. package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
  222. package/dist/modules/customers/components/calendar/editor/hooks.js +2 -1
  223. package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
  224. package/dist/modules/customers/components/calendar/types.js +1 -1
  225. package/dist/modules/customers/components/calendar/types.js.map +2 -2
  226. package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -4
  227. package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
  228. package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -1
  229. package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
  230. package/dist/modules/customers/components/detail/DealForm.js +19 -7
  231. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  232. package/dist/modules/customers/components/detail/DealsSection.js +6 -5
  233. package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
  234. package/dist/modules/customers/components/detail/EntityTagsDialog.js +35 -11
  235. package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
  236. package/dist/modules/customers/components/detail/PersonCompaniesSection.js +3 -1
  237. package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
  238. package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +19 -13
  239. package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
  240. package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
  241. package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
  242. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
  243. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
  244. package/dist/modules/customers/components/detail/utils.js +5 -5
  245. package/dist/modules/customers/components/detail/utils.js.map +2 -2
  246. package/dist/modules/customers/data/entities.js.map +1 -1
  247. package/dist/modules/customers/data/validators.js +32 -3
  248. package/dist/modules/customers/data/validators.js.map +2 -2
  249. package/dist/modules/customers/events.js +5 -0
  250. package/dist/modules/customers/events.js.map +2 -2
  251. package/dist/modules/customers/lib/calendar/conflicts.js +8 -2
  252. package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
  253. package/dist/modules/customers/lib/calendar/editorPayload.js +3 -2
  254. package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
  255. package/dist/modules/customers/lib/calendar/mapItem.js +8 -3
  256. package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
  257. package/dist/modules/customers/lib/calendar/participantIdentity.js +9 -0
  258. package/dist/modules/customers/lib/calendar/participantIdentity.js.map +7 -0
  259. package/dist/modules/customers/lib/closureStage.js +45 -0
  260. package/dist/modules/customers/lib/closureStage.js.map +7 -0
  261. package/dist/modules/customers/lib/dealStatus.js +30 -0
  262. package/dist/modules/customers/lib/dealStatus.js.map +2 -2
  263. package/dist/modules/customers/lib/detailReadAccess.js +12 -0
  264. package/dist/modules/customers/lib/detailReadAccess.js.map +7 -0
  265. package/dist/modules/customers/lib/findPeopleByAddresses.js +1 -0
  266. package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
  267. package/dist/modules/customers/lib/personCompanies.js +100 -2
  268. package/dist/modules/customers/lib/personCompanies.js.map +2 -2
  269. package/dist/modules/customers/lib/todoCompatibility.js +12 -0
  270. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  271. package/dist/modules/dashboards/lib/widgetScope.js +6 -1
  272. package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
  273. package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
  274. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  275. package/dist/modules/data_sync/lib/abandoned-run.js +19 -0
  276. package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
  277. package/dist/modules/data_sync/lib/sync-engine.js +72 -6
  278. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  279. package/dist/modules/data_sync/workers/sync-export.js +5 -1
  280. package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
  281. package/dist/modules/data_sync/workers/sync-import.js +5 -1
  282. package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
  283. package/dist/modules/devices/acl.js +9 -1
  284. package/dist/modules/devices/acl.js.map +2 -2
  285. package/dist/modules/devices/api/admin/devices/[id]/route.js +5 -32
  286. package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
  287. package/dist/modules/devices/api/admin/devices/route.js +14 -1
  288. package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
  289. package/dist/modules/devices/api/deviceList.js +99 -12
  290. package/dist/modules/devices/api/deviceList.js.map +2 -2
  291. package/dist/modules/devices/api/deviceSerialization.js +46 -0
  292. package/dist/modules/devices/api/deviceSerialization.js.map +7 -0
  293. package/dist/modules/devices/api/openapi.js +3 -1
  294. package/dist/modules/devices/api/openapi.js.map +2 -2
  295. package/dist/modules/devices/api/route.js +9 -1
  296. package/dist/modules/devices/api/route.js.map +2 -2
  297. package/dist/modules/devices/backend/devices/[id]/page.js +10 -26
  298. package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
  299. package/dist/modules/devices/backend/devices/create/page.js +17 -1
  300. package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
  301. package/dist/modules/devices/backend/devices/page.js +28 -34
  302. package/dist/modules/devices/backend/devices/page.js.map +2 -2
  303. package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +34 -0
  304. package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +7 -0
  305. package/dist/modules/devices/backend/devices/userOptions.js +52 -0
  306. package/dist/modules/devices/backend/devices/userOptions.js.map +7 -0
  307. package/dist/modules/devices/setup.js +6 -2
  308. package/dist/modules/devices/setup.js.map +2 -2
  309. package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
  310. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  311. package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
  312. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  313. package/dist/modules/directory/di.js +9 -0
  314. package/dist/modules/directory/di.js.map +2 -2
  315. package/dist/modules/directory/services/organizationHierarchyService.js +29 -0
  316. package/dist/modules/directory/services/organizationHierarchyService.js.map +7 -0
  317. package/dist/modules/directory/services/organizationScopeService.js +56 -0
  318. package/dist/modules/directory/services/organizationScopeService.js.map +7 -0
  319. package/dist/modules/directory/utils/organizationScope.js.map +2 -2
  320. package/dist/modules/entities/api/records.js +4 -2
  321. package/dist/modules/entities/api/records.js.map +2 -2
  322. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +3 -1
  323. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  324. package/dist/modules/eudr/api/plots/route.js +5 -1
  325. package/dist/modules/eudr/api/plots/route.js.map +2 -2
  326. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +3 -0
  327. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
  328. package/dist/modules/eudr/backend/eudr/plots/page.js +3 -0
  329. package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
  330. package/dist/modules/eudr/backend/eudr/product-mappings/page.js +3 -0
  331. package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
  332. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +3 -0
  333. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
  334. package/dist/modules/eudr/backend/eudr/statements/page.js +3 -0
  335. package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
  336. package/dist/modules/eudr/commands/statements.js +0 -3
  337. package/dist/modules/eudr/commands/statements.js.map +2 -2
  338. package/dist/modules/eudr/data/validators.js +4 -1
  339. package/dist/modules/eudr/data/validators.js.map +2 -2
  340. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
  341. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  342. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
  343. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  344. package/dist/modules/feature_toggles/defaults.json +0 -8
  345. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +3 -0
  346. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
  347. package/dist/modules/inbox_ops/backend/inbox-ops/page.js +3 -0
  348. package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
  349. package/dist/modules/inbox_ops/lib/htmlToPlainText.js +1 -12
  350. package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
  351. package/dist/modules/integrations/api/[id]/credentials/route.js +6 -1
  352. package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
  353. package/dist/modules/integrations/backend/integrations/[id]/page.js +38 -29
  354. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  355. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +36 -9
  356. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
  357. package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +55 -0
  358. package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +7 -0
  359. package/dist/modules/integrations/data/validators.js +11 -3
  360. package/dist/modules/integrations/data/validators.js.map +2 -2
  361. package/dist/modules/integrations/lib/credentials-masking.js +6 -2
  362. package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
  363. package/dist/modules/messages/api/[id]/route.js +29 -1
  364. package/dist/modules/messages/api/[id]/route.js.map +2 -2
  365. package/dist/modules/messages/api/openapi.js +17 -2
  366. package/dist/modules/messages/api/openapi.js.map +2 -2
  367. package/dist/modules/messages/api/route.js +17 -2
  368. package/dist/modules/messages/api/route.js.map +2 -2
  369. package/dist/modules/messages/components/MessagesInboxPageClient.js +7 -14
  370. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
  371. package/dist/modules/messages/components/inboxFilters.js +15 -0
  372. package/dist/modules/messages/components/inboxFilters.js.map +2 -2
  373. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +11 -1
  374. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
  375. package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +3 -1
  376. package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
  377. package/dist/modules/messages/components/message-detail/panels/thread-panel.js +2 -1
  378. package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
  379. package/dist/modules/messages/components/messageListLabels.js +14 -2
  380. package/dist/modules/messages/components/messageListLabels.js.map +2 -2
  381. package/dist/modules/messages/data/validators.js +18 -4
  382. package/dist/modules/messages/data/validators.js.map +2 -2
  383. package/dist/modules/messages/lib/channel-sender-identity.js +26 -0
  384. package/dist/modules/messages/lib/channel-sender-identity.js.map +7 -0
  385. package/dist/modules/messages/lib/composeSourceChannelType.js +41 -0
  386. package/dist/modules/messages/lib/composeSourceChannelType.js.map +7 -0
  387. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +4 -6
  388. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
  389. package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -1
  390. package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
  391. package/dist/modules/payment_gateways/lib/webhook-processor.js +7 -0
  392. package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
  393. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -0
  394. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  395. package/dist/modules/push_notifications/backend/push_notifications/page.js +3 -1
  396. package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
  397. package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
  398. package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
  399. package/dist/modules/query_index/lib/engine.js +150 -51
  400. package/dist/modules/query_index/lib/engine.js.map +2 -2
  401. package/dist/modules/query_index/lib/search-entity-policy.js +14 -0
  402. package/dist/modules/query_index/lib/search-entity-policy.js.map +7 -0
  403. package/dist/modules/query_index/lib/search-tokens.js +79 -3
  404. package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
  405. package/dist/modules/resources/backend/resources/resource-types/page.js +3 -1
  406. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  407. package/dist/modules/resources/backend/resources/resources/page.js +3 -1
  408. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  409. package/dist/modules/sales/backend/sales/channels/offers/page.js +3 -0
  410. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  411. package/dist/modules/sales/backend/sales/channels/page.js +3 -0
  412. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  413. package/dist/modules/sales/backend/sales/documents/[id]/page.js +10 -8
  414. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  415. package/dist/modules/sales/commands/documents.js +79 -1
  416. package/dist/modules/sales/commands/documents.js.map +2 -2
  417. package/dist/modules/sales/components/PriceWithCurrency.js +7 -5
  418. package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
  419. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +3 -0
  420. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  421. package/dist/modules/sales/components/documents/AdjustmentsSection.js +8 -6
  422. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  423. package/dist/modules/sales/components/documents/ItemsSection.js +51 -22
  424. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  425. package/dist/modules/sales/components/documents/LineItemDialog.js +83 -18
  426. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  427. package/dist/modules/sales/components/documents/PaymentsSection.js +23 -9
  428. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  429. package/dist/modules/sales/components/documents/ReturnsSection.js +8 -6
  430. package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
  431. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +68 -14
  432. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  433. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +6 -5
  434. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
  435. package/dist/modules/sales/components/documents/ShipmentDialog.js +5 -4
  436. package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
  437. package/dist/modules/sales/components/documents/ShipmentsSection.js +8 -6
  438. package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
  439. package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
  440. package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
  441. package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
  442. package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
  443. package/dist/modules/sales/data/entities.js +8 -2
  444. package/dist/modules/sales/data/entities.js.map +2 -2
  445. package/dist/modules/sales/extension-points.js +1 -0
  446. package/dist/modules/sales/extension-points.js.map +2 -2
  447. package/dist/modules/sales/lib/salesChannelsToggleSeed.js +33 -0
  448. package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +7 -0
  449. package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +32 -0
  450. package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +7 -0
  451. package/dist/modules/sales/setup.js +2 -0
  452. package/dist/modules/sales/setup.js.map +2 -2
  453. package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +10 -2
  454. package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
  455. package/dist/modules/sales/widgets/injection-table.js +4 -7
  456. package/dist/modules/sales/widgets/injection-table.js.map +2 -2
  457. package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -0
  458. package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
  459. package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -0
  460. package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
  461. package/dist/modules/staff/backend/staff/team-members/page.js +3 -0
  462. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  463. package/dist/modules/staff/backend/staff/team-roles/page.js +3 -0
  464. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  465. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -0
  466. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  467. package/dist/modules/staff/backend/staff/teams/page.js +3 -0
  468. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  469. package/dist/modules/staff/backend/staff/timesheets/page.js +29 -18
  470. package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
  471. package/dist/modules/staff/backend/staff/timesheets/projects/page.js +3 -0
  472. package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
  473. package/dist/modules/sync_excel/lib/adapters/customers.js +1 -0
  474. package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
  475. package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
  476. package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
  477. package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
  478. package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
  479. package/dist/modules/warranty_claims/api/portal/claims/route.js +12 -9
  480. package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
  481. package/dist/modules/warranty_claims/backend/page.js +3 -0
  482. package/dist/modules/warranty_claims/backend/page.js.map +2 -2
  483. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +3 -0
  484. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
  485. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +3 -0
  486. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
  487. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +3 -0
  488. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
  489. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +3 -0
  490. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
  491. package/dist/modules/wms/api/warehouseSearch.js +21 -0
  492. package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
  493. package/dist/modules/wms/api/warehouses/route.js +13 -9
  494. package/dist/modules/wms/api/warehouses/route.js.map +2 -2
  495. package/dist/modules/wms/api/zones/route.js +15 -2
  496. package/dist/modules/wms/api/zones/route.js.map +2 -2
  497. package/dist/modules/wms/commands/configuration.js +121 -9
  498. package/dist/modules/wms/commands/configuration.js.map +2 -2
  499. package/dist/modules/wms/commands/inventory-actions.js +3 -0
  500. package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
  501. package/dist/modules/wms/commands/shared.js +9 -1
  502. package/dist/modules/wms/commands/shared.js.map +2 -2
  503. package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
  504. package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
  505. package/dist/modules/wms/components/backend/WmsConfigurationPage.js +76 -111
  506. package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
  507. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
  508. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
  509. package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
  510. package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
  511. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +27 -20
  512. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
  513. package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
  514. package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
  515. package/dist/modules/workflows/backend/definitions/page.js +3 -1
  516. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  517. package/dist/modules/workflows/backend/events/page.js +3 -1
  518. package/dist/modules/workflows/backend/events/page.js.map +2 -2
  519. package/dist/modules/workflows/backend/instances/page.js +3 -1
  520. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  521. package/dist/modules/workflows/backend/tasks/page.js +3 -1
  522. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  523. package/dist/modules/workflows/lib/activity-executor.js +4 -0
  524. package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
  525. package/package.json +9 -10
  526. package/src/helpers/integration/api.ts +33 -1
  527. package/src/helpers/integration/communicationChannelsFixtures.ts +69 -1
  528. package/src/modules/api_keys/api/keys/route.ts +3 -1
  529. package/src/modules/api_keys/backend/api-keys/page.tsx +4 -1
  530. package/src/modules/api_keys/di.ts +7 -0
  531. package/src/modules/api_keys/services/principalService.ts +33 -0
  532. package/src/modules/attachments/AGENTS.md +15 -0
  533. package/src/modules/attachments/api/route.ts +2 -2
  534. package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -0
  535. package/src/modules/attachments/di.ts +16 -0
  536. package/src/modules/attachments/i18n/de.json +5 -0
  537. package/src/modules/attachments/i18n/en.json +5 -0
  538. package/src/modules/attachments/i18n/es.json +5 -0
  539. package/src/modules/attachments/i18n/ko.json +5 -0
  540. package/src/modules/attachments/i18n/pl.json +5 -0
  541. package/src/modules/attachments/index.ts +10 -0
  542. package/src/modules/attachments/lib/attachment-service.ts +468 -0
  543. package/src/modules/attachments/lib/scoped-upload-service.ts +46 -0
  544. package/src/modules/attachments/lib/upload-limits.ts +6 -2
  545. package/src/modules/audit_logs/backend/audit-logs/page.tsx +8 -0
  546. package/src/modules/audit_logs/lib/display-helpers.tsx +42 -32
  547. package/src/modules/audit_logs/services/actionLogService.ts +74 -11
  548. package/src/modules/auth/acl.ts +30 -6
  549. package/src/modules/auth/api/feature-check.ts +10 -3
  550. package/src/modules/auth/api/login.ts +9 -1
  551. package/src/modules/auth/api/reset/validate.ts +57 -0
  552. package/src/modules/auth/api/roles/acl/route.ts +42 -39
  553. package/src/modules/auth/api/session/refresh.ts +32 -1
  554. package/src/modules/auth/api/users/acl/route.ts +177 -53
  555. package/src/modules/auth/api/users/route.ts +18 -5
  556. package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +5 -2
  557. package/src/modules/auth/backend/roles/page.tsx +4 -2
  558. package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +5 -2
  559. package/src/modules/auth/backend/users/page.tsx +3 -2
  560. package/src/modules/auth/commands/acl.ts +495 -0
  561. package/src/modules/auth/components/AclEditor.tsx +63 -33
  562. package/src/modules/auth/data/entities.ts +4 -1
  563. package/src/modules/auth/data/validators.ts +5 -0
  564. package/src/modules/auth/di.ts +46 -16
  565. package/src/modules/auth/frontend/reset/[token]/page.tsx +74 -0
  566. package/src/modules/auth/i18n/de.json +389 -0
  567. package/src/modules/auth/i18n/en.json +389 -0
  568. package/src/modules/auth/i18n/es.json +389 -0
  569. package/src/modules/auth/i18n/ko.json +389 -0
  570. package/src/modules/auth/i18n/pl.json +391 -2
  571. package/src/modules/auth/lib/grantChecks.ts +6 -0
  572. package/src/modules/auth/lib/userIdFilter.ts +31 -0
  573. package/src/modules/auth/services/authService.ts +18 -2
  574. package/src/modules/auth/services/principalService.ts +266 -0
  575. package/src/modules/auth/services/rbacService.ts +110 -24
  576. package/src/modules/auth/services/roleOrganizationScope.ts +70 -0
  577. package/src/modules/business_rules/backend/logs/page.tsx +4 -1
  578. package/src/modules/business_rules/backend/rules/page.tsx +4 -1
  579. package/src/modules/business_rules/backend/sets/page.tsx +4 -1
  580. package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
  581. package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
  582. package/src/modules/catalog/ai-agents.ts +1 -1
  583. package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
  584. package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +12 -5
  585. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +3 -0
  586. package/src/modules/catalog/components/products/ProductsDataTable.tsx +7 -0
  587. package/src/modules/catalog/i18n/de.json +1 -0
  588. package/src/modules/catalog/i18n/en.json +1 -0
  589. package/src/modules/catalog/i18n/es.json +1 -0
  590. package/src/modules/catalog/i18n/ko.json +1 -0
  591. package/src/modules/catalog/i18n/pl.json +1 -0
  592. package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +4 -0
  593. package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +17 -1
  594. package/src/modules/communication_channels/api/post/test-seed/route.ts +155 -16
  595. package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +4 -0
  596. package/src/modules/communication_channels/commands/ingest-inbound-message.ts +38 -1
  597. package/src/modules/communication_channels/di.ts +7 -0
  598. package/src/modules/communication_channels/lib/adapter.ts +14 -0
  599. package/src/modules/communication_channels/lib/email-capabilities.ts +4 -0
  600. package/src/modules/communication_channels/lib/outbound-recipient.ts +71 -0
  601. package/src/modules/communication_channels/lib/resolve-channel-type.ts +99 -0
  602. package/src/modules/communication_channels/lib/test-seed.ts +64 -4
  603. package/src/modules/configs/i18n/de.json +2 -0
  604. package/src/modules/configs/i18n/en.json +2 -0
  605. package/src/modules/configs/i18n/es.json +2 -0
  606. package/src/modules/configs/i18n/ko.json +2 -0
  607. package/src/modules/configs/i18n/pl.json +2 -0
  608. package/src/modules/configs/lib/system-status.ts +9 -0
  609. package/src/modules/currencies/AGENTS.md +3 -0
  610. package/src/modules/currencies/backend/currencies/page.tsx +4 -1
  611. package/src/modules/currencies/backend/exchange-rates/page.tsx +4 -1
  612. package/src/modules/currencies/services/README.md +45 -0
  613. package/src/modules/currencies/services/rateFetchingService.ts +6 -1
  614. package/src/modules/customer_accounts/api/admin/domain-mappings.ts +7 -0
  615. package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +4 -1
  616. package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +4 -1
  617. package/src/modules/customer_accounts/services/domainMappingService.ts +10 -0
  618. package/src/modules/customers/ai-tools/companies-pack.ts +4 -1
  619. package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
  620. package/src/modules/customers/ai-tools/deals-pack.ts +66 -1
  621. package/src/modules/customers/ai-tools/people-pack.ts +4 -1
  622. package/src/modules/customers/api/activities/route.ts +45 -0
  623. package/src/modules/customers/api/companies/[id]/people/route.ts +24 -73
  624. package/src/modules/customers/api/companies/[id]/route.ts +24 -107
  625. package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +16 -8
  626. package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
  627. package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
  628. package/src/modules/customers/api/deals/[id]/route.ts +17 -28
  629. package/src/modules/customers/api/deals/[id]/stats/route.ts +10 -25
  630. package/src/modules/customers/api/deals/aggregate/route.ts +17 -9
  631. package/src/modules/customers/api/deals/map/route.ts +4 -4
  632. package/src/modules/customers/api/deals/route.ts +50 -1
  633. package/src/modules/customers/api/entity-roles-factory.ts +8 -4
  634. package/src/modules/customers/api/interactions/route.ts +8 -2
  635. package/src/modules/customers/api/interactions/tasks/route.ts +24 -1
  636. package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +12 -4
  637. package/src/modules/customers/api/people/[id]/companies/context.ts +4 -1
  638. package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
  639. package/src/modules/customers/api/people/[id]/route.ts +16 -11
  640. package/src/modules/customers/api/people/check-phone/route.ts +75 -10
  641. package/src/modules/customers/api/todos/route.ts +27 -2
  642. package/src/modules/customers/backend/customers/companies/page.tsx +5 -2
  643. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +7 -2
  644. package/src/modules/customers/backend/customers/deals/page.tsx +8 -2
  645. package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +5 -14
  646. package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +109 -27
  647. package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +21 -0
  648. package/src/modules/customers/backend/customers/people/page.tsx +5 -2
  649. package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +12 -4
  650. package/src/modules/customers/commands/deals.ts +34 -59
  651. package/src/modules/customers/commands/interactions.ts +1 -1
  652. package/src/modules/customers/commands/personCompanyLinks.ts +224 -8
  653. package/src/modules/customers/components/CustomerTodosTable.tsx +2 -0
  654. package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
  655. package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
  656. package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
  657. package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
  658. package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
  659. package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
  660. package/src/modules/customers/components/calendar/EventPeekPopover.tsx +4 -2
  661. package/src/modules/customers/components/calendar/editor/PeopleField.tsx +61 -5
  662. package/src/modules/customers/components/calendar/editor/hooks.ts +7 -1
  663. package/src/modules/customers/components/calendar/types.ts +2 -2
  664. package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -4
  665. package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +8 -1
  666. package/src/modules/customers/components/detail/DealForm.tsx +22 -2
  667. package/src/modules/customers/components/detail/DealsSection.tsx +11 -5
  668. package/src/modules/customers/components/detail/EntityTagsDialog.tsx +58 -12
  669. package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +8 -1
  670. package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +23 -14
  671. package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
  672. package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
  673. package/src/modules/customers/components/detail/types.ts +1 -1
  674. package/src/modules/customers/components/detail/utils.ts +15 -5
  675. package/src/modules/customers/data/entities.ts +1 -1
  676. package/src/modules/customers/data/validators.ts +50 -9
  677. package/src/modules/customers/events.ts +5 -0
  678. package/src/modules/customers/i18n/de.json +9 -1
  679. package/src/modules/customers/i18n/en.json +9 -1
  680. package/src/modules/customers/i18n/es.json +9 -1
  681. package/src/modules/customers/i18n/ko.json +9 -1
  682. package/src/modules/customers/i18n/pl.json +9 -1
  683. package/src/modules/customers/lib/calendar/conflicts.ts +10 -2
  684. package/src/modules/customers/lib/calendar/editorPayload.ts +4 -3
  685. package/src/modules/customers/lib/calendar/mapItem.ts +8 -3
  686. package/src/modules/customers/lib/calendar/participantIdentity.ts +17 -0
  687. package/src/modules/customers/lib/closureStage.ts +76 -0
  688. package/src/modules/customers/lib/dealStatus.ts +42 -0
  689. package/src/modules/customers/lib/detailReadAccess.ts +35 -0
  690. package/src/modules/customers/lib/findPeopleByAddresses.ts +8 -6
  691. package/src/modules/customers/lib/personCompanies.ts +136 -1
  692. package/src/modules/customers/lib/todoCompatibility.ts +19 -1
  693. package/src/modules/dashboards/i18n/es.json +4 -4
  694. package/src/modules/dashboards/i18n/pl.json +7 -7
  695. package/src/modules/dashboards/lib/widgetScope.ts +6 -0
  696. package/src/modules/data_sync/AGENTS.md +1 -1
  697. package/src/modules/data_sync/backend/data-sync/page.tsx +4 -1
  698. package/src/modules/data_sync/lib/abandoned-run.ts +56 -0
  699. package/src/modules/data_sync/lib/adapter.ts +36 -0
  700. package/src/modules/data_sync/lib/sync-engine.ts +113 -5
  701. package/src/modules/data_sync/workers/sync-export.ts +4 -0
  702. package/src/modules/data_sync/workers/sync-import.ts +4 -0
  703. package/src/modules/devices/AGENTS.md +20 -1
  704. package/src/modules/devices/acl.ts +9 -1
  705. package/src/modules/devices/api/admin/devices/[id]/route.ts +5 -34
  706. package/src/modules/devices/api/admin/devices/route.ts +14 -1
  707. package/src/modules/devices/api/deviceList.ts +135 -11
  708. package/src/modules/devices/api/deviceSerialization.ts +50 -0
  709. package/src/modules/devices/api/openapi.ts +9 -1
  710. package/src/modules/devices/api/route.ts +9 -1
  711. package/src/modules/devices/backend/devices/[id]/page.tsx +18 -32
  712. package/src/modules/devices/backend/devices/create/page.tsx +17 -1
  713. package/src/modules/devices/backend/devices/page.tsx +44 -45
  714. package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +45 -0
  715. package/src/modules/devices/backend/devices/userOptions.ts +99 -0
  716. package/src/modules/devices/i18n/de.json +3 -2
  717. package/src/modules/devices/i18n/en.json +3 -2
  718. package/src/modules/devices/i18n/es.json +3 -2
  719. package/src/modules/devices/i18n/ko.json +3 -2
  720. package/src/modules/devices/i18n/pl.json +3 -2
  721. package/src/modules/devices/setup.ts +6 -2
  722. package/src/modules/directory/backend/directory/organizations/page.tsx +3 -1
  723. package/src/modules/directory/backend/directory/tenants/page.tsx +3 -1
  724. package/src/modules/directory/di.ts +14 -2
  725. package/src/modules/directory/services/organizationHierarchyService.ts +34 -0
  726. package/src/modules/directory/services/organizationScopeService.ts +85 -0
  727. package/src/modules/directory/utils/organizationScope.ts +4 -15
  728. package/src/modules/entities/api/records.ts +2 -0
  729. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +4 -1
  730. package/src/modules/eudr/api/plots/route.ts +4 -0
  731. package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +4 -0
  732. package/src/modules/eudr/backend/eudr/plots/page.tsx +4 -0
  733. package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +4 -0
  734. package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +4 -0
  735. package/src/modules/eudr/backend/eudr/statements/page.tsx +4 -0
  736. package/src/modules/eudr/commands/statements.ts +0 -3
  737. package/src/modules/eudr/data/validators.ts +16 -1
  738. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
  739. package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
  740. package/src/modules/feature_toggles/defaults.json +0 -8
  741. package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +4 -0
  742. package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +4 -0
  743. package/src/modules/inbox_ops/lib/htmlToPlainText.ts +1 -17
  744. package/src/modules/integrations/api/[id]/credentials/route.ts +6 -4
  745. package/src/modules/integrations/backend/integrations/[id]/page.tsx +61 -31
  746. package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +44 -9
  747. package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +84 -0
  748. package/src/modules/integrations/data/validators.ts +12 -2
  749. package/src/modules/integrations/i18n/de.json +1 -0
  750. package/src/modules/integrations/i18n/en.json +1 -0
  751. package/src/modules/integrations/i18n/es.json +1 -0
  752. package/src/modules/integrations/i18n/ko.json +1 -0
  753. package/src/modules/integrations/i18n/pl.json +1 -0
  754. package/src/modules/integrations/lib/credentials-masking.ts +10 -6
  755. package/src/modules/messages/api/[id]/route.ts +55 -1
  756. package/src/modules/messages/api/openapi.ts +20 -0
  757. package/src/modules/messages/api/route.ts +31 -2
  758. package/src/modules/messages/components/MessagesInboxPageClient.tsx +9 -16
  759. package/src/modules/messages/components/inboxFilters.ts +36 -0
  760. package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +14 -1
  761. package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +3 -1
  762. package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +2 -1
  763. package/src/modules/messages/components/message-detail/types.ts +3 -0
  764. package/src/modules/messages/components/messageListLabels.ts +52 -3
  765. package/src/modules/messages/data/validators.ts +43 -4
  766. package/src/modules/messages/lib/channel-sender-identity.ts +55 -0
  767. package/src/modules/messages/lib/composeSourceChannelType.ts +95 -0
  768. package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -6
  769. package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +4 -1
  770. package/src/modules/payment_gateways/lib/webhook-processor.ts +11 -0
  771. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -0
  772. package/src/modules/push_notifications/backend/push_notifications/page.tsx +4 -1
  773. package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
  774. package/src/modules/query_index/lib/engine.ts +249 -61
  775. package/src/modules/query_index/lib/search-entity-policy.ts +46 -0
  776. package/src/modules/query_index/lib/search-tokens.ts +135 -3
  777. package/src/modules/resources/backend/resources/resource-types/page.tsx +4 -1
  778. package/src/modules/resources/backend/resources/resources/page.tsx +4 -1
  779. package/src/modules/sales/backend/sales/channels/offers/page.tsx +4 -0
  780. package/src/modules/sales/backend/sales/channels/page.tsx +4 -0
  781. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +14 -8
  782. package/src/modules/sales/commands/documents.ts +93 -0
  783. package/src/modules/sales/components/PriceWithCurrency.tsx +17 -5
  784. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +4 -0
  785. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -5
  786. package/src/modules/sales/components/documents/ItemsSection.tsx +56 -18
  787. package/src/modules/sales/components/documents/LineItemDialog.tsx +137 -20
  788. package/src/modules/sales/components/documents/PaymentsSection.tsx +20 -9
  789. package/src/modules/sales/components/documents/ReturnsSection.tsx +6 -5
  790. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +106 -14
  791. package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +6 -5
  792. package/src/modules/sales/components/documents/ShipmentDialog.tsx +5 -4
  793. package/src/modules/sales/components/documents/ShipmentsSection.tsx +6 -5
  794. package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
  795. package/src/modules/sales/components/documents/lineItemUtils.ts +7 -2
  796. package/src/modules/sales/data/entities.ts +6 -0
  797. package/src/modules/sales/extension-points.ts +1 -0
  798. package/src/modules/sales/i18n/de.json +8 -0
  799. package/src/modules/sales/i18n/en.json +8 -0
  800. package/src/modules/sales/i18n/es.json +8 -0
  801. package/src/modules/sales/i18n/ko.json +8 -0
  802. package/src/modules/sales/i18n/pl.json +8 -0
  803. package/src/modules/sales/lib/salesChannelsToggleSeed.ts +42 -0
  804. package/src/modules/sales/migrations/.snapshot-open-mercato.json +60 -0
  805. package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +87 -0
  806. package/src/modules/sales/setup.ts +2 -0
  807. package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +9 -1
  808. package/src/modules/sales/widgets/injection-table.ts +4 -7
  809. package/src/modules/staff/backend/staff/leave-requests/page.tsx +4 -0
  810. package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +4 -0
  811. package/src/modules/staff/backend/staff/team-members/page.tsx +6 -0
  812. package/src/modules/staff/backend/staff/team-roles/page.tsx +4 -0
  813. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -0
  814. package/src/modules/staff/backend/staff/teams/page.tsx +4 -0
  815. package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1
  816. package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +4 -0
  817. package/src/modules/sync_excel/lib/adapters/customers.ts +5 -0
  818. package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
  819. package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
  820. package/src/modules/warranty_claims/api/portal/claims/route.ts +12 -9
  821. package/src/modules/warranty_claims/backend/page.tsx +4 -0
  822. package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +4 -0
  823. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +4 -0
  824. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +4 -0
  825. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +4 -0
  826. package/src/modules/wms/api/warehouseSearch.ts +23 -0
  827. package/src/modules/wms/api/warehouses/route.ts +13 -9
  828. package/src/modules/wms/api/zones/route.ts +16 -0
  829. package/src/modules/wms/commands/configuration.ts +159 -10
  830. package/src/modules/wms/commands/inventory-actions.ts +3 -0
  831. package/src/modules/wms/commands/shared.ts +17 -0
  832. package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
  833. package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +95 -141
  834. package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +2 -0
  835. package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -0
  836. package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +36 -20
  837. package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
  838. package/src/modules/wms/i18n/de.json +2 -0
  839. package/src/modules/wms/i18n/en.json +2 -0
  840. package/src/modules/wms/i18n/es.json +2 -0
  841. package/src/modules/wms/i18n/ko.json +2 -0
  842. package/src/modules/wms/i18n/pl.json +2 -0
  843. package/src/modules/workflows/backend/definitions/page.tsx +4 -1
  844. package/src/modules/workflows/backend/events/page.tsx +4 -1
  845. package/src/modules/workflows/backend/instances/page.tsx +4 -1
  846. package/src/modules/workflows/backend/tasks/page.tsx +4 -1
  847. package/src/modules/workflows/lib/activity-executor.ts +9 -0
@@ -1016,6 +1016,7 @@
1016
1016
  "sales.documents.items.errorProductRequired": "Selecciona un producto para continuar.",
1017
1017
  "sales.documents.items.errorQuantity": "La cantidad debe ser mayor que 0.",
1018
1018
  "sales.documents.items.errorQuantityBelowShipped": "No puedes reducir la cantidad por debajo de las {{shipped}} ya enviadas.",
1019
+ "sales.documents.items.errorQuantityShipmentsUnknown": "La cantidad no se puede reducir hasta que se carguen los envíos de este pedido. Vuelve a abrir el pedido para intentarlo de nuevo.",
1019
1020
  "sales.documents.items.errorSave": "No se pudo guardar la línea.",
1020
1021
  "sales.documents.items.errorScope": "Se requieren organización e inquilino.",
1021
1022
  "sales.documents.items.errorUnitPrice": "El precio unitario debe ser mayor que 0.",
@@ -1059,6 +1060,8 @@
1059
1060
  "sales.documents.items.save": "Guardar cambios",
1060
1061
  "sales.documents.items.selectedProduct": "Seleccionado {{id}}",
1061
1062
  "sales.documents.items.selectedVariant": "Seleccionado {{id}}",
1063
+ "sales.documents.items.shippedLineLockPending": "Los precios están bloqueados hasta que se carguen los envíos de este pedido. Vuelve a abrir el pedido para intentarlo de nuevo — todavía puedes editar el nombre y aumentar la cantidad.",
1064
+ "sales.documents.items.shippedLineLocked": "Los precios de esta línea están bloqueados porque ya tiene envíos. Todavía puedes editar el nombre y la cantidad.",
1062
1065
  "sales.documents.items.status": "Estado",
1063
1066
  "sales.documents.items.statusEmpty": "Sin estado",
1064
1067
  "sales.documents.items.statusLoading": "Cargando estados…",
@@ -1093,6 +1096,8 @@
1093
1096
  "sales.documents.items.variantSearch": "Buscar variante",
1094
1097
  "sales.documents.list.errors.load": "No se pudieron cargar los documentos.",
1095
1098
  "sales.documents.list.filters.channel": "Canal",
1099
+ "sales.documents.list.filters.channelPlaceholder": "Buscar canales",
1100
+ "sales.documents.list.filters.channelUnassigned": "(Sin canal)",
1096
1101
  "sales.documents.list.filters.customer": "ID de cliente",
1097
1102
  "sales.documents.list.filters.customerPlaceholder": "ID de cliente",
1098
1103
  "sales.documents.list.filters.date": "Fecha",
@@ -1321,13 +1326,16 @@
1321
1326
  "sales.quotes.email.subject": "Cotización {quoteNumber}",
1322
1327
  "sales.quotes.email.total": "Total: {amount} {currency}",
1323
1328
  "sales.quotes.email.validUntil": "Válida hasta: {date}",
1329
+ "sales.quotes.exchange_rate_unsupported": "El tipo de cambio no está disponible en los presupuestos.",
1324
1330
  "sales.quotes.form.general": "General",
1325
1331
  "sales.quotes.form.lines": "Líneas",
1326
1332
  "sales.quotes.form.notes": "Notas",
1333
+ "sales.quotes.fulfillment_status_unsupported": "El estado de cumplimiento no está disponible en los presupuestos.",
1327
1334
  "sales.quotes.internal_notes_unsupported": "Las notas internas no están disponibles en los presupuestos.",
1328
1335
  "sales.quotes.lines.delete": "Eliminar línea de cotización",
1329
1336
  "sales.quotes.lines.upsert": "Actualizar línea de cotización",
1330
1337
  "sales.quotes.list.title": "Cotizaciones",
1338
+ "sales.quotes.payment_status_unsupported": "El estado de pago no está disponible en los presupuestos.",
1331
1339
  "sales.quotes.public.acceptButton": "Aceptar cotización",
1332
1340
  "sales.quotes.public.acceptFailed": "No se pudo aceptar la cotización.",
1333
1341
  "sales.quotes.public.acceptedMessage": "Pedido creado: {{orderNumber}}",
@@ -1016,6 +1016,7 @@
1016
1016
  "sales.documents.items.errorProductRequired": "계속하려면 상품을 선택하세요.",
1017
1017
  "sales.documents.items.errorQuantity": "수량은 0보다 커야 합니다.",
1018
1018
  "sales.documents.items.errorQuantityBelowShipped": "이미 배송된 {{shipped}} 이하로 수량을 줄일 수 없습니다.",
1019
+ "sales.documents.items.errorQuantityShipmentsUnknown": "이 주문의 배송 정보를 불러올 때까지 수량을 줄일 수 없습니다. 주문을 다시 열어 재시도하세요.",
1019
1020
  "sales.documents.items.errorSave": "품목을 저장하지 못했습니다.",
1020
1021
  "sales.documents.items.errorScope": "조직 및 테넌트 정보가 필요합니다.",
1021
1022
  "sales.documents.items.errorUnitPrice": "단가는 0보다 커야 합니다.",
@@ -1059,6 +1060,8 @@
1059
1060
  "sales.documents.items.save": "변경사항 저장",
1060
1061
  "sales.documents.items.selectedProduct": "선택됨 {{id}}",
1061
1062
  "sales.documents.items.selectedVariant": "선택됨 {{id}}",
1063
+ "sales.documents.items.shippedLineLockPending": "이 주문의 선적 정보를 불러올 때까지 가격 정보가 잠깁니다. 주문을 다시 열어 재시도하세요 — 이름 수정과 수량 증가는 계속 가능합니다.",
1064
+ "sales.documents.items.shippedLineLocked": "이 라인은 이미 선적된 품목이 있어 가격 정보가 잠겨 있습니다. 이름과 수량은 계속 수정할 수 있습니다.",
1062
1065
  "sales.documents.items.status": "상태",
1063
1066
  "sales.documents.items.statusEmpty": "상태 없음",
1064
1067
  "sales.documents.items.statusLoading": "상태 목록을 불러오는 중…",
@@ -1093,6 +1096,8 @@
1093
1096
  "sales.documents.items.variantSearch": "옵션(변형) 검색",
1094
1097
  "sales.documents.list.errors.load": "문서를 불러오지 못했습니다.",
1095
1098
  "sales.documents.list.filters.channel": "채널",
1099
+ "sales.documents.list.filters.channelPlaceholder": "채널 검색",
1100
+ "sales.documents.list.filters.channelUnassigned": "(채널 없음)",
1096
1101
  "sales.documents.list.filters.customer": "고객 ID",
1097
1102
  "sales.documents.list.filters.customerPlaceholder": "고객 ID",
1098
1103
  "sales.documents.list.filters.date": "날짜",
@@ -1321,13 +1326,16 @@
1321
1326
  "sales.quotes.email.subject": "견적 {quoteNumber}",
1322
1327
  "sales.quotes.email.total": "합계: {amount} {currency}",
1323
1328
  "sales.quotes.email.validUntil": "유효 기간: {date}까지",
1329
+ "sales.quotes.exchange_rate_unsupported": "환율은 견적서에서 사용할 수 없습니다.",
1324
1330
  "sales.quotes.form.general": "일반",
1325
1331
  "sales.quotes.form.lines": "라인 항목",
1326
1332
  "sales.quotes.form.notes": "메모",
1333
+ "sales.quotes.fulfillment_status_unsupported": "이행 상태는 견적서에서 사용할 수 없습니다.",
1327
1334
  "sales.quotes.internal_notes_unsupported": "내부 메모는 견적서에서 사용할 수 없습니다.",
1328
1335
  "sales.quotes.lines.delete": "견적 항목 삭제",
1329
1336
  "sales.quotes.lines.upsert": "견적 항목 업데이트",
1330
1337
  "sales.quotes.list.title": "견적",
1338
+ "sales.quotes.payment_status_unsupported": "결제 상태는 견적서에서 사용할 수 없습니다.",
1331
1339
  "sales.quotes.public.acceptButton": "견적 수락",
1332
1340
  "sales.quotes.public.acceptFailed": "견적을 수락하지 못했습니다.",
1333
1341
  "sales.quotes.public.acceptedMessage": "주문이 생성되었습니다: {{orderNumber}}",
@@ -1016,6 +1016,7 @@
1016
1016
  "sales.documents.items.errorProductRequired": "Wybierz produkt, aby kontynuować.",
1017
1017
  "sales.documents.items.errorQuantity": "Ilość musi być większa niż 0.",
1018
1018
  "sales.documents.items.errorQuantityBelowShipped": "Nie można obniżyć ilości poniżej {{shipped}} już wysłanych.",
1019
+ "sales.documents.items.errorQuantityShipmentsUnknown": "Nie można obniżyć ilości, dopóki wysyłki tego zamówienia nie zostaną wczytane. Otwórz zamówienie ponownie, aby spróbować jeszcze raz.",
1019
1020
  "sales.documents.items.errorSave": "Nie udało się zapisać pozycji.",
1020
1021
  "sales.documents.items.errorScope": "Wymagane są organizacja i najemca.",
1021
1022
  "sales.documents.items.errorUnitPrice": "Cena jednostkowa musi być większa niż 0.",
@@ -1059,6 +1060,8 @@
1059
1060
  "sales.documents.items.save": "Zapisz zmiany",
1060
1061
  "sales.documents.items.selectedProduct": "Wybrano {{id}}",
1061
1062
  "sales.documents.items.selectedVariant": "Wybrano {{id}}",
1063
+ "sales.documents.items.shippedLineLockPending": "Ceny są zablokowane, dopóki wysyłki tego zamówienia nie zostaną wczytane. Otwórz zamówienie ponownie, aby spróbować jeszcze raz — nadal możesz edytować nazwę i zwiększyć ilość.",
1064
+ "sales.documents.items.shippedLineLocked": "Ceny tej pozycji są zablokowane, ponieważ ma już wysłane sztuki. Nazwę i ilość nadal możesz edytować.",
1062
1065
  "sales.documents.items.status": "Status",
1063
1066
  "sales.documents.items.statusEmpty": "Brak statusu",
1064
1067
  "sales.documents.items.statusLoading": "Ładowanie statusów…",
@@ -1093,6 +1096,8 @@
1093
1096
  "sales.documents.items.variantSearch": "Szukaj wariantu",
1094
1097
  "sales.documents.list.errors.load": "Nie udało się wczytać dokumentów.",
1095
1098
  "sales.documents.list.filters.channel": "Kanał",
1099
+ "sales.documents.list.filters.channelPlaceholder": "Szukaj kanałów",
1100
+ "sales.documents.list.filters.channelUnassigned": "(Brak kanału)",
1096
1101
  "sales.documents.list.filters.customer": "ID klienta",
1097
1102
  "sales.documents.list.filters.customerPlaceholder": "ID klienta",
1098
1103
  "sales.documents.list.filters.date": "Data",
@@ -1321,13 +1326,16 @@
1321
1326
  "sales.quotes.email.subject": "Oferta {quoteNumber}",
1322
1327
  "sales.quotes.email.total": "Suma: {amount} {currency}",
1323
1328
  "sales.quotes.email.validUntil": "Ważna do: {date}",
1329
+ "sales.quotes.exchange_rate_unsupported": "Kurs wymiany nie jest dostępny dla ofert.",
1324
1330
  "sales.quotes.form.general": "Ogólne",
1325
1331
  "sales.quotes.form.lines": "Pozycje",
1326
1332
  "sales.quotes.form.notes": "Notatki",
1333
+ "sales.quotes.fulfillment_status_unsupported": "Status realizacji nie jest dostępny dla ofert.",
1327
1334
  "sales.quotes.internal_notes_unsupported": "Notatki wewnętrzne nie są dostępne dla ofert.",
1328
1335
  "sales.quotes.lines.delete": "Usuń pozycję oferty",
1329
1336
  "sales.quotes.lines.upsert": "Zaktualizuj pozycję oferty",
1330
1337
  "sales.quotes.list.title": "Oferty",
1338
+ "sales.quotes.payment_status_unsupported": "Status płatności nie jest dostępny dla ofert.",
1331
1339
  "sales.quotes.public.acceptButton": "Zaakceptuj ofertę",
1332
1340
  "sales.quotes.public.acceptFailed": "Nie udało się zaakceptować oferty.",
1333
1341
  "sales.quotes.public.acceptedMessage": "Utworzono zamówienie: {{orderNumber}}",
@@ -0,0 +1,42 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import { FeatureToggle } from '@open-mercato/core/modules/feature_toggles/data/entities'
3
+ import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
4
+ import { SALES_CHANNELS_TOGGLE_ID } from './salesChannelsToggleId'
5
+
6
+ export const SALES_CHANNELS_TOGGLE_DEFINITION = {
7
+ identifier: SALES_CHANNELS_TOGGLE_ID,
8
+ name: 'Sales Channels',
9
+ description: 'Show sales channel pickers, filters, and management UI. Disable for tenants that do not use sales channels.',
10
+ category: 'sales',
11
+ type: 'boolean' as const,
12
+ defaultValue: true,
13
+ } as const
14
+
15
+ // The sales module owns this toggle definition, so tenant setup registers it the
16
+ // same way portal, customers and wms register theirs. Shipping it only in the
17
+ // core defaults file left it unregistered on every database initialized before
18
+ // the toggle existed, and `useSalesChannelsEnabled` then 404s on every mount.
19
+ //
20
+ // The lookup deliberately does not filter on `deletedAt`. Deletion is soft
21
+ // (`feature_toggles.global.delete`) while `feature_toggles_identifier_unique`
22
+ // covers every row, so filtering would make this insert a duplicate and fail the
23
+ // whole seed run on any installation where the toggle was deleted. Matching the
24
+ // create command's own uniqueness check also leaves an operator's deletion alone
25
+ // instead of resurrecting the definition on every tenant seed.
26
+ export async function seedSalesChannelsToggle(em: EntityManager): Promise<void> {
27
+ const existing = await findOneWithDecryption(em, FeatureToggle, {
28
+ identifier: SALES_CHANNELS_TOGGLE_DEFINITION.identifier,
29
+ })
30
+ if (existing) return
31
+ em.persist(
32
+ em.create(FeatureToggle, {
33
+ identifier: SALES_CHANNELS_TOGGLE_DEFINITION.identifier,
34
+ name: SALES_CHANNELS_TOGGLE_DEFINITION.name,
35
+ description: SALES_CHANNELS_TOGGLE_DEFINITION.description,
36
+ category: SALES_CHANNELS_TOGGLE_DEFINITION.category,
37
+ type: SALES_CHANNELS_TOGGLE_DEFINITION.type,
38
+ defaultValue: SALES_CHANNELS_TOGGLE_DEFINITION.defaultValue,
39
+ }),
40
+ )
41
+ await em.flush()
42
+ }
@@ -1962,6 +1962,36 @@
1962
1962
  "keyName": "sales_document_addresses_scope_idx",
1963
1963
  "primary": false,
1964
1964
  "unique": false
1965
+ },
1966
+ {
1967
+ "columnNames": [
1968
+ "document_id"
1969
+ ],
1970
+ "composite": false,
1971
+ "constraint": false,
1972
+ "keyName": "sales_document_addresses_document_idx",
1973
+ "primary": false,
1974
+ "unique": false
1975
+ },
1976
+ {
1977
+ "columnNames": [
1978
+ "order_id"
1979
+ ],
1980
+ "composite": false,
1981
+ "constraint": false,
1982
+ "keyName": "sales_document_addresses_order_idx",
1983
+ "primary": false,
1984
+ "unique": false
1985
+ },
1986
+ {
1987
+ "columnNames": [
1988
+ "quote_id"
1989
+ ],
1990
+ "composite": false,
1991
+ "constraint": false,
1992
+ "keyName": "sales_document_addresses_quote_idx",
1993
+ "primary": false,
1994
+ "unique": false
1965
1995
  }
1966
1996
  ],
1967
1997
  "checks": [],
@@ -3750,6 +3780,36 @@
3750
3780
  "keyName": "sales_notes_scope_idx",
3751
3781
  "primary": false,
3752
3782
  "unique": false
3783
+ },
3784
+ {
3785
+ "columnNames": [
3786
+ "context_id"
3787
+ ],
3788
+ "composite": false,
3789
+ "constraint": false,
3790
+ "keyName": "sales_notes_context_idx",
3791
+ "primary": false,
3792
+ "unique": false
3793
+ },
3794
+ {
3795
+ "columnNames": [
3796
+ "order_id"
3797
+ ],
3798
+ "composite": false,
3799
+ "constraint": false,
3800
+ "keyName": "sales_notes_order_idx",
3801
+ "primary": false,
3802
+ "unique": false
3803
+ },
3804
+ {
3805
+ "columnNames": [
3806
+ "quote_id"
3807
+ ],
3808
+ "composite": false,
3809
+ "constraint": false,
3810
+ "keyName": "sales_notes_quote_idx",
3811
+ "primary": false,
3812
+ "unique": false
3753
3813
  }
3754
3814
  ],
3755
3815
  "checks": [],
@@ -0,0 +1,87 @@
1
+ import { Migration } from '@mikro-orm/migrations';
2
+
3
+ // sales_notes and sales_document_addresses each carried a single index —
4
+ // (organization_id, tenant_id) — and are never read by that predicate alone.
5
+ // loadOrderSnapshot / loadQuoteSnapshot (commands/documents.ts) read them by
6
+ // context in the same Promise.all:
7
+ //
8
+ // findWithDecryption(em, SalesNote, { contextType, contextId, ...scope })
9
+ // findWithDecryption(em, SalesDocumentAddress, { documentId, documentKind, ...scope })
10
+ //
11
+ // On a single-organization deployment the scope index matches every row, so the
12
+ // planner discards it and scans. The cost is CPU filtering, so a warm cache does
13
+ // not reduce it. Measured on a table of ~331k rows / 110 MB: a parallel
14
+ // sequential scan removing 110,457 rows per worker, 82 ms per read to return 0
15
+ // rows. The command bus runs prepare() and captureAfter() around every command
16
+ // and both load a document snapshot, so one written document — itself several
17
+ // commands (the document, one per changed line, the payment reconcile) —
18
+ // performs roughly 20 of these reads. Counters over one bulk-import batch of 100
19
+ // records showed 1,971 sequential scans reading 217,670,528 rows, 2.18M rows per
20
+ // imported record; repeatable across consecutive batches (1,971 / 1,974 / 1,911).
21
+ //
22
+ // context_type and document_kind are deliberately omitted, as they were for
23
+ // sales_document_tag_assignments_document_idx (Migration20260806120000), and the
24
+ // scope columns with them. sales_orders.id and sales_quotes.id are both
25
+ // gen_random_uuid() from their own tables, so a context_id already determines its
26
+ // context_type and its tenant; the seek returns the handful of rows belonging to
27
+ // one document and the remaining terms are rechecked over those. Folding three
28
+ // more columns in — one text and two uuids — roughly triples the index entry for
29
+ // no selectivity, on tables that take a write per document save and a note per
30
+ // order status change. The sibling scope indexes that do fold scope in
31
+ // (sales_order_lines_scope_idx, sales_payments_scope_idx) predate that reasoning.
32
+ //
33
+ // order_id and quote_id are separate indexes rather than a widening of the above:
34
+ // both tables are the child side of `on delete set null` constraints, which
35
+ // PostgreSQL does not index automatically, and the constraint check probes
36
+ // order_id / quote_id — columns the context index cannot serve even though they
37
+ // hold the same uuid. Without them every delete of a parent order or quote scans
38
+ // the child table in full.
39
+ //
40
+ // Both tables are high-churn, so the indexes are built CONCURRENTLY to avoid
41
+ // blocking writes during the build. CREATE INDEX CONCURRENTLY cannot run inside a
42
+ // transaction, hence isTransactional() => false; the migration runner applies
43
+ // migrations one-by-one, so this opt-out is safe. Drop first so retrying a failed
44
+ // concurrent build removes PostgreSQL's invalid index stub instead of letting IF
45
+ // NOT EXISTS silently accept it: a half-built concurrent index is left INVALID,
46
+ // the planner ignores it, and IF NOT EXISTS would report success while the table
47
+ // stays unindexed. Same shape as Migration20260806120000 and
48
+ // Migration20260731105052_query_index.
49
+ //
50
+ // On a database that does not have these indexes yet — every fresh install — the
51
+ // drops are no-ops and there is no window without them. An operator who already
52
+ // created one out of band should expect it to be rebuilt here, and the reads that
53
+ // depend on it to fall back to their pre-index cost until the concurrent build
54
+ // finishes; on a large table, run this while the writers that depend on it are
55
+ // paused.
56
+ export class Migration20260821120000_sales_notes_addresses_context_idx extends Migration {
57
+
58
+ override isTransactional(): boolean {
59
+ return false;
60
+ }
61
+
62
+ override up(): void | Promise<void> {
63
+ this.addSql(`drop index concurrently if exists "sales_notes_context_idx";`);
64
+ this.addSql(`create index concurrently "sales_notes_context_idx" on "sales_notes" ("context_id");`);
65
+ this.addSql(`drop index concurrently if exists "sales_notes_order_idx";`);
66
+ this.addSql(`create index concurrently "sales_notes_order_idx" on "sales_notes" ("order_id");`);
67
+ this.addSql(`drop index concurrently if exists "sales_notes_quote_idx";`);
68
+ this.addSql(`create index concurrently "sales_notes_quote_idx" on "sales_notes" ("quote_id");`);
69
+
70
+ this.addSql(`drop index concurrently if exists "sales_document_addresses_document_idx";`);
71
+ this.addSql(`create index concurrently "sales_document_addresses_document_idx" on "sales_document_addresses" ("document_id");`);
72
+ this.addSql(`drop index concurrently if exists "sales_document_addresses_order_idx";`);
73
+ this.addSql(`create index concurrently "sales_document_addresses_order_idx" on "sales_document_addresses" ("order_id");`);
74
+ this.addSql(`drop index concurrently if exists "sales_document_addresses_quote_idx";`);
75
+ this.addSql(`create index concurrently "sales_document_addresses_quote_idx" on "sales_document_addresses" ("quote_id");`);
76
+ }
77
+
78
+ override down(): void | Promise<void> {
79
+ this.addSql(`drop index concurrently if exists "sales_document_addresses_quote_idx";`);
80
+ this.addSql(`drop index concurrently if exists "sales_document_addresses_order_idx";`);
81
+ this.addSql(`drop index concurrently if exists "sales_document_addresses_document_idx";`);
82
+ this.addSql(`drop index concurrently if exists "sales_notes_quote_idx";`);
83
+ this.addSql(`drop index concurrently if exists "sales_notes_order_idx";`);
84
+ this.addSql(`drop index concurrently if exists "sales_notes_context_idx";`);
85
+ }
86
+
87
+ }
@@ -3,6 +3,7 @@ import type { ModuleSetupConfig } from '@open-mercato/shared/modules/setup'
3
3
  import { SalesSettings, SalesDocumentSequence, SalesTaxRate } from './data/entities'
4
4
  import { DEFAULT_ORDER_NUMBER_FORMAT, DEFAULT_QUOTE_NUMBER_FORMAT } from './lib/documentNumberTokens'
5
5
  import { seedSalesStatusDictionaries, seedSalesAdjustmentKinds } from './lib/dictionaries'
6
+ import { seedSalesChannelsToggle } from './lib/salesChannelsToggleSeed'
6
7
  import { ensureExampleShippingMethods, ensureExamplePaymentMethods } from './seed/examples-data'
7
8
  import { seedSalesExamples } from './seed/examples'
8
9
 
@@ -116,6 +117,7 @@ export const setup: ModuleSetupConfig = {
116
117
  await seedSalesAdjustmentKinds(em, scope)
117
118
  await ensureExampleShippingMethods(em, scope)
118
119
  await ensureExamplePaymentMethods(em, scope)
120
+ await seedSalesChannelsToggle(em)
119
121
  },
120
122
 
121
123
  async seedExamples({ em, container, tenantId, organizationId }) {
@@ -1,19 +1,27 @@
1
1
  import type { InjectionColumnWidget } from '@open-mercato/shared/modules/widgets/injection'
2
+ import { InjectionPosition } from '@open-mercato/shared/modules/widgets/injection-position'
2
3
 
3
4
  const widget: InjectionColumnWidget = {
4
5
  metadata: {
5
6
  id: 'sales.injection.payment-gateway-status-column',
6
7
  priority: 50,
8
+ features: ['payment_gateways.view'],
9
+ // The header key and every value this column can ever show come from
10
+ // `payment_gateways`; without that module the column has no data source and
11
+ // its header would degrade to the raw translation key.
12
+ requiredModules: ['payment_gateways'],
7
13
  },
8
14
  columns: [
9
15
  {
10
16
  id: 'gateway_status',
11
17
  header: 'payment_gateways.column.gatewayStatus',
12
18
  accessorKey: '_gateway.unifiedStatus',
19
+ size: 120,
13
20
  sortable: false,
21
+ placement: { position: InjectionPosition.After, relativeTo: 'status' },
14
22
  cell: ({ getValue }) => {
15
23
  const value = getValue()
16
- return typeof value === 'string' && value.trim().length > 0 ? value : 'pending'
24
+ return typeof value === 'string' && value.trim().length > 0 ? value : ''
17
25
  },
18
26
  },
19
27
  ],
@@ -17,13 +17,10 @@ export const injectionTable: ModuleInjectionTable = {
17
17
  priority: 50,
18
18
  },
19
19
  ],
20
- // NOTE: the 'data-table:sales.payments:columns' binding for
21
- // 'sales.injection.payment-gateway-status-column' was removed here — it could never
22
- // resolve. PaymentsSection.tsx renders its DataTable with no perspective/injectionSpotId/
23
- // extensionTableId, so extensionTableId is null and the columns spot degrades to
24
- // '__disabled__:columns'. The widget itself is still registered and is now UNBOUND: giving
25
- // the payments table a real tableId so the gateway-status column finally renders is a sales
26
- // feature gap, tracked in #5142 rather than silently reintroduced here.
20
+ 'data-table:sales.payments:columns': {
21
+ widgetId: 'sales.injection.payment-gateway-status-column',
22
+ priority: 50,
23
+ },
27
24
  'crud-form:sales.payment_method:fields': {
28
25
  widgetId: 'sales.injection.payment-gateway-config-field',
29
26
  priority: 40,
@@ -30,6 +30,7 @@ type LeaveRequestsResponse = {
30
30
  items?: Array<Record<string, unknown>>
31
31
  total?: number
32
32
  totalPages?: number
33
+ totalIsCapped?: boolean
33
34
  }
34
35
 
35
36
  export default function StaffLeaveRequestsPage() {
@@ -40,6 +41,7 @@ export default function StaffLeaveRequestsPage() {
40
41
  const [page, setPage] = React.useState(1)
41
42
  const [total, setTotal] = React.useState(0)
42
43
  const [totalPages, setTotalPages] = React.useState(1)
44
+ const [totalIsCapped, setTotalIsCapped] = React.useState(false)
43
45
  const [search, setSearch] = React.useState('')
44
46
  const [isLoading, setIsLoading] = React.useState(true)
45
47
  const [sorting, setSorting] = React.useState<SortingState>([{ id: 'startDate', desc: true }])
@@ -123,6 +125,7 @@ export default function StaffLeaveRequestsPage() {
123
125
  setRows(items.map(mapLeaveRequest))
124
126
  setTotal(typeof payload.total === 'number' ? payload.total : items.length)
125
127
  setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)
128
+ setTotalIsCapped(payload?.totalIsCapped === true)
126
129
  } catch {
127
130
  setRows([])
128
131
  setTotal(0)
@@ -177,6 +180,7 @@ export default function StaffLeaveRequestsPage() {
177
180
  pageSize: PAGE_SIZE,
178
181
  total,
179
182
  totalPages,
183
+ totalIsCapped,
180
184
  onPageChange: setPage,
181
185
  }}
182
186
  onRowClick={(row) => {
@@ -29,6 +29,7 @@ type LeaveRequestsResponse = {
29
29
  total?: number
30
30
  totalPages?: number
31
31
  viewer?: { memberId?: string | null; canSend?: boolean }
32
+ totalIsCapped?: boolean
32
33
  }
33
34
 
34
35
  export default function StaffMyLeaveRequestsPage() {
@@ -39,6 +40,7 @@ export default function StaffMyLeaveRequestsPage() {
39
40
  const [page, setPage] = React.useState(1)
40
41
  const [total, setTotal] = React.useState(0)
41
42
  const [totalPages, setTotalPages] = React.useState(1)
43
+ const [totalIsCapped, setTotalIsCapped] = React.useState(false)
42
44
  const [search, setSearch] = React.useState('')
43
45
  const [isLoading, setIsLoading] = React.useState(true)
44
46
  const [sorting, setSorting] = React.useState<SortingState>([{ id: 'startDate', desc: true }])
@@ -118,6 +120,7 @@ export default function StaffMyLeaveRequestsPage() {
118
120
  setRows(items.map(mapLeaveRequest))
119
121
  setTotal(typeof payload.total === 'number' ? payload.total : items.length)
120
122
  setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)
123
+ setTotalIsCapped(payload?.totalIsCapped === true)
121
124
  const viewerMemberId = typeof payload.viewer?.memberId === 'string' ? payload.viewer.memberId : null
122
125
  setMemberId(viewerMemberId)
123
126
  setCanSend(payload.viewer?.canSend === true)
@@ -182,6 +185,7 @@ export default function StaffMyLeaveRequestsPage() {
182
185
  pageSize: PAGE_SIZE,
183
186
  total,
184
187
  totalPages,
188
+ totalIsCapped,
185
189
  onPageChange: setPage,
186
190
  }}
187
191
  onRowClick={(row) => {
@@ -47,6 +47,7 @@ type TeamMembersResponse = {
47
47
  items?: Array<Record<string, unknown>>
48
48
  total?: number
49
49
  totalPages?: number
50
+ totalIsCapped?: boolean
50
51
  }
51
52
 
52
53
  type TeamsResponse = {
@@ -68,6 +69,7 @@ export default function StaffTeamMembersPage() {
68
69
  const [page, setPage] = React.useState(1)
69
70
  const [total, setTotal] = React.useState(0)
70
71
  const [totalPages, setTotalPages] = React.useState(1)
72
+ const [totalIsCapped, setTotalIsCapped] = React.useState(false)
71
73
  const [sorting, setSorting] = React.useState<SortingState>([{ id: 'displayName', desc: false }])
72
74
  const [search, setSearch] = React.useState('')
73
75
  const [isLoading, setIsLoading] = React.useState(true)
@@ -272,6 +274,9 @@ export default function StaffTeamMembersPage() {
272
274
  : typeof payload.totalPages === 'number'
273
275
  ? payload.totalPages
274
276
  : Math.max(1, Math.ceil(items.length / PAGE_SIZE)))
277
+ // A role filter is applied client-side over the fetched page, so the total
278
+ // shown is that array's length — exact by construction, never a capped floor.
279
+ setTotalIsCapped(!roleFilterApplied && payload.totalIsCapped === true)
275
280
  } catch (error) {
276
281
  logger.error('staff.team-members.list', { err: error })
277
282
  flash(labels.errors.load, 'error')
@@ -452,6 +457,7 @@ export default function StaffTeamMembersPage() {
452
457
  pageSize: PAGE_SIZE,
453
458
  total,
454
459
  totalPages,
460
+ totalIsCapped,
455
461
  onPageChange: setPage,
456
462
  }}
457
463
  rowActions={(row) => row.kind === 'member' ? (
@@ -41,6 +41,7 @@ type TeamRolesResponse = {
41
41
  items?: Array<Record<string, unknown>>
42
42
  total?: number
43
43
  totalPages?: number
44
+ totalIsCapped?: boolean
44
45
  }
45
46
 
46
47
  type TeamsResponse = {
@@ -56,6 +57,7 @@ export default function StaffTeamRolesPage() {
56
57
  const [page, setPage] = React.useState(1)
57
58
  const [total, setTotal] = React.useState(0)
58
59
  const [totalPages, setTotalPages] = React.useState(1)
60
+ const [totalIsCapped, setTotalIsCapped] = React.useState(false)
59
61
  const [search, setSearch] = React.useState('')
60
62
  const [isLoading, setIsLoading] = React.useState(true)
61
63
  const [reloadToken, setReloadToken] = React.useState(0)
@@ -203,6 +205,7 @@ export default function StaffTeamRolesPage() {
203
205
  setRows(buildTeamRoleRows(items.map(mapApiTeamRole), labels.groups.unassigned))
204
206
  setTotal(typeof payload.total === 'number' ? payload.total : items.length)
205
207
  setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : Math.max(1, Math.ceil(items.length / PAGE_SIZE)))
208
+ setTotalIsCapped(payload?.totalIsCapped === true)
206
209
  } catch (error) {
207
210
  logger.error('staff.team-roles.list', { err: error })
208
211
  flash(labels.errors.load, 'error')
@@ -329,6 +332,7 @@ export default function StaffTeamRolesPage() {
329
332
  pageSize: PAGE_SIZE,
330
333
  total,
331
334
  totalPages,
335
+ totalIsCapped,
332
336
  onPageChange: setPage,
333
337
  }}
334
338
  rowActions={(row) => row.kind === 'role' ? (
@@ -60,6 +60,7 @@ type TeamMembersResponse = {
60
60
  items?: Array<Record<string, unknown>>
61
61
  total?: number
62
62
  totalPages?: number
63
+ totalIsCapped?: boolean
63
64
  }
64
65
 
65
66
  export default function StaffTeamEditPage({ params }: { params?: { id?: string } }) {
@@ -76,6 +77,7 @@ export default function StaffTeamEditPage({ params }: { params?: { id?: string }
76
77
  const [memberRows, setMemberRows] = React.useState<TeamMemberRow[]>([])
77
78
  const [memberPage, setMemberPage] = React.useState(1)
78
79
  const [memberTotal, setMemberTotal] = React.useState(0)
80
+ const [memberTotalIsCapped, setMemberTotalIsCapped] = React.useState(false)
79
81
  const [memberTotalPages, setMemberTotalPages] = React.useState(1)
80
82
  const [memberSorting, setMemberSorting] = React.useState<SortingState>([{ id: 'displayName', desc: false }])
81
83
  const [memberSearch, setMemberSearch] = React.useState('')
@@ -263,6 +265,7 @@ export default function StaffTeamEditPage({ params }: { params?: { id?: string }
263
265
  const items = Array.isArray(payload.items) ? payload.items : []
264
266
  setMemberRows(items.map(mapApiTeamMember))
265
267
  setMemberTotal(typeof payload.total === 'number' ? payload.total : items.length)
268
+ setMemberTotalIsCapped(payload.totalIsCapped === true)
266
269
  setMemberTotalPages(
267
270
  typeof payload.totalPages === 'number'
268
271
  ? payload.totalPages
@@ -434,6 +437,7 @@ export default function StaffTeamEditPage({ params }: { params?: { id?: string }
434
437
  pageSize: TEAM_MEMBERS_PAGE_SIZE,
435
438
  total: memberTotal,
436
439
  totalPages: memberTotalPages,
440
+ totalIsCapped: memberTotalIsCapped,
437
441
  onPageChange: setMemberPage,
438
442
  }}
439
443
  rowActions={(row) => (
@@ -41,6 +41,7 @@ type TeamsResponse = {
41
41
  items?: Array<Record<string, unknown>>
42
42
  total?: number
43
43
  totalPages?: number
44
+ totalIsCapped?: boolean
44
45
  }
45
46
 
46
47
  export default function StaffTeamsPage() {
@@ -52,6 +53,7 @@ export default function StaffTeamsPage() {
52
53
  const [page, setPage] = React.useState(1)
53
54
  const [total, setTotal] = React.useState(0)
54
55
  const [totalPages, setTotalPages] = React.useState(1)
56
+ const [totalIsCapped, setTotalIsCapped] = React.useState(false)
55
57
  const [sorting, setSorting] = React.useState<SortingState>([{ id: 'name', desc: false }])
56
58
  const [search, setSearch] = React.useState('')
57
59
  const [isLoading, setIsLoading] = React.useState(true)
@@ -176,6 +178,7 @@ export default function StaffTeamsPage() {
176
178
  setRows(items.map(mapApiTeam))
177
179
  setTotal(typeof payload.total === 'number' ? payload.total : items.length)
178
180
  setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : Math.max(1, Math.ceil(items.length / PAGE_SIZE)))
181
+ setTotalIsCapped(payload?.totalIsCapped === true)
179
182
  } catch (error) {
180
183
  logger.error('staff.teams.list', { err: error })
181
184
  flash(labels.errors.load, 'error')
@@ -261,6 +264,7 @@ export default function StaffTeamsPage() {
261
264
  pageSize: PAGE_SIZE,
262
265
  total,
263
266
  totalPages,
267
+ totalIsCapped,
264
268
  onPageChange: setPage,
265
269
  }}
266
270
  rowActions={(row) => (
@@ -178,6 +178,12 @@ export default function MyTimesheetsPage() {
178
178
  blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),
179
179
  })
180
180
 
181
+ const gridInstanceId = React.useId()
182
+ const durationHintId = `${gridInstanceId}-duration-hint`
183
+ const buildDurationErrorId = React.useCallback(
184
+ (projectId: string, dateKey: string): string => `${gridInstanceId}-duration-error-${projectId}-${dateKey}`,
185
+ [gridInstanceId],
186
+ )
181
187
  const durationFormatHint = t(
182
188
  'staff.timesheets.my.duration.hint',
183
189
  'Enter hours (8 or 1.5), h:mm (1:30) or minutes (90m). Max 24h per day.',
@@ -919,6 +925,7 @@ export default function MyTimesheetsPage() {
919
925
  const isDirty = dirty[project.id]?.[dateKey] !== undefined
920
926
  const cellError = cellErrors[project.id]?.[dateKey]
921
927
  const cellErrorMessage = cellError ? describeDurationError(cellError) : undefined
928
+ const cellErrorId = cellErrorMessage ? buildDurationErrorId(project.id, dateKey) : undefined
922
929
  return (
923
930
  <td key={dateKey} className={`px-0.5 py-0.5 ${weekend ? 'bg-muted/40' : ''}`}>
924
931
  {weekend ? (
@@ -943,9 +950,13 @@ export default function MyTimesheetsPage() {
943
950
  placeholder={t('staff.timesheets.my.durationPlaceholder', '0')}
944
951
  aria-invalid={cellError !== undefined}
945
952
  aria-label={describeDurationCell(project.name, date)}
953
+ aria-describedby={[durationHintId, cellErrorId].filter(Boolean).join(' ')}
946
954
  title={cellErrorMessage ?? durationFormatHint}
947
955
  />
948
956
  )}
957
+ {cellErrorMessage ? (
958
+ <span id={cellErrorId} role="alert" className="sr-only">{cellErrorMessage}</span>
959
+ ) : null}
949
960
  </td>
950
961
  )
951
962
  })}
@@ -984,7 +995,7 @@ export default function MyTimesheetsPage() {
984
995
  </tr>
985
996
  </tfoot>
986
997
  </table>
987
- <p className="px-3 py-2 text-xs text-muted-foreground">{durationFormatHint}</p>
998
+ <p id={durationHintId} className="px-3 py-2 text-xs text-muted-foreground">{durationFormatHint}</p>
988
999
  </div>
989
1000
  )}
990
1001
  </div>