@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
@@ -23,7 +23,7 @@ import type { SectionAction } from '@open-mercato/core/modules/customers/compone
23
23
  import type { SalesAdjustmentKind } from '../../data/entities'
24
24
  import { PriceWithCurrency } from '../PriceWithCurrency'
25
25
  import { AdjustmentDialog, type AdjustmentRowData, type AdjustmentSubmitPayload } from './AdjustmentDialog'
26
- import { useT } from '@open-mercato/shared/lib/i18n/context'
26
+ import { useT, useLocale } from '@open-mercato/shared/lib/i18n/context'
27
27
  import { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
28
28
  import { extractCustomFieldValues } from './customFieldHelpers'
29
29
  import { createLogger } from '@open-mercato/shared/lib/logger'
@@ -60,9 +60,9 @@ function normalizeNumber(value: unknown, fallback = 0): number {
60
60
  return fallback
61
61
  }
62
62
 
63
- function formatPercent(value: number | null | undefined): string {
63
+ export function formatPercent(value: number | null | undefined, locale?: string): string {
64
64
  if (value === null || value === undefined) return '—'
65
- const formatter = new Intl.NumberFormat(undefined, { style: 'percent', maximumFractionDigits: 2 })
65
+ const formatter = new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 2 })
66
66
  return formatter.format(value / 100)
67
67
  }
68
68
 
@@ -77,6 +77,7 @@ export function SalesDocumentAdjustmentsSection({
77
77
  onRowsChange,
78
78
  }: SalesDocumentAdjustmentsSectionProps) {
79
79
  const t = useT()
80
+ const locale = useLocale()
80
81
  const { organizationId, tenantId } = useOrganizationScopeDetail()
81
82
  const resolvedOrganizationId = orgFromProps ?? organizationId ?? null
82
83
  const resolvedTenantId = tenantFromProps ?? tenantId ?? null
@@ -433,7 +434,7 @@ export function SalesDocumentAdjustmentsSection({
433
434
  {
434
435
  id: 'rate',
435
436
  header: t('sales.documents.adjustments.rate', 'Rate'),
436
- cell: ({ row }) => <span className="font-mono text-sm text-muted-foreground">{formatPercent(row.original.rate)}</span>,
437
+ cell: ({ row }) => <span className="font-mono text-sm text-muted-foreground">{formatPercent(row.original.rate, locale)}</span>,
437
438
  },
438
439
  {
439
440
  id: 'position',
@@ -441,7 +442,7 @@ export function SalesDocumentAdjustmentsSection({
441
442
  cell: ({ row }) => <span className="text-sm text-muted-foreground">{row.original.position}</span>,
442
443
  },
443
444
  ],
444
- [currencyCode, resolveKindLabel, t]
445
+ [currencyCode, locale, resolveKindLabel, t]
445
446
  )
446
447
 
447
448
  const showLoadingState = loading && rows.length === 0
@@ -16,7 +16,7 @@ import {
16
16
  createDictionaryMap,
17
17
  normalizeDictionaryEntries,
18
18
  } from "@open-mercato/core/modules/dictionaries/components/dictionaryAppearance";
19
- import { useT } from "@open-mercato/shared/lib/i18n/context";
19
+ import { useT, useLocale } from "@open-mercato/shared/lib/i18n/context";
20
20
  import { useOrganizationScopeDetail } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
21
21
  import { useConfirmDialog } from "@open-mercato/ui/backend/confirm-dialog";
22
22
  import { emitSalesDocumentTotalsRefresh } from "@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents";
@@ -131,6 +131,11 @@ function resolveInjectedColumnValue(
131
131
  return current;
132
132
  }
133
133
 
134
+ const SHIPMENTS_PAGE_SIZE = 100;
135
+ // A single order beyond this many shipment pages is pathological; stopping there
136
+ // keeps the shipped state explicitly unresolved rather than silently partial.
137
+ const SHIPMENTS_MAX_PAGES = 50;
138
+
134
139
  type SalesDocumentItemsSectionProps = {
135
140
  documentId: string;
136
141
  kind: "order" | "quote";
@@ -153,6 +158,7 @@ export function SalesDocumentItemsSection({
153
158
  onItemsChange,
154
159
  }: SalesDocumentItemsSectionProps) {
155
160
  const t = useT();
161
+ const locale = useLocale();
156
162
  const { organizationId, tenantId } = useOrganizationScopeDetail();
157
163
  const { confirm, ConfirmDialogElement } = useConfirmDialog();
158
164
  const resolvedOrganizationId = orgFromProps ?? organizationId ?? null;
@@ -168,6 +174,12 @@ export function SalesDocumentItemsSection({
168
174
  const [shippedTotals, setShippedTotals] = React.useState<Map<string, number>>(
169
175
  new Map(),
170
176
  );
177
+ // Quotes have no shipments at all, so their shipped state is known up front.
178
+ // For orders it stays unknown until every shipment page has been read — an
179
+ // empty map from a pending or failed load must never read as "nothing shipped".
180
+ const [shippedTotalsResolved, setShippedTotalsResolved] = React.useState(
181
+ kind !== "order",
182
+ );
171
183
 
172
184
  const { widgets: allColumnWidgets } = useInjectionDataWidgets(
173
185
  extensionPoints.hosts.orderItemColumns.spotId,
@@ -379,22 +391,31 @@ export function SalesDocumentItemsSection({
379
391
  const loadShippedTotals = React.useCallback(async () => {
380
392
  if (kind !== "order") {
381
393
  setShippedTotals(new Map());
394
+ setShippedTotalsResolved(true);
382
395
  return;
383
396
  }
397
+ setShippedTotals(new Map());
398
+ setShippedTotalsResolved(false);
384
399
  try {
385
- const params = new URLSearchParams({
386
- page: "1",
387
- pageSize: "100",
388
- orderId: documentId,
389
- });
390
- const response = await apiCall<{
391
- items?: Array<Record<string, unknown>>;
392
- }>(`/api/sales/shipments?${params.toString()}`, undefined, {
393
- fallback: { items: [] },
394
- });
395
- if (response.ok && Array.isArray(response.result?.items)) {
396
- const totals = new Map<string, number>();
397
- response.result.items.forEach((shipment) => {
400
+ const totals = new Map<string, number>();
401
+ let page = 1;
402
+ let collected = 0;
403
+ let complete = false;
404
+ while (page <= SHIPMENTS_MAX_PAGES) {
405
+ const params = new URLSearchParams({
406
+ page: String(page),
407
+ pageSize: String(SHIPMENTS_PAGE_SIZE),
408
+ orderId: documentId,
409
+ });
410
+ const response = await apiCall<{
411
+ items?: Array<Record<string, unknown>>;
412
+ total?: unknown;
413
+ }>(`/api/sales/shipments?${params.toString()}`, undefined, {
414
+ fallback: { items: [] },
415
+ });
416
+ if (!response.ok || !Array.isArray(response.result?.items)) return;
417
+ const shipments = response.result.items;
418
+ shipments.forEach((shipment) => {
398
419
  const entries = Array.isArray(shipment.items)
399
420
  ? (shipment.items as Array<Record<string, unknown>>)
400
421
  : [];
@@ -412,13 +433,22 @@ export function SalesDocumentItemsSection({
412
433
  totals.set(lineId, current + quantity);
413
434
  });
414
435
  });
415
- setShippedTotals(totals);
416
- } else {
417
- setShippedTotals(new Map());
436
+ collected += shipments.length;
437
+ const reportedTotal = normalizeNumber(response.result?.total, Number.NaN);
438
+ const hasMore =
439
+ shipments.length >= SHIPMENTS_PAGE_SIZE &&
440
+ (!Number.isFinite(reportedTotal) || collected < reportedTotal);
441
+ if (!hasMore) {
442
+ complete = true;
443
+ break;
444
+ }
445
+ page += 1;
418
446
  }
447
+ if (!complete) return;
448
+ setShippedTotals(totals);
449
+ setShippedTotalsResolved(true);
419
450
  } catch (err) {
420
451
  logger.error('sales.document.shipments.load', { err });
421
- setShippedTotals(new Map());
422
452
  }
423
453
  }, [documentId, kind]);
424
454
 
@@ -439,6 +469,7 @@ export function SalesDocumentItemsSection({
439
469
  if (kind !== "order") {
440
470
  shipmentsLoadedForDocument.current = null;
441
471
  setShippedTotals(new Map());
472
+ setShippedTotalsResolved(true);
442
473
  return;
443
474
  }
444
475
  const key = `${kind}:${documentId}`;
@@ -797,6 +828,7 @@ export function SalesDocumentItemsSection({
797
828
  {formatMoney(
798
829
  item.unitPriceGross,
799
830
  item.currencyCode ?? currencyCode ?? undefined,
831
+ locale,
800
832
  )}{" "}
801
833
  <span className="text-xs text-muted-foreground">
802
834
  {t("sales.documents.items.table.gross", "gross")}
@@ -806,6 +838,7 @@ export function SalesDocumentItemsSection({
806
838
  {formatMoney(
807
839
  item.unitPriceNet,
808
840
  item.currencyCode ?? currencyCode ?? undefined,
841
+ locale,
809
842
  )}{" "}
810
843
  {t("sales.documents.items.table.net", "net")}
811
844
  </span>
@@ -820,6 +853,7 @@ export function SalesDocumentItemsSection({
820
853
  item.currencyCode ??
821
854
  currencyCode ??
822
855
  undefined,
856
+ locale,
823
857
  ),
824
858
  unit: unitPriceReference.referenceUnitCode,
825
859
  },
@@ -843,6 +877,7 @@ export function SalesDocumentItemsSection({
843
877
  item.currencyCode ??
844
878
  currencyCode ??
845
879
  undefined,
880
+ locale,
846
881
  ),
847
882
  },
848
883
  )}
@@ -873,6 +908,7 @@ export function SalesDocumentItemsSection({
873
908
  {formatMoney(
874
909
  item.totalGross,
875
910
  item.currencyCode ?? currencyCode ?? undefined,
911
+ locale,
876
912
  )}{" "}
877
913
  <span className="text-xs font-normal text-muted-foreground">
878
914
  {t("sales.documents.items.table.gross", "gross")}
@@ -882,6 +918,7 @@ export function SalesDocumentItemsSection({
882
918
  {formatMoney(
883
919
  item.totalNet,
884
920
  item.currencyCode ?? currencyCode ?? undefined,
921
+ locale,
885
922
  )}{" "}
886
923
  {t("sales.documents.items.table.net", "net")}
887
924
  </span>
@@ -964,6 +1001,7 @@ export function SalesDocumentItemsSection({
964
1001
  ? Math.max(0, shippedTotals.get(lineForEdit.id) ?? 0)
965
1002
  : 0
966
1003
  }
1004
+ shippedQuantityResolved={shippedTotalsResolved}
967
1005
  onSaved={async () => {
968
1006
  await loadItems();
969
1007
  emitSalesDocumentTotalsRefresh({ documentId, kind });
@@ -46,10 +46,11 @@ import {
46
46
  renderDictionaryColor,
47
47
  } from "@open-mercato/core/modules/dictionaries/components/dictionaryAppearance";
48
48
  import { E } from "#generated/entities.ids.generated";
49
- import { useT } from "@open-mercato/shared/lib/i18n/context";
49
+ import { useT, useLocale } from "@open-mercato/shared/lib/i18n/context";
50
50
  import { useOrganizationScopeDetail } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
51
51
  import { formatMoney, normalizeNumber } from "./lineItemUtils";
52
52
  import type { SalesLineRecord } from "./lineItemTypes";
53
+ import { prepareShippedLineUpdatePayload } from "./lineItemShipmentLock";
53
54
  import {
54
55
  normalizeCustomFieldSubmitValue,
55
56
  extractCustomFieldValues,
@@ -279,6 +280,13 @@ type SalesLineDialogProps = {
279
280
  tenantId: string | null;
280
281
  initialLine?: SalesLineRecord | null;
281
282
  shippedQuantity?: number;
283
+ /**
284
+ * Whether `shippedQuantity` reflects a fully resolved shipment state. Defaults
285
+ * to `true` so callers that genuinely know the value keep working; pass `false`
286
+ * while the host is still loading shipments or after the load failed, and the
287
+ * dialog locks pricing instead of assuming the line is unshipped.
288
+ */
289
+ shippedQuantityResolved?: boolean;
282
290
  onOpenChange: (open: boolean) => void;
283
291
  onSaved?: () => Promise<void> | void;
284
292
  onDraftSaved?: (payload: Record<string, unknown>, lineId: string | null) => Promise<void> | void;
@@ -475,11 +483,13 @@ export function LineItemDialog({
475
483
  tenantId,
476
484
  initialLine,
477
485
  shippedQuantity = 0,
486
+ shippedQuantityResolved = true,
478
487
  onOpenChange,
479
488
  onSaved,
480
489
  onDraftSaved,
481
490
  }: SalesLineDialogProps) {
482
491
  const t = useT();
492
+ const locale = useLocale();
483
493
  const scope = useOrganizationScopeDetail();
484
494
  const resolvedOrganizationId = organizationId ?? scope.organizationId ?? null;
485
495
  const resolvedTenantId = tenantId ?? scope.tenantId ?? null;
@@ -513,6 +523,23 @@ export function LineItemDialog({
513
523
  () => (kind === "order" ? "sales/order-lines" : "sales/quote-lines"),
514
524
  [kind],
515
525
  );
526
+ // A line the caller has not resolved shipment state for is treated as shipped:
527
+ // the server rejects pricing changes on shipped lines, so guessing "unshipped"
528
+ // from a pending or failed shipments load hands the user an edit that cannot
529
+ // be saved. A brand-new line has no shipments by construction.
530
+ const hasExistingLine = Boolean(initialLine);
531
+ const shipmentStateUnknown = kind === "order" && hasExistingLine && !shippedQuantityResolved;
532
+ const isShippedOrderLine =
533
+ kind === "order" &&
534
+ hasExistingLine &&
535
+ (shipmentStateUnknown || shippedQuantity > 0);
536
+ // While the shipments read is unresolved the shipped quantity is unknown, so the
537
+ // only safe floor for a quantity edit is the quantity already stored on the line:
538
+ // whatever turns out to be shipped can never exceed it. Raising stays allowed,
539
+ // exactly as it is once the state resolves.
540
+ const storedQuantity = Number(initialLine?.quantity ?? 0);
541
+ const safeStoredQuantity = Number.isFinite(storedQuantity) ? storedQuantity : 0;
542
+ const quantityFloor = shipmentStateUnknown ? safeStoredQuantity : shippedQuantity;
516
543
  const documentKey = kind === "order" ? "orderId" : "quoteId";
517
544
  const customFieldEntityId =
518
545
  kind === "order" ? E.sales.sales_order_line : E.sales.sales_quote_line;
@@ -1018,10 +1045,10 @@ export function LineItemDialog({
1018
1045
  displayMode === "including-tax" &&
1019
1046
  amountGross !== null &&
1020
1047
  currency
1021
- ? formatMoney(amountGross, currency)
1048
+ ? formatMoney(amountGross, currency, locale)
1022
1049
  : null,
1023
1050
  displayMode === "excluding-tax" && amountNet !== null && currency
1024
- ? formatMoney(amountNet, currency)
1051
+ ? formatMoney(amountNet, currency, locale)
1025
1052
  : null,
1026
1053
  displayMode
1027
1054
  ? displayMode === "including-tax"
@@ -1037,9 +1064,9 @@ export function LineItemDialog({
1037
1064
  labelParts.length > 0
1038
1065
  ? labelParts.join(" • ")
1039
1066
  : amountGross !== null && currency
1040
- ? formatMoney(amountGross, currency)
1067
+ ? formatMoney(amountGross, currency, locale)
1041
1068
  : amountNet !== null && currency
1042
- ? formatMoney(amountNet, currency)
1069
+ ? formatMoney(amountNet, currency, locale)
1043
1070
  : id;
1044
1071
  return {
1045
1072
  id,
@@ -1330,12 +1357,17 @@ export function LineItemDialog({
1330
1357
  },
1331
1358
  );
1332
1359
  }
1333
- if (shippedQuantity > 0 && qtyNumber < shippedQuantity) {
1334
- const message = t(
1335
- "sales.documents.items.errorQuantityBelowShipped",
1336
- "You cannot lower the quantity below the {{shipped}} already shipped.",
1337
- { shipped: shippedQuantity },
1338
- );
1360
+ if (quantityFloor > 0 && qtyNumber < quantityFloor) {
1361
+ const message = shipmentStateUnknown
1362
+ ? t(
1363
+ "sales.documents.items.errorQuantityShipmentsUnknown",
1364
+ "The quantity cannot be lowered until this order's shipments have been read. Reopen the order to try again.",
1365
+ )
1366
+ : t(
1367
+ "sales.documents.items.errorQuantityBelowShipped",
1368
+ "You cannot lower the quantity below the {{shipped}} already shipped.",
1369
+ { shipped: shippedQuantity },
1370
+ );
1339
1371
  throw createCrudFormError(message, { quantity: message });
1340
1372
  }
1341
1373
  const resolvedQuantityUnit = (() => {
@@ -1509,9 +1541,20 @@ export function LineItemDialog({
1509
1541
  }
1510
1542
  if (resolvedName) payload.name = resolvedName;
1511
1543
 
1544
+ const submittedPayload = prepareShippedLineUpdatePayload(
1545
+ payload,
1546
+ isShippedOrderLine && initialLine
1547
+ ? {
1548
+ quantity: initialLine.quantity,
1549
+ totalNetAmount: initialLine.totalNet,
1550
+ totalGrossAmount: initialLine.totalGross,
1551
+ }
1552
+ : null,
1553
+ );
1554
+
1512
1555
  try {
1513
1556
  if (onDraftSaved) {
1514
- await onDraftSaved(payload, editingId);
1557
+ await onDraftSaved(submittedPayload, editingId);
1515
1558
  closeDialog();
1516
1559
  return;
1517
1560
  }
@@ -1521,7 +1564,9 @@ export function LineItemDialog({
1521
1564
  () =>
1522
1565
  action(
1523
1566
  resourcePath,
1524
- editingId ? { id: editingId, ...payload } : payload,
1567
+ editingId
1568
+ ? { id: editingId, ...submittedPayload }
1569
+ : submittedPayload,
1525
1570
  {
1526
1571
  errorMessage: t(
1527
1572
  "sales.documents.items.errorSave",
@@ -1552,10 +1597,15 @@ export function LineItemDialog({
1552
1597
  documentKey,
1553
1598
  documentUpdatedAt,
1554
1599
  editingId,
1600
+ initialLine,
1601
+ isShippedOrderLine,
1555
1602
  onDraftSaved,
1556
1603
  priceOptions,
1557
1604
  productOption,
1605
+ quantityFloor,
1558
1606
  resourcePath,
1607
+ shipmentStateUnknown,
1608
+ shippedQuantity,
1559
1609
  t,
1560
1610
  variantOption,
1561
1611
  onSaved,
@@ -1613,6 +1663,7 @@ export function LineItemDialog({
1613
1663
  type="button"
1614
1664
  size="sm"
1615
1665
  variant={mode === "catalog" ? "default" : "ghost"}
1666
+ disabled={isShippedOrderLine}
1616
1667
  onClick={() => switchMode("catalog")}
1617
1668
  >
1618
1669
  {t("sales.documents.items.lineMode.catalog", "Catalog item")}
@@ -1621,6 +1672,7 @@ export function LineItemDialog({
1621
1672
  type="button"
1622
1673
  size="sm"
1623
1674
  variant={mode === "custom" ? "default" : "ghost"}
1675
+ disabled={isShippedOrderLine}
1624
1676
  onClick={() => switchMode("custom")}
1625
1677
  >
1626
1678
  {t("sales.documents.items.lineMode.custom", "Custom line")}
@@ -1801,6 +1853,7 @@ export function LineItemDialog({
1801
1853
  },
1802
1854
  )
1803
1855
  }
1856
+ disabled={isShippedOrderLine}
1804
1857
  />
1805
1858
  ),
1806
1859
  } satisfies CrudField,
@@ -1960,7 +2013,7 @@ export function LineItemDialog({
1960
2013
  },
1961
2014
  )
1962
2015
  }
1963
- disabled={!productId}
2016
+ disabled={isShippedOrderLine || !productId}
1964
2017
  />
1965
2018
  );
1966
2019
  },
@@ -1984,6 +2037,51 @@ export function LineItemDialog({
1984
2037
  typeof values?.variantId === "string"
1985
2038
  ? values.variantId
1986
2039
  : null;
2040
+ const selectedPriceId =
2041
+ typeof value === "string" ? value : null;
2042
+ const selectedPrice = selectedPriceId
2043
+ ? (priceOptions.find(
2044
+ (entry) => entry.id === selectedPriceId,
2045
+ ) ?? null)
2046
+ : null;
2047
+ if (isShippedOrderLine) {
2048
+ const lockedAmount = normalizeNumber(
2049
+ values?.unitPrice,
2050
+ Number.NaN,
2051
+ );
2052
+ const lockedCurrency =
2053
+ selectedPrice?.currencyCode ??
2054
+ (typeof values?.currencyCode === "string"
2055
+ ? values.currencyCode
2056
+ : currencyCode) ??
2057
+ undefined;
2058
+ const lockedModeLabel =
2059
+ values?.priceMode === "net"
2060
+ ? t("sales.documents.items.priceNet", "Net")
2061
+ : t("sales.documents.items.priceGross", "Gross");
2062
+ const lockedAmountLabel = Number.isFinite(lockedAmount)
2063
+ ? `${formatMoney(lockedAmount, lockedCurrency, locale)} — ${lockedModeLabel}`
2064
+ : lockedModeLabel;
2065
+ const lockedPriceDetail =
2066
+ selectedPrice?.priceKindTitle ??
2067
+ selectedPrice?.priceKindCode ??
2068
+ null;
2069
+ return (
2070
+ <div className="space-y-2">
2071
+ <Input
2072
+ readOnly
2073
+ disabled
2074
+ value={lockedAmountLabel}
2075
+ aria-label={t("sales.documents.items.price", "Price")}
2076
+ />
2077
+ {lockedPriceDetail ? (
2078
+ <p className="text-xs text-muted-foreground">
2079
+ {lockedPriceDetail}
2080
+ </p>
2081
+ ) : null}
2082
+ </div>
2083
+ );
2084
+ }
1987
2085
  return (
1988
2086
  <LookupSelect
1989
2087
  key={
@@ -1991,7 +2089,7 @@ export function LineItemDialog({
1991
2089
  ? `${productId}-${variantId ?? "no-variant"}`
1992
2090
  : "price"
1993
2091
  }
1994
- value={typeof value === "string" ? value : null}
2092
+ value={selectedPriceId}
1995
2093
  onChange={(next) => {
1996
2094
  setValue(next ?? null);
1997
2095
  const selected = next
@@ -2133,9 +2231,11 @@ export function LineItemDialog({
2133
2231
  }
2134
2232
  onChange={(event) => setValue(event.target.value)}
2135
2233
  placeholder="0.00"
2234
+ disabled={isShippedOrderLine}
2136
2235
  />
2137
2236
  <Select
2138
2237
  value={mode}
2238
+ disabled={isShippedOrderLine}
2139
2239
  onValueChange={(value) => {
2140
2240
  const nextMode = value === "net" ? "net" : "gross";
2141
2241
  setFormValue?.("priceMode", nextMode);
@@ -2161,11 +2261,11 @@ export function LineItemDialog({
2161
2261
  "sales.documents.items.priceBasisTemplate",
2162
2262
  "Catalog price basis: {{baseAmount}} / {{baseUnit}}. Converted for {{unit}}: {{baseAmount}} × {{factor}} = {{convertedAmount}}.",
2163
2263
  {
2164
- baseAmount: formatMoney(selectedBaseAmount as number, selectedCurrency),
2264
+ baseAmount: formatMoney(selectedBaseAmount as number, selectedCurrency, locale),
2165
2265
  baseUnit: baseUnitCode,
2166
2266
  unit: quantityUnitCode,
2167
2267
  factor: unitFactor,
2168
- convertedAmount: formatMoney(convertedAmount, selectedCurrency),
2268
+ convertedAmount: formatMoney(convertedAmount, selectedCurrency, locale),
2169
2269
  },
2170
2270
  )}
2171
2271
  </p>
@@ -2222,7 +2322,7 @@ export function LineItemDialog({
2222
2322
  <Select
2223
2323
  value={resolvedValue || undefined}
2224
2324
  onValueChange={(value) => handleChange({ target: { value } } as React.ChangeEvent<HTMLSelectElement>)}
2225
- disabled={!taxRates.length}
2325
+ disabled={isShippedOrderLine || !taxRates.length}
2226
2326
  >
2227
2327
  <SelectTrigger>
2228
2328
  <SelectValue
@@ -2292,6 +2392,7 @@ export function LineItemDialog({
2292
2392
  <Input
2293
2393
  value={typeof value === "string" ? value : ""}
2294
2394
  onChange={(event) => setValue(event.target.value || null)}
2395
+ disabled={isShippedOrderLine}
2295
2396
  placeholder={t(
2296
2397
  "sales.documents.items.quantityUnitPlaceholder",
2297
2398
  "e.g. pc",
@@ -2349,7 +2450,7 @@ export function LineItemDialog({
2349
2450
  });
2350
2451
  }
2351
2452
  }}
2352
- disabled={!productId}
2453
+ disabled={isShippedOrderLine || !productId}
2353
2454
  >
2354
2455
  <SelectTrigger>
2355
2456
  <SelectValue
@@ -2394,7 +2495,7 @@ export function LineItemDialog({
2394
2495
  typeof values?.quantityUnit === "string"
2395
2496
  ? values.quantityUnit
2396
2497
  : null;
2397
- if (productId) {
2498
+ if (productId && !isShippedOrderLine) {
2398
2499
  const selectedPriceId =
2399
2500
  typeof values?.priceId === "string" ? values.priceId : null;
2400
2501
  const selectedPriceKindId =
@@ -2549,6 +2650,7 @@ export function LineItemDialog({
2549
2650
  resolveTaxSelection,
2550
2651
  selectPriceAfterRefresh,
2551
2652
  hasTaxMetadata,
2653
+ isShippedOrderLine,
2552
2654
  ]);
2553
2655
 
2554
2656
  const groups = React.useMemo<CrudFormGroup[]>(() => {
@@ -2914,6 +3016,21 @@ export function LineItemDialog({
2914
3016
  : t("sales.documents.items.addTitle", "Add line")}
2915
3017
  </DialogTitle>
2916
3018
  </DialogHeader>
3019
+ {isShippedOrderLine ? (
3020
+ <Alert status="information" style="lighter">
3021
+ <AlertDescription>
3022
+ {shipmentStateUnknown
3023
+ ? t(
3024
+ "sales.documents.items.shippedLineLockPending",
3025
+ "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.",
3026
+ )
3027
+ : t(
3028
+ "sales.documents.items.shippedLineLocked",
3029
+ "Pricing is locked on this line because it already has shipped items. You can still edit the name and quantity.",
3030
+ )}
3031
+ </AlertDescription>
3032
+ </Alert>
3033
+ ) : null}
2917
3034
  <CrudForm<LineFormState>
2918
3035
  key={formResetKey}
2919
3036
  embedded
@@ -13,8 +13,9 @@ import { RowActions } from '@open-mercato/ui/backend/RowActions'
13
13
  import { Button } from '@open-mercato/ui/primitives/button'
14
14
  import { flash } from '@open-mercato/ui/backend/FlashMessages'
15
15
  import { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
16
- import { useT } from '@open-mercato/shared/lib/i18n/context'
16
+ import { useT, useLocale } from '@open-mercato/shared/lib/i18n/context'
17
17
  import { emitSalesDocumentTotalsRefresh } from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'
18
+ import { extensionPoints } from '@open-mercato/core/modules/sales/extension-points'
18
19
  import { PaymentDialog, type PaymentFormData, type PaymentTotals } from './PaymentDialog'
19
20
  import { extractCustomFieldValues } from './customFieldHelpers'
20
21
  import { Plus } from 'lucide-react'
@@ -59,10 +60,10 @@ function normalizeNumber(value: unknown): number {
59
60
  return 0
60
61
  }
61
62
 
62
- function formatMoney(value: number, currency: string | null | undefined): string {
63
+ function formatMoney(value: number, currency: string | null | undefined, locale?: string): string {
63
64
  if (!currency || currency.trim().length !== 3) return value.toFixed(2)
64
65
  try {
65
- return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(value)
66
+ return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)
66
67
  } catch {
67
68
  return `${currency.toUpperCase()} ${value.toFixed(2)}`
68
69
  }
@@ -79,6 +80,7 @@ export function SalesDocumentPaymentsSection({
79
80
  onPaymentsChange,
80
81
  }: SalesDocumentPaymentsSectionProps) {
81
82
  const t = useT()
83
+ const locale = useLocale()
82
84
  const { organizationId, tenantId } = useOrganizationScopeDetail()
83
85
  const resolvedOrganizationId = orgFromProps ?? organizationId ?? null
84
86
  const resolvedTenantId = tenantFromProps ?? tenantId ?? null
@@ -275,6 +277,10 @@ export function SalesDocumentPaymentsSection({
275
277
  cell: ({ row }) => row.original.paymentMethodName ?? '—',
276
278
  },
277
279
  {
280
+ // Injected columns are placed against `ColumnDef.id` before the table is
281
+ // built, so an accessor-derived id is not yet available: the gateway
282
+ // status widget anchors on this explicit id.
283
+ id: 'status',
278
284
  accessorKey: 'status',
279
285
  header: t('sales.documents.payments.status', 'Status'),
280
286
  cell: ({ row }) => row.original.statusLabel ?? row.original.status ?? '—',
@@ -282,24 +288,24 @@ export function SalesDocumentPaymentsSection({
282
288
  {
283
289
  accessorKey: 'amount',
284
290
  header: t('sales.documents.payments.amount', 'Amount'),
285
- cell: ({ row }) => formatMoney(row.original.amount, row.original.currencyCode ?? currencyCode),
291
+ cell: ({ row }) => formatMoney(row.original.amount, row.original.currencyCode ?? currencyCode, locale),
286
292
  },
287
293
  {
288
294
  accessorKey: 'receivedAt',
289
295
  header: t('sales.documents.payments.receivedAt', 'Received'),
290
296
  cell: ({ row }) =>
291
297
  row.original.receivedAt
292
- ? new Date(row.original.receivedAt).toLocaleDateString()
298
+ ? new Date(row.original.receivedAt).toLocaleDateString(locale)
293
299
  : '—',
294
300
  },
295
301
  {
296
302
  accessorKey: 'createdAt',
297
303
  header: t('sales.documents.payments.createdAt', 'Created'),
298
304
  cell: ({ row }) =>
299
- row.original.createdAt ? new Date(row.original.createdAt).toLocaleString() : '—',
305
+ row.original.createdAt ? new Date(row.original.createdAt).toLocaleString(locale) : '—',
300
306
  meta: {
301
307
  tooltipContent: (row: PaymentRow) =>
302
- row.createdAt ? new Date(row.createdAt).toLocaleString() : undefined,
308
+ row.createdAt ? new Date(row.createdAt).toLocaleString(locale) : undefined,
303
309
  },
304
310
  },
305
311
  {
@@ -322,7 +328,7 @@ export function SalesDocumentPaymentsSection({
322
328
  },
323
329
  },
324
330
  ],
325
- [currencyCode, deleteActionLabel, editActionLabel, handleDelete, openEditPayment, t]
331
+ [currencyCode, deleteActionLabel, editActionLabel, handleDelete, locale, openEditPayment, t]
326
332
  )
327
333
 
328
334
  if (loading) {
@@ -350,7 +356,12 @@ export function SalesDocumentPaymentsSection({
350
356
  return (
351
357
  <div className="space-y-4">
352
358
  {payments.length ? (
353
- <DataTable<PaymentRow> columns={columns} data={payments} onRowClick={openEditPayment} />
359
+ <DataTable<PaymentRow>
360
+ columns={columns}
361
+ data={payments}
362
+ onRowClick={openEditPayment}
363
+ extensionTableId={extensionPoints.hosts.paymentsTable.tableId}
364
+ />
354
365
  ) : (
355
366
  <TabEmptyState
356
367
  title={t('sales.documents.payments.emptyTitle', 'No payments yet.')}