@aglyn/plugins-crm 1.0.0-beta.221 → 1.0.0-beta.222
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.
- package/README.md +2 -1
- package/package.json +13 -13
- package/src/lib/components/activity-list.js +12 -5
- package/src/lib/components/activity-list.js.map +1 -1
- package/src/lib/components/companies-bulk-bar.d.ts +1 -4
- package/src/lib/components/companies-bulk-bar.js +7 -20
- package/src/lib/components/companies-bulk-bar.js.map +1 -1
- package/src/lib/components/companies-section.d.ts +3 -3
- package/src/lib/components/companies-section.js +149 -46
- package/src/lib/components/companies-section.js.map +1 -1
- package/src/lib/components/company-edit-drawer.js +281 -20
- package/src/lib/components/company-edit-drawer.js.map +1 -1
- package/src/lib/components/company-properties-card.js +99 -8
- package/src/lib/components/company-properties-card.js.map +1 -1
- package/src/lib/components/contact-detail-page.js +3 -1
- package/src/lib/components/contact-detail-page.js.map +1 -1
- package/src/lib/components/contact-merge-dialog.js +33 -10
- package/src/lib/components/contact-merge-dialog.js.map +1 -1
- package/src/lib/components/contact-properties-card.d.ts +0 -69
- package/src/lib/components/contact-properties-card.js +350 -60
- package/src/lib/components/contact-properties-card.js.map +1 -1
- package/src/lib/components/contact-reports-to-field.d.ts +46 -0
- package/src/lib/components/contact-reports-to-field.js +67 -0
- package/src/lib/components/contact-reports-to-field.js.map +1 -0
- package/src/lib/components/contacts-bulk-bar.d.ts +1 -8
- package/src/lib/components/contacts-bulk-bar.js +7 -19
- package/src/lib/components/contacts-bulk-bar.js.map +1 -1
- package/src/lib/components/contacts-section.js +46 -33
- package/src/lib/components/contacts-section.js.map +1 -1
- package/src/lib/components/crm-call-actions.d.ts +10 -0
- package/src/lib/components/crm-call-actions.js +26 -9
- package/src/lib/components/crm-call-actions.js.map +1 -1
- package/src/lib/components/crm-record-picker.d.ts +15 -0
- package/src/lib/components/crm-record-picker.js +16 -10
- package/src/lib/components/crm-record-picker.js.map +1 -1
- package/src/lib/components/crm-transfer-buttons.d.ts +54 -0
- package/src/lib/components/crm-transfer-buttons.js +167 -0
- package/src/lib/components/crm-transfer-buttons.js.map +1 -0
- package/src/lib/components/deal-contact-roles-card.d.ts +46 -0
- package/src/lib/components/deal-contact-roles-card.js +368 -0
- package/src/lib/components/deal-contact-roles-card.js.map +1 -0
- package/src/lib/components/deal-detail-page.d.ts +3 -2
- package/src/lib/components/deal-detail-page.js +25 -6
- package/src/lib/components/deal-detail-page.js.map +1 -1
- package/src/lib/components/deal-edit-drawer.d.ts +10 -0
- package/src/lib/components/deal-edit-drawer.js +219 -10
- package/src/lib/components/deal-edit-drawer.js.map +1 -1
- package/src/lib/components/deal-properties-card.d.ts +7 -0
- package/src/lib/components/deal-properties-card.js +34 -3
- package/src/lib/components/deal-properties-card.js.map +1 -1
- package/src/lib/components/deal-stage-card.d.ts +4 -0
- package/src/lib/components/deal-stage-card.js +10 -2
- package/src/lib/components/deal-stage-card.js.map +1 -1
- package/src/lib/components/deals-bulk-bar.d.ts +0 -3
- package/src/lib/components/deals-bulk-bar.js +7 -20
- package/src/lib/components/deals-bulk-bar.js.map +1 -1
- package/src/lib/components/deals-section.d.ts +3 -3
- package/src/lib/components/deals-section.js +123 -63
- package/src/lib/components/deals-section.js.map +1 -1
- package/src/lib/components/fields-section.js +31 -17
- package/src/lib/components/fields-section.js.map +1 -1
- package/src/lib/components/lead-convert-dialog.d.ts +4 -0
- package/src/lib/components/lead-convert-dialog.js +23 -1
- package/src/lib/components/lead-convert-dialog.js.map +1 -1
- package/src/lib/components/lead-detail-page.js +8 -2
- package/src/lib/components/lead-detail-page.js.map +1 -1
- package/src/lib/components/lead-profile-fields.d.ts +71 -0
- package/src/lib/components/lead-profile-fields.js +386 -0
- package/src/lib/components/lead-profile-fields.js.map +1 -0
- package/src/lib/components/lead-properties-card.d.ts +2 -1
- package/src/lib/components/lead-properties-card.js +85 -176
- package/src/lib/components/lead-properties-card.js.map +1 -1
- package/src/lib/components/lead-source-select.d.ts +4 -23
- package/src/lib/components/lead-source-select.js +9 -73
- package/src/lib/components/lead-source-select.js.map +1 -1
- package/src/lib/components/lead-status-chip.d.ts +9 -3
- package/src/lib/components/lead-status-chip.js +8 -4
- package/src/lib/components/lead-status-chip.js.map +1 -1
- package/src/lib/components/lead-status-options.d.ts +20 -0
- package/src/lib/components/lead-status-options.js +51 -0
- package/src/lib/components/lead-status-options.js.map +1 -0
- package/src/lib/components/lead-unqualify-dialog.d.ts +5 -0
- package/src/lib/components/lead-unqualify-dialog.js +50 -18
- package/src/lib/components/lead-unqualify-dialog.js.map +1 -1
- package/src/lib/components/leads-bulk-bar.d.ts +0 -3
- package/src/lib/components/leads-bulk-bar.js +29 -29
- package/src/lib/components/leads-bulk-bar.js.map +1 -1
- package/src/lib/components/leads-section.js +120 -68
- package/src/lib/components/leads-section.js.map +1 -1
- package/src/lib/components/linked-deals-card.d.ts +4 -0
- package/src/lib/components/linked-deals-card.js +47 -3
- package/src/lib/components/linked-deals-card.js.map +1 -1
- package/src/lib/components/log-activity-dialog.js +43 -3
- package/src/lib/components/log-activity-dialog.js.map +1 -1
- package/src/lib/components/new-contact-drawer.d.ts +8 -0
- package/src/lib/components/new-contact-drawer.js +108 -6
- package/src/lib/components/new-contact-drawer.js.map +1 -1
- package/src/lib/components/new-lead-drawer.d.ts +9 -2
- package/src/lib/components/new-lead-drawer.js +88 -121
- package/src/lib/components/new-lead-drawer.js.map +1 -1
- package/src/lib/components/picklist-select.d.ts +36 -0
- package/src/lib/components/picklist-select.js +114 -0
- package/src/lib/components/picklist-select.js.map +1 -0
- package/src/lib/components/picklist-values-card.d.ts +34 -0
- package/src/lib/components/{lead-source-values-card.js → picklist-values-card.js} +241 -58
- package/src/lib/components/picklist-values-card.js.map +1 -0
- package/src/lib/components/pipeline-stages-dialog.d.ts +7 -0
- package/src/lib/components/pipeline-stages-dialog.js +26 -4
- package/src/lib/components/pipeline-stages-dialog.js.map +1 -1
- package/src/lib/components/pipelines-dialog.js +15 -6
- package/src/lib/components/pipelines-dialog.js.map +1 -1
- package/src/lib/components/recent-activity-feed.js +20 -5
- package/src/lib/components/recent-activity-feed.js.map +1 -1
- package/src/lib/components/recipes-card.js +4 -2
- package/src/lib/components/recipes-card.js.map +1 -1
- package/src/lib/components/record-tasks-card.js +15 -8
- package/src/lib/components/record-tasks-card.js.map +1 -1
- package/src/lib/components/reports/forecast-card.d.ts +6 -0
- package/src/lib/components/reports/forecast-card.js +101 -3
- package/src/lib/components/reports/forecast-card.js.map +1 -1
- package/src/lib/components/reports/lead-funnel-card.d.ts +12 -0
- package/src/lib/components/reports/lead-funnel-card.js +9 -5
- package/src/lib/components/reports/lead-funnel-card.js.map +1 -1
- package/src/lib/components/reports/lead-source-card.d.ts +23 -0
- package/src/lib/components/reports/lead-source-card.js +318 -0
- package/src/lib/components/reports/lead-source-card.js.map +1 -0
- package/src/lib/components/reports/report-export.js +1 -1
- package/src/lib/components/reports/report-export.js.map +1 -1
- package/src/lib/components/reports-section.js +8 -0
- package/src/lib/components/reports-section.js.map +1 -1
- package/src/lib/components/sharing-rule-drawer.d.ts +5 -0
- package/src/lib/components/sharing-rule-drawer.js +108 -19
- package/src/lib/components/sharing-rule-drawer.js.map +1 -1
- package/src/lib/components/sharing-rules-card.js +11 -3
- package/src/lib/components/sharing-rules-card.js.map +1 -1
- package/src/lib/components/task-cells.d.ts +9 -1
- package/src/lib/components/task-cells.js +9 -4
- package/src/lib/components/task-cells.js.map +1 -1
- package/src/lib/components/task-edit-drawer.js +111 -43
- package/src/lib/components/task-edit-drawer.js.map +1 -1
- package/src/lib/components/tasks-bulk-bar.d.ts +0 -3
- package/src/lib/components/tasks-bulk-bar.js +7 -20
- package/src/lib/components/tasks-bulk-bar.js.map +1 -1
- package/src/lib/components/tasks-calendar.d.ts +3 -0
- package/src/lib/components/tasks-calendar.js +8 -1
- package/src/lib/components/tasks-calendar.js.map +1 -1
- package/src/lib/components/tasks-section.d.ts +3 -3
- package/src/lib/components/tasks-section.js +58 -43
- package/src/lib/components/tasks-section.js.map +1 -1
- package/src/lib/constants/api-routes.d.ts +2 -9
- package/src/lib/constants/api-routes.js +1 -7
- package/src/lib/constants/api-routes.js.map +1 -1
- package/src/lib/constants/bundle-common.d.ts +6 -0
- package/src/lib/constants/bundle-common.js +11 -0
- package/src/lib/constants/bundle-common.js.map +1 -1
- package/src/lib/constants/company-filters.d.ts +14 -0
- package/src/lib/constants/company-filters.js +51 -1
- package/src/lib/constants/company-filters.js.map +1 -1
- package/src/lib/constants/contact-filters.d.ts +2 -0
- package/src/lib/constants/contact-filters.js +18 -1
- package/src/lib/constants/contact-filters.js.map +1 -1
- package/src/lib/constants/deal-filters.d.ts +22 -1
- package/src/lib/constants/deal-filters.js +67 -4
- package/src/lib/constants/deal-filters.js.map +1 -1
- package/src/lib/declarations.console-server.d.ts +3 -0
- package/src/lib/declarations.console-server.js +35 -0
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.d.ts +26 -0
- package/src/lib/declarations.js +35 -0
- package/src/lib/declarations.js.map +1 -0
- package/src/lib/declarations.server.d.ts +11 -0
- package/src/lib/declarations.server.js +92 -1
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/hooks/use-company-picklists.d.ts +15 -0
- package/src/lib/hooks/use-company-picklists.js +55 -0
- package/src/lib/hooks/use-company-picklists.js.map +1 -0
- package/src/lib/hooks/use-crm-picklist.d.ts +25 -0
- package/src/lib/hooks/use-crm-picklist.js +53 -0
- package/src/lib/hooks/use-crm-picklist.js.map +1 -0
- package/src/lib/hooks/use-crm-record-names.d.ts +16 -0
- package/src/lib/hooks/use-crm-record-names.js +45 -19
- package/src/lib/hooks/use-crm-record-names.js.map +1 -1
- package/src/lib/hooks/use-crm-task-picklists.d.ts +11 -0
- package/src/lib/hooks/use-crm-task-picklists.js +45 -0
- package/src/lib/hooks/use-crm-task-picklists.js.map +1 -0
- package/src/lib/hooks/use-deals.d.ts +14 -0
- package/src/lib/hooks/use-deals.js +29 -0
- package/src/lib/hooks/use-deals.js.map +1 -1
- package/src/lib/hooks/use-lead-picklists.d.ts +14 -0
- package/src/lib/hooks/use-lead-picklists.js +46 -0
- package/src/lib/hooks/use-lead-picklists.js.map +1 -0
- package/src/lib/hooks/use-lead-source-picklist.d.ts +5 -19
- package/src/lib/hooks/use-lead-source-picklist.js +12 -22
- package/src/lib/hooks/use-lead-source-picklist.js.map +1 -1
- package/src/lib/hooks/use-lead-status-picklist.d.ts +9 -0
- package/src/lib/hooks/use-lead-status-picklist.js +40 -0
- package/src/lib/hooks/use-lead-status-picklist.js.map +1 -0
- package/src/lib/model/companies.d.ts +32 -3
- package/src/lib/model/companies.js +133 -16
- package/src/lib/model/companies.js.map +1 -1
- package/src/lib/model/contact-merge.d.ts +27 -3
- package/src/lib/model/contact-merge.js +81 -7
- package/src/lib/model/contact-merge.js.map +1 -1
- package/src/lib/model/contact-record.d.ts +17 -0
- package/src/lib/model/contact-record.js +15 -1
- package/src/lib/model/contact-record.js.map +1 -1
- package/src/lib/model/contact-update.d.ts +31 -2
- package/src/lib/model/contact-update.js +14 -0
- package/src/lib/model/contact-update.js.map +1 -1
- package/src/lib/model/crm-list-query.d.ts +5 -0
- package/src/lib/model/crm-list-query.js +8 -0
- package/src/lib/model/crm-list-query.js.map +1 -1
- package/src/lib/model/crm-recipes.d.ts +40 -0
- package/src/lib/model/crm-recipes.js +244 -0
- package/src/lib/model/crm-recipes.js.map +1 -0
- package/src/lib/model/crm-record-counts.d.ts +36 -0
- package/src/lib/model/crm-record-counts.js +54 -0
- package/src/lib/model/crm-record-counts.js.map +1 -0
- package/src/lib/model/crm-record-lists.d.ts +23 -0
- package/src/lib/model/crm-record-lists.js +161 -0
- package/src/lib/model/crm-record-lists.js.map +1 -0
- package/src/lib/model/crm-reports.d.ts +73 -3
- package/src/lib/model/crm-reports.js +120 -1
- package/src/lib/model/crm-reports.js.map +1 -1
- package/src/lib/model/crm-sharing.d.ts +21 -3
- package/src/lib/model/crm-sharing.js +27 -6
- package/src/lib/model/crm-sharing.js.map +1 -1
- package/src/lib/model/deal-board-model.d.ts +8 -2
- package/src/lib/model/deal-board-model.js +15 -2
- package/src/lib/model/deal-board-model.js.map +1 -1
- package/src/lib/model/deal-contact-roles.d.ts +45 -0
- package/src/lib/model/deal-contact-roles.js +73 -0
- package/src/lib/model/deal-contact-roles.js.map +1 -0
- package/src/lib/model/deal-form-model.d.ts +56 -0
- package/src/lib/model/deal-form-model.js +79 -7
- package/src/lib/model/deal-form-model.js.map +1 -1
- package/src/lib/model/download-text-file.d.ts +23 -0
- package/src/lib/model/download-text-file.js +34 -0
- package/src/lib/model/download-text-file.js.map +1 -0
- package/src/lib/model/lead-filters.d.ts +36 -2
- package/src/lib/model/lead-filters.js +123 -2
- package/src/lib/model/lead-filters.js.map +1 -1
- package/src/lib/model/lead-source-direction.d.ts +38 -0
- package/src/lib/model/lead-source-direction.js +52 -0
- package/src/lib/model/lead-source-direction.js.map +1 -0
- package/src/lib/model/picklist-values.d.ts +119 -0
- package/src/lib/model/picklist-values.js +256 -0
- package/src/lib/model/picklist-values.js.map +1 -0
- package/src/lib/model/record-facts-disclosed.d.ts +81 -0
- package/src/lib/model/record-facts-disclosed.js +281 -0
- package/src/lib/model/record-facts-disclosed.js.map +1 -0
- package/src/lib/model/record-facts.d.ts +215 -34
- package/src/lib/model/record-facts.js +307 -128
- package/src/lib/model/record-facts.js.map +1 -1
- package/src/lib/model/task-picklists.d.ts +52 -0
- package/src/lib/model/task-picklists.js +83 -0
- package/src/lib/model/task-picklists.js.map +1 -0
- package/src/lib/model/task-routes.d.ts +13 -0
- package/src/lib/model/task-routes.js +23 -4
- package/src/lib/model/task-routes.js.map +1 -1
- package/src/lib/plan-entitlements.js +6 -4
- package/src/lib/plan-entitlements.js.map +1 -1
- package/src/lib/plugin.js +17 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/api-v1/contacts.js +220 -14
- package/src/lib/server/api-v1/contacts.js.map +1 -1
- package/src/lib/server/api-v1/crm-activities.js +14 -1
- package/src/lib/server/api-v1/crm-activities.js.map +1 -1
- package/src/lib/server/api-v1/crm-companies.js +123 -14
- package/src/lib/server/api-v1/crm-companies.js.map +1 -1
- package/src/lib/server/api-v1/crm-deals.js +291 -26
- package/src/lib/server/api-v1/crm-deals.js.map +1 -1
- package/src/lib/server/api-v1/crm-leads.js +144 -38
- package/src/lib/server/api-v1/crm-leads.js.map +1 -1
- package/src/lib/server/api-v1/crm-pipelines.d.ts +6 -0
- package/src/lib/server/api-v1/crm-pipelines.js +8 -2
- package/src/lib/server/api-v1/crm-pipelines.js.map +1 -1
- package/src/lib/server/api-v1/crm-tasks.js +75 -33
- package/src/lib/server/api-v1/crm-tasks.js.map +1 -1
- package/src/lib/server/api-v1/openapi.d.ts +0 -11
- package/src/lib/server/api-v1/openapi.js +171 -16
- package/src/lib/server/api-v1/openapi.js.map +1 -1
- package/src/lib/server/assign-contact-owner.d.ts +162 -0
- package/src/lib/server/assign-contact-owner.js +340 -0
- package/src/lib/server/assign-contact-owner.js.map +1 -0
- package/src/lib/server/associate-company-by-domain.d.ts +70 -0
- package/src/lib/server/associate-company-by-domain.js +153 -0
- package/src/lib/server/associate-company-by-domain.js.map +1 -0
- package/src/lib/server/automation-steps.d.ts +139 -0
- package/src/lib/server/automation-steps.js +472 -0
- package/src/lib/server/automation-steps.js.map +1 -0
- package/src/lib/server/capture-contact.js +65 -21
- package/src/lib/server/capture-contact.js.map +1 -1
- package/src/lib/server/capture-host-contact.d.ts +104 -0
- package/src/lib/server/capture-host-contact.js +151 -0
- package/src/lib/server/capture-host-contact.js.map +1 -0
- package/src/lib/server/company-children.d.ts +25 -0
- package/src/lib/server/company-children.js +42 -0
- package/src/lib/server/company-children.js.map +1 -0
- package/src/lib/server/company-delete.d.ts +18 -0
- package/src/lib/server/company-delete.js +44 -21
- package/src/lib/server/company-delete.js.map +1 -1
- package/src/lib/server/contact-email-history.js +21 -19
- package/src/lib/server/contact-email-history.js.map +1 -1
- package/src/lib/server/contact-remove.js +27 -2
- package/src/lib/server/contact-remove.js.map +1 -1
- package/src/lib/server/contact-reports-to.d.ts +61 -0
- package/src/lib/server/contact-reports-to.js +114 -0
- package/src/lib/server/contact-reports-to.js.map +1 -0
- package/src/lib/server/contact-update.d.ts +42 -1
- package/src/lib/server/contact-update.js +204 -23
- package/src/lib/server/contact-update.js.map +1 -1
- package/src/lib/server/convert-host-lead.d.ts +46 -1
- package/src/lib/server/convert-host-lead.js +173 -15
- package/src/lib/server/convert-host-lead.js.map +1 -1
- package/src/lib/server/convert-open-lead.js +12 -5
- package/src/lib/server/convert-open-lead.js.map +1 -1
- package/src/lib/server/crm-record-indexes.d.ts +45 -0
- package/src/lib/server/crm-record-indexes.js +78 -0
- package/src/lib/server/crm-record-indexes.js.map +1 -0
- package/src/lib/server/crm-sharing.d.ts +9 -1
- package/src/lib/server/crm-sharing.js +23 -3
- package/src/lib/server/crm-sharing.js.map +1 -1
- package/src/lib/server/deal-contact-roles.d.ts +27 -0
- package/src/lib/server/deal-contact-roles.js +89 -0
- package/src/lib/server/deal-contact-roles.js.map +1 -0
- package/src/lib/server/lead-convert.d.ts +5 -0
- package/src/lib/server/lead-convert.js +19 -3
- package/src/lib/server/lead-convert.js.map +1 -1
- package/src/lib/server/lead-create.d.ts +17 -2
- package/src/lib/server/lead-create.js +46 -14
- package/src/lib/server/lead-create.js.map +1 -1
- package/src/lib/server/lead-nurturing.d.ts +6 -0
- package/src/lib/server/lead-nurturing.js +57 -20
- package/src/lib/server/lead-nurturing.js.map +1 -1
- package/src/lib/server/lead-picklists.d.ts +35 -0
- package/src/lib/server/lead-picklists.js +52 -0
- package/src/lib/server/lead-picklists.js.map +1 -0
- package/src/lib/server/lead-source-picklist.d.ts +1 -13
- package/src/lib/server/lead-source-picklist.js +6 -33
- package/src/lib/server/lead-source-picklist.js.map +1 -1
- package/src/lib/server/merge-contacts.js +22 -4
- package/src/lib/server/merge-contacts.js.map +1 -1
- package/src/lib/server/person-eraser.d.ts +53 -0
- package/src/lib/server/person-eraser.js +149 -0
- package/src/lib/server/person-eraser.js.map +1 -0
- package/src/lib/server/person-records.d.ts +69 -0
- package/src/lib/server/person-records.js +317 -0
- package/src/lib/server/person-records.js.map +1 -0
- package/src/lib/server/person-refund.d.ts +97 -0
- package/src/lib/server/person-refund.js +221 -0
- package/src/lib/server/person-refund.js.map +1 -0
- package/src/lib/server/picklist-values.d.ts +21 -0
- package/src/lib/server/picklist-values.js +308 -0
- package/src/lib/server/picklist-values.js.map +1 -0
- package/src/lib/server/read-picklist.d.ts +44 -0
- package/src/lib/server/read-picklist.js +65 -0
- package/src/lib/server/read-picklist.js.map +1 -0
- package/src/lib/server/recipe-routes.js +15 -7
- package/src/lib/server/recipe-routes.js.map +1 -1
- package/src/lib/server/record-email-state.js +7 -1
- package/src/lib/server/record-email-state.js.map +1 -1
- package/src/lib/server/record-facts.d.ts +3 -0
- package/src/lib/server/record-facts.js +233 -31
- package/src/lib/server/record-facts.js.map +1 -1
- package/src/lib/server/record-origin.d.ts +27 -0
- package/src/lib/server/record-origin.js +104 -0
- package/src/lib/server/record-origin.js.map +1 -0
- package/src/lib/server/record-timeline.js +15 -2
- package/src/lib/server/record-timeline.js.map +1 -1
- package/src/lib/server/suite-gate.js +4 -3
- package/src/lib/server/suite-gate.js.map +1 -1
- package/src/lib/server/task-routes.js +30 -16
- package/src/lib/server/task-routes.js.map +1 -1
- package/src/lib/server-deal-stage.d.ts +5 -1
- package/src/lib/server-deal-stage.js +10 -5
- package/src/lib/server-deal-stage.js.map +1 -1
- package/src/lib/server.d.ts +8 -3
- package/src/lib/server.js +47 -43
- package/src/lib/server.js.map +1 -1
- package/src/lib/testing/memory-firestore.d.ts +55 -0
- package/src/lib/testing/memory-firestore.js +335 -0
- package/src/lib/testing/memory-firestore.js.map +1 -0
- package/src/lib/testing/stand-in-email-send-index.d.ts +25 -0
- package/src/lib/testing/stand-in-email-send-index.js +49 -0
- package/src/lib/testing/stand-in-email-send-index.js.map +1 -0
- package/src/lib/transfer/activities.d.ts +30 -0
- package/src/lib/transfer/activities.js +132 -0
- package/src/lib/transfer/activities.js.map +1 -0
- package/src/lib/transfer/aliases.d.ts +22 -0
- package/src/lib/transfer/aliases.js +1342 -0
- package/src/lib/transfer/aliases.js.map +1 -0
- package/src/lib/transfer/common.d.ts +222 -0
- package/src/lib/transfer/common.js +832 -0
- package/src/lib/transfer/common.js.map +1 -0
- package/src/lib/transfer/companies.d.ts +43 -0
- package/src/lib/transfer/companies.js +549 -0
- package/src/lib/transfer/companies.js.map +1 -0
- package/src/lib/transfer/contacts.d.ts +31 -0
- package/src/lib/transfer/contacts.js +727 -0
- package/src/lib/transfer/contacts.js.map +1 -0
- package/src/lib/transfer/deals.d.ts +66 -0
- package/src/lib/transfer/deals.js +698 -0
- package/src/lib/transfer/deals.js.map +1 -0
- package/src/lib/transfer/email-templates-package.d.ts +40 -0
- package/src/lib/transfer/email-templates-package.js +76 -0
- package/src/lib/transfer/email-templates-package.js.map +1 -0
- package/src/lib/transfer/email-templates-package.server.d.ts +32 -0
- package/src/lib/transfer/email-templates-package.server.js +176 -0
- package/src/lib/transfer/email-templates-package.server.js.map +1 -0
- package/src/lib/transfer/fields.d.ts +102 -0
- package/src/lib/transfer/fields.js +1755 -0
- package/src/lib/transfer/fields.js.map +1 -0
- package/src/lib/transfer/leads.d.ts +30 -0
- package/src/lib/transfer/leads.js +582 -0
- package/src/lib/transfer/leads.js.map +1 -0
- package/src/lib/transfer/pipelines.d.ts +21 -0
- package/src/lib/transfer/pipelines.js +172 -0
- package/src/lib/transfer/pipelines.js.map +1 -0
- package/src/lib/transfer/register.d.ts +47 -0
- package/src/lib/transfer/register.js +277 -0
- package/src/lib/transfer/register.js.map +1 -0
- package/src/lib/transfer/tasks.d.ts +30 -0
- package/src/lib/transfer/tasks.js +418 -0
- package/src/lib/transfer/tasks.js.map +1 -0
- package/src/lib/transfer/ui.d.ts +20 -0
- package/src/lib/transfer/ui.js +42 -0
- package/src/lib/transfer/ui.js.map +1 -0
- package/src/lib/components/company-import-drawer.d.ts +0 -42
- package/src/lib/components/company-import-drawer.js +0 -99
- package/src/lib/components/company-import-drawer.js.map +0 -1
- package/src/lib/components/contact-import-drawer.d.ts +0 -46
- package/src/lib/components/contact-import-drawer.js +0 -149
- package/src/lib/components/contact-import-drawer.js.map +0 -1
- package/src/lib/components/crm-export-all-button.d.ts +0 -39
- package/src/lib/components/crm-export-all-button.js +0 -98
- package/src/lib/components/crm-export-all-button.js.map +0 -1
- package/src/lib/components/csv-import-drawer.d.ts +0 -139
- package/src/lib/components/csv-import-drawer.js +0 -757
- package/src/lib/components/csv-import-drawer.js.map +0 -1
- package/src/lib/components/deal-import-drawer.d.ts +0 -24
- package/src/lib/components/deal-import-drawer.js +0 -83
- package/src/lib/components/deal-import-drawer.js.map +0 -1
- package/src/lib/components/lead-import-drawer.d.ts +0 -27
- package/src/lib/components/lead-import-drawer.js +0 -118
- package/src/lib/components/lead-import-drawer.js.map +0 -1
- package/src/lib/components/lead-source-values-card.d.ts +0 -27
- package/src/lib/components/lead-source-values-card.js.map +0 -1
- package/src/lib/components/task-import-drawer.d.ts +0 -24
- package/src/lib/components/task-import-drawer.js +0 -82
- package/src/lib/components/task-import-drawer.js.map +0 -1
- package/src/lib/model/companies-csv.d.ts +0 -36
- package/src/lib/model/companies-csv.js +0 -38
- package/src/lib/model/companies-csv.js.map +0 -1
- package/src/lib/model/contacts-csv.d.ts +0 -54
- package/src/lib/model/contacts-csv.js +0 -67
- package/src/lib/model/contacts-csv.js.map +0 -1
- package/src/lib/model/crm-company-import.d.ts +0 -154
- package/src/lib/model/crm-company-import.js +0 -331
- package/src/lib/model/crm-company-import.js.map +0 -1
- package/src/lib/model/crm-csv.d.ts +0 -239
- package/src/lib/model/crm-csv.js +0 -467
- package/src/lib/model/crm-csv.js.map +0 -1
- package/src/lib/model/crm-deal-import.d.ts +0 -112
- package/src/lib/model/crm-deal-import.js +0 -263
- package/src/lib/model/crm-deal-import.js.map +0 -1
- package/src/lib/model/crm-import.d.ts +0 -250
- package/src/lib/model/crm-import.js +0 -467
- package/src/lib/model/crm-import.js.map +0 -1
- package/src/lib/model/crm-lead-import.d.ts +0 -138
- package/src/lib/model/crm-lead-import.js +0 -446
- package/src/lib/model/crm-lead-import.js.map +0 -1
- package/src/lib/model/crm-task-import.d.ts +0 -94
- package/src/lib/model/crm-task-import.js +0 -275
- package/src/lib/model/crm-task-import.js.map +0 -1
- package/src/lib/model/deals-csv.d.ts +0 -32
- package/src/lib/model/deals-csv.js +0 -36
- package/src/lib/model/deals-csv.js.map +0 -1
- package/src/lib/model/import-column-shapes.d.ts +0 -36
- package/src/lib/model/import-column-shapes.js +0 -76
- package/src/lib/model/import-column-shapes.js.map +0 -1
- package/src/lib/model/lead-source-values.d.ts +0 -82
- package/src/lib/model/lead-source-values.js +0 -149
- package/src/lib/model/lead-source-values.js.map +0 -1
- package/src/lib/model/leads-csv.d.ts +0 -40
- package/src/lib/model/leads-csv.js +0 -40
- package/src/lib/model/leads-csv.js.map +0 -1
- package/src/lib/model/tasks-csv.d.ts +0 -28
- package/src/lib/model/tasks-csv.js +0 -28
- package/src/lib/model/tasks-csv.js.map +0 -1
- package/src/lib/server/companies-import.d.ts +0 -57
- package/src/lib/server/companies-import.js +0 -242
- package/src/lib/server/companies-import.js.map +0 -1
- package/src/lib/server/contacts-import.d.ts +0 -109
- package/src/lib/server/contacts-import.js +0 -393
- package/src/lib/server/contacts-import.js.map +0 -1
- package/src/lib/server/deals-import.d.ts +0 -76
- package/src/lib/server/deals-import.js +0 -248
- package/src/lib/server/deals-import.js.map +0 -1
- package/src/lib/server/export-route.d.ts +0 -60
- package/src/lib/server/export-route.js +0 -447
- package/src/lib/server/export-route.js.map +0 -1
- package/src/lib/server/import-context.d.ts +0 -87
- package/src/lib/server/import-context.js +0 -182
- package/src/lib/server/import-context.js.map +0 -1
- package/src/lib/server/lead-source-values.d.ts +0 -50
- package/src/lib/server/lead-source-values.js +0 -191
- package/src/lib/server/lead-source-values.js.map +0 -1
- package/src/lib/server/leads-import.d.ts +0 -84
- package/src/lib/server/leads-import.js +0 -367
- package/src/lib/server/leads-import.js.map +0 -1
- package/src/lib/server/tasks-import.d.ts +0 -54
- package/src/lib/server/tasks-import.js +0 -160
- 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 === '
|
|
248
|
-
|
|
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)
|
|
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
|
-
|
|
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),
|
|
330
|
-
|
|
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
|
-
|
|
374
|
-
|
|
375
|
-
}
|
|
376
|
-
|
|
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),
|
|
468
|
-
|
|
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
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
}
|
|
602
|
-
|
|
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
|
-
|
|
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
|
}
|