@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,235 @@
1
+ import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
2
+ import { findWithDecryption, findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
3
+ import {
4
+ CustomerEntity,
5
+ CustomerPersonCompanyLink
6
+ } from "../data/entities.js";
7
+ import { withActiveCustomerPersonCompanyLinkFilter } from "./personCompanyLinkTable.js";
8
+ async function findDeletedPersonCompanyLink(em, person, company) {
9
+ const link = await findOneWithDecryption(
10
+ em,
11
+ CustomerPersonCompanyLink,
12
+ {
13
+ person,
14
+ company,
15
+ organizationId: person.organizationId,
16
+ tenantId: person.tenantId,
17
+ deletedAt: { $ne: null }
18
+ },
19
+ {},
20
+ { tenantId: person.tenantId, organizationId: person.organizationId }
21
+ );
22
+ return link ?? null;
23
+ }
24
+ async function requireCompany(em, companyId, organizationId, tenantId) {
25
+ const company = await findOneWithDecryption(em, CustomerEntity, { id: companyId, kind: "company", deletedAt: null }, {}, { tenantId, organizationId });
26
+ if (!company) {
27
+ throw new CrudHttpError(404, { error: "Company not found" });
28
+ }
29
+ if (company.organizationId !== organizationId || company.tenantId !== tenantId) {
30
+ throw new CrudHttpError(403, { error: "Cannot link company outside current scope" });
31
+ }
32
+ return company;
33
+ }
34
+ async function loadPersonCompanyLinks(em, person) {
35
+ const where = await withActiveCustomerPersonCompanyLinkFilter(
36
+ em,
37
+ { person, organizationId: person.organizationId, tenantId: person.tenantId },
38
+ "customers.personCompanies.loadPersonCompanyLinks"
39
+ );
40
+ return findWithDecryption(
41
+ em,
42
+ CustomerPersonCompanyLink,
43
+ where,
44
+ { populate: ["company"], orderBy: { isPrimary: "desc", createdAt: "asc" } },
45
+ { tenantId: person.tenantId, organizationId: person.organizationId }
46
+ );
47
+ }
48
+ function summarizePersonCompanies(profile, links) {
49
+ if (links.length > 0) {
50
+ const items = [];
51
+ links.forEach((link) => {
52
+ const company = typeof link.company === "string" ? null : link.company;
53
+ if (!company) return;
54
+ items.push({
55
+ linkId: link.id,
56
+ companyId: company.id,
57
+ displayName: company.displayName,
58
+ isPrimary: Boolean(link.isPrimary)
59
+ });
60
+ });
61
+ return items;
62
+ }
63
+ const fallbackCompany = profile?.company && typeof profile.company !== "string" ? profile.company : null;
64
+ if (!fallbackCompany) return [];
65
+ return [
66
+ {
67
+ linkId: fallbackCompany.id,
68
+ companyId: fallbackCompany.id,
69
+ displayName: fallbackCompany.displayName,
70
+ isPrimary: true,
71
+ synthetic: true
72
+ }
73
+ ];
74
+ }
75
+ async function clearPrimaryFlags(em, person) {
76
+ await em.nativeUpdate(
77
+ CustomerPersonCompanyLink,
78
+ { person, organizationId: person.organizationId, tenantId: person.tenantId, isPrimary: true },
79
+ { isPrimary: false }
80
+ );
81
+ }
82
+ function resolveLinkedCompany(link) {
83
+ return typeof link.company === "string" ? null : link.company;
84
+ }
85
+ async function promoteFallbackPrimaryLink(em, person, profile, links, removedCompanyId) {
86
+ const nextPrimary = links[0] ?? null;
87
+ if (!nextPrimary) {
88
+ if (!removedCompanyId || profile.company && typeof profile.company !== "string" && profile.company.id === removedCompanyId || profile.company == null) {
89
+ profile.company = null;
90
+ }
91
+ return;
92
+ }
93
+ await clearPrimaryFlags(em, person);
94
+ nextPrimary.isPrimary = true;
95
+ const nextCompany = resolveLinkedCompany(nextPrimary);
96
+ if (nextCompany) {
97
+ profile.company = nextCompany;
98
+ }
99
+ }
100
+ async function syncLegacyPrimaryCompanyLink(em, person, profile, companyId) {
101
+ const normalizedCompanyId = typeof companyId === "string" && companyId.trim().length > 0 ? companyId.trim() : null;
102
+ const existingLinks = await loadPersonCompanyLinks(em, person);
103
+ if (!normalizedCompanyId) {
104
+ if (existingLinks.some((link) => link.isPrimary)) {
105
+ await clearPrimaryFlags(em, person);
106
+ }
107
+ profile.company = null;
108
+ return;
109
+ }
110
+ const company = await requireCompany(em, normalizedCompanyId, person.organizationId, person.tenantId);
111
+ const currentLink = existingLinks.find((link) => (typeof link.company === "string" ? link.company : link.company.id) === company.id) ?? null;
112
+ if (currentLink) {
113
+ if (!currentLink.isPrimary) {
114
+ await clearPrimaryFlags(em, person);
115
+ currentLink.isPrimary = true;
116
+ } else if (existingLinks.some((link) => link.id !== currentLink.id && link.isPrimary)) {
117
+ await clearPrimaryFlags(em, person);
118
+ currentLink.isPrimary = true;
119
+ }
120
+ } else {
121
+ await clearPrimaryFlags(em, person);
122
+ const link = em.create(CustomerPersonCompanyLink, {
123
+ organizationId: person.organizationId,
124
+ tenantId: person.tenantId,
125
+ person,
126
+ company,
127
+ isPrimary: true
128
+ });
129
+ em.persist(link);
130
+ }
131
+ profile.company = company;
132
+ }
133
+ async function addPersonCompanyLink(em, person, profile, companyId, options) {
134
+ const company = await requireCompany(em, companyId, person.organizationId, person.tenantId);
135
+ const existingLinks = await loadPersonCompanyLinks(em, person);
136
+ const makePrimary = Boolean(options?.isPrimary) || existingLinks.length === 0;
137
+ const existing = existingLinks.find((link2) => (typeof link2.company === "string" ? link2.company : link2.company.id) === company.id) ?? null;
138
+ if (existing) {
139
+ if (makePrimary && !existing.isPrimary) {
140
+ await clearPrimaryFlags(em, person);
141
+ existing.isPrimary = true;
142
+ profile.company = company;
143
+ }
144
+ return existing;
145
+ }
146
+ if (makePrimary) {
147
+ await clearPrimaryFlags(em, person);
148
+ }
149
+ const deletedLink = await findDeletedPersonCompanyLink(em, person, company);
150
+ const link = deletedLink ?? em.create(CustomerPersonCompanyLink, {
151
+ organizationId: person.organizationId,
152
+ tenantId: person.tenantId,
153
+ person,
154
+ company,
155
+ isPrimary: makePrimary
156
+ });
157
+ if (deletedLink) {
158
+ deletedLink.deletedAt = null;
159
+ deletedLink.isPrimary = makePrimary;
160
+ }
161
+ em.persist(link);
162
+ if (makePrimary) {
163
+ profile.company = company;
164
+ } else if (!profile.company && existingLinks.length === 0) {
165
+ profile.company = company;
166
+ link.isPrimary = true;
167
+ }
168
+ return link;
169
+ }
170
+ async function updatePersonCompanyLink(em, person, profile, linkId, patch) {
171
+ const existingLinks = await loadPersonCompanyLinks(em, person);
172
+ const link = existingLinks.find((entry) => entry.id === linkId) ?? existingLinks.find((entry) => (typeof entry.company === "string" ? entry.company : entry.company.id) === linkId) ?? null;
173
+ if (!link && profile.company && typeof profile.company !== "string" && profile.company.id === linkId && patch.isPrimary === false) {
174
+ profile.company = null;
175
+ return null;
176
+ }
177
+ if (!link) {
178
+ throw new CrudHttpError(404, { error: "Company link not found" });
179
+ }
180
+ if (patch.isPrimary === true) {
181
+ await clearPrimaryFlags(em, person);
182
+ link.isPrimary = true;
183
+ const company = resolveLinkedCompany(link);
184
+ if (company) {
185
+ profile.company = company;
186
+ }
187
+ } else if (patch.isPrimary === false) {
188
+ const linkWasPrimary = link.isPrimary;
189
+ const removedCompanyId = typeof link.company === "string" ? link.company : link.company.id;
190
+ link.isPrimary = false;
191
+ if (linkWasPrimary) {
192
+ const remainingLinks = existingLinks.filter((entry) => entry.id !== link.id);
193
+ await promoteFallbackPrimaryLink(em, person, profile, remainingLinks, removedCompanyId);
194
+ } else if (profile.company && typeof profile.company !== "string" && profile.company.id === removedCompanyId) {
195
+ profile.company = null;
196
+ }
197
+ }
198
+ return link;
199
+ }
200
+ async function removePersonCompanyLink(em, person, profile, linkId) {
201
+ const existingLinks = await loadPersonCompanyLinks(em, person);
202
+ const link = existingLinks.find((entry) => entry.id === linkId) ?? existingLinks.find((entry) => (typeof entry.company === "string" ? entry.company : entry.company.id) === linkId) ?? null;
203
+ if (!link) {
204
+ if (profile.company && typeof profile.company !== "string" && profile.company.id === linkId) {
205
+ profile.company = null;
206
+ return;
207
+ }
208
+ throw new CrudHttpError(404, { error: "Company link not found" });
209
+ }
210
+ const removedCompanyId = typeof link.company === "string" ? link.company : link.company.id;
211
+ const removedWasPrimary = link.isPrimary;
212
+ link.isPrimary = false;
213
+ link.deletedAt = /* @__PURE__ */ new Date();
214
+ const remainingLinks = existingLinks.filter((entry) => entry.id !== link.id);
215
+ if (removedWasPrimary) {
216
+ await promoteFallbackPrimaryLink(em, person, profile, remainingLinks, removedCompanyId);
217
+ } else if (profile.company && typeof profile.company !== "string" && profile.company.id === removedCompanyId) {
218
+ const primary = remainingLinks.find((entry) => entry.isPrimary) ?? null;
219
+ const primaryCompany = primary ? resolveLinkedCompany(primary) : null;
220
+ if (primaryCompany) {
221
+ profile.company = primaryCompany;
222
+ }
223
+ }
224
+ }
225
+ export {
226
+ addPersonCompanyLink,
227
+ findDeletedPersonCompanyLink,
228
+ loadPersonCompanyLinks,
229
+ promoteFallbackPrimaryLink,
230
+ removePersonCompanyLink,
231
+ summarizePersonCompanies,
232
+ syncLegacyPrimaryCompanyLink,
233
+ updatePersonCompanyLink
234
+ };
235
+ //# sourceMappingURL=personCompanies.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/lib/personCompanies.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { findWithDecryption, findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport {\n CustomerEntity,\n CustomerPersonCompanyLink,\n CustomerPersonProfile,\n} from '../data/entities'\nimport { withActiveCustomerPersonCompanyLinkFilter } from './personCompanyLinkTable'\n\nexport type PersonCompanySummary = {\n linkId: string | null\n companyId: string\n displayName: string\n isPrimary: boolean\n synthetic?: boolean\n}\n\nexport async function findDeletedPersonCompanyLink(\n em: EntityManager,\n person: CustomerEntity,\n company: CustomerEntity,\n): Promise<CustomerPersonCompanyLink | null> {\n const link = await findOneWithDecryption(\n em,\n CustomerPersonCompanyLink,\n {\n person,\n company,\n organizationId: person.organizationId,\n tenantId: person.tenantId,\n deletedAt: { $ne: null },\n } as any,\n {},\n { tenantId: person.tenantId, organizationId: person.organizationId },\n )\n return link ?? null\n}\n\nasync function requireCompany(\n em: EntityManager,\n companyId: string,\n organizationId: string,\n tenantId: string,\n): Promise<CustomerEntity> {\n const company = await findOneWithDecryption(em, CustomerEntity, { id: companyId, kind: 'company', deletedAt: null }, {}, { tenantId, organizationId })\n if (!company) {\n throw new CrudHttpError(404, { error: 'Company not found' })\n }\n if (company.organizationId !== organizationId || company.tenantId !== tenantId) {\n throw new CrudHttpError(403, { error: 'Cannot link company outside current scope' })\n }\n return company\n}\n\nexport async function loadPersonCompanyLinks(\n em: EntityManager,\n person: CustomerEntity,\n): Promise<CustomerPersonCompanyLink[]> {\n const where = await withActiveCustomerPersonCompanyLinkFilter(\n em,\n { person, organizationId: person.organizationId, tenantId: person.tenantId },\n 'customers.personCompanies.loadPersonCompanyLinks',\n )\n return findWithDecryption(\n em,\n CustomerPersonCompanyLink,\n where,\n { populate: ['company'], orderBy: { isPrimary: 'desc', createdAt: 'asc' } },\n { tenantId: person.tenantId, organizationId: person.organizationId },\n )\n}\n\nexport function summarizePersonCompanies(\n profile: CustomerPersonProfile | null,\n links: CustomerPersonCompanyLink[],\n): PersonCompanySummary[] {\n if (links.length > 0) {\n const items: PersonCompanySummary[] = []\n links.forEach((link) => {\n const company = typeof link.company === 'string' ? null : link.company\n if (!company) return\n items.push({\n linkId: link.id,\n companyId: company.id,\n displayName: company.displayName,\n isPrimary: Boolean(link.isPrimary),\n })\n })\n return items\n }\n\n const fallbackCompany = profile?.company && typeof profile.company !== 'string' ? profile.company : null\n if (!fallbackCompany) return []\n\n return [\n {\n linkId: fallbackCompany.id,\n companyId: fallbackCompany.id,\n displayName: fallbackCompany.displayName,\n isPrimary: true,\n synthetic: true,\n },\n ]\n}\n\nasync function clearPrimaryFlags(em: EntityManager, person: CustomerEntity): Promise<void> {\n await em.nativeUpdate(\n CustomerPersonCompanyLink,\n { person, organizationId: person.organizationId, tenantId: person.tenantId, isPrimary: true },\n { isPrimary: false },\n )\n}\n\nfunction resolveLinkedCompany(link: CustomerPersonCompanyLink): CustomerEntity | null {\n return typeof link.company === 'string' ? null : link.company\n}\n\nexport async function promoteFallbackPrimaryLink(\n em: EntityManager,\n person: CustomerEntity,\n profile: CustomerPersonProfile,\n links: CustomerPersonCompanyLink[],\n removedCompanyId?: string | null,\n): Promise<void> {\n const nextPrimary = links[0] ?? null\n if (!nextPrimary) {\n if (\n !removedCompanyId\n || (profile.company && typeof profile.company !== 'string' && profile.company.id === removedCompanyId)\n || profile.company == null\n ) {\n profile.company = null\n }\n return\n }\n\n await clearPrimaryFlags(em, person)\n nextPrimary.isPrimary = true\n const nextCompany = resolveLinkedCompany(nextPrimary)\n if (nextCompany) {\n profile.company = nextCompany\n }\n}\n\nexport async function syncLegacyPrimaryCompanyLink(\n em: EntityManager,\n person: CustomerEntity,\n profile: CustomerPersonProfile,\n companyId: string | null | undefined,\n): Promise<void> {\n const normalizedCompanyId = typeof companyId === 'string' && companyId.trim().length > 0 ? companyId.trim() : null\n const existingLinks = await loadPersonCompanyLinks(em, person)\n\n if (!normalizedCompanyId) {\n if (existingLinks.some((link) => link.isPrimary)) {\n await clearPrimaryFlags(em, person)\n }\n profile.company = null\n return\n }\n\n const company = await requireCompany(em, normalizedCompanyId, person.organizationId, person.tenantId)\n const currentLink =\n existingLinks.find((link) => (typeof link.company === 'string' ? link.company : link.company.id) === company.id) ?? null\n\n if (currentLink) {\n if (!currentLink.isPrimary) {\n await clearPrimaryFlags(em, person)\n currentLink.isPrimary = true\n } else if (existingLinks.some((link) => link.id !== currentLink.id && link.isPrimary)) {\n await clearPrimaryFlags(em, person)\n currentLink.isPrimary = true\n }\n } else {\n await clearPrimaryFlags(em, person)\n const link = em.create(CustomerPersonCompanyLink, {\n organizationId: person.organizationId,\n tenantId: person.tenantId,\n person,\n company,\n isPrimary: true,\n })\n em.persist(link)\n }\n\n profile.company = company\n}\n\nexport async function addPersonCompanyLink(\n em: EntityManager,\n person: CustomerEntity,\n profile: CustomerPersonProfile,\n companyId: string,\n options?: { isPrimary?: boolean },\n): Promise<CustomerPersonCompanyLink> {\n const company = await requireCompany(em, companyId, person.organizationId, person.tenantId)\n const existingLinks = await loadPersonCompanyLinks(em, person)\n const makePrimary = Boolean(options?.isPrimary) || existingLinks.length === 0\n const existing =\n existingLinks.find((link) => (typeof link.company === 'string' ? link.company : link.company.id) === company.id) ?? null\n\n if (existing) {\n if (makePrimary && !existing.isPrimary) {\n await clearPrimaryFlags(em, person)\n existing.isPrimary = true\n profile.company = company\n }\n return existing\n }\n\n if (makePrimary) {\n await clearPrimaryFlags(em, person)\n }\n\n const deletedLink = await findDeletedPersonCompanyLink(em, person, company)\n const link = deletedLink ?? em.create(CustomerPersonCompanyLink, {\n organizationId: person.organizationId,\n tenantId: person.tenantId,\n person,\n company,\n isPrimary: makePrimary,\n })\n if (deletedLink) {\n deletedLink.deletedAt = null\n deletedLink.isPrimary = makePrimary\n }\n em.persist(link)\n\n if (makePrimary) {\n profile.company = company\n } else if (!profile.company && existingLinks.length === 0) {\n profile.company = company\n link.isPrimary = true\n }\n\n return link\n}\n\nexport async function updatePersonCompanyLink(\n em: EntityManager,\n person: CustomerEntity,\n profile: CustomerPersonProfile,\n linkId: string,\n patch: { isPrimary?: boolean },\n): Promise<CustomerPersonCompanyLink | null> {\n const existingLinks = await loadPersonCompanyLinks(em, person)\n const link = existingLinks.find((entry) => entry.id === linkId)\n ?? existingLinks.find((entry) => (typeof entry.company === 'string' ? entry.company : entry.company.id) === linkId)\n ?? null\n\n if (!link && profile.company && typeof profile.company !== 'string' && profile.company.id === linkId && patch.isPrimary === false) {\n profile.company = null\n return null\n }\n\n if (!link) {\n throw new CrudHttpError(404, { error: 'Company link not found' })\n }\n\n if (patch.isPrimary === true) {\n await clearPrimaryFlags(em, person)\n link.isPrimary = true\n const company = resolveLinkedCompany(link)\n if (company) {\n profile.company = company\n }\n } else if (patch.isPrimary === false) {\n const linkWasPrimary = link.isPrimary\n const removedCompanyId = typeof link.company === 'string' ? link.company : link.company.id\n link.isPrimary = false\n if (linkWasPrimary) {\n const remainingLinks = existingLinks.filter((entry) => entry.id !== link.id)\n await promoteFallbackPrimaryLink(em, person, profile, remainingLinks, removedCompanyId)\n } else if (profile.company && typeof profile.company !== 'string' && profile.company.id === removedCompanyId) {\n profile.company = null\n }\n }\n\n return link\n}\n\nexport async function removePersonCompanyLink(\n em: EntityManager,\n person: CustomerEntity,\n profile: CustomerPersonProfile,\n linkId: string,\n): Promise<void> {\n const existingLinks = await loadPersonCompanyLinks(em, person)\n const link = existingLinks.find((entry) => entry.id === linkId)\n ?? existingLinks.find((entry) => (typeof entry.company === 'string' ? entry.company : entry.company.id) === linkId)\n ?? null\n\n if (!link) {\n if (profile.company && typeof profile.company !== 'string' && profile.company.id === linkId) {\n profile.company = null\n return\n }\n throw new CrudHttpError(404, { error: 'Company link not found' })\n }\n\n const removedCompanyId = typeof link.company === 'string' ? link.company : link.company.id\n const removedWasPrimary = link.isPrimary\n link.isPrimary = false\n link.deletedAt = new Date()\n const remainingLinks = existingLinks.filter((entry) => entry.id !== link.id)\n\n if (removedWasPrimary) {\n await promoteFallbackPrimaryLink(em, person, profile, remainingLinks, removedCompanyId)\n } else if (profile.company && typeof profile.company !== 'string' && profile.company.id === removedCompanyId) {\n const primary = remainingLinks.find((entry) => entry.isPrimary) ?? null\n const primaryCompany = primary ? resolveLinkedCompany(primary) : null\n if (primaryCompany) {\n profile.company = primaryCompany\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["link"]
7
+ }
@@ -0,0 +1,42 @@
1
+ const PERSON_COMPANY_LINKS_TABLE = "customer_person_company_links";
2
+ const PERSON_COMPANY_LINKS_DELETED_AT_COLUMN = "deleted_at";
3
+ let supportsDeletedAtColumnPromise = null;
4
+ let warnedAboutMissingDeletedAtColumn = false;
5
+ function getKnex(em) {
6
+ return em.getConnection().getKnex();
7
+ }
8
+ async function customerPersonCompanyLinksSupportDeletedAt(em) {
9
+ if (typeof em.getConnection !== "function") {
10
+ return true;
11
+ }
12
+ if (!supportsDeletedAtColumnPromise) {
13
+ supportsDeletedAtColumnPromise = getKnex(em)("information_schema.columns").where({
14
+ table_name: PERSON_COMPANY_LINKS_TABLE,
15
+ column_name: PERSON_COMPANY_LINKS_DELETED_AT_COLUMN
16
+ }).first().then((row) => !!row).catch(() => false);
17
+ }
18
+ return supportsDeletedAtColumnPromise;
19
+ }
20
+ function warnMissingCustomerPersonCompanyLinksDeletedAt(source) {
21
+ if (warnedAboutMissingDeletedAtColumn) {
22
+ return;
23
+ }
24
+ warnedAboutMissingDeletedAtColumn = true;
25
+ console.warn(
26
+ `[${source}] missing ${PERSON_COMPANY_LINKS_TABLE}.${PERSON_COMPANY_LINKS_DELETED_AT_COLUMN}; continuing without link soft-delete filtering. Run yarn db:migrate.`
27
+ );
28
+ }
29
+ async function withActiveCustomerPersonCompanyLinkFilter(em, where, source) {
30
+ const supportsDeletedAt = await customerPersonCompanyLinksSupportDeletedAt(em);
31
+ if (!supportsDeletedAt) {
32
+ warnMissingCustomerPersonCompanyLinksDeletedAt(source);
33
+ return { ...where };
34
+ }
35
+ return { ...where, deletedAt: null };
36
+ }
37
+ export {
38
+ customerPersonCompanyLinksSupportDeletedAt,
39
+ warnMissingCustomerPersonCompanyLinksDeletedAt,
40
+ withActiveCustomerPersonCompanyLinkFilter
41
+ };
42
+ //# sourceMappingURL=personCompanyLinkTable.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/lib/personCompanyLinkTable.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\n\nconst PERSON_COMPANY_LINKS_TABLE = 'customer_person_company_links'\nconst PERSON_COMPANY_LINKS_DELETED_AT_COLUMN = 'deleted_at'\n\nlet supportsDeletedAtColumnPromise: Promise<boolean> | null = null\nlet warnedAboutMissingDeletedAtColumn = false\n\ntype KnexLike = (tableName: string) => {\n where: (filters: Record<string, unknown>) => {\n first: () => Promise<unknown>\n }\n}\n\nfunction getKnex(em: EntityManager): KnexLike {\n return (em.getConnection() as unknown as { getKnex: () => KnexLike }).getKnex()\n}\n\nexport async function customerPersonCompanyLinksSupportDeletedAt(em: EntityManager): Promise<boolean> {\n if (typeof (em as { getConnection?: unknown }).getConnection !== 'function') {\n return true\n }\n if (!supportsDeletedAtColumnPromise) {\n supportsDeletedAtColumnPromise = getKnex(em)('information_schema.columns')\n .where({\n table_name: PERSON_COMPANY_LINKS_TABLE,\n column_name: PERSON_COMPANY_LINKS_DELETED_AT_COLUMN,\n })\n .first()\n .then((row) => !!row)\n .catch(() => false)\n }\n return supportsDeletedAtColumnPromise\n}\n\nexport function warnMissingCustomerPersonCompanyLinksDeletedAt(source: string): void {\n if (warnedAboutMissingDeletedAtColumn) {\n return\n }\n warnedAboutMissingDeletedAtColumn = true\n console.warn(\n `[${source}] missing ${PERSON_COMPANY_LINKS_TABLE}.${PERSON_COMPANY_LINKS_DELETED_AT_COLUMN}; ` +\n 'continuing without link soft-delete filtering. Run yarn db:migrate.',\n )\n}\n\nexport async function withActiveCustomerPersonCompanyLinkFilter<T extends Record<string, unknown>>(\n em: EntityManager,\n where: T,\n source: string,\n): Promise<T & { deletedAt?: null }> {\n const supportsDeletedAt = await customerPersonCompanyLinksSupportDeletedAt(em)\n if (!supportsDeletedAt) {\n warnMissingCustomerPersonCompanyLinksDeletedAt(source)\n return { ...where }\n }\n return { ...where, deletedAt: null }\n}\n"],
5
+ "mappings": "AAEA,MAAM,6BAA6B;AACnC,MAAM,yCAAyC;AAE/C,IAAI,iCAA0D;AAC9D,IAAI,oCAAoC;AAQxC,SAAS,QAAQ,IAA6B;AAC5C,SAAQ,GAAG,cAAc,EAA6C,QAAQ;AAChF;AAEA,eAAsB,2CAA2C,IAAqC;AACpG,MAAI,OAAQ,GAAmC,kBAAkB,YAAY;AAC3E,WAAO;AAAA,EACT;AACA,MAAI,CAAC,gCAAgC;AACnC,qCAAiC,QAAQ,EAAE,EAAE,4BAA4B,EACtE,MAAM;AAAA,MACL,YAAY;AAAA,MACZ,aAAa;AAAA,IACf,CAAC,EACA,MAAM,EACN,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EACnB,MAAM,MAAM,KAAK;AAAA,EACtB;AACA,SAAO;AACT;AAEO,SAAS,+CAA+C,QAAsB;AACnF,MAAI,mCAAmC;AACrC;AAAA,EACF;AACA,sCAAoC;AACpC,UAAQ;AAAA,IACN,IAAI,MAAM,aAAa,0BAA0B,IAAI,sCAAsC;AAAA,EAE7F;AACF;AAEA,eAAsB,0CACpB,IACA,OACA,QACmC;AACnC,QAAM,oBAAoB,MAAM,2CAA2C,EAAE;AAC7E,MAAI,CAAC,mBAAmB;AACtB,mDAA+C,MAAM;AACrD,WAAO,EAAE,GAAG,MAAM;AAAA,EACpB;AACA,SAAO,EAAE,GAAG,OAAO,WAAW,KAAK;AACrC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,104 @@
1
+ import { Organization } from "@open-mercato/core/modules/directory/data/entities";
2
+ import { findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
3
+ import { CustomerEntityRole, CustomerPersonCompanyRole } from "../data/entities.js";
4
+ function getUsageKey(organizationId, value) {
5
+ return `${organizationId}::${value}`;
6
+ }
7
+ async function loadOrganizationScopeMap(em, tenantId, organizationIds) {
8
+ const uniqueOrgIds = Array.from(new Set(organizationIds.filter((value) => value.trim().length > 0)));
9
+ if (uniqueOrgIds.length === 0) return /* @__PURE__ */ new Map();
10
+ const organizationFilter = {
11
+ tenant: tenantId,
12
+ id: { $in: uniqueOrgIds },
13
+ deletedAt: null
14
+ };
15
+ const organizations = await findWithDecryption(
16
+ em,
17
+ Organization,
18
+ organizationFilter,
19
+ { fields: ["id", "descendantIds"] },
20
+ { tenantId, organizationId: null }
21
+ );
22
+ const scopeMap = /* @__PURE__ */ new Map();
23
+ organizations.forEach((organization) => {
24
+ const scopeIds = /* @__PURE__ */ new Set([String(organization.id)]);
25
+ if (Array.isArray(organization.descendantIds)) {
26
+ organization.descendantIds.forEach((descendantId) => {
27
+ if (typeof descendantId === "string" && descendantId.trim().length > 0) {
28
+ scopeIds.add(descendantId.trim());
29
+ }
30
+ });
31
+ }
32
+ scopeMap.set(String(organization.id), Array.from(scopeIds));
33
+ });
34
+ uniqueOrgIds.forEach((organizationId) => {
35
+ if (!scopeMap.has(organizationId)) {
36
+ scopeMap.set(organizationId, [organizationId]);
37
+ }
38
+ });
39
+ return scopeMap;
40
+ }
41
+ async function loadRoleTypeUsageMap(em, params) {
42
+ const normalizedEntries = Array.from(
43
+ new Map(
44
+ params.entries.map((entry) => {
45
+ const organizationId = entry.organizationId.trim();
46
+ const value = entry.value.trim();
47
+ if (!organizationId || !value) return null;
48
+ return [getUsageKey(organizationId, value), { organizationId, value }];
49
+ }).filter((entry) => entry !== null)
50
+ ).values()
51
+ );
52
+ if (normalizedEntries.length === 0) return /* @__PURE__ */ new Map();
53
+ const scopeMap = await loadOrganizationScopeMap(
54
+ em,
55
+ params.tenantId,
56
+ normalizedEntries.map((entry) => entry.organizationId)
57
+ );
58
+ const usageEntries = await Promise.all(
59
+ normalizedEntries.map(async (entry) => {
60
+ const organizationScopeIds = scopeMap.get(entry.organizationId) ?? [entry.organizationId];
61
+ const [ownerAssignments, relationshipAssignments] = await Promise.all([
62
+ em.count(CustomerEntityRole, {
63
+ tenantId: params.tenantId,
64
+ organizationId: { $in: organizationScopeIds },
65
+ roleType: entry.value
66
+ }),
67
+ em.count(CustomerPersonCompanyRole, {
68
+ tenantId: params.tenantId,
69
+ organizationId: { $in: organizationScopeIds },
70
+ roleValue: entry.value
71
+ })
72
+ ]);
73
+ return [
74
+ getUsageKey(entry.organizationId, entry.value),
75
+ {
76
+ total: ownerAssignments + relationshipAssignments,
77
+ ownerAssignments,
78
+ relationshipAssignments
79
+ }
80
+ ];
81
+ })
82
+ );
83
+ return new Map(usageEntries);
84
+ }
85
+ async function loadRoleTypeUsage(em, params) {
86
+ const usageMap = await loadRoleTypeUsageMap(em, {
87
+ tenantId: params.tenantId,
88
+ entries: [{ organizationId: params.organizationId, value: params.value }]
89
+ });
90
+ return usageMap.get(getUsageKey(params.organizationId, params.value)) ?? {
91
+ total: 0,
92
+ ownerAssignments: 0,
93
+ relationshipAssignments: 0
94
+ };
95
+ }
96
+ function resolveRoleTypeUsageKey(organizationId, value) {
97
+ return getUsageKey(organizationId, value);
98
+ }
99
+ export {
100
+ loadRoleTypeUsage,
101
+ loadRoleTypeUsageMap,
102
+ resolveRoleTypeUsageKey
103
+ };
104
+ //# sourceMappingURL=roleTypeUsage.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/lib/roleTypeUsage.ts"],
4
+ "sourcesContent": ["import type { EntityManager, FilterQuery } from '@mikro-orm/postgresql'\nimport { Organization } from '@open-mercato/core/modules/directory/data/entities'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { CustomerEntityRole, CustomerPersonCompanyRole } from '../data/entities'\n\nexport type RoleTypeUsage = {\n total: number\n ownerAssignments: number\n relationshipAssignments: number\n}\n\ntype RoleTypeUsageEntry = {\n organizationId: string\n value: string\n}\n\nfunction getUsageKey(organizationId: string, value: string) {\n return `${organizationId}::${value}`\n}\n\nasync function loadOrganizationScopeMap(\n em: EntityManager,\n tenantId: string,\n organizationIds: string[],\n): Promise<Map<string, string[]>> {\n const uniqueOrgIds = Array.from(new Set(organizationIds.filter((value) => value.trim().length > 0)))\n if (uniqueOrgIds.length === 0) return new Map()\n\n const organizationFilter: FilterQuery<Organization> = {\n tenant: tenantId,\n id: { $in: uniqueOrgIds },\n deletedAt: null,\n }\n const organizations = await findWithDecryption(\n em,\n Organization,\n organizationFilter,\n { fields: ['id', 'descendantIds'] },\n { tenantId, organizationId: null },\n )\n\n const scopeMap = new Map<string, string[]>()\n organizations.forEach((organization) => {\n const scopeIds = new Set<string>([String(organization.id)])\n if (Array.isArray(organization.descendantIds)) {\n organization.descendantIds.forEach((descendantId) => {\n if (typeof descendantId === 'string' && descendantId.trim().length > 0) {\n scopeIds.add(descendantId.trim())\n }\n })\n }\n scopeMap.set(String(organization.id), Array.from(scopeIds))\n })\n\n uniqueOrgIds.forEach((organizationId) => {\n if (!scopeMap.has(organizationId)) {\n scopeMap.set(organizationId, [organizationId])\n }\n })\n\n return scopeMap\n}\n\nexport async function loadRoleTypeUsageMap(\n em: EntityManager,\n params: {\n tenantId: string\n entries: RoleTypeUsageEntry[]\n },\n): Promise<Map<string, RoleTypeUsage>> {\n const normalizedEntries = Array.from(\n new Map(\n params.entries\n .map((entry) => {\n const organizationId = entry.organizationId.trim()\n const value = entry.value.trim()\n if (!organizationId || !value) return null\n return [getUsageKey(organizationId, value), { organizationId, value }] as const\n })\n .filter((entry): entry is readonly [string, RoleTypeUsageEntry] => entry !== null),\n ).values(),\n )\n\n if (normalizedEntries.length === 0) return new Map()\n\n const scopeMap = await loadOrganizationScopeMap(\n em,\n params.tenantId,\n normalizedEntries.map((entry) => entry.organizationId),\n )\n\n const usageEntries = await Promise.all(\n normalizedEntries.map(async (entry) => {\n const organizationScopeIds = scopeMap.get(entry.organizationId) ?? [entry.organizationId]\n const [ownerAssignments, relationshipAssignments] = await Promise.all([\n em.count(CustomerEntityRole, {\n tenantId: params.tenantId,\n organizationId: { $in: organizationScopeIds },\n roleType: entry.value,\n }),\n em.count(CustomerPersonCompanyRole, {\n tenantId: params.tenantId,\n organizationId: { $in: organizationScopeIds },\n roleValue: entry.value,\n }),\n ])\n\n return [\n getUsageKey(entry.organizationId, entry.value),\n {\n total: ownerAssignments + relationshipAssignments,\n ownerAssignments,\n relationshipAssignments,\n } satisfies RoleTypeUsage,\n ] as const\n }),\n )\n\n return new Map(usageEntries)\n}\n\nexport async function loadRoleTypeUsage(\n em: EntityManager,\n params: {\n tenantId: string\n organizationId: string\n value: string\n },\n): Promise<RoleTypeUsage> {\n const usageMap = await loadRoleTypeUsageMap(em, {\n tenantId: params.tenantId,\n entries: [{ organizationId: params.organizationId, value: params.value }],\n })\n\n return (\n usageMap.get(getUsageKey(params.organizationId, params.value)) ?? {\n total: 0,\n ownerAssignments: 0,\n relationshipAssignments: 0,\n }\n )\n}\n\nexport function resolveRoleTypeUsageKey(organizationId: string, value: string) {\n return getUsageKey(organizationId, value)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,18 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260406214502 extends Migration {
3
+ async up() {
4
+ this.addSql(`create table "customer_entity_roles" ("id" uuid not null default gen_random_uuid(), "entity_type" text not null, "entity_id" uuid not null, "user_id" uuid not null, "role_type" text not null, "organization_id" uuid not null, "tenant_id" uuid not null, "created_at" timestamptz not null, "updated_at" timestamptz not null, constraint "customer_entity_roles_pkey" primary key ("id"));`);
5
+ this.addSql(`create index "customer_entity_roles_scope_idx" on "customer_entity_roles" ("organization_id", "tenant_id");`);
6
+ this.addSql(`create index "customer_entity_roles_entity_idx" on "customer_entity_roles" ("entity_type", "entity_id");`);
7
+ this.addSql(`alter table "customer_entity_roles" add constraint "customer_entity_roles_unique" unique ("entity_type", "entity_id", "role_type");`);
8
+ this.addSql(`alter table "customer_interactions" add column "pinned" boolean not null default false;`);
9
+ }
10
+ async down() {
11
+ this.addSql(`alter table "customer_interactions" drop column "pinned";`);
12
+ this.addSql(`drop table if exists "customer_entity_roles" cascade;`);
13
+ }
14
+ }
15
+ export {
16
+ Migration20260406214502
17
+ };
18
+ //# sourceMappingURL=Migration20260406214502.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/migrations/Migration20260406214502.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20260406214502 extends Migration {\n\n override async up(): Promise<void> {\n this.addSql(`create table \"customer_entity_roles\" (\"id\" uuid not null default gen_random_uuid(), \"entity_type\" text not null, \"entity_id\" uuid not null, \"user_id\" uuid not null, \"role_type\" text not null, \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, constraint \"customer_entity_roles_pkey\" primary key (\"id\"));`);\n this.addSql(`create index \"customer_entity_roles_scope_idx\" on \"customer_entity_roles\" (\"organization_id\", \"tenant_id\");`);\n this.addSql(`create index \"customer_entity_roles_entity_idx\" on \"customer_entity_roles\" (\"entity_type\", \"entity_id\");`);\n this.addSql(`alter table \"customer_entity_roles\" add constraint \"customer_entity_roles_unique\" unique (\"entity_type\", \"entity_id\", \"role_type\");`);\n\n this.addSql(`alter table \"customer_interactions\" add column \"pinned\" boolean not null default false;`);\n }\n\n override async down(): Promise<void> {\n this.addSql(`alter table \"customer_interactions\" drop column \"pinned\";`);\n this.addSql(`drop table if exists \"customer_entity_roles\" cascade;`);\n }\n\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,gCAAgC,UAAU;AAAA,EAErD,MAAe,KAAoB;AACjC,SAAK,OAAO,gYAAgY;AAC5Y,SAAK,OAAO,6GAA6G;AACzH,SAAK,OAAO,0GAA0G;AACtH,SAAK,OAAO,qIAAqI;AAEjJ,SAAK,OAAO,yFAAyF;AAAA,EACvG;AAAA,EAEA,MAAe,OAAsB;AACnC,SAAK,OAAO,2DAA2D;AACvE,SAAK,OAAO,uDAAuD;AAAA,EACrE;AAEF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260408135736 extends Migration {
3
+ async up() {
4
+ this.addSql(
5
+ 'alter table "customer_interactions" add column "duration_minutes" int null, add column "location" text null, add column "all_day" boolean null, add column "recurrence_rule" text null, add column "recurrence_end" timestamptz null, add column "participants" jsonb null, add column "reminder_minutes" int null, add column "visibility" text null;'
6
+ );
7
+ }
8
+ async down() {
9
+ this.addSql(
10
+ 'alter table "customer_interactions" drop column "duration_minutes", drop column "location", drop column "all_day", drop column "recurrence_rule", drop column "recurrence_end", drop column "participants", drop column "reminder_minutes", drop column "visibility";'
11
+ );
12
+ }
13
+ }
14
+ export {
15
+ Migration20260408135736
16
+ };
17
+ //# sourceMappingURL=Migration20260408135736.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/migrations/Migration20260408135736.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\nexport class Migration20260408135736 extends Migration {\n override async up(): Promise<void> {\n this.addSql(\n 'alter table \"customer_interactions\" add column \"duration_minutes\" int null, add column \"location\" text null, add column \"all_day\" boolean null, add column \"recurrence_rule\" text null, add column \"recurrence_end\" timestamptz null, add column \"participants\" jsonb null, add column \"reminder_minutes\" int null, add column \"visibility\" text null;',\n )\n }\n\n override async down(): Promise<void> {\n this.addSql(\n 'alter table \"customer_interactions\" drop column \"duration_minutes\", drop column \"location\", drop column \"all_day\", drop column \"recurrence_rule\", drop column \"recurrence_end\", drop column \"participants\", drop column \"reminder_minutes\", drop column \"visibility\";',\n )\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,gCAAgC,UAAU;AAAA,EACrD,MAAe,KAAoB;AACjC,SAAK;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,OAAsB;AACnC,SAAK;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260408225345 extends Migration {
3
+ async up() {
4
+ this.addSql(`create table "customer_person_company_links" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "is_primary" boolean not null default false, "created_at" timestamptz not null, "updated_at" timestamptz not null, "person_entity_id" uuid not null, "company_entity_id" uuid not null, constraint "customer_person_company_links_pkey" primary key ("id"));`);
5
+ this.addSql(`create index "customer_person_company_links_scope_idx" on "customer_person_company_links" ("organization_id", "tenant_id");`);
6
+ this.addSql(`create index "customer_person_company_links_company_idx" on "customer_person_company_links" ("company_entity_id");`);
7
+ this.addSql(`create index "customer_person_company_links_person_idx" on "customer_person_company_links" ("person_entity_id");`);
8
+ this.addSql(`alter table "customer_person_company_links" add constraint "customer_person_company_links_unique" unique ("person_entity_id", "company_entity_id");`);
9
+ this.addSql(`alter table "customer_person_company_links" add constraint "customer_person_company_links_person_entity_id_foreign" foreign key ("person_entity_id") references "customer_entities" ("id") on update cascade;`);
10
+ this.addSql(`alter table "customer_person_company_links" add constraint "customer_person_company_links_company_entity_id_foreign" foreign key ("company_entity_id") references "customer_entities" ("id") on update cascade;`);
11
+ this.addSql(`alter table "customer_deals" add column "closure_outcome" text null, add column "loss_reason_id" uuid null, add column "loss_notes" text null;`);
12
+ }
13
+ async down() {
14
+ this.addSql(`alter table "customer_deals" drop column "closure_outcome", drop column "loss_reason_id", drop column "loss_notes";`);
15
+ this.addSql(`drop table if exists "customer_person_company_links" cascade;`);
16
+ }
17
+ }
18
+ export {
19
+ Migration20260408225345
20
+ };
21
+ //# sourceMappingURL=Migration20260408225345.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/migrations/Migration20260408225345.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20260408225345 extends Migration {\n\n override async up(): Promise<void> {\n this.addSql(`create table \"customer_person_company_links\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"is_primary\" boolean not null default false, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, \"person_entity_id\" uuid not null, \"company_entity_id\" uuid not null, constraint \"customer_person_company_links_pkey\" primary key (\"id\"));`);\n this.addSql(`create index \"customer_person_company_links_scope_idx\" on \"customer_person_company_links\" (\"organization_id\", \"tenant_id\");`);\n this.addSql(`create index \"customer_person_company_links_company_idx\" on \"customer_person_company_links\" (\"company_entity_id\");`);\n this.addSql(`create index \"customer_person_company_links_person_idx\" on \"customer_person_company_links\" (\"person_entity_id\");`);\n this.addSql(`alter table \"customer_person_company_links\" add constraint \"customer_person_company_links_unique\" unique (\"person_entity_id\", \"company_entity_id\");`);\n\n this.addSql(`alter table \"customer_person_company_links\" add constraint \"customer_person_company_links_person_entity_id_foreign\" foreign key (\"person_entity_id\") references \"customer_entities\" (\"id\") on update cascade;`);\n this.addSql(`alter table \"customer_person_company_links\" add constraint \"customer_person_company_links_company_entity_id_foreign\" foreign key (\"company_entity_id\") references \"customer_entities\" (\"id\") on update cascade;`);\n\n this.addSql(`alter table \"customer_deals\" add column \"closure_outcome\" text null, add column \"loss_reason_id\" uuid null, add column \"loss_notes\" text null;`);\n }\n\n override async down(): Promise<void> {\n this.addSql(`alter table \"customer_deals\" drop column \"closure_outcome\", drop column \"loss_reason_id\", drop column \"loss_notes\";`);\n this.addSql(`drop table if exists \"customer_person_company_links\" cascade;`);\n }\n\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,gCAAgC,UAAU;AAAA,EAErD,MAAe,KAAoB;AACjC,SAAK,OAAO,sZAAsZ;AACla,SAAK,OAAO,6HAA6H;AACzI,SAAK,OAAO,oHAAoH;AAChI,SAAK,OAAO,kHAAkH;AAC9H,SAAK,OAAO,qJAAqJ;AAEjK,SAAK,OAAO,+MAA+M;AAC3N,SAAK,OAAO,iNAAiN;AAE7N,SAAK,OAAO,gJAAgJ;AAAA,EAC9J;AAAA,EAEA,MAAe,OAAsB;AACnC,SAAK,OAAO,qHAAqH;AACjI,SAAK,OAAO,+DAA+D;AAAA,EAC7E;AAEF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,27 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260411075533 extends Migration {
3
+ async up() {
4
+ this.addSql(`create table "customer_dictionary_kind_settings" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "kind" text not null, "selection_mode" text not null default 'single', "visible_in_tags" boolean not null default true, "sort_order" int not null default 0, "created_at" timestamptz not null, "updated_at" timestamptz not null, constraint "customer_dictionary_kind_settings_pkey" primary key ("id"));`);
5
+ this.addSql(`create index "customer_dict_kind_settings_scope_idx" on "customer_dictionary_kind_settings" ("organization_id", "tenant_id");`);
6
+ this.addSql(`alter table "customer_dictionary_kind_settings" add constraint "customer_dict_kind_settings_unique" unique ("organization_id", "tenant_id", "kind");`);
7
+ this.addSql(`create table "customer_labels" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "user_id" uuid not null, "slug" text not null, "label" text not null, "created_at" timestamptz not null, "updated_at" timestamptz not null, constraint "customer_labels_pkey" primary key ("id"));`);
8
+ this.addSql(`create index "customer_labels_scope_idx" on "customer_labels" ("organization_id", "tenant_id", "user_id");`);
9
+ this.addSql(`alter table "customer_labels" add constraint "customer_labels_unique" unique ("user_id", "tenant_id", "organization_id", "slug");`);
10
+ this.addSql(`create table "customer_label_assignments" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "user_id" uuid not null, "label_id" uuid not null, "entity_id" uuid not null, "created_at" timestamptz not null, constraint "customer_label_assignments_pkey" primary key ("id"));`);
11
+ this.addSql(`create index "customer_label_assignments_entity_idx" on "customer_label_assignments" ("entity_id");`);
12
+ this.addSql(`alter table "customer_label_assignments" add constraint "customer_label_assignments_unique" unique ("label_id", "entity_id");`);
13
+ this.addSql(`alter table "customer_label_assignments" add constraint "customer_label_assignments_label_id_foreign" foreign key ("label_id") references "customer_labels" ("id") on update cascade;`);
14
+ this.addSql(`alter table "customer_label_assignments" add constraint "customer_label_assignments_entity_id_foreign" foreign key ("entity_id") references "customer_entities" ("id") on update cascade;`);
15
+ }
16
+ async down() {
17
+ this.addSql(`alter table "customer_label_assignments" drop constraint if exists "customer_label_assignments_entity_id_foreign";`);
18
+ this.addSql(`alter table "customer_label_assignments" drop constraint "customer_label_assignments_label_id_foreign";`);
19
+ this.addSql(`drop table if exists "customer_label_assignments" cascade;`);
20
+ this.addSql(`drop table if exists "customer_labels" cascade;`);
21
+ this.addSql(`drop table if exists "customer_dictionary_kind_settings" cascade;`);
22
+ }
23
+ }
24
+ export {
25
+ Migration20260411075533
26
+ };
27
+ //# sourceMappingURL=Migration20260411075533.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/migrations/Migration20260411075533.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20260411075533 extends Migration {\n\n override async up(): Promise<void> {\n this.addSql(`create table \"customer_dictionary_kind_settings\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"kind\" text not null, \"selection_mode\" text not null default 'single', \"visible_in_tags\" boolean not null default true, \"sort_order\" int not null default 0, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, constraint \"customer_dictionary_kind_settings_pkey\" primary key (\"id\"));`);\n this.addSql(`create index \"customer_dict_kind_settings_scope_idx\" on \"customer_dictionary_kind_settings\" (\"organization_id\", \"tenant_id\");`);\n this.addSql(`alter table \"customer_dictionary_kind_settings\" add constraint \"customer_dict_kind_settings_unique\" unique (\"organization_id\", \"tenant_id\", \"kind\");`);\n\n this.addSql(`create table \"customer_labels\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"user_id\" uuid not null, \"slug\" text not null, \"label\" text not null, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, constraint \"customer_labels_pkey\" primary key (\"id\"));`);\n this.addSql(`create index \"customer_labels_scope_idx\" on \"customer_labels\" (\"organization_id\", \"tenant_id\", \"user_id\");`);\n this.addSql(`alter table \"customer_labels\" add constraint \"customer_labels_unique\" unique (\"user_id\", \"tenant_id\", \"organization_id\", \"slug\");`);\n\n this.addSql(`create table \"customer_label_assignments\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"user_id\" uuid not null, \"label_id\" uuid not null, \"entity_id\" uuid not null, \"created_at\" timestamptz not null, constraint \"customer_label_assignments_pkey\" primary key (\"id\"));`);\n this.addSql(`create index \"customer_label_assignments_entity_idx\" on \"customer_label_assignments\" (\"entity_id\");`);\n this.addSql(`alter table \"customer_label_assignments\" add constraint \"customer_label_assignments_unique\" unique (\"label_id\", \"entity_id\");`);\n\n this.addSql(`alter table \"customer_label_assignments\" add constraint \"customer_label_assignments_label_id_foreign\" foreign key (\"label_id\") references \"customer_labels\" (\"id\") on update cascade;`);\n this.addSql(`alter table \"customer_label_assignments\" add constraint \"customer_label_assignments_entity_id_foreign\" foreign key (\"entity_id\") references \"customer_entities\" (\"id\") on update cascade;`);\n }\n\n override async down(): Promise<void> {\n this.addSql(`alter table \"customer_label_assignments\" drop constraint if exists \"customer_label_assignments_entity_id_foreign\";`);\n this.addSql(`alter table \"customer_label_assignments\" drop constraint \"customer_label_assignments_label_id_foreign\";`);\n this.addSql(`drop table if exists \"customer_label_assignments\" cascade;`);\n this.addSql(`drop table if exists \"customer_labels\" cascade;`);\n this.addSql(`drop table if exists \"customer_dictionary_kind_settings\" cascade;`);\n }\n\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,gCAAgC,UAAU;AAAA,EAErD,MAAe,KAAoB;AACjC,SAAK,OAAO,ycAAyc;AACrd,SAAK,OAAO,+HAA+H;AAC3I,SAAK,OAAO,sJAAsJ;AAElK,SAAK,OAAO,8UAA8U;AAC1V,SAAK,OAAO,4GAA4G;AACxH,SAAK,OAAO,mIAAmI;AAE/I,SAAK,OAAO,yUAAyU;AACrV,SAAK,OAAO,qGAAqG;AACjH,SAAK,OAAO,+HAA+H;AAE3I,SAAK,OAAO,uLAAuL;AACnM,SAAK,OAAO,2LAA2L;AAAA,EACzM;AAAA,EAEA,MAAe,OAAsB;AACnC,SAAK,OAAO,oHAAoH;AAChI,SAAK,OAAO,yGAAyG;AACrH,SAAK,OAAO,4DAA4D;AACxE,SAAK,OAAO,iDAAiD;AAC7D,SAAK,OAAO,mEAAmE;AAAA,EACjF;AAEF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260411103551 extends Migration {
3
+ async up() {
4
+ this.addSql(`alter table "customer_entities" add column "temperature" text null, add column "renewal_quarter" text null;`);
5
+ }
6
+ async down() {
7
+ this.addSql(`alter table "customer_entities" drop column "temperature", drop column "renewal_quarter";`);
8
+ }
9
+ }
10
+ export {
11
+ Migration20260411103551
12
+ };
13
+ //# sourceMappingURL=Migration20260411103551.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/migrations/Migration20260411103551.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20260411103551 extends Migration {\n\n override async up(): Promise<void> {\n this.addSql(`alter table \"customer_entities\" add column \"temperature\" text null, add column \"renewal_quarter\" text null;`);\n }\n\n override async down(): Promise<void> {\n this.addSql(`alter table \"customer_entities\" drop column \"temperature\", drop column \"renewal_quarter\";`);\n }\n\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,gCAAgC,UAAU;AAAA,EAErD,MAAe,KAAoB;AACjC,SAAK,OAAO,6GAA6G;AAAA,EAC3H;AAAA,EAEA,MAAe,OAAsB;AACnC,SAAK,OAAO,2FAA2F;AAAA,EACzG;AAEF;",
6
+ "names": []
7
+ }