@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,283 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import Link from "next/link";
4
+ import {
5
+ Building2,
6
+ Clock,
7
+ Copy,
8
+ CreditCard,
9
+ ExternalLink,
10
+ FileText,
11
+ Hash,
12
+ MapPin,
13
+ TrendingUp,
14
+ Zap,
15
+ Tag as TagIcon,
16
+ Users
17
+ } from "lucide-react";
18
+ import { Badge } from "@open-mercato/ui/primitives/badge";
19
+ import { IconButton } from "@open-mercato/ui/primitives/icon-button";
20
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
21
+ import { flash } from "@open-mercato/ui/backend/FlashMessages";
22
+ import { renderDictionaryIcon } from "../../../dictionaries/components/dictionaryAppearance.js";
23
+ import { formatFallbackLabel } from "./utils.js";
24
+ function copyToClipboard(text, t) {
25
+ navigator.clipboard.writeText(text).then(() => {
26
+ flash(t("customers.companies.detail.copied", "Copied to clipboard"), "success");
27
+ }).catch((err) => console.warn("[CompanyCard] clipboard write failed", err));
28
+ }
29
+ function formatRelativeTime(isoDate, t) {
30
+ const date = new Date(isoDate);
31
+ const now = /* @__PURE__ */ new Date();
32
+ const diffMs = now.getTime() - date.getTime();
33
+ const diffDays = Math.floor(diffMs / (1e3 * 60 * 60 * 24));
34
+ if (diffDays === 0) {
35
+ return `${t("customers.companies.detail.relativeTime.today", "today")}, ${date.toLocaleTimeString(void 0, { hour: "2-digit", minute: "2-digit" })}`;
36
+ }
37
+ if (diffDays === 1) return t("customers.companies.detail.relativeTime.oneDayAgo", "1 day ago");
38
+ if (diffDays < 7) return t("customers.companies.detail.relativeTime.daysAgo", "{{days}} days ago", { days: diffDays });
39
+ if (diffDays < 30) return t("customers.companies.detail.relativeTime.weeksAgo", "{{weeks}} wk. ago", { weeks: Math.floor(diffDays / 7) });
40
+ return t("customers.companies.detail.relativeTime.monthsAgo", "{{months}} mo. ago", { months: Math.floor(diffDays / 30) });
41
+ }
42
+ function formatCurrency(amount, currency) {
43
+ try {
44
+ return new Intl.NumberFormat(void 0, {
45
+ style: "currency",
46
+ currency,
47
+ maximumFractionDigits: 0,
48
+ notation: amount >= 1e6 ? "compact" : "standard"
49
+ }).format(amount);
50
+ } catch {
51
+ if (amount >= 1e6) return `${(amount / 1e6).toFixed(2)} M ${currency}`;
52
+ if (amount >= 1e3) return `${Math.round(amount / 1e3)}k ${currency}`;
53
+ return `${amount} ${currency}`;
54
+ }
55
+ }
56
+ function ColorBadge({
57
+ value,
58
+ map,
59
+ fallbackIcon
60
+ }) {
61
+ const entry = map?.[value];
62
+ const color = entry?.color ?? null;
63
+ const icon = entry?.icon ?? null;
64
+ const label = entry?.label ?? formatFallbackLabel(value);
65
+ const colorStyle = color ? { color, borderColor: color, backgroundColor: `${color}1A` } : void 0;
66
+ return /* @__PURE__ */ jsxs(
67
+ Badge,
68
+ {
69
+ variant: "outline",
70
+ className: "rounded-sm gap-1.5 text-xs font-medium",
71
+ style: colorStyle,
72
+ children: [
73
+ icon ? renderDictionaryIcon(icon, "size-2.5") : fallbackIcon ?? null,
74
+ label
75
+ ]
76
+ }
77
+ );
78
+ }
79
+ function StatusDotBadge({
80
+ value,
81
+ map
82
+ }) {
83
+ const entry = map?.[value];
84
+ const color = entry?.color ?? null;
85
+ const label = entry?.label ?? formatFallbackLabel(value);
86
+ const colorStyle = color ? { color, borderColor: color, backgroundColor: `${color}1A` } : void 0;
87
+ return /* @__PURE__ */ jsxs(
88
+ Badge,
89
+ {
90
+ variant: "outline",
91
+ className: "rounded-sm gap-1.5 text-xs font-medium",
92
+ style: colorStyle,
93
+ children: [
94
+ /* @__PURE__ */ jsx(
95
+ "span",
96
+ {
97
+ className: "size-1.5 rounded-full",
98
+ style: color ? { backgroundColor: color } : void 0
99
+ }
100
+ ),
101
+ label
102
+ ]
103
+ }
104
+ );
105
+ }
106
+ function BillingRow({
107
+ icon: Icon,
108
+ label,
109
+ value,
110
+ showCopy = true,
111
+ showDottedLine = true,
112
+ t
113
+ }) {
114
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1.5 min-h-[22px]", children: [
115
+ /* @__PURE__ */ jsx(Icon, { className: "size-3 shrink-0 text-muted-foreground" }),
116
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground font-medium shrink-0", children: [
117
+ label,
118
+ ":"
119
+ ] }),
120
+ showDottedLine && /* @__PURE__ */ jsx("div", { className: "mx-1 hidden flex-1 border-b border-dotted border-border/50 sm:block" }),
121
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 break-words text-xs font-medium text-foreground", children: value }),
122
+ showCopy && /* @__PURE__ */ jsx(
123
+ IconButton,
124
+ {
125
+ type: "button",
126
+ variant: "ghost",
127
+ size: "sm",
128
+ className: "h-auto shrink-0 text-muted-foreground hover:text-foreground transition-colors p-0",
129
+ onClick: () => copyToClipboard(value, t),
130
+ "aria-label": t("customers.companies.detail.copy", "Copy"),
131
+ children: /* @__PURE__ */ jsx(Copy, { className: "size-2.5" })
132
+ }
133
+ )
134
+ ] });
135
+ }
136
+ function CompanyCard({
137
+ data,
138
+ personName,
139
+ statusMap,
140
+ lifecycleMap,
141
+ temperatureMap,
142
+ renewalQuarterMap,
143
+ roleMap
144
+ }) {
145
+ const t = useT();
146
+ const hasBillingSection = data.profile?.legalName || data.primaryAddress?.formatted || data.billing?.bankName || data.billing?.bankAccountMasked || data.billing?.paymentTerms || data.billing?.preferredCurrency;
147
+ const dealValue = data.activeDeal?.valueAmount && data.activeDeal?.valueCurrency ? `${data.activeDeal.valueAmount} ${data.activeDeal.valueCurrency}` : null;
148
+ return /* @__PURE__ */ jsxs("div", { className: "min-w-0 overflow-hidden rounded-2xl border border-border/60 bg-card", children: [
149
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 px-5 py-5 sm:flex-row sm:items-center", children: [
150
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
151
+ /* @__PURE__ */ jsx("div", { className: "flex size-12 shrink-0 items-center justify-center rounded-xl bg-muted", children: /* @__PURE__ */ jsx(Building2, { className: "size-5 text-muted-foreground" }) }),
152
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
153
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
154
+ /* @__PURE__ */ jsx("span", { className: "break-words text-base font-bold", children: data.displayName }),
155
+ data.isPrimary && /* @__PURE__ */ jsx(Badge, { variant: "default", className: "rounded-sm px-1.5 py-0 text-overline font-bold uppercase tracking-wider", children: "PRIMARY" })
156
+ ] }),
157
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "break-words text-sm text-muted-foreground", children: data.subtitle })
158
+ ] })
159
+ ] }),
160
+ /* @__PURE__ */ jsx("div", { className: "self-start sm:self-auto", children: /* @__PURE__ */ jsx(Link, { href: `/backend/customers/companies-v2/${data.companyId}`, children: /* @__PURE__ */ jsx(IconButton, { variant: "ghost", size: "sm", type: "button", children: /* @__PURE__ */ jsx(ExternalLink, { className: "size-4" }) }) }) })
161
+ ] }),
162
+ /* @__PURE__ */ jsx("div", { className: "border-t border-border/60" }),
163
+ /* @__PURE__ */ jsxs("div", { className: "px-5 py-4 space-y-4", children: [
164
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1.5", children: [
165
+ data.profile?.industry && /* @__PURE__ */ jsxs(Badge, { variant: "outline", className: "rounded-sm gap-1.5 text-xs font-medium", children: [
166
+ /* @__PURE__ */ jsx(TagIcon, { className: "size-2.5" }),
167
+ data.profile.industry
168
+ ] }),
169
+ data.profile?.sizeBucket && /* @__PURE__ */ jsxs(Badge, { variant: "outline", className: "rounded-sm gap-1.5 text-xs font-medium", children: [
170
+ /* @__PURE__ */ jsx(Users, { className: "size-2.5" }),
171
+ data.profile.sizeBucket,
172
+ " ",
173
+ t("customers.companies.detail.employees", "employees")
174
+ ] }),
175
+ data.status && /* @__PURE__ */ jsx(StatusDotBadge, { value: data.status, map: statusMap }),
176
+ data.renewalQuarter && /* @__PURE__ */ jsx(
177
+ ColorBadge,
178
+ {
179
+ value: data.renewalQuarter,
180
+ map: renewalQuarterMap,
181
+ fallbackIcon: /* @__PURE__ */ jsx(Clock, { className: "size-2.5" })
182
+ }
183
+ ),
184
+ data.temperature && /* @__PURE__ */ jsx(
185
+ ColorBadge,
186
+ {
187
+ value: data.temperature,
188
+ map: temperatureMap,
189
+ fallbackIcon: /* @__PURE__ */ jsx(Zap, { className: "size-2.5" })
190
+ }
191
+ )
192
+ ] }),
193
+ data.roles.length > 0 && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
194
+ /* @__PURE__ */ jsx("span", { className: "text-overline font-bold uppercase tracking-wider text-muted-foreground", children: t("customers.companies.detail.roleInCompany", "ROLE OF {{name}} IN THIS COMPANY", { name: personName.toUpperCase() }) }),
195
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: data.roles.map((role) => /* @__PURE__ */ jsx(
196
+ ColorBadge,
197
+ {
198
+ value: role.roleValue,
199
+ map: roleMap
200
+ },
201
+ role.id
202
+ )) })
203
+ ] }),
204
+ /* @__PURE__ */ jsx("div", { className: "border-t border-border/60" }),
205
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3", children: [
206
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
207
+ /* @__PURE__ */ jsx("span", { className: "text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1", children: t("customers.companies.detail.activeDeal", "ACTIVE DEAL") }),
208
+ /* @__PURE__ */ jsx("span", { className: "flex min-w-0 items-center gap-1 text-xs font-medium text-foreground", children: data.activeDeal ? /* @__PURE__ */ jsxs(Fragment, { children: [
209
+ /* @__PURE__ */ jsx(Building2, { className: "size-3 shrink-0" }),
210
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 break-words", children: [
211
+ data.activeDeal.title,
212
+ dealValue ? ` \xB7 ${dealValue}` : ""
213
+ ] })
214
+ ] }) : "\u2014" })
215
+ ] }),
216
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
217
+ /* @__PURE__ */ jsx("span", { className: "text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1", children: t("customers.companies.detail.lastContact", "LAST CONTACT") }),
218
+ /* @__PURE__ */ jsx("span", { className: "flex min-w-0 items-center gap-1 break-words text-xs font-medium text-foreground", children: data.lastContactAt ? /* @__PURE__ */ jsxs(Fragment, { children: [
219
+ /* @__PURE__ */ jsx(Clock, { className: "size-3 shrink-0" }),
220
+ formatRelativeTime(data.lastContactAt, t)
221
+ ] }) : "\u2014" })
222
+ ] }),
223
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
224
+ /* @__PURE__ */ jsx("span", { className: "text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1", children: "CLV" }),
225
+ /* @__PURE__ */ jsx("span", { className: "flex min-w-0 items-center gap-1 break-words text-xs font-medium text-foreground", children: data.clv ? /* @__PURE__ */ jsxs(Fragment, { children: [
226
+ /* @__PURE__ */ jsx(TrendingUp, { className: "size-3 shrink-0" }),
227
+ formatCurrency(data.clv.amount, data.clv.currency)
228
+ ] }) : "\u2014" })
229
+ ] })
230
+ ] }),
231
+ hasBillingSection && /* @__PURE__ */ jsxs(Fragment, { children: [
232
+ /* @__PURE__ */ jsx("div", { className: "border-t border-border/60" }),
233
+ /* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-muted/40 border border-border/40 px-3.5 py-3 space-y-1.5", children: [
234
+ data.profile?.legalName && /* @__PURE__ */ jsx(BillingRow, { icon: FileText, label: t("customers.companies.detail.billing.name", "Name"), value: data.profile.legalName, t }),
235
+ data.primaryAddress?.formatted && /* @__PURE__ */ jsx(
236
+ BillingRow,
237
+ {
238
+ icon: MapPin,
239
+ label: t("customers.companies.detail.billing.address", "Address"),
240
+ value: data.primaryAddress.formatted,
241
+ t
242
+ }
243
+ ),
244
+ (data.billing?.bankName || data.billing?.bankAccountMasked) && /* @__PURE__ */ jsx(
245
+ BillingRow,
246
+ {
247
+ icon: CreditCard,
248
+ label: t("customers.fields.bankIban", "Bank / IBAN"),
249
+ value: [data.billing?.bankName, data.billing?.bankAccountMasked].filter(Boolean).join(" \xB7 "),
250
+ t
251
+ }
252
+ ),
253
+ data.billing?.paymentTerms && /* @__PURE__ */ jsx(
254
+ BillingRow,
255
+ {
256
+ icon: Clock,
257
+ label: t("customers.companies.detail.billing.paymentTerms", "Payment terms"),
258
+ value: data.billing.paymentTerms,
259
+ showCopy: false,
260
+ showDottedLine: false,
261
+ t
262
+ }
263
+ ),
264
+ data.billing?.preferredCurrency && /* @__PURE__ */ jsx(
265
+ BillingRow,
266
+ {
267
+ icon: Hash,
268
+ label: t("customers.companies.detail.billing.currency", "Currency"),
269
+ value: data.billing.preferredCurrency,
270
+ showCopy: false,
271
+ showDottedLine: false,
272
+ t
273
+ }
274
+ )
275
+ ] })
276
+ ] })
277
+ ] })
278
+ ] });
279
+ }
280
+ export {
281
+ CompanyCard
282
+ };
283
+ //# sourceMappingURL=CompanyCard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/customers/components/detail/CompanyCard.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport {\n Building2,\n Clock,\n Copy,\n CreditCard,\n ExternalLink,\n FileText,\n Hash,\n MapPin,\n TrendingUp,\n Zap,\n Tag as TagIcon,\n Users,\n} from 'lucide-react'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { renderDictionaryIcon } from '../../../dictionaries/components/dictionaryAppearance'\nimport type { CustomerDictionaryDisplayEntry, CustomerDictionaryMap } from '../../lib/dictionaries'\nimport { formatFallbackLabel } from './utils'\n\nexport type EnrichedCompanyData = {\n linkId: string\n companyId: string\n displayName: string\n isPrimary: boolean\n subtitle: string | null\n profile: {\n industry: string | null\n sizeBucket: string | null\n legalName: string | null\n domain: string | null\n websiteUrl: string | null\n } | null\n billing: {\n bankName: string | null\n bankAccountMasked: string | null\n paymentTerms: string | null\n preferredCurrency: string | null\n } | null\n primaryAddress: { formatted: string } | null\n tags: Array<{ id: string; label: string; color: string | null }>\n roles: Array<{ id: string; roleValue: string }>\n activeDeal: {\n title: string\n valueAmount: string | null\n valueCurrency: string | null\n } | null\n lastContactAt: string | null\n clv: { amount: number; currency: string } | null\n status: string | null\n lifecycleStage: string | null\n temperature: string | null\n renewalQuarter: string | null\n}\n\ntype CompanyCardProps = {\n data: EnrichedCompanyData\n personName: string\n statusMap?: CustomerDictionaryMap | undefined\n lifecycleMap?: CustomerDictionaryMap | undefined\n temperatureMap?: CustomerDictionaryMap | undefined\n renewalQuarterMap?: CustomerDictionaryMap | undefined\n roleMap?: CustomerDictionaryMap | undefined\n}\n\nfunction copyToClipboard(text: string, t: ReturnType<typeof useT>) {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n flash(t('customers.companies.detail.copied', 'Copied to clipboard'), 'success')\n })\n .catch((err) => console.warn('[CompanyCard] clipboard write failed', err))\n}\n\nfunction formatRelativeTime(isoDate: string, t: ReturnType<typeof useT>): string {\n const date = new Date(isoDate)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n if (diffDays === 0) {\n return `${t('customers.companies.detail.relativeTime.today', 'today')}, ${date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`\n }\n if (diffDays === 1) return t('customers.companies.detail.relativeTime.oneDayAgo', '1 day ago')\n if (diffDays < 7) return t('customers.companies.detail.relativeTime.daysAgo', '{{days}} days ago', { days: diffDays })\n if (diffDays < 30) return t('customers.companies.detail.relativeTime.weeksAgo', '{{weeks}} wk. ago', { weeks: Math.floor(diffDays / 7) })\n return t('customers.companies.detail.relativeTime.monthsAgo', '{{months}} mo. ago', { months: Math.floor(diffDays / 30) })\n}\n\nfunction formatCurrency(amount: number, currency: string): string {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n notation: amount >= 1_000_000 ? 'compact' : 'standard',\n }).format(amount)\n } catch {\n if (amount >= 1_000_000) return `${(amount / 1_000_000).toFixed(2)} M ${currency}`\n if (amount >= 1_000) return `${Math.round(amount / 1000)}k ${currency}`\n return `${amount} ${currency}`\n }\n}\n\nfunction ColorBadge({\n value,\n map,\n fallbackIcon,\n}: {\n value: string\n map: Record<string, CustomerDictionaryDisplayEntry> | undefined\n fallbackIcon?: React.ReactNode\n}) {\n const entry = map?.[value]\n const color = entry?.color ?? null\n const icon = entry?.icon ?? null\n const label = entry?.label ?? formatFallbackLabel(value)\n const colorStyle: React.CSSProperties | undefined = color\n ? { color, borderColor: color, backgroundColor: `${color}1A` }\n : undefined\n return (\n <Badge\n variant=\"outline\"\n className=\"rounded-sm gap-1.5 text-xs font-medium\"\n style={colorStyle}\n >\n {icon ? renderDictionaryIcon(icon, 'size-2.5') : fallbackIcon ?? null}\n {label}\n </Badge>\n )\n}\n\nfunction StatusDotBadge({\n value,\n map,\n}: {\n value: string\n map: Record<string, CustomerDictionaryDisplayEntry> | undefined\n}) {\n const entry = map?.[value]\n const color = entry?.color ?? null\n const label = entry?.label ?? formatFallbackLabel(value)\n const colorStyle: React.CSSProperties | undefined = color\n ? { color, borderColor: color, backgroundColor: `${color}1A` }\n : undefined\n return (\n <Badge\n variant=\"outline\"\n className=\"rounded-sm gap-1.5 text-xs font-medium\"\n style={colorStyle}\n >\n <span\n className=\"size-1.5 rounded-full\"\n style={color ? { backgroundColor: color } : undefined}\n />\n {label}\n </Badge>\n )\n}\n\nfunction BillingRow({\n icon: Icon,\n label,\n value,\n showCopy = true,\n showDottedLine = true,\n t,\n}: {\n icon: React.ComponentType<{ className?: string }>\n label: string\n value: string\n showCopy?: boolean\n showDottedLine?: boolean\n t: ReturnType<typeof useT>\n}) {\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1.5 min-h-[22px]\">\n <Icon className=\"size-3 shrink-0 text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground font-medium shrink-0\">{label}:</span>\n {showDottedLine && <div className=\"mx-1 hidden flex-1 border-b border-dotted border-border/50 sm:block\" />}\n <span className=\"min-w-0 break-words text-xs font-medium text-foreground\">{value}</span>\n {showCopy && (\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto shrink-0 text-muted-foreground hover:text-foreground transition-colors p-0\"\n onClick={() => copyToClipboard(value, t)}\n aria-label={t('customers.companies.detail.copy', 'Copy')}\n >\n <Copy className=\"size-2.5\" />\n </IconButton>\n )}\n </div>\n )\n}\n\nexport function CompanyCard({\n data,\n personName,\n statusMap,\n lifecycleMap,\n temperatureMap,\n renewalQuarterMap,\n roleMap,\n}: CompanyCardProps) {\n const t = useT()\n\n const hasBillingSection =\n data.profile?.legalName ||\n data.primaryAddress?.formatted ||\n data.billing?.bankName ||\n data.billing?.bankAccountMasked ||\n data.billing?.paymentTerms ||\n data.billing?.preferredCurrency\n\n const dealValue =\n data.activeDeal?.valueAmount && data.activeDeal?.valueCurrency\n ? `${data.activeDeal.valueAmount} ${data.activeDeal.valueCurrency}`\n : null\n\n return (\n <div className=\"min-w-0 overflow-hidden rounded-2xl border border-border/60 bg-card\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 px-5 py-5 sm:flex-row sm:items-center\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <div className=\"flex size-12 shrink-0 items-center justify-center rounded-xl bg-muted\">\n <Building2 className=\"size-5 text-muted-foreground\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"break-words text-base font-bold\">{data.displayName}</span>\n {data.isPrimary && (\n <Badge variant=\"default\" className=\"rounded-sm px-1.5 py-0 text-overline font-bold uppercase tracking-wider\">\n PRIMARY\n </Badge>\n )}\n </div>\n {data.subtitle && (\n <p className=\"break-words text-sm text-muted-foreground\">{data.subtitle}</p>\n )}\n </div>\n </div>\n <div className=\"self-start sm:self-auto\">\n <Link href={`/backend/customers/companies-v2/${data.companyId}`}>\n <IconButton variant=\"ghost\" size=\"sm\" type=\"button\">\n <ExternalLink className=\"size-4\" />\n </IconButton>\n </Link>\n </div>\n </div>\n\n {/* Divider */}\n <div className=\"border-t border-border/60\" />\n\n {/* Body */}\n <div className=\"px-5 py-4 space-y-4\">\n {/* Info badges */}\n <div className=\"flex flex-wrap gap-1.5\">\n {data.profile?.industry && (\n <Badge variant=\"outline\" className=\"rounded-sm gap-1.5 text-xs font-medium\">\n <TagIcon className=\"size-2.5\" />\n {data.profile.industry}\n </Badge>\n )}\n {data.profile?.sizeBucket && (\n <Badge variant=\"outline\" className=\"rounded-sm gap-1.5 text-xs font-medium\">\n <Users className=\"size-2.5\" />\n {data.profile.sizeBucket} {t('customers.companies.detail.employees', 'employees')}\n </Badge>\n )}\n {data.status && <StatusDotBadge value={data.status} map={statusMap} />}\n {data.renewalQuarter && (\n <ColorBadge\n value={data.renewalQuarter}\n map={renewalQuarterMap}\n fallbackIcon={<Clock className=\"size-2.5\" />}\n />\n )}\n {data.temperature && (\n <ColorBadge\n value={data.temperature}\n map={temperatureMap}\n fallbackIcon={<Zap className=\"size-2.5\" />}\n />\n )}\n </div>\n\n {/* Roles */}\n {data.roles.length > 0 && (\n <div className=\"space-y-1.5\">\n <span className=\"text-overline font-bold uppercase tracking-wider text-muted-foreground\">\n {t('customers.companies.detail.roleInCompany', 'ROLE OF {{name}} IN THIS COMPANY', { name: personName.toUpperCase() })}\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {data.roles.map((role) => (\n <ColorBadge\n key={role.id}\n value={role.roleValue}\n map={roleMap}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Stats divider */}\n <div className=\"border-t border-border/60\" />\n\n {/* Stats row */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n <div className=\"min-w-0\">\n <span className=\"text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1\">\n {t('customers.companies.detail.activeDeal', 'ACTIVE DEAL')}\n </span>\n <span className=\"flex min-w-0 items-center gap-1 text-xs font-medium text-foreground\">\n {data.activeDeal ? (\n <>\n <Building2 className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 break-words\">\n {data.activeDeal.title}\n {dealValue ? ` \u00B7 ${dealValue}` : ''}\n </span>\n </>\n ) : (\n '\u2014'\n )}\n </span>\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1\">\n {t('customers.companies.detail.lastContact', 'LAST CONTACT')}\n </span>\n <span className=\"flex min-w-0 items-center gap-1 break-words text-xs font-medium text-foreground\">\n {data.lastContactAt ? (\n <>\n <Clock className=\"size-3 shrink-0\" />\n {formatRelativeTime(data.lastContactAt, t)}\n </>\n ) : (\n '\u2014'\n )}\n </span>\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1\">\n CLV\n </span>\n <span className=\"flex min-w-0 items-center gap-1 break-words text-xs font-medium text-foreground\">\n {data.clv ? (\n <>\n <TrendingUp className=\"size-3 shrink-0\" />\n {formatCurrency(data.clv.amount, data.clv.currency)}\n </>\n ) : (\n '\u2014'\n )}\n </span>\n </div>\n </div>\n\n {/* Billing section */}\n {hasBillingSection && (\n <>\n <div className=\"border-t border-border/60\" />\n <div className=\"rounded-lg bg-muted/40 border border-border/40 px-3.5 py-3 space-y-1.5\">\n {data.profile?.legalName && (\n <BillingRow icon={FileText} label={t('customers.companies.detail.billing.name', 'Name')} value={data.profile.legalName} t={t} />\n )}\n {data.primaryAddress?.formatted && (\n <BillingRow\n icon={MapPin}\n label={t('customers.companies.detail.billing.address', 'Address')}\n value={data.primaryAddress.formatted}\n t={t}\n />\n )}\n {(data.billing?.bankName || data.billing?.bankAccountMasked) && (\n <BillingRow\n icon={CreditCard}\n label={t('customers.fields.bankIban', 'Bank / IBAN')}\n value={[data.billing?.bankName, data.billing?.bankAccountMasked]\n .filter(Boolean)\n .join(' \u00B7 ')}\n t={t}\n />\n )}\n {data.billing?.paymentTerms && (\n <BillingRow\n icon={Clock}\n label={t('customers.companies.detail.billing.paymentTerms', 'Payment terms')}\n value={data.billing.paymentTerms}\n showCopy={false}\n showDottedLine={false}\n t={t}\n />\n )}\n {data.billing?.preferredCurrency && (\n <BillingRow\n icon={Hash}\n label={t('customers.companies.detail.billing.currency', 'Currency')}\n value={data.billing.preferredCurrency}\n showCopy={false}\n showDottedLine={false}\n t={t}\n />\n )}\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,133 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { EyeOff } from "lucide-react";
5
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
6
+ import { KpiCard } from "@open-mercato/ui/backend/charts/KpiCard";
7
+ import { Button } from "@open-mercato/ui/primitives/button";
8
+ import { IconButton } from "@open-mercato/ui/primitives/icon-button";
9
+ import { InlineActivityComposer } from "./InlineActivityComposer.js";
10
+ import { formatCurrency } from "./utils.js";
11
+ import { computeHealthScore } from "./healthScoreUtils.js";
12
+ import {
13
+ readJsonFromLocalStorage,
14
+ writeJsonToLocalStorage,
15
+ removeLocalStorageKey
16
+ } from "@open-mercato/shared/lib/browser/safeLocalStorage";
17
+ import {
18
+ sumActiveDeals,
19
+ getActiveDeals,
20
+ getOpenTasks,
21
+ getUpcomingMeetings,
22
+ getRecentActivity,
23
+ computeActivityTrend,
24
+ computeDealTrend
25
+ } from "./dashboard/helpers.js";
26
+ import { UpcomingMeetingsWidget } from "./dashboard/UpcomingMeetingsWidget.js";
27
+ import { RelationshipHealthWidget } from "./dashboard/RelationshipHealthWidget.js";
28
+ import { ActiveDealWidget } from "./dashboard/ActiveDealWidget.js";
29
+ import { OpenTasksWidget } from "./dashboard/OpenTasksWidget.js";
30
+ import { RecentActivityWidget } from "./dashboard/RecentActivityWidget.js";
31
+ function CompanyDashboardTab({ data, companyId, onTabChange, onActivityCreated, onScheduleRequested, runGuardedMutation, useCanonicalInteractions }) {
32
+ const t = useT();
33
+ const activeDeals = React.useMemo(() => getActiveDeals(data.deals), [data.deals]);
34
+ const activeDealsValue = React.useMemo(() => sumActiveDeals(data.deals), [data.deals]);
35
+ const openTasks = React.useMemo(() => getOpenTasks(data.todos), [data.todos]);
36
+ const upcomingMeetings = React.useMemo(() => getUpcomingMeetings(data.interactions), [data.interactions]);
37
+ const recentActivity = React.useMemo(() => getRecentActivity(data.interactions), [data.interactions]);
38
+ const dealCurrency = activeDeals[0]?.valueCurrency ?? data.deals[0]?.valueCurrency ?? "PLN";
39
+ const activityTrend = React.useMemo(() => computeActivityTrend(data.interactions), [data.interactions]);
40
+ const dealTrend = React.useMemo(() => computeDealTrend(data.deals), [data.deals]);
41
+ const healthScore = React.useMemo(() => computeHealthScore(data.interactions), [data.interactions]);
42
+ const ltvValue = React.useMemo(() => {
43
+ const wonDeals = data.deals.filter((d) => d.status === "won");
44
+ if (wonDeals.length === 0) return null;
45
+ return wonDeals.reduce((sum, d) => {
46
+ const amt = typeof d.valueAmount === "number" ? d.valueAmount : parseFloat(String(d.valueAmount ?? "0"));
47
+ return sum + (Number.isFinite(amt) ? amt : 0);
48
+ }, 0);
49
+ }, [data.deals]);
50
+ const clientTenureYears = React.useMemo(() => {
51
+ const allDates = data.interactions.map((i) => i.occurredAt ?? i.scheduledAt ?? i.createdAt).filter(Boolean).map((d) => new Date(d).getTime());
52
+ if (allDates.length === 0) return null;
53
+ const earliest = Math.min(...allDates);
54
+ return Math.floor((Date.now() - earliest) / (365.25 * 864e5));
55
+ }, [data.interactions]);
56
+ const [hiddenTiles, setHiddenTiles] = React.useState(
57
+ () => new Set(readJsonFromLocalStorage("om:dashboard-hidden-tiles", []))
58
+ );
59
+ const toggleTile = React.useCallback((tileId) => {
60
+ setHiddenTiles((prev) => {
61
+ const next = new Set(prev);
62
+ if (next.has(tileId)) next.delete(tileId);
63
+ else next.add(tileId);
64
+ writeJsonToLocalStorage("om:dashboard-hidden-tiles", [...next]);
65
+ return next;
66
+ });
67
+ }, []);
68
+ const kpiTiles = [
69
+ { id: "activeDeals", title: t("customers.companies.dashboard.kpi.activeDeals", "ACTIVE DEALS"), value: activeDealsValue, trend: dealTrend, formatValue: (v) => formatCurrency(v, dealCurrency), comparisonLabel: `${activeDeals.length} ${activeDeals.length === 1 ? "pipeline" : "pipelines"}` },
70
+ { id: "activities", title: t("customers.companies.dashboard.kpi.activities", "ACTIVITIES"), value: data.interactions.length, trend: activityTrend, comparisonLabel: t("customers.companies.dashboard.kpi.last12months", "last 12 months") },
71
+ { id: "ltv", title: t("customers.companies.dashboard.kpi.ltv", "CUSTOMER VALUE (LTV)"), value: ltvValue, formatValue: ltvValue !== null ? (v) => formatCurrency(v, dealCurrency) : void 0, comparisonLabel: ltvValue !== null ? t("customers.companies.dashboard.kpi.wonDeals", "won deals total") : t("customers.companies.dashboard.kpi.noWonDeals", "No won deals") },
72
+ { id: "clientSince", title: t("customers.companies.dashboard.kpi.clientSince", "CLIENT SINCE"), value: clientTenureYears, formatValue: clientTenureYears !== null ? (v) => v < 1 ? `< 1 ${t("customers.companies.dashboard.kpi.year", "year")}` : `${v} ${v === 1 ? t("customers.companies.dashboard.kpi.year", "year") : t("customers.companies.dashboard.kpi.years", "years")}` : void 0, comparisonLabel: clientTenureYears !== null ? `${data.deals.filter((d) => d.status === "won").length} ${t("customers.companies.dashboard.kpi.completedDeals", "completed deals")}` : t("customers.companies.dashboard.kpi.noInteractions", "No interactions yet") }
73
+ ];
74
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
75
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-4 lg:grid-cols-4", children: kpiTiles.filter((tile) => !hiddenTiles.has(tile.id)).map((tile) => /* @__PURE__ */ jsxs("div", { className: "relative group", children: [
76
+ /* @__PURE__ */ jsx(
77
+ KpiCard,
78
+ {
79
+ title: tile.title,
80
+ value: tile.value,
81
+ trend: tile.trend,
82
+ formatValue: tile.formatValue,
83
+ comparisonLabel: tile.comparisonLabel
84
+ }
85
+ ),
86
+ /* @__PURE__ */ jsx(
87
+ IconButton,
88
+ {
89
+ type: "button",
90
+ variant: "ghost",
91
+ size: "sm",
92
+ onClick: () => toggleTile(tile.id),
93
+ className: "h-auto absolute top-2 right-2 opacity-0 group-hover:opacity-60 transition-opacity text-muted-foreground hover:text-foreground p-0",
94
+ "aria-label": t("customers.companies.dashboard.hideTile", "Hide tile"),
95
+ children: /* @__PURE__ */ jsx(EyeOff, { className: "size-3.5" })
96
+ }
97
+ )
98
+ ] }, tile.id)) }),
99
+ hiddenTiles.size > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
100
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: t("customers.companies.dashboard.hiddenTiles", "{{count}} tiles hidden", { count: hiddenTiles.size }) }),
101
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-auto text-xs px-1.5 py-0.5", onClick: () => {
102
+ setHiddenTiles(/* @__PURE__ */ new Set());
103
+ removeLocalStorageKey("om:dashboard-hidden-tiles");
104
+ }, children: t("customers.companies.dashboard.showAll", "Show all") })
105
+ ] }),
106
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-6 lg:grid-cols-[1fr_380px]", children: [
107
+ /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
108
+ /* @__PURE__ */ jsx(UpcomingMeetingsWidget, { meetings: upcomingMeetings, t }),
109
+ /* @__PURE__ */ jsx(OpenTasksWidget, { tasks: openTasks, t, onViewAll: () => onTabChange("activity-log"), currentUserId: null })
110
+ ] }),
111
+ /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
112
+ /* @__PURE__ */ jsx(RelationshipHealthWidget, { health: healthScore, t }),
113
+ /* @__PURE__ */ jsx(ActiveDealWidget, { deals: activeDeals, t })
114
+ ] })
115
+ ] }),
116
+ /* @__PURE__ */ jsx(
117
+ InlineActivityComposer,
118
+ {
119
+ entityType: "company",
120
+ entityId: companyId,
121
+ onActivityCreated,
122
+ runGuardedMutation,
123
+ onScheduleRequested,
124
+ useCanonicalInteractions
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsx(RecentActivityWidget, { interactions: recentActivity, t })
128
+ ] });
129
+ }
130
+ export {
131
+ CompanyDashboardTab
132
+ };
133
+ //# sourceMappingURL=CompanyDashboardTab.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/customers/components/detail/CompanyDashboardTab.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { EyeOff } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { KpiCard, type KpiTrend } from '@open-mercato/ui/backend/charts/KpiCard'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { InlineActivityComposer } from './InlineActivityComposer'\nimport type { CompanyOverview } from '../formConfig'\nimport { formatCurrency } from './utils'\nimport { computeHealthScore } from './healthScoreUtils'\nimport {\n readJsonFromLocalStorage,\n writeJsonToLocalStorage,\n removeLocalStorageKey,\n} from '@open-mercato/shared/lib/browser/safeLocalStorage'\nimport {\n sumActiveDeals,\n getActiveDeals,\n getOpenTasks,\n getUpcomingMeetings,\n getRecentActivity,\n computeActivityTrend,\n computeDealTrend,\n} from './dashboard/helpers'\nimport { UpcomingMeetingsWidget } from './dashboard/UpcomingMeetingsWidget'\nimport { RelationshipHealthWidget } from './dashboard/RelationshipHealthWidget'\nimport { ActiveDealWidget } from './dashboard/ActiveDealWidget'\nimport { OpenTasksWidget } from './dashboard/OpenTasksWidget'\nimport { RecentActivityWidget } from './dashboard/RecentActivityWidget'\n\ntype GuardedMutationRunner = <T>(\n operation: () => Promise<T>,\n mutationPayload?: Record<string, unknown>,\n) => Promise<T>\n\ntype CompanyDashboardTabProps = {\n data: CompanyOverview\n companyId: string\n onTabChange: (tab: string) => void\n onActivityCreated?: () => void\n onScheduleRequested?: () => void\n runGuardedMutation?: GuardedMutationRunner\n useCanonicalInteractions?: boolean\n}\n\nexport function CompanyDashboardTab({ data, companyId, onTabChange, onActivityCreated, onScheduleRequested, runGuardedMutation, useCanonicalInteractions }: CompanyDashboardTabProps) {\n const t = useT()\n\n const activeDeals = React.useMemo(() => getActiveDeals(data.deals), [data.deals])\n const activeDealsValue = React.useMemo(() => sumActiveDeals(data.deals), [data.deals])\n const openTasks = React.useMemo(() => getOpenTasks(data.todos), [data.todos])\n const upcomingMeetings = React.useMemo(() => getUpcomingMeetings(data.interactions), [data.interactions])\n const recentActivity = React.useMemo(() => getRecentActivity(data.interactions), [data.interactions])\n\n const dealCurrency = activeDeals[0]?.valueCurrency ?? data.deals[0]?.valueCurrency ?? 'PLN'\n const activityTrend = React.useMemo(() => computeActivityTrend(data.interactions), [data.interactions])\n const dealTrend = React.useMemo(() => computeDealTrend(data.deals), [data.deals])\n const healthScore = React.useMemo(() => computeHealthScore(data.interactions), [data.interactions])\n\n const ltvValue = React.useMemo(() => {\n const wonDeals = data.deals.filter((d) => d.status === 'won')\n if (wonDeals.length === 0) return null\n return wonDeals.reduce((sum, d) => {\n const amt = typeof d.valueAmount === 'number' ? d.valueAmount : parseFloat(String(d.valueAmount ?? '0'))\n return sum + (Number.isFinite(amt) ? amt : 0)\n }, 0)\n }, [data.deals])\n\n const clientTenureYears = React.useMemo(() => {\n const allDates = data.interactions\n .map((i) => i.occurredAt ?? i.scheduledAt ?? i.createdAt)\n .filter(Boolean)\n .map((d) => new Date(d).getTime())\n if (allDates.length === 0) return null\n const earliest = Math.min(...allDates)\n return Math.floor((Date.now() - earliest) / (365.25 * 86_400_000))\n }, [data.interactions])\n\n const [hiddenTiles, setHiddenTiles] = React.useState<Set<string>>(\n () => new Set(readJsonFromLocalStorage<string[]>('om:dashboard-hidden-tiles', [])),\n )\n\n const toggleTile = React.useCallback((tileId: string) => {\n setHiddenTiles((prev) => {\n const next = new Set(prev)\n if (next.has(tileId)) next.delete(tileId)\n else next.add(tileId)\n writeJsonToLocalStorage('om:dashboard-hidden-tiles', [...next])\n return next\n })\n }, [])\n\n const kpiTiles: Array<{ id: string; title: string; value: number | null; trend?: KpiTrend; formatValue?: (v: number) => string; comparisonLabel: string }> = [\n { id: 'activeDeals', title: t('customers.companies.dashboard.kpi.activeDeals', 'ACTIVE DEALS'), value: activeDealsValue, trend: dealTrend, formatValue: (v: number) => formatCurrency(v, dealCurrency), comparisonLabel: `${activeDeals.length} ${activeDeals.length === 1 ? 'pipeline' : 'pipelines'}` },\n { id: 'activities', title: t('customers.companies.dashboard.kpi.activities', 'ACTIVITIES'), value: data.interactions.length, trend: activityTrend, comparisonLabel: t('customers.companies.dashboard.kpi.last12months', 'last 12 months') },\n { id: 'ltv', title: t('customers.companies.dashboard.kpi.ltv', 'CUSTOMER VALUE (LTV)'), value: ltvValue, formatValue: ltvValue !== null ? (v: number) => formatCurrency(v, dealCurrency) : undefined, comparisonLabel: ltvValue !== null ? t('customers.companies.dashboard.kpi.wonDeals', 'won deals total') : t('customers.companies.dashboard.kpi.noWonDeals', 'No won deals') },\n { id: 'clientSince', title: t('customers.companies.dashboard.kpi.clientSince', 'CLIENT SINCE'), value: clientTenureYears, formatValue: clientTenureYears !== null ? (v: number) => v < 1 ? `< 1 ${t('customers.companies.dashboard.kpi.year', 'year')}` : `${v} ${v === 1 ? t('customers.companies.dashboard.kpi.year', 'year') : t('customers.companies.dashboard.kpi.years', 'years')}` : undefined, comparisonLabel: clientTenureYears !== null ? `${data.deals.filter(d => d.status === 'won').length} ${t('customers.companies.dashboard.kpi.completedDeals', 'completed deals')}` : t('customers.companies.dashboard.kpi.noInteractions', 'No interactions yet') },\n ]\n\n return (\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {kpiTiles.filter((tile) => !hiddenTiles.has(tile.id)).map((tile) => (\n <div key={tile.id} className=\"relative group\">\n <KpiCard\n title={tile.title}\n value={tile.value}\n trend={tile.trend}\n formatValue={tile.formatValue}\n comparisonLabel={tile.comparisonLabel}\n />\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => toggleTile(tile.id)}\n className=\"h-auto absolute top-2 right-2 opacity-0 group-hover:opacity-60 transition-opacity text-muted-foreground hover:text-foreground p-0\"\n aria-label={t('customers.companies.dashboard.hideTile', 'Hide tile')}\n >\n <EyeOff className=\"size-3.5\" />\n </IconButton>\n </div>\n ))}\n </div>\n {hiddenTiles.size > 0 && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {t('customers.companies.dashboard.hiddenTiles', '{{count}} tiles hidden', { count: hiddenTiles.size })}\n </span>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-auto text-xs px-1.5 py-0.5\" onClick={() => { setHiddenTiles(new Set()); removeLocalStorageKey('om:dashboard-hidden-tiles') }}>\n {t('customers.companies.dashboard.showAll', 'Show all')}\n </Button>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-[1fr_380px]\">\n <div className=\"space-y-6\">\n <UpcomingMeetingsWidget meetings={upcomingMeetings} t={t} />\n <OpenTasksWidget tasks={openTasks} t={t} onViewAll={() => onTabChange('activity-log')} currentUserId={null} />\n </div>\n <div className=\"space-y-6\">\n <RelationshipHealthWidget health={healthScore} t={t} />\n <ActiveDealWidget deals={activeDeals} t={t} />\n </div>\n </div>\n\n <InlineActivityComposer\n entityType=\"company\"\n entityId={companyId}\n onActivityCreated={onActivityCreated}\n runGuardedMutation={runGuardedMutation}\n onScheduleRequested={onScheduleRequested}\n useCanonicalInteractions={useCanonicalInteractions}\n />\n\n <RecentActivityWidget interactions={recentActivity} t={t} />\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }