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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (847) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/helpers/integration/api.js +13 -1
  3. package/dist/helpers/integration/api.js.map +2 -2
  4. package/dist/helpers/integration/communicationChannelsFixtures.js +19 -0
  5. package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
  6. package/dist/modules/api_keys/api/keys/route.js +1 -1
  7. package/dist/modules/api_keys/api/keys/route.js.map +2 -2
  8. package/dist/modules/api_keys/backend/api-keys/page.js +3 -1
  9. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  10. package/dist/modules/api_keys/di.js +9 -0
  11. package/dist/modules/api_keys/di.js.map +7 -0
  12. package/dist/modules/api_keys/services/principalService.js +31 -0
  13. package/dist/modules/api_keys/services/principalService.js.map +7 -0
  14. package/dist/modules/attachments/api/route.js +2 -2
  15. package/dist/modules/attachments/api/route.js.map +2 -2
  16. package/dist/modules/attachments/components/AttachmentLibrary.js +2 -0
  17. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  18. package/dist/modules/attachments/di.js +11 -1
  19. package/dist/modules/attachments/di.js.map +2 -2
  20. package/dist/modules/attachments/index.js.map +1 -1
  21. package/dist/modules/attachments/lib/attachment-service.js +313 -0
  22. package/dist/modules/attachments/lib/attachment-service.js.map +7 -0
  23. package/dist/modules/attachments/lib/scoped-upload-service.js +15 -2
  24. package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
  25. package/dist/modules/attachments/lib/upload-limits.js +6 -2
  26. package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
  27. package/dist/modules/audit_logs/backend/audit-logs/page.js +6 -0
  28. package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
  29. package/dist/modules/audit_logs/lib/display-helpers.js +19 -11
  30. package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
  31. package/dist/modules/audit_logs/services/actionLogService.js +57 -12
  32. package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
  33. package/dist/modules/auth/acl.js +30 -5
  34. package/dist/modules/auth/acl.js.map +2 -2
  35. package/dist/modules/auth/api/feature-check.js +8 -2
  36. package/dist/modules/auth/api/feature-check.js.map +2 -2
  37. package/dist/modules/auth/api/login.js +4 -1
  38. package/dist/modules/auth/api/login.js.map +2 -2
  39. package/dist/modules/auth/api/reset/validate.js +55 -0
  40. package/dist/modules/auth/api/reset/validate.js.map +7 -0
  41. package/dist/modules/auth/api/roles/acl/route.js +28 -33
  42. package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
  43. package/dist/modules/auth/api/session/refresh.js +25 -1
  44. package/dist/modules/auth/api/session/refresh.js.map +2 -2
  45. package/dist/modules/auth/api/users/acl/route.js +96 -51
  46. package/dist/modules/auth/api/users/acl/route.js.map +2 -2
  47. package/dist/modules/auth/api/users/route.js +13 -5
  48. package/dist/modules/auth/api/users/route.js.map +2 -2
  49. package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +5 -1
  50. package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
  51. package/dist/modules/auth/backend/roles/page.js +3 -1
  52. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  53. package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +5 -1
  54. package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
  55. package/dist/modules/auth/backend/users/page.js +2 -1
  56. package/dist/modules/auth/backend/users/page.js.map +2 -2
  57. package/dist/modules/auth/commands/acl.js +254 -0
  58. package/dist/modules/auth/commands/acl.js.map +7 -0
  59. package/dist/modules/auth/components/AclEditor.js +39 -30
  60. package/dist/modules/auth/components/AclEditor.js.map +2 -2
  61. package/dist/modules/auth/data/entities.js.map +2 -2
  62. package/dist/modules/auth/data/validators.js +5 -1
  63. package/dist/modules/auth/data/validators.js.map +2 -2
  64. package/dist/modules/auth/di.js +35 -9
  65. package/dist/modules/auth/di.js.map +2 -2
  66. package/dist/modules/auth/frontend/reset/[token]/page.js +46 -0
  67. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  68. package/dist/modules/auth/lib/grantChecks.js.map +2 -2
  69. package/dist/modules/auth/lib/userIdFilter.js +16 -0
  70. package/dist/modules/auth/lib/userIdFilter.js.map +7 -0
  71. package/dist/modules/auth/services/authService.js +16 -2
  72. package/dist/modules/auth/services/authService.js.map +2 -2
  73. package/dist/modules/auth/services/principalService.js +200 -0
  74. package/dist/modules/auth/services/principalService.js.map +7 -0
  75. package/dist/modules/auth/services/rbacService.js +67 -24
  76. package/dist/modules/auth/services/rbacService.js.map +3 -3
  77. package/dist/modules/auth/services/roleOrganizationScope.js +41 -0
  78. package/dist/modules/auth/services/roleOrganizationScope.js.map +7 -0
  79. package/dist/modules/business_rules/backend/logs/page.js +3 -1
  80. package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
  81. package/dist/modules/business_rules/backend/rules/page.js +3 -1
  82. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  83. package/dist/modules/business_rules/backend/sets/page.js +3 -1
  84. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  85. package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
  86. package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
  87. package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
  88. package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
  89. package/dist/modules/catalog/ai-agents.js +1 -1
  90. package/dist/modules/catalog/ai-agents.js.map +1 -1
  91. package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
  92. package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
  93. package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +5 -2
  94. package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
  95. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -0
  96. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  97. package/dist/modules/catalog/components/products/ProductsDataTable.js +7 -1
  98. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  99. package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +2 -0
  100. package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
  101. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +9 -1
  102. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
  103. package/dist/modules/communication_channels/api/post/test-seed/route.js +95 -10
  104. package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
  105. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +3 -0
  106. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
  107. package/dist/modules/communication_channels/commands/ingest-inbound-message.js +14 -1
  108. package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
  109. package/dist/modules/communication_channels/di.js +7 -1
  110. package/dist/modules/communication_channels/di.js.map +2 -2
  111. package/dist/modules/communication_channels/lib/email-capabilities.js +4 -1
  112. package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
  113. package/dist/modules/communication_channels/lib/outbound-recipient.js +33 -0
  114. package/dist/modules/communication_channels/lib/outbound-recipient.js.map +7 -0
  115. package/dist/modules/communication_channels/lib/resolve-channel-type.js +51 -0
  116. package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +7 -0
  117. package/dist/modules/communication_channels/lib/test-seed.js +41 -2
  118. package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
  119. package/dist/modules/configs/lib/system-status.js +9 -0
  120. package/dist/modules/configs/lib/system-status.js.map +2 -2
  121. package/dist/modules/currencies/backend/currencies/page.js +3 -1
  122. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  123. package/dist/modules/currencies/backend/exchange-rates/page.js +3 -1
  124. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  125. package/dist/modules/currencies/services/rateFetchingService.js +6 -1
  126. package/dist/modules/currencies/services/rateFetchingService.js.map +2 -2
  127. package/dist/modules/customer_accounts/api/admin/domain-mappings.js +9 -0
  128. package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
  129. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +3 -1
  130. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
  131. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +3 -1
  132. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
  133. package/dist/modules/customer_accounts/services/domainMappingService.js +10 -0
  134. package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
  135. package/dist/modules/customers/ai-tools/companies-pack.js +4 -1
  136. package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
  137. package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
  138. package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
  139. package/dist/modules/customers/ai-tools/deals-pack.js +52 -6
  140. package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
  141. package/dist/modules/customers/ai-tools/people-pack.js +4 -1
  142. package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
  143. package/dist/modules/customers/api/activities/route.js +48 -6
  144. package/dist/modules/customers/api/activities/route.js.map +2 -2
  145. package/dist/modules/customers/api/companies/[id]/people/route.js +20 -64
  146. package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
  147. package/dist/modules/customers/api/companies/[id]/route.js +17 -94
  148. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  149. package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +8 -5
  150. package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
  151. package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
  152. package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
  153. package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
  154. package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
  155. package/dist/modules/customers/api/deals/[id]/route.js +8 -25
  156. package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
  157. package/dist/modules/customers/api/deals/[id]/stats/route.js +3 -22
  158. package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
  159. package/dist/modules/customers/api/deals/aggregate/route.js +14 -9
  160. package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
  161. package/dist/modules/customers/api/deals/map/route.js +5 -5
  162. package/dist/modules/customers/api/deals/map/route.js.map +2 -2
  163. package/dist/modules/customers/api/deals/route.js +38 -1
  164. package/dist/modules/customers/api/deals/route.js.map +2 -2
  165. package/dist/modules/customers/api/entity-roles-factory.js +4 -4
  166. package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
  167. package/dist/modules/customers/api/interactions/route.js +3 -1
  168. package/dist/modules/customers/api/interactions/route.js.map +2 -2
  169. package/dist/modules/customers/api/interactions/tasks/route.js +27 -4
  170. package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
  171. package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +4 -3
  172. package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
  173. package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
  174. package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
  175. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
  176. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
  177. package/dist/modules/customers/api/people/[id]/route.js +11 -10
  178. package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
  179. package/dist/modules/customers/api/people/check-phone/route.js +51 -9
  180. package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
  181. package/dist/modules/customers/api/todos/route.js +30 -5
  182. package/dist/modules/customers/api/todos/route.js.map +2 -2
  183. package/dist/modules/customers/backend/customers/companies/page.js +4 -2
  184. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  185. package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
  186. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  187. package/dist/modules/customers/backend/customers/deals/page.js +5 -2
  188. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  189. package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +4 -13
  190. package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
  191. package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +85 -14
  192. package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
  193. package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +18 -0
  194. package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +7 -0
  195. package/dist/modules/customers/backend/customers/people/page.js +4 -2
  196. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  197. package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +9 -3
  198. package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
  199. package/dist/modules/customers/commands/deals.js +21 -34
  200. package/dist/modules/customers/commands/deals.js.map +2 -2
  201. package/dist/modules/customers/commands/interactions.js.map +1 -1
  202. package/dist/modules/customers/commands/personCompanyLinks.js +131 -2
  203. package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
  204. package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
  205. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  206. package/dist/modules/customers/components/DealsKpiStrip.js +7 -6
  207. package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
  208. package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
  209. package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
  210. package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
  211. package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
  212. package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
  213. package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
  214. package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
  215. package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
  216. package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
  217. package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
  218. package/dist/modules/customers/components/calendar/EventPeekPopover.js +3 -2
  219. package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
  220. package/dist/modules/customers/components/calendar/editor/PeopleField.js +40 -5
  221. package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
  222. package/dist/modules/customers/components/calendar/editor/hooks.js +2 -1
  223. package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
  224. package/dist/modules/customers/components/calendar/types.js +1 -1
  225. package/dist/modules/customers/components/calendar/types.js.map +2 -2
  226. package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -4
  227. package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
  228. package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -1
  229. package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
  230. package/dist/modules/customers/components/detail/DealForm.js +19 -7
  231. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  232. package/dist/modules/customers/components/detail/DealsSection.js +6 -5
  233. package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
  234. package/dist/modules/customers/components/detail/EntityTagsDialog.js +35 -11
  235. package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
  236. package/dist/modules/customers/components/detail/PersonCompaniesSection.js +3 -1
  237. package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
  238. package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +19 -13
  239. package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
  240. package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
  241. package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
  242. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
  243. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
  244. package/dist/modules/customers/components/detail/utils.js +5 -5
  245. package/dist/modules/customers/components/detail/utils.js.map +2 -2
  246. package/dist/modules/customers/data/entities.js.map +1 -1
  247. package/dist/modules/customers/data/validators.js +32 -3
  248. package/dist/modules/customers/data/validators.js.map +2 -2
  249. package/dist/modules/customers/events.js +5 -0
  250. package/dist/modules/customers/events.js.map +2 -2
  251. package/dist/modules/customers/lib/calendar/conflicts.js +8 -2
  252. package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
  253. package/dist/modules/customers/lib/calendar/editorPayload.js +3 -2
  254. package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
  255. package/dist/modules/customers/lib/calendar/mapItem.js +8 -3
  256. package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
  257. package/dist/modules/customers/lib/calendar/participantIdentity.js +9 -0
  258. package/dist/modules/customers/lib/calendar/participantIdentity.js.map +7 -0
  259. package/dist/modules/customers/lib/closureStage.js +45 -0
  260. package/dist/modules/customers/lib/closureStage.js.map +7 -0
  261. package/dist/modules/customers/lib/dealStatus.js +30 -0
  262. package/dist/modules/customers/lib/dealStatus.js.map +2 -2
  263. package/dist/modules/customers/lib/detailReadAccess.js +12 -0
  264. package/dist/modules/customers/lib/detailReadAccess.js.map +7 -0
  265. package/dist/modules/customers/lib/findPeopleByAddresses.js +1 -0
  266. package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
  267. package/dist/modules/customers/lib/personCompanies.js +100 -2
  268. package/dist/modules/customers/lib/personCompanies.js.map +2 -2
  269. package/dist/modules/customers/lib/todoCompatibility.js +12 -0
  270. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  271. package/dist/modules/dashboards/lib/widgetScope.js +6 -1
  272. package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
  273. package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
  274. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  275. package/dist/modules/data_sync/lib/abandoned-run.js +19 -0
  276. package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
  277. package/dist/modules/data_sync/lib/sync-engine.js +72 -6
  278. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  279. package/dist/modules/data_sync/workers/sync-export.js +5 -1
  280. package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
  281. package/dist/modules/data_sync/workers/sync-import.js +5 -1
  282. package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
  283. package/dist/modules/devices/acl.js +9 -1
  284. package/dist/modules/devices/acl.js.map +2 -2
  285. package/dist/modules/devices/api/admin/devices/[id]/route.js +5 -32
  286. package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
  287. package/dist/modules/devices/api/admin/devices/route.js +14 -1
  288. package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
  289. package/dist/modules/devices/api/deviceList.js +99 -12
  290. package/dist/modules/devices/api/deviceList.js.map +2 -2
  291. package/dist/modules/devices/api/deviceSerialization.js +46 -0
  292. package/dist/modules/devices/api/deviceSerialization.js.map +7 -0
  293. package/dist/modules/devices/api/openapi.js +3 -1
  294. package/dist/modules/devices/api/openapi.js.map +2 -2
  295. package/dist/modules/devices/api/route.js +9 -1
  296. package/dist/modules/devices/api/route.js.map +2 -2
  297. package/dist/modules/devices/backend/devices/[id]/page.js +10 -26
  298. package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
  299. package/dist/modules/devices/backend/devices/create/page.js +17 -1
  300. package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
  301. package/dist/modules/devices/backend/devices/page.js +28 -34
  302. package/dist/modules/devices/backend/devices/page.js.map +2 -2
  303. package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +34 -0
  304. package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +7 -0
  305. package/dist/modules/devices/backend/devices/userOptions.js +52 -0
  306. package/dist/modules/devices/backend/devices/userOptions.js.map +7 -0
  307. package/dist/modules/devices/setup.js +6 -2
  308. package/dist/modules/devices/setup.js.map +2 -2
  309. package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
  310. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  311. package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
  312. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  313. package/dist/modules/directory/di.js +9 -0
  314. package/dist/modules/directory/di.js.map +2 -2
  315. package/dist/modules/directory/services/organizationHierarchyService.js +29 -0
  316. package/dist/modules/directory/services/organizationHierarchyService.js.map +7 -0
  317. package/dist/modules/directory/services/organizationScopeService.js +56 -0
  318. package/dist/modules/directory/services/organizationScopeService.js.map +7 -0
  319. package/dist/modules/directory/utils/organizationScope.js.map +2 -2
  320. package/dist/modules/entities/api/records.js +4 -2
  321. package/dist/modules/entities/api/records.js.map +2 -2
  322. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +3 -1
  323. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  324. package/dist/modules/eudr/api/plots/route.js +5 -1
  325. package/dist/modules/eudr/api/plots/route.js.map +2 -2
  326. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +3 -0
  327. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
  328. package/dist/modules/eudr/backend/eudr/plots/page.js +3 -0
  329. package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
  330. package/dist/modules/eudr/backend/eudr/product-mappings/page.js +3 -0
  331. package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
  332. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +3 -0
  333. package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
  334. package/dist/modules/eudr/backend/eudr/statements/page.js +3 -0
  335. package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
  336. package/dist/modules/eudr/commands/statements.js +0 -3
  337. package/dist/modules/eudr/commands/statements.js.map +2 -2
  338. package/dist/modules/eudr/data/validators.js +4 -1
  339. package/dist/modules/eudr/data/validators.js.map +2 -2
  340. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
  341. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  342. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
  343. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  344. package/dist/modules/feature_toggles/defaults.json +0 -8
  345. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +3 -0
  346. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
  347. package/dist/modules/inbox_ops/backend/inbox-ops/page.js +3 -0
  348. package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
  349. package/dist/modules/inbox_ops/lib/htmlToPlainText.js +1 -12
  350. package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
  351. package/dist/modules/integrations/api/[id]/credentials/route.js +6 -1
  352. package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
  353. package/dist/modules/integrations/backend/integrations/[id]/page.js +38 -29
  354. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  355. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +36 -9
  356. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
  357. package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +55 -0
  358. package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +7 -0
  359. package/dist/modules/integrations/data/validators.js +11 -3
  360. package/dist/modules/integrations/data/validators.js.map +2 -2
  361. package/dist/modules/integrations/lib/credentials-masking.js +6 -2
  362. package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
  363. package/dist/modules/messages/api/[id]/route.js +29 -1
  364. package/dist/modules/messages/api/[id]/route.js.map +2 -2
  365. package/dist/modules/messages/api/openapi.js +17 -2
  366. package/dist/modules/messages/api/openapi.js.map +2 -2
  367. package/dist/modules/messages/api/route.js +17 -2
  368. package/dist/modules/messages/api/route.js.map +2 -2
  369. package/dist/modules/messages/components/MessagesInboxPageClient.js +7 -14
  370. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
  371. package/dist/modules/messages/components/inboxFilters.js +15 -0
  372. package/dist/modules/messages/components/inboxFilters.js.map +2 -2
  373. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +11 -1
  374. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
  375. package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +3 -1
  376. package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
  377. package/dist/modules/messages/components/message-detail/panels/thread-panel.js +2 -1
  378. package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
  379. package/dist/modules/messages/components/messageListLabels.js +14 -2
  380. package/dist/modules/messages/components/messageListLabels.js.map +2 -2
  381. package/dist/modules/messages/data/validators.js +18 -4
  382. package/dist/modules/messages/data/validators.js.map +2 -2
  383. package/dist/modules/messages/lib/channel-sender-identity.js +26 -0
  384. package/dist/modules/messages/lib/channel-sender-identity.js.map +7 -0
  385. package/dist/modules/messages/lib/composeSourceChannelType.js +41 -0
  386. package/dist/modules/messages/lib/composeSourceChannelType.js.map +7 -0
  387. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +4 -6
  388. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
  389. package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -1
  390. package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
  391. package/dist/modules/payment_gateways/lib/webhook-processor.js +7 -0
  392. package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
  393. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -0
  394. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  395. package/dist/modules/push_notifications/backend/push_notifications/page.js +3 -1
  396. package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
  397. package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
  398. package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
  399. package/dist/modules/query_index/lib/engine.js +150 -51
  400. package/dist/modules/query_index/lib/engine.js.map +2 -2
  401. package/dist/modules/query_index/lib/search-entity-policy.js +14 -0
  402. package/dist/modules/query_index/lib/search-entity-policy.js.map +7 -0
  403. package/dist/modules/query_index/lib/search-tokens.js +79 -3
  404. package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
  405. package/dist/modules/resources/backend/resources/resource-types/page.js +3 -1
  406. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  407. package/dist/modules/resources/backend/resources/resources/page.js +3 -1
  408. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  409. package/dist/modules/sales/backend/sales/channels/offers/page.js +3 -0
  410. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  411. package/dist/modules/sales/backend/sales/channels/page.js +3 -0
  412. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  413. package/dist/modules/sales/backend/sales/documents/[id]/page.js +10 -8
  414. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  415. package/dist/modules/sales/commands/documents.js +79 -1
  416. package/dist/modules/sales/commands/documents.js.map +2 -2
  417. package/dist/modules/sales/components/PriceWithCurrency.js +7 -5
  418. package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
  419. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +3 -0
  420. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  421. package/dist/modules/sales/components/documents/AdjustmentsSection.js +8 -6
  422. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  423. package/dist/modules/sales/components/documents/ItemsSection.js +51 -22
  424. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  425. package/dist/modules/sales/components/documents/LineItemDialog.js +83 -18
  426. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  427. package/dist/modules/sales/components/documents/PaymentsSection.js +23 -9
  428. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  429. package/dist/modules/sales/components/documents/ReturnsSection.js +8 -6
  430. package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
  431. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +68 -14
  432. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  433. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +6 -5
  434. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
  435. package/dist/modules/sales/components/documents/ShipmentDialog.js +5 -4
  436. package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
  437. package/dist/modules/sales/components/documents/ShipmentsSection.js +8 -6
  438. package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
  439. package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
  440. package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
  441. package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
  442. package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
  443. package/dist/modules/sales/data/entities.js +8 -2
  444. package/dist/modules/sales/data/entities.js.map +2 -2
  445. package/dist/modules/sales/extension-points.js +1 -0
  446. package/dist/modules/sales/extension-points.js.map +2 -2
  447. package/dist/modules/sales/lib/salesChannelsToggleSeed.js +33 -0
  448. package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +7 -0
  449. package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +32 -0
  450. package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +7 -0
  451. package/dist/modules/sales/setup.js +2 -0
  452. package/dist/modules/sales/setup.js.map +2 -2
  453. package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +10 -2
  454. package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
  455. package/dist/modules/sales/widgets/injection-table.js +4 -7
  456. package/dist/modules/sales/widgets/injection-table.js.map +2 -2
  457. package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -0
  458. package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
  459. package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -0
  460. package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
  461. package/dist/modules/staff/backend/staff/team-members/page.js +3 -0
  462. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  463. package/dist/modules/staff/backend/staff/team-roles/page.js +3 -0
  464. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  465. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -0
  466. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  467. package/dist/modules/staff/backend/staff/teams/page.js +3 -0
  468. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  469. package/dist/modules/staff/backend/staff/timesheets/page.js +29 -18
  470. package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
  471. package/dist/modules/staff/backend/staff/timesheets/projects/page.js +3 -0
  472. package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
  473. package/dist/modules/sync_excel/lib/adapters/customers.js +1 -0
  474. package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
  475. package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
  476. package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
  477. package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
  478. package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
  479. package/dist/modules/warranty_claims/api/portal/claims/route.js +12 -9
  480. package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
  481. package/dist/modules/warranty_claims/backend/page.js +3 -0
  482. package/dist/modules/warranty_claims/backend/page.js.map +2 -2
  483. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +3 -0
  484. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
  485. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +3 -0
  486. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
  487. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +3 -0
  488. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
  489. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +3 -0
  490. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
  491. package/dist/modules/wms/api/warehouseSearch.js +21 -0
  492. package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
  493. package/dist/modules/wms/api/warehouses/route.js +13 -9
  494. package/dist/modules/wms/api/warehouses/route.js.map +2 -2
  495. package/dist/modules/wms/api/zones/route.js +15 -2
  496. package/dist/modules/wms/api/zones/route.js.map +2 -2
  497. package/dist/modules/wms/commands/configuration.js +121 -9
  498. package/dist/modules/wms/commands/configuration.js.map +2 -2
  499. package/dist/modules/wms/commands/inventory-actions.js +3 -0
  500. package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
  501. package/dist/modules/wms/commands/shared.js +9 -1
  502. package/dist/modules/wms/commands/shared.js.map +2 -2
  503. package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
  504. package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
  505. package/dist/modules/wms/components/backend/WmsConfigurationPage.js +76 -111
  506. package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
  507. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
  508. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
  509. package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
  510. package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
  511. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +27 -20
  512. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
  513. package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
  514. package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
  515. package/dist/modules/workflows/backend/definitions/page.js +3 -1
  516. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  517. package/dist/modules/workflows/backend/events/page.js +3 -1
  518. package/dist/modules/workflows/backend/events/page.js.map +2 -2
  519. package/dist/modules/workflows/backend/instances/page.js +3 -1
  520. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  521. package/dist/modules/workflows/backend/tasks/page.js +3 -1
  522. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  523. package/dist/modules/workflows/lib/activity-executor.js +4 -0
  524. package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
  525. package/package.json +9 -10
  526. package/src/helpers/integration/api.ts +33 -1
  527. package/src/helpers/integration/communicationChannelsFixtures.ts +69 -1
  528. package/src/modules/api_keys/api/keys/route.ts +3 -1
  529. package/src/modules/api_keys/backend/api-keys/page.tsx +4 -1
  530. package/src/modules/api_keys/di.ts +7 -0
  531. package/src/modules/api_keys/services/principalService.ts +33 -0
  532. package/src/modules/attachments/AGENTS.md +15 -0
  533. package/src/modules/attachments/api/route.ts +2 -2
  534. package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -0
  535. package/src/modules/attachments/di.ts +16 -0
  536. package/src/modules/attachments/i18n/de.json +5 -0
  537. package/src/modules/attachments/i18n/en.json +5 -0
  538. package/src/modules/attachments/i18n/es.json +5 -0
  539. package/src/modules/attachments/i18n/ko.json +5 -0
  540. package/src/modules/attachments/i18n/pl.json +5 -0
  541. package/src/modules/attachments/index.ts +10 -0
  542. package/src/modules/attachments/lib/attachment-service.ts +468 -0
  543. package/src/modules/attachments/lib/scoped-upload-service.ts +46 -0
  544. package/src/modules/attachments/lib/upload-limits.ts +6 -2
  545. package/src/modules/audit_logs/backend/audit-logs/page.tsx +8 -0
  546. package/src/modules/audit_logs/lib/display-helpers.tsx +42 -32
  547. package/src/modules/audit_logs/services/actionLogService.ts +74 -11
  548. package/src/modules/auth/acl.ts +30 -6
  549. package/src/modules/auth/api/feature-check.ts +10 -3
  550. package/src/modules/auth/api/login.ts +9 -1
  551. package/src/modules/auth/api/reset/validate.ts +57 -0
  552. package/src/modules/auth/api/roles/acl/route.ts +42 -39
  553. package/src/modules/auth/api/session/refresh.ts +32 -1
  554. package/src/modules/auth/api/users/acl/route.ts +177 -53
  555. package/src/modules/auth/api/users/route.ts +18 -5
  556. package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +5 -2
  557. package/src/modules/auth/backend/roles/page.tsx +4 -2
  558. package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +5 -2
  559. package/src/modules/auth/backend/users/page.tsx +3 -2
  560. package/src/modules/auth/commands/acl.ts +495 -0
  561. package/src/modules/auth/components/AclEditor.tsx +63 -33
  562. package/src/modules/auth/data/entities.ts +4 -1
  563. package/src/modules/auth/data/validators.ts +5 -0
  564. package/src/modules/auth/di.ts +46 -16
  565. package/src/modules/auth/frontend/reset/[token]/page.tsx +74 -0
  566. package/src/modules/auth/i18n/de.json +389 -0
  567. package/src/modules/auth/i18n/en.json +389 -0
  568. package/src/modules/auth/i18n/es.json +389 -0
  569. package/src/modules/auth/i18n/ko.json +389 -0
  570. package/src/modules/auth/i18n/pl.json +391 -2
  571. package/src/modules/auth/lib/grantChecks.ts +6 -0
  572. package/src/modules/auth/lib/userIdFilter.ts +31 -0
  573. package/src/modules/auth/services/authService.ts +18 -2
  574. package/src/modules/auth/services/principalService.ts +266 -0
  575. package/src/modules/auth/services/rbacService.ts +110 -24
  576. package/src/modules/auth/services/roleOrganizationScope.ts +70 -0
  577. package/src/modules/business_rules/backend/logs/page.tsx +4 -1
  578. package/src/modules/business_rules/backend/rules/page.tsx +4 -1
  579. package/src/modules/business_rules/backend/sets/page.tsx +4 -1
  580. package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
  581. package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
  582. package/src/modules/catalog/ai-agents.ts +1 -1
  583. package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
  584. package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +12 -5
  585. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +3 -0
  586. package/src/modules/catalog/components/products/ProductsDataTable.tsx +7 -0
  587. package/src/modules/catalog/i18n/de.json +1 -0
  588. package/src/modules/catalog/i18n/en.json +1 -0
  589. package/src/modules/catalog/i18n/es.json +1 -0
  590. package/src/modules/catalog/i18n/ko.json +1 -0
  591. package/src/modules/catalog/i18n/pl.json +1 -0
  592. package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +4 -0
  593. package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +17 -1
  594. package/src/modules/communication_channels/api/post/test-seed/route.ts +155 -16
  595. package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +4 -0
  596. package/src/modules/communication_channels/commands/ingest-inbound-message.ts +38 -1
  597. package/src/modules/communication_channels/di.ts +7 -0
  598. package/src/modules/communication_channels/lib/adapter.ts +14 -0
  599. package/src/modules/communication_channels/lib/email-capabilities.ts +4 -0
  600. package/src/modules/communication_channels/lib/outbound-recipient.ts +71 -0
  601. package/src/modules/communication_channels/lib/resolve-channel-type.ts +99 -0
  602. package/src/modules/communication_channels/lib/test-seed.ts +64 -4
  603. package/src/modules/configs/i18n/de.json +2 -0
  604. package/src/modules/configs/i18n/en.json +2 -0
  605. package/src/modules/configs/i18n/es.json +2 -0
  606. package/src/modules/configs/i18n/ko.json +2 -0
  607. package/src/modules/configs/i18n/pl.json +2 -0
  608. package/src/modules/configs/lib/system-status.ts +9 -0
  609. package/src/modules/currencies/AGENTS.md +3 -0
  610. package/src/modules/currencies/backend/currencies/page.tsx +4 -1
  611. package/src/modules/currencies/backend/exchange-rates/page.tsx +4 -1
  612. package/src/modules/currencies/services/README.md +45 -0
  613. package/src/modules/currencies/services/rateFetchingService.ts +6 -1
  614. package/src/modules/customer_accounts/api/admin/domain-mappings.ts +7 -0
  615. package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +4 -1
  616. package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +4 -1
  617. package/src/modules/customer_accounts/services/domainMappingService.ts +10 -0
  618. package/src/modules/customers/ai-tools/companies-pack.ts +4 -1
  619. package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
  620. package/src/modules/customers/ai-tools/deals-pack.ts +66 -1
  621. package/src/modules/customers/ai-tools/people-pack.ts +4 -1
  622. package/src/modules/customers/api/activities/route.ts +45 -0
  623. package/src/modules/customers/api/companies/[id]/people/route.ts +24 -73
  624. package/src/modules/customers/api/companies/[id]/route.ts +24 -107
  625. package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +16 -8
  626. package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
  627. package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
  628. package/src/modules/customers/api/deals/[id]/route.ts +17 -28
  629. package/src/modules/customers/api/deals/[id]/stats/route.ts +10 -25
  630. package/src/modules/customers/api/deals/aggregate/route.ts +17 -9
  631. package/src/modules/customers/api/deals/map/route.ts +4 -4
  632. package/src/modules/customers/api/deals/route.ts +50 -1
  633. package/src/modules/customers/api/entity-roles-factory.ts +8 -4
  634. package/src/modules/customers/api/interactions/route.ts +8 -2
  635. package/src/modules/customers/api/interactions/tasks/route.ts +24 -1
  636. package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +12 -4
  637. package/src/modules/customers/api/people/[id]/companies/context.ts +4 -1
  638. package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
  639. package/src/modules/customers/api/people/[id]/route.ts +16 -11
  640. package/src/modules/customers/api/people/check-phone/route.ts +75 -10
  641. package/src/modules/customers/api/todos/route.ts +27 -2
  642. package/src/modules/customers/backend/customers/companies/page.tsx +5 -2
  643. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +7 -2
  644. package/src/modules/customers/backend/customers/deals/page.tsx +8 -2
  645. package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +5 -14
  646. package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +109 -27
  647. package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +21 -0
  648. package/src/modules/customers/backend/customers/people/page.tsx +5 -2
  649. package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +12 -4
  650. package/src/modules/customers/commands/deals.ts +34 -59
  651. package/src/modules/customers/commands/interactions.ts +1 -1
  652. package/src/modules/customers/commands/personCompanyLinks.ts +224 -8
  653. package/src/modules/customers/components/CustomerTodosTable.tsx +2 -0
  654. package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
  655. package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
  656. package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
  657. package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
  658. package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
  659. package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
  660. package/src/modules/customers/components/calendar/EventPeekPopover.tsx +4 -2
  661. package/src/modules/customers/components/calendar/editor/PeopleField.tsx +61 -5
  662. package/src/modules/customers/components/calendar/editor/hooks.ts +7 -1
  663. package/src/modules/customers/components/calendar/types.ts +2 -2
  664. package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -4
  665. package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +8 -1
  666. package/src/modules/customers/components/detail/DealForm.tsx +22 -2
  667. package/src/modules/customers/components/detail/DealsSection.tsx +11 -5
  668. package/src/modules/customers/components/detail/EntityTagsDialog.tsx +58 -12
  669. package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +8 -1
  670. package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +23 -14
  671. package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
  672. package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
  673. package/src/modules/customers/components/detail/types.ts +1 -1
  674. package/src/modules/customers/components/detail/utils.ts +15 -5
  675. package/src/modules/customers/data/entities.ts +1 -1
  676. package/src/modules/customers/data/validators.ts +50 -9
  677. package/src/modules/customers/events.ts +5 -0
  678. package/src/modules/customers/i18n/de.json +9 -1
  679. package/src/modules/customers/i18n/en.json +9 -1
  680. package/src/modules/customers/i18n/es.json +9 -1
  681. package/src/modules/customers/i18n/ko.json +9 -1
  682. package/src/modules/customers/i18n/pl.json +9 -1
  683. package/src/modules/customers/lib/calendar/conflicts.ts +10 -2
  684. package/src/modules/customers/lib/calendar/editorPayload.ts +4 -3
  685. package/src/modules/customers/lib/calendar/mapItem.ts +8 -3
  686. package/src/modules/customers/lib/calendar/participantIdentity.ts +17 -0
  687. package/src/modules/customers/lib/closureStage.ts +76 -0
  688. package/src/modules/customers/lib/dealStatus.ts +42 -0
  689. package/src/modules/customers/lib/detailReadAccess.ts +35 -0
  690. package/src/modules/customers/lib/findPeopleByAddresses.ts +8 -6
  691. package/src/modules/customers/lib/personCompanies.ts +136 -1
  692. package/src/modules/customers/lib/todoCompatibility.ts +19 -1
  693. package/src/modules/dashboards/i18n/es.json +4 -4
  694. package/src/modules/dashboards/i18n/pl.json +7 -7
  695. package/src/modules/dashboards/lib/widgetScope.ts +6 -0
  696. package/src/modules/data_sync/AGENTS.md +1 -1
  697. package/src/modules/data_sync/backend/data-sync/page.tsx +4 -1
  698. package/src/modules/data_sync/lib/abandoned-run.ts +56 -0
  699. package/src/modules/data_sync/lib/adapter.ts +36 -0
  700. package/src/modules/data_sync/lib/sync-engine.ts +113 -5
  701. package/src/modules/data_sync/workers/sync-export.ts +4 -0
  702. package/src/modules/data_sync/workers/sync-import.ts +4 -0
  703. package/src/modules/devices/AGENTS.md +20 -1
  704. package/src/modules/devices/acl.ts +9 -1
  705. package/src/modules/devices/api/admin/devices/[id]/route.ts +5 -34
  706. package/src/modules/devices/api/admin/devices/route.ts +14 -1
  707. package/src/modules/devices/api/deviceList.ts +135 -11
  708. package/src/modules/devices/api/deviceSerialization.ts +50 -0
  709. package/src/modules/devices/api/openapi.ts +9 -1
  710. package/src/modules/devices/api/route.ts +9 -1
  711. package/src/modules/devices/backend/devices/[id]/page.tsx +18 -32
  712. package/src/modules/devices/backend/devices/create/page.tsx +17 -1
  713. package/src/modules/devices/backend/devices/page.tsx +44 -45
  714. package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +45 -0
  715. package/src/modules/devices/backend/devices/userOptions.ts +99 -0
  716. package/src/modules/devices/i18n/de.json +3 -2
  717. package/src/modules/devices/i18n/en.json +3 -2
  718. package/src/modules/devices/i18n/es.json +3 -2
  719. package/src/modules/devices/i18n/ko.json +3 -2
  720. package/src/modules/devices/i18n/pl.json +3 -2
  721. package/src/modules/devices/setup.ts +6 -2
  722. package/src/modules/directory/backend/directory/organizations/page.tsx +3 -1
  723. package/src/modules/directory/backend/directory/tenants/page.tsx +3 -1
  724. package/src/modules/directory/di.ts +14 -2
  725. package/src/modules/directory/services/organizationHierarchyService.ts +34 -0
  726. package/src/modules/directory/services/organizationScopeService.ts +85 -0
  727. package/src/modules/directory/utils/organizationScope.ts +4 -15
  728. package/src/modules/entities/api/records.ts +2 -0
  729. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +4 -1
  730. package/src/modules/eudr/api/plots/route.ts +4 -0
  731. package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +4 -0
  732. package/src/modules/eudr/backend/eudr/plots/page.tsx +4 -0
  733. package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +4 -0
  734. package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +4 -0
  735. package/src/modules/eudr/backend/eudr/statements/page.tsx +4 -0
  736. package/src/modules/eudr/commands/statements.ts +0 -3
  737. package/src/modules/eudr/data/validators.ts +16 -1
  738. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
  739. package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
  740. package/src/modules/feature_toggles/defaults.json +0 -8
  741. package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +4 -0
  742. package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +4 -0
  743. package/src/modules/inbox_ops/lib/htmlToPlainText.ts +1 -17
  744. package/src/modules/integrations/api/[id]/credentials/route.ts +6 -4
  745. package/src/modules/integrations/backend/integrations/[id]/page.tsx +61 -31
  746. package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +44 -9
  747. package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +84 -0
  748. package/src/modules/integrations/data/validators.ts +12 -2
  749. package/src/modules/integrations/i18n/de.json +1 -0
  750. package/src/modules/integrations/i18n/en.json +1 -0
  751. package/src/modules/integrations/i18n/es.json +1 -0
  752. package/src/modules/integrations/i18n/ko.json +1 -0
  753. package/src/modules/integrations/i18n/pl.json +1 -0
  754. package/src/modules/integrations/lib/credentials-masking.ts +10 -6
  755. package/src/modules/messages/api/[id]/route.ts +55 -1
  756. package/src/modules/messages/api/openapi.ts +20 -0
  757. package/src/modules/messages/api/route.ts +31 -2
  758. package/src/modules/messages/components/MessagesInboxPageClient.tsx +9 -16
  759. package/src/modules/messages/components/inboxFilters.ts +36 -0
  760. package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +14 -1
  761. package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +3 -1
  762. package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +2 -1
  763. package/src/modules/messages/components/message-detail/types.ts +3 -0
  764. package/src/modules/messages/components/messageListLabels.ts +52 -3
  765. package/src/modules/messages/data/validators.ts +43 -4
  766. package/src/modules/messages/lib/channel-sender-identity.ts +55 -0
  767. package/src/modules/messages/lib/composeSourceChannelType.ts +95 -0
  768. package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -6
  769. package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +4 -1
  770. package/src/modules/payment_gateways/lib/webhook-processor.ts +11 -0
  771. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -0
  772. package/src/modules/push_notifications/backend/push_notifications/page.tsx +4 -1
  773. package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
  774. package/src/modules/query_index/lib/engine.ts +249 -61
  775. package/src/modules/query_index/lib/search-entity-policy.ts +46 -0
  776. package/src/modules/query_index/lib/search-tokens.ts +135 -3
  777. package/src/modules/resources/backend/resources/resource-types/page.tsx +4 -1
  778. package/src/modules/resources/backend/resources/resources/page.tsx +4 -1
  779. package/src/modules/sales/backend/sales/channels/offers/page.tsx +4 -0
  780. package/src/modules/sales/backend/sales/channels/page.tsx +4 -0
  781. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +14 -8
  782. package/src/modules/sales/commands/documents.ts +93 -0
  783. package/src/modules/sales/components/PriceWithCurrency.tsx +17 -5
  784. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +4 -0
  785. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -5
  786. package/src/modules/sales/components/documents/ItemsSection.tsx +56 -18
  787. package/src/modules/sales/components/documents/LineItemDialog.tsx +137 -20
  788. package/src/modules/sales/components/documents/PaymentsSection.tsx +20 -9
  789. package/src/modules/sales/components/documents/ReturnsSection.tsx +6 -5
  790. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +106 -14
  791. package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +6 -5
  792. package/src/modules/sales/components/documents/ShipmentDialog.tsx +5 -4
  793. package/src/modules/sales/components/documents/ShipmentsSection.tsx +6 -5
  794. package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
  795. package/src/modules/sales/components/documents/lineItemUtils.ts +7 -2
  796. package/src/modules/sales/data/entities.ts +6 -0
  797. package/src/modules/sales/extension-points.ts +1 -0
  798. package/src/modules/sales/i18n/de.json +8 -0
  799. package/src/modules/sales/i18n/en.json +8 -0
  800. package/src/modules/sales/i18n/es.json +8 -0
  801. package/src/modules/sales/i18n/ko.json +8 -0
  802. package/src/modules/sales/i18n/pl.json +8 -0
  803. package/src/modules/sales/lib/salesChannelsToggleSeed.ts +42 -0
  804. package/src/modules/sales/migrations/.snapshot-open-mercato.json +60 -0
  805. package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +87 -0
  806. package/src/modules/sales/setup.ts +2 -0
  807. package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +9 -1
  808. package/src/modules/sales/widgets/injection-table.ts +4 -7
  809. package/src/modules/staff/backend/staff/leave-requests/page.tsx +4 -0
  810. package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +4 -0
  811. package/src/modules/staff/backend/staff/team-members/page.tsx +6 -0
  812. package/src/modules/staff/backend/staff/team-roles/page.tsx +4 -0
  813. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -0
  814. package/src/modules/staff/backend/staff/teams/page.tsx +4 -0
  815. package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1
  816. package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +4 -0
  817. package/src/modules/sync_excel/lib/adapters/customers.ts +5 -0
  818. package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
  819. package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
  820. package/src/modules/warranty_claims/api/portal/claims/route.ts +12 -9
  821. package/src/modules/warranty_claims/backend/page.tsx +4 -0
  822. package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +4 -0
  823. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +4 -0
  824. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +4 -0
  825. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +4 -0
  826. package/src/modules/wms/api/warehouseSearch.ts +23 -0
  827. package/src/modules/wms/api/warehouses/route.ts +13 -9
  828. package/src/modules/wms/api/zones/route.ts +16 -0
  829. package/src/modules/wms/commands/configuration.ts +159 -10
  830. package/src/modules/wms/commands/inventory-actions.ts +3 -0
  831. package/src/modules/wms/commands/shared.ts +17 -0
  832. package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
  833. package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +95 -141
  834. package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +2 -0
  835. package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -0
  836. package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +36 -20
  837. package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
  838. package/src/modules/wms/i18n/de.json +2 -0
  839. package/src/modules/wms/i18n/en.json +2 -0
  840. package/src/modules/wms/i18n/es.json +2 -0
  841. package/src/modules/wms/i18n/ko.json +2 -0
  842. package/src/modules/wms/i18n/pl.json +2 -0
  843. package/src/modules/workflows/backend/definitions/page.tsx +4 -1
  844. package/src/modules/workflows/backend/events/page.tsx +4 -1
  845. package/src/modules/workflows/backend/instances/page.tsx +4 -1
  846. package/src/modules/workflows/backend/tasks/page.tsx +4 -1
  847. package/src/modules/workflows/lib/activity-executor.ts +9 -0
@@ -173,7 +173,7 @@ interface ParticipantsFieldProps {
173
173
  activityType: ActivityType
174
174
  participants: Participant[]
175
175
  setParticipants: React.Dispatch<React.SetStateAction<Participant[]>>
176
- removeParticipant: (userId: string) => void
176
+ removeParticipant: (index: number) => void
177
177
  guestPermissions: { canInviteOthers: boolean; canModify: boolean; canSeeList: boolean }
178
178
  setGuestPermissions: React.Dispatch<React.SetStateAction<{ canInviteOthers: boolean; canModify: boolean; canSeeList: boolean }>>
179
179
  }
@@ -205,19 +205,19 @@ export function ParticipantsField({
205
205
  {sectionLabel}
206
206
  </label>
207
207
  <div className="mt-2.5 flex flex-wrap content-center items-center gap-2 rounded-lg border border-border bg-background px-3 py-2.5">
208
- {participants.map((p) => (
209
- <div key={p.userId} className="inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-2.5 py-1.5">
208
+ {participants.map((p, index) => (
209
+ <div key={p.userId ?? p.email ?? index} className="inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-2.5 py-1.5">
210
210
  <span className={cn('inline-flex size-5 items-center justify-center rounded-full text-xs font-bold text-white', p.color ?? 'bg-primary')}>
211
211
  {p.name.charAt(0).toUpperCase()}
212
212
  </span>
213
213
  <span className="text-xs text-foreground">{p.name}</span>
214
- <IconButton type="button" variant="ghost" size="sm" onClick={() => removeParticipant(p.userId)} className="h-auto text-muted-foreground hover:text-foreground p-0" aria-label={t('customers.schedule.removeParticipant', 'Remove participant')}>
214
+ <IconButton type="button" variant="ghost" size="sm" onClick={() => removeParticipant(index)} className="h-auto text-muted-foreground hover:text-foreground p-0" aria-label={t('customers.schedule.removeParticipant', 'Remove participant')}>
215
215
  <X className="size-3" />
216
216
  </IconButton>
217
217
  </div>
218
218
  ))}
219
219
  <ParticipantSearchPopover
220
- existingIds={new Set(participants.map((p) => p.userId))}
220
+ existingIds={new Set(participants.map((p) => p.userId).filter((userId): userId is string => Boolean(userId)))}
221
221
  onAdd={(p) => setParticipants((prev) => [...prev, { ...p, status: 'pending' as RsvpStatus }])}
222
222
  onAddMany={(nextParticipants) => {
223
223
  setParticipants((prev) => [
@@ -4,7 +4,7 @@ import type { ActivityType } from './fieldConfig'
4
4
  export type RsvpStatus = 'pending' | 'accepted' | 'declined' | 'tentative'
5
5
 
6
6
  export type Participant = {
7
- userId: string
7
+ userId?: string
8
8
  name: string
9
9
  email?: string
10
10
  color?: string
@@ -36,7 +36,7 @@ export type ScheduleActivityEditData = {
36
36
  allDay?: boolean | null
37
37
  recurrenceRule?: string | null
38
38
  recurrenceEnd?: string | null
39
- participants?: Array<{ userId: string; name?: string; email?: string; status?: string }> | null
39
+ participants?: Array<{ userId?: string; name?: string; email?: string; status?: string }> | null
40
40
  reminderMinutes?: number | null
41
41
  visibility?: string | null
42
42
  linkedEntities?: Array<{ id: string; type: string; label: string }> | null
@@ -136,7 +136,7 @@ export function useScheduleFormState({ open, editData }: UseScheduleFormStatePar
136
136
  Array.isArray(editData.participants)
137
137
  ? editData.participants.map((p, i) => ({
138
138
  userId: p.userId,
139
- name: p.name ?? p.userId,
139
+ name: p.name ?? p.email ?? p.userId ?? '',
140
140
  email: p.email,
141
141
  color: PARTICIPANT_COLORS[i % PARTICIPANT_COLORS.length],
142
142
  status: (p.status ?? 'pending') as RsvpStatus,
@@ -219,8 +219,8 @@ export function useScheduleFormState({ open, editData }: UseScheduleFormStatePar
219
219
  setReminderMinutes(DEFAULT_REMINDER_MINUTES[activityType])
220
220
  }, [activityType, editData, open])
221
221
 
222
- const removeParticipant = React.useCallback((userId: string) => {
223
- setParticipants((prev) => prev.filter((p) => p.userId !== userId))
222
+ const removeParticipant = React.useCallback((index: number) => {
223
+ setParticipants((prev) => prev.filter((_, i) => i !== index))
224
224
  }, [])
225
225
 
226
226
  const toggleRecurrenceDay = React.useCallback((index: number) => {
@@ -144,7 +144,7 @@ export type InteractionSummary = {
144
144
  authorEmail?: string | null
145
145
  dealTitle?: string | null
146
146
  customValues?: Record<string, unknown> | null
147
- participants?: Array<{ userId: string; name?: string; email?: string; status?: string }> | null
147
+ participants?: Array<{ userId?: string; name?: string; email?: string; status?: string }> | null
148
148
  reminderMinutes?: number | null
149
149
  visibility?: string | null
150
150
  linkedEntities?: Array<{ id: string; type: string; label: string }> | null
@@ -5,11 +5,16 @@ import type { CustomerDictionaryKind } from '../../lib/dictionaries'
5
5
  import { CUSTOMER_INTERACTION_TASK_SOURCE, CUSTOMER_INTERACTION_TASK_TYPE } from '../../lib/interactionCompatibility'
6
6
 
7
7
 
8
- export function formatDate(value?: string | null): string | null {
8
+ /**
9
+ * Pass `locale` to format in the application locale (`useLocale()` in client components).
10
+ * Omitting it keeps the runtime default, which varies per machine and is therefore not
11
+ * assertable in tests.
12
+ */
13
+ export function formatDate(value?: string | null, locale?: string): string | null {
9
14
  if (!value) return null
10
15
  const date = new Date(value)
11
16
  if (Number.isNaN(date.getTime())) return null
12
- return date.toLocaleDateString()
17
+ return date.toLocaleDateString(locale)
13
18
  }
14
19
 
15
20
  export function formatTemplate(template: string, params?: Record<string, string | number>): string {
@@ -148,15 +153,20 @@ export function createDictionarySelectLabels(
148
153
  }
149
154
  }
150
155
 
151
- export function formatCurrency(amount: number, currency?: string | null): string {
156
+ /**
157
+ * Pass `locale` to format in the application locale (`useLocale()` in client components).
158
+ * Omitting it keeps the runtime default, which varies per machine and is therefore not
159
+ * assertable in tests.
160
+ */
161
+ export function formatCurrency(amount: number, currency?: string | null, locale?: string): string {
152
162
  try {
153
- return new Intl.NumberFormat(undefined, {
163
+ return new Intl.NumberFormat(locale, {
154
164
  style: 'currency',
155
165
  currency: currency || 'PLN',
156
166
  maximumFractionDigits: 0,
157
167
  }).format(amount)
158
168
  } catch {
159
- return `${amount.toLocaleString()} ${currency || 'PLN'}`
169
+ return `${amount.toLocaleString(locale)} ${currency || 'PLN'}`
160
170
  }
161
171
  }
162
172
 
@@ -650,7 +650,7 @@ export class CustomerInteraction {
650
650
  recurrenceEnd?: Date | null
651
651
 
652
652
  @Property({ name: 'participants', type: 'jsonb', nullable: true })
653
- participants?: Array<{ userId: string; name?: string; email?: string; status?: string }> | null
653
+ participants?: Array<{ userId?: string; name?: string; email?: string; status?: string }> | null
654
654
 
655
655
  @Property({ name: 'reminder_minutes', type: 'int', nullable: true })
656
656
  reminderMinutes?: number | null
@@ -10,6 +10,8 @@ export const ACTIVITY_DATE_REQUIRED_MESSAGE_KEY = 'customers.activities.errors.d
10
10
  export const ACTIVITY_TIME_REQUIRED_MESSAGE_KEY = 'customers.activities.errors.timeRequired'
11
11
  export const ACTIVITY_PHONE_REQUIRED_MESSAGE_KEY = 'customers.activities.errors.phoneRequired'
12
12
  export const ACTIVITY_PHONE_INVALID_MESSAGE_KEY = 'customers.activities.errors.phoneInvalid'
13
+ export const INTERACTION_PARTICIPANT_IDENTITY_REQUIRED_MESSAGE_KEY = 'customers.activities.errors.participantIdentityRequired'
14
+ export const INTERACTION_PARTICIPANT_EMAIL_INVALID_MESSAGE_KEY = 'customers.activities.errors.participantEmailInvalid'
13
15
 
14
16
  // customer_deals.description is an unbounded `text` column; this cap only exists to keep
15
17
  // request bodies, fulltext search documents and query-index documents from growing without limit.
@@ -424,12 +426,36 @@ export const interactionStatusValues = ['planned', 'done', 'canceled'] as const
424
426
  /** @deprecated See {@link interactionStatusValues}. */
425
427
  export type InteractionStatus = typeof interactionStatusValues[number]
426
428
 
427
- const interactionParticipantSchema = z.object({
428
- userId: z.string().uuid(),
429
- name: z.string().trim().max(200).optional(),
430
- email: z.string().trim().max(320).optional(),
431
- status: z.string().trim().max(50).optional(),
432
- })
429
+ // A participant is either a real record (`userId`) or an external guest carrying
430
+ // no id at all. A guest is only addressable through its email, so that email is
431
+ // required and must actually be routable — an unparseable string would persist
432
+ // and only fail later, at invitation or calendar-sync time. Participants that DO
433
+ // have a userId keep an unvalidated auxiliary email, as before.
434
+ const interactionParticipantSchema = z
435
+ .object({
436
+ userId: z.string().uuid().optional(),
437
+ name: z.string().trim().max(200).optional(),
438
+ email: z.string().trim().max(320).optional(),
439
+ status: z.string().trim().max(50).optional(),
440
+ })
441
+ .superRefine((participant, ctx) => {
442
+ if (participant.userId) return
443
+ if (!participant.email) {
444
+ ctx.addIssue({
445
+ code: z.ZodIssueCode.custom,
446
+ path: ['email'],
447
+ message: INTERACTION_PARTICIPANT_IDENTITY_REQUIRED_MESSAGE_KEY,
448
+ })
449
+ return
450
+ }
451
+ if (!z.string().email().safeParse(participant.email).success) {
452
+ ctx.addIssue({
453
+ code: z.ZodIssueCode.custom,
454
+ path: ['email'],
455
+ message: INTERACTION_PARTICIPANT_EMAIL_INVALID_MESSAGE_KEY,
456
+ })
457
+ }
458
+ })
433
459
 
434
460
  const interactionLinkedEntitySchema = z.object({
435
461
  id: z.string().uuid(),
@@ -774,9 +800,24 @@ export const personCompanyLinkUpdateSchema = scopedSchema.extend({
774
800
  isPrimary: z.boolean(),
775
801
  })
776
802
 
777
- export const personCompanyLinkDeleteSchema = scopedSchema.extend({
778
- linkId: uuid(),
779
- })
803
+ // Two shapes are accepted, because a person can belong to a company in two ways:
804
+ // through a `customer_person_company_links` row (`linkId`), or through a legacy
805
+ // profile-only assignment where `customer_person_profiles.company_id` is set and no
806
+ // link row was ever created (migrated CRM data, #5114). Both detaches go through the
807
+ // same command so audit, undo and cache invalidation stay consistent.
808
+ export const personCompanyLinkDeleteSchema = scopedSchema
809
+ .extend({
810
+ linkId: uuid().optional(),
811
+ personEntityId: uuid().optional(),
812
+ companyEntityId: uuid().optional(),
813
+ })
814
+ .refine(
815
+ (payload) => Boolean(payload.linkId) || Boolean(payload.personEntityId && payload.companyEntityId),
816
+ {
817
+ message: 'Provide either linkId or both personEntityId and companyEntityId.',
818
+ path: ['linkId'],
819
+ }
820
+ )
780
821
 
781
822
  export type PersonCompanyLinkCreateInput = z.infer<typeof personCompanyLinkCreateSchema>
782
823
  export type PersonCompanyLinkUpdateInput = z.infer<typeof personCompanyLinkUpdateSchema>
@@ -78,6 +78,11 @@ const events = [
78
78
  { id: 'customers.person_company_link.created', label: 'Person Linked To Company', entity: 'person_company_link', category: 'crud', clientBroadcast: true },
79
79
  { id: 'customers.person_company_link.updated', label: 'Person-Company Link Updated', entity: 'person_company_link', category: 'crud', clientBroadcast: true },
80
80
  { id: 'customers.person_company_link.deleted', label: 'Person Unlinked From Company', entity: 'person_company_link', category: 'crud', clientBroadcast: true },
81
+ // Legacy profile-only company assignments (`customer_person_profiles.company_id` set with no
82
+ // backing link row, #5114) have no link entity, so detaching one cannot honestly emit
83
+ // `customers.person_company_link.deleted` — that event's payload promises a link id that never
84
+ // existed. This sibling carries the same live-refresh signal for that shape instead.
85
+ { id: 'customers.person.company_assignment.detached', label: 'Legacy Company Assignment Detached', entity: 'person_company_link', category: 'lifecycle', clientBroadcast: true },
81
86
 
82
87
  // ── Email integration (2026-05-27) ────────────────────────────────────────
83
88
  { id: 'customers.email.linked', label: 'Email Linked To Person', entity: 'email_link', category: 'lifecycle', clientBroadcast: true },
@@ -28,6 +28,8 @@
28
28
  "customers.activities.card.overdue": "{count} überfällig",
29
29
  "customers.activities.card.title": "Aktivitäten",
30
30
  "customers.activities.errors.dateRequired": "Datum ist erforderlich",
31
+ "customers.activities.errors.participantEmailInvalid": "Geben Sie eine gültige E-Mail-Adresse für einen Gastteilnehmer ein (z. B. gast@example.org)",
32
+ "customers.activities.errors.participantIdentityRequired": "Ein Teilnehmer benötigt entweder einen Benutzerdatensatz oder eine E-Mail-Adresse",
31
33
  "customers.activities.errors.phoneInvalid": "Geben Sie eine gültige Telefonnummer mit Ländervorwahl ein (z. B. +49 30 1234567)",
32
34
  "customers.activities.errors.phoneRequired": "Telefonnummer ist für Anrufaktivitäten erforderlich",
33
35
  "customers.activities.errors.timeRequired": "Uhrzeit ist erforderlich",
@@ -222,6 +224,7 @@
222
224
  "customers.calendar.day.thu": "DO",
223
225
  "customers.calendar.day.tue": "DI",
224
226
  "customers.calendar.day.wed": "MI",
227
+ "customers.calendar.editor.addGuest": "{email} als Gast einladen",
225
228
  "customers.calendar.editor.addPeoplePlaceholder": "Mitarbeiter oder Kunden hinzufügen…",
226
229
  "customers.calendar.editor.addRecipientPlaceholder": "Empfänger hinzufügen…",
227
230
  "customers.calendar.editor.allDay": "Ganztägig",
@@ -247,6 +250,7 @@
247
250
  "customers.calendar.editor.description": "Beschreibung",
248
251
  "customers.calendar.editor.descriptionPlaceholder": "Details hinzufügen…",
249
252
  "customers.calendar.editor.error": "Termin konnte nicht gespeichert werden",
253
+ "customers.calendar.editor.guestBadge": "Gast",
250
254
  "customers.calendar.editor.location": "Ort",
251
255
  "customers.calendar.editor.locationPlaceholder": "Ort oder Link hinzufügen…",
252
256
  "customers.calendar.editor.multiDayHint": "Mehrtägiger Termin · {count} Tage",
@@ -354,7 +358,7 @@
354
358
  "customers.calendar.settings.activityTypesHint": "Die Aktivitätstypen, die Ihr Kalender beim Erstellen eines Ereignisses anbietet. Aus dem Workspace-Wörterbuch übernommen.",
355
359
  "customers.calendar.settings.addCategory": "Kategorie hinzufügen…",
356
360
  "customers.calendar.settings.addType": "Typ hinzufügen…",
357
- "customers.calendar.settings.aiSummaries": "KI-Zusammenfassungen & Schnellaktionen",
361
+ "customers.calendar.settings.aiSummaries": "KI-Zusammenfassungen",
358
362
  "customers.calendar.settings.cancel": "Abbrechen",
359
363
  "customers.calendar.settings.close": "Schließen",
360
364
  "customers.calendar.settings.conflictScope": "Konfliktbereich",
@@ -1319,6 +1323,9 @@
1319
1323
  "customers.deals.kanban.filter.searchPlaceholder": "Search…",
1320
1324
  "customers.deals.kanban.filter.selected": "selected",
1321
1325
  "customers.deals.kanban.filter.status": "Status",
1326
+ "customers.deals.kanban.filter.status.closed": "Geschlossen",
1327
+ "customers.deals.kanban.filter.status.inProgress": "In Bearbeitung",
1328
+ "customers.deals.kanban.filter.status.loading": "Status werden geladen…",
1322
1329
  "customers.deals.kanban.filter.status.lost": "Lost",
1323
1330
  "customers.deals.kanban.filter.status.open": "Open",
1324
1331
  "customers.deals.kanban.filter.status.title": "Filter · Status",
@@ -2409,6 +2416,7 @@
2409
2416
  "customers.personTags.newLabel": "New label",
2410
2417
  "customers.personTags.newLabelPlaceholder": "Label name...",
2411
2418
  "customers.personTags.newTag": "Neuer Tag",
2419
+ "customers.personTags.retry": "Erneut versuchen",
2412
2420
  "customers.personTags.save": "Save",
2413
2421
  "customers.personTags.saveError": "Failed to save tags",
2414
2422
  "customers.personTags.saveSuccess": "Tags updated.",
@@ -28,6 +28,8 @@
28
28
  "customers.activities.card.overdue": "{count} overdue",
29
29
  "customers.activities.card.title": "Activities",
30
30
  "customers.activities.errors.dateRequired": "Date is required",
31
+ "customers.activities.errors.participantEmailInvalid": "Enter a valid email address for a guest participant (e.g. guest@example.org)",
32
+ "customers.activities.errors.participantIdentityRequired": "A participant needs either a user record or an email address",
31
33
  "customers.activities.errors.phoneInvalid": "Enter a valid phone number with country code (e.g. +1 212 555 1234)",
32
34
  "customers.activities.errors.phoneRequired": "Phone number is required for Call activities",
33
35
  "customers.activities.errors.timeRequired": "Time is required",
@@ -222,6 +224,7 @@
222
224
  "customers.calendar.day.thu": "THU",
223
225
  "customers.calendar.day.tue": "TUE",
224
226
  "customers.calendar.day.wed": "WED",
227
+ "customers.calendar.editor.addGuest": "Invite {email} as a guest",
225
228
  "customers.calendar.editor.addPeoplePlaceholder": "Add staff or customer…",
226
229
  "customers.calendar.editor.addRecipientPlaceholder": "Add recipient…",
227
230
  "customers.calendar.editor.allDay": "All day",
@@ -247,6 +250,7 @@
247
250
  "customers.calendar.editor.description": "Description",
248
251
  "customers.calendar.editor.descriptionPlaceholder": "Add details…",
249
252
  "customers.calendar.editor.error": "Failed to save event",
253
+ "customers.calendar.editor.guestBadge": "Guest",
250
254
  "customers.calendar.editor.location": "Location",
251
255
  "customers.calendar.editor.locationPlaceholder": "Add a location or link…",
252
256
  "customers.calendar.editor.multiDayHint": "Multi-day event · {count} days",
@@ -354,7 +358,7 @@
354
358
  "customers.calendar.settings.activityTypesHint": "The activity types your calendar surfaces when creating an event. Seeded from your workspace dictionary.",
355
359
  "customers.calendar.settings.addCategory": "Add a category…",
356
360
  "customers.calendar.settings.addType": "Add a type…",
357
- "customers.calendar.settings.aiSummaries": "AI summaries & quick actions",
361
+ "customers.calendar.settings.aiSummaries": "AI summaries",
358
362
  "customers.calendar.settings.cancel": "Cancel",
359
363
  "customers.calendar.settings.close": "Close",
360
364
  "customers.calendar.settings.conflictScope": "Conflict scope",
@@ -1319,6 +1323,9 @@
1319
1323
  "customers.deals.kanban.filter.searchPlaceholder": "Search…",
1320
1324
  "customers.deals.kanban.filter.selected": "selected",
1321
1325
  "customers.deals.kanban.filter.status": "Status",
1326
+ "customers.deals.kanban.filter.status.closed": "Closed",
1327
+ "customers.deals.kanban.filter.status.inProgress": "In progress",
1328
+ "customers.deals.kanban.filter.status.loading": "Loading statuses…",
1322
1329
  "customers.deals.kanban.filter.status.lost": "Lost",
1323
1330
  "customers.deals.kanban.filter.status.open": "Open",
1324
1331
  "customers.deals.kanban.filter.status.title": "Filter · Status",
@@ -2409,6 +2416,7 @@
2409
2416
  "customers.personTags.newLabel": "New label",
2410
2417
  "customers.personTags.newLabelPlaceholder": "Label name...",
2411
2418
  "customers.personTags.newTag": "New tag",
2419
+ "customers.personTags.retry": "Retry",
2412
2420
  "customers.personTags.save": "Save",
2413
2421
  "customers.personTags.saveError": "Failed to save tags",
2414
2422
  "customers.personTags.saveSuccess": "Tags updated.",
@@ -28,6 +28,8 @@
28
28
  "customers.activities.card.overdue": "{count} vencidas",
29
29
  "customers.activities.card.title": "Actividades",
30
30
  "customers.activities.errors.dateRequired": "La fecha es obligatoria",
31
+ "customers.activities.errors.participantEmailInvalid": "Introduce una dirección de correo electrónico válida para un invitado (p. ej., invitado@example.org)",
32
+ "customers.activities.errors.participantIdentityRequired": "Un participante necesita un registro de usuario o una dirección de correo electrónico",
31
33
  "customers.activities.errors.phoneInvalid": "Introduce un número de teléfono válido con prefijo internacional (p. ej., +34 912 345 678)",
32
34
  "customers.activities.errors.phoneRequired": "El número de teléfono es obligatorio para actividades de llamada",
33
35
  "customers.activities.errors.timeRequired": "La hora es obligatoria",
@@ -222,6 +224,7 @@
222
224
  "customers.calendar.day.thu": "JUE",
223
225
  "customers.calendar.day.tue": "MAR",
224
226
  "customers.calendar.day.wed": "MIÉ",
227
+ "customers.calendar.editor.addGuest": "Invitar a {email} como invitado",
225
228
  "customers.calendar.editor.addPeoplePlaceholder": "Añadir personal o cliente…",
226
229
  "customers.calendar.editor.addRecipientPlaceholder": "Añadir destinatario…",
227
230
  "customers.calendar.editor.allDay": "Todo el día",
@@ -247,6 +250,7 @@
247
250
  "customers.calendar.editor.description": "Descripción",
248
251
  "customers.calendar.editor.descriptionPlaceholder": "Añadir detalles…",
249
252
  "customers.calendar.editor.error": "No se pudo guardar el evento",
253
+ "customers.calendar.editor.guestBadge": "Invitado",
250
254
  "customers.calendar.editor.location": "Ubicación",
251
255
  "customers.calendar.editor.locationPlaceholder": "Añadir una ubicación o enlace…",
252
256
  "customers.calendar.editor.multiDayHint": "Evento de varios días · {count} días",
@@ -354,7 +358,7 @@
354
358
  "customers.calendar.settings.activityTypesHint": "Los tipos de actividad que muestra tu calendario al crear un evento. Tomados del diccionario del espacio de trabajo.",
355
359
  "customers.calendar.settings.addCategory": "Añadir una categoría…",
356
360
  "customers.calendar.settings.addType": "Añadir un tipo…",
357
- "customers.calendar.settings.aiSummaries": "Resúmenes de IA y acciones rápidas",
361
+ "customers.calendar.settings.aiSummaries": "Resúmenes de IA",
358
362
  "customers.calendar.settings.cancel": "Cancelar",
359
363
  "customers.calendar.settings.close": "Cerrar",
360
364
  "customers.calendar.settings.conflictScope": "Ámbito de conflictos",
@@ -1319,6 +1323,9 @@
1319
1323
  "customers.deals.kanban.filter.searchPlaceholder": "Search…",
1320
1324
  "customers.deals.kanban.filter.selected": "selected",
1321
1325
  "customers.deals.kanban.filter.status": "Status",
1326
+ "customers.deals.kanban.filter.status.closed": "Cerrado",
1327
+ "customers.deals.kanban.filter.status.inProgress": "En curso",
1328
+ "customers.deals.kanban.filter.status.loading": "Cargando estados…",
1322
1329
  "customers.deals.kanban.filter.status.lost": "Lost",
1323
1330
  "customers.deals.kanban.filter.status.open": "Open",
1324
1331
  "customers.deals.kanban.filter.status.title": "Filter · Status",
@@ -2409,6 +2416,7 @@
2409
2416
  "customers.personTags.newLabel": "New label",
2410
2417
  "customers.personTags.newLabelPlaceholder": "Label name...",
2411
2418
  "customers.personTags.newTag": "Nueva etiqueta",
2419
+ "customers.personTags.retry": "Reintentar",
2412
2420
  "customers.personTags.save": "Save",
2413
2421
  "customers.personTags.saveError": "Failed to save tags",
2414
2422
  "customers.personTags.saveSuccess": "Tags updated.",
@@ -28,6 +28,8 @@
28
28
  "customers.activities.card.overdue": "{count}건 기한 초과",
29
29
  "customers.activities.card.title": "활동",
30
30
  "customers.activities.errors.dateRequired": "날짜는 필수입니다",
31
+ "customers.activities.errors.participantEmailInvalid": "게스트 참가자의 유효한 이메일 주소를 입력하세요(예: guest@example.org)",
32
+ "customers.activities.errors.participantIdentityRequired": "참가자에게는 사용자 레코드 또는 이메일 주소가 필요합니다",
31
33
  "customers.activities.errors.phoneInvalid": "국가 코드를 포함한 유효한 전화번호를 입력하세요(예: +1 212 555 1234)",
32
34
  "customers.activities.errors.phoneRequired": "통화 활동에는 전화번호가 필요합니다",
33
35
  "customers.activities.errors.timeRequired": "시간은 필수입니다",
@@ -222,6 +224,7 @@
222
224
  "customers.calendar.day.thu": "목",
223
225
  "customers.calendar.day.tue": "화",
224
226
  "customers.calendar.day.wed": "수",
227
+ "customers.calendar.editor.addGuest": "{email}을(를) 게스트로 초대",
225
228
  "customers.calendar.editor.addPeoplePlaceholder": "직원 또는 고객 추가…",
226
229
  "customers.calendar.editor.addRecipientPlaceholder": "받는 사람 추가…",
227
230
  "customers.calendar.editor.allDay": "종일",
@@ -247,6 +250,7 @@
247
250
  "customers.calendar.editor.description": "설명",
248
251
  "customers.calendar.editor.descriptionPlaceholder": "세부 정보 추가…",
249
252
  "customers.calendar.editor.error": "이벤트를 저장하지 못했습니다",
253
+ "customers.calendar.editor.guestBadge": "게스트",
250
254
  "customers.calendar.editor.location": "장소",
251
255
  "customers.calendar.editor.locationPlaceholder": "장소 또는 링크 추가…",
252
256
  "customers.calendar.editor.multiDayHint": "여러 날 이벤트 · {count}일",
@@ -354,7 +358,7 @@
354
358
  "customers.calendar.settings.activityTypesHint": "이벤트를 생성할 때 캘린더에 표시되는 활동 유형입니다. 워크스페이스 사전에서 초기화됩니다.",
355
359
  "customers.calendar.settings.addCategory": "카테고리 추가…",
356
360
  "customers.calendar.settings.addType": "유형 추가…",
357
- "customers.calendar.settings.aiSummaries": "AI 요약 및 빠른 작업",
361
+ "customers.calendar.settings.aiSummaries": "AI 요약",
358
362
  "customers.calendar.settings.cancel": "취소",
359
363
  "customers.calendar.settings.close": "닫기",
360
364
  "customers.calendar.settings.conflictScope": "충돌 범위",
@@ -1319,6 +1323,9 @@
1319
1323
  "customers.deals.kanban.filter.searchPlaceholder": "검색…",
1320
1324
  "customers.deals.kanban.filter.selected": "선택됨",
1321
1325
  "customers.deals.kanban.filter.status": "상태",
1326
+ "customers.deals.kanban.filter.status.closed": "마감",
1327
+ "customers.deals.kanban.filter.status.inProgress": "진행 중",
1328
+ "customers.deals.kanban.filter.status.loading": "상태 로드 중…",
1322
1329
  "customers.deals.kanban.filter.status.lost": "실패",
1323
1330
  "customers.deals.kanban.filter.status.open": "열림",
1324
1331
  "customers.deals.kanban.filter.status.title": "필터 · 상태",
@@ -2409,6 +2416,7 @@
2409
2416
  "customers.personTags.newLabel": "새 라벨",
2410
2417
  "customers.personTags.newLabelPlaceholder": "라벨 이름...",
2411
2418
  "customers.personTags.newTag": "새 태그",
2419
+ "customers.personTags.retry": "다시 시도",
2412
2420
  "customers.personTags.save": "저장",
2413
2421
  "customers.personTags.saveError": "태그 저장에 실패했습니다",
2414
2422
  "customers.personTags.saveSuccess": "태그가 업데이트되었습니다.",
@@ -28,6 +28,8 @@
28
28
  "customers.activities.card.overdue": "{count} zaległych",
29
29
  "customers.activities.card.title": "Aktywności",
30
30
  "customers.activities.errors.dateRequired": "Data jest wymagana",
31
+ "customers.activities.errors.participantEmailInvalid": "Wprowadź prawidłowy adres e-mail uczestnika zewnętrznego (np. gosc@example.org)",
32
+ "customers.activities.errors.participantIdentityRequired": "Uczestnik wymaga rekordu użytkownika lub adresu e-mail",
31
33
  "customers.activities.errors.phoneInvalid": "Wprowadź prawidłowy numer telefonu z numerem kierunkowym kraju (np. +48 123 456 789)",
32
34
  "customers.activities.errors.phoneRequired": "Numer telefonu jest wymagany dla aktywności typu Połączenie",
33
35
  "customers.activities.errors.timeRequired": "Godzina jest wymagana",
@@ -222,6 +224,7 @@
222
224
  "customers.calendar.day.thu": "CZ",
223
225
  "customers.calendar.day.tue": "WT",
224
226
  "customers.calendar.day.wed": "ŚR",
227
+ "customers.calendar.editor.addGuest": "Zaproś {email} jako gościa",
225
228
  "customers.calendar.editor.addPeoplePlaceholder": "Dodaj pracownika lub klienta…",
226
229
  "customers.calendar.editor.addRecipientPlaceholder": "Dodaj odbiorcę…",
227
230
  "customers.calendar.editor.allDay": "Cały dzień",
@@ -247,6 +250,7 @@
247
250
  "customers.calendar.editor.description": "Opis",
248
251
  "customers.calendar.editor.descriptionPlaceholder": "Dodaj szczegóły…",
249
252
  "customers.calendar.editor.error": "Nie udało się zapisać wydarzenia",
253
+ "customers.calendar.editor.guestBadge": "Gość",
250
254
  "customers.calendar.editor.location": "Lokalizacja",
251
255
  "customers.calendar.editor.locationPlaceholder": "Dodaj lokalizację lub link…",
252
256
  "customers.calendar.editor.multiDayHint": "Wydarzenie wielodniowe · {count} dni",
@@ -354,7 +358,7 @@
354
358
  "customers.calendar.settings.activityTypesHint": "Typy aktywności udostępniane przez kalendarz podczas tworzenia wydarzenia. Pobrane ze słownika obszaru roboczego.",
355
359
  "customers.calendar.settings.addCategory": "Dodaj kategorię…",
356
360
  "customers.calendar.settings.addType": "Dodaj typ…",
357
- "customers.calendar.settings.aiSummaries": "Podsumowania AI i szybkie akcje",
361
+ "customers.calendar.settings.aiSummaries": "Podsumowania AI",
358
362
  "customers.calendar.settings.cancel": "Anuluj",
359
363
  "customers.calendar.settings.close": "Zamknij",
360
364
  "customers.calendar.settings.conflictScope": "Zakres konfliktów",
@@ -1319,6 +1323,9 @@
1319
1323
  "customers.deals.kanban.filter.searchPlaceholder": "Szukaj…",
1320
1324
  "customers.deals.kanban.filter.selected": "zaznaczono",
1321
1325
  "customers.deals.kanban.filter.status": "Status",
1326
+ "customers.deals.kanban.filter.status.closed": "Zamknięta",
1327
+ "customers.deals.kanban.filter.status.inProgress": "W toku",
1328
+ "customers.deals.kanban.filter.status.loading": "Ładowanie statusów…",
1322
1329
  "customers.deals.kanban.filter.status.lost": "Przegrana",
1323
1330
  "customers.deals.kanban.filter.status.open": "Otwarta",
1324
1331
  "customers.deals.kanban.filter.status.title": "Filtr · Status",
@@ -2409,6 +2416,7 @@
2409
2416
  "customers.personTags.newLabel": "Nowa etykieta",
2410
2417
  "customers.personTags.newLabelPlaceholder": "Nazwa etykiety...",
2411
2418
  "customers.personTags.newTag": "Nowy tag",
2419
+ "customers.personTags.retry": "Ponów próbę",
2412
2420
  "customers.personTags.save": "Zapisz",
2413
2421
  "customers.personTags.saveError": "Nie udało się zapisać tagów",
2414
2422
  "customers.personTags.saveSuccess": "Tagi zostały zaktualizowane.",
@@ -1,4 +1,5 @@
1
1
  import type { CalendarItem, CalendarItemStatus, CalendarParticipant } from '../../components/calendar/types'
2
+ import { participantActorKey } from './participantIdentity'
2
3
  import type { ConflictScope } from './preferences'
3
4
 
4
5
  export const EDITOR_DRAFT_CONFLICT_ID = '__draft__'
@@ -14,8 +15,15 @@ export type FindConflictsOptions = {
14
15
  function sharesActor(first: CalendarItem, second: CalendarItem): boolean {
15
16
  if (first.ownerUserId && second.ownerUserId && first.ownerUserId === second.ownerUserId) return true
16
17
  if (first.participants.length === 0 || second.participants.length === 0) return false
17
- const firstParticipantIds = new Set(first.participants.map((participant) => participant.userId))
18
- return second.participants.some((participant) => firstParticipantIds.has(participant.userId))
18
+ const firstActorKeys = new Set(
19
+ first.participants
20
+ .map(participantActorKey)
21
+ .filter((actorKey): actorKey is string => actorKey !== null),
22
+ )
23
+ return second.participants.some((participant) => {
24
+ const actorKey = participantActorKey(participant)
25
+ return actorKey !== null && firstActorKeys.has(actorKey)
26
+ })
19
27
  }
20
28
 
21
29
  function isActor(item: CalendarItem, userId: string): boolean {
@@ -112,7 +112,7 @@ export type EditorRelatedTo = {
112
112
  }
113
113
 
114
114
  export type EditorParticipant = {
115
- userId: string
115
+ userId?: string
116
116
  name: string
117
117
  email?: string
118
118
  isCustomer: boolean
@@ -405,13 +405,14 @@ function parseParticipants(item: CalendarItem): EditorParticipant[] {
405
405
  const rawParticipants = Array.isArray(item.raw.participants) ? item.raw.participants : []
406
406
  const statusByUserId = new Map<string, string | null>()
407
407
  for (const raw of rawParticipants) {
408
+ if (!raw.userId) continue
408
409
  statusByUserId.set(raw.userId, readUnknownString((raw as Record<string, unknown>).status))
409
410
  }
410
411
  return item.participants.map((participant) => ({
411
412
  userId: participant.userId,
412
- name: participant.name ?? participant.email ?? participant.userId,
413
+ name: participant.name ?? participant.email ?? participant.userId ?? '',
413
414
  email: participant.email,
414
- isCustomer: statusByUserId.get(participant.userId) === 'customer',
415
+ isCustomer: participant.userId ? statusByUserId.get(participant.userId) === 'customer' : false,
415
416
  }))
416
417
  }
417
418
 
@@ -10,6 +10,7 @@ import type {
10
10
  CalendarPlatform,
11
11
  } from '../../components/calendar/types'
12
12
  import { categoryOf } from './categories'
13
+ import { participantActorKey } from './participantIdentity'
13
14
 
14
15
  const DEFAULT_DURATION_MINUTES = 30
15
16
 
@@ -43,9 +44,13 @@ function mapParticipants(payload: CalendarInteractionPayload): CalendarParticipa
43
44
  const seen = new Set<string>()
44
45
  const mapped: CalendarParticipant[] = []
45
46
  for (const participant of participants) {
46
- if (seen.has(participant.userId)) continue
47
- seen.add(participant.userId)
48
- const entry: CalendarParticipant = { userId: participant.userId }
47
+ const dedupeKey = participantActorKey(participant)
48
+ if (dedupeKey) {
49
+ if (seen.has(dedupeKey)) continue
50
+ seen.add(dedupeKey)
51
+ }
52
+ const entry: CalendarParticipant = {}
53
+ if (typeof participant.userId === 'string') entry.userId = participant.userId
49
54
  if (typeof participant.name === 'string') entry.name = participant.name
50
55
  if (typeof participant.email === 'string') entry.email = participant.email
51
56
  mapped.push(entry)
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The one canonical actor key for a calendar participant.
3
+ *
4
+ * A staff/customer attendee is identified by `userId`. An external guest has no
5
+ * record in the system, so the normalized email is the only stable identity it
6
+ * carries. Mapping, dedupe, conflict detection and the editor's conflict-probe
7
+ * dependency key all derive their key from here, so a guest is treated as the
8
+ * same actor across events instead of dropping out of actor comparisons.
9
+ *
10
+ * Returns `null` for a participant with neither — such a participant cannot be
11
+ * compared to any other and must never collide with one that can.
12
+ */
13
+ export function participantActorKey(participant: { userId?: string; email?: string }): string | null {
14
+ if (participant.userId) return `user:${participant.userId}`
15
+ const email = participant.email?.trim().toLowerCase()
16
+ return email ? `email:${email}` : null
17
+ }