@open-mercato/core 0.5.1-develop.2663.2c29774b5b → 0.5.1-develop.2681.c559bb2bc3

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 (687) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/generated/entities/action_log/index.js +8 -0
  3. package/dist/generated/entities/action_log/index.js.map +2 -2
  4. package/dist/generated/entities/customer_company_billing/index.js +23 -0
  5. package/dist/generated/entities/customer_company_billing/index.js.map +7 -0
  6. package/dist/generated/entities/customer_deal/index.js +8 -0
  7. package/dist/generated/entities/customer_deal/index.js.map +2 -2
  8. package/dist/generated/entities/customer_deal_stage_transition/index.js +31 -0
  9. package/dist/generated/entities/customer_deal_stage_transition/index.js.map +7 -0
  10. package/dist/generated/entities/customer_dictionary_kind_setting/index.js +21 -0
  11. package/dist/generated/entities/customer_dictionary_kind_setting/index.js.map +7 -0
  12. package/dist/generated/entities/customer_entity/index.js +8 -0
  13. package/dist/generated/entities/customer_entity/index.js.map +2 -2
  14. package/dist/generated/entities/customer_entity_role/index.js +23 -0
  15. package/dist/generated/entities/customer_entity_role/index.js.map +7 -0
  16. package/dist/generated/entities/customer_interaction/index.js +23 -1
  17. package/dist/generated/entities/customer_interaction/index.js.map +2 -2
  18. package/dist/generated/entities/customer_label/index.js +19 -0
  19. package/dist/generated/entities/customer_label/index.js.map +7 -0
  20. package/dist/generated/entities/customer_label_assignment/index.js +17 -0
  21. package/dist/generated/entities/customer_label_assignment/index.js.map +7 -0
  22. package/dist/generated/entities/customer_person_company_link/index.js +21 -0
  23. package/dist/generated/entities/customer_person_company_link/index.js.map +7 -0
  24. package/dist/generated/entities/customer_person_company_role/index.js +17 -0
  25. package/dist/generated/entities/customer_person_company_role/index.js.map +7 -0
  26. package/dist/generated/entities/dictionary_entry/index.js +4 -0
  27. package/dist/generated/entities/dictionary_entry/index.js.map +2 -2
  28. package/dist/generated/entities.ids.generated.js +9 -1
  29. package/dist/generated/entities.ids.generated.js.map +2 -2
  30. package/dist/generated/entity-fields-registry.js +116 -1
  31. package/dist/generated/entity-fields-registry.js.map +2 -2
  32. package/dist/modules/attachments/api/route.js +46 -8
  33. package/dist/modules/attachments/api/route.js.map +2 -2
  34. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js +208 -0
  35. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js.map +7 -0
  36. package/dist/modules/audit_logs/api/audit-logs/actions/route.js +52 -6
  37. package/dist/modules/audit_logs/api/audit-logs/actions/route.js.map +2 -2
  38. package/dist/modules/audit_logs/cli.js +62 -0
  39. package/dist/modules/audit_logs/cli.js.map +7 -0
  40. package/dist/modules/audit_logs/data/entities.js +21 -1
  41. package/dist/modules/audit_logs/data/entities.js.map +2 -2
  42. package/dist/modules/audit_logs/data/validators.js +9 -1
  43. package/dist/modules/audit_logs/data/validators.js.map +2 -2
  44. package/dist/modules/audit_logs/lib/changeRows.js +34 -0
  45. package/dist/modules/audit_logs/lib/changeRows.js.map +7 -0
  46. package/dist/modules/audit_logs/lib/display-helpers.js +2 -20
  47. package/dist/modules/audit_logs/lib/display-helpers.js.map +3 -3
  48. package/dist/modules/audit_logs/lib/projections.js +58 -0
  49. package/dist/modules/audit_logs/lib/projections.js.map +7 -0
  50. package/dist/modules/audit_logs/migrations/Migration20260412160533.js +21 -0
  51. package/dist/modules/audit_logs/migrations/Migration20260412160533.js.map +7 -0
  52. package/dist/modules/audit_logs/services/actionLogService.js +313 -79
  53. package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
  54. package/dist/modules/customers/acl.js +3 -1
  55. package/dist/modules/customers/acl.js.map +2 -2
  56. package/dist/modules/customers/api/activities/route.js +4 -0
  57. package/dist/modules/customers/api/activities/route.js.map +2 -2
  58. package/dist/modules/customers/api/assignable-staff/route.js +208 -0
  59. package/dist/modules/customers/api/assignable-staff/route.js.map +7 -0
  60. package/dist/modules/customers/api/companies/[id]/people/route.js +205 -0
  61. package/dist/modules/customers/api/companies/[id]/people/route.js.map +7 -0
  62. package/dist/modules/customers/api/companies/[id]/roles/route.js +22 -0
  63. package/dist/modules/customers/api/companies/[id]/roles/route.js.map +7 -0
  64. package/dist/modules/customers/api/companies/[id]/route.js +374 -32
  65. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  66. package/dist/modules/customers/api/companies/route.js +82 -7
  67. package/dist/modules/customers/api/companies/route.js.map +2 -2
  68. package/dist/modules/customers/api/deals/[id]/companies/route.js +172 -0
  69. package/dist/modules/customers/api/deals/[id]/companies/route.js.map +7 -0
  70. package/dist/modules/customers/api/deals/[id]/people/route.js +156 -0
  71. package/dist/modules/customers/api/deals/[id]/people/route.js.map +7 -0
  72. package/dist/modules/customers/api/deals/[id]/route.js +459 -53
  73. package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
  74. package/dist/modules/customers/api/deals/[id]/stats/route.js +195 -0
  75. package/dist/modules/customers/api/deals/[id]/stats/route.js.map +7 -0
  76. package/dist/modules/customers/api/deals/route.js +20 -10
  77. package/dist/modules/customers/api/deals/route.js.map +3 -3
  78. package/dist/modules/customers/api/dictionaries/[kind]/[id]/route.js +105 -4
  79. package/dist/modules/customers/api/dictionaries/[kind]/[id]/route.js.map +2 -2
  80. package/dist/modules/customers/api/dictionaries/[kind]/route.js +118 -42
  81. package/dist/modules/customers/api/dictionaries/[kind]/route.js.map +2 -2
  82. package/dist/modules/customers/api/dictionaries/context.js +30 -6
  83. package/dist/modules/customers/api/dictionaries/context.js.map +2 -2
  84. package/dist/modules/customers/api/dictionaries/kind-settings/route.js +207 -0
  85. package/dist/modules/customers/api/dictionaries/kind-settings/route.js.map +7 -0
  86. package/dist/modules/customers/api/entity-roles-factory.js +471 -0
  87. package/dist/modules/customers/api/entity-roles-factory.js.map +7 -0
  88. package/dist/modules/customers/api/interactions/conflicts/route.js +158 -0
  89. package/dist/modules/customers/api/interactions/conflicts/route.js.map +7 -0
  90. package/dist/modules/customers/api/interactions/counts/route.js +92 -0
  91. package/dist/modules/customers/api/interactions/counts/route.js.map +7 -0
  92. package/dist/modules/customers/api/interactions/route.js +83 -4
  93. package/dist/modules/customers/api/interactions/route.js.map +2 -2
  94. package/dist/modules/customers/api/labels/assign/route.js +189 -0
  95. package/dist/modules/customers/api/labels/assign/route.js.map +7 -0
  96. package/dist/modules/customers/api/labels/auth.js +17 -0
  97. package/dist/modules/customers/api/labels/auth.js.map +7 -0
  98. package/dist/modules/customers/api/labels/route.js +281 -0
  99. package/dist/modules/customers/api/labels/route.js.map +7 -0
  100. package/dist/modules/customers/api/labels/table-errors.js +38 -0
  101. package/dist/modules/customers/api/labels/table-errors.js.map +7 -0
  102. package/dist/modules/customers/api/labels/unassign/route.js +184 -0
  103. package/dist/modules/customers/api/labels/unassign/route.js.map +7 -0
  104. package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +292 -0
  105. package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +7 -0
  106. package/dist/modules/customers/api/people/[id]/companies/context.js +66 -0
  107. package/dist/modules/customers/api/people/[id]/companies/context.js.map +7 -0
  108. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +334 -0
  109. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +7 -0
  110. package/dist/modules/customers/api/people/[id]/companies/route.js +205 -0
  111. package/dist/modules/customers/api/people/[id]/companies/route.js.map +7 -0
  112. package/dist/modules/customers/api/people/[id]/roles/route.js +22 -0
  113. package/dist/modules/customers/api/people/[id]/roles/route.js.map +7 -0
  114. package/dist/modules/customers/api/people/[id]/route.js +134 -21
  115. package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
  116. package/dist/modules/customers/api/people/route.js +122 -23
  117. package/dist/modules/customers/api/people/route.js.map +2 -2
  118. package/dist/modules/customers/api/todos/route.js +4 -0
  119. package/dist/modules/customers/api/todos/route.js.map +2 -2
  120. package/dist/modules/customers/api/utils.js +22 -0
  121. package/dist/modules/customers/api/utils.js.map +2 -2
  122. package/dist/modules/customers/backend/config/customers/page.js +2 -6
  123. package/dist/modules/customers/backend/config/customers/page.js.map +2 -2
  124. package/dist/modules/customers/backend/customers/companies/page.js +37 -26
  125. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  126. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +265 -262
  127. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +3 -3
  128. package/dist/modules/customers/backend/customers/deals/[id]/hooks/formatters.js +23 -0
  129. package/dist/modules/customers/backend/customers/deals/[id]/hooks/formatters.js.map +7 -0
  130. package/dist/modules/customers/backend/customers/deals/[id]/hooks/types.js +1 -0
  131. package/dist/modules/customers/backend/customers/deals/[id]/hooks/types.js.map +7 -0
  132. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js +43 -0
  133. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js.map +7 -0
  134. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.js +264 -0
  135. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.js.map +7 -0
  136. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.js +88 -0
  137. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.js.map +7 -0
  138. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealData.js +41 -0
  139. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealData.js.map +7 -0
  140. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js +66 -0
  141. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js.map +7 -0
  142. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.js +39 -0
  143. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.js.map +7 -0
  144. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.js +49 -0
  145. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.js.map +7 -0
  146. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.js +43 -0
  147. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.js.map +7 -0
  148. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.js +28 -0
  149. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.js.map +7 -0
  150. package/dist/modules/customers/backend/customers/deals/[id]/page.js +556 -503
  151. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +3 -3
  152. package/dist/modules/customers/backend/customers/deals/page.js +66 -21
  153. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  154. package/dist/modules/customers/backend/customers/people/page.js +36 -28
  155. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  156. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +318 -203
  157. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +3 -3
  158. package/dist/modules/customers/cli.js +105 -13
  159. package/dist/modules/customers/cli.js.map +2 -2
  160. package/dist/modules/customers/commands/activities.js +6 -0
  161. package/dist/modules/customers/commands/activities.js.map +2 -2
  162. package/dist/modules/customers/commands/deals.js +315 -107
  163. package/dist/modules/customers/commands/deals.js.map +2 -2
  164. package/dist/modules/customers/commands/dictionaries.js +166 -32
  165. package/dist/modules/customers/commands/dictionaries.js.map +2 -2
  166. package/dist/modules/customers/commands/dictionaryKindSettings.js +208 -0
  167. package/dist/modules/customers/commands/dictionaryKindSettings.js.map +7 -0
  168. package/dist/modules/customers/commands/entity-roles.js +415 -0
  169. package/dist/modules/customers/commands/entity-roles.js.map +7 -0
  170. package/dist/modules/customers/commands/index.js +4 -0
  171. package/dist/modules/customers/commands/index.js.map +2 -2
  172. package/dist/modules/customers/commands/interactions.js +108 -21
  173. package/dist/modules/customers/commands/interactions.js.map +2 -2
  174. package/dist/modules/customers/commands/labels.js +539 -0
  175. package/dist/modules/customers/commands/labels.js.map +7 -0
  176. package/dist/modules/customers/commands/people.js +560 -463
  177. package/dist/modules/customers/commands/people.js.map +3 -3
  178. package/dist/modules/customers/commands/personCompanyLinks.js +568 -0
  179. package/dist/modules/customers/commands/personCompanyLinks.js.map +7 -0
  180. package/dist/modules/customers/commands/shared.js +12 -4
  181. package/dist/modules/customers/commands/shared.js.map +2 -2
  182. package/dist/modules/customers/commands/todos.js +10 -1
  183. package/dist/modules/customers/commands/todos.js.map +2 -2
  184. package/dist/modules/customers/components/AddressEditor.js +1 -1
  185. package/dist/modules/customers/components/AddressEditor.js.map +2 -2
  186. package/dist/modules/customers/components/CustomersConfigurationSections.js +31 -0
  187. package/dist/modules/customers/components/CustomersConfigurationSections.js.map +7 -0
  188. package/dist/modules/customers/components/DictionarySettings.js +37 -2
  189. package/dist/modules/customers/components/DictionarySettings.js.map +2 -2
  190. package/dist/modules/customers/components/detail/ActiveDealCard.js +121 -0
  191. package/dist/modules/customers/components/detail/ActiveDealCard.js.map +7 -0
  192. package/dist/modules/customers/components/detail/ActivitiesSection.js +222 -331
  193. package/dist/modules/customers/components/detail/ActivitiesSection.js.map +3 -3
  194. package/dist/modules/customers/components/detail/ActivityAiActions.js +36 -0
  195. package/dist/modules/customers/components/detail/ActivityAiActions.js.map +7 -0
  196. package/dist/modules/customers/components/detail/ActivityCard.js +126 -0
  197. package/dist/modules/customers/components/detail/ActivityCard.js.map +7 -0
  198. package/dist/modules/customers/components/detail/ActivityHistorySection.js +340 -0
  199. package/dist/modules/customers/components/detail/ActivityHistorySection.js.map +7 -0
  200. package/dist/modules/customers/components/detail/ActivityLogTab.js +56 -0
  201. package/dist/modules/customers/components/detail/ActivityLogTab.js.map +7 -0
  202. package/dist/modules/customers/components/detail/ActivityTimeline.js +108 -0
  203. package/dist/modules/customers/components/detail/ActivityTimeline.js.map +7 -0
  204. package/dist/modules/customers/components/detail/ActivityTimelineFilters.js +139 -0
  205. package/dist/modules/customers/components/detail/ActivityTimelineFilters.js.map +7 -0
  206. package/dist/modules/customers/components/detail/ActivityTypeSelector.js +42 -0
  207. package/dist/modules/customers/components/detail/ActivityTypeSelector.js.map +7 -0
  208. package/dist/modules/customers/components/detail/AiActionChips.js +38 -0
  209. package/dist/modules/customers/components/detail/AiActionChips.js.map +7 -0
  210. package/dist/modules/customers/components/detail/AssignRoleDialog.js +534 -0
  211. package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +7 -0
  212. package/dist/modules/customers/components/detail/ChangelogEntryRow.js +79 -0
  213. package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +7 -0
  214. package/dist/modules/customers/components/detail/ChangelogFilters.js +176 -0
  215. package/dist/modules/customers/components/detail/ChangelogFilters.js.map +7 -0
  216. package/dist/modules/customers/components/detail/ChangelogKpiCards.js +88 -0
  217. package/dist/modules/customers/components/detail/ChangelogKpiCards.js.map +7 -0
  218. package/dist/modules/customers/components/detail/ChangelogTab.js +470 -0
  219. package/dist/modules/customers/components/detail/ChangelogTab.js.map +7 -0
  220. package/dist/modules/customers/components/detail/ComingSoonPlaceholder.js +16 -0
  221. package/dist/modules/customers/components/detail/ComingSoonPlaceholder.js.map +7 -0
  222. package/dist/modules/customers/components/detail/CompanyCard.js +283 -0
  223. package/dist/modules/customers/components/detail/CompanyCard.js.map +7 -0
  224. package/dist/modules/customers/components/detail/CompanyDashboardTab.js +133 -0
  225. package/dist/modules/customers/components/detail/CompanyDashboardTab.js.map +7 -0
  226. package/dist/modules/customers/components/detail/CompanyDetailHeader.js +191 -0
  227. package/dist/modules/customers/components/detail/CompanyDetailHeader.js.map +7 -0
  228. package/dist/modules/customers/components/detail/CompanyDetailTabs.js +123 -0
  229. package/dist/modules/customers/components/detail/CompanyDetailTabs.js.map +7 -0
  230. package/dist/modules/customers/components/detail/CompanyKpiBar.js +174 -0
  231. package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +7 -0
  232. package/dist/modules/customers/components/detail/CompanyPeopleSection.js +514 -230
  233. package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
  234. package/dist/modules/customers/components/detail/CompanyTagsDialog.js +22 -0
  235. package/dist/modules/customers/components/detail/CompanyTagsDialog.js.map +7 -0
  236. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +159 -0
  237. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +7 -0
  238. package/dist/modules/customers/components/detail/CreatePersonDialog.js +135 -0
  239. package/dist/modules/customers/components/detail/CreatePersonDialog.js.map +7 -0
  240. package/dist/modules/customers/components/detail/DealClosureActionBar.js +59 -0
  241. package/dist/modules/customers/components/detail/DealClosureActionBar.js.map +7 -0
  242. package/dist/modules/customers/components/detail/DealDetailHeader.js +237 -0
  243. package/dist/modules/customers/components/detail/DealDetailHeader.js.map +7 -0
  244. package/dist/modules/customers/components/detail/DealDetailTabs.js +109 -0
  245. package/dist/modules/customers/components/detail/DealDetailTabs.js.map +7 -0
  246. package/dist/modules/customers/components/detail/DealForm.js +219 -92
  247. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  248. package/dist/modules/customers/components/detail/DealLinkedEntitiesTab.js +295 -0
  249. package/dist/modules/customers/components/detail/DealLinkedEntitiesTab.js.map +7 -0
  250. package/dist/modules/customers/components/detail/DealLostSummaryDialog.js +107 -0
  251. package/dist/modules/customers/components/detail/DealLostSummaryDialog.js.map +7 -0
  252. package/dist/modules/customers/components/detail/DealWonPopup.js +113 -0
  253. package/dist/modules/customers/components/detail/DealWonPopup.js.map +7 -0
  254. package/dist/modules/customers/components/detail/DealsSection.js +206 -193
  255. package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
  256. package/dist/modules/customers/components/detail/DecisionMakersFooter.js +39 -0
  257. package/dist/modules/customers/components/detail/DecisionMakersFooter.js.map +7 -0
  258. package/dist/modules/customers/components/detail/EntityTagsDialog.js +1096 -0
  259. package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +7 -0
  260. package/dist/modules/customers/components/detail/InlineActivityComposer.js +197 -0
  261. package/dist/modules/customers/components/detail/InlineActivityComposer.js.map +7 -0
  262. package/dist/modules/customers/components/detail/ManageTagsDialog.js +1091 -0
  263. package/dist/modules/customers/components/detail/ManageTagsDialog.js.map +7 -0
  264. package/dist/modules/customers/components/detail/MiniWeekCalendar.js +272 -0
  265. package/dist/modules/customers/components/detail/MiniWeekCalendar.js.map +7 -0
  266. package/dist/modules/customers/components/detail/MobilePersonDetail.js +106 -0
  267. package/dist/modules/customers/components/detail/MobilePersonDetail.js.map +7 -0
  268. package/dist/modules/customers/components/detail/NextStepCard.js +72 -0
  269. package/dist/modules/customers/components/detail/NextStepCard.js.map +7 -0
  270. package/dist/modules/customers/components/detail/PersonCard.js +192 -0
  271. package/dist/modules/customers/components/detail/PersonCard.js.map +7 -0
  272. package/dist/modules/customers/components/detail/PersonCompaniesSection.js +345 -0
  273. package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +7 -0
  274. package/dist/modules/customers/components/detail/PersonDetailHeader.js +220 -0
  275. package/dist/modules/customers/components/detail/PersonDetailHeader.js.map +7 -0
  276. package/dist/modules/customers/components/detail/PersonDetailTabs.js +122 -0
  277. package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +7 -0
  278. package/dist/modules/customers/components/detail/PersonTagsDialog.js +24 -0
  279. package/dist/modules/customers/components/detail/PersonTagsDialog.js.map +7 -0
  280. package/dist/modules/customers/components/detail/PipelineStepper.js +191 -0
  281. package/dist/modules/customers/components/detail/PipelineStepper.js.map +7 -0
  282. package/dist/modules/customers/components/detail/PlannedActivitiesSection.js +222 -0
  283. package/dist/modules/customers/components/detail/PlannedActivitiesSection.js.map +7 -0
  284. package/dist/modules/customers/components/detail/RelationshipHealthCard.js +49 -0
  285. package/dist/modules/customers/components/detail/RelationshipHealthCard.js.map +7 -0
  286. package/dist/modules/customers/components/detail/RoleAssignmentRow.js +189 -0
  287. package/dist/modules/customers/components/detail/RoleAssignmentRow.js.map +7 -0
  288. package/dist/modules/customers/components/detail/RolesSection.js +234 -0
  289. package/dist/modules/customers/components/detail/RolesSection.js.map +7 -0
  290. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +410 -0
  291. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +7 -0
  292. package/dist/modules/customers/components/detail/aiActionCatalog.js +41 -0
  293. package/dist/modules/customers/components/detail/aiActionCatalog.js.map +7 -0
  294. package/dist/modules/customers/components/detail/assignableStaff.js +48 -0
  295. package/dist/modules/customers/components/detail/assignableStaff.js.map +7 -0
  296. package/dist/modules/customers/components/detail/dashboard/ActiveDealWidget.js +48 -0
  297. package/dist/modules/customers/components/detail/dashboard/ActiveDealWidget.js.map +7 -0
  298. package/dist/modules/customers/components/detail/dashboard/OpenTasksWidget.js +86 -0
  299. package/dist/modules/customers/components/detail/dashboard/OpenTasksWidget.js.map +7 -0
  300. package/dist/modules/customers/components/detail/dashboard/RecentActivityWidget.js +53 -0
  301. package/dist/modules/customers/components/detail/dashboard/RecentActivityWidget.js.map +7 -0
  302. package/dist/modules/customers/components/detail/dashboard/RelationshipHealthWidget.js +30 -0
  303. package/dist/modules/customers/components/detail/dashboard/RelationshipHealthWidget.js.map +7 -0
  304. package/dist/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.js +43 -0
  305. package/dist/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.js.map +7 -0
  306. package/dist/modules/customers/components/detail/dashboard/helpers.js +71 -0
  307. package/dist/modules/customers/components/detail/dashboard/helpers.js.map +7 -0
  308. package/dist/modules/customers/components/detail/healthScoreUtils.js +69 -0
  309. package/dist/modules/customers/components/detail/healthScoreUtils.js.map +7 -0
  310. package/dist/modules/customers/components/detail/hooks/useCurrencyDictionary.js +5 -5
  311. package/dist/modules/customers/components/detail/hooks/useCurrencyDictionary.js.map +2 -2
  312. package/dist/modules/customers/components/detail/hooks/useCustomerDictionary.js +9 -8
  313. package/dist/modules/customers/components/detail/hooks/useCustomerDictionary.js.map +3 -3
  314. package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js +65 -0
  315. package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js.map +7 -0
  316. package/dist/modules/customers/components/detail/notesAdapter.js +70 -30
  317. package/dist/modules/customers/components/detail/notesAdapter.js.map +2 -2
  318. package/dist/modules/customers/components/detail/pipelineStageUtils.js +26 -0
  319. package/dist/modules/customers/components/detail/pipelineStageUtils.js.map +7 -0
  320. package/dist/modules/customers/components/detail/schedule/DateTimeFields.js +144 -0
  321. package/dist/modules/customers/components/detail/schedule/DateTimeFields.js.map +7 -0
  322. package/dist/modules/customers/components/detail/schedule/FooterFields.js +60 -0
  323. package/dist/modules/customers/components/detail/schedule/FooterFields.js.map +7 -0
  324. package/dist/modules/customers/components/detail/schedule/LinkedEntitiesField.js +216 -0
  325. package/dist/modules/customers/components/detail/schedule/LinkedEntitiesField.js.map +7 -0
  326. package/dist/modules/customers/components/detail/schedule/LocationField.js +34 -0
  327. package/dist/modules/customers/components/detail/schedule/LocationField.js.map +7 -0
  328. package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +226 -0
  329. package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +7 -0
  330. package/dist/modules/customers/components/detail/schedule/fieldConfig.js +69 -0
  331. package/dist/modules/customers/components/detail/schedule/fieldConfig.js.map +7 -0
  332. package/dist/modules/customers/components/detail/schedule/index.js +21 -0
  333. package/dist/modules/customers/components/detail/schedule/index.js.map +7 -0
  334. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +172 -0
  335. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +7 -0
  336. package/dist/modules/customers/components/detail/utils.js +23 -0
  337. package/dist/modules/customers/components/detail/utils.js.map +2 -2
  338. package/dist/modules/customers/components/formConfig.js +144 -22
  339. package/dist/modules/customers/components/formConfig.js.map +2 -2
  340. package/dist/modules/customers/components/linking/LinkEntityDialog.js +661 -0
  341. package/dist/modules/customers/components/linking/LinkEntityDialog.js.map +7 -0
  342. package/dist/modules/customers/components/linking/adapters/companyAdapter.js +252 -0
  343. package/dist/modules/customers/components/linking/adapters/companyAdapter.js.map +7 -0
  344. package/dist/modules/customers/components/linking/adapters/dealAdapter.js +384 -0
  345. package/dist/modules/customers/components/linking/adapters/dealAdapter.js.map +7 -0
  346. package/dist/modules/customers/components/linking/adapters/personAdapter.js +324 -0
  347. package/dist/modules/customers/components/linking/adapters/personAdapter.js.map +7 -0
  348. package/dist/modules/customers/components/list/CollectionPreviewCell.js +53 -0
  349. package/dist/modules/customers/components/list/CollectionPreviewCell.js.map +7 -0
  350. package/dist/modules/customers/data/entities.js +407 -1
  351. package/dist/modules/customers/data/entities.js.map +2 -2
  352. package/dist/modules/customers/data/validators.js +139 -21
  353. package/dist/modules/customers/data/validators.js.map +2 -2
  354. package/dist/modules/customers/events.js +19 -1
  355. package/dist/modules/customers/events.js.map +2 -2
  356. package/dist/modules/customers/lib/customerRoleTypes.js +19 -0
  357. package/dist/modules/customers/lib/customerRoleTypes.js.map +7 -0
  358. package/dist/modules/customers/lib/dealClosureNotification.js +39 -0
  359. package/dist/modules/customers/lib/dealClosureNotification.js.map +7 -0
  360. package/dist/modules/customers/lib/dealStageTransitionTable.js +29 -0
  361. package/dist/modules/customers/lib/dealStageTransitionTable.js.map +7 -0
  362. package/dist/modules/customers/lib/dictionaries.js +25 -0
  363. package/dist/modules/customers/lib/dictionaries.js.map +2 -2
  364. package/dist/modules/customers/lib/interactionReadModel.js +10 -0
  365. package/dist/modules/customers/lib/interactionReadModel.js.map +2 -2
  366. package/dist/modules/customers/lib/personCompanies.js +235 -0
  367. package/dist/modules/customers/lib/personCompanies.js.map +7 -0
  368. package/dist/modules/customers/lib/personCompanyLinkTable.js +42 -0
  369. package/dist/modules/customers/lib/personCompanyLinkTable.js.map +7 -0
  370. package/dist/modules/customers/lib/roleTypeUsage.js +104 -0
  371. package/dist/modules/customers/lib/roleTypeUsage.js.map +7 -0
  372. package/dist/modules/customers/migrations/Migration20260406214502.js +18 -0
  373. package/dist/modules/customers/migrations/Migration20260406214502.js.map +7 -0
  374. package/dist/modules/customers/migrations/Migration20260408135736.js +17 -0
  375. package/dist/modules/customers/migrations/Migration20260408135736.js.map +7 -0
  376. package/dist/modules/customers/migrations/Migration20260408225345.js +21 -0
  377. package/dist/modules/customers/migrations/Migration20260408225345.js.map +7 -0
  378. package/dist/modules/customers/migrations/Migration20260411075533.js +27 -0
  379. package/dist/modules/customers/migrations/Migration20260411075533.js.map +7 -0
  380. package/dist/modules/customers/migrations/Migration20260411103551.js +13 -0
  381. package/dist/modules/customers/migrations/Migration20260411103551.js.map +7 -0
  382. package/dist/modules/customers/migrations/Migration20260411130944.js +26 -0
  383. package/dist/modules/customers/migrations/Migration20260411130944.js.map +7 -0
  384. package/dist/modules/customers/migrations/Migration20260415095203.js +13 -0
  385. package/dist/modules/customers/migrations/Migration20260415095203.js.map +7 -0
  386. package/dist/modules/customers/migrations/Migration20260415135056.js +20 -0
  387. package/dist/modules/customers/migrations/Migration20260415135056.js.map +7 -0
  388. package/dist/modules/customers/migrations/Migration20260417140000.js +15 -0
  389. package/dist/modules/customers/migrations/Migration20260417140000.js.map +7 -0
  390. package/dist/modules/customers/migrations/Migration20260417160000.js +17 -0
  391. package/dist/modules/customers/migrations/Migration20260417160000.js.map +7 -0
  392. package/dist/modules/customers/migrations/Migration20260417235407.js +13 -0
  393. package/dist/modules/customers/migrations/Migration20260417235407.js.map +7 -0
  394. package/dist/modules/customers/setup.js +16 -1
  395. package/dist/modules/customers/setup.js.map +2 -2
  396. package/dist/modules/customers/subscribers/deal-closure-notification.js +16 -0
  397. package/dist/modules/customers/subscribers/deal-closure-notification.js.map +7 -0
  398. package/dist/modules/customers/subscribers/deal-lost-notification.js +16 -0
  399. package/dist/modules/customers/subscribers/deal-lost-notification.js.map +7 -0
  400. package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js +2 -0
  401. package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js.map +2 -2
  402. package/dist/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.js +154 -0
  403. package/dist/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.js.map +7 -0
  404. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js +6 -2
  405. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js.map +2 -2
  406. package/dist/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.js +154 -0
  407. package/dist/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.js.map +7 -0
  408. package/dist/modules/dictionaries/api/context.js +8 -1
  409. package/dist/modules/dictionaries/api/context.js.map +2 -2
  410. package/dist/modules/dictionaries/api/openapi.js +18 -1
  411. package/dist/modules/dictionaries/api/openapi.js.map +2 -2
  412. package/dist/modules/dictionaries/commands/entry-operations.js +388 -0
  413. package/dist/modules/dictionaries/commands/entry-operations.js.map +7 -0
  414. package/dist/modules/dictionaries/commands/factory.js +24 -3
  415. package/dist/modules/dictionaries/commands/factory.js.map +2 -2
  416. package/dist/modules/dictionaries/commands/index.js +1 -0
  417. package/dist/modules/dictionaries/commands/index.js.map +2 -2
  418. package/dist/modules/dictionaries/components/DictionaryTable.js +6 -3
  419. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  420. package/dist/modules/dictionaries/data/entities.js +11 -1
  421. package/dist/modules/dictionaries/data/entities.js.map +2 -2
  422. package/dist/modules/dictionaries/data/validators.js +28 -2
  423. package/dist/modules/dictionaries/data/validators.js.map +2 -2
  424. package/dist/modules/dictionaries/events.js +18 -0
  425. package/dist/modules/dictionaries/events.js.map +7 -0
  426. package/dist/modules/dictionaries/lib/clientEntries.js +43 -0
  427. package/dist/modules/dictionaries/lib/clientEntries.js.map +7 -0
  428. package/dist/modules/dictionaries/migrations/Migration20260410171544.js +45 -0
  429. package/dist/modules/dictionaries/migrations/Migration20260410171544.js.map +7 -0
  430. package/dist/modules/inbox_ops/api/proposals/[id]/route.js +4 -1
  431. package/dist/modules/inbox_ops/api/proposals/[id]/route.js.map +2 -2
  432. package/dist/modules/query_index/lib/engine.js +1 -1
  433. package/dist/modules/query_index/lib/engine.js.map +2 -2
  434. package/dist/modules/sales/components/documents/AddressesSection.js +82 -42
  435. package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
  436. package/dist/modules/sales/lib/dictionaries.js +16 -0
  437. package/dist/modules/sales/lib/dictionaries.js.map +2 -2
  438. package/dist/modules/sales/widgets/injection-table.js +5 -1
  439. package/dist/modules/sales/widgets/injection-table.js.map +2 -2
  440. package/generated/entities/action_log/index.ts +4 -0
  441. package/generated/entities/customer_company_billing/index.ts +10 -0
  442. package/generated/entities/customer_deal/index.ts +4 -0
  443. package/generated/entities/customer_deal_stage_transition/index.ts +14 -0
  444. package/generated/entities/customer_dictionary_kind_setting/index.ts +9 -0
  445. package/generated/entities/customer_entity/index.ts +4 -0
  446. package/generated/entities/customer_entity_role/index.ts +10 -0
  447. package/generated/entities/customer_interaction/index.ts +11 -0
  448. package/generated/entities/customer_label/index.ts +8 -0
  449. package/generated/entities/customer_label_assignment/index.ts +7 -0
  450. package/generated/entities/customer_person_company_link/index.ts +9 -0
  451. package/generated/entities/customer_person_company_role/index.ts +7 -0
  452. package/generated/entities/dictionary_entry/index.ts +2 -0
  453. package/generated/entities.ids.generated.ts +9 -1
  454. package/generated/entity-fields-registry.ts +116 -1
  455. package/package.json +3 -3
  456. package/src/modules/attachments/api/route.ts +48 -6
  457. package/src/modules/attachments/i18n/de.json +4 -0
  458. package/src/modules/attachments/i18n/en.json +4 -0
  459. package/src/modules/attachments/i18n/es.json +4 -0
  460. package/src/modules/attachments/i18n/pl.json +4 -0
  461. package/src/modules/audit_logs/api/audit-logs/actions/export/route.ts +260 -0
  462. package/src/modules/audit_logs/api/audit-logs/actions/route.ts +81 -6
  463. package/src/modules/audit_logs/cli.ts +79 -0
  464. package/src/modules/audit_logs/data/entities.ts +17 -0
  465. package/src/modules/audit_logs/data/validators.ts +9 -1
  466. package/src/modules/audit_logs/lib/changeRows.ts +47 -0
  467. package/src/modules/audit_logs/lib/display-helpers.tsx +4 -30
  468. package/src/modules/audit_logs/lib/projections.ts +110 -0
  469. package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +325 -2
  470. package/src/modules/audit_logs/migrations/Migration20260412160533.ts +21 -0
  471. package/src/modules/audit_logs/services/actionLogService.ts +455 -85
  472. package/src/modules/catalog/i18n/de.json +1 -0
  473. package/src/modules/catalog/i18n/en.json +1 -0
  474. package/src/modules/catalog/i18n/es.json +1 -0
  475. package/src/modules/catalog/i18n/pl.json +1 -0
  476. package/src/modules/customer_accounts/i18n/de.json +2 -0
  477. package/src/modules/customer_accounts/i18n/en.json +2 -0
  478. package/src/modules/customer_accounts/i18n/es.json +2 -0
  479. package/src/modules/customer_accounts/i18n/pl.json +2 -0
  480. package/src/modules/customers/acl.ts +2 -0
  481. package/src/modules/customers/api/activities/route.ts +4 -0
  482. package/src/modules/customers/api/assignable-staff/route.ts +250 -0
  483. package/src/modules/customers/api/companies/[id]/people/route.ts +244 -0
  484. package/src/modules/customers/api/companies/[id]/roles/route.ts +15 -0
  485. package/src/modules/customers/api/companies/[id]/route.ts +458 -40
  486. package/src/modules/customers/api/companies/route.ts +93 -15
  487. package/src/modules/customers/api/deals/[id]/companies/route.ts +203 -0
  488. package/src/modules/customers/api/deals/[id]/people/route.ts +182 -0
  489. package/src/modules/customers/api/deals/[id]/route.ts +554 -57
  490. package/src/modules/customers/api/deals/[id]/stats/route.ts +221 -0
  491. package/src/modules/customers/api/deals/route.ts +35 -46
  492. package/src/modules/customers/api/dictionaries/[kind]/[id]/route.ts +105 -3
  493. package/src/modules/customers/api/dictionaries/[kind]/route.ts +143 -44
  494. package/src/modules/customers/api/dictionaries/context.ts +45 -16
  495. package/src/modules/customers/api/dictionaries/kind-settings/route.ts +232 -0
  496. package/src/modules/customers/api/entity-roles-factory.ts +520 -0
  497. package/src/modules/customers/api/interactions/conflicts/route.ts +196 -0
  498. package/src/modules/customers/api/interactions/counts/route.ts +112 -0
  499. package/src/modules/customers/api/interactions/route.ts +95 -2
  500. package/src/modules/customers/api/labels/assign/route.ts +202 -0
  501. package/src/modules/customers/api/labels/auth.ts +19 -0
  502. package/src/modules/customers/api/labels/route.ts +310 -0
  503. package/src/modules/customers/api/labels/table-errors.ts +36 -0
  504. package/src/modules/customers/api/labels/unassign/route.ts +197 -0
  505. package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +331 -0
  506. package/src/modules/customers/api/people/[id]/companies/context.ts +70 -0
  507. package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +384 -0
  508. package/src/modules/customers/api/people/[id]/companies/route.ts +215 -0
  509. package/src/modules/customers/api/people/[id]/roles/route.ts +15 -0
  510. package/src/modules/customers/api/people/[id]/route.ts +153 -26
  511. package/src/modules/customers/api/people/route.ts +134 -31
  512. package/src/modules/customers/api/todos/route.ts +4 -0
  513. package/src/modules/customers/api/utils.ts +36 -0
  514. package/src/modules/customers/backend/config/customers/page.tsx +2 -6
  515. package/src/modules/customers/backend/customers/companies/page.tsx +36 -26
  516. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +277 -262
  517. package/src/modules/customers/backend/customers/deals/[id]/hooks/formatters.ts +19 -0
  518. package/src/modules/customers/backend/customers/deals/[id]/hooks/types.ts +104 -0
  519. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.ts +60 -0
  520. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.ts +362 -0
  521. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.ts +113 -0
  522. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealData.ts +52 -0
  523. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.ts +86 -0
  524. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.tsx +60 -0
  525. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.ts +76 -0
  526. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.ts +56 -0
  527. package/src/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.ts +38 -0
  528. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +587 -624
  529. package/src/modules/customers/backend/customers/deals/page.tsx +71 -28
  530. package/src/modules/customers/backend/customers/people/page.tsx +35 -29
  531. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +343 -209
  532. package/src/modules/customers/cli.ts +107 -12
  533. package/src/modules/customers/commands/activities.ts +13 -0
  534. package/src/modules/customers/commands/deals.ts +386 -114
  535. package/src/modules/customers/commands/dictionaries.ts +175 -32
  536. package/src/modules/customers/commands/dictionaryKindSettings.ts +268 -0
  537. package/src/modules/customers/commands/entity-roles.ts +494 -0
  538. package/src/modules/customers/commands/index.ts +4 -0
  539. package/src/modules/customers/commands/interactions.ts +125 -21
  540. package/src/modules/customers/commands/labels.ts +626 -0
  541. package/src/modules/customers/commands/people.ts +373 -259
  542. package/src/modules/customers/commands/personCompanyLinks.ts +654 -0
  543. package/src/modules/customers/commands/shared.ts +16 -15
  544. package/src/modules/customers/commands/todos.ts +17 -1
  545. package/src/modules/customers/components/AddressEditor.tsx +1 -1
  546. package/src/modules/customers/components/CustomersConfigurationSections.tsx +36 -0
  547. package/src/modules/customers/components/DictionarySettings.tsx +43 -2
  548. package/src/modules/customers/components/detail/ActiveDealCard.tsx +175 -0
  549. package/src/modules/customers/components/detail/ActivitiesSection.tsx +267 -361
  550. package/src/modules/customers/components/detail/ActivityAiActions.tsx +49 -0
  551. package/src/modules/customers/components/detail/ActivityCard.tsx +154 -0
  552. package/src/modules/customers/components/detail/ActivityHistorySection.tsx +412 -0
  553. package/src/modules/customers/components/detail/ActivityLogTab.tsx +67 -0
  554. package/src/modules/customers/components/detail/ActivityTimeline.tsx +158 -0
  555. package/src/modules/customers/components/detail/ActivityTimelineFilters.tsx +163 -0
  556. package/src/modules/customers/components/detail/ActivityTypeSelector.tsx +53 -0
  557. package/src/modules/customers/components/detail/AiActionChips.tsx +48 -0
  558. package/src/modules/customers/components/detail/AssignRoleDialog.tsx +672 -0
  559. package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +132 -0
  560. package/src/modules/customers/components/detail/ChangelogFilters.tsx +193 -0
  561. package/src/modules/customers/components/detail/ChangelogKpiCards.tsx +107 -0
  562. package/src/modules/customers/components/detail/ChangelogTab.tsx +629 -0
  563. package/src/modules/customers/components/detail/ComingSoonPlaceholder.tsx +21 -0
  564. package/src/modules/customers/components/detail/CompanyCard.tsx +419 -0
  565. package/src/modules/customers/components/detail/CompanyDashboardTab.tsx +161 -0
  566. package/src/modules/customers/components/detail/CompanyDetailHeader.tsx +243 -0
  567. package/src/modules/customers/components/detail/CompanyDetailTabs.tsx +172 -0
  568. package/src/modules/customers/components/detail/CompanyKpiBar.tsx +206 -0
  569. package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +582 -288
  570. package/src/modules/customers/components/detail/CompanyTagsDialog.tsx +23 -0
  571. package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +210 -0
  572. package/src/modules/customers/components/detail/CreatePersonDialog.tsx +178 -0
  573. package/src/modules/customers/components/detail/DealClosureActionBar.tsx +63 -0
  574. package/src/modules/customers/components/detail/DealDetailHeader.tsx +335 -0
  575. package/src/modules/customers/components/detail/DealDetailTabs.tsx +154 -0
  576. package/src/modules/customers/components/detail/DealForm.tsx +253 -101
  577. package/src/modules/customers/components/detail/DealLinkedEntitiesTab.tsx +349 -0
  578. package/src/modules/customers/components/detail/DealLostSummaryDialog.tsx +156 -0
  579. package/src/modules/customers/components/detail/DealWonPopup.tsx +164 -0
  580. package/src/modules/customers/components/detail/DealsSection.tsx +276 -221
  581. package/src/modules/customers/components/detail/DecisionMakersFooter.tsx +56 -0
  582. package/src/modules/customers/components/detail/EntityTagsDialog.tsx +1372 -0
  583. package/src/modules/customers/components/detail/InlineActivityComposer.tsx +239 -0
  584. package/src/modules/customers/components/detail/ManageTagsDialog.tsx +1331 -0
  585. package/src/modules/customers/components/detail/MiniWeekCalendar.tsx +338 -0
  586. package/src/modules/customers/components/detail/MobilePersonDetail.tsx +124 -0
  587. package/src/modules/customers/components/detail/NextStepCard.tsx +104 -0
  588. package/src/modules/customers/components/detail/PersonCard.tsx +238 -0
  589. package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +426 -0
  590. package/src/modules/customers/components/detail/PersonDetailHeader.tsx +294 -0
  591. package/src/modules/customers/components/detail/PersonDetailTabs.tsx +172 -0
  592. package/src/modules/customers/components/detail/PersonTagsDialog.tsx +26 -0
  593. package/src/modules/customers/components/detail/PipelineStepper.tsx +245 -0
  594. package/src/modules/customers/components/detail/PlannedActivitiesSection.tsx +255 -0
  595. package/src/modules/customers/components/detail/RelationshipHealthCard.tsx +63 -0
  596. package/src/modules/customers/components/detail/RoleAssignmentRow.tsx +248 -0
  597. package/src/modules/customers/components/detail/RolesSection.tsx +311 -0
  598. package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +481 -0
  599. package/src/modules/customers/components/detail/aiActionCatalog.ts +77 -0
  600. package/src/modules/customers/components/detail/assignableStaff.ts +124 -0
  601. package/src/modules/customers/components/detail/dashboard/ActiveDealWidget.tsx +63 -0
  602. package/src/modules/customers/components/detail/dashboard/OpenTasksWidget.tsx +114 -0
  603. package/src/modules/customers/components/detail/dashboard/RecentActivityWidget.tsx +69 -0
  604. package/src/modules/customers/components/detail/dashboard/RelationshipHealthWidget.tsx +40 -0
  605. package/src/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.tsx +64 -0
  606. package/src/modules/customers/components/detail/dashboard/helpers.ts +78 -0
  607. package/src/modules/customers/components/detail/healthScoreUtils.ts +91 -0
  608. package/src/modules/customers/components/detail/hooks/useCurrencyDictionary.ts +8 -8
  609. package/src/modules/customers/components/detail/hooks/useCustomerDictionary.ts +10 -6
  610. package/src/modules/customers/components/detail/hooks/useInteractionMutations.ts +91 -0
  611. package/src/modules/customers/components/detail/notesAdapter.ts +91 -30
  612. package/src/modules/customers/components/detail/pipelineStageUtils.ts +29 -0
  613. package/src/modules/customers/components/detail/schedule/DateTimeFields.tsx +187 -0
  614. package/src/modules/customers/components/detail/schedule/FooterFields.tsx +79 -0
  615. package/src/modules/customers/components/detail/schedule/LinkedEntitiesField.tsx +277 -0
  616. package/src/modules/customers/components/detail/schedule/LocationField.tsx +42 -0
  617. package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +255 -0
  618. package/src/modules/customers/components/detail/schedule/fieldConfig.ts +70 -0
  619. package/src/modules/customers/components/detail/schedule/index.ts +9 -0
  620. package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +221 -0
  621. package/src/modules/customers/components/detail/types.ts +16 -0
  622. package/src/modules/customers/components/detail/utils.ts +25 -0
  623. package/src/modules/customers/components/formConfig.tsx +223 -28
  624. package/src/modules/customers/components/linking/LinkEntityDialog.tsx +920 -0
  625. package/src/modules/customers/components/linking/adapters/companyAdapter.tsx +398 -0
  626. package/src/modules/customers/components/linking/adapters/dealAdapter.tsx +578 -0
  627. package/src/modules/customers/components/linking/adapters/personAdapter.tsx +512 -0
  628. package/src/modules/customers/components/list/CollectionPreviewCell.tsx +66 -0
  629. package/src/modules/customers/data/entities.ts +353 -1
  630. package/src/modules/customers/data/validators.ts +170 -19
  631. package/src/modules/customers/events.ts +22 -0
  632. package/src/modules/customers/i18n/de.json +841 -2
  633. package/src/modules/customers/i18n/en.json +841 -2
  634. package/src/modules/customers/i18n/es.json +840 -1
  635. package/src/modules/customers/i18n/pl.json +841 -2
  636. package/src/modules/customers/lib/customerRoleTypes.ts +24 -0
  637. package/src/modules/customers/lib/dealClosureNotification.ts +64 -0
  638. package/src/modules/customers/lib/dealStageTransitionTable.ts +32 -0
  639. package/src/modules/customers/lib/dictionaries.ts +26 -10
  640. package/src/modules/customers/lib/interactionReadModel.ts +10 -0
  641. package/src/modules/customers/lib/personCompanies.ts +317 -0
  642. package/src/modules/customers/lib/personCompanyLinkTable.ts +58 -0
  643. package/src/modules/customers/lib/roleTypeUsage.ts +146 -0
  644. package/src/modules/customers/migrations/.snapshot-open-mercato.json +2747 -798
  645. package/src/modules/customers/migrations/Migration20260406214502.ts +19 -0
  646. package/src/modules/customers/migrations/Migration20260408135736.ts +15 -0
  647. package/src/modules/customers/migrations/Migration20260408225345.ts +23 -0
  648. package/src/modules/customers/migrations/Migration20260411075533.ts +30 -0
  649. package/src/modules/customers/migrations/Migration20260411103551.ts +13 -0
  650. package/src/modules/customers/migrations/Migration20260411130944.ts +30 -0
  651. package/src/modules/customers/migrations/Migration20260415095203.ts +13 -0
  652. package/src/modules/customers/migrations/Migration20260415135056.ts +22 -0
  653. package/src/modules/customers/migrations/Migration20260417140000.ts +15 -0
  654. package/src/modules/customers/migrations/Migration20260417160000.ts +17 -0
  655. package/src/modules/customers/migrations/Migration20260417235407.ts +13 -0
  656. package/src/modules/customers/setup.ts +15 -0
  657. package/src/modules/customers/subscribers/deal-closure-notification.ts +22 -0
  658. package/src/modules/customers/subscribers/deal-lost-notification.ts +22 -0
  659. package/src/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.ts +2 -0
  660. package/src/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.ts +162 -0
  661. package/src/modules/dictionaries/api/[dictionaryId]/entries/route.ts +6 -2
  662. package/src/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.ts +162 -0
  663. package/src/modules/dictionaries/api/context.ts +9 -0
  664. package/src/modules/dictionaries/api/openapi.ts +17 -0
  665. package/src/modules/dictionaries/commands/entry-operations.ts +457 -0
  666. package/src/modules/dictionaries/commands/factory.ts +31 -3
  667. package/src/modules/dictionaries/commands/index.ts +1 -0
  668. package/src/modules/dictionaries/components/DictionaryTable.tsx +15 -6
  669. package/src/modules/dictionaries/data/entities.ts +9 -0
  670. package/src/modules/dictionaries/data/validators.ts +34 -0
  671. package/src/modules/dictionaries/events.ts +20 -0
  672. package/src/modules/dictionaries/i18n/de.json +2 -0
  673. package/src/modules/dictionaries/i18n/en.json +2 -0
  674. package/src/modules/dictionaries/i18n/es.json +2 -0
  675. package/src/modules/dictionaries/i18n/pl.json +2 -0
  676. package/src/modules/dictionaries/lib/clientEntries.ts +66 -0
  677. package/src/modules/dictionaries/migrations/.snapshot-open-mercato.json +185 -3
  678. package/src/modules/dictionaries/migrations/Migration20260410171544.ts +49 -0
  679. package/src/modules/inbox_ops/api/proposals/[id]/route.ts +4 -1
  680. package/src/modules/query_index/lib/engine.ts +9 -1
  681. package/src/modules/sales/components/documents/AddressesSection.tsx +92 -42
  682. package/src/modules/sales/i18n/de.json +28 -0
  683. package/src/modules/sales/i18n/en.json +28 -0
  684. package/src/modules/sales/i18n/es.json +28 -0
  685. package/src/modules/sales/i18n/pl.json +28 -0
  686. package/src/modules/sales/lib/dictionaries.ts +18 -0
  687. package/src/modules/sales/widgets/injection-table.ts +4 -0
@@ -0,0 +1,221 @@
1
+ import * as React from 'react'
2
+ import type { ActivityType } from './fieldConfig'
3
+
4
+ export type RsvpStatus = 'pending' | 'accepted' | 'declined' | 'tentative'
5
+
6
+ export type Participant = {
7
+ userId: string
8
+ name: string
9
+ email?: string
10
+ color?: string
11
+ status?: RsvpStatus
12
+ }
13
+
14
+ export type LinkedEntity = {
15
+ id: string
16
+ type: 'company' | 'deal' | 'offer'
17
+ label: string
18
+ }
19
+
20
+ export type ScheduleActivityEditData = {
21
+ id: string
22
+ interactionType?: string
23
+ title?: string | null
24
+ body?: string | null
25
+ scheduledAt?: string | null
26
+ durationMinutes?: number | null
27
+ location?: string | null
28
+ allDay?: boolean | null
29
+ recurrenceRule?: string | null
30
+ recurrenceEnd?: string | null
31
+ participants?: Array<{ userId: string; name?: string; email?: string; status?: string }> | null
32
+ reminderMinutes?: number | null
33
+ visibility?: string | null
34
+ linkedEntities?: Array<{ id: string; type: string; label: string }> | null
35
+ guestPermissions?: { canInviteOthers?: boolean; canModify?: boolean; canSeeList?: boolean } | null
36
+ }
37
+
38
+ export const PARTICIPANT_COLORS = [
39
+ 'bg-chart-emerald',
40
+ 'bg-chart-blue',
41
+ 'bg-chart-orange',
42
+ 'bg-chart-violet',
43
+ 'bg-chart-pink',
44
+ 'bg-chart-teal',
45
+ ]
46
+
47
+ interface UseScheduleFormStateParams {
48
+ open: boolean
49
+ editData: ScheduleActivityEditData | null | undefined
50
+ }
51
+
52
+ export function useScheduleFormState({ open, editData }: UseScheduleFormStateParams) {
53
+ const [activityType, setActivityType] = React.useState<ActivityType>('meeting')
54
+ const [title, setTitle] = React.useState('')
55
+ const [date, setDate] = React.useState(() => new Date().toISOString().slice(0, 10))
56
+ const [startTime, setStartTime] = React.useState('10:00')
57
+ const [duration, setDuration] = React.useState(30)
58
+ const [allDay, setAllDay] = React.useState(false)
59
+ const [description, setDescription] = React.useState('')
60
+ const [markdownEnabled, setMarkdownEnabled] = React.useState(true)
61
+ const [location, setLocation] = React.useState('')
62
+ const [reminderMinutes, setReminderMinutes] = React.useState(15)
63
+ const [visibility, setVisibility] = React.useState('team')
64
+ const [participants, setParticipants] = React.useState<Participant[]>([])
65
+ const [linkedEntities, setLinkedEntities] = React.useState<LinkedEntity[]>([])
66
+ const [recurrenceEnabled, setRecurrenceEnabled] = React.useState(false)
67
+ const [recurrenceDays, setRecurrenceDays] = React.useState<boolean[]>([true, false, true, false, false, false, false])
68
+ const [recurrenceEndType, setRecurrenceEndType] = React.useState<'never' | 'count' | 'date'>('never')
69
+ const [recurrenceCount, setRecurrenceCount] = React.useState(8)
70
+ const [recurrenceEndDate, setRecurrenceEndDate] = React.useState('')
71
+ const [conflict, setConflict] = React.useState<string | null>(null)
72
+ const [saving, setSaving] = React.useState(false)
73
+ const [guestPermissions, setGuestPermissions] = React.useState({ canInviteOthers: true, canModify: false, canSeeList: true })
74
+
75
+ React.useEffect(() => {
76
+ if (open) {
77
+ if (editData) {
78
+ // Edit mode: populate from existing interaction
79
+ setActivityType((editData.interactionType as ActivityType) ?? 'meeting')
80
+ setTitle(editData.title ?? '')
81
+ const scheduledDate = editData.scheduledAt ? new Date(editData.scheduledAt) : new Date()
82
+ setDate(scheduledDate.toISOString().slice(0, 10))
83
+ setStartTime(scheduledDate.toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' }))
84
+ setDuration(editData.durationMinutes ?? 30)
85
+ setAllDay(editData.allDay ?? false)
86
+ setDescription(editData.body ?? '')
87
+ setLocation(editData.location ?? '')
88
+ setReminderMinutes(editData.reminderMinutes ?? 15)
89
+ setVisibility(editData.visibility ?? 'team')
90
+ setParticipants(
91
+ Array.isArray(editData.participants)
92
+ ? editData.participants.map((p, i) => ({
93
+ userId: p.userId,
94
+ name: p.name ?? p.userId,
95
+ email: p.email,
96
+ color: PARTICIPANT_COLORS[i % PARTICIPANT_COLORS.length],
97
+ status: (p.status ?? 'pending') as RsvpStatus,
98
+ }))
99
+ : [],
100
+ )
101
+ setLinkedEntities(
102
+ Array.isArray(editData.linkedEntities)
103
+ ? editData.linkedEntities.map((e) => ({ id: e.id, type: e.type as LinkedEntity['type'], label: e.label }))
104
+ : [],
105
+ )
106
+ if (editData.recurrenceRule) {
107
+ setRecurrenceEnabled(true)
108
+ // Parse RRULE to set days and end type
109
+ const rule = editData.recurrenceRule
110
+ const byDayMatch = rule.match(/BYDAY=([A-Z,]+)/)
111
+ if (byDayMatch) {
112
+ const dayNames = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']
113
+ const activeDays = byDayMatch[1].split(',')
114
+ setRecurrenceDays(dayNames.map((d) => activeDays.includes(d)))
115
+ }
116
+ const countMatch = rule.match(/COUNT=(\d+)/)
117
+ const untilMatch = rule.match(/UNTIL=(\d{8})/)
118
+ if (countMatch) {
119
+ setRecurrenceEndType('count')
120
+ setRecurrenceCount(Number(countMatch[1]))
121
+ } else if (untilMatch) {
122
+ setRecurrenceEndType('date')
123
+ const raw = untilMatch[1]
124
+ setRecurrenceEndDate(`${raw.slice(0, 4)}-${raw.slice(4, 6)}-${raw.slice(6, 8)}`)
125
+ } else {
126
+ setRecurrenceEndType('never')
127
+ }
128
+ } else {
129
+ setRecurrenceEnabled(false)
130
+ }
131
+ if (editData.guestPermissions) {
132
+ setGuestPermissions({
133
+ canInviteOthers: editData.guestPermissions.canInviteOthers ?? true,
134
+ canModify: editData.guestPermissions.canModify ?? false,
135
+ canSeeList: editData.guestPermissions.canSeeList ?? true,
136
+ })
137
+ }
138
+ } else {
139
+ // Create mode: reset all fields
140
+ setActivityType('meeting')
141
+ setTitle('')
142
+ setDate(new Date().toISOString().slice(0, 10))
143
+ setStartTime('10:00')
144
+ setDuration(30)
145
+ setAllDay(false)
146
+ setDescription('')
147
+ setLocation('')
148
+ setReminderMinutes(15)
149
+ setVisibility('team')
150
+ setParticipants([])
151
+ setLinkedEntities([])
152
+ setRecurrenceEnabled(false)
153
+ }
154
+ setConflict(null)
155
+ }
156
+ return () => {
157
+ // Safety net: restore body scroll if Radix Dialog fails to clean up
158
+ document.body.style.removeProperty('overflow')
159
+ document.body.style.removeProperty('pointer-events')
160
+ }
161
+ }, [open, editData])
162
+
163
+ const removeParticipant = React.useCallback((userId: string) => {
164
+ setParticipants((prev) => prev.filter((p) => p.userId !== userId))
165
+ }, [])
166
+
167
+ const toggleRecurrenceDay = React.useCallback((index: number) => {
168
+ setRecurrenceDays((prev) => {
169
+ const next = [...prev]
170
+ next[index] = !next[index]
171
+ return next
172
+ })
173
+ }, [])
174
+
175
+ return {
176
+ activityType,
177
+ setActivityType,
178
+ title,
179
+ setTitle,
180
+ date,
181
+ setDate,
182
+ startTime,
183
+ setStartTime,
184
+ duration,
185
+ setDuration,
186
+ allDay,
187
+ setAllDay,
188
+ description,
189
+ setDescription,
190
+ markdownEnabled,
191
+ setMarkdownEnabled,
192
+ location,
193
+ setLocation,
194
+ reminderMinutes,
195
+ setReminderMinutes,
196
+ visibility,
197
+ setVisibility,
198
+ participants,
199
+ setParticipants,
200
+ linkedEntities,
201
+ setLinkedEntities,
202
+ recurrenceEnabled,
203
+ setRecurrenceEnabled,
204
+ recurrenceDays,
205
+ setRecurrenceDays,
206
+ recurrenceEndType,
207
+ setRecurrenceEndType,
208
+ recurrenceCount,
209
+ setRecurrenceCount,
210
+ recurrenceEndDate,
211
+ setRecurrenceEndDate,
212
+ conflict,
213
+ setConflict,
214
+ saving,
215
+ setSaving,
216
+ guestPermissions,
217
+ setGuestPermissions,
218
+ removeParticipant,
219
+ toggleRecurrenceDay,
220
+ }
221
+ }
@@ -77,6 +77,8 @@ export type DealSummary = {
77
77
  title: string
78
78
  status?: string | null
79
79
  pipelineStage?: string | null
80
+ pipelineId?: string | null
81
+ pipelineStageId?: string | null
80
82
  valueAmount?: number | string | null
81
83
  valueCurrency?: string | null
82
84
  probability?: number | string | null
@@ -84,6 +86,9 @@ export type DealSummary = {
84
86
  description?: string | null
85
87
  ownerUserId?: string | null
86
88
  source?: string | null
89
+ closureOutcome?: string | null
90
+ lossReasonId?: string | null
91
+ lossNotes?: string | null
87
92
  createdAt?: string | null
88
93
  updatedAt?: string | null
89
94
  customValues?: Record<string, unknown> | null
@@ -126,6 +131,10 @@ export type InteractionSummary = {
126
131
  appearanceIcon?: string | null
127
132
  appearanceColor?: string | null
128
133
  source?: string | null
134
+ location?: string | null
135
+ allDay?: boolean | null
136
+ recurrenceRule?: string | null
137
+ recurrenceEnd?: string | null
129
138
  entityId?: string | null
130
139
  dealId?: string | null
131
140
  organizationId?: string | null
@@ -134,12 +143,19 @@ export type InteractionSummary = {
134
143
  authorEmail?: string | null
135
144
  dealTitle?: string | null
136
145
  customValues?: Record<string, unknown> | null
146
+ participants?: Array<{ userId: string; name?: string; email?: string; status?: string }> | null
147
+ reminderMinutes?: number | null
148
+ visibility?: string | null
149
+ linkedEntities?: Array<{ id: string; type: string; label: string }> | null
150
+ guestPermissions?: { canInviteOthers?: boolean; canModify?: boolean; canSeeList?: boolean } | null
137
151
  customer?: {
138
152
  id: string | null
139
153
  displayName: string | null
140
154
  kind: string | null
141
155
  } | null
142
156
  _integrations?: Record<string, unknown>
157
+ pinned?: boolean
158
+ duration?: number | null
143
159
  createdAt: string
144
160
  updatedAt: string
145
161
  }
@@ -147,3 +147,28 @@ export function createDictionarySelectLabels(
147
147
  return base
148
148
  }
149
149
  }
150
+
151
+ export function getInitials(name: string): string {
152
+ const words = name.trim().split(/\s+/)
153
+ if (words.length === 0 || !words[0]) return '?'
154
+ if (words.length === 1) return words[0].charAt(0).toUpperCase()
155
+ return (words[0].charAt(0) + words[words.length - 1].charAt(0)).toUpperCase()
156
+ }
157
+
158
+ export function formatCurrency(amount: number, currency?: string | null): string {
159
+ try {
160
+ return new Intl.NumberFormat(undefined, {
161
+ style: 'currency',
162
+ currency: currency || 'PLN',
163
+ maximumFractionDigits: 0,
164
+ }).format(amount)
165
+ } catch {
166
+ return `${amount.toLocaleString()} ${currency || 'PLN'}`
167
+ }
168
+ }
169
+
170
+ export function formatFallbackLabel(value: string): string {
171
+ return value
172
+ .replace(/[_-]+/g, ' ')
173
+ .replace(/^\w/, (c) => c.toUpperCase())
174
+ }
@@ -31,6 +31,7 @@ import {
31
31
  DictionaryEntrySelect,
32
32
  type DictionarySelectLabels,
33
33
  } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'
34
+ import { RolesSection } from './detail/RolesSection'
34
35
  import { useQueryClient } from '@tanstack/react-query'
35
36
  import { useEmailDuplicateCheck } from '../backend/hooks/useEmailDuplicateCheck'
36
37
  import { lookupPhoneDuplicate } from '../utils/phoneDuplicates'
@@ -96,6 +97,11 @@ type DictionarySelectFieldProps = {
96
97
  onChange: (value: string | undefined) => void
97
98
  labels: DictionarySelectLabels
98
99
  selectClassName?: string
100
+ manageHref?: string
101
+ allowInlineCreate?: boolean
102
+ allowAppearance?: boolean
103
+ showManage?: boolean
104
+ showLabelInput?: boolean
99
105
  }
100
106
 
101
107
  const emailValidationSchema = z.string().email()
@@ -119,6 +125,11 @@ export function DictionarySelectField({
119
125
  onChange,
120
126
  labels,
121
127
  selectClassName,
128
+ manageHref,
129
+ allowInlineCreate = false,
130
+ allowAppearance = false,
131
+ showManage = false,
132
+ showLabelInput = true,
122
133
  }: DictionarySelectFieldProps) {
123
134
  const t = useT()
124
135
  const queryClient = useQueryClient()
@@ -209,12 +220,12 @@ export function DictionarySelectField({
209
220
  fetchOptions={fetchOptions}
210
221
  createOption={createOption}
211
222
  labels={labels}
223
+ manageHref={manageHref}
212
224
  selectClassName={selectClassName}
213
- allowInlineCreate
214
- allowAppearance
215
- appearanceLabels={appearanceLabels}
216
- manageHref="/backend/config/customers"
217
- showLabelInput
225
+ allowInlineCreate={allowInlineCreate}
226
+ allowAppearance={allowAppearance}
227
+ showManage={showManage}
228
+ showLabelInput={showLabelInput}
218
229
  />
219
230
  )
220
231
  }
@@ -275,8 +286,8 @@ const createPrimaryEmailField = (t: Translator): CrudField => ({
275
286
  })
276
287
 
277
288
  type DictionaryFieldDefinition = {
278
- id: 'jobTitle' | 'status' | 'lifecycleStage' | 'source'
279
- kind: 'job-titles' | 'statuses' | 'lifecycle-stages' | 'sources'
289
+ id: 'status' | 'lifecycleStage' | 'source'
290
+ kind: 'statuses' | 'lifecycle-stages' | 'sources'
280
291
  labelKey: string
281
292
  placeholderKey: string
282
293
  addLabelKey: string
@@ -286,16 +297,6 @@ type DictionaryFieldDefinition = {
286
297
  }
287
298
 
288
299
  const dictionaryFieldDefinitions: DictionaryFieldDefinition[] = [
289
- {
290
- id: 'jobTitle',
291
- kind: 'job-titles',
292
- labelKey: 'customers.people.form.jobTitle',
293
- placeholderKey: 'customers.people.form.jobTitle.placeholder',
294
- addLabelKey: 'customers.people.form.dictionary.addJobTitle',
295
- promptKey: 'customers.people.form.dictionary.promptJobTitle',
296
- dialogTitleKey: 'customers.people.form.dictionary.dialogTitleJobTitle',
297
- layout: 'half',
298
- },
299
300
  {
300
301
  id: 'status',
301
302
  kind: 'statuses',
@@ -304,6 +305,7 @@ const dictionaryFieldDefinitions: DictionaryFieldDefinition[] = [
304
305
  addLabelKey: 'customers.people.form.dictionary.addStatus',
305
306
  promptKey: 'customers.people.form.dictionary.promptStatus',
306
307
  dialogTitleKey: 'customers.people.form.dictionary.dialogTitleStatus',
308
+ layout: 'half',
307
309
  },
308
310
  {
309
311
  id: 'lifecycleStage',
@@ -313,6 +315,7 @@ const dictionaryFieldDefinitions: DictionaryFieldDefinition[] = [
313
315
  addLabelKey: 'customers.people.form.dictionary.addLifecycleStage',
314
316
  promptKey: 'customers.people.form.dictionary.promptLifecycleStage',
315
317
  dialogTitleKey: 'customers.people.form.dictionary.dialogTitleLifecycleStage',
318
+ layout: 'half',
316
319
  },
317
320
  {
318
321
  id: 'source',
@@ -322,6 +325,7 @@ const dictionaryFieldDefinitions: DictionaryFieldDefinition[] = [
322
325
  addLabelKey: 'customers.people.form.dictionary.addSource',
323
326
  promptKey: 'customers.people.form.dictionary.promptSource',
324
327
  dialogTitleKey: 'customers.people.form.dictionary.dialogTitleSource',
328
+ layout: 'half',
325
329
  },
326
330
  ]
327
331
 
@@ -793,17 +797,20 @@ export const createDisplayNameSection = (t: Translator) =>
793
797
  export const createPersonFormFields = (t: Translator): CrudField[] => {
794
798
  const contactSection = createSectionHeadingField('__contactInformationSection', t('customers.people.form.sections.contactInformation'))
795
799
  const companySection = createSectionHeadingField('__companyInformationSection', t('customers.people.form.sections.companyInformation'))
796
- const dictionaryFields: CrudField[] = dictionaryFieldDefinitions.map((definition) => ({
797
- id: definition.id,
798
- label: t(definition.labelKey),
799
- type: 'custom',
800
- layout: definition.layout ?? 'third',
801
- component: ({ value, setValue }: CrudCustomFieldRenderProps) => (
802
- <DictionarySelectField
803
- kind={definition.kind}
804
- value={typeof value === 'string' ? value : undefined}
805
- onChange={(next) => setValue(next)}
800
+ const dictionaryFields: CrudField[] = dictionaryFieldDefinitions.map((definition) => ({
801
+ id: definition.id,
802
+ label: t(definition.labelKey),
803
+ type: 'custom',
804
+ layout: definition.layout ?? 'third',
805
+ component: ({ value, setValue }: CrudCustomFieldRenderProps) => (
806
+ <DictionarySelectField
807
+ kind={definition.kind}
808
+ value={typeof value === 'string' ? value : undefined}
809
+ onChange={(next) => setValue(next)}
806
810
  labels={buildDictionaryLabels(t, definition)}
811
+ allowInlineCreate
812
+ allowAppearance
813
+ showManage
807
814
  />
808
815
  ),
809
816
  }))
@@ -812,6 +819,40 @@ const dictionaryFields: CrudField[] = dictionaryFieldDefinitions.map((definition
812
819
  { id: 'displayName', label: t('customers.people.form.displayName.label'), type: 'text', required: true },
813
820
  { id: 'firstName', label: t('customers.people.form.firstName'), type: 'text', required: true, layout: 'half' },
814
821
  { id: 'lastName', label: t('customers.people.form.lastName'), type: 'text', required: true, layout: 'half' },
822
+ {
823
+ id: 'jobTitle',
824
+ label: t('customers.people.form.jobTitle', 'Job title'),
825
+ type: 'custom',
826
+ layout: 'half',
827
+ component: ({ value, setValue }: CrudCustomFieldRenderProps) => (
828
+ <DictionarySelectField
829
+ kind="job-titles"
830
+ value={typeof value === 'string' ? value : undefined}
831
+ onChange={(next) => setValue(next)}
832
+ labels={{
833
+ placeholder: t('customers.people.form.jobTitle.placeholder', 'Select a job title'),
834
+ addLabel: t('customers.people.form.dictionary.addJobTitle', 'Add job title'),
835
+ addPrompt: t('customers.people.form.dictionary.promptJobTitle', 'Enter a new job title'),
836
+ dialogTitle: t('customers.people.form.dictionary.dialogTitleJobTitle', 'Add job title'),
837
+ valueLabel: t('customers.people.form.dictionary.valueLabel', 'Value'),
838
+ valuePlaceholder: t('customers.people.form.dictionary.valuePlaceholder', 'Value'),
839
+ labelLabel: t('customers.config.dictionaries.dialog.labelLabel', 'Label'),
840
+ labelPlaceholder: t('customers.people.form.dictionary.labelPlaceholder', 'Display name shown in UI'),
841
+ emptyError: t('customers.people.form.dictionary.errorRequired'),
842
+ cancelLabel: t('customers.people.form.dictionary.cancel'),
843
+ saveLabel: t('customers.people.form.dictionary.save'),
844
+ successCreateLabel: undefined,
845
+ errorLoad: t('customers.people.form.dictionary.errorLoad'),
846
+ errorSave: t('customers.people.form.dictionary.error'),
847
+ loadingLabel: t('customers.people.form.dictionary.loading'),
848
+ manageTitle: t('customers.people.form.dictionary.manage'),
849
+ }}
850
+ allowInlineCreate
851
+ allowAppearance
852
+ showManage
853
+ />
854
+ ),
855
+ },
815
856
  contactSection,
816
857
  createPrimaryEmailField(t),
817
858
  createPrimaryPhoneField(t),
@@ -924,6 +965,7 @@ export const createPersonFormGroups = (t: Translator): CrudFormGroup[] => [
924
965
  id: 'details',
925
966
  title: t('customers.people.form.groups.details'),
926
967
  column: 1,
968
+ component: createDisplayNameSection(t),
927
969
  fields: [
928
970
  'firstName',
929
971
  'lastName',
@@ -937,7 +979,6 @@ export const createPersonFormGroups = (t: Translator): CrudFormGroup[] => [
937
979
  'lifecycleStage',
938
980
  'source',
939
981
  ],
940
- component: createDisplayNameSection(t),
941
982
  },
942
983
  {
943
984
  id: 'addresses',
@@ -1507,6 +1548,14 @@ export const createCompanyEditGroups = (t: Translator): CrudFormGroup[] => [
1507
1548
  column: 1,
1508
1549
  fields: ['displayName', 'primaryEmail', 'primaryPhone', 'status', 'lifecycleStage', 'source'],
1509
1550
  },
1551
+ {
1552
+ id: 'roles',
1553
+ title: t('customers.roles.groupTitle', 'Roles'),
1554
+ column: 1,
1555
+ component: ({ values }: CrudFormGroupComponentProps) => (
1556
+ values.id ? <RolesSection entityType="company" entityId={values.id as string} /> : null
1557
+ ),
1558
+ },
1510
1559
  {
1511
1560
  id: 'profile',
1512
1561
  title: t('customers.companies.form.groups.profile'),
@@ -1527,6 +1576,50 @@ export const createCompanyEditGroups = (t: Translator): CrudFormGroup[] => [
1527
1576
  },
1528
1577
  ]
1529
1578
 
1579
+ /**
1580
+ * Groups for the "Dane firmy" tab layout (Figma SPEC-048 mockup).
1581
+ * All zone-1 groups stay in a single vertical stack so drag-and-drop ordering
1582
+ * applies consistently across every section and persists per page type.
1583
+ */
1584
+ export const createCompanyDaneFiremyGroups = (t: Translator): CrudFormGroup[] => [
1585
+ {
1586
+ id: 'identity',
1587
+ title: t('customers.companies.form.groups.identity', 'Tożsamość').toUpperCase(),
1588
+ column: 1,
1589
+ fields: ['displayName', 'legalName', 'brandName'],
1590
+ },
1591
+ {
1592
+ id: 'contact',
1593
+ title: t('customers.companies.form.groups.contact', 'Kontakt').toUpperCase(),
1594
+ column: 1,
1595
+ fields: ['primaryEmail', 'primaryPhone', 'domain', 'websiteUrl'],
1596
+ },
1597
+ {
1598
+ id: 'classification',
1599
+ title: t('customers.companies.form.groups.classification', 'Klasyfikacja').toUpperCase(),
1600
+ column: 1,
1601
+ fields: ['status', 'lifecycleStage', 'source'],
1602
+ },
1603
+ {
1604
+ id: 'businessProfile',
1605
+ title: t('customers.companies.form.groups.businessProfile', 'Profil biznesowy').toUpperCase(),
1606
+ column: 1,
1607
+ fields: ['industry', 'sizeBucket', 'annualRevenue'],
1608
+ },
1609
+ {
1610
+ id: 'notes',
1611
+ title: t('customers.companies.form.groups.notes', 'Notatki'),
1612
+ column: 1,
1613
+ fields: ['description'],
1614
+ },
1615
+ {
1616
+ id: 'customFields',
1617
+ title: t('customers.companies.form.groups.customAttributes', 'Atrybuty niestandardowe'),
1618
+ column: 1,
1619
+ kind: 'customFields',
1620
+ },
1621
+ ]
1622
+
1530
1623
  export const createPersonEditGroups = (t: Translator): CrudFormGroup[] => [
1531
1624
  {
1532
1625
  id: 'details',
@@ -1547,6 +1640,14 @@ export const createPersonEditGroups = (t: Translator): CrudFormGroup[] => [
1547
1640
  ],
1548
1641
  component: createDisplayNameSection(t),
1549
1642
  },
1643
+ {
1644
+ id: 'roles',
1645
+ title: t('customers.roles.groupTitle', 'Roles'),
1646
+ column: 1,
1647
+ component: ({ values }: CrudFormGroupComponentProps) => (
1648
+ values.id ? <RolesSection entityType="person" entityId={values.id as string} /> : null
1649
+ ),
1650
+ },
1550
1651
  {
1551
1652
  id: 'social',
1552
1653
  title: t('customers.people.form.groups.social', 'Social & links'),
@@ -1567,6 +1668,45 @@ export const createPersonEditGroups = (t: Translator): CrudFormGroup[] => [
1567
1668
  },
1568
1669
  ]
1569
1670
 
1671
+ /**
1672
+ * Groups for the Person v2 "Dane osobowe" Figma layout (SPEC-048 mockup).
1673
+ * All groups in column 1 (Zone 1). Notes handled separately in Zone 2 tabs.
1674
+ */
1675
+ export const createPersonPersonalDataGroups = (t: Translator): CrudFormGroup[] => [
1676
+ {
1677
+ id: 'personalData',
1678
+ title: t('customers.people.form.groups.personalData', 'Personal data'),
1679
+ column: 1,
1680
+ fields: ['firstName', 'lastName', 'jobTitle', 'primaryEmail', 'primaryPhone'],
1681
+ },
1682
+ {
1683
+ id: 'companyRole',
1684
+ title: t('customers.people.form.groups.companyRole', 'Company & role'),
1685
+ column: 1,
1686
+ fields: ['companyEntityId', 'status', 'lifecycleStage', 'source'],
1687
+ },
1688
+ {
1689
+ id: 'customFields',
1690
+ title: t('customers.people.form.groups.customAttributes', 'Custom attributes'),
1691
+ column: 1,
1692
+ kind: 'customFields',
1693
+ },
1694
+ {
1695
+ id: 'roles',
1696
+ title: t('customers.people.form.groups.roles', 'My roles'),
1697
+ column: 1,
1698
+ component: ({ values }: CrudFormGroupComponentProps) => (
1699
+ values.id ? (
1700
+ <RolesSection
1701
+ entityType="person"
1702
+ entityId={values.id as string}
1703
+ entityName={typeof values.displayName === 'string' ? values.displayName : null}
1704
+ />
1705
+ ) : null
1706
+ ),
1707
+ },
1708
+ ]
1709
+
1570
1710
  // ---------------------------------------------------------------------------
1571
1711
  // Edit-mode payload builders
1572
1712
  // ---------------------------------------------------------------------------
@@ -1612,7 +1752,16 @@ export type CompanyPersonSummary = {
1612
1752
  id: string
1613
1753
  displayName: string
1614
1754
  primaryEmail?: string | null
1755
+ primaryPhone?: string | null
1756
+ status?: string | null
1757
+ lifecycleStage?: string | null
1615
1758
  jobTitle?: string | null
1759
+ department?: string | null
1760
+ createdAt?: string | null
1761
+ organizationId?: string | null
1762
+ source?: string | null
1763
+ temperature?: string | null
1764
+ linkedAt?: string | null
1616
1765
  }
1617
1766
 
1618
1767
  export type CompanyOverview = {
@@ -1631,6 +1780,8 @@ export type CompanyOverview = {
1631
1780
  nextInteractionRefId?: string | null
1632
1781
  nextInteractionIcon?: string | null
1633
1782
  nextInteractionColor?: string | null
1783
+ temperature?: string | null
1784
+ renewalQuarter?: string | null
1634
1785
  organizationId?: string | null
1635
1786
  }
1636
1787
  profile: {
@@ -1651,6 +1802,30 @@ export type CompanyOverview = {
1651
1802
  deals: DealSummary[]
1652
1803
  todos: TodoLinkSummary[]
1653
1804
  people: CompanyPersonSummary[]
1805
+ counts?: {
1806
+ comments: number
1807
+ activities: number
1808
+ interactions: number
1809
+ todos: number
1810
+ deals: number
1811
+ people: number
1812
+ addresses: number
1813
+ tags: number
1814
+ }
1815
+ plannedActivitiesPreview?: InteractionSummary[]
1816
+ kpis?: {
1817
+ activeDealsCount: number
1818
+ activeDealsValue: number | null
1819
+ dealCurrency: string | null
1820
+ activityCount: number
1821
+ activityTrend: {
1822
+ value: number
1823
+ direction: 'up' | 'down' | 'unchanged'
1824
+ } | null
1825
+ ltvValue: number | null
1826
+ completedDealsCount: number
1827
+ clientTenureYears: number | null
1828
+ }
1654
1829
  interactionMode?: 'canonical' | 'legacy'
1655
1830
  viewer?: {
1656
1831
  userId: string | null
@@ -1670,6 +1845,8 @@ export type PersonOverview = {
1670
1845
  status?: string | null
1671
1846
  lifecycleStage?: string | null
1672
1847
  source?: string | null
1848
+ temperature?: string | null
1849
+ renewalQuarter?: string | null
1673
1850
  nextInteractionAt?: string | null
1674
1851
  nextInteractionName?: string | null
1675
1852
  nextInteractionRefId?: string | null
@@ -1697,7 +1874,25 @@ export type PersonOverview = {
1697
1874
  interactions: InteractionSummary[]
1698
1875
  deals: DealSummary[]
1699
1876
  todos: TodoLinkSummary[]
1877
+ counts?: {
1878
+ comments: number
1879
+ activities: number
1880
+ interactions: number
1881
+ todos: number
1882
+ deals: number
1883
+ companies: number
1884
+ addresses: number
1885
+ tags: number
1886
+ }
1887
+ plannedActivitiesPreview?: InteractionSummary[]
1700
1888
  interactionMode?: 'canonical' | 'legacy'
1889
+ /** Whether this person is the primary contact for any linked company. */
1890
+ isPrimary?: boolean
1891
+ companies?: Array<{
1892
+ id: string
1893
+ displayName: string
1894
+ isPrimary: boolean
1895
+ }>
1701
1896
  company?: {
1702
1897
  id: string
1703
1898
  displayName: string