@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.
- 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-next-activity-column.js +1 -1
- package/src/lib/components/crm-next-activity-column.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/pipeline-card.js +2 -1
- package/src/lib/components/reports/pipeline-card.js.map +1 -1
- 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 +97 -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 +17 -2
- 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-next-activity.d.ts +107 -0
- package/src/lib/model/crm-next-activity.js +140 -0
- package/src/lib/model/crm-next-activity.js.map +1 -0
- package/src/lib/model/crm-recipes.d.ts +40 -0
- package/src/lib/model/crm-recipes.js +259 -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/crm-task-reminders.d.ts +152 -0
- package/src/lib/model/crm-task-reminders.js +161 -0
- package/src/lib/model/crm-task-reminders.js.map +1 -0
- 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/next-activity.d.ts +1 -1
- package/src/lib/model/next-activity.js.map +1 -1
- 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 +78 -34
- 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 +188 -0
- package/src/lib/server/assign-contact-owner.js +446 -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 +140 -0
- package/src/lib/server/automation-steps.js +669 -0
- package/src/lib/server/automation-steps.js.map +1 -0
- package/src/lib/server/capture-contact.d.ts +17 -0
- package/src/lib/server/capture-contact.js +95 -26
- 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-email-activity.d.ts +118 -0
- package/src/lib/server/crm-email-activity.js +148 -0
- package/src/lib/server/crm-email-activity.js.map +1 -0
- package/src/lib/server/crm-inbound-email.js +1 -1
- package/src/lib/server/crm-inbound-email.js.map +1 -1
- package/src/lib/server/crm-next-activity.d.ts +74 -0
- package/src/lib/server/crm-next-activity.js +194 -0
- package/src/lib/server/crm-next-activity.js.map +1 -0
- 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/email-send.js +2 -1
- package/src/lib/server/email-send.js.map +1 -1
- 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 +23 -5
- package/src/lib/server/merge-contacts.js.map +1 -1
- package/src/lib/server/next-activity-routes.js +2 -1
- package/src/lib/server/next-activity-routes.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 +22 -8
- 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 +40 -3
- 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-reminders-route.js +2 -1
- package/src/lib/server/task-reminders-route.js.map +1 -1
- package/src/lib/server/task-routes.js +33 -17
- 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
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ import { CONTACT_LIFECYCLE_STAGE_LABELS, CONTACT_SOURCE_LABELS, CRM_ACTIVITY_KIND_LABELS, CRM_EMAIL_DELIVERY_STATE_LABELS, CRM_FORECAST_CATEGORY_LABELS, CRM_TASK_KIND_LABELS, contactDisplayName, crmActivityDirection, crmLeadStatusLabel, DEAL_NEXT_STEP_MAX, dealContactRolesOf, dealForecastCategory, dealProbability, dealStageById, dealStageForecastCategory, interactionsForGroup, isContactLifecycleStage, isCrmEmailDeliveryState, readContactFacet } from "@aglyn/aglyn/server";
|
|
18
|
+
import { CRM_FACTS_CONTACT_ROLES_MAX, CRM_FACTS_DEALS_MAX, CRM_FACTS_LABEL_MAX, CRM_FACTS_NOTES_MAX, CRM_FACTS_TAGS_MAX, CRM_FACTS_TASKS_MAX, CRM_FACTS_TEXT_MAX, crmFactDay, crmFactMillis, crmFactMoney, crmFactText, crmTimelineFacts, leadSourceFact } from "./record-facts.js";
|
|
19
|
+
/** An email address written inside free text. */ const EMAIL_IN_PROSE = /[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g;
|
|
20
|
+
/** A run of digits and the separators a phone number is written with. */ const DIGIT_RUN_IN_PROSE = /\+?\(?\d[\d\s().-]{7,}\d/g;
|
|
21
|
+
/** Calendar days, which a run of digits may be and a phone number is not. */ const DAYS_ONLY = /^\d{4}-\d{2}-\d{2}(?:\s+\d{4}-\d{2}-\d{2})*$/;
|
|
22
|
+
export const CRM_FACTS_EMAIL_PLACEHOLDER = '[email address]';
|
|
23
|
+
export const CRM_FACTS_PHONE_PLACEHOLDER = '[phone number]';
|
|
24
|
+
const DAY_MS = 86400000;
|
|
25
|
+
/**
|
|
26
|
+
* Free text the team wrote, as {@link crmFactText} reports it, with every
|
|
27
|
+
* email address, and every run of ten digits or more that is not a list of
|
|
28
|
+
* days, replaced by a placeholder. The fields that hold an address or a number
|
|
29
|
+
* are never reported, and this keeps one typed into a note from leaving
|
|
30
|
+
* either. Replaced before the cut, so a cut never halves an address into
|
|
31
|
+
* something unrecognized.
|
|
32
|
+
*/ export function crmFactProse(value, max) {
|
|
33
|
+
if (typeof value !== 'string') return '';
|
|
34
|
+
const scrubbed = value.replace(EMAIL_IN_PROSE, CRM_FACTS_EMAIL_PLACEHOLDER).replace(DIGIT_RUN_IN_PROSE, (run)=>DAYS_ONLY.test(run.trim()) || run.replace(/\D/g, '').length < 10 ? run : CRM_FACTS_PHONE_PLACEHOLDER);
|
|
35
|
+
return crmFactText(scrubbed, max);
|
|
36
|
+
}
|
|
37
|
+
function tagsOf(value) {
|
|
38
|
+
return Array.isArray(value) ? value.map((tag)=>crmFactProse(tag, 40)).filter(Boolean).slice(0, CRM_FACTS_TAGS_MAX) : [];
|
|
39
|
+
}
|
|
40
|
+
/** A logged activity as a timeline entry: never the address it went to or came from. */ export function crmDisclosedActivityFact(activity) {
|
|
41
|
+
var _activity_subject;
|
|
42
|
+
const on = crmFactDay(activity.atMs);
|
|
43
|
+
if (!on) return null;
|
|
44
|
+
const kind = activity.kind && CRM_ACTIVITY_KIND_LABELS[activity.kind] ? activity.kind : 'other';
|
|
45
|
+
const fact = {
|
|
46
|
+
on,
|
|
47
|
+
kind: CRM_ACTIVITY_KIND_LABELS[kind]
|
|
48
|
+
};
|
|
49
|
+
const direction = crmActivityDirection(kind, activity.direction);
|
|
50
|
+
if (direction) fact.direction = direction;
|
|
51
|
+
const subject = crmFactProse((_activity_subject = activity.subject) != null ? _activity_subject : activity.threadSubject, CRM_FACTS_LABEL_MAX);
|
|
52
|
+
if (subject) fact.subject = subject;
|
|
53
|
+
const text = crmFactProse(activity.body, CRM_FACTS_TEXT_MAX);
|
|
54
|
+
if (text) fact.text = text;
|
|
55
|
+
const outcome = crmFactProse(activity.outcome, CRM_FACTS_LABEL_MAX);
|
|
56
|
+
if (outcome) fact.outcome = outcome;
|
|
57
|
+
if (kind === 'email' && isCrmEmailDeliveryState(activity.deliveryState)) {
|
|
58
|
+
fact.delivery = CRM_EMAIL_DELIVERY_STATE_LABELS[activity.deliveryState];
|
|
59
|
+
}
|
|
60
|
+
return fact;
|
|
61
|
+
}
|
|
62
|
+
/** A capture the platform recorded on a contact, as a timeline entry. */ export function crmDisclosedInteractionFact(interaction) {
|
|
63
|
+
const on = crmFactDay(interaction.atMs);
|
|
64
|
+
if (!on) return null;
|
|
65
|
+
const kind = interaction.type && CONTACT_SOURCE_LABELS[interaction.type] ? CONTACT_SOURCE_LABELS[interaction.type] : 'Capture';
|
|
66
|
+
const text = crmFactProse(interaction.summary, CRM_FACTS_TEXT_MAX);
|
|
67
|
+
return text ? {
|
|
68
|
+
on,
|
|
69
|
+
kind,
|
|
70
|
+
text
|
|
71
|
+
} : {
|
|
72
|
+
on,
|
|
73
|
+
kind
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** The open tasks among `tasks`, soonest due first, undated last: never who holds one, nor its notes. */ export function crmDisclosedOpenTaskFacts(tasks, nowMs) {
|
|
77
|
+
return tasks.filter((task)=>task.status !== 'done' && crmFactText(task.title, CRM_FACTS_LABEL_MAX)).map((task, index)=>({
|
|
78
|
+
task,
|
|
79
|
+
index,
|
|
80
|
+
due: crmFactMillis(task.dueAtMs)
|
|
81
|
+
})).sort((a, b)=>{
|
|
82
|
+
var _a_due, _b_due;
|
|
83
|
+
return ((_a_due = a.due) != null ? _a_due : Number.POSITIVE_INFINITY) - ((_b_due = b.due) != null ? _b_due : Number.POSITIVE_INFINITY) || a.index - b.index;
|
|
84
|
+
}).slice(0, CRM_FACTS_TASKS_MAX).map(({ task, due })=>_extends({
|
|
85
|
+
title: crmFactProse(task.title, CRM_FACTS_LABEL_MAX),
|
|
86
|
+
kind: crmFactProse(task.typeLabel, CRM_FACTS_LABEL_MAX) || (task.kind && CRM_TASK_KIND_LABELS[task.kind] ? CRM_TASK_KIND_LABELS[task.kind] : 'To-do'),
|
|
87
|
+
priority: task.priority === 'high' || task.priority === 'low' ? task.priority : 'normal'
|
|
88
|
+
}, crmFactProse(task.statusLabel, CRM_FACTS_LABEL_MAX) ? {
|
|
89
|
+
status: crmFactProse(task.statusLabel, CRM_FACTS_LABEL_MAX)
|
|
90
|
+
} : {}, {
|
|
91
|
+
due: due === null ? null : crmFactDay(due),
|
|
92
|
+
// Overdue by the UTC day: a task due today is not overdue until tomorrow.
|
|
93
|
+
overdue: due !== null && Math.floor(due / DAY_MS) < Math.floor(nowMs / DAY_MS)
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
/** One deal, with its stage named by the pipeline it is in. */ function disclosedDealSummary(deal, pipeline) {
|
|
97
|
+
var _deal_stageId;
|
|
98
|
+
const stage = dealStageById(pipeline != null ? pipeline : undefined, String((_deal_stageId = deal.stageId) != null ? _deal_stageId : ''));
|
|
99
|
+
return {
|
|
100
|
+
title: crmFactProse(deal.title, CRM_FACTS_LABEL_MAX),
|
|
101
|
+
stage: crmFactText(stage == null ? void 0 : stage.name, CRM_FACTS_LABEL_MAX),
|
|
102
|
+
status: deal.status === 'won' || deal.status === 'lost' ? deal.status : 'open',
|
|
103
|
+
amount: crmFactMoney(deal.amountCents, deal.currency),
|
|
104
|
+
expectedClose: crmFactDay(deal.expectedCloseAtMs)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Deals, open ones first, then most recently updated. */ function disclosedDealSummaries(deals, pipelines) {
|
|
108
|
+
return deals.map((deal, index)=>{
|
|
109
|
+
var _crmFactMillis;
|
|
110
|
+
return {
|
|
111
|
+
deal,
|
|
112
|
+
index,
|
|
113
|
+
updated: (_crmFactMillis = crmFactMillis(deal.updatedAt)) != null ? _crmFactMillis : 0
|
|
114
|
+
};
|
|
115
|
+
}).sort((a, b)=>Number(a.deal.status !== 'open') - Number(b.deal.status !== 'open') || b.updated - a.updated || a.index - b.index).slice(0, CRM_FACTS_DEALS_MAX).map(({ deal })=>{
|
|
116
|
+
var _deal_pipelineId;
|
|
117
|
+
return disclosedDealSummary(deal, pipelines.get(String((_deal_pipelineId = deal.pipelineId) != null ? _deal_pipelineId : '')));
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
export function disclosedContactFacts(input) {
|
|
121
|
+
var _facet_sources;
|
|
122
|
+
const { row, group } = input;
|
|
123
|
+
const facet = readContactFacet(row, group.groupId);
|
|
124
|
+
const sources = Object.entries((_facet_sources = facet.sources) != null ? _facet_sources : {}).filter(([, on])=>on === true).map(([source])=>{
|
|
125
|
+
var _CONTACT_SOURCE_LABELS_source;
|
|
126
|
+
return (_CONTACT_SOURCE_LABELS_source = CONTACT_SOURCE_LABELS[source]) != null ? _CONTACT_SOURCE_LABELS_source : '';
|
|
127
|
+
}).filter(Boolean);
|
|
128
|
+
const interactions = interactionsForGroup(facet.interactions, group.hostIds);
|
|
129
|
+
return {
|
|
130
|
+
record: 'contact',
|
|
131
|
+
name: crmFactProse(contactDisplayName(row, group.groupId), CRM_FACTS_LABEL_MAX),
|
|
132
|
+
salutation: crmFactProse(facet.salutation, CRM_FACTS_LABEL_MAX),
|
|
133
|
+
jobTitle: crmFactProse(facet.jobTitle, CRM_FACTS_LABEL_MAX),
|
|
134
|
+
department: crmFactProse(facet.department, CRM_FACTS_LABEL_MAX),
|
|
135
|
+
doNotCall: facet.doNotCall === true,
|
|
136
|
+
company: crmFactProse(facet.companyName, CRM_FACTS_LABEL_MAX),
|
|
137
|
+
lifecycleStage: isContactLifecycleStage(facet.lifecycleStage) ? CONTACT_LIFECYCLE_STAGE_LABELS[facet.lifecycleStage] : '',
|
|
138
|
+
tags: tagsOf(facet.tags),
|
|
139
|
+
sources: [
|
|
140
|
+
...new Set(sources)
|
|
141
|
+
].sort(),
|
|
142
|
+
orders: typeof facet.ordersCount === 'number' && facet.ordersCount > 0 ? Math.floor(facet.ordersCount) : 0,
|
|
143
|
+
lastPurchase: crmFactDay(facet.lastPurchaseAtMs),
|
|
144
|
+
since: crmFactDay(row['createdAt']),
|
|
145
|
+
lastEmailEngagement: crmFactDay(facet.lastEmailEngagementAtMs),
|
|
146
|
+
notes: crmFactProse(facet.notes, CRM_FACTS_NOTES_MAX),
|
|
147
|
+
timeline: crmTimelineFacts([
|
|
148
|
+
...input.activities.map((activity)=>({
|
|
149
|
+
atMs: activity.atMs,
|
|
150
|
+
fact: crmDisclosedActivityFact(activity)
|
|
151
|
+
})),
|
|
152
|
+
...interactions.map((interaction)=>({
|
|
153
|
+
atMs: interaction.atMs,
|
|
154
|
+
fact: crmDisclosedInteractionFact(interaction)
|
|
155
|
+
}))
|
|
156
|
+
]),
|
|
157
|
+
openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),
|
|
158
|
+
deals: disclosedDealSummaries(input.deals, input.pipelines)
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export function disclosedCompanyFacts(input) {
|
|
162
|
+
const { company } = input;
|
|
163
|
+
return {
|
|
164
|
+
record: 'company',
|
|
165
|
+
name: crmFactProse(company.name, CRM_FACTS_LABEL_MAX),
|
|
166
|
+
domain: crmFactText(company.domain, CRM_FACTS_LABEL_MAX),
|
|
167
|
+
industry: crmFactProse(company.industry, CRM_FACTS_LABEL_MAX),
|
|
168
|
+
type: crmFactProse(company.type, CRM_FACTS_LABEL_MAX),
|
|
169
|
+
rating: crmFactProse(company.rating, CRM_FACTS_LABEL_MAX),
|
|
170
|
+
ownership: crmFactProse(company.ownership, CRM_FACTS_LABEL_MAX),
|
|
171
|
+
accountSource: crmFactProse(company.accountSource, CRM_FACTS_LABEL_MAX),
|
|
172
|
+
employees: typeof company.numberOfEmployees === 'number' && company.numberOfEmployees >= 0 ? Math.floor(company.numberOfEmployees) : null,
|
|
173
|
+
annualRevenue: crmFactMoney(company.annualRevenueCents, company.currency),
|
|
174
|
+
tags: tagsOf(company.tags),
|
|
175
|
+
people: typeof company.contactsCount === 'number' && company.contactsCount > 0 ? Math.floor(company.contactsCount) : 0,
|
|
176
|
+
since: crmFactDay(company.createdAt),
|
|
177
|
+
notes: crmFactProse(company.notes, CRM_FACTS_NOTES_MAX),
|
|
178
|
+
timeline: crmTimelineFacts(input.activities.map((activity)=>({
|
|
179
|
+
atMs: activity.atMs,
|
|
180
|
+
fact: crmDisclosedActivityFact(activity)
|
|
181
|
+
}))),
|
|
182
|
+
openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),
|
|
183
|
+
deals: disclosedDealSummaries(input.deals, input.pipelines)
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Every contact on a deal and the part each plays (AGL-3521), the Primary
|
|
188
|
+
* first and at most {@link CRM_FACTS_CONTACT_ROLES_MAX}: each named as the
|
|
189
|
+
* reader resolved them, with an address or a number in a name replaced. A
|
|
190
|
+
* contact the reader could not see is left out rather than named by id.
|
|
191
|
+
*/ function disclosedContactRoleFacts(deal, names = new Map()) {
|
|
192
|
+
return dealContactRolesOf(deal).sort((a, b)=>Number(b.primary) - Number(a.primary)).filter((row)=>names.has(row.contactId)).slice(0, CRM_FACTS_CONTACT_ROLES_MAX).map((row)=>({
|
|
193
|
+
name: crmFactProse(names.get(row.contactId), CRM_FACTS_LABEL_MAX),
|
|
194
|
+
role: crmFactText(row.role, CRM_FACTS_LABEL_MAX),
|
|
195
|
+
primary: row.primary
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
export function disclosedDealFacts(input) {
|
|
199
|
+
var _ref, _deal_stageId, _deal_stageId1;
|
|
200
|
+
const { deal, pipeline } = input;
|
|
201
|
+
const summary = disclosedDealSummary(deal, pipeline);
|
|
202
|
+
const stages = [
|
|
203
|
+
...(_ref = pipeline == null ? void 0 : pipeline.stages) != null ? _ref : []
|
|
204
|
+
].sort((a, b)=>{
|
|
205
|
+
var _a_order, _b_order;
|
|
206
|
+
return Number((_a_order = a.order) != null ? _a_order : 0) - Number((_b_order = b.order) != null ? _b_order : 0);
|
|
207
|
+
}).map((stage)=>({
|
|
208
|
+
id: String(stage.id),
|
|
209
|
+
name: crmFactText(stage.name, CRM_FACTS_LABEL_MAX),
|
|
210
|
+
kind: stage.kind === 'won' || stage.kind === 'lost' ? stage.kind : 'open',
|
|
211
|
+
probability: Math.min(100, Math.max(0, Number(stage.probability) || 0)),
|
|
212
|
+
forecastCategory: CRM_FORECAST_CATEGORY_LABELS[dealStageForecastCategory(stage)]
|
|
213
|
+
}));
|
|
214
|
+
const stage = dealStageById(pipeline != null ? pipeline : undefined, String((_deal_stageId = deal.stageId) != null ? _deal_stageId : ''));
|
|
215
|
+
return {
|
|
216
|
+
record: 'deal',
|
|
217
|
+
title: summary.title,
|
|
218
|
+
pipeline: crmFactText(pipeline == null ? void 0 : pipeline.name, CRM_FACTS_LABEL_MAX),
|
|
219
|
+
stages,
|
|
220
|
+
stageId: String((_deal_stageId1 = deal.stageId) != null ? _deal_stageId1 : ''),
|
|
221
|
+
stage: summary.stage,
|
|
222
|
+
status: summary.status,
|
|
223
|
+
amount: summary.amount,
|
|
224
|
+
expectedClose: summary.expectedClose,
|
|
225
|
+
inStageSince: crmFactDay(deal.stageChangedAtMs),
|
|
226
|
+
lostReason: crmFactProse(deal.lostReason, CRM_FACTS_LABEL_MAX),
|
|
227
|
+
type: crmFactText(deal.type, CRM_FACTS_LABEL_MAX),
|
|
228
|
+
leadSource: crmFactText(deal.leadSource, CRM_FACTS_LABEL_MAX),
|
|
229
|
+
nextStep: crmFactProse(deal.nextStep, DEAL_NEXT_STEP_MAX),
|
|
230
|
+
probability: dealProbability(deal, stage),
|
|
231
|
+
forecastCategory: CRM_FORECAST_CATEGORY_LABELS[dealForecastCategory(deal, stage)],
|
|
232
|
+
contact: crmFactProse(deal.contactName, CRM_FACTS_LABEL_MAX),
|
|
233
|
+
contactRoles: disclosedContactRoleFacts(deal, input.contactNames),
|
|
234
|
+
company: crmFactProse(deal.companyName, CRM_FACTS_LABEL_MAX),
|
|
235
|
+
products: Array.isArray(deal.lineItems) ? deal.lineItems.length : 0,
|
|
236
|
+
since: crmFactDay(deal.createdAt),
|
|
237
|
+
notes: crmFactProse(deal.notes, CRM_FACTS_NOTES_MAX),
|
|
238
|
+
timeline: crmTimelineFacts(input.activities.map((activity)=>({
|
|
239
|
+
atMs: activity.atMs,
|
|
240
|
+
fact: crmDisclosedActivityFact(activity)
|
|
241
|
+
}))),
|
|
242
|
+
openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs)
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
export function disclosedLeadFacts(input) {
|
|
246
|
+
const { lead, leadStatuses } = input;
|
|
247
|
+
const rawSources = Array.isArray(lead['sources']) ? lead['sources'] : typeof lead['source'] === 'string' ? [
|
|
248
|
+
lead['source']
|
|
249
|
+
] : [];
|
|
250
|
+
const captures = Number(lead['submissionCount']);
|
|
251
|
+
return {
|
|
252
|
+
record: 'lead',
|
|
253
|
+
name: crmFactProse(lead['name'], CRM_FACTS_LABEL_MAX),
|
|
254
|
+
salutation: crmFactProse(lead['salutation'], CRM_FACTS_LABEL_MAX),
|
|
255
|
+
company: crmFactProse(lead['company'], CRM_FACTS_LABEL_MAX),
|
|
256
|
+
jobTitle: crmFactProse(lead['jobTitle'], CRM_FACTS_LABEL_MAX),
|
|
257
|
+
leadSource: crmFactText(lead['leadSource'], CRM_FACTS_LABEL_MAX),
|
|
258
|
+
industry: crmFactText(lead['industry'], CRM_FACTS_LABEL_MAX),
|
|
259
|
+
rating: crmFactText(lead['rating'], CRM_FACTS_LABEL_MAX),
|
|
260
|
+
employees: typeof lead['numberOfEmployees'] === 'number' && lead['numberOfEmployees'] >= 0 ? Math.floor(lead['numberOfEmployees']) : null,
|
|
261
|
+
annualRevenue: crmFactMoney(lead['annualRevenueCents'], lead['currency']),
|
|
262
|
+
doNotCall: lead['doNotCall'] === true,
|
|
263
|
+
status: crmLeadStatusLabel(lead, leadStatuses),
|
|
264
|
+
sources: [
|
|
265
|
+
...new Set(rawSources.map((source)=>leadSourceFact(String(source))))
|
|
266
|
+
].sort(),
|
|
267
|
+
captures: Number.isFinite(captures) && captures > 0 ? Math.floor(captures) : 0,
|
|
268
|
+
firstSeen: crmFactDay(lead['firstSeenAtMs']),
|
|
269
|
+
lastSeen: crmFactDay(lead['lastSeenAtMs']),
|
|
270
|
+
assigned: typeof lead['ownerUid'] === 'string' && lead['ownerUid'] !== '',
|
|
271
|
+
converted: typeof lead['convertedContactId'] === 'string' && lead['convertedContactId'] !== '',
|
|
272
|
+
unqualifiedReason: crmFactProse(lead['unqualifiedReason'], CRM_FACTS_LABEL_MAX),
|
|
273
|
+
notes: crmFactProse(lead['notes'], CRM_FACTS_NOTES_MAX),
|
|
274
|
+
timeline: crmTimelineFacts(input.activities.map((activity)=>({
|
|
275
|
+
atMs: activity.atMs,
|
|
276
|
+
fact: crmDisclosedActivityFact(activity)
|
|
277
|
+
})))
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
//# sourceMappingURL=record-facts-disclosed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/record-facts-disclosed.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n CONTACT_LIFECYCLE_STAGE_LABELS,\n CONTACT_SOURCE_LABELS,\n CRM_ACTIVITY_KIND_LABELS,\n CRM_EMAIL_DELIVERY_STATE_LABELS,\n CRM_FORECAST_CATEGORY_LABELS,\n CRM_TASK_KIND_LABELS,\n contactDisplayName,\n crmActivityDirection,\n crmLeadStatusLabel,\n DEAL_NEXT_STEP_MAX,\n dealContactRolesOf,\n dealForecastCategory,\n dealProbability,\n dealStageById,\n dealStageForecastCategory,\n interactionsForGroup,\n isContactLifecycleStage,\n isCrmEmailDeliveryState,\n readContactFacet,\n type ContactInteraction,\n type CrmActivity,\n type CrmDeal,\n type CrmPipeline,\n type CrmTask,\n} from '@aglyn/aglyn/server'\nimport {\n CRM_FACTS_CONTACT_ROLES_MAX,\n CRM_FACTS_DEALS_MAX,\n CRM_FACTS_LABEL_MAX,\n CRM_FACTS_NOTES_MAX,\n CRM_FACTS_TAGS_MAX,\n CRM_FACTS_TASKS_MAX,\n CRM_FACTS_TEXT_MAX,\n crmFactDay,\n crmFactMillis,\n crmFactMoney,\n crmFactText,\n crmTimelineFacts,\n leadSourceFact,\n type CompanyFactsInput,\n type ContactFactsInput,\n type CrmCompanyFacts,\n type CrmContactFacts,\n type CrmContactRoleFact,\n type CrmDealFact,\n type CrmDealFacts,\n type CrmLeadFacts,\n type CrmTaskFact,\n type CrmTimelineFact,\n type DealFactsInput,\n type LeadFactsInput,\n} from './record-facts'\n\n/**\n * THE DISCLOSED FACTS: what CRM assistance sends while\n * `release_crm_assist_whole_record` is off.\n *\n * The published Privacy Policy (section 2) and the Anthropic row on\n * `/legal/subprocessors` promise that CRM assistance sends a record's name\n * and, by kind, its job title, company, lifecycle stage, tags, capture\n * history and counts, domain, industry, headcount, pipeline stages, status,\n * amount, dates, lost reason, parties and lead status, with its notes,\n * newest timeline entries and open tasks and deals — and never an email,\n * phone or postal field, marketing consent, custom field value, team member\n * or record id. These builders report exactly that, so production keeps the\n * promise until those pages are republished and the flag is turned on;\n * `record-facts.ts` builds the whole record for the flag's on side.\n *\n * ## What never leaves\n *\n * No email address, phone number or postal address of anyone; no birthdate;\n * no assistant and no reports-to; no marketing consent; no custom field\n * VALUE; no team member's name or id; no document id of any record; no\n * file; no order or payment detail beyond a count. A logged email carries its\n * subject and a cut of its body, never the address it went to or came from.\n *\n * Every text a person wrote into a record — a name, a job title, a tag, notes,\n * a logged activity, a capture's summary, a task's or a deal's title, a\n * reason — is reported as written, except that an email address or a phone\n * number inside it is replaced by a placeholder first ({@link crmFactProse}):\n * an import that put an address in the name column leaves no address behind.\n * What the workspace configured — pipeline, stage and field names — and a\n * company's domain are reported as they are. A postal address typed into a\n * note is not recognized and leaves as typed.\n *\n * The bytes are as stable as the whole record's: one key order, UTC days,\n * money as a code and a fixed-point amount.\n */\n\nexport type CrmDisclosedContactFacts = Pick<\n CrmContactFacts,\n | 'record'\n | 'name'\n | 'salutation'\n | 'jobTitle'\n | 'department'\n | 'doNotCall'\n | 'company'\n | 'lifecycleStage'\n | 'tags'\n | 'sources'\n | 'orders'\n | 'lastPurchase'\n | 'since'\n | 'lastEmailEngagement'\n | 'notes'\n | 'timeline'\n | 'openTasks'\n | 'deals'\n>\n\nexport type CrmDisclosedCompanyFacts = Pick<\n CrmCompanyFacts,\n | 'record'\n | 'name'\n | 'domain'\n | 'industry'\n | 'type'\n | 'rating'\n | 'ownership'\n | 'accountSource'\n | 'employees'\n | 'annualRevenue'\n | 'tags'\n | 'people'\n | 'since'\n | 'notes'\n | 'timeline'\n | 'openTasks'\n | 'deals'\n>\n\nexport type CrmDisclosedDealFacts = Pick<\n CrmDealFacts,\n | 'record'\n | 'title'\n | 'pipeline'\n | 'stages'\n | 'stageId'\n | 'stage'\n | 'status'\n | 'amount'\n | 'expectedClose'\n | 'inStageSince'\n | 'lostReason'\n | 'type'\n | 'leadSource'\n | 'nextStep'\n | 'probability'\n | 'forecastCategory'\n | 'contact'\n | 'contactRoles'\n | 'company'\n | 'since'\n | 'notes'\n | 'timeline'\n | 'openTasks'\n> & {\n /** How many products the deal holds — a count, never their names or prices. */\n products: number\n}\n\nexport type CrmDisclosedLeadFacts = Pick<\n CrmLeadFacts,\n | 'record'\n | 'name'\n | 'salutation'\n | 'company'\n | 'jobTitle'\n | 'leadSource'\n | 'industry'\n | 'rating'\n | 'employees'\n | 'annualRevenue'\n | 'doNotCall'\n | 'status'\n | 'sources'\n | 'captures'\n | 'firstSeen'\n | 'lastSeen'\n | 'assigned'\n | 'converted'\n | 'unqualifiedReason'\n | 'notes'\n | 'timeline'\n>\n\n/** An email address written inside free text. */\nconst EMAIL_IN_PROSE = /[\\w.+-]+@[\\w-]+(?:\\.[\\w-]+)+/g\n/** A run of digits and the separators a phone number is written with. */\nconst DIGIT_RUN_IN_PROSE = /\\+?\\(?\\d[\\d\\s().-]{7,}\\d/g\n/** Calendar days, which a run of digits may be and a phone number is not. */\nconst DAYS_ONLY = /^\\d{4}-\\d{2}-\\d{2}(?:\\s+\\d{4}-\\d{2}-\\d{2})*$/\n\nexport const CRM_FACTS_EMAIL_PLACEHOLDER = '[email address]'\nexport const CRM_FACTS_PHONE_PLACEHOLDER = '[phone number]'\n\nconst DAY_MS = 86_400_000\n\n/**\n * Free text the team wrote, as {@link crmFactText} reports it, with every\n * email address, and every run of ten digits or more that is not a list of\n * days, replaced by a placeholder. The fields that hold an address or a number\n * are never reported, and this keeps one typed into a note from leaving\n * either. Replaced before the cut, so a cut never halves an address into\n * something unrecognized.\n */\nexport function crmFactProse(value: unknown, max: number): string {\n if (typeof value !== 'string') return ''\n const scrubbed = value\n .replace(EMAIL_IN_PROSE, CRM_FACTS_EMAIL_PLACEHOLDER)\n .replace(DIGIT_RUN_IN_PROSE, (run) =>\n DAYS_ONLY.test(run.trim()) || run.replace(/\\D/g, '').length < 10 ? run : CRM_FACTS_PHONE_PLACEHOLDER,\n )\n return crmFactText(scrubbed, max)\n}\n\nfunction tagsOf(value: unknown): string[] {\n return Array.isArray(value)\n ? value\n .map((tag) => crmFactProse(tag, 40))\n .filter(Boolean)\n .slice(0, CRM_FACTS_TAGS_MAX)\n : []\n}\n\n/** A logged activity as a timeline entry: never the address it went to or came from. */\nexport function crmDisclosedActivityFact(activity: Partial<CrmActivity>): CrmTimelineFact | null {\n const on = crmFactDay(activity.atMs)\n if (!on) return null\n const kind = activity.kind && CRM_ACTIVITY_KIND_LABELS[activity.kind] ? activity.kind : 'other'\n const fact: CrmTimelineFact = { on, kind: CRM_ACTIVITY_KIND_LABELS[kind] }\n const direction = crmActivityDirection(kind, activity.direction)\n if (direction) fact.direction = direction\n const subject = crmFactProse(activity.subject ?? activity.threadSubject, CRM_FACTS_LABEL_MAX)\n if (subject) fact.subject = subject\n const text = crmFactProse(activity.body, CRM_FACTS_TEXT_MAX)\n if (text) fact.text = text\n const outcome = crmFactProse(activity.outcome, CRM_FACTS_LABEL_MAX)\n if (outcome) fact.outcome = outcome\n if (kind === 'email' && isCrmEmailDeliveryState(activity.deliveryState)) {\n fact.delivery = CRM_EMAIL_DELIVERY_STATE_LABELS[activity.deliveryState]\n }\n return fact\n}\n\n/** A capture the platform recorded on a contact, as a timeline entry. */\nexport function crmDisclosedInteractionFact(interaction: Partial<ContactInteraction>): CrmTimelineFact | null {\n const on = crmFactDay(interaction.atMs)\n if (!on) return null\n const kind =\n interaction.type && CONTACT_SOURCE_LABELS[interaction.type] ? CONTACT_SOURCE_LABELS[interaction.type] : 'Capture'\n const text = crmFactProse(interaction.summary, CRM_FACTS_TEXT_MAX)\n return text ? { on, kind, text } : { on, kind }\n}\n\n/** The open tasks among `tasks`, soonest due first, undated last: never who holds one, nor its notes. */\nexport function crmDisclosedOpenTaskFacts(tasks: ReadonlyArray<Partial<CrmTask>>, nowMs: number): CrmTaskFact[] {\n return tasks\n .filter((task) => task.status !== 'done' && crmFactText(task.title, CRM_FACTS_LABEL_MAX))\n .map((task, index) => ({ task, index, due: crmFactMillis(task.dueAtMs) }))\n .sort((a, b) => (a.due ?? Number.POSITIVE_INFINITY) - (b.due ?? Number.POSITIVE_INFINITY) || a.index - b.index)\n .slice(0, CRM_FACTS_TASKS_MAX)\n .map(({ task, due }) => ({\n title: crmFactProse(task.title, CRM_FACTS_LABEL_MAX),\n kind:\n crmFactProse(task.typeLabel, CRM_FACTS_LABEL_MAX) ||\n (task.kind && CRM_TASK_KIND_LABELS[task.kind] ? CRM_TASK_KIND_LABELS[task.kind] : 'To-do'),\n priority: task.priority === 'high' || task.priority === 'low' ? task.priority : 'normal',\n ...(crmFactProse(task.statusLabel, CRM_FACTS_LABEL_MAX)\n ? { status: crmFactProse(task.statusLabel, CRM_FACTS_LABEL_MAX) }\n : {}),\n due: due === null ? null : crmFactDay(due),\n // Overdue by the UTC day: a task due today is not overdue until tomorrow.\n overdue: due !== null && Math.floor(due / DAY_MS) < Math.floor(nowMs / DAY_MS),\n }))\n}\n\n/** One deal, with its stage named by the pipeline it is in. */\nfunction disclosedDealSummary(deal: Partial<CrmDeal>, pipeline: CrmPipeline | null | undefined): CrmDealFact {\n const stage = dealStageById(pipeline ?? undefined, String(deal.stageId ?? ''))\n return {\n title: crmFactProse(deal.title, CRM_FACTS_LABEL_MAX),\n stage: crmFactText(stage?.name, CRM_FACTS_LABEL_MAX),\n status: deal.status === 'won' || deal.status === 'lost' ? deal.status : 'open',\n amount: crmFactMoney(deal.amountCents, deal.currency),\n expectedClose: crmFactDay(deal.expectedCloseAtMs),\n }\n}\n\n/** Deals, open ones first, then most recently updated. */\nfunction disclosedDealSummaries(\n deals: ReadonlyArray<Partial<CrmDeal>>,\n pipelines: ReadonlyMap<string, CrmPipeline>,\n): CrmDealFact[] {\n return deals\n .map((deal, index) => ({ deal, index, updated: crmFactMillis(deal.updatedAt) ?? 0 }))\n .sort(\n (a, b) =>\n Number(a.deal.status !== 'open') - Number(b.deal.status !== 'open') ||\n b.updated - a.updated ||\n a.index - b.index,\n )\n .slice(0, CRM_FACTS_DEALS_MAX)\n .map(({ deal }) => disclosedDealSummary(deal, pipelines.get(String(deal.pipelineId ?? ''))))\n}\n\nexport function disclosedContactFacts(input: ContactFactsInput): CrmDisclosedContactFacts {\n const { row, group } = input\n const facet = readContactFacet(row, group.groupId)\n const sources = Object.entries(facet.sources ?? {})\n .filter(([, on]) => on === true)\n .map(([source]) => CONTACT_SOURCE_LABELS[source as keyof typeof CONTACT_SOURCE_LABELS] ?? '')\n .filter(Boolean)\n const interactions = interactionsForGroup(facet.interactions, group.hostIds)\n return {\n record: 'contact',\n name: crmFactProse(contactDisplayName(row, group.groupId), CRM_FACTS_LABEL_MAX),\n salutation: crmFactProse(facet.salutation, CRM_FACTS_LABEL_MAX),\n jobTitle: crmFactProse(facet.jobTitle, CRM_FACTS_LABEL_MAX),\n department: crmFactProse(facet.department, CRM_FACTS_LABEL_MAX),\n doNotCall: facet.doNotCall === true,\n company: crmFactProse(facet.companyName, CRM_FACTS_LABEL_MAX),\n lifecycleStage: isContactLifecycleStage(facet.lifecycleStage)\n ? CONTACT_LIFECYCLE_STAGE_LABELS[facet.lifecycleStage]\n : '',\n tags: tagsOf(facet.tags),\n sources: [...new Set(sources)].sort(),\n orders: typeof facet.ordersCount === 'number' && facet.ordersCount > 0 ? Math.floor(facet.ordersCount) : 0,\n lastPurchase: crmFactDay(facet.lastPurchaseAtMs),\n since: crmFactDay(row['createdAt']),\n lastEmailEngagement: crmFactDay(facet.lastEmailEngagementAtMs),\n notes: crmFactProse(facet.notes, CRM_FACTS_NOTES_MAX),\n timeline: crmTimelineFacts([\n ...input.activities.map((activity) => ({ atMs: activity.atMs, fact: crmDisclosedActivityFact(activity) })),\n ...interactions.map((interaction) => ({ atMs: interaction.atMs, fact: crmDisclosedInteractionFact(interaction) })),\n ]),\n openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),\n deals: disclosedDealSummaries(input.deals, input.pipelines),\n }\n}\n\nexport function disclosedCompanyFacts(input: CompanyFactsInput): CrmDisclosedCompanyFacts {\n const { company } = input\n return {\n record: 'company',\n name: crmFactProse(company.name, CRM_FACTS_LABEL_MAX),\n domain: crmFactText(company.domain, CRM_FACTS_LABEL_MAX),\n industry: crmFactProse(company.industry, CRM_FACTS_LABEL_MAX),\n type: crmFactProse(company.type, CRM_FACTS_LABEL_MAX),\n rating: crmFactProse(company.rating, CRM_FACTS_LABEL_MAX),\n ownership: crmFactProse(company.ownership, CRM_FACTS_LABEL_MAX),\n accountSource: crmFactProse(company.accountSource, CRM_FACTS_LABEL_MAX),\n employees:\n typeof company.numberOfEmployees === 'number' && company.numberOfEmployees >= 0\n ? Math.floor(company.numberOfEmployees)\n : null,\n annualRevenue: crmFactMoney(company.annualRevenueCents, company.currency),\n tags: tagsOf(company.tags),\n people:\n typeof company.contactsCount === 'number' && company.contactsCount > 0\n ? Math.floor(company.contactsCount)\n : 0,\n since: crmFactDay(company.createdAt),\n notes: crmFactProse(company.notes, CRM_FACTS_NOTES_MAX),\n timeline: crmTimelineFacts(\n input.activities.map((activity) => ({ atMs: activity.atMs, fact: crmDisclosedActivityFact(activity) })),\n ),\n openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),\n deals: disclosedDealSummaries(input.deals, input.pipelines),\n }\n}\n\n/**\n * Every contact on a deal and the part each plays (AGL-3521), the Primary\n * first and at most {@link CRM_FACTS_CONTACT_ROLES_MAX}: each named as the\n * reader resolved them, with an address or a number in a name replaced. A\n * contact the reader could not see is left out rather than named by id.\n */\nfunction disclosedContactRoleFacts(\n deal: { contactId?: unknown; contactRoles?: unknown },\n names: ReadonlyMap<string, string> = new Map(),\n): CrmContactRoleFact[] {\n return dealContactRolesOf(deal)\n .sort((a, b) => Number(b.primary) - Number(a.primary))\n .filter((row) => names.has(row.contactId))\n .slice(0, CRM_FACTS_CONTACT_ROLES_MAX)\n .map((row) => ({\n name: crmFactProse(names.get(row.contactId), CRM_FACTS_LABEL_MAX),\n role: crmFactText(row.role, CRM_FACTS_LABEL_MAX),\n primary: row.primary,\n }))\n}\n\nexport function disclosedDealFacts(input: DealFactsInput): CrmDisclosedDealFacts {\n const { deal, pipeline } = input\n const summary = disclosedDealSummary(deal, pipeline)\n const stages = [...(pipeline?.stages ?? [])]\n .sort((a, b) => Number(a.order ?? 0) - Number(b.order ?? 0))\n .map((stage) => ({\n id: String(stage.id),\n name: crmFactText(stage.name, CRM_FACTS_LABEL_MAX),\n kind: stage.kind === 'won' || stage.kind === 'lost' ? stage.kind : ('open' as const),\n probability: Math.min(100, Math.max(0, Number(stage.probability) || 0)),\n forecastCategory: CRM_FORECAST_CATEGORY_LABELS[dealStageForecastCategory(stage)],\n }))\n const stage = dealStageById(pipeline ?? undefined, String(deal.stageId ?? ''))\n return {\n record: 'deal',\n title: summary.title,\n pipeline: crmFactText(pipeline?.name, CRM_FACTS_LABEL_MAX),\n stages,\n stageId: String(deal.stageId ?? ''),\n stage: summary.stage,\n status: summary.status,\n amount: summary.amount,\n expectedClose: summary.expectedClose,\n inStageSince: crmFactDay(deal.stageChangedAtMs),\n lostReason: crmFactProse(deal.lostReason, CRM_FACTS_LABEL_MAX),\n type: crmFactText(deal.type, CRM_FACTS_LABEL_MAX),\n leadSource: crmFactText(deal.leadSource, CRM_FACTS_LABEL_MAX),\n nextStep: crmFactProse(deal.nextStep, DEAL_NEXT_STEP_MAX),\n probability: dealProbability(deal, stage),\n forecastCategory: CRM_FORECAST_CATEGORY_LABELS[dealForecastCategory(deal, stage)],\n contact: crmFactProse(deal.contactName, CRM_FACTS_LABEL_MAX),\n contactRoles: disclosedContactRoleFacts(deal, input.contactNames),\n company: crmFactProse(deal.companyName, CRM_FACTS_LABEL_MAX),\n products: Array.isArray(deal.lineItems) ? deal.lineItems.length : 0,\n since: crmFactDay(deal.createdAt),\n notes: crmFactProse(deal.notes, CRM_FACTS_NOTES_MAX),\n timeline: crmTimelineFacts(\n input.activities.map((activity) => ({ atMs: activity.atMs, fact: crmDisclosedActivityFact(activity) })),\n ),\n openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),\n }\n}\n\nexport function disclosedLeadFacts(input: LeadFactsInput): CrmDisclosedLeadFacts {\n const { lead, leadStatuses } = input\n const rawSources = Array.isArray(lead['sources'])\n ? lead['sources']\n : typeof lead['source'] === 'string'\n ? [lead['source']]\n : []\n const captures = Number(lead['submissionCount'])\n return {\n record: 'lead',\n name: crmFactProse(lead['name'], CRM_FACTS_LABEL_MAX),\n salutation: crmFactProse(lead['salutation'], CRM_FACTS_LABEL_MAX),\n company: crmFactProse(lead['company'], CRM_FACTS_LABEL_MAX),\n jobTitle: crmFactProse(lead['jobTitle'], CRM_FACTS_LABEL_MAX),\n leadSource: crmFactText(lead['leadSource'], CRM_FACTS_LABEL_MAX),\n industry: crmFactText(lead['industry'], CRM_FACTS_LABEL_MAX),\n rating: crmFactText(lead['rating'], CRM_FACTS_LABEL_MAX),\n employees:\n typeof lead['numberOfEmployees'] === 'number' && lead['numberOfEmployees'] >= 0\n ? Math.floor(lead['numberOfEmployees'])\n : null,\n annualRevenue: crmFactMoney(lead['annualRevenueCents'], lead['currency']),\n doNotCall: lead['doNotCall'] === true,\n status: crmLeadStatusLabel(lead as { status?: never; statusLabel?: string }, leadStatuses),\n sources: [...new Set(rawSources.map((source) => leadSourceFact(String(source))))].sort(),\n captures: Number.isFinite(captures) && captures > 0 ? Math.floor(captures) : 0,\n firstSeen: crmFactDay(lead['firstSeenAtMs']),\n lastSeen: crmFactDay(lead['lastSeenAtMs']),\n assigned: typeof lead['ownerUid'] === 'string' && lead['ownerUid'] !== '',\n converted: typeof lead['convertedContactId'] === 'string' && lead['convertedContactId'] !== '',\n unqualifiedReason: crmFactProse(lead['unqualifiedReason'], CRM_FACTS_LABEL_MAX),\n notes: crmFactProse(lead['notes'], CRM_FACTS_NOTES_MAX),\n timeline: crmTimelineFacts(\n input.activities.map((activity) => ({ atMs: activity.atMs, fact: crmDisclosedActivityFact(activity) })),\n ),\n }\n}\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","CONTACT_SOURCE_LABELS","CRM_ACTIVITY_KIND_LABELS","CRM_EMAIL_DELIVERY_STATE_LABELS","CRM_FORECAST_CATEGORY_LABELS","CRM_TASK_KIND_LABELS","contactDisplayName","crmActivityDirection","crmLeadStatusLabel","DEAL_NEXT_STEP_MAX","dealContactRolesOf","dealForecastCategory","dealProbability","dealStageById","dealStageForecastCategory","interactionsForGroup","isContactLifecycleStage","isCrmEmailDeliveryState","readContactFacet","CRM_FACTS_CONTACT_ROLES_MAX","CRM_FACTS_DEALS_MAX","CRM_FACTS_LABEL_MAX","CRM_FACTS_NOTES_MAX","CRM_FACTS_TAGS_MAX","CRM_FACTS_TASKS_MAX","CRM_FACTS_TEXT_MAX","crmFactDay","crmFactMillis","crmFactMoney","crmFactText","crmTimelineFacts","leadSourceFact","EMAIL_IN_PROSE","DIGIT_RUN_IN_PROSE","DAYS_ONLY","CRM_FACTS_EMAIL_PLACEHOLDER","CRM_FACTS_PHONE_PLACEHOLDER","DAY_MS","crmFactProse","value","max","scrubbed","replace","run","test","trim","length","tagsOf","Array","isArray","map","tag","filter","Boolean","slice","crmDisclosedActivityFact","activity","on","atMs","kind","fact","direction","subject","threadSubject","text","body","outcome","deliveryState","delivery","crmDisclosedInteractionFact","interaction","type","summary","crmDisclosedOpenTaskFacts","tasks","nowMs","task","status","title","index","due","dueAtMs","sort","a","b","Number","POSITIVE_INFINITY","typeLabel","priority","statusLabel","overdue","Math","floor","disclosedDealSummary","deal","pipeline","stage","undefined","String","stageId","name","amount","amountCents","currency","expectedClose","expectedCloseAtMs","disclosedDealSummaries","deals","pipelines","updated","updatedAt","get","pipelineId","disclosedContactFacts","input","facet","row","group","groupId","sources","Object","entries","source","interactions","hostIds","record","salutation","jobTitle","department","doNotCall","company","companyName","lifecycleStage","tags","Set","orders","ordersCount","lastPurchase","lastPurchaseAtMs","since","lastEmailEngagement","lastEmailEngagementAtMs","notes","timeline","activities","openTasks","disclosedCompanyFacts","domain","industry","rating","ownership","accountSource","employees","numberOfEmployees","annualRevenue","annualRevenueCents","people","contactsCount","createdAt","disclosedContactRoleFacts","names","Map","primary","has","contactId","role","disclosedDealFacts","stages","order","id","probability","min","forecastCategory","inStageSince","stageChangedAtMs","lostReason","leadSource","nextStep","contact","contactName","contactRoles","contactNames","products","lineItems","disclosedLeadFacts","lead","leadStatuses","rawSources","captures","isFinite","firstSeen","lastSeen","assigned","converted","unqualifiedReason"],"mappings":"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"}
|