@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,418 @@
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
+ * TASKS ON THE TRANSFER FRAMEWORK (AGL-3528) — the server half of
19
+ * `crm.tasks`.
20
+ *
21
+ * A task's subject, its Type, Priority and Status as the org's lists label
22
+ * them, its due date, its assignee, and the contact, company and deal it is
23
+ * for — each a lookup: a contact by email, a company by domain or name, a
24
+ * deal by its external id or its title. A row matches its task by Aglyn ID
25
+ * or by the external id another product gave it, so a file imported twice
26
+ * updates its tasks rather than doubling them.
27
+ *
28
+ * Written the way the tasks import route wrote them: the importing site's
29
+ * scope stamp, the meaning and the label of each list value together, the
30
+ * list's search keys, and a task marked done stamped with when and by whom.
31
+ *=========================================*/ import { CRM_COLLECTIONS, CRM_TASK_PICKLIST_IDS, crmTaskLabelsForNew, crmTaskListFields, crmTaskPicklistLabels, resolveCrmSemanticPicklistWrite } from "@aglyn/aglyn/server";
32
+ import { createResourceUid } from "@aglyn/aglyn/app-utils/create-resource-uid";
33
+ import { buildTransferPlan, planTransferUndo, TRANSFER_ID_FIELD, transferLookupNewName } from "@aglyn/aglyn/data-transfer";
34
+ import { restampCrmListFieldsOf } from "@aglyn/tenant-data-admin";
35
+ import { FieldValue } from "firebase-admin/firestore";
36
+ import { readCrmTaskPicklists } from "../server/read-picklist.js";
37
+ import { TASK_ALIASES } from "./aliases.js";
38
+ import { addCrmPicklistValues, countCrmExport, creationScope, crmMemberEmails, crmMembersTarget, crmPicklistLists, crmRecordsRoom, crmTransferEnv, eachWithinBudget, failureMessage, isoOf, lookupByField, lookupById, lookupResult, pickValues, plannedValues, readCrmExportPage, requireCrmRecords, requireCrmSuite, requireSite, textOf, TransferEngineError, visibleIn } from "./common.js";
39
+ import { companyForName } from "./companies.js";
40
+ import { CRM_MEMBERS_TARGET, CRM_TIMESTAMP_FIELDS, TASK_TRANSFER_DERIVED, TASK_TRANSFER_FIELDS, TASK_TRANSFER_GROUPS } from "./fields.js";
41
+ const SUITE_ACT = 'Importing tasks';
42
+ const NO_CUSTOM = [];
43
+ const tasksOf = (env)=>env.orgRef.collection(CRM_COLLECTIONS.tasks);
44
+ /** One task as values by field id; links by id unless `names` names them. */ export function taskTransferValues(id, task, lists, names = {}) {
45
+ const text = (value)=>textOf(value) || null;
46
+ const link = (value, resolve)=>{
47
+ var _ref;
48
+ const linked = text(value);
49
+ return linked ? (_ref = resolve == null ? void 0 : resolve(linked)) != null ? _ref : linked : null;
50
+ };
51
+ const labels = crmTaskPicklistLabels(task, lists);
52
+ return {
53
+ title: text(task['title']),
54
+ externalId: text(task['externalId']),
55
+ type: labels.type || null,
56
+ priority: labels.priority || null,
57
+ status: labels.status || null,
58
+ dueAt: isoOf(task['dueAtMs']),
59
+ completedAt: isoOf(task['completedAtMs']),
60
+ assignee: link(task['assigneeUid'], names.assignee),
61
+ contact: link(task['contactId'], names.contact),
62
+ company: link(task['companyId'], names.company),
63
+ deal: link(task['dealId'], names.deal),
64
+ notes: text(task['notes']),
65
+ createdAt: isoOf(task['createdAt']),
66
+ updatedAt: isoOf(task['updatedAt']),
67
+ [TRANSFER_ID_FIELD]: id
68
+ };
69
+ }
70
+ /** The tasks these ids name, as values. */ async function readTasks(env, ids, lists) {
71
+ const out = new Map();
72
+ const wanted = ids.filter((id)=>id && !id.includes('/'));
73
+ for(let at = 0; at < wanted.length; at += 500){
74
+ for (const snapshot of (await env.firestore.getAll(...wanted.slice(at, at + 500).map((id)=>tasksOf(env).doc(id))))){
75
+ const data = snapshot.data();
76
+ if (snapshot.exists && data && visibleIn(env, data['visibleTo'])) out.set(snapshot.id, taskTransferValues(snapshot.id, data, lists));
77
+ }
78
+ }
79
+ return out;
80
+ }
81
+ /** Reads `field` of each linked record by id, for an export's names. */ async function namesOf(env, collection, ids, field) {
82
+ const out = new Map();
83
+ const wanted = [
84
+ ...new Set(ids)
85
+ ].filter((id)=>id && !id.includes('/'));
86
+ for(let at = 0; at < wanted.length; at += 500){
87
+ const refs = wanted.slice(at, at + 500).map((id)=>env.orgRef.collection(collection).doc(id));
88
+ for (const snapshot of (await env.firestore.getAll(...refs))){
89
+ var _snapshot_data;
90
+ if (snapshot.exists) out.set(snapshot.id, field((_snapshot_data = snapshot.data()) != null ? _snapshot_data : {}));
91
+ }
92
+ }
93
+ return out;
94
+ }
95
+ /** A linked record this site sees, by id, or the refusal naming it. */ async function linked(run, collection, value, what) {
96
+ const id = textOf(value);
97
+ if (!id) return null;
98
+ const snapshot = await run.env.orgRef.collection(collection).doc(id).get();
99
+ if (!snapshot.exists || !visibleIn(run.env, snapshot.get('visibleTo'))) {
100
+ throw new TransferEngineError('notFound', 404, `The ${what} this row names no longer exists.`);
101
+ }
102
+ return snapshot.id;
103
+ }
104
+ /** The fields a row's values write, over the task as it stands; `null` clears. */ async function taskFields(run, values, current, actorUid) {
105
+ const fields = {};
106
+ if ('title' in values) {
107
+ const title = textOf(values['title']).slice(0, 200);
108
+ if (!title) throw new TransferEngineError('invalid', 422, 'A task needs a subject.');
109
+ fields['title'] = title;
110
+ }
111
+ if ('externalId' in values) fields['externalId'] = textOf(values['externalId']).slice(0, 200) || null;
112
+ const semantic = [
113
+ [
114
+ 'type',
115
+ 'kind',
116
+ 'typeLabel',
117
+ CRM_TASK_PICKLIST_IDS.type,
118
+ run.lists.type
119
+ ],
120
+ [
121
+ 'priority',
122
+ 'priority',
123
+ 'priorityLabel',
124
+ CRM_TASK_PICKLIST_IDS.priority,
125
+ run.lists.priority
126
+ ],
127
+ [
128
+ 'status',
129
+ 'status',
130
+ 'statusLabel',
131
+ CRM_TASK_PICKLIST_IDS.status,
132
+ run.lists.status
133
+ ]
134
+ ];
135
+ for (const [fieldId, meaningField, labelField, picklistId, list] of semantic){
136
+ if (!(fieldId in values)) continue;
137
+ const write = resolveCrmSemanticPicklistWrite(picklistId, list, values[fieldId], current[labelField]);
138
+ if (!write) continue;
139
+ if (write.ok === false) throw new TransferEngineError('invalid', 422, write.error);
140
+ fields[meaningField] = write.meaning;
141
+ fields[labelField] = write.label;
142
+ }
143
+ // Done is a moment: a task the file closes is stamped, one it reopens unstamped.
144
+ if (fields['status'] !== undefined && fields['status'] !== current['status']) {
145
+ const done = fields['status'] === 'done';
146
+ fields['completedAtMs'] = done ? Date.now() : null;
147
+ fields['completedByUid'] = done ? actorUid : null;
148
+ }
149
+ if ('dueAt' in values) {
150
+ const ms = values['dueAt'] ? Date.parse(String(values['dueAt'])) : NaN;
151
+ fields['dueAtMs'] = Number.isFinite(ms) ? ms : null;
152
+ }
153
+ if ('assignee' in values) fields['assigneeUid'] = textOf(values['assignee']) || null;
154
+ if ('contact' in values) fields['contactId'] = await linked(run, 'contacts', values['contact'], 'contact');
155
+ if ('deal' in values) fields['dealId'] = await linked(run, CRM_COLLECTIONS.deals, values['deal'], 'deal');
156
+ if ('company' in values) {
157
+ const create = transferLookupNewName(values['company']);
158
+ if (create) {
159
+ const company = await companyForName(run.env, create, run.actorUid, run.companies, run.admit);
160
+ if (!company) throw new TransferEngineError('invalid', 422, 'The CRM records limit has no room for the company.');
161
+ fields['companyId'] = company.id;
162
+ } else {
163
+ fields['companyId'] = await linked(run, CRM_COLLECTIONS.companies, values['company'], 'company');
164
+ }
165
+ }
166
+ if ('notes' in values) fields['notes'] = textOf(values['notes']).slice(0, 4000);
167
+ return fields;
168
+ }
169
+ const asUpdate = (fields)=>Object.fromEntries(Object.entries(fields).map(([key, value])=>[
170
+ key,
171
+ value === null ? FieldValue.delete() : value
172
+ ]));
173
+ /** The `crm.tasks` hooks. */ export function tasksTransferResource() {
174
+ return {
175
+ fields: ()=>({
176
+ standard: TASK_TRANSFER_FIELDS,
177
+ derived: TASK_TRANSFER_DERIVED,
178
+ system: CRM_TIMESTAMP_FIELDS,
179
+ groups: TASK_TRANSFER_GROUPS
180
+ }),
181
+ matchKeys: [
182
+ {
183
+ fieldId: TRANSFER_ID_FIELD,
184
+ normalizer: 'aglynId'
185
+ },
186
+ {
187
+ fieldId: 'externalId',
188
+ normalizer: 'externalId'
189
+ }
190
+ ],
191
+ aliases: TASK_ALIASES,
192
+ lookupTargets: {
193
+ [CRM_MEMBERS_TARGET]: crmMembersTarget()
194
+ },
195
+ async count (ctx, options) {
196
+ const env = await crmTransferEnv(ctx);
197
+ requireCrmRecords(env, 'tasks');
198
+ return countCrmExport(env, tasksOf(env), options, (data)=>visibleIn(env, data['visibleTo'], options.scopeTokens));
199
+ },
200
+ async readPage (ctx, cursor, fieldIds, options) {
201
+ const env = await crmTransferEnv(ctx);
202
+ requireCrmRecords(env, 'tasks');
203
+ const lists = await readCrmTaskPicklists(env.firestore, env.orgId);
204
+ const emails = fieldIds.includes('assignee') ? await crmMemberEmails(env.orgId) : new Map();
205
+ return readCrmExportPage(env, tasksOf(env), cursor, options, (data)=>visibleIn(env, data['visibleTo'], options == null ? void 0 : options.scopeTokens), async (docs)=>{
206
+ const ids = (field)=>docs.map((doc)=>textOf(doc.data[field])).filter(Boolean);
207
+ const [contacts, companies, deals] = await Promise.all([
208
+ fieldIds.includes('contact') ? namesOf(env, 'contacts', ids('contactId'), (data)=>textOf(data['email'])) : new Map(),
209
+ fieldIds.includes('company') ? namesOf(env, CRM_COLLECTIONS.companies, ids('companyId'), (data)=>textOf(data['name'])) : new Map(),
210
+ fieldIds.includes('deal') ? namesOf(env, CRM_COLLECTIONS.deals, ids('dealId'), (data)=>textOf(data['externalId']) || textOf(data['title'])) : new Map()
211
+ ]);
212
+ const names = {
213
+ assignee: (uid)=>emails.get(uid),
214
+ contact: (id)=>contacts.get(id) || undefined,
215
+ company: (id)=>companies.get(id) || undefined,
216
+ deal: (id)=>deals.get(id) || undefined
217
+ };
218
+ return docs.map((doc)=>pickValues(taskTransferValues(doc.id, doc.data, lists, names), fieldIds));
219
+ });
220
+ },
221
+ async lookup (ctx, requests) {
222
+ const env = await crmTransferEnv(ctx);
223
+ const lists = await readCrmTaskPicklists(env.firestore, env.orgId);
224
+ const visible = (data)=>visibleIn(env, data['visibleTo']);
225
+ const found = {
226
+ lookup: new Map(),
227
+ docs: new Map()
228
+ };
229
+ for (const request of requests){
230
+ if (request.fieldId === TRANSFER_ID_FIELD) await lookupById(env, tasksOf(env), request, visible, found);
231
+ else if (request.fieldId === 'externalId') {
232
+ await lookupByField(tasksOf(env), request, 'externalId', (value)=>value.trim(), visible, found);
233
+ }
234
+ }
235
+ return lookupResult(found, (id, data)=>taskTransferValues(id, data, lists));
236
+ },
237
+ async picklists (ctx, ids) {
238
+ return crmPicklistLists(await crmTransferEnv(ctx), ids, NO_CUSTOM);
239
+ },
240
+ async addPicklistValues (ctx, picklistId, values) {
241
+ await addCrmPicklistValues(await crmTransferEnv(ctx), picklistId, values);
242
+ },
243
+ lockedRules: ()=>[],
244
+ async plan (ctx, input) {
245
+ const env = await crmTransferEnv(ctx);
246
+ requireCrmSuite(env, SUITE_ACT);
247
+ requireSite(env, 'tasks');
248
+ return buildTransferPlan(input);
249
+ },
250
+ async apply (ctx, chunk, writer) {
251
+ const env = await crmTransferEnv(ctx);
252
+ requireCrmSuite(env, SUITE_ACT);
253
+ requireSite(env, 'tasks');
254
+ const run = {
255
+ env,
256
+ actorUid: ctx.actorUid,
257
+ lists: await readCrmTaskPicklists(env.firestore, env.orgId),
258
+ companies: new Map(),
259
+ admit: crmRecordsRoom(env)
260
+ };
261
+ const results = [];
262
+ const undo = [];
263
+ await eachWithinBudget(chunk.rows, ()=>writer.timeLeftMs(), async (row)=>{
264
+ const earlier = await writer.alreadyApplied(row.index);
265
+ if (earlier) {
266
+ results.push(earlier);
267
+ return;
268
+ }
269
+ const changed = row.diff.map((change)=>change.fieldId);
270
+ let result;
271
+ let entry;
272
+ try {
273
+ const values = plannedValues(row);
274
+ if (row.verdict === 'update' && row.recordId) {
275
+ var _get;
276
+ const ref = tasksOf(env).doc(row.recordId);
277
+ const current = (await ref.get()).data();
278
+ if (!current || !visibleIn(env, current['visibleTo'])) throw new TransferEngineError('notFound', 404, 'That task no longer exists.');
279
+ const before = taskTransferValues(ref.id, current, run.lists);
280
+ const fields = await taskFields(run, values, current, ctx.actorUid);
281
+ await ref.update(_extends({}, asUpdate(fields), crmTaskListFields(_extends({}, current, fields)), {
282
+ updatedAt: FieldValue.serverTimestamp()
283
+ }));
284
+ const after = (_get = (await readTasks(env, [
285
+ ref.id
286
+ ], run.lists)).get(ref.id)) != null ? _get : {};
287
+ result = {
288
+ row: row.index,
289
+ outcome: 'updated',
290
+ recordId: ref.id
291
+ };
292
+ entry = {
293
+ row: row.index,
294
+ recordId: ref.id,
295
+ action: 'updated',
296
+ previous: pickValues(before, changed),
297
+ written: pickValues(after, changed)
298
+ };
299
+ } else {
300
+ var _fields_kind, _fields_priority, _fields_status, _get1;
301
+ const fields = await taskFields(run, values, {}, ctx.actorUid);
302
+ const kind = (_fields_kind = fields['kind']) != null ? _fields_kind : 'todo';
303
+ const priority = (_fields_priority = fields['priority']) != null ? _fields_priority : 'normal';
304
+ const status = (_fields_status = fields['status']) != null ? _fields_status : 'open';
305
+ const labels = crmTaskLabelsForNew(run.lists, {
306
+ kind,
307
+ priority,
308
+ status
309
+ });
310
+ const scope = creationScope(env, ctx.actorUid);
311
+ const stored = Object.fromEntries(Object.entries(fields).filter(([, value])=>value !== null && value !== undefined));
312
+ const ref = tasksOf(env).doc(createResourceUid());
313
+ await ref.set(_extends({
314
+ kind,
315
+ priority,
316
+ status
317
+ }, labels, {
318
+ dueAtMs: null,
319
+ notes: '',
320
+ completedAtMs: status === 'done' ? Date.now() : null
321
+ }, status === 'done' && ctx.actorUid ? {
322
+ completedByUid: ctx.actorUid
323
+ } : {}, stored, scope, crmTaskListFields({
324
+ title: stored['title'],
325
+ visibleTo: scope['visibleTo']
326
+ })));
327
+ const after = (_get1 = (await readTasks(env, [
328
+ ref.id
329
+ ], run.lists)).get(ref.id)) != null ? _get1 : {};
330
+ result = {
331
+ row: row.index,
332
+ outcome: 'created',
333
+ recordId: ref.id
334
+ };
335
+ entry = {
336
+ row: row.index,
337
+ recordId: ref.id,
338
+ action: 'created',
339
+ written: pickValues(after, changed)
340
+ };
341
+ }
342
+ } catch (error) {
343
+ result = _extends({
344
+ row: row.index,
345
+ outcome: 'failed'
346
+ }, row.recordId ? {
347
+ recordId: row.recordId
348
+ } : {}, {
349
+ message: failureMessage(error)
350
+ });
351
+ entry = undefined;
352
+ }
353
+ await writer.markApplied(result, entry);
354
+ results.push(result);
355
+ if (entry) undo.push(entry);
356
+ });
357
+ return {
358
+ results,
359
+ undo
360
+ };
361
+ },
362
+ async revert (ctx, snapshot, decisions) {
363
+ const env = await crmTransferEnv(ctx);
364
+ const run = {
365
+ env,
366
+ actorUid: ctx.actorUid,
367
+ lists: await readCrmTaskPicklists(env.firestore, env.orgId),
368
+ companies: new Map(),
369
+ admit: crmRecordsRoom(env)
370
+ };
371
+ const current = await readTasks(env, snapshot.entries.map((entry)=>entry.recordId), run.lists);
372
+ const done = [];
373
+ const conflicts = [];
374
+ const touched = [];
375
+ for (const entry of snapshot.entries){
376
+ var _current_get, _data;
377
+ const step = planTransferUndo(entry, (_current_get = current.get(entry.recordId)) != null ? _current_get : null);
378
+ if (step.action === 'conflict' && (decisions == null ? void 0 : decisions[entry.recordId]) !== 'revert') {
379
+ if ((decisions == null ? void 0 : decisions[entry.recordId]) === 'keep') done.push({
380
+ action: 'nothing',
381
+ recordId: entry.recordId,
382
+ why: 'alreadyReverted'
383
+ });
384
+ else conflicts.push(step);
385
+ continue;
386
+ }
387
+ if (step.action === 'nothing') {
388
+ done.push(step);
389
+ continue;
390
+ }
391
+ const ref = tasksOf(env).doc(entry.recordId);
392
+ if (entry.action === 'created') {
393
+ await ref.delete();
394
+ done.push({
395
+ action: 'delete',
396
+ recordId: entry.recordId
397
+ });
398
+ continue;
399
+ }
400
+ const stored = (_data = (await ref.get()).data()) != null ? _data : {};
401
+ const values = step.action === 'restore' || step.action === 'conflict' ? step.values : {};
402
+ const fields = await taskFields(run, values, stored, ctx.actorUid);
403
+ await ref.update(_extends({}, asUpdate(fields), crmTaskListFields(_extends({}, stored, fields)), {
404
+ updatedAt: FieldValue.serverTimestamp()
405
+ }));
406
+ touched.push(ref);
407
+ done.push(step);
408
+ }
409
+ if (touched.length) await restampCrmListFieldsOf(touched, 'crmTasks').catch(()=>undefined);
410
+ return {
411
+ done,
412
+ conflicts
413
+ };
414
+ }
415
+ };
416
+ }
417
+
418
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/transfer/tasks.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*==========================================\n * TASKS ON THE TRANSFER FRAMEWORK (AGL-3528) — the server half of\n * `crm.tasks`.\n *\n * A task's subject, its Type, Priority and Status as the org's lists label\n * them, its due date, its assignee, and the contact, company and deal it is\n * for — each a lookup: a contact by email, a company by domain or name, a\n * deal by its external id or its title. A row matches its task by Aglyn ID\n * or by the external id another product gave it, so a file imported twice\n * updates its tasks rather than doubling them.\n *\n * Written the way the tasks import route wrote them: the importing site's\n * scope stamp, the meaning and the label of each list value together, the\n * list's search keys, and a task marked done stamped with when and by whom.\n *=========================================*/\n\nimport {\n CRM_COLLECTIONS,\n CRM_TASK_PICKLIST_IDS,\n type ContactFieldDefinition,\n type CrmTaskPicklists,\n crmTaskLabelsForNew,\n crmTaskListFields,\n crmTaskPicklistLabels,\n resolveCrmSemanticPicklistWrite,\n} from '@aglyn/aglyn/server'\nimport { createResourceUid } from '@aglyn/aglyn/app-utils/create-resource-uid'\nimport {\n buildTransferPlan,\n planTransferUndo,\n TRANSFER_ID_FIELD,\n transferLookupNewName,\n type PlannedTransferRow,\n type TransferRowResult,\n type TransferUndoEntry,\n type TransferUndoStep,\n} from '@aglyn/aglyn/data-transfer'\nimport type { TransferRecordsHooks } from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport { restampCrmListFieldsOf } from '@aglyn/tenant-data-admin'\nimport { FieldValue } from 'firebase-admin/firestore'\nimport { readCrmTaskPicklists } from '../server/read-picklist'\nimport { TASK_ALIASES } from './aliases'\nimport {\n addCrmPicklistValues,\n countCrmExport,\n creationScope,\n crmMemberEmails,\n crmMembersTarget,\n crmPicklistLists,\n crmRecordsRoom,\n crmTransferEnv,\n type CrmTransferEnv,\n eachWithinBudget,\n failureMessage,\n isoOf,\n lookupByField,\n lookupById,\n lookupResult,\n pickValues,\n plannedValues,\n readCrmExportPage,\n requireCrmRecords,\n requireCrmSuite,\n requireSite,\n textOf,\n TransferEngineError,\n visibleIn,\n} from './common'\nimport { companyForName } from './companies'\nimport {\n CRM_MEMBERS_TARGET,\n CRM_TIMESTAMP_FIELDS,\n TASK_TRANSFER_DERIVED,\n TASK_TRANSFER_FIELDS,\n TASK_TRANSFER_GROUPS,\n} from './fields'\n\nconst SUITE_ACT = 'Importing tasks'\nconst NO_CUSTOM: readonly ContactFieldDefinition[] = []\n\nconst tasksOf = (env: CrmTransferEnv) => env.orgRef.collection(CRM_COLLECTIONS.tasks)\n\n/** Names the export writes in place of the ids a task links by. */\ninterface TaskNames {\n assignee?: (uid: string) => string | undefined\n contact?: (id: string) => string | undefined\n company?: (id: string) => string | undefined\n deal?: (id: string) => string | undefined\n}\n\n/** One task as values by field id; links by id unless `names` names them. */\nexport function taskTransferValues(\n id: string,\n task: Record<string, unknown>,\n lists: CrmTaskPicklists,\n names: TaskNames = {},\n): Record<string, unknown> {\n const text = (value: unknown) => textOf(value) || null\n const link = (value: unknown, resolve?: (id: string) => string | undefined) => {\n const linked = text(value)\n return linked ? (resolve?.(linked) ?? linked) : null\n }\n const labels = crmTaskPicklistLabels(task, lists)\n return {\n title: text(task['title']),\n externalId: text(task['externalId']),\n type: labels.type || null,\n priority: labels.priority || null,\n status: labels.status || null,\n dueAt: isoOf(task['dueAtMs']),\n completedAt: isoOf(task['completedAtMs']),\n assignee: link(task['assigneeUid'], names.assignee),\n contact: link(task['contactId'], names.contact),\n company: link(task['companyId'], names.company),\n deal: link(task['dealId'], names.deal),\n notes: text(task['notes']),\n createdAt: isoOf(task['createdAt']),\n updatedAt: isoOf(task['updatedAt']),\n [TRANSFER_ID_FIELD]: id,\n }\n}\n\n/** The tasks these ids name, as values. */\nasync function readTasks(env: CrmTransferEnv, ids: readonly string[], lists: CrmTaskPicklists) {\n const out = new Map<string, Record<string, unknown>>()\n const wanted = ids.filter((id) => id && !id.includes('/'))\n for (let at = 0; at < wanted.length; at += 500) {\n for (const snapshot of await env.firestore.getAll(...wanted.slice(at, at + 500).map((id) => tasksOf(env).doc(id)))) {\n const data = snapshot.data()\n if (snapshot.exists && data && visibleIn(env, data['visibleTo'])) out.set(snapshot.id, taskTransferValues(snapshot.id, data, lists))\n }\n }\n return out\n}\n\n/** Reads `field` of each linked record by id, for an export's names. */\nasync function namesOf(\n env: CrmTransferEnv,\n collection: string,\n ids: Iterable<string>,\n field: (data: Record<string, unknown>) => string,\n): Promise<Map<string, string>> {\n const out = new Map<string, string>()\n const wanted = [...new Set(ids)].filter((id) => id && !id.includes('/'))\n for (let at = 0; at < wanted.length; at += 500) {\n const refs = wanted.slice(at, at + 500).map((id) => env.orgRef.collection(collection).doc(id))\n for (const snapshot of await env.firestore.getAll(...refs)) {\n if (snapshot.exists) out.set(snapshot.id, field(snapshot.data() ?? {}))\n }\n }\n return out\n}\n\n/** Everything one apply call shares. */\ninterface ApplyRun {\n env: CrmTransferEnv\n actorUid: string | null\n lists: CrmTaskPicklists\n companies: Map<string, Promise<{ id: string; name: string } | null>>\n admit: () => Promise<boolean>\n}\n\n/** A linked record this site sees, by id, or the refusal naming it. */\nasync function linked(run: ApplyRun, collection: string, value: unknown, what: string): Promise<string | null> {\n const id = textOf(value)\n if (!id) return null\n const snapshot = await run.env.orgRef.collection(collection).doc(id).get()\n if (!snapshot.exists || !visibleIn(run.env, snapshot.get('visibleTo'))) {\n throw new TransferEngineError('notFound', 404, `The ${what} this row names no longer exists.`)\n }\n return snapshot.id\n}\n\n/** The fields a row's values write, over the task as it stands; `null` clears. */\nasync function taskFields(\n run: ApplyRun,\n values: Readonly<Record<string, unknown>>,\n current: Record<string, unknown>,\n actorUid: string | null,\n): Promise<Record<string, unknown>> {\n const fields: Record<string, unknown> = {}\n if ('title' in values) {\n const title = textOf(values['title']).slice(0, 200)\n if (!title) throw new TransferEngineError('invalid', 422, 'A task needs a subject.')\n fields['title'] = title\n }\n if ('externalId' in values) fields['externalId'] = textOf(values['externalId']).slice(0, 200) || null\n const semantic = [\n ['type', 'kind', 'typeLabel', CRM_TASK_PICKLIST_IDS.type, run.lists.type],\n ['priority', 'priority', 'priorityLabel', CRM_TASK_PICKLIST_IDS.priority, run.lists.priority],\n ['status', 'status', 'statusLabel', CRM_TASK_PICKLIST_IDS.status, run.lists.status],\n ] as const\n for (const [fieldId, meaningField, labelField, picklistId, list] of semantic) {\n if (!(fieldId in values)) continue\n const write = resolveCrmSemanticPicklistWrite(picklistId, list, values[fieldId], current[labelField])\n if (!write) continue\n if (write.ok === false) throw new TransferEngineError('invalid', 422, write.error)\n fields[meaningField] = write.meaning\n fields[labelField] = write.label\n }\n // Done is a moment: a task the file closes is stamped, one it reopens unstamped.\n if (fields['status'] !== undefined && fields['status'] !== current['status']) {\n const done = fields['status'] === 'done'\n fields['completedAtMs'] = done ? Date.now() : null\n fields['completedByUid'] = done ? actorUid : null\n }\n if ('dueAt' in values) {\n const ms = values['dueAt'] ? Date.parse(String(values['dueAt'])) : NaN\n fields['dueAtMs'] = Number.isFinite(ms) ? ms : null\n }\n if ('assignee' in values) fields['assigneeUid'] = textOf(values['assignee']) || null\n if ('contact' in values) fields['contactId'] = await linked(run, 'contacts', values['contact'], 'contact')\n if ('deal' in values) fields['dealId'] = await linked(run, CRM_COLLECTIONS.deals, values['deal'], 'deal')\n if ('company' in values) {\n const create = transferLookupNewName(values['company'])\n if (create) {\n const company = await companyForName(run.env, create, run.actorUid, run.companies, run.admit)\n if (!company) throw new TransferEngineError('invalid', 422, 'The CRM records limit has no room for the company.')\n fields['companyId'] = company.id\n } else {\n fields['companyId'] = await linked(run, CRM_COLLECTIONS.companies, values['company'], 'company')\n }\n }\n if ('notes' in values) fields['notes'] = textOf(values['notes']).slice(0, 4000)\n return fields\n}\n\nconst asUpdate = (fields: Record<string, unknown>) =>\n Object.fromEntries(Object.entries(fields).map(([key, value]) => [key, value === null ? FieldValue.delete() : value]))\n\n/** The `crm.tasks` hooks. */\nexport function tasksTransferResource(): TransferRecordsHooks {\n return {\n fields: () => ({\n standard: TASK_TRANSFER_FIELDS,\n derived: TASK_TRANSFER_DERIVED,\n system: CRM_TIMESTAMP_FIELDS,\n groups: TASK_TRANSFER_GROUPS,\n }),\n matchKeys: [\n { fieldId: TRANSFER_ID_FIELD, normalizer: 'aglynId' },\n { fieldId: 'externalId', normalizer: 'externalId' },\n ],\n aliases: TASK_ALIASES,\n lookupTargets: { [CRM_MEMBERS_TARGET]: crmMembersTarget() },\n\n async count(ctx, options) {\n const env = await crmTransferEnv(ctx)\n requireCrmRecords(env, 'tasks')\n return countCrmExport(env, tasksOf(env), options, (data) => visibleIn(env, data['visibleTo'], options.scopeTokens))\n },\n\n async readPage(ctx, cursor, fieldIds, options) {\n const env = await crmTransferEnv(ctx)\n requireCrmRecords(env, 'tasks')\n const lists = await readCrmTaskPicklists(env.firestore, env.orgId)\n const emails = fieldIds.includes('assignee') ? await crmMemberEmails(env.orgId) : new Map<string, string>()\n return readCrmExportPage(\n env,\n tasksOf(env),\n cursor,\n options,\n (data) => visibleIn(env, data['visibleTo'], options?.scopeTokens),\n async (docs) => {\n const ids = (field: string) => docs.map((doc) => textOf(doc.data[field])).filter(Boolean)\n const [contacts, companies, deals] = await Promise.all([\n fieldIds.includes('contact') ? namesOf(env, 'contacts', ids('contactId'), (data) => textOf(data['email'])) : new Map<string, string>(),\n fieldIds.includes('company') ? namesOf(env, CRM_COLLECTIONS.companies, ids('companyId'), (data) => textOf(data['name'])) : new Map<string, string>(),\n fieldIds.includes('deal')\n ? namesOf(env, CRM_COLLECTIONS.deals, ids('dealId'), (data) => textOf(data['externalId']) || textOf(data['title']))\n : new Map<string, string>(),\n ])\n const names: TaskNames = {\n assignee: (uid) => emails.get(uid),\n contact: (id) => contacts.get(id) || undefined,\n company: (id) => companies.get(id) || undefined,\n deal: (id) => deals.get(id) || undefined,\n }\n return docs.map((doc) => pickValues(taskTransferValues(doc.id, doc.data, lists, names), fieldIds))\n },\n )\n },\n\n async lookup(ctx, requests) {\n const env = await crmTransferEnv(ctx)\n const lists = await readCrmTaskPicklists(env.firestore, env.orgId)\n const visible = (data: Record<string, unknown>) => visibleIn(env, data['visibleTo'])\n const found = { lookup: new Map<string, string[]>(), docs: new Map<string, Record<string, unknown>>() }\n for (const request of requests) {\n if (request.fieldId === TRANSFER_ID_FIELD) await lookupById(env, tasksOf(env), request, visible, found)\n else if (request.fieldId === 'externalId') {\n await lookupByField(tasksOf(env), request, 'externalId', (value) => value.trim(), visible, found)\n }\n }\n return lookupResult(found, (id, data) => taskTransferValues(id, data, lists))\n },\n\n async picklists(ctx, ids) {\n return crmPicklistLists(await crmTransferEnv(ctx), ids, NO_CUSTOM)\n },\n\n async addPicklistValues(ctx, picklistId, values) {\n await addCrmPicklistValues(await crmTransferEnv(ctx), picklistId, values)\n },\n\n lockedRules: () => [],\n\n async plan(ctx, input) {\n const env = await crmTransferEnv(ctx)\n requireCrmSuite(env, SUITE_ACT)\n requireSite(env, 'tasks')\n return buildTransferPlan(input)\n },\n\n async apply(ctx, chunk, writer) {\n const env = await crmTransferEnv(ctx)\n requireCrmSuite(env, SUITE_ACT)\n requireSite(env, 'tasks')\n const run: ApplyRun = {\n env,\n actorUid: ctx.actorUid,\n lists: await readCrmTaskPicklists(env.firestore, env.orgId),\n companies: new Map(),\n admit: crmRecordsRoom(env),\n }\n const results: TransferRowResult[] = []\n const undo: TransferUndoEntry[] = []\n await eachWithinBudget(chunk.rows as PlannedTransferRow[], () => writer.timeLeftMs(), async (row) => {\n const earlier = await writer.alreadyApplied(row.index)\n if (earlier) {\n results.push(earlier)\n return\n }\n const changed = row.diff.map((change) => change.fieldId)\n let result: TransferRowResult\n let entry: TransferUndoEntry | undefined\n try {\n const values = plannedValues(row)\n if (row.verdict === 'update' && row.recordId) {\n const ref = tasksOf(env).doc(row.recordId)\n const current = (await ref.get()).data()\n if (!current || !visibleIn(env, current['visibleTo'])) throw new TransferEngineError('notFound', 404, 'That task no longer exists.')\n const before = taskTransferValues(ref.id, current, run.lists)\n const fields = await taskFields(run, values, current, ctx.actorUid)\n await ref.update({\n ...asUpdate(fields),\n ...crmTaskListFields({ ...current, ...fields }),\n updatedAt: FieldValue.serverTimestamp(),\n })\n const after = (await readTasks(env, [ref.id], run.lists)).get(ref.id) ?? {}\n result = { row: row.index, outcome: 'updated', recordId: ref.id }\n entry = { row: row.index, recordId: ref.id, action: 'updated', previous: pickValues(before, changed), written: pickValues(after, changed) }\n } else {\n const fields = await taskFields(run, values, {}, ctx.actorUid)\n const kind = (fields['kind'] as 'call' | 'email' | 'meeting' | 'todo' | undefined) ?? 'todo'\n const priority = (fields['priority'] as 'low' | 'normal' | 'high' | undefined) ?? 'normal'\n const status = (fields['status'] as 'open' | 'done' | undefined) ?? 'open'\n const labels = crmTaskLabelsForNew(run.lists, { kind, priority, status })\n const scope = creationScope(env, ctx.actorUid)\n const stored = Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== null && value !== undefined))\n const ref = tasksOf(env).doc(createResourceUid())\n await ref.set({\n kind,\n priority,\n status,\n ...labels,\n dueAtMs: null,\n notes: '',\n completedAtMs: status === 'done' ? Date.now() : null,\n ...(status === 'done' && ctx.actorUid ? { completedByUid: ctx.actorUid } : {}),\n ...stored,\n ...scope,\n // What the Tasks list searches by (AGL-3321).\n ...crmTaskListFields({ title: stored['title'], visibleTo: scope['visibleTo'] }),\n })\n const after = (await readTasks(env, [ref.id], run.lists)).get(ref.id) ?? {}\n result = { row: row.index, outcome: 'created', recordId: ref.id }\n entry = { row: row.index, recordId: ref.id, action: 'created', written: pickValues(after, changed) }\n }\n } catch (error) {\n result = { row: row.index, outcome: 'failed', ...(row.recordId ? { recordId: row.recordId } : {}), message: failureMessage(error) }\n entry = undefined\n }\n await writer.markApplied(result, entry)\n results.push(result)\n if (entry) undo.push(entry)\n })\n return { results, undo }\n },\n\n async revert(ctx, snapshot, decisions) {\n const env = await crmTransferEnv(ctx)\n const run: ApplyRun = {\n env,\n actorUid: ctx.actorUid,\n lists: await readCrmTaskPicklists(env.firestore, env.orgId),\n companies: new Map(),\n admit: crmRecordsRoom(env),\n }\n const current = await readTasks(env, snapshot.entries.map((entry) => entry.recordId), run.lists)\n const done: TransferUndoStep[] = []\n const conflicts: TransferUndoStep[] = []\n const touched: FirebaseFirestore.DocumentReference[] = []\n for (const entry of snapshot.entries) {\n const step = planTransferUndo(entry, current.get(entry.recordId) ?? null)\n if (step.action === 'conflict' && decisions?.[entry.recordId] !== 'revert') {\n if (decisions?.[entry.recordId] === 'keep') done.push({ action: 'nothing', recordId: entry.recordId, why: 'alreadyReverted' })\n else conflicts.push(step)\n continue\n }\n if (step.action === 'nothing') {\n done.push(step)\n continue\n }\n const ref = tasksOf(env).doc(entry.recordId)\n if (entry.action === 'created') {\n await ref.delete()\n done.push({ action: 'delete', recordId: entry.recordId })\n continue\n }\n const stored = (await ref.get()).data() ?? {}\n const values = step.action === 'restore' || step.action === 'conflict' ? step.values : {}\n const fields = await taskFields(run, values, stored, ctx.actorUid)\n await ref.update({ ...asUpdate(fields), ...crmTaskListFields({ ...stored, ...fields }), updatedAt: FieldValue.serverTimestamp() })\n touched.push(ref)\n done.push(step)\n }\n if (touched.length) await restampCrmListFieldsOf(touched, 'crmTasks').catch(() => undefined)\n return { done, conflicts }\n },\n }\n}\n\n"],"names":["CRM_COLLECTIONS","CRM_TASK_PICKLIST_IDS","crmTaskLabelsForNew","crmTaskListFields","crmTaskPicklistLabels","resolveCrmSemanticPicklistWrite","createResourceUid","buildTransferPlan","planTransferUndo","TRANSFER_ID_FIELD","transferLookupNewName","restampCrmListFieldsOf","FieldValue","readCrmTaskPicklists","TASK_ALIASES","addCrmPicklistValues","countCrmExport","creationScope","crmMemberEmails","crmMembersTarget","crmPicklistLists","crmRecordsRoom","crmTransferEnv","eachWithinBudget","failureMessage","isoOf","lookupByField","lookupById","lookupResult","pickValues","plannedValues","readCrmExportPage","requireCrmRecords","requireCrmSuite","requireSite","textOf","TransferEngineError","visibleIn","companyForName","CRM_MEMBERS_TARGET","CRM_TIMESTAMP_FIELDS","TASK_TRANSFER_DERIVED","TASK_TRANSFER_FIELDS","TASK_TRANSFER_GROUPS","SUITE_ACT","NO_CUSTOM","tasksOf","env","orgRef","collection","tasks","taskTransferValues","id","task","lists","names","text","value","link","resolve","linked","labels","title","externalId","type","priority","status","dueAt","completedAt","assignee","contact","company","deal","notes","createdAt","updatedAt","readTasks","ids","out","Map","wanted","filter","includes","at","length","snapshot","firestore","getAll","slice","map","doc","data","exists","set","namesOf","field","Set","refs","run","what","get","taskFields","values","current","actorUid","fields","semantic","fieldId","meaningField","labelField","picklistId","list","write","ok","error","meaning","label","undefined","done","Date","now","ms","parse","String","NaN","Number","isFinite","deals","create","companies","admit","asUpdate","Object","fromEntries","entries","key","delete","tasksTransferResource","standard","derived","system","groups","matchKeys","normalizer","aliases","lookupTargets","count","ctx","options","scopeTokens","readPage","cursor","fieldIds","orgId","emails","docs","Boolean","contacts","Promise","all","uid","lookup","requests","visible","found","request","trim","picklists","addPicklistValues","lockedRules","plan","input","apply","chunk","writer","results","undo","rows","timeLeftMs","row","earlier","alreadyApplied","index","push","changed","diff","change","result","entry","verdict","recordId","ref","before","update","serverTimestamp","after","outcome","action","previous","written","kind","scope","stored","dueAtMs","completedAtMs","completedByUid","visibleTo","message","markApplied","revert","decisions","conflicts","touched","step","why","catch"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /** The wizard's title for each resource. */
18
+ export declare const CRM_TRANSFER_LABELS: Readonly<Record<string, string>>;
19
+ /** Registers the client half of every CRM transfer resource. */
20
+ export declare function registerCrmTransferResourceUis(pluginId: string): void;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /*==========================================
17
+ * HOW THE IMPORT WIZARD AND THE EXPORT DIALOG NAME THE CRM'S RECORDS
18
+ * (AGL-3527, AGL-3528) — the client half of each resource, registered from the
19
+ * console registrar, which loads where the wizard is drawn.
20
+ *=========================================*/ import { registerPluginTransferResourceUi } from "@aglyn/aglyn/plugin-manager/plugin-transfer-resources";
21
+ import { CRM_ACTIVITIES_RESOURCE, CRM_COMPANIES_RESOURCE, CRM_CONTACTS_RESOURCE, CRM_DEALS_RESOURCE, CRM_FIELDS_RESOURCE, CRM_LEADS_RESOURCE, CRM_PIPELINES_RESOURCE, CRM_TASKS_RESOURCE } from "./fields.js";
22
+ /** The wizard's title for each resource. */ export const CRM_TRANSFER_LABELS = {
23
+ [CRM_CONTACTS_RESOURCE]: 'Contacts',
24
+ [CRM_COMPANIES_RESOURCE]: 'Companies',
25
+ [CRM_LEADS_RESOURCE]: 'Leads',
26
+ [CRM_DEALS_RESOURCE]: 'Deals',
27
+ [CRM_TASKS_RESOURCE]: 'Tasks',
28
+ [CRM_ACTIVITIES_RESOURCE]: 'Activities',
29
+ [CRM_PIPELINES_RESOURCE]: 'Pipelines and stages',
30
+ [CRM_FIELDS_RESOURCE]: 'Custom fields'
31
+ };
32
+ /** Registers the client half of every CRM transfer resource. */ export function registerCrmTransferResourceUis(pluginId) {
33
+ for (const [key, label] of Object.entries(CRM_TRANSFER_LABELS)){
34
+ registerPluginTransferResourceUi(key, {
35
+ label
36
+ }, {
37
+ pluginId
38
+ });
39
+ }
40
+ }
41
+
42
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/transfer/ui.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*==========================================\n * HOW THE IMPORT WIZARD AND THE EXPORT DIALOG NAME THE CRM'S RECORDS\n * (AGL-3527, AGL-3528) — the client half of each resource, registered from the\n * console registrar, which loads where the wizard is drawn.\n *=========================================*/\n\nimport { registerPluginTransferResourceUi } from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport {\n CRM_ACTIVITIES_RESOURCE,\n CRM_COMPANIES_RESOURCE,\n CRM_CONTACTS_RESOURCE,\n CRM_DEALS_RESOURCE,\n CRM_FIELDS_RESOURCE,\n CRM_LEADS_RESOURCE,\n CRM_PIPELINES_RESOURCE,\n CRM_TASKS_RESOURCE,\n} from './fields'\n\n/** The wizard's title for each resource. */\nexport const CRM_TRANSFER_LABELS: Readonly<Record<string, string>> = {\n [CRM_CONTACTS_RESOURCE]: 'Contacts',\n [CRM_COMPANIES_RESOURCE]: 'Companies',\n [CRM_LEADS_RESOURCE]: 'Leads',\n [CRM_DEALS_RESOURCE]: 'Deals',\n [CRM_TASKS_RESOURCE]: 'Tasks',\n [CRM_ACTIVITIES_RESOURCE]: 'Activities',\n [CRM_PIPELINES_RESOURCE]: 'Pipelines and stages',\n [CRM_FIELDS_RESOURCE]: 'Custom fields',\n}\n\n/** Registers the client half of every CRM transfer resource. */\nexport function registerCrmTransferResourceUis(pluginId: string): void {\n for (const [key, label] of Object.entries(CRM_TRANSFER_LABELS)) {\n registerPluginTransferResourceUi(key, { label }, { pluginId })\n }\n}\n"],"names":["registerPluginTransferResourceUi","CRM_ACTIVITIES_RESOURCE","CRM_COMPANIES_RESOURCE","CRM_CONTACTS_RESOURCE","CRM_DEALS_RESOURCE","CRM_FIELDS_RESOURCE","CRM_LEADS_RESOURCE","CRM_PIPELINES_RESOURCE","CRM_TASKS_RESOURCE","CRM_TRANSFER_LABELS","registerCrmTransferResourceUis","pluginId","key","label","Object","entries"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;2CAI2C,GAE3C,SAASA,gCAAgC,QAAQ,wDAAuD;AACxG,SACEC,uBAAuB,EACvBC,sBAAsB,EACtBC,qBAAqB,EACrBC,kBAAkB,EAClBC,mBAAmB,EACnBC,kBAAkB,EAClBC,sBAAsB,EACtBC,kBAAkB,QACb,cAAU;AAEjB,0CAA0C,GAC1C,OAAO,MAAMC,sBAAwD;IACnE,CAACN,sBAAsB,EAAE;IACzB,CAACD,uBAAuB,EAAE;IAC1B,CAACI,mBAAmB,EAAE;IACtB,CAACF,mBAAmB,EAAE;IACtB,CAACI,mBAAmB,EAAE;IACtB,CAACP,wBAAwB,EAAE;IAC3B,CAACM,uBAAuB,EAAE;IAC1B,CAACF,oBAAoB,EAAE;AACzB,EAAC;AAED,8DAA8D,GAC9D,OAAO,SAASK,+BAA+BC,QAAgB;IAC7D,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACN,qBAAsB;QAC9DT,iCAAiCY,KAAK;YAAEC;QAAM,GAAG;YAAEF;QAAS;IAC9D;AACF"}
@@ -1,42 +0,0 @@
1
- /**
2
- * IMPORTING A COMPANIES FILE — the company vocabulary over the shared
3
- * drawer (AGL-2621).
4
- *
5
- * The server half is `server/companies-import.ts`. What is particular to
6
- * companies: the name is the one cell every row needs (a domain is a key,
7
- * a name is the caption the list cannot do without), the custom fields
8
- * are the org's COMPANY definitions (AGL-2661), and a row is matched to a
9
- * company already filed by its domain first and its name second.
10
- */
11
- import { type ConsolePluginPageProps, type ContactFieldDefinition } from '@aglyn/aglyn';
12
- import { type CompanyImportField, type CompanyImportRawRow, type CompanyImportSkippedRow } from '../model/crm-company-import';
13
- import { type CsvImportVocabulary } from './csv-import-drawer';
14
- /** The browser-side address of the route one chunk is posted to. */
15
- export declare const COMPANIES_IMPORT_URL = "/api/crm/companies-import";
16
- /** The company vocabulary, over the org's company custom fields (AGL-2661). */
17
- export declare function companyImportVocabulary(fields: readonly ContactFieldDefinition[]): CsvImportVocabulary<CompanyImportField, CompanyImportRawRow & Record<string, unknown>, CompanyImportSkippedRow>;
18
- /** The vocabulary with no custom fields — what a surface without an org resolves to. */
19
- export declare const COMPANY_IMPORT_VOCABULARY: CsvImportVocabulary<"notes" | "name" | "phone" | "website" | "tags" | "domain" | "ownerEmail" | "industry" | "addressLine1" | "addressLine2" | "addressCity" | "addressState" | "addressPostalCode" | "addressCountry", Partial<Record<"notes" | "name" | "phone" | "website" | "tags" | "domain" | "ownerEmail" | "industry" | "addressLine1" | "addressLine2" | "addressCity" | "addressState" | "addressPostalCode" | "addressCountry", unknown>> & {
20
- custom?: unknown;
21
- } & Record<string, unknown>, CompanyImportSkippedRow>;
22
- export interface CompanyImportDrawerProps {
23
- open: boolean;
24
- onClose: () => void;
25
- /** The site the file is filed under, or `null` at the organization level (AGL-2630). */
26
- hostId: string | null;
27
- /** The org, for the company field definitions the mapping offers (AGL-2661). */
28
- org?: ConsolePluginPageProps['org'];
29
- }
30
- export declare function CompanyImportDrawer(props: CompanyImportDrawerProps): import("react").JSX.Element;
31
- export declare namespace CompanyImportDrawer {
32
- var displayName: string;
33
- }
34
- /** The "Import CSV" action on the companies list, with the drawer it opens. */
35
- export declare function CompanyImportButton(props: {
36
- hostId: string | null;
37
- org?: ConsolePluginPageProps['org'];
38
- }): import("react").JSX.Element;
39
- export declare namespace CompanyImportButton {
40
- var displayName: string;
41
- }
42
- export default CompanyImportDrawer;