@aglyn/plugins-crm 1.0.0-beta.221 → 1.0.0-beta.223

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 (541) hide show
  1. package/README.md +2 -1
  2. package/package.json +13 -13
  3. package/src/lib/components/activity-list.js +12 -5
  4. package/src/lib/components/activity-list.js.map +1 -1
  5. package/src/lib/components/companies-bulk-bar.d.ts +1 -4
  6. package/src/lib/components/companies-bulk-bar.js +7 -20
  7. package/src/lib/components/companies-bulk-bar.js.map +1 -1
  8. package/src/lib/components/companies-section.d.ts +3 -3
  9. package/src/lib/components/companies-section.js +149 -46
  10. package/src/lib/components/companies-section.js.map +1 -1
  11. package/src/lib/components/company-edit-drawer.js +281 -20
  12. package/src/lib/components/company-edit-drawer.js.map +1 -1
  13. package/src/lib/components/company-properties-card.js +99 -8
  14. package/src/lib/components/company-properties-card.js.map +1 -1
  15. package/src/lib/components/contact-detail-page.js +3 -1
  16. package/src/lib/components/contact-detail-page.js.map +1 -1
  17. package/src/lib/components/contact-merge-dialog.js +33 -10
  18. package/src/lib/components/contact-merge-dialog.js.map +1 -1
  19. package/src/lib/components/contact-properties-card.d.ts +0 -69
  20. package/src/lib/components/contact-properties-card.js +350 -60
  21. package/src/lib/components/contact-properties-card.js.map +1 -1
  22. package/src/lib/components/contact-reports-to-field.d.ts +46 -0
  23. package/src/lib/components/contact-reports-to-field.js +67 -0
  24. package/src/lib/components/contact-reports-to-field.js.map +1 -0
  25. package/src/lib/components/contacts-bulk-bar.d.ts +1 -8
  26. package/src/lib/components/contacts-bulk-bar.js +7 -19
  27. package/src/lib/components/contacts-bulk-bar.js.map +1 -1
  28. package/src/lib/components/contacts-section.js +46 -33
  29. package/src/lib/components/contacts-section.js.map +1 -1
  30. package/src/lib/components/crm-call-actions.d.ts +10 -0
  31. package/src/lib/components/crm-call-actions.js +26 -9
  32. package/src/lib/components/crm-call-actions.js.map +1 -1
  33. package/src/lib/components/crm-next-activity-column.js +1 -1
  34. package/src/lib/components/crm-next-activity-column.js.map +1 -1
  35. package/src/lib/components/crm-record-picker.d.ts +15 -0
  36. package/src/lib/components/crm-record-picker.js +16 -10
  37. package/src/lib/components/crm-record-picker.js.map +1 -1
  38. package/src/lib/components/crm-transfer-buttons.d.ts +54 -0
  39. package/src/lib/components/crm-transfer-buttons.js +167 -0
  40. package/src/lib/components/crm-transfer-buttons.js.map +1 -0
  41. package/src/lib/components/deal-contact-roles-card.d.ts +46 -0
  42. package/src/lib/components/deal-contact-roles-card.js +368 -0
  43. package/src/lib/components/deal-contact-roles-card.js.map +1 -0
  44. package/src/lib/components/deal-detail-page.d.ts +3 -2
  45. package/src/lib/components/deal-detail-page.js +25 -6
  46. package/src/lib/components/deal-detail-page.js.map +1 -1
  47. package/src/lib/components/deal-edit-drawer.d.ts +10 -0
  48. package/src/lib/components/deal-edit-drawer.js +219 -10
  49. package/src/lib/components/deal-edit-drawer.js.map +1 -1
  50. package/src/lib/components/deal-properties-card.d.ts +7 -0
  51. package/src/lib/components/deal-properties-card.js +34 -3
  52. package/src/lib/components/deal-properties-card.js.map +1 -1
  53. package/src/lib/components/deal-stage-card.d.ts +4 -0
  54. package/src/lib/components/deal-stage-card.js +10 -2
  55. package/src/lib/components/deal-stage-card.js.map +1 -1
  56. package/src/lib/components/deals-bulk-bar.d.ts +0 -3
  57. package/src/lib/components/deals-bulk-bar.js +7 -20
  58. package/src/lib/components/deals-bulk-bar.js.map +1 -1
  59. package/src/lib/components/deals-section.d.ts +3 -3
  60. package/src/lib/components/deals-section.js +123 -63
  61. package/src/lib/components/deals-section.js.map +1 -1
  62. package/src/lib/components/fields-section.js +31 -17
  63. package/src/lib/components/fields-section.js.map +1 -1
  64. package/src/lib/components/lead-convert-dialog.d.ts +4 -0
  65. package/src/lib/components/lead-convert-dialog.js +23 -1
  66. package/src/lib/components/lead-convert-dialog.js.map +1 -1
  67. package/src/lib/components/lead-detail-page.js +8 -2
  68. package/src/lib/components/lead-detail-page.js.map +1 -1
  69. package/src/lib/components/lead-profile-fields.d.ts +71 -0
  70. package/src/lib/components/lead-profile-fields.js +386 -0
  71. package/src/lib/components/lead-profile-fields.js.map +1 -0
  72. package/src/lib/components/lead-properties-card.d.ts +2 -1
  73. package/src/lib/components/lead-properties-card.js +85 -176
  74. package/src/lib/components/lead-properties-card.js.map +1 -1
  75. package/src/lib/components/lead-source-select.d.ts +4 -23
  76. package/src/lib/components/lead-source-select.js +9 -73
  77. package/src/lib/components/lead-source-select.js.map +1 -1
  78. package/src/lib/components/lead-status-chip.d.ts +9 -3
  79. package/src/lib/components/lead-status-chip.js +8 -4
  80. package/src/lib/components/lead-status-chip.js.map +1 -1
  81. package/src/lib/components/lead-status-options.d.ts +20 -0
  82. package/src/lib/components/lead-status-options.js +51 -0
  83. package/src/lib/components/lead-status-options.js.map +1 -0
  84. package/src/lib/components/lead-unqualify-dialog.d.ts +5 -0
  85. package/src/lib/components/lead-unqualify-dialog.js +50 -18
  86. package/src/lib/components/lead-unqualify-dialog.js.map +1 -1
  87. package/src/lib/components/leads-bulk-bar.d.ts +0 -3
  88. package/src/lib/components/leads-bulk-bar.js +29 -29
  89. package/src/lib/components/leads-bulk-bar.js.map +1 -1
  90. package/src/lib/components/leads-section.js +120 -68
  91. package/src/lib/components/leads-section.js.map +1 -1
  92. package/src/lib/components/linked-deals-card.d.ts +4 -0
  93. package/src/lib/components/linked-deals-card.js +47 -3
  94. package/src/lib/components/linked-deals-card.js.map +1 -1
  95. package/src/lib/components/log-activity-dialog.js +43 -3
  96. package/src/lib/components/log-activity-dialog.js.map +1 -1
  97. package/src/lib/components/new-contact-drawer.d.ts +8 -0
  98. package/src/lib/components/new-contact-drawer.js +108 -6
  99. package/src/lib/components/new-contact-drawer.js.map +1 -1
  100. package/src/lib/components/new-lead-drawer.d.ts +9 -2
  101. package/src/lib/components/new-lead-drawer.js +88 -121
  102. package/src/lib/components/new-lead-drawer.js.map +1 -1
  103. package/src/lib/components/picklist-select.d.ts +36 -0
  104. package/src/lib/components/picklist-select.js +114 -0
  105. package/src/lib/components/picklist-select.js.map +1 -0
  106. package/src/lib/components/picklist-values-card.d.ts +34 -0
  107. package/src/lib/components/{lead-source-values-card.js → picklist-values-card.js} +241 -58
  108. package/src/lib/components/picklist-values-card.js.map +1 -0
  109. package/src/lib/components/pipeline-stages-dialog.d.ts +7 -0
  110. package/src/lib/components/pipeline-stages-dialog.js +26 -4
  111. package/src/lib/components/pipeline-stages-dialog.js.map +1 -1
  112. package/src/lib/components/pipelines-dialog.js +15 -6
  113. package/src/lib/components/pipelines-dialog.js.map +1 -1
  114. package/src/lib/components/recent-activity-feed.js +20 -5
  115. package/src/lib/components/recent-activity-feed.js.map +1 -1
  116. package/src/lib/components/recipes-card.js +4 -2
  117. package/src/lib/components/recipes-card.js.map +1 -1
  118. package/src/lib/components/record-tasks-card.js +15 -8
  119. package/src/lib/components/record-tasks-card.js.map +1 -1
  120. package/src/lib/components/reports/forecast-card.d.ts +6 -0
  121. package/src/lib/components/reports/forecast-card.js +101 -3
  122. package/src/lib/components/reports/forecast-card.js.map +1 -1
  123. package/src/lib/components/reports/lead-funnel-card.d.ts +12 -0
  124. package/src/lib/components/reports/lead-funnel-card.js +9 -5
  125. package/src/lib/components/reports/lead-funnel-card.js.map +1 -1
  126. package/src/lib/components/reports/lead-source-card.d.ts +23 -0
  127. package/src/lib/components/reports/lead-source-card.js +318 -0
  128. package/src/lib/components/reports/lead-source-card.js.map +1 -0
  129. package/src/lib/components/reports/pipeline-card.js +2 -1
  130. package/src/lib/components/reports/pipeline-card.js.map +1 -1
  131. package/src/lib/components/reports/report-export.js +1 -1
  132. package/src/lib/components/reports/report-export.js.map +1 -1
  133. package/src/lib/components/reports-section.js +8 -0
  134. package/src/lib/components/reports-section.js.map +1 -1
  135. package/src/lib/components/sharing-rule-drawer.d.ts +5 -0
  136. package/src/lib/components/sharing-rule-drawer.js +108 -19
  137. package/src/lib/components/sharing-rule-drawer.js.map +1 -1
  138. package/src/lib/components/sharing-rules-card.js +11 -3
  139. package/src/lib/components/sharing-rules-card.js.map +1 -1
  140. package/src/lib/components/task-cells.d.ts +9 -1
  141. package/src/lib/components/task-cells.js +9 -4
  142. package/src/lib/components/task-cells.js.map +1 -1
  143. package/src/lib/components/task-edit-drawer.js +111 -43
  144. package/src/lib/components/task-edit-drawer.js.map +1 -1
  145. package/src/lib/components/tasks-bulk-bar.d.ts +0 -3
  146. package/src/lib/components/tasks-bulk-bar.js +7 -20
  147. package/src/lib/components/tasks-bulk-bar.js.map +1 -1
  148. package/src/lib/components/tasks-calendar.d.ts +3 -0
  149. package/src/lib/components/tasks-calendar.js +8 -1
  150. package/src/lib/components/tasks-calendar.js.map +1 -1
  151. package/src/lib/components/tasks-section.d.ts +3 -3
  152. package/src/lib/components/tasks-section.js +58 -43
  153. package/src/lib/components/tasks-section.js.map +1 -1
  154. package/src/lib/constants/api-routes.d.ts +2 -9
  155. package/src/lib/constants/api-routes.js +1 -7
  156. package/src/lib/constants/api-routes.js.map +1 -1
  157. package/src/lib/constants/bundle-common.d.ts +6 -0
  158. package/src/lib/constants/bundle-common.js +11 -0
  159. package/src/lib/constants/bundle-common.js.map +1 -1
  160. package/src/lib/constants/company-filters.d.ts +14 -0
  161. package/src/lib/constants/company-filters.js +51 -1
  162. package/src/lib/constants/company-filters.js.map +1 -1
  163. package/src/lib/constants/contact-filters.d.ts +2 -0
  164. package/src/lib/constants/contact-filters.js +18 -1
  165. package/src/lib/constants/contact-filters.js.map +1 -1
  166. package/src/lib/constants/deal-filters.d.ts +22 -1
  167. package/src/lib/constants/deal-filters.js +67 -4
  168. package/src/lib/constants/deal-filters.js.map +1 -1
  169. package/src/lib/declarations.console-server.d.ts +3 -0
  170. package/src/lib/declarations.console-server.js +35 -0
  171. package/src/lib/declarations.console-server.js.map +1 -1
  172. package/src/lib/declarations.d.ts +26 -0
  173. package/src/lib/declarations.js +35 -0
  174. package/src/lib/declarations.js.map +1 -0
  175. package/src/lib/declarations.server.d.ts +11 -0
  176. package/src/lib/declarations.server.js +97 -1
  177. package/src/lib/declarations.server.js.map +1 -1
  178. package/src/lib/hooks/use-company-picklists.d.ts +15 -0
  179. package/src/lib/hooks/use-company-picklists.js +55 -0
  180. package/src/lib/hooks/use-company-picklists.js.map +1 -0
  181. package/src/lib/hooks/use-crm-picklist.d.ts +25 -0
  182. package/src/lib/hooks/use-crm-picklist.js +53 -0
  183. package/src/lib/hooks/use-crm-picklist.js.map +1 -0
  184. package/src/lib/hooks/use-crm-record-names.d.ts +16 -0
  185. package/src/lib/hooks/use-crm-record-names.js +45 -19
  186. package/src/lib/hooks/use-crm-record-names.js.map +1 -1
  187. package/src/lib/hooks/use-crm-task-picklists.d.ts +11 -0
  188. package/src/lib/hooks/use-crm-task-picklists.js +45 -0
  189. package/src/lib/hooks/use-crm-task-picklists.js.map +1 -0
  190. package/src/lib/hooks/use-deals.d.ts +14 -0
  191. package/src/lib/hooks/use-deals.js +29 -0
  192. package/src/lib/hooks/use-deals.js.map +1 -1
  193. package/src/lib/hooks/use-lead-picklists.d.ts +14 -0
  194. package/src/lib/hooks/use-lead-picklists.js +46 -0
  195. package/src/lib/hooks/use-lead-picklists.js.map +1 -0
  196. package/src/lib/hooks/use-lead-source-picklist.d.ts +5 -19
  197. package/src/lib/hooks/use-lead-source-picklist.js +12 -22
  198. package/src/lib/hooks/use-lead-source-picklist.js.map +1 -1
  199. package/src/lib/hooks/use-lead-status-picklist.d.ts +9 -0
  200. package/src/lib/hooks/use-lead-status-picklist.js +40 -0
  201. package/src/lib/hooks/use-lead-status-picklist.js.map +1 -0
  202. package/src/lib/model/companies.d.ts +32 -3
  203. package/src/lib/model/companies.js +133 -16
  204. package/src/lib/model/companies.js.map +1 -1
  205. package/src/lib/model/contact-merge.d.ts +27 -3
  206. package/src/lib/model/contact-merge.js +81 -7
  207. package/src/lib/model/contact-merge.js.map +1 -1
  208. package/src/lib/model/contact-record.d.ts +17 -0
  209. package/src/lib/model/contact-record.js +17 -2
  210. package/src/lib/model/contact-record.js.map +1 -1
  211. package/src/lib/model/contact-update.d.ts +31 -2
  212. package/src/lib/model/contact-update.js +14 -0
  213. package/src/lib/model/contact-update.js.map +1 -1
  214. package/src/lib/model/crm-list-query.d.ts +5 -0
  215. package/src/lib/model/crm-list-query.js +8 -0
  216. package/src/lib/model/crm-list-query.js.map +1 -1
  217. package/src/lib/model/crm-next-activity.d.ts +107 -0
  218. package/src/lib/model/crm-next-activity.js +140 -0
  219. package/src/lib/model/crm-next-activity.js.map +1 -0
  220. package/src/lib/model/crm-recipes.d.ts +40 -0
  221. package/src/lib/model/crm-recipes.js +259 -0
  222. package/src/lib/model/crm-recipes.js.map +1 -0
  223. package/src/lib/model/crm-record-counts.d.ts +36 -0
  224. package/src/lib/model/crm-record-counts.js +54 -0
  225. package/src/lib/model/crm-record-counts.js.map +1 -0
  226. package/src/lib/model/crm-record-lists.d.ts +23 -0
  227. package/src/lib/model/crm-record-lists.js +161 -0
  228. package/src/lib/model/crm-record-lists.js.map +1 -0
  229. package/src/lib/model/crm-reports.d.ts +73 -3
  230. package/src/lib/model/crm-reports.js +120 -1
  231. package/src/lib/model/crm-reports.js.map +1 -1
  232. package/src/lib/model/crm-sharing.d.ts +21 -3
  233. package/src/lib/model/crm-sharing.js +27 -6
  234. package/src/lib/model/crm-sharing.js.map +1 -1
  235. package/src/lib/model/crm-task-reminders.d.ts +152 -0
  236. package/src/lib/model/crm-task-reminders.js +161 -0
  237. package/src/lib/model/crm-task-reminders.js.map +1 -0
  238. package/src/lib/model/deal-board-model.d.ts +8 -2
  239. package/src/lib/model/deal-board-model.js +15 -2
  240. package/src/lib/model/deal-board-model.js.map +1 -1
  241. package/src/lib/model/deal-contact-roles.d.ts +45 -0
  242. package/src/lib/model/deal-contact-roles.js +73 -0
  243. package/src/lib/model/deal-contact-roles.js.map +1 -0
  244. package/src/lib/model/deal-form-model.d.ts +56 -0
  245. package/src/lib/model/deal-form-model.js +79 -7
  246. package/src/lib/model/deal-form-model.js.map +1 -1
  247. package/src/lib/model/download-text-file.d.ts +23 -0
  248. package/src/lib/model/download-text-file.js +34 -0
  249. package/src/lib/model/download-text-file.js.map +1 -0
  250. package/src/lib/model/lead-filters.d.ts +36 -2
  251. package/src/lib/model/lead-filters.js +123 -2
  252. package/src/lib/model/lead-filters.js.map +1 -1
  253. package/src/lib/model/lead-source-direction.d.ts +38 -0
  254. package/src/lib/model/lead-source-direction.js +52 -0
  255. package/src/lib/model/lead-source-direction.js.map +1 -0
  256. package/src/lib/model/next-activity.d.ts +1 -1
  257. package/src/lib/model/next-activity.js.map +1 -1
  258. package/src/lib/model/picklist-values.d.ts +119 -0
  259. package/src/lib/model/picklist-values.js +256 -0
  260. package/src/lib/model/picklist-values.js.map +1 -0
  261. package/src/lib/model/record-facts-disclosed.d.ts +81 -0
  262. package/src/lib/model/record-facts-disclosed.js +281 -0
  263. package/src/lib/model/record-facts-disclosed.js.map +1 -0
  264. package/src/lib/model/record-facts.d.ts +215 -34
  265. package/src/lib/model/record-facts.js +307 -128
  266. package/src/lib/model/record-facts.js.map +1 -1
  267. package/src/lib/model/task-picklists.d.ts +52 -0
  268. package/src/lib/model/task-picklists.js +83 -0
  269. package/src/lib/model/task-picklists.js.map +1 -0
  270. package/src/lib/model/task-routes.d.ts +13 -0
  271. package/src/lib/model/task-routes.js +23 -4
  272. package/src/lib/model/task-routes.js.map +1 -1
  273. package/src/lib/plan-entitlements.js +6 -4
  274. package/src/lib/plan-entitlements.js.map +1 -1
  275. package/src/lib/plugin.js +17 -0
  276. package/src/lib/plugin.js.map +1 -1
  277. package/src/lib/server/api-v1/contacts.js +220 -14
  278. package/src/lib/server/api-v1/contacts.js.map +1 -1
  279. package/src/lib/server/api-v1/crm-activities.js +14 -1
  280. package/src/lib/server/api-v1/crm-activities.js.map +1 -1
  281. package/src/lib/server/api-v1/crm-companies.js +123 -14
  282. package/src/lib/server/api-v1/crm-companies.js.map +1 -1
  283. package/src/lib/server/api-v1/crm-deals.js +291 -26
  284. package/src/lib/server/api-v1/crm-deals.js.map +1 -1
  285. package/src/lib/server/api-v1/crm-leads.js +144 -38
  286. package/src/lib/server/api-v1/crm-leads.js.map +1 -1
  287. package/src/lib/server/api-v1/crm-pipelines.d.ts +6 -0
  288. package/src/lib/server/api-v1/crm-pipelines.js +8 -2
  289. package/src/lib/server/api-v1/crm-pipelines.js.map +1 -1
  290. package/src/lib/server/api-v1/crm-tasks.js +78 -34
  291. package/src/lib/server/api-v1/crm-tasks.js.map +1 -1
  292. package/src/lib/server/api-v1/openapi.d.ts +0 -11
  293. package/src/lib/server/api-v1/openapi.js +171 -16
  294. package/src/lib/server/api-v1/openapi.js.map +1 -1
  295. package/src/lib/server/assign-contact-owner.d.ts +188 -0
  296. package/src/lib/server/assign-contact-owner.js +446 -0
  297. package/src/lib/server/assign-contact-owner.js.map +1 -0
  298. package/src/lib/server/associate-company-by-domain.d.ts +70 -0
  299. package/src/lib/server/associate-company-by-domain.js +153 -0
  300. package/src/lib/server/associate-company-by-domain.js.map +1 -0
  301. package/src/lib/server/automation-steps.d.ts +140 -0
  302. package/src/lib/server/automation-steps.js +669 -0
  303. package/src/lib/server/automation-steps.js.map +1 -0
  304. package/src/lib/server/capture-contact.d.ts +17 -0
  305. package/src/lib/server/capture-contact.js +95 -26
  306. package/src/lib/server/capture-contact.js.map +1 -1
  307. package/src/lib/server/capture-host-contact.d.ts +104 -0
  308. package/src/lib/server/capture-host-contact.js +151 -0
  309. package/src/lib/server/capture-host-contact.js.map +1 -0
  310. package/src/lib/server/company-children.d.ts +25 -0
  311. package/src/lib/server/company-children.js +42 -0
  312. package/src/lib/server/company-children.js.map +1 -0
  313. package/src/lib/server/company-delete.d.ts +18 -0
  314. package/src/lib/server/company-delete.js +44 -21
  315. package/src/lib/server/company-delete.js.map +1 -1
  316. package/src/lib/server/contact-email-history.js +21 -19
  317. package/src/lib/server/contact-email-history.js.map +1 -1
  318. package/src/lib/server/contact-remove.js +27 -2
  319. package/src/lib/server/contact-remove.js.map +1 -1
  320. package/src/lib/server/contact-reports-to.d.ts +61 -0
  321. package/src/lib/server/contact-reports-to.js +114 -0
  322. package/src/lib/server/contact-reports-to.js.map +1 -0
  323. package/src/lib/server/contact-update.d.ts +42 -1
  324. package/src/lib/server/contact-update.js +204 -23
  325. package/src/lib/server/contact-update.js.map +1 -1
  326. package/src/lib/server/convert-host-lead.d.ts +46 -1
  327. package/src/lib/server/convert-host-lead.js +173 -15
  328. package/src/lib/server/convert-host-lead.js.map +1 -1
  329. package/src/lib/server/convert-open-lead.js +12 -5
  330. package/src/lib/server/convert-open-lead.js.map +1 -1
  331. package/src/lib/server/crm-email-activity.d.ts +118 -0
  332. package/src/lib/server/crm-email-activity.js +148 -0
  333. package/src/lib/server/crm-email-activity.js.map +1 -0
  334. package/src/lib/server/crm-inbound-email.js +1 -1
  335. package/src/lib/server/crm-inbound-email.js.map +1 -1
  336. package/src/lib/server/crm-next-activity.d.ts +74 -0
  337. package/src/lib/server/crm-next-activity.js +194 -0
  338. package/src/lib/server/crm-next-activity.js.map +1 -0
  339. package/src/lib/server/crm-record-indexes.d.ts +45 -0
  340. package/src/lib/server/crm-record-indexes.js +78 -0
  341. package/src/lib/server/crm-record-indexes.js.map +1 -0
  342. package/src/lib/server/crm-sharing.d.ts +9 -1
  343. package/src/lib/server/crm-sharing.js +23 -3
  344. package/src/lib/server/crm-sharing.js.map +1 -1
  345. package/src/lib/server/deal-contact-roles.d.ts +27 -0
  346. package/src/lib/server/deal-contact-roles.js +89 -0
  347. package/src/lib/server/deal-contact-roles.js.map +1 -0
  348. package/src/lib/server/email-send.js +2 -1
  349. package/src/lib/server/email-send.js.map +1 -1
  350. package/src/lib/server/lead-convert.d.ts +5 -0
  351. package/src/lib/server/lead-convert.js +19 -3
  352. package/src/lib/server/lead-convert.js.map +1 -1
  353. package/src/lib/server/lead-create.d.ts +17 -2
  354. package/src/lib/server/lead-create.js +46 -14
  355. package/src/lib/server/lead-create.js.map +1 -1
  356. package/src/lib/server/lead-nurturing.d.ts +6 -0
  357. package/src/lib/server/lead-nurturing.js +57 -20
  358. package/src/lib/server/lead-nurturing.js.map +1 -1
  359. package/src/lib/server/lead-picklists.d.ts +35 -0
  360. package/src/lib/server/lead-picklists.js +52 -0
  361. package/src/lib/server/lead-picklists.js.map +1 -0
  362. package/src/lib/server/lead-source-picklist.d.ts +1 -13
  363. package/src/lib/server/lead-source-picklist.js +6 -33
  364. package/src/lib/server/lead-source-picklist.js.map +1 -1
  365. package/src/lib/server/merge-contacts.js +23 -5
  366. package/src/lib/server/merge-contacts.js.map +1 -1
  367. package/src/lib/server/next-activity-routes.js +2 -1
  368. package/src/lib/server/next-activity-routes.js.map +1 -1
  369. package/src/lib/server/person-eraser.d.ts +53 -0
  370. package/src/lib/server/person-eraser.js +149 -0
  371. package/src/lib/server/person-eraser.js.map +1 -0
  372. package/src/lib/server/person-records.d.ts +69 -0
  373. package/src/lib/server/person-records.js +317 -0
  374. package/src/lib/server/person-records.js.map +1 -0
  375. package/src/lib/server/person-refund.d.ts +97 -0
  376. package/src/lib/server/person-refund.js +221 -0
  377. package/src/lib/server/person-refund.js.map +1 -0
  378. package/src/lib/server/picklist-values.d.ts +21 -0
  379. package/src/lib/server/picklist-values.js +308 -0
  380. package/src/lib/server/picklist-values.js.map +1 -0
  381. package/src/lib/server/read-picklist.d.ts +44 -0
  382. package/src/lib/server/read-picklist.js +65 -0
  383. package/src/lib/server/read-picklist.js.map +1 -0
  384. package/src/lib/server/recipe-routes.js +22 -8
  385. package/src/lib/server/recipe-routes.js.map +1 -1
  386. package/src/lib/server/record-email-state.js +7 -1
  387. package/src/lib/server/record-email-state.js.map +1 -1
  388. package/src/lib/server/record-facts.d.ts +3 -0
  389. package/src/lib/server/record-facts.js +233 -31
  390. package/src/lib/server/record-facts.js.map +1 -1
  391. package/src/lib/server/record-origin.d.ts +27 -0
  392. package/src/lib/server/record-origin.js +104 -0
  393. package/src/lib/server/record-origin.js.map +1 -0
  394. package/src/lib/server/record-timeline.js +40 -3
  395. package/src/lib/server/record-timeline.js.map +1 -1
  396. package/src/lib/server/suite-gate.js +4 -3
  397. package/src/lib/server/suite-gate.js.map +1 -1
  398. package/src/lib/server/task-reminders-route.js +2 -1
  399. package/src/lib/server/task-reminders-route.js.map +1 -1
  400. package/src/lib/server/task-routes.js +33 -17
  401. package/src/lib/server/task-routes.js.map +1 -1
  402. package/src/lib/server-deal-stage.d.ts +5 -1
  403. package/src/lib/server-deal-stage.js +10 -5
  404. package/src/lib/server-deal-stage.js.map +1 -1
  405. package/src/lib/server.d.ts +8 -3
  406. package/src/lib/server.js +47 -43
  407. package/src/lib/server.js.map +1 -1
  408. package/src/lib/testing/memory-firestore.d.ts +55 -0
  409. package/src/lib/testing/memory-firestore.js +335 -0
  410. package/src/lib/testing/memory-firestore.js.map +1 -0
  411. package/src/lib/testing/stand-in-email-send-index.d.ts +25 -0
  412. package/src/lib/testing/stand-in-email-send-index.js +49 -0
  413. package/src/lib/testing/stand-in-email-send-index.js.map +1 -0
  414. package/src/lib/transfer/activities.d.ts +30 -0
  415. package/src/lib/transfer/activities.js +132 -0
  416. package/src/lib/transfer/activities.js.map +1 -0
  417. package/src/lib/transfer/aliases.d.ts +22 -0
  418. package/src/lib/transfer/aliases.js +1342 -0
  419. package/src/lib/transfer/aliases.js.map +1 -0
  420. package/src/lib/transfer/common.d.ts +222 -0
  421. package/src/lib/transfer/common.js +832 -0
  422. package/src/lib/transfer/common.js.map +1 -0
  423. package/src/lib/transfer/companies.d.ts +43 -0
  424. package/src/lib/transfer/companies.js +549 -0
  425. package/src/lib/transfer/companies.js.map +1 -0
  426. package/src/lib/transfer/contacts.d.ts +31 -0
  427. package/src/lib/transfer/contacts.js +727 -0
  428. package/src/lib/transfer/contacts.js.map +1 -0
  429. package/src/lib/transfer/deals.d.ts +66 -0
  430. package/src/lib/transfer/deals.js +698 -0
  431. package/src/lib/transfer/deals.js.map +1 -0
  432. package/src/lib/transfer/email-templates-package.d.ts +40 -0
  433. package/src/lib/transfer/email-templates-package.js +76 -0
  434. package/src/lib/transfer/email-templates-package.js.map +1 -0
  435. package/src/lib/transfer/email-templates-package.server.d.ts +32 -0
  436. package/src/lib/transfer/email-templates-package.server.js +176 -0
  437. package/src/lib/transfer/email-templates-package.server.js.map +1 -0
  438. package/src/lib/transfer/fields.d.ts +102 -0
  439. package/src/lib/transfer/fields.js +1755 -0
  440. package/src/lib/transfer/fields.js.map +1 -0
  441. package/src/lib/transfer/leads.d.ts +30 -0
  442. package/src/lib/transfer/leads.js +582 -0
  443. package/src/lib/transfer/leads.js.map +1 -0
  444. package/src/lib/transfer/pipelines.d.ts +21 -0
  445. package/src/lib/transfer/pipelines.js +172 -0
  446. package/src/lib/transfer/pipelines.js.map +1 -0
  447. package/src/lib/transfer/register.d.ts +47 -0
  448. package/src/lib/transfer/register.js +277 -0
  449. package/src/lib/transfer/register.js.map +1 -0
  450. package/src/lib/transfer/tasks.d.ts +30 -0
  451. package/src/lib/transfer/tasks.js +418 -0
  452. package/src/lib/transfer/tasks.js.map +1 -0
  453. package/src/lib/transfer/ui.d.ts +20 -0
  454. package/src/lib/transfer/ui.js +42 -0
  455. package/src/lib/transfer/ui.js.map +1 -0
  456. package/src/lib/components/company-import-drawer.d.ts +0 -42
  457. package/src/lib/components/company-import-drawer.js +0 -99
  458. package/src/lib/components/company-import-drawer.js.map +0 -1
  459. package/src/lib/components/contact-import-drawer.d.ts +0 -46
  460. package/src/lib/components/contact-import-drawer.js +0 -149
  461. package/src/lib/components/contact-import-drawer.js.map +0 -1
  462. package/src/lib/components/crm-export-all-button.d.ts +0 -39
  463. package/src/lib/components/crm-export-all-button.js +0 -98
  464. package/src/lib/components/crm-export-all-button.js.map +0 -1
  465. package/src/lib/components/csv-import-drawer.d.ts +0 -139
  466. package/src/lib/components/csv-import-drawer.js +0 -757
  467. package/src/lib/components/csv-import-drawer.js.map +0 -1
  468. package/src/lib/components/deal-import-drawer.d.ts +0 -24
  469. package/src/lib/components/deal-import-drawer.js +0 -83
  470. package/src/lib/components/deal-import-drawer.js.map +0 -1
  471. package/src/lib/components/lead-import-drawer.d.ts +0 -27
  472. package/src/lib/components/lead-import-drawer.js +0 -118
  473. package/src/lib/components/lead-import-drawer.js.map +0 -1
  474. package/src/lib/components/lead-source-values-card.d.ts +0 -27
  475. package/src/lib/components/lead-source-values-card.js.map +0 -1
  476. package/src/lib/components/task-import-drawer.d.ts +0 -24
  477. package/src/lib/components/task-import-drawer.js +0 -82
  478. package/src/lib/components/task-import-drawer.js.map +0 -1
  479. package/src/lib/model/companies-csv.d.ts +0 -36
  480. package/src/lib/model/companies-csv.js +0 -38
  481. package/src/lib/model/companies-csv.js.map +0 -1
  482. package/src/lib/model/contacts-csv.d.ts +0 -54
  483. package/src/lib/model/contacts-csv.js +0 -67
  484. package/src/lib/model/contacts-csv.js.map +0 -1
  485. package/src/lib/model/crm-company-import.d.ts +0 -154
  486. package/src/lib/model/crm-company-import.js +0 -331
  487. package/src/lib/model/crm-company-import.js.map +0 -1
  488. package/src/lib/model/crm-csv.d.ts +0 -239
  489. package/src/lib/model/crm-csv.js +0 -467
  490. package/src/lib/model/crm-csv.js.map +0 -1
  491. package/src/lib/model/crm-deal-import.d.ts +0 -112
  492. package/src/lib/model/crm-deal-import.js +0 -263
  493. package/src/lib/model/crm-deal-import.js.map +0 -1
  494. package/src/lib/model/crm-import.d.ts +0 -250
  495. package/src/lib/model/crm-import.js +0 -467
  496. package/src/lib/model/crm-import.js.map +0 -1
  497. package/src/lib/model/crm-lead-import.d.ts +0 -138
  498. package/src/lib/model/crm-lead-import.js +0 -446
  499. package/src/lib/model/crm-lead-import.js.map +0 -1
  500. package/src/lib/model/crm-task-import.d.ts +0 -94
  501. package/src/lib/model/crm-task-import.js +0 -275
  502. package/src/lib/model/crm-task-import.js.map +0 -1
  503. package/src/lib/model/deals-csv.d.ts +0 -32
  504. package/src/lib/model/deals-csv.js +0 -36
  505. package/src/lib/model/deals-csv.js.map +0 -1
  506. package/src/lib/model/import-column-shapes.d.ts +0 -36
  507. package/src/lib/model/import-column-shapes.js +0 -76
  508. package/src/lib/model/import-column-shapes.js.map +0 -1
  509. package/src/lib/model/lead-source-values.d.ts +0 -82
  510. package/src/lib/model/lead-source-values.js +0 -149
  511. package/src/lib/model/lead-source-values.js.map +0 -1
  512. package/src/lib/model/leads-csv.d.ts +0 -40
  513. package/src/lib/model/leads-csv.js +0 -40
  514. package/src/lib/model/leads-csv.js.map +0 -1
  515. package/src/lib/model/tasks-csv.d.ts +0 -28
  516. package/src/lib/model/tasks-csv.js +0 -28
  517. package/src/lib/model/tasks-csv.js.map +0 -1
  518. package/src/lib/server/companies-import.d.ts +0 -57
  519. package/src/lib/server/companies-import.js +0 -242
  520. package/src/lib/server/companies-import.js.map +0 -1
  521. package/src/lib/server/contacts-import.d.ts +0 -109
  522. package/src/lib/server/contacts-import.js +0 -393
  523. package/src/lib/server/contacts-import.js.map +0 -1
  524. package/src/lib/server/deals-import.d.ts +0 -76
  525. package/src/lib/server/deals-import.js +0 -248
  526. package/src/lib/server/deals-import.js.map +0 -1
  527. package/src/lib/server/export-route.d.ts +0 -60
  528. package/src/lib/server/export-route.js +0 -447
  529. package/src/lib/server/export-route.js.map +0 -1
  530. package/src/lib/server/import-context.d.ts +0 -87
  531. package/src/lib/server/import-context.js +0 -182
  532. package/src/lib/server/import-context.js.map +0 -1
  533. package/src/lib/server/lead-source-values.d.ts +0 -50
  534. package/src/lib/server/lead-source-values.js +0 -191
  535. package/src/lib/server/lead-source-values.js.map +0 -1
  536. package/src/lib/server/leads-import.d.ts +0 -84
  537. package/src/lib/server/leads-import.js +0 -367
  538. package/src/lib/server/leads-import.js.map +0 -1
  539. package/src/lib/server/tasks-import.d.ts +0 -54
  540. package/src/lib/server/tasks-import.js +0 -160
  541. package/src/lib/server/tasks-import.js.map +0 -1
@@ -0,0 +1,549 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ /*==========================================
18
+ * COMPANIES ON THE TRANSFER FRAMEWORK (AGL-3527) — the server half of
19
+ * `crm.companies`.
20
+ *
21
+ * Every field a company holds, its custom fields and its parent company,
22
+ * read for an export and written by an import through the same rules the
23
+ * companies import route kept: the scope stamp of the site that imports, the
24
+ * records band, the org's picklists judging each label, the list's search
25
+ * and filter keys, and a parent that is never the company itself or one
26
+ * under it (`crmCompanyParentRefusal`).
27
+ *
28
+ * A row finds its company by Aglyn ID, then by domain, then by name — each
29
+ * only among the companies the site reads, so two clients of one agency who
30
+ * each hold an "Acme" each import into their own.
31
+ *=========================================*/ import { CRM_COLLECTIONS, CRM_COMPANY_PICKLIST_FIELDS, crmCompanyListFields, crmCompanyParentId, crmCompanyParentRefusal, crmNewRecordListFields, judgeCrmCompanyPicklists, nameSearchFields, normalizeCompanyDomain, normalizeCompanyText, normalizeCompanyWebsite } from "@aglyn/aglyn/server";
32
+ import { createResourceUid } from "@aglyn/aglyn/app-utils/create-resource-uid";
33
+ import { nameSearchKey } from "@aglyn/aglyn/app-utils/name-search";
34
+ import { planTransferUndo, TRANSFER_ID_FIELD, transferLookupNewName, buildTransferPlan, rankTransferLookupSuggestions } from "@aglyn/aglyn/data-transfer";
35
+ import { restampCrmListFieldsOf } from "@aglyn/tenant-data-admin";
36
+ import { FieldValue } from "firebase-admin/firestore";
37
+ import { deleteCrmCompany } from "../server/company-delete.js";
38
+ import { COMPANY_ALIASES } from "./aliases.js";
39
+ import { addCrmPicklistValues, addressFromValues, addressValues, countCrmExport, creationScope, crmCustomDefinitions, crmMemberEmails, crmMembersTarget, crmPicklistLists, crmRecordsRoom, crmTransferEnv, customTransferValues, customWriteValues, eachWithinBudget, failureMessage, IN_LIMIT, isoOf, lookupByField, lookupById, lookupResult, nameKey, pickValues, plannedValues, readCrmExportPage, requireCrmRecords, requireCrmSuite, requireSite, textOf, TransferEngineError, visibleIn } from "./common.js";
40
+ import { COMPANY_TRANSFER_DERIVED, COMPANY_TRANSFER_FIELDS, COMPANY_TRANSFER_GROUPS, CRM_MEMBERS_TARGET, CRM_TIMESTAMP_FIELDS, crmCustomTransferFields } from "./fields.js";
41
+ const companiesOf = (env)=>env.orgRef.collection(CRM_COLLECTIONS.companies);
42
+ /** The text fields stored as typed, each capped. */ const TEXT_FIELDS = [
43
+ 'accountNumber',
44
+ 'site',
45
+ 'tickerSymbol',
46
+ 'sicCode'
47
+ ];
48
+ /** A stored revenue as the file reads it: its amount and its currency. */ function revenueOf(company) {
49
+ const cents = company['annualRevenueCents'];
50
+ if (typeof cents !== 'number' || !Number.isFinite(cents)) return null;
51
+ return {
52
+ amountMinor: cents,
53
+ currency: String(company['currency'] || 'usd').toUpperCase()
54
+ };
55
+ }
56
+ /**
57
+ * One company as values by field id. `ids` is how a lookup and an undo
58
+ * read it — a parent and an owner by id, so the plan compares what is
59
+ * stored; an export writes their names instead (`names`).
60
+ */ export function companyTransferValues(id, company, definitions, names) {
61
+ var _names_parent, _names_owner;
62
+ const ownerUid = textOf(company['ownerUid']) || null;
63
+ const parentId = crmCompanyParentId(company['parentCompanyId']);
64
+ const revenue = revenueOf(company);
65
+ return _extends({
66
+ name: textOf(company['name']) || null,
67
+ domain: textOf(company['domain']) || null,
68
+ website: textOf(company['website']) || null,
69
+ phone: textOf(company['phone']) || null,
70
+ fax: textOf(company['fax']) || null,
71
+ parentCompany: parentId ? names ? (_names_parent = names.parent(parentId)) != null ? _names_parent : parentId : parentId : null
72
+ }, Object.fromEntries(CRM_COMPANY_PICKLIST_FIELDS.map(({ field })=>[
73
+ field,
74
+ textOf(company[field]) || null
75
+ ])), Object.fromEntries(TEXT_FIELDS.map((field)=>[
76
+ field,
77
+ textOf(company[field]) || null
78
+ ])), {
79
+ numberOfEmployees: typeof company['numberOfEmployees'] === 'number' ? company['numberOfEmployees'] : null,
80
+ annualRevenue: revenue ? names ? `${(revenue.amountMinor / 100).toFixed(2)} ${revenue.currency}` : revenue : null
81
+ }, addressValues('billing', company['address']), addressValues('shipping', company['shippingAddress']), {
82
+ owner: ownerUid ? names ? (_names_owner = names.owner(ownerUid)) != null ? _names_owner : ownerUid : ownerUid : null,
83
+ tags: Array.isArray(company['tags']) ? company['tags'] : [],
84
+ notes: textOf(company['notes']) || null,
85
+ contactsCount: typeof company['contactsCount'] === 'number' ? company['contactsCount'] : 0,
86
+ createdAt: isoOf(company['createdAt']),
87
+ updatedAt: isoOf(company['updatedAt'])
88
+ }, customTransferValues(definitions, company['custom']), {
89
+ [TRANSFER_ID_FIELD]: id
90
+ });
91
+ }
92
+ /**
93
+ * The stored fields a row's values make, over the company as it stands:
94
+ * each field normalized the way the company drawer and the old import
95
+ * stored it; `null` for a field the row clears.
96
+ */ function storedFieldsFor(values, current) {
97
+ var _values_numberOfEmployees;
98
+ const fields = {};
99
+ const set = (field, value)=>{
100
+ fields[field] = value === null || value === undefined || value === '' ? null : value;
101
+ };
102
+ if ('name' in values) {
103
+ const name = normalizeCompanyText(values['name']).slice(0, 120);
104
+ if (!name) return {
105
+ fields,
106
+ error: 'A company needs a name.'
107
+ };
108
+ Object.assign(fields, nameSearchFields(name));
109
+ }
110
+ if ('domain' in values) {
111
+ const text = textOf(values['domain']);
112
+ const domain = text ? normalizeCompanyDomain(text) : null;
113
+ if (text && !domain) return {
114
+ fields,
115
+ error: `“${text}” is not a domain.`
116
+ };
117
+ set('domain', domain);
118
+ }
119
+ if ('website' in values) {
120
+ const text = textOf(values['website']);
121
+ const website = text ? normalizeCompanyWebsite(text) : null;
122
+ if (text && !website) return {
123
+ fields,
124
+ error: `“${text}” is not a web address.`
125
+ };
126
+ set('website', website);
127
+ }
128
+ for (const field of [
129
+ 'phone',
130
+ 'fax'
131
+ ])if (field in values) set(field, textOf(values[field]) || null);
132
+ for (const field of TEXT_FIELDS){
133
+ if (field in values) set(field, normalizeCompanyText(values[field]) || null);
134
+ }
135
+ if ('numberOfEmployees' in values) set('numberOfEmployees', (_values_numberOfEmployees = values['numberOfEmployees']) != null ? _values_numberOfEmployees : null);
136
+ if ('annualRevenue' in values) {
137
+ const revenue = values['annualRevenue'];
138
+ if (revenue && typeof revenue === 'object') {
139
+ fields['annualRevenueCents'] = revenue.amountMinor;
140
+ fields['currency'] = String(revenue.currency || 'usd').toLowerCase();
141
+ } else {
142
+ fields['annualRevenueCents'] = null;
143
+ }
144
+ }
145
+ const billing = addressFromValues('billing', values, current['address']);
146
+ if (billing !== undefined) set('address', billing);
147
+ const shipping = addressFromValues('shipping', values, current['shippingAddress']);
148
+ if (shipping !== undefined) set('shippingAddress', shipping);
149
+ if ('owner' in values) set('ownerUid', textOf(values['owner']) || null);
150
+ if ('tags' in values) fields['tags'] = Array.isArray(values['tags']) ? values['tags'] : [];
151
+ if ('notes' in values) set('notes', textOf(values['notes']).slice(0, 4000) || null);
152
+ return {
153
+ fields
154
+ };
155
+ }
156
+ /** Fields as an update writes them: a cleared field is deleted. */ function asUpdate(fields) {
157
+ return Object.fromEntries(Object.entries(fields).map(([key, value])=>[
158
+ key,
159
+ value === null ? FieldValue.delete() : value
160
+ ]));
161
+ }
162
+ /** Fields as a create writes them: a cleared field is simply absent. */ function asCreate(fields) {
163
+ return Object.fromEntries(Object.entries(fields).filter(([, value])=>value !== null && value !== undefined));
164
+ }
165
+ /** The values of a chunk's companies as `companyTransferValues` reads them, by id. */ async function readCompanies(env, ids, definitions) {
166
+ const out = new Map();
167
+ for(let at = 0; at < ids.length; at += 500){
168
+ const page = ids.slice(at, at + 500);
169
+ if (!page.length) continue;
170
+ for (const snapshot of (await env.firestore.getAll(...page.map((id)=>companiesOf(env).doc(id))))){
171
+ var _snapshot_data;
172
+ if (snapshot.exists) out.set(snapshot.id, companyTransferValues(snapshot.id, (_snapshot_data = snapshot.data()) != null ? _snapshot_data : {}, definitions));
173
+ }
174
+ }
175
+ return out;
176
+ }
177
+ /**
178
+ * The company a name names in this site's view, or one created for it —
179
+ * once per name per apply call, and found again (by `nameLower`) when a
180
+ * retried chunk asks after a create that already landed. `null` when the
181
+ * records band has no room.
182
+ */ export async function companyForName(env, name, actorUid, cache, admit) {
183
+ const key = nameKey(name);
184
+ let pending = cache.get(key);
185
+ if (!pending) {
186
+ pending = (async ()=>{
187
+ var _seen_get;
188
+ const fields = nameSearchFields(normalizeCompanyText(name).slice(0, 120));
189
+ const found = await companiesOf(env).where('nameLower', '==', fields.nameLower).limit(10).get();
190
+ const seen = found.docs.find((doc)=>visibleIn(env, doc.get('visibleTo')));
191
+ if (seen) return {
192
+ id: seen.id,
193
+ name: String((_seen_get = seen.get('name')) != null ? _seen_get : fields.name)
194
+ };
195
+ if (!await admit()) return null;
196
+ const scope = creationScope(env, actorUid);
197
+ const ref = companiesOf(env).doc(createResourceUid());
198
+ await ref.set(_extends({}, fields, {
199
+ tags: []
200
+ }, scope, crmNewRecordListFields('companies', _extends({}, fields, scope))));
201
+ return {
202
+ id: ref.id,
203
+ name: fields.name
204
+ };
205
+ })();
206
+ cache.set(key, pending);
207
+ }
208
+ return pending;
209
+ }
210
+ /** The parent a row names, as an id: a chosen record, or one the import creates by name. */ async function parentIdFor(env, value, actorUid, cache, admit) {
211
+ if (value === null || value === undefined || value === '') return null;
212
+ const create = transferLookupNewName(value);
213
+ if (create) {
214
+ const company = await companyForName(env, create, actorUid, cache, admit);
215
+ if (!company) throw new TransferEngineError('invalid', 422, 'The CRM records limit has no room for the parent company.');
216
+ return company.id;
217
+ }
218
+ return String(value);
219
+ }
220
+ /** Why a parent cannot sit over this company, read through the site's view. */ async function parentRefusal(env, companyId, parentId) {
221
+ return crmCompanyParentRefusal(companyId, parentId, async (id)=>{
222
+ const snapshot = await companiesOf(env).doc(id).get();
223
+ if (!snapshot.exists || !visibleIn(env, snapshot.get('visibleTo'))) return null;
224
+ return {
225
+ parentCompanyId: crmCompanyParentId(snapshot.get('parentCompanyId'))
226
+ };
227
+ });
228
+ }
229
+ /** The org's list behind each company picklist field. */ async function companyPicklists(env) {
230
+ const ids = [
231
+ ...new Set(CRM_COMPANY_PICKLIST_FIELDS.map((entry)=>entry.picklistId))
232
+ ];
233
+ const lists = await crmPicklistLists(env, ids, []);
234
+ return Object.fromEntries(ids.map((id)=>{
235
+ var _lists_id;
236
+ return [
237
+ id,
238
+ (_lists_id = lists[id]) == null ? void 0 : _lists_id.set
239
+ ];
240
+ }));
241
+ }
242
+ /** The `crm.companies` hooks. */ export function companiesTransferResource() {
243
+ return {
244
+ async fields (ctx) {
245
+ const env = await crmTransferEnv(ctx);
246
+ return {
247
+ standard: COMPANY_TRANSFER_FIELDS,
248
+ derived: COMPANY_TRANSFER_DERIVED,
249
+ system: CRM_TIMESTAMP_FIELDS,
250
+ custom: crmCustomTransferFields(await crmCustomDefinitions(env, 'company'), 'company'),
251
+ groups: COMPANY_TRANSFER_GROUPS
252
+ };
253
+ },
254
+ matchKeys: [
255
+ {
256
+ fieldId: TRANSFER_ID_FIELD,
257
+ normalizer: 'aglynId'
258
+ },
259
+ {
260
+ fieldId: 'domain',
261
+ normalizer: 'domain'
262
+ },
263
+ {
264
+ fieldId: 'name',
265
+ normalizer: 'caseless'
266
+ }
267
+ ],
268
+ aliases: COMPANY_ALIASES,
269
+ lookupTargets: {
270
+ [CRM_MEMBERS_TARGET]: crmMembersTarget()
271
+ },
272
+ async count (ctx, options) {
273
+ const env = await crmTransferEnv(ctx);
274
+ requireCrmRecords(env, 'companies');
275
+ return countCrmExport(env, companiesOf(env), options, (data)=>visibleIn(env, data['visibleTo'], options.scopeTokens));
276
+ },
277
+ async readPage (ctx, cursor, fieldIds, options) {
278
+ const env = await crmTransferEnv(ctx);
279
+ requireCrmRecords(env, 'companies');
280
+ const definitions = await crmCustomDefinitions(env, 'company');
281
+ const emails = fieldIds.includes('owner') ? await crmMemberEmails(env.orgId) : new Map();
282
+ return readCrmExportPage(env, companiesOf(env), cursor, options, (data)=>visibleIn(env, data['visibleTo'], options == null ? void 0 : options.scopeTokens), async (docs)=>{
283
+ const parentIds = fieldIds.includes('parentCompany') ? [
284
+ ...new Set(docs.map((doc)=>crmCompanyParentId(doc.data['parentCompanyId'])).filter((id)=>Boolean(id)))
285
+ ] : [];
286
+ const parents = new Map();
287
+ if (parentIds.length) {
288
+ for (const snapshot of (await env.firestore.getAll(...parentIds.map((id)=>companiesOf(env).doc(id))))){
289
+ var _snapshot_get;
290
+ if (snapshot.exists) parents.set(snapshot.id, String((_snapshot_get = snapshot.get('name')) != null ? _snapshot_get : snapshot.id));
291
+ }
292
+ }
293
+ return docs.map((doc)=>pickValues(companyTransferValues(doc.id, doc.data, definitions, {
294
+ owner: (uid)=>emails.get(uid),
295
+ parent: (id)=>parents.get(id)
296
+ }), fieldIds));
297
+ });
298
+ },
299
+ async lookup (ctx, requests) {
300
+ const env = await crmTransferEnv(ctx);
301
+ const definitions = await crmCustomDefinitions(env, 'company');
302
+ const visible = (data)=>visibleIn(env, data['visibleTo']);
303
+ const found = {
304
+ lookup: new Map(),
305
+ docs: new Map()
306
+ };
307
+ for (const request of requests){
308
+ if (request.fieldId === TRANSFER_ID_FIELD) await lookupById(env, companiesOf(env), request, visible, found);
309
+ else if (request.fieldId === 'domain') {
310
+ await lookupByField(companiesOf(env), request, 'domain', (value)=>{
311
+ var _normalizeCompanyDomain;
312
+ return (_normalizeCompanyDomain = normalizeCompanyDomain(value)) != null ? _normalizeCompanyDomain : '';
313
+ }, visible, found);
314
+ } else if (request.fieldId === 'name') {
315
+ await lookupByField(companiesOf(env), request, 'nameLower', (value)=>nameSearchKey(value), visible, found);
316
+ }
317
+ }
318
+ return lookupResult(found, (id, data)=>companyTransferValues(id, data, definitions));
319
+ },
320
+ async suggest (ctx, request) {
321
+ const env = await crmTransferEnv(ctx);
322
+ const answer = {};
323
+ for (const value of request.values){
324
+ var _nameSearchKey_split_;
325
+ // Companies whose name starts with the value's first word: a prefix
326
+ // range on `nameLower`, the field the list's own search reads.
327
+ const first = (_nameSearchKey_split_ = nameSearchKey(value).split(' ')[0]) != null ? _nameSearchKey_split_ : '';
328
+ if (first.length < 2) {
329
+ answer[value] = [];
330
+ continue;
331
+ }
332
+ const snapshot = await companiesOf(env).where('nameLower', '>=', first).where('nameLower', '<', `${first}`).limit(IN_LIMIT).get();
333
+ const candidates = snapshot.docs.filter((doc)=>visibleIn(env, doc.get('visibleTo'))).map((doc)=>{
334
+ var _doc_get;
335
+ return {
336
+ recordId: doc.id,
337
+ label: String((_doc_get = doc.get('name')) != null ? _doc_get : doc.id)
338
+ };
339
+ });
340
+ answer[value] = rankTransferLookupSuggestions(value, candidates);
341
+ }
342
+ return answer;
343
+ },
344
+ async picklists (ctx, ids) {
345
+ const env = await crmTransferEnv(ctx);
346
+ return crmPicklistLists(env, ids, await crmCustomDefinitions(env, 'company'));
347
+ },
348
+ async addPicklistValues (ctx, picklistId, values) {
349
+ await addCrmPicklistValues(await crmTransferEnv(ctx), picklistId, values);
350
+ },
351
+ lockedRules: ()=>[
352
+ {
353
+ fieldId: 'parentCompany',
354
+ reason: 'A company can never sit under itself or a company under it; such a parent is refused for that row.'
355
+ }
356
+ ],
357
+ async plan (ctx, input) {
358
+ const env = await crmTransferEnv(ctx);
359
+ requireCrmSuite(env, 'Importing companies');
360
+ requireSite(env, 'companies');
361
+ return buildTransferPlan(input);
362
+ },
363
+ async apply (ctx, chunk, writer) {
364
+ const env = await crmTransferEnv(ctx);
365
+ requireCrmSuite(env, 'Importing companies');
366
+ requireSite(env, 'companies');
367
+ const definitions = await crmCustomDefinitions(env, 'company');
368
+ const picklists = await companyPicklists(env);
369
+ const admit = crmRecordsRoom(env);
370
+ const created = new Map();
371
+ const results = [];
372
+ const undo = [];
373
+ const rows = chunk.rows;
374
+ await eachWithinBudget(rows, ()=>writer.timeLeftMs(), async (row)=>{
375
+ const earlier = await writer.alreadyApplied(row.index);
376
+ if (earlier) {
377
+ results.push(earlier);
378
+ return;
379
+ }
380
+ let result;
381
+ let entry;
382
+ try {
383
+ var _data;
384
+ const values = plannedValues(row);
385
+ const ref = row.verdict === 'update' && row.recordId ? companiesOf(env).doc(row.recordId) : null;
386
+ const current = ref ? (_data = (await ref.get()).data()) != null ? _data : null : {};
387
+ if (!current) throw new TransferEngineError('notFound', 404, 'That company no longer exists.');
388
+ const before = ref ? companyTransferValues(ref.id, current, definitions) : null;
389
+ const { fields, error } = storedFieldsFor(values, current);
390
+ if (error) throw new TransferEngineError('invalid', 422, error);
391
+ const requested = Object.fromEntries(CRM_COMPANY_PICKLIST_FIELDS.filter(({ field })=>field in values).map(({ field })=>{
392
+ var _values_field;
393
+ return [
394
+ field,
395
+ (_values_field = values[field]) != null ? _values_field : null
396
+ ];
397
+ }));
398
+ const judged = judgeCrmCompanyPicklists(picklists, requested, {
399
+ current,
400
+ created: !ref
401
+ });
402
+ const refused = Object.entries(judged.errors)[0];
403
+ if (refused) throw new TransferEngineError('invalid', 422, refused[1]);
404
+ for (const [field, value] of Object.entries(judged.values))fields[field] = value != null ? value : null;
405
+ const custom = customWriteValues(values, definitions, 'company');
406
+ if ('error' in custom) throw new TransferEngineError('invalid', 422, custom.error);
407
+ if ('parentCompany' in values) {
408
+ const parentId = await parentIdFor(env, values['parentCompany'], ctx.actorUid, created, admit);
409
+ if (parentId) {
410
+ var _ref;
411
+ const refusal = await parentRefusal(env, (_ref = ref == null ? void 0 : ref.id) != null ? _ref : null, parentId);
412
+ if (refusal) throw new TransferEngineError('invalid', 422, refusal);
413
+ }
414
+ fields['parentCompanyId'] = parentId != null ? parentId : null;
415
+ }
416
+ if (ref) {
417
+ var _get;
418
+ const next = _extends({}, current, fields);
419
+ await ref.update(_extends({}, asUpdate(fields), Object.fromEntries(Object.entries(custom.values).map(([key, value])=>[
420
+ `custom.${key}`,
421
+ value
422
+ ])), crmCompanyListFields(next), {
423
+ updatedAt: FieldValue.serverTimestamp()
424
+ }));
425
+ const after = (_get = (await readCompanies(env, [
426
+ ref.id
427
+ ], definitions)).get(ref.id)) != null ? _get : {};
428
+ const changed = row.diff.map((change)=>change.fieldId);
429
+ result = {
430
+ row: row.index,
431
+ outcome: 'updated',
432
+ recordId: ref.id
433
+ };
434
+ entry = {
435
+ row: row.index,
436
+ recordId: ref.id,
437
+ action: 'updated',
438
+ previous: pickValues(before != null ? before : {}, changed),
439
+ written: pickValues(after, changed)
440
+ };
441
+ } else {
442
+ var _get1;
443
+ if (!await admit()) throw new TransferEngineError('invalid', 422, 'The CRM records limit is reached.');
444
+ const scope = creationScope(env, ctx.actorUid);
445
+ const stored = asCreate(fields);
446
+ const createdRef = companiesOf(env).doc(createResourceUid());
447
+ await createdRef.set(_extends({}, stored, {
448
+ tags: Array.isArray(stored['tags']) ? stored['tags'] : []
449
+ }, Object.keys(custom.values).length ? {
450
+ custom: custom.values
451
+ } : {}, scope, crmNewRecordListFields('companies', _extends({}, stored, scope))));
452
+ const after = (_get1 = (await readCompanies(env, [
453
+ createdRef.id
454
+ ], definitions)).get(createdRef.id)) != null ? _get1 : {};
455
+ result = {
456
+ row: row.index,
457
+ outcome: 'created',
458
+ recordId: createdRef.id
459
+ };
460
+ entry = {
461
+ row: row.index,
462
+ recordId: createdRef.id,
463
+ action: 'created',
464
+ written: pickValues(after, row.diff.map((change)=>change.fieldId))
465
+ };
466
+ }
467
+ } catch (error) {
468
+ result = _extends({
469
+ row: row.index,
470
+ outcome: 'failed'
471
+ }, row.recordId ? {
472
+ recordId: row.recordId
473
+ } : {}, {
474
+ message: failureMessage(error)
475
+ });
476
+ entry = undefined;
477
+ }
478
+ await writer.markApplied(result, entry);
479
+ results.push(result);
480
+ if (entry) undo.push(entry);
481
+ });
482
+ return {
483
+ results,
484
+ undo
485
+ };
486
+ },
487
+ async revert (ctx, snapshot, decisions) {
488
+ const env = await crmTransferEnv(ctx);
489
+ const definitions = await crmCustomDefinitions(env, 'company');
490
+ const done = [];
491
+ const conflicts = [];
492
+ const current = await readCompanies(env, snapshot.entries.map((entry)=>entry.recordId), definitions);
493
+ const touched = [];
494
+ for (const entry of snapshot.entries){
495
+ var _current_get, _data, _values_parentCompany;
496
+ const step = planTransferUndo(entry, (_current_get = current.get(entry.recordId)) != null ? _current_get : null);
497
+ if (step.action === 'conflict' && (decisions == null ? void 0 : decisions[entry.recordId]) !== 'revert') {
498
+ if ((decisions == null ? void 0 : decisions[entry.recordId]) === 'keep') done.push({
499
+ action: 'nothing',
500
+ recordId: entry.recordId,
501
+ why: 'alreadyReverted'
502
+ });
503
+ else conflicts.push(step);
504
+ continue;
505
+ }
506
+ if (step.action === 'nothing') {
507
+ done.push(step);
508
+ continue;
509
+ }
510
+ if (entry.action === 'created') {
511
+ await deleteCrmCompany(env.firestore, env.orgRef, entry.recordId);
512
+ done.push({
513
+ action: 'delete',
514
+ recordId: entry.recordId
515
+ });
516
+ continue;
517
+ }
518
+ const values = step.action === 'restore' || step.action === 'conflict' ? step.values : {};
519
+ const ref = companiesOf(env).doc(entry.recordId);
520
+ const stored = (_data = (await ref.get()).data()) != null ? _data : {};
521
+ const { fields } = storedFieldsFor(values, stored);
522
+ for (const { field } of CRM_COMPANY_PICKLIST_FIELDS){
523
+ var _values_field;
524
+ if (field in values) fields[field] = (_values_field = values[field]) != null ? _values_field : null;
525
+ }
526
+ if ('parentCompany' in values) fields['parentCompanyId'] = (_values_parentCompany = values['parentCompany']) != null ? _values_parentCompany : null;
527
+ for (const [fieldId, value] of Object.entries(values)){
528
+ if (fieldId.startsWith('custom:')) {
529
+ const key = fieldId.slice('custom:'.length);
530
+ const definition = definitions.find((one)=>one.key === key);
531
+ fields[`custom.${key}`] = (definition == null ? void 0 : definition.type) === 'date' && typeof value === 'string' ? Date.parse(value) : value != null ? value : null;
532
+ }
533
+ }
534
+ await ref.update(_extends({}, asUpdate(fields), crmCompanyListFields(_extends({}, stored, fields)), {
535
+ updatedAt: FieldValue.serverTimestamp()
536
+ }));
537
+ touched.push(ref);
538
+ done.push(step);
539
+ }
540
+ if (touched.length) await restampCrmListFieldsOf(touched, 'companies').catch(()=>undefined);
541
+ return {
542
+ done,
543
+ conflicts
544
+ };
545
+ }
546
+ };
547
+ }
548
+
549
+ //# sourceMappingURL=companies.js.map