@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
@@ -68,10 +68,12 @@ import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_wi
68
68
  * makes it true. A converted lead's status is fixed for the same reason.
69
69
  * Reopening an unqualified lead drops its reason, as the console does: a
70
70
  * lead being worked again is not "unqualified because …".
71
- */ import { checkVisitorRecordCeiling, CRM_LEAD_STATUSES, crmLeadStatus, crmMemberOption, findOrgMember, LEADS_MAX_PER_HOST, normalizeCompanyDomain, normalizeContactEmail, crmPicklistDefaultLabel, judgeCrmLeadSource, normalizeCrmLeadProfile, personKey, readMarketingBasis, soloConsentGroup } from "@aglyn/aglyn/server";
71
+ */ import { checkVisitorRecordCeiling, CRM_LEAD_STATUSES, crmLeadComposedName, CRM_COLLECTIONS, crmLeadStatus, crmLeadStatusLabel, CRM_LEAD_STATUS_PICKLIST, crmMemberOption, effectiveCrmLeadStatusPicklist, resolveCrmLeadStatusWrite, findOrgMember, LEADS_MAX_PER_HOST, normalizeCompanyDomain, normalizeContactEmail, crmPicklistDefaultLabel, judgeCrmLeadSource, judgeCrmPicklistValue, normalizeCrmLeadProfile, personKey, readMarketingBasis, soloConsentGroup } from "@aglyn/aglyn/server";
72
72
  import { scopeTokensForHost } from "@aglyn/aglyn/app-utils/scope-tokens";
73
73
  import { addHostLead, apiJson, ApiErrors, decodeCursor, encodeCursor, listOrgMembers, listResponse, parseLimit, restampCrmListFieldsAt } from "@aglyn/tenant-data-admin";
74
74
  import { convertHostLead } from "../convert-host-lead.js";
75
+ import { readCrmPicklist } from "../read-picklist.js";
76
+ import { judgeLeadPicklistPatch, namesLeadPicklist, readLeadPicklists } from "../lead-picklists.js";
75
77
  import { FieldPath, FieldValue, Timestamp } from "firebase-admin/firestore";
76
78
  import { claimWrite, orgOwnsHost, readJsonBody, requireScope } from "@aglyn/tenant-data-admin/server/api-v1-kit";
77
79
  import { CRM_ID_MAX, CRM_LABEL_MAX, CRM_TEXT_MAX, CRM_TITLE_MAX, crmCustomUpdate, crmCustomView, crmTimes, crmValidationFailed, isoFromMs, memberError, readCrmCustomBody, readOptionalText, readOrgLeadSourcePicklist, refuseUnknownKeys, updatePayload } from "./crm-shared.js";
@@ -90,8 +92,8 @@ import { CRM_ID_MAX, CRM_LABEL_MAX, CRM_TEXT_MAX, CRM_TITLE_MAX, crmCustomUpdate
90
92
  'unqualified'
91
93
  ];
92
94
  // ── The view ────────────────────────────────────────────────────────────────
93
- /** The lead object as published. Every writable field appears here. */ function leadView(siteId, doc) {
94
- var _doc_data, _data_ownerUid, _data_notes, _data_unqualifiedReason, _data_company, _data_jobTitle, _data_phone, _data_website, _data_address, _data_leadSource, _data_convertedContactId, _data_companyId, _data_dealId;
95
+ /** The lead object as published. Every writable field appears here. */ function leadView(siteId, doc, statuses) {
96
+ var _doc_data, _data_ownerUid, _data_notes, _data_unqualifiedReason, _data_company, _data_jobTitle, _data_phone, _data_website, _data_address, _data_leadSource, _data_salutation, _data_firstName, _data_lastName, _data_mobilePhone, _data_fax, _data_industry, _data_rating, _data_convertedContactId, _data_companyId, _data_dealId;
95
97
  const data = (_doc_data = doc.data()) != null ? _doc_data : {};
96
98
  // The lead's own silo — a group of one, however the org pools its
97
99
  // contacts — which is where `addHostLead` recorded the basis.
@@ -103,6 +105,8 @@ import { CRM_ID_MAX, CRM_LABEL_MAX, CRM_TEXT_MAX, CRM_TITLE_MAX, crmCustomUpdate
103
105
  email: typeof data['email'] === 'string' ? data['email'] : null,
104
106
  name: typeof data['name'] === 'string' ? data['name'] : null,
105
107
  status: crmLeadStatus(data),
108
+ // The org's label for the value the lead holds, of `status`'s meaning (AGL-3512).
109
+ statusLabel: crmLeadStatusLabel(data, statuses),
106
110
  ownerUid: (_data_ownerUid = data.ownerUid) != null ? _data_ownerUid : null,
107
111
  notes: (_data_notes = data.notes) != null ? _data_notes : null,
108
112
  unqualifiedReason: (_data_unqualifiedReason = data.unqualifiedReason) != null ? _data_unqualifiedReason : null,
@@ -114,6 +118,18 @@ import { CRM_ID_MAX, CRM_LABEL_MAX, CRM_TEXT_MAX, CRM_TITLE_MAX, crmCustomUpdate
114
118
  address: (_data_address = data.address) != null ? _data_address : null,
115
119
  tags: Array.isArray(data.tags) ? data.tags.map(String) : [],
116
120
  leadSource: (_data_leadSource = data.leadSource) != null ? _data_leadSource : null,
121
+ // Salesforce's standard lead fields (AGL-3513).
122
+ salutation: (_data_salutation = data.salutation) != null ? _data_salutation : null,
123
+ firstName: (_data_firstName = data.firstName) != null ? _data_firstName : null,
124
+ lastName: (_data_lastName = data.lastName) != null ? _data_lastName : null,
125
+ mobilePhone: (_data_mobilePhone = data.mobilePhone) != null ? _data_mobilePhone : null,
126
+ fax: (_data_fax = data.fax) != null ? _data_fax : null,
127
+ doNotCall: data.doNotCall === true,
128
+ industry: (_data_industry = data.industry) != null ? _data_industry : null,
129
+ rating: (_data_rating = data.rating) != null ? _data_rating : null,
130
+ annualRevenueCents: typeof data.annualRevenueCents === 'number' ? data.annualRevenueCents : null,
131
+ currency: typeof data.currency === 'string' && data.currency ? data.currency : 'usd',
132
+ numberOfEmployees: typeof data.numberOfEmployees === 'number' ? data.numberOfEmployees : null,
117
133
  sources: Array.isArray(data['sources']) ? data['sources'].map(String) : [],
118
134
  submissionCount: typeof data['submissionCount'] === 'number' ? data['submissionCount'] : 0,
119
135
  firstSeen: isoFromMs(data['firstSeenAtMs']),
@@ -199,14 +215,25 @@ import { CRM_ID_MAX, CRM_LABEL_MAX, CRM_TEXT_MAX, CRM_TITLE_MAX, crmCustomUpdate
199
215
  return found.uid;
200
216
  }
201
217
  // ── PATCH ───────────────────────────────────────────────────────────────────
202
- /** The lead's own fields, writable on a create and a PATCH alike (AGL-3231). */ const LEAD_PROFILE_KEYS = [
218
+ /** The lead's own fields, writable on a create and a PATCH alike (AGL-3231, AGL-3513). */ const LEAD_PROFILE_KEYS = [
203
219
  'company',
204
220
  'jobTitle',
205
221
  'phone',
206
222
  'website',
207
223
  'address',
208
224
  'tags',
209
- 'leadSource'
225
+ 'leadSource',
226
+ 'salutation',
227
+ 'firstName',
228
+ 'lastName',
229
+ 'mobilePhone',
230
+ 'fax',
231
+ 'doNotCall',
232
+ 'industry',
233
+ 'rating',
234
+ 'annualRevenueCents',
235
+ 'currency',
236
+ 'numberOfEmployees'
210
237
  ];
211
238
  const LEAD_WRITABLE = new Set([
212
239
  'siteId',
@@ -243,14 +270,13 @@ function readLeadInput(body) {
243
270
  const profile = normalizeCrmLeadProfile(profileBody);
244
271
  Object.assign(errors, profile.errors);
245
272
  values.profile = profile.patch;
273
+ // A flag, sent as one: a string would otherwise read as a clear.
274
+ if (body.doNotCall !== undefined && body.doNotCall !== null && typeof body.doNotCall !== 'boolean') {
275
+ errors.doNotCall = 'Must be true or false';
276
+ }
246
277
  if (body.status !== undefined) {
247
- if (body.status === 'qualified') {
248
- errors.status = 'Not settable — a lead is qualified by converting it: POST /v1/leads/{id}/convert';
249
- } else if (typeof body.status === 'string' && LEAD_PATCH_STATUSES.includes(body.status)) {
250
- values.status = body.status;
251
- } else {
252
- errors.status = `Must be one of: ${LEAD_PATCH_STATUSES.join(', ')}`;
253
- }
278
+ if (typeof body.status === 'string' && body.status.trim()) values.status = body.status;
279
+ else errors.status = 'Must be one of the organization’s lead status values, or a meaning';
254
280
  }
255
281
  const notes = readOptionalText(body, 'notes', CRM_TEXT_MAX, errors);
256
282
  if (notes !== undefined) values.notes = notes;
@@ -266,7 +292,17 @@ function readLeadInput(body) {
266
292
  var _snap_data;
267
293
  const body = await readJsonBody(request);
268
294
  const parsed = readLeadInput(body);
269
- if ('errors' in parsed) return crmValidationFailed(ctx, 'lead', parsed.errors);
295
+ if ('errors' in parsed) {
296
+ // A status is judged against the org's list, so a body refused for
297
+ // another key still hears about its status in the same answer.
298
+ if (typeof body.status === 'string' && !parsed.errors.status) {
299
+ const judged = resolveCrmLeadStatusWrite(await readOrgLeadStatusPicklist(ctx), body.status, {
300
+ allowed: LEAD_PATCH_STATUSES
301
+ });
302
+ if (judged.ok === false) parsed.errors.status = judged.error;
303
+ }
304
+ return crmValidationFailed(ctx, 'lead', parsed.errors);
305
+ }
270
306
  const site = readLeadSite(ctx, url, body);
271
307
  if ('response' in site) return site.response;
272
308
  const ref = leadsCollection(ctx, site.siteId).doc(leadId);
@@ -294,7 +330,18 @@ function readLeadInput(body) {
294
330
  const ownerUid = await readOwner(ctx, body, errors);
295
331
  if (ownerUid) Object.assign(errors, await memberError(ctx, 'ownerUid', ownerUid));
296
332
  const current = crmLeadStatus(stored);
297
- const next = status != null ? status : current;
333
+ /*
334
+ * THE ORG'S LEAD STATUSES (AGL-3512): a label or a meaning, stored as
335
+ * the meaning and the org's label together. Qualified is a conversion's.
336
+ */ const statuses = await readOrgLeadStatusPicklist(ctx);
337
+ const judgedStatus = status === undefined ? null : resolveCrmLeadStatusWrite(statuses, status, {
338
+ allowed: LEAD_PATCH_STATUSES,
339
+ current: stored
340
+ });
341
+ if ((judgedStatus == null ? void 0 : judgedStatus.ok) === false) {
342
+ errors.status = resolveCrmLeadStatusWrite(statuses, status).ok ? 'Not settable — a lead is qualified by converting it: POST /v1/leads/{id}/convert' : judgedStatus.error;
343
+ }
344
+ const next = (judgedStatus == null ? void 0 : judgedStatus.ok) ? judgedStatus.status : current;
298
345
  /*
299
346
  * A reason travels with the closed state and only with it. Sent beside
300
347
  * `status: "unqualified"` it is required; sent on its own it changes the
@@ -318,7 +365,15 @@ function readLeadInput(body) {
318
365
  if (judged.ok === false) errors.leadSource = judged.error;
319
366
  else profile.leadSource = judged.value;
320
367
  }
368
+ // Salutation, Industry and Rating (AGL-3513), the lead keeping its current value.
369
+ if (namesLeadPicklist(profile)) {
370
+ Object.assign(errors, judgeLeadPicklistPatch(await readLeadPicklists(ctx.firestore, ctx.orgId), profile, {
371
+ current: stored
372
+ }));
373
+ }
321
374
  if (Object.keys(errors).length) return crmValidationFailed(ctx, 'lead', errors);
375
+ // While a first or last name is set, the name is theirs (AGL-3513).
376
+ const composedName = crmLeadComposedName(stored, profile);
322
377
  // The org's own lead fields (AGL-3272), judged against the definitions
323
378
  // whose object is `lead` — a contact field of the same key is a
324
379
  // different field with a possibly different type.
@@ -326,8 +381,13 @@ function readLeadInput(body) {
326
381
  if (custom && 'errors' in custom) return crmValidationFailed(ctx, 'lead', custom.errors);
327
382
  const update = _extends({}, updatePayload(_extends({}, rest, {
328
383
  ownerUid
329
- })), profileUpdate(profile), custom && 'values' in custom ? crmCustomUpdate(custom.values) : {});
330
- if (status !== undefined && status !== current) update.status = status;
384
+ })), profileUpdate(profile), composedName && composedName !== stored['name'] ? {
385
+ name: composedName
386
+ } : {}, custom && 'values' in custom ? crmCustomUpdate(custom.values) : {});
387
+ if (judgedStatus == null ? void 0 : judgedStatus.ok) {
388
+ if (judgedStatus.status !== current) update.status = judgedStatus.status;
389
+ if (judgedStatus.statusLabel !== stored.statusLabel) update.statusLabel = judgedStatus.statusLabel;
390
+ }
331
391
  if (next === 'unqualified') {
332
392
  if (unqualifiedReason !== undefined) update.unqualifiedReason = unqualifiedReason;
333
393
  } else if (stored.unqualifiedReason !== undefined) {
@@ -341,10 +401,14 @@ function readLeadInput(body) {
341
401
  // What the console's Leads list searches and filters by (AGL-3321).
342
402
  await restampCrmListFieldsAt(ref, 'leads');
343
403
  }
344
- return apiJson(leadView(site.siteId, await ref.get()), {
404
+ return apiJson(leadView(site.siteId, await ref.get(), statuses), {
345
405
  headers: ctx.headers
346
406
  });
347
407
  }
408
+ /** The org's Lead status list (AGL-3512) — what a status write is judged against and a view labels by. */ async function readOrgLeadStatusPicklist(ctx) {
409
+ const snapshot = await ctx.firestore.collection('orgs').doc(ctx.orgId).collection(CRM_COLLECTIONS.picklists).doc(CRM_LEAD_STATUS_PICKLIST).get();
410
+ return effectiveCrmLeadStatusPicklist(snapshot.data());
411
+ }
348
412
  // ── Create ──────────────────────────────────────────────────────────────────
349
413
  const LEAD_CREATE_STATUSES = [
350
414
  'new',
@@ -368,13 +432,18 @@ const LEAD_NAME_MAX = 120;
368
432
  if (!email) errors.email = 'Required — an email address';
369
433
  const name = readOptionalText(body, 'name', LEAD_NAME_MAX, errors);
370
434
  const notes = readOptionalText(body, 'notes', CRM_TEXT_MAX, errors);
435
+ // A label or a meaning of New or Working, stored as both (AGL-3512).
436
+ const statuses = await readOrgLeadStatusPicklist(ctx);
371
437
  let status;
372
438
  if (body.status !== undefined && body.status !== null) {
373
- if (typeof body.status === 'string' && LEAD_CREATE_STATUSES.includes(body.status)) {
374
- status = body.status;
375
- } else {
376
- errors.status = `Must be one of: ${LEAD_CREATE_STATUSES.join(', ')}`;
377
- }
439
+ const judged = resolveCrmLeadStatusWrite(statuses, body.status, {
440
+ allowed: LEAD_CREATE_STATUSES
441
+ });
442
+ if (judged.ok === false) errors.status = judged.error;
443
+ else status = {
444
+ status: judged.status,
445
+ statusLabel: judged.statusLabel
446
+ };
378
447
  }
379
448
  if (body.unqualifiedReason !== undefined) {
380
449
  errors.unqualifiedReason = 'Not settable on a create — unqualify with a PATCH';
@@ -385,6 +454,9 @@ const LEAD_NAME_MAX = 120;
385
454
  }
386
455
  const profile = normalizeCrmLeadProfile(profileBody);
387
456
  Object.assign(errors, profile.errors);
457
+ if (body.doNotCall !== undefined && body.doNotCall !== null && typeof body.doNotCall !== 'boolean') {
458
+ errors.doNotCall = 'Must be true or false';
459
+ }
388
460
  const site = readLeadSite(ctx, url, body);
389
461
  if ('response' in site) {
390
462
  if (Object.keys(errors).length) {
@@ -406,6 +478,7 @@ const LEAD_NAME_MAX = 120;
406
478
  if ('replay' in claimed) return claimed.replay;
407
479
  const { claim } = claimed;
408
480
  try {
481
+ var _existing_data, _existing_data1;
409
482
  const hostRef = ctx.firestore.collection('hosts').doc(site.siteId);
410
483
  const leadsRef = leadsCollection(ctx, site.siteId);
411
484
  // Non-null by construction: the normalizer refused every address this
@@ -432,6 +505,17 @@ const LEAD_NAME_MAX = 120;
432
505
  const fallback = crmPicklistDefaultLabel(leadSources);
433
506
  if (fallback) profile.patch.leadSource = fallback;
434
507
  }
508
+ // Salutation, Industry and Rating (AGL-3513): a new lead starts from each list's default.
509
+ const picklistErrors = judgeLeadPicklistPatch(await readLeadPicklists(ctx.firestore, ctx.orgId), profile.patch, {
510
+ current: (_existing_data = existing.data()) != null ? _existing_data : null,
511
+ created
512
+ });
513
+ if (Object.keys(picklistErrors).length) {
514
+ await claim.release();
515
+ return crmValidationFailed(ctx, 'lead', picklistErrors);
516
+ }
517
+ // While a first or last name is set, the name is theirs (AGL-3513).
518
+ const composedName = crmLeadComposedName((_existing_data1 = existing.data()) != null ? _existing_data1 : null, profile.patch);
435
519
  if (created) {
436
520
  // What the SITE may see (AGL-3275), matching `addHostLead`'s own count:
437
521
  // an unscoped count would charge one site for a sibling's leads.
@@ -450,8 +534,8 @@ const LEAD_NAME_MAX = 120;
450
534
  hostId: site.siteId,
451
535
  lead: _extends({
452
536
  email: email
453
- }, name ? {
454
- name
537
+ }, composedName || name ? {
538
+ name: composedName || name
455
539
  } : {}, {
456
540
  source: LEAD_API_SOURCE
457
541
  })
@@ -464,8 +548,11 @@ const LEAD_NAME_MAX = 120;
464
548
  headers: ctx.headers
465
549
  });
466
550
  }
467
- const working = _extends({}, profileUpdate(profile.patch), status ? {
468
- status
551
+ const working = _extends({}, profileUpdate(profile.patch), composedName ? {
552
+ name: composedName
553
+ } : {}, status ? {
554
+ status: status.status,
555
+ statusLabel: status.statusLabel
469
556
  } : {}, ownerUid ? {
470
557
  ownerUid
471
558
  } : {}, notes ? {
@@ -483,7 +570,7 @@ const LEAD_NAME_MAX = 120;
483
570
  // What the console's Leads list searches and filters by (AGL-3321).
484
571
  await restampCrmListFieldsAt(ref, 'leads');
485
572
  }
486
- const view = leadView(site.siteId, await ref.get());
573
+ const view = leadView(site.siteId, await ref.get(), statuses);
487
574
  await claim.record(created ? 201 : 200, view);
488
575
  return apiJson(view, {
489
576
  status: created ? 201 : 200,
@@ -565,7 +652,8 @@ const isPlainObject = (value)=>Boolean(value) && typeof value === 'object' && !A
565
652
  'title',
566
653
  'amountCents',
567
654
  'currency',
568
- 'stageId'
655
+ 'stageId',
656
+ 'type'
569
657
  ].includes(key)) {
570
658
  errors[`deal.${key}`] = 'Not writable on a deal opened here';
571
659
  }
@@ -594,13 +682,22 @@ const isPlainObject = (value)=>Boolean(value) && typeof value === 'object' && !A
594
682
  stageId = deal.stageId.trim().slice(0, CRM_ID_MAX);
595
683
  }
596
684
  }
597
- if (title) plan.deal = _extends({
598
- title,
599
- amountCents,
600
- currency
601
- }, stageId ? {
602
- stageId
603
- } : {});
685
+ let type;
686
+ if (deal.type !== undefined && deal.type !== null) {
687
+ if (typeof deal.type !== 'string') errors['deal.type'] = 'Must be a string';
688
+ else type = deal.type.trim().slice(0, CRM_TITLE_MAX) || undefined;
689
+ }
690
+ if (title) {
691
+ plan.deal = _extends({
692
+ title,
693
+ amountCents,
694
+ currency
695
+ }, stageId ? {
696
+ stageId
697
+ } : {}, type ? {
698
+ type
699
+ } : {});
700
+ }
604
701
  }
605
702
  }
606
703
  return Object.keys(errors).length ? {
@@ -610,6 +707,7 @@ const isPlainObject = (value)=>Boolean(value) && typeof value === 'object' && !A
610
707
  };
611
708
  }
612
709
  /** `POST /v1/leads/{id}/convert`. */ async function convertLead(request, ctx, url, leadId) {
710
+ var _parsed_plan_deal;
613
711
  const body = await readJsonBody(request);
614
712
  const parsed = readConvertInput(body);
615
713
  if ('errors' in parsed) return crmValidationFailed(ctx, 'conversion', parsed.errors);
@@ -618,6 +716,13 @@ const isPlainObject = (value)=>Boolean(value) && typeof value === 'object' && !A
618
716
  const errors = {};
619
717
  const ownerUid = await readOwner(ctx, body, errors);
620
718
  if (ownerUid) Object.assign(errors, await memberError(ctx, 'ownerUid', ownerUid));
719
+ // The deal's Type against the org's list (AGL-3516), the deal resource's rule.
720
+ if ((_parsed_plan_deal = parsed.plan.deal) == null ? void 0 : _parsed_plan_deal.type) {
721
+ var _judged_value;
722
+ const judged = judgeCrmPicklistValue('opportunityType', await readCrmPicklist(ctx.firestore, ctx.orgId, 'opportunityType'), parsed.plan.deal.type);
723
+ if (judged.ok === false) errors['deal.type'] = judged.error;
724
+ else parsed.plan.deal.type = (_judged_value = judged.value) != null ? _judged_value : undefined;
725
+ }
621
726
  if (Object.keys(errors).length) return crmValidationFailed(ctx, 'conversion', errors);
622
727
  const ref = leadsCollection(ctx, site.siteId).doc(leadId);
623
728
  if (!(await ref.get()).exists) {
@@ -663,7 +768,7 @@ const isPlainObject = (value)=>Boolean(value) && typeof value === 'object' && !A
663
768
  companyId: (_result_companyId = result.companyId) != null ? _result_companyId : null,
664
769
  dealId: (_result_dealId = result.dealId) != null ? _result_dealId : null,
665
770
  alreadyConverted: result.alreadyConverted,
666
- lead: leadView(site.siteId, await ref.get())
771
+ lead: leadView(site.siteId, await ref.get(), await readOrgLeadStatusPicklist(ctx))
667
772
  };
668
773
  await claim.record(200, receipt);
669
774
  return apiJson(receipt, {
@@ -762,7 +867,8 @@ function decodeLeadCursor(raw) {
762
867
  if (ownerUid && data.ownerUid !== ownerUid) return false;
763
868
  return true;
764
869
  });
765
- return listResponse(page.map((doc)=>leadView(site.siteId, doc)), nextCursor, ctx.headers);
870
+ const statuses = await readOrgLeadStatusPicklist(ctx);
871
+ return listResponse(page.map((doc)=>leadView(site.siteId, doc, statuses)), nextCursor, ctx.headers);
766
872
  }
767
873
  // ── Dispatch ────────────────────────────────────────────────────────────────
768
874
  export async function handleLeads(request, ctx, segments, url) {
@@ -814,7 +920,7 @@ export async function handleLeads(request, ctx, segments, url) {
814
920
  headers: ctx.headers
815
921
  });
816
922
  }
817
- return apiJson(leadView(site.siteId, snap), {
923
+ return apiJson(leadView(site.siteId, snap, await readOrgLeadStatusPicklist(ctx)), {
818
924
  headers: ctx.headers
819
925
  });
820
926
  }