@open-mercato/core 0.7.0 → 0.7.1-develop.7102.1.b41f7e3e51

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 +11 -4
  160. package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
  161. package/dist/modules/customers/api/deals/map/route.js +2 -1
  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 +14 -4
  631. package/src/modules/customers/api/deals/map/route.ts +1 -0
  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
@@ -12,7 +12,7 @@ import { flash } from '@open-mercato/ui/backend/FlashMessages'
12
12
  import { RowActions } from '@open-mercato/ui/backend/RowActions'
13
13
  import { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'
14
14
  import { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
15
- import { useT } from '@open-mercato/shared/lib/i18n/context'
15
+ import { useT, useLocale } from '@open-mercato/shared/lib/i18n/context'
16
16
  import {
17
17
  emitSalesDocumentTotalsRefresh,
18
18
  subscribeSalesDocumentTotalsRefresh,
@@ -41,15 +41,16 @@ type SalesReturnsSectionProps = {
41
41
  documentUpdatedAt?: string | null
42
42
  }
43
43
 
44
- function formatDisplayDate(value: string | null | undefined): string | null {
44
+ export function formatDisplayDate(value: string | null | undefined, locale?: string): string | null {
45
45
  if (!value) return null
46
46
  const date = new Date(value)
47
47
  if (Number.isNaN(date.getTime())) return null
48
- return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' }).format(date)
48
+ return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(date)
49
49
  }
50
50
 
51
51
  export function SalesReturnsSection({ orderId, currencyCode, documentUpdatedAt }: SalesReturnsSectionProps) {
52
52
  const t = useT()
53
+ const locale = useLocale()
53
54
  const { organizationId, tenantId } = useOrganizationScopeDetail()
54
55
  const { confirm, ConfirmDialogElement } = useConfirmDialog()
55
56
  const [returns, setReturns] = React.useState<ReturnRow[]>([])
@@ -328,10 +329,10 @@ export function SalesReturnsSection({ orderId, currencyCode, documentUpdatedAt }
328
329
  </div>
329
330
  </div>
330
331
  <div className="whitespace-nowrap text-right text-sm text-muted-foreground">
331
- {formatDisplayDate(ret.returnedAt) ?? t('sales.returns.notSet', 'Not set')}
332
+ {formatDisplayDate(ret.returnedAt, locale) ?? t('sales.returns.notSet', 'Not set')}
332
333
  </div>
333
334
  <div className="whitespace-nowrap text-right text-sm font-medium">
334
- {formatMoney(ret.total, currencyCode ?? null)}
335
+ {formatMoney(ret.total, currencyCode ?? null, locale)}
335
336
  </div>
336
337
  <div className="flex justify-end">
337
338
  <RowActions
@@ -55,6 +55,7 @@ type ApiDocument = {
55
55
  customerEntityId?: string | null
56
56
  customerSnapshot?: Record<string, unknown> | null
57
57
  channelId?: string | null
58
+ channelName?: string | null
58
59
  lineItemCount?: number | null
59
60
  grandTotalNetAmount?: number | null
60
61
  grandTotalGrossAmount?: number | null
@@ -70,6 +71,7 @@ type DocumentsResponse = {
70
71
  items?: Array<Record<string, unknown>>
71
72
  total?: number
72
73
  totalPages?: number
74
+ totalIsCapped?: boolean
73
75
  }
74
76
 
75
77
  type SalesDocumentRow = {
@@ -79,6 +81,7 @@ type SalesDocumentRow = {
79
81
  customerName?: string | null
80
82
  customerEmail?: string | null
81
83
  channelId?: string | null
84
+ channelName?: string | null
82
85
  lineItemCount?: number | null
83
86
  totalNet?: number | null
84
87
  totalGross?: number | null
@@ -89,6 +92,20 @@ type SalesDocumentRow = {
89
92
 
90
93
  const PAGE_SIZE = 20
91
94
 
95
+ // Not a uuid on purpose: the API drops non-uuid entries from channelIds, so a leak of this sentinel
96
+ // into the id list narrows the filter instead of erroring.
97
+ const UNASSIGNED_CHANNEL_VALUE = '__unassigned__'
98
+
99
+ // Perspectives persist filterValues, so snapshots saved while this filter was a single-value select
100
+ // hold a bare string. Without this the multi-select would read it as an unknown shape and silently
101
+ // clear the user's saved filter.
102
+ function normalizeChannelSelection(value: unknown): string[] {
103
+ const raw = Array.isArray(value) ? value : typeof value === 'string' ? [value] : []
104
+ return raw
105
+ .map((entry) => (typeof entry === 'string' ? entry.trim() : String(entry || '').trim()))
106
+ .filter((entry) => entry.length > 0)
107
+ }
108
+
92
109
  function resolveCustomerName(snapshot: CustomerSnapshot | null | undefined, fallback?: string | null) {
93
110
  if (!snapshot) return fallback ?? null
94
111
  const base = snapshot.customer?.displayName ?? null
@@ -157,6 +174,7 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
157
174
  const [page, setPage] = React.useState(1)
158
175
  const [total, setTotal] = React.useState(0)
159
176
  const [totalPages, setTotalPages] = React.useState(1)
177
+ const [totalIsCapped, setTotalIsCapped] = React.useState(false)
160
178
  const [sorting, setSorting] = React.useState<SortingState>([{ id: 'createdAt', desc: true }])
161
179
  const [search, setSearch] = React.useState('')
162
180
  const [filterValues, setFilterValues] = React.useState<FilterValues>({})
@@ -178,9 +196,7 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
178
196
  'Review documents with customer context, totals, and channels.'
179
197
  )
180
198
 
181
- const fetchChannelOptions = React.useCallback(async (query?: string): Promise<FilterOption[]> => {
182
- const params = new URLSearchParams({ page: '1', pageSize: '50' })
183
- if (query && query.trim()) params.set('search', query.trim())
199
+ const fetchChannelOptionsBy = React.useCallback(async (params: URLSearchParams): Promise<FilterOption[]> => {
184
200
  try {
185
201
  const call = await apiCall<{ items?: unknown[] }>(`/api/sales/channels?${params.toString()}`)
186
202
  if (!call.ok) return []
@@ -198,6 +214,32 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
198
214
  }
199
215
  }, [])
200
216
 
217
+ const fetchChannelOptions = React.useCallback(
218
+ (query?: string) => {
219
+ const params = new URLSearchParams({ page: '1', pageSize: '50' })
220
+ if (query && query.trim()) params.set('search', query.trim())
221
+ return fetchChannelOptionsBy(params)
222
+ },
223
+ [fetchChannelOptionsBy]
224
+ )
225
+
226
+ // A selected channel outside the first options page — restored from a perspective, or simply the
227
+ // 51st channel — would otherwise render as a bare uuid in the filter chip and the selected tag,
228
+ // which is the same defect this change removes from the column. The route supports `ids=`, so
229
+ // fetch exactly the selected ones and merge them in. See
230
+ // `.ai/lessons/async-edit-selects-must-be-hydrated-as-value-plus.md`.
231
+ const seedChannelOptionsForIds = React.useCallback(
232
+ async (ids: string[]) => {
233
+ const missing = ids.filter((id) => id !== UNASSIGNED_CHANNEL_VALUE)
234
+ if (!missing.length) return
235
+ const params = new URLSearchParams({ page: '1', pageSize: String(missing.length) })
236
+ params.set('ids', missing.join(','))
237
+ const opts = await fetchChannelOptionsBy(params)
238
+ if (opts.length) setChannelOptions((prev) => mergeOptions(prev, opts))
239
+ },
240
+ [fetchChannelOptionsBy]
241
+ )
242
+
201
243
  const fetchTagOptions = React.useCallback(async (query?: string): Promise<FilterOption[]> => {
202
244
  const params = new URLSearchParams({ page: '1', pageSize: '50' })
203
245
  if (query && query.trim()) params.set('search', query.trim())
@@ -278,6 +320,32 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
278
320
  [fetchChannelOptions]
279
321
  )
280
322
 
323
+ const unassignedChannelOption = React.useMemo<FilterOption>(
324
+ () => ({
325
+ value: UNASSIGNED_CHANNEL_VALUE,
326
+ label: t('sales.documents.list.filters.channelUnassigned', '(No channel)'),
327
+ }),
328
+ [t]
329
+ )
330
+
331
+ // The sentinel is offered alongside the real channels so "these channels or unassigned" is one
332
+ // selection. It is stripped back out when the query is built — the API takes it as a separate
333
+ // channelIdsEmpty flag, not as an id.
334
+ const channelFilterOptions = React.useMemo<FilterOption[]>(
335
+ () => [unassignedChannelOption, ...channelOptions],
336
+ [channelOptions, unassignedChannelOption]
337
+ )
338
+
339
+ const loadChannelFilterOptions = React.useCallback(
340
+ async (query?: string) => {
341
+ const opts = await loadChannelOptions(query)
342
+ // Only offer the sentinel when the user is browsing rather than searching — typing "web"
343
+ // should not suggest "(No channel)".
344
+ return query && query.trim() ? opts : [unassignedChannelOption, ...opts]
345
+ },
346
+ [loadChannelOptions, unassignedChannelOption]
347
+ )
348
+
281
349
  const loadTagOptions = React.useCallback(
282
350
  async (query?: string) => {
283
351
  const opts = await fetchTagOptions(query)
@@ -307,9 +375,14 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
307
375
  ...(channelsEnabled ? [{
308
376
  id: 'channelId',
309
377
  label: t('sales.documents.list.filters.channel', 'Channel'),
310
- type: 'select',
311
- options: channelOptions,
312
- loadOptions: loadChannelOptions,
378
+ type: 'tags',
379
+ options: channelFilterOptions,
380
+ loadOptions: loadChannelFilterOptions,
381
+ placeholder: t('sales.documents.list.filters.channelPlaceholder', 'Search channels'),
382
+ formatValue: (val: string) =>
383
+ val === UNASSIGNED_CHANNEL_VALUE
384
+ ? t('sales.documents.list.filters.channelUnassigned', '(No channel)')
385
+ : channelOptions.find((opt) => opt.value === val)?.label ?? val,
313
386
  } satisfies FilterDef] : []),
314
387
  {
315
388
  id: 'date',
@@ -367,7 +440,7 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
367
440
  formatValue: (val: string) => tagOptions.find((o) => o.value === val)?.label ?? val,
368
441
  formatDescription: (val: string) => tagOptions.find((o) => o.value === val)?.description ?? null,
369
442
  },
370
- ], [channelsEnabled, channelOptions, loadChannelOptions, customerOptions, loadCustomerOptions, loadTagOptions, tagOptions, t])
443
+ ], [channelsEnabled, channelFilterOptions, channelOptions, loadChannelFilterOptions, customerOptions, loadCustomerOptions, loadTagOptions, tagOptions, t])
371
444
 
372
445
  const queryParams = React.useMemo(() => {
373
446
  const params = new URLSearchParams()
@@ -379,8 +452,10 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
379
452
  params.set('sortField', sort.id)
380
453
  params.set('sortDir', sort.desc ? 'desc' : 'asc')
381
454
  }
382
- const channelId = typeof filterValues.channelId === 'string' ? filterValues.channelId : ''
383
- if (channelId) params.set('channelId', channelId)
455
+ const channelSelection = normalizeChannelSelection(filterValues.channelId)
456
+ const channelIds = channelSelection.filter((value) => value !== UNASSIGNED_CHANNEL_VALUE)
457
+ if (channelIds.length > 0) params.set('channelIds', channelIds.join(','))
458
+ if (channelSelection.includes(UNASSIGNED_CHANNEL_VALUE)) params.set('channelIdsEmpty', 'true')
384
459
  const customerIds = Array.isArray(filterValues.customerId)
385
460
  ? filterValues.customerId
386
461
  .map((value) => (typeof value === 'string' ? value.trim() : String(value || '').trim()))
@@ -469,6 +544,7 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
469
544
  customerName,
470
545
  customerEmail,
471
546
  channelId: doc.channelId ?? null,
547
+ channelName: doc.channelName ?? null,
472
548
  lineItemCount: doc.lineItemCount ?? null,
473
549
  totalNet,
474
550
  totalGross,
@@ -490,6 +566,7 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
490
566
  setRows([])
491
567
  setTotal(0)
492
568
  setTotalPages(1)
569
+ setTotalIsCapped(false)
493
570
  return
494
571
  }
495
572
  const payload = call.result ?? {}
@@ -501,6 +578,7 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
501
578
  ? payload.totalPages
502
579
  : Math.max(1, Math.ceil(count / PAGE_SIZE))
503
580
  setTotalPages(pages)
581
+ setTotalIsCapped(payload.totalIsCapped === true)
504
582
  setCacheStatus(call.cacheStatus ?? null)
505
583
  } catch (err) {
506
584
  logger.error('sales.documents.list', { err })
@@ -514,10 +592,22 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
514
592
  void loadDocuments()
515
593
  }, [loadDocuments, reloadToken, scopeVersion])
516
594
 
595
+ // Normalize at the hydration boundary, not only where the query string is built: a perspective
596
+ // saved while this filter was a single-value select restores `channelId` as a bare string, and
597
+ // the `tags` control renders nothing for a non-array value. Storing the normalized shape keeps
598
+ // the control, the active-filter chip and the query builder all reading one shape — otherwise the
599
+ // list is filtered while the field looks empty, and the next channel the user picks replaces the
600
+ // restored one instead of joining it.
517
601
  const handleFiltersApply = React.useCallback((values: FilterValues) => {
518
- setFilterValues(values)
602
+ if (values.channelId === undefined) {
603
+ setFilterValues(values)
604
+ } else {
605
+ const channelSelection = normalizeChannelSelection(values.channelId)
606
+ setFilterValues({ ...values, channelId: channelSelection })
607
+ void seedChannelOptionsForIds(channelSelection)
608
+ }
519
609
  setPage(1)
520
- }, [])
610
+ }, [seedChannelOptionsForIds])
521
611
 
522
612
  const handleFiltersClear = React.useCallback(() => {
523
613
  setFilterValues({})
@@ -625,9 +715,10 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
625
715
  cell: ({ row }) => {
626
716
  const channelId = row.original.channelId
627
717
  if (!channelId) return <span className="text-xs text-muted-foreground">{t('sales.documents.list.table.unassigned', 'Unassigned')}</span>
628
- const channel = channelOptions.find((opt) => opt.value === channelId)
718
+ // Server-resolved, so this no longer depends on the channel being inside the options page.
719
+ // The uuid remains only for a channel the list response could not resolve.
629
720
  return (
630
- <span className="text-sm">{channel?.label ?? channelId}</span>
721
+ <span className="text-sm">{row.original.channelName ?? channelId}</span>
631
722
  )
632
723
  },
633
724
  enableSorting: false,
@@ -665,7 +756,7 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
665
756
  ? <span className="text-xs text-muted-foreground">{new Date(row.original.date).toLocaleString()}</span>
666
757
  : <span className="text-xs text-muted-foreground">—</span>,
667
758
  },
668
- ], [channelsEnabled, channelOptions, kind, statusMap, t])
759
+ ], [channelsEnabled, kind, statusMap, t])
669
760
 
670
761
  const emptyLabel = kind === 'order'
671
762
  ? t('sales.documents.list.table.emptyOrders', 'No orders yet.')
@@ -713,6 +804,7 @@ export function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {
713
804
  pageSize: PAGE_SIZE,
714
805
  total,
715
806
  totalPages,
807
+ totalIsCapped,
716
808
  onPageChange: setPage,
717
809
  cacheStatus,
718
810
  }}
@@ -7,7 +7,7 @@ import { DataTable } from '@open-mercato/ui/backend/DataTable'
7
7
  import { RowActions } from '@open-mercato/ui/backend/RowActions'
8
8
  import { EmptyState } from '@open-mercato/ui/primitives/empty-state'
9
9
  import { Button } from '@open-mercato/ui/primitives/button'
10
- import { useT } from '@open-mercato/shared/lib/i18n/context'
10
+ import { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'
11
11
  import { LineItemDialog } from './LineItemDialog'
12
12
  import type { SalesLineRecord } from './lineItemTypes'
13
13
  import { formatMoney, normalizeNumber } from './lineItemUtils'
@@ -93,6 +93,7 @@ export function SalesOrderDraftLines({
93
93
  onChange,
94
94
  }: SalesOrderDraftLinesProps) {
95
95
  const t = useT()
96
+ const locale = useLocale()
96
97
  const [dialogOpen, setDialogOpen] = React.useState(false)
97
98
  const [editing, setEditing] = React.useState<SalesOrderLineDraft | null>(null)
98
99
 
@@ -112,14 +113,14 @@ export function SalesOrderDraftLines({
112
113
  {
113
114
  id: 'unitPrice',
114
115
  header: t('sales.documents.items.table.unit', 'Unit price'),
115
- cell: ({ row }) => formatMoney(row.original.record.unitPriceGross, row.original.record.currencyCode ?? currencyCode ?? undefined),
116
+ cell: ({ row }) => formatMoney(row.original.record.unitPriceGross, row.original.record.currencyCode ?? currencyCode ?? undefined, locale),
116
117
  },
117
118
  {
118
119
  id: 'total',
119
120
  header: t('sales.documents.items.table.total', 'Total'),
120
- cell: ({ row }) => formatMoney(row.original.record.totalGross, row.original.record.currencyCode ?? currencyCode ?? undefined),
121
+ cell: ({ row }) => formatMoney(row.original.record.totalGross, row.original.record.currencyCode ?? currencyCode ?? undefined, locale),
121
122
  },
122
- ], [currencyCode, t])
123
+ ], [currencyCode, locale, t])
123
124
 
124
125
  const openCreate = React.useCallback(() => {
125
126
  setEditing(null)
@@ -161,7 +162,7 @@ export function SalesOrderDraftLines({
161
162
  {t('sales.documents.items.add', 'Add item')}
162
163
  </Button>
163
164
  </div>
164
- {error ? <p className="text-sm text-destructive" role="alert">{error}</p> : null}
165
+ {error ? <p className="text-sm text-status-error-text" role="alert">{error}</p> : null}
165
166
  <DataTable
166
167
  columns={columns}
167
168
  data={lines}
@@ -20,7 +20,7 @@ import { flash } from '@open-mercato/ui/backend/FlashMessages'
20
20
  import { cn } from '@open-mercato/shared/lib/utils'
21
21
  import { E } from '#generated/entities.ids.generated'
22
22
  import { emitSalesDocumentTotalsRefresh } from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'
23
- import { useT } from '@open-mercato/shared/lib/i18n/context'
23
+ import { useT, useLocale } from '@open-mercato/shared/lib/i18n/context'
24
24
  import { formatMoney, normalizeNumber } from './lineItemUtils'
25
25
  import type { OrderLine, ShipmentRow } from './shipmentTypes'
26
26
  import { formatAddressString, type AddressFormatStrategy, type AddressValue } from '@open-mercato/core/modules/customers/utils/addressFormat'
@@ -290,6 +290,7 @@ export function ShipmentDialog({
290
290
  onAddComment,
291
291
  }: ShipmentDialogProps) {
292
292
  const t = useT()
293
+ const locale = useLocale()
293
294
  const [formResetKey, setFormResetKey] = React.useState(0)
294
295
  const [shippingMethods, setShippingMethods] = React.useState<ShippingMethodOption[]>([])
295
296
  const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)
@@ -540,21 +541,21 @@ export function ShipmentDialog({
540
541
  if (option.avgPrice !== null) {
541
542
  parts.push(
542
543
  t('sales.documents.shipments.shippingMethodAvg', 'Avg {{price}}', {
543
- price: formatMoney(option.avgPrice, currency ?? null),
544
+ price: formatMoney(option.avgPrice, currency ?? null, locale),
544
545
  }),
545
546
  )
546
547
  }
547
548
  if (option.minPrice !== null) {
548
549
  parts.push(
549
550
  t('sales.documents.shipments.shippingMethodMin', 'Min {{price}}', {
550
- price: formatMoney(option.minPrice, currency ?? null),
551
+ price: formatMoney(option.minPrice, currency ?? null, locale),
551
552
  }),
552
553
  )
553
554
  }
554
555
  if (parts.length === 0) return undefined
555
556
  return parts.join(' · ')
556
557
  },
557
- [currencyCode, t],
558
+ [currencyCode, locale, t],
558
559
  )
559
560
 
560
561
  const mapShippingMethod = React.useCallback(
@@ -10,7 +10,7 @@ import { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/u
10
10
  import { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'
11
11
  import { deleteCrud } from '@open-mercato/ui/backend/utils/crud'
12
12
  import { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
13
- import { useT } from '@open-mercato/shared/lib/i18n/context'
13
+ import { useT, useLocale } from '@open-mercato/shared/lib/i18n/context'
14
14
  import { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'
15
15
  import {
16
16
  emitSalesDocumentTotalsRefresh,
@@ -41,11 +41,11 @@ type SalesShipmentsSectionProps = {
41
41
  onAddComment?: (body: string) => Promise<void>
42
42
  }
43
43
 
44
- function formatDisplayDate(value: string | null | undefined): string | null {
44
+ export function formatDisplayDate(value: string | null | undefined, locale?: string): string | null {
45
45
  if (!value) return null
46
46
  const date = new Date(value)
47
47
  if (Number.isNaN(date.getTime())) return null
48
- return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' }).format(date)
48
+ return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(date)
49
49
  }
50
50
 
51
51
  const formatShipmentAddress = (metadata?: Record<string, unknown> | null): string | null => {
@@ -123,6 +123,7 @@ export function SalesShipmentsSection({
123
123
  onAddComment,
124
124
  }: SalesShipmentsSectionProps) {
125
125
  const t = useT()
126
+ const locale = useLocale()
126
127
  const { organizationId, tenantId } = useOrganizationScopeDetail()
127
128
  const { confirm, ConfirmDialogElement } = useConfirmDialog()
128
129
  const resolvedOrganizationId = organizationIdProp ?? organizationId ?? null
@@ -486,8 +487,8 @@ export function SalesShipmentsSection({
486
487
  ) : (
487
488
  <div className="grid gap-3 md:grid-cols-2">
488
489
  {shipments.map((shipment) => {
489
- const shippedAt = formatDisplayDate(shipment.shippedAt)
490
- const deliveredAt = formatDisplayDate(shipment.deliveredAt)
490
+ const shippedAt = formatDisplayDate(shipment.shippedAt, locale)
491
+ const deliveredAt = formatDisplayDate(shipment.deliveredAt, locale)
491
492
  const addressSummary = formatShipmentAddress(shipment.metadata)
492
493
  const statusLabel =
493
494
  shipment.statusLabel ??
@@ -0,0 +1,74 @@
1
+ type ShippedLineSnapshot = {
2
+ quantity: number;
3
+ totalNetAmount?: number | null;
4
+ totalGrossAmount?: number | null;
5
+ };
6
+
7
+ const SHIPPED_LINE_IMMUTABLE_PAYLOAD_FIELDS = [
8
+ "kind",
9
+ "productId",
10
+ "productVariantId",
11
+ "quantityUnit",
12
+ "unitPriceNet",
13
+ "unitPriceGross",
14
+ "priceId",
15
+ "priceMode",
16
+ "taxRateId",
17
+ "taxRate",
18
+ "taxAmount",
19
+ "discountAmount",
20
+ "discountPercent",
21
+ "catalogSnapshot",
22
+ "metadata",
23
+ ] as const;
24
+
25
+ function scaleTotal(
26
+ total: number | null | undefined,
27
+ previousQuantity: number,
28
+ nextQuantity: number,
29
+ ): number | undefined {
30
+ if (
31
+ !Number.isFinite(total) ||
32
+ !Number.isFinite(previousQuantity) ||
33
+ previousQuantity <= 0
34
+ ) {
35
+ return undefined;
36
+ }
37
+ return (total as number) * (nextQuantity / previousQuantity);
38
+ }
39
+
40
+ export function prepareShippedLineUpdatePayload(
41
+ payload: Record<string, unknown>,
42
+ currentLine: ShippedLineSnapshot | null,
43
+ ): Record<string, unknown> {
44
+ if (!currentLine) return payload;
45
+
46
+ const nextPayload = { ...payload };
47
+ for (const field of SHIPPED_LINE_IMMUTABLE_PAYLOAD_FIELDS) {
48
+ delete nextPayload[field];
49
+ }
50
+
51
+ delete nextPayload.totalNetAmount;
52
+ delete nextPayload.totalGrossAmount;
53
+
54
+ const nextQuantity = Number(nextPayload.quantity);
55
+ if (!Number.isFinite(nextQuantity) || nextQuantity === currentLine.quantity) {
56
+ return nextPayload;
57
+ }
58
+
59
+ const scaledNetTotal = scaleTotal(
60
+ currentLine.totalNetAmount,
61
+ currentLine.quantity,
62
+ nextQuantity,
63
+ );
64
+ const scaledGrossTotal = scaleTotal(
65
+ currentLine.totalGrossAmount,
66
+ currentLine.quantity,
67
+ nextQuantity,
68
+ );
69
+ if (scaledNetTotal !== undefined) nextPayload.totalNetAmount = scaledNetTotal;
70
+ if (scaledGrossTotal !== undefined)
71
+ nextPayload.totalGrossAmount = scaledGrossTotal;
72
+
73
+ return nextPayload;
74
+ }
@@ -9,9 +9,14 @@ export function normalizeNumber(value: unknown, fallback = 0): number {
9
9
  return fallback
10
10
  }
11
11
 
12
- export function formatMoney(value: number, currency: string | null | undefined): string {
12
+ /**
13
+ * Pass `locale` to format in the application locale (`useLocale()` in client components).
14
+ * Omitting it keeps the runtime default, which varies per machine and is therefore not
15
+ * assertable in tests.
16
+ */
17
+ export function formatMoney(value: number, currency: string | null | undefined, locale?: string): string {
13
18
  if (!currency) return value.toFixed(2)
14
- return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(value)
19
+ return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)
15
20
  }
16
21
 
17
22
  export type LineDiscountDisplay = {
@@ -1790,6 +1790,9 @@ export class SalesPaymentAllocation {
1790
1790
 
1791
1791
  @Entity({ tableName: 'sales_notes' })
1792
1792
  @Index({ name: 'sales_notes_scope_idx', properties: ['organizationId', 'tenantId'] })
1793
+ @Index({ name: 'sales_notes_context_idx', properties: ['contextId'] })
1794
+ @Index({ name: 'sales_notes_order_idx', properties: ['order'] })
1795
+ @Index({ name: 'sales_notes_quote_idx', properties: ['quote'] })
1793
1796
  export class SalesNote {
1794
1797
  @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1795
1798
  id!: string
@@ -1836,6 +1839,9 @@ export class SalesNote {
1836
1839
 
1837
1840
  @Entity({ tableName: 'sales_document_addresses' })
1838
1841
  @Index({ name: 'sales_document_addresses_scope_idx', properties: ['organizationId', 'tenantId'] })
1842
+ @Index({ name: 'sales_document_addresses_document_idx', properties: ['documentId'] })
1843
+ @Index({ name: 'sales_document_addresses_order_idx', properties: ['order'] })
1844
+ @Index({ name: 'sales_document_addresses_quote_idx', properties: ['quote'] })
1839
1845
  export class SalesDocumentAddress {
1840
1846
  @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1841
1847
  id!: string
@@ -5,6 +5,7 @@ export const extensionPoints = defineModuleExtensionPoints({
5
5
  hosts: {
6
6
  ordersTable: dataTableExtensionHost({ tableId: 'sales.orders', source: 'components/documents/SalesDocumentsTable.tsx' }),
7
7
  quotesTable: dataTableExtensionHost({ tableId: 'sales.quotes', source: 'components/documents/SalesDocumentsTable.tsx' }),
8
+ paymentsTable: dataTableExtensionHost({ tableId: 'sales.payments', source: 'components/documents/PaymentsSection.tsx' }),
8
9
  orderItemColumns: injectionExtensionHost({
9
10
  family: 'detail',
10
11
  spotId: 'data-table:sales.order.items:columns',
@@ -1016,6 +1016,7 @@
1016
1016
  "sales.documents.items.errorProductRequired": "Wähle ein Produkt aus, um fortzufahren.",
1017
1017
  "sales.documents.items.errorQuantity": "Die Menge muss größer als 0 sein.",
1018
1018
  "sales.documents.items.errorQuantityBelowShipped": "Die Menge kann nicht unter die bereits versandten {{shipped}} gesenkt werden.",
1019
+ "sales.documents.items.errorQuantityShipmentsUnknown": "Die Menge kann erst gesenkt werden, wenn die Sendungen dieses Auftrags geladen wurden. Öffnen Sie den Auftrag erneut, um es noch einmal zu versuchen.",
1019
1020
  "sales.documents.items.errorSave": "Position konnte nicht gespeichert werden.",
1020
1021
  "sales.documents.items.errorScope": "Organisation und Mandant sind erforderlich.",
1021
1022
  "sales.documents.items.errorUnitPrice": "Der Stückpreis muss größer als 0 sein.",
@@ -1059,6 +1060,8 @@
1059
1060
  "sales.documents.items.save": "Änderungen speichern",
1060
1061
  "sales.documents.items.selectedProduct": "Ausgewählt {{id}}",
1061
1062
  "sales.documents.items.selectedVariant": "Ausgewählt {{id}}",
1063
+ "sales.documents.items.shippedLineLockPending": "Die Preisangaben sind gesperrt, bis die Sendungen dieses Auftrags geladen wurden. Öffnen Sie den Auftrag erneut, um es noch einmal zu versuchen — Name und eine Erhöhung der Menge können weiterhin bearbeitet werden.",
1064
+ "sales.documents.items.shippedLineLocked": "Die Preisangaben dieser Position sind gesperrt, da bereits Artikel versandt wurden. Name und Menge können weiterhin bearbeitet werden.",
1062
1065
  "sales.documents.items.status": "Status",
1063
1066
  "sales.documents.items.statusEmpty": "Kein Status",
1064
1067
  "sales.documents.items.statusLoading": "Status werden geladen…",
@@ -1093,6 +1096,8 @@
1093
1096
  "sales.documents.items.variantSearch": "Variante suchen",
1094
1097
  "sales.documents.list.errors.load": "Dokumente konnten nicht geladen werden.",
1095
1098
  "sales.documents.list.filters.channel": "Kanal",
1099
+ "sales.documents.list.filters.channelPlaceholder": "Kanäle suchen",
1100
+ "sales.documents.list.filters.channelUnassigned": "(Kein Kanal)",
1096
1101
  "sales.documents.list.filters.customer": "Kunden-ID",
1097
1102
  "sales.documents.list.filters.customerPlaceholder": "Kunden-ID",
1098
1103
  "sales.documents.list.filters.date": "Datum",
@@ -1321,13 +1326,16 @@
1321
1326
  "sales.quotes.email.subject": "Angebot {quoteNumber}",
1322
1327
  "sales.quotes.email.total": "Gesamt: {amount} {currency}",
1323
1328
  "sales.quotes.email.validUntil": "Gültig bis: {date}",
1329
+ "sales.quotes.exchange_rate_unsupported": "Der Wechselkurs ist für Angebote nicht verfügbar.",
1324
1330
  "sales.quotes.form.general": "Allgemein",
1325
1331
  "sales.quotes.form.lines": "Positionen",
1326
1332
  "sales.quotes.form.notes": "Notizen",
1333
+ "sales.quotes.fulfillment_status_unsupported": "Der Fulfillment-Status ist für Angebote nicht verfügbar.",
1327
1334
  "sales.quotes.internal_notes_unsupported": "Interne Notizen sind für Angebote nicht verfügbar.",
1328
1335
  "sales.quotes.lines.delete": "Angebotsposition löschen",
1329
1336
  "sales.quotes.lines.upsert": "Angebotsposition aktualisieren",
1330
1337
  "sales.quotes.list.title": "Angebote",
1338
+ "sales.quotes.payment_status_unsupported": "Der Zahlungsstatus ist für Angebote nicht verfügbar.",
1331
1339
  "sales.quotes.public.acceptButton": "Angebot annehmen",
1332
1340
  "sales.quotes.public.acceptFailed": "Angebot konnte nicht angenommen werden.",
1333
1341
  "sales.quotes.public.acceptedMessage": "Auftrag erstellt: {{orderNumber}}",
@@ -1016,6 +1016,7 @@
1016
1016
  "sales.documents.items.errorProductRequired": "Select a product to continue.",
1017
1017
  "sales.documents.items.errorQuantity": "Quantity must be greater than 0.",
1018
1018
  "sales.documents.items.errorQuantityBelowShipped": "You cannot lower the quantity below the {{shipped}} already shipped.",
1019
+ "sales.documents.items.errorQuantityShipmentsUnknown": "The quantity cannot be lowered until this order's shipments have been read. Reopen the order to try again.",
1019
1020
  "sales.documents.items.errorSave": "Failed to save line.",
1020
1021
  "sales.documents.items.errorScope": "Organization and tenant are required.",
1021
1022
  "sales.documents.items.errorUnitPrice": "Unit price must be greater than 0.",
@@ -1059,6 +1060,8 @@
1059
1060
  "sales.documents.items.save": "Save changes",
1060
1061
  "sales.documents.items.selectedProduct": "Selected {{id}}",
1061
1062
  "sales.documents.items.selectedVariant": "Selected {{id}}",
1063
+ "sales.documents.items.shippedLineLockPending": "Pricing is locked until this order's shipments have been read. Reopen the order to try again — you can still edit the name and raise the quantity.",
1064
+ "sales.documents.items.shippedLineLocked": "Pricing is locked on this line because it already has shipped items. You can still edit the name and quantity.",
1062
1065
  "sales.documents.items.status": "Status",
1063
1066
  "sales.documents.items.statusEmpty": "No status",
1064
1067
  "sales.documents.items.statusLoading": "Loading statuses…",
@@ -1093,6 +1096,8 @@
1093
1096
  "sales.documents.items.variantSearch": "Search variant",
1094
1097
  "sales.documents.list.errors.load": "Failed to load documents.",
1095
1098
  "sales.documents.list.filters.channel": "Channel",
1099
+ "sales.documents.list.filters.channelPlaceholder": "Search channels",
1100
+ "sales.documents.list.filters.channelUnassigned": "(No channel)",
1096
1101
  "sales.documents.list.filters.customer": "Customer id",
1097
1102
  "sales.documents.list.filters.customerPlaceholder": "Customer id",
1098
1103
  "sales.documents.list.filters.date": "Date",
@@ -1321,13 +1326,16 @@
1321
1326
  "sales.quotes.email.subject": "Quote {quoteNumber}",
1322
1327
  "sales.quotes.email.total": "Total: {amount} {currency}",
1323
1328
  "sales.quotes.email.validUntil": "Valid until: {date}",
1329
+ "sales.quotes.exchange_rate_unsupported": "Exchange rate is not available on quotes.",
1324
1330
  "sales.quotes.form.general": "General",
1325
1331
  "sales.quotes.form.lines": "Line Items",
1326
1332
  "sales.quotes.form.notes": "Notes",
1333
+ "sales.quotes.fulfillment_status_unsupported": "Fulfillment status is not available on quotes.",
1327
1334
  "sales.quotes.internal_notes_unsupported": "Internal notes are not available on quotes.",
1328
1335
  "sales.quotes.lines.delete": "Delete quote line",
1329
1336
  "sales.quotes.lines.upsert": "Update quote line",
1330
1337
  "sales.quotes.list.title": "Quotes",
1338
+ "sales.quotes.payment_status_unsupported": "Payment status is not available on quotes.",
1331
1339
  "sales.quotes.public.acceptButton": "Accept quote",
1332
1340
  "sales.quotes.public.acceptFailed": "Failed to accept quote.",
1333
1341
  "sales.quotes.public.acceptedMessage": "Order created: {{orderNumber}}",