@kelpie/server 0.7.0 → 0.9.0
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/dist/lib/consumerEmailDomains.d.ts +2 -0
- package/dist/lib/consumerEmailDomains.d.ts.map +1 -0
- package/dist/lib/consumerEmailDomains.js +62 -0
- package/dist/lib/consumerEmailDomains.js.map +1 -0
- package/dist/lib/email.d.ts +7 -0
- package/dist/lib/email.d.ts.map +1 -1
- package/dist/lib/email.js.map +1 -1
- package/dist/lib/emailContent.d.ts +33 -0
- package/dist/lib/emailContent.d.ts.map +1 -0
- package/dist/lib/emailContent.js +54 -0
- package/dist/lib/emailContent.js.map +1 -0
- package/dist/lib/emailDomainAutoLink.d.ts +27 -0
- package/dist/lib/emailDomainAutoLink.d.ts.map +1 -0
- package/dist/lib/emailDomainAutoLink.js +119 -0
- package/dist/lib/emailDomainAutoLink.js.map +1 -0
- package/dist/lib/ids.d.ts +13 -0
- package/dist/lib/ids.d.ts.map +1 -1
- package/dist/lib/ids.js +13 -0
- package/dist/lib/ids.js.map +1 -1
- package/dist/modules/activities/repository.d.ts.map +1 -1
- package/dist/modules/activities/repository.js +19 -20
- package/dist/modules/activities/repository.js.map +1 -1
- package/dist/modules/activities/wording.d.ts +12 -0
- package/dist/modules/activities/wording.d.ts.map +1 -1
- package/dist/modules/activities/wording.js +16 -0
- package/dist/modules/activities/wording.js.map +1 -1
- package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
- package/dist/modules/agent-tasks/catalog.js +62 -0
- package/dist/modules/agent-tasks/catalog.js.map +1 -1
- package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
- package/dist/modules/agent-tasks/resolve.js +42 -9
- package/dist/modules/agent-tasks/resolve.js.map +1 -1
- package/dist/modules/agent-tasks/routes.d.ts +2 -0
- package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
- package/dist/modules/attachedRecords.d.ts +6 -1
- package/dist/modules/attachedRecords.d.ts.map +1 -1
- package/dist/modules/attachedRecords.js +18 -2
- package/dist/modules/attachedRecords.js.map +1 -1
- package/dist/modules/auth/preferences.d.ts +11 -1
- package/dist/modules/auth/preferences.d.ts.map +1 -1
- package/dist/modules/auth/preferences.js +11 -0
- package/dist/modules/auth/preferences.js.map +1 -1
- package/dist/modules/auth/routes.d.ts.map +1 -1
- package/dist/modules/auth/routes.js +18 -0
- package/dist/modules/auth/routes.js.map +1 -1
- package/dist/modules/auth/schema.d.ts +20 -0
- package/dist/modules/auth/schema.d.ts.map +1 -1
- package/dist/modules/auth/schema.js +11 -1
- package/dist/modules/auth/schema.js.map +1 -1
- package/dist/modules/auth/service.d.ts.map +1 -1
- package/dist/modules/auth/service.js +27 -3
- package/dist/modules/auth/service.js.map +1 -1
- package/dist/modules/companies/index.d.ts.map +1 -1
- package/dist/modules/companies/index.js +3 -1
- package/dist/modules/companies/index.js.map +1 -1
- package/dist/modules/companies/repository.d.ts +2 -0
- package/dist/modules/companies/repository.d.ts.map +1 -1
- package/dist/modules/companies/repository.js +1 -0
- package/dist/modules/companies/repository.js.map +1 -1
- package/dist/modules/companies/routes.d.ts +16 -0
- package/dist/modules/companies/routes.d.ts.map +1 -1
- package/dist/modules/companies/routes.js +18 -0
- package/dist/modules/companies/routes.js.map +1 -1
- package/dist/modules/companies/schema.d.ts +37 -0
- package/dist/modules/companies/schema.d.ts.map +1 -1
- package/dist/modules/companies/schema.js +10 -1
- package/dist/modules/companies/schema.js.map +1 -1
- package/dist/modules/companies/service.d.ts +6 -0
- package/dist/modules/companies/service.d.ts.map +1 -1
- package/dist/modules/companies/service.js +45 -11
- package/dist/modules/companies/service.js.map +1 -1
- package/dist/modules/consent-purposes/capabilities.d.ts +7 -0
- package/dist/modules/consent-purposes/capabilities.d.ts.map +1 -0
- package/dist/modules/consent-purposes/capabilities.js +10 -0
- package/dist/modules/consent-purposes/capabilities.js.map +1 -0
- package/dist/modules/consent-purposes/events.d.ts +38 -0
- package/dist/modules/consent-purposes/events.d.ts.map +1 -0
- package/dist/modules/consent-purposes/events.js +17 -0
- package/dist/modules/consent-purposes/events.js.map +1 -0
- package/dist/modules/consent-purposes/index.d.ts +13 -0
- package/dist/modules/consent-purposes/index.d.ts.map +1 -0
- package/dist/modules/consent-purposes/index.js +41 -0
- package/dist/modules/consent-purposes/index.js.map +1 -0
- package/dist/modules/consent-purposes/repository.d.ts +21 -0
- package/dist/modules/consent-purposes/repository.d.ts.map +1 -0
- package/dist/modules/consent-purposes/repository.js +98 -0
- package/dist/modules/consent-purposes/repository.js.map +1 -0
- package/dist/modules/consent-purposes/routes.d.ts +39 -0
- package/dist/modules/consent-purposes/routes.d.ts.map +1 -0
- package/dist/modules/consent-purposes/routes.js +79 -0
- package/dist/modules/consent-purposes/routes.js.map +1 -0
- package/dist/modules/consent-purposes/schema.d.ts +175 -0
- package/dist/modules/consent-purposes/schema.d.ts.map +1 -0
- package/dist/modules/consent-purposes/schema.js +35 -0
- package/dist/modules/consent-purposes/schema.js.map +1 -0
- package/dist/modules/consent-purposes/service.d.ts +50 -0
- package/dist/modules/consent-purposes/service.d.ts.map +1 -0
- package/dist/modules/consent-purposes/service.js +263 -0
- package/dist/modules/consent-purposes/service.js.map +1 -0
- package/dist/modules/consent-purposes/starters.d.ts +17 -0
- package/dist/modules/consent-purposes/starters.d.ts.map +1 -0
- package/dist/modules/consent-purposes/starters.js +15 -0
- package/dist/modules/consent-purposes/starters.js.map +1 -0
- package/dist/modules/consent-purposes/tools.d.ts +4 -0
- package/dist/modules/consent-purposes/tools.d.ts.map +1 -0
- package/dist/modules/consent-purposes/tools.js +29 -0
- package/dist/modules/consent-purposes/tools.js.map +1 -0
- package/dist/modules/core.d.ts.map +1 -1
- package/dist/modules/core.js +21 -0
- package/dist/modules/core.js.map +1 -1
- package/dist/modules/custom-fields/capabilities.d.ts +12 -0
- package/dist/modules/custom-fields/capabilities.d.ts.map +1 -0
- package/dist/modules/custom-fields/capabilities.js +15 -0
- package/dist/modules/custom-fields/capabilities.js.map +1 -0
- package/dist/modules/custom-fields/events.d.ts +49 -0
- package/dist/modules/custom-fields/events.d.ts.map +1 -0
- package/dist/modules/custom-fields/events.js +25 -0
- package/dist/modules/custom-fields/events.js.map +1 -0
- package/dist/modules/custom-fields/index.d.ts +19 -0
- package/dist/modules/custom-fields/index.d.ts.map +1 -0
- package/dist/modules/custom-fields/index.js +46 -0
- package/dist/modules/custom-fields/index.js.map +1 -0
- package/dist/modules/custom-fields/repository.d.ts +37 -0
- package/dist/modules/custom-fields/repository.d.ts.map +1 -0
- package/dist/modules/custom-fields/repository.js +144 -0
- package/dist/modules/custom-fields/repository.js.map +1 -0
- package/dist/modules/custom-fields/routes.d.ts +44 -0
- package/dist/modules/custom-fields/routes.d.ts.map +1 -0
- package/dist/modules/custom-fields/routes.js +103 -0
- package/dist/modules/custom-fields/routes.js.map +1 -0
- package/dist/modules/custom-fields/schema.d.ts +215 -0
- package/dist/modules/custom-fields/schema.d.ts.map +1 -0
- package/dist/modules/custom-fields/schema.js +43 -0
- package/dist/modules/custom-fields/schema.js.map +1 -0
- package/dist/modules/custom-fields/service.d.ts +57 -0
- package/dist/modules/custom-fields/service.d.ts.map +1 -0
- package/dist/modules/custom-fields/service.js +273 -0
- package/dist/modules/custom-fields/service.js.map +1 -0
- package/dist/modules/custom-fields/tools.d.ts +4 -0
- package/dist/modules/custom-fields/tools.d.ts.map +1 -0
- package/dist/modules/custom-fields/tools.js +38 -0
- package/dist/modules/custom-fields/tools.js.map +1 -0
- package/dist/modules/custom-fields/values.d.ts +49 -0
- package/dist/modules/custom-fields/values.d.ts.map +1 -0
- package/dist/modules/custom-fields/values.js +249 -0
- package/dist/modules/custom-fields/values.js.map +1 -0
- package/dist/modules/custom-fields/wire.d.ts +12 -0
- package/dist/modules/custom-fields/wire.d.ts.map +1 -0
- package/dist/modules/custom-fields/wire.js +30 -0
- package/dist/modules/custom-fields/wire.js.map +1 -0
- package/dist/modules/dashboard/repository.d.ts.map +1 -1
- package/dist/modules/dashboard/repository.js +4 -3
- package/dist/modules/dashboard/repository.js.map +1 -1
- package/dist/modules/deals/index.d.ts +2 -1
- package/dist/modules/deals/index.d.ts.map +1 -1
- package/dist/modules/deals/index.js +5 -2
- package/dist/modules/deals/index.js.map +1 -1
- package/dist/modules/deals/repository.d.ts +0 -16
- package/dist/modules/deals/repository.d.ts.map +1 -1
- package/dist/modules/deals/repository.js +6 -76
- package/dist/modules/deals/repository.js.map +1 -1
- package/dist/modules/deals/routes.d.ts +14 -0
- package/dist/modules/deals/routes.d.ts.map +1 -1
- package/dist/modules/deals/routes.js +7 -0
- package/dist/modules/deals/routes.js.map +1 -1
- package/dist/modules/deals/schema.d.ts +20 -42
- package/dist/modules/deals/schema.d.ts.map +1 -1
- package/dist/modules/deals/schema.js +6 -11
- package/dist/modules/deals/schema.js.map +1 -1
- package/dist/modules/deals/service.d.ts +13 -2
- package/dist/modules/deals/service.d.ts.map +1 -1
- package/dist/modules/deals/service.js +43 -20
- package/dist/modules/deals/service.js.map +1 -1
- package/dist/modules/decisions/repository.d.ts.map +1 -1
- package/dist/modules/decisions/repository.js +2 -0
- package/dist/modules/decisions/repository.js.map +1 -1
- package/dist/modules/decisions/routes.d.ts +1 -0
- package/dist/modules/decisions/routes.d.ts.map +1 -1
- package/dist/modules/email-domain-linker/index.d.ts +12 -0
- package/dist/modules/email-domain-linker/index.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/index.js +34 -0
- package/dist/modules/email-domain-linker/index.js.map +1 -0
- package/dist/modules/email-domain-linker/routes.d.ts +14 -0
- package/dist/modules/email-domain-linker/routes.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/routes.js +15 -0
- package/dist/modules/email-domain-linker/routes.js.map +1 -0
- package/dist/modules/email-domain-linker/service.d.ts +37 -0
- package/dist/modules/email-domain-linker/service.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/service.js +63 -0
- package/dist/modules/email-domain-linker/service.js.map +1 -0
- package/dist/modules/enquiries/events.d.ts +44 -0
- package/dist/modules/enquiries/events.d.ts.map +1 -0
- package/dist/modules/enquiries/events.js +19 -0
- package/dist/modules/enquiries/events.js.map +1 -0
- package/dist/modules/enquiries/index.d.ts +13 -0
- package/dist/modules/enquiries/index.d.ts.map +1 -0
- package/dist/modules/enquiries/index.js +44 -0
- package/dist/modules/enquiries/index.js.map +1 -0
- package/dist/modules/enquiries/repository.d.ts +30 -0
- package/dist/modules/enquiries/repository.d.ts.map +1 -0
- package/dist/modules/enquiries/repository.js +94 -0
- package/dist/modules/enquiries/repository.js.map +1 -0
- package/dist/modules/enquiries/routes.d.ts +52 -0
- package/dist/modules/enquiries/routes.d.ts.map +1 -0
- package/dist/modules/enquiries/routes.js +127 -0
- package/dist/modules/enquiries/routes.js.map +1 -0
- package/dist/modules/enquiries/schema.d.ts +290 -0
- package/dist/modules/enquiries/schema.d.ts.map +1 -0
- package/dist/modules/enquiries/schema.js +52 -0
- package/dist/modules/enquiries/schema.js.map +1 -0
- package/dist/modules/enquiries/service.d.ts +85 -0
- package/dist/modules/enquiries/service.d.ts.map +1 -0
- package/dist/modules/enquiries/service.js +370 -0
- package/dist/modules/enquiries/service.js.map +1 -0
- package/dist/modules/enquiries/tools.d.ts +4 -0
- package/dist/modules/enquiries/tools.d.ts.map +1 -0
- package/dist/modules/enquiries/tools.js +50 -0
- package/dist/modules/enquiries/tools.js.map +1 -0
- package/dist/modules/eventCatalogs.d.ts +4 -0
- package/dist/modules/eventCatalogs.d.ts.map +1 -1
- package/dist/modules/eventCatalogs.js +4 -0
- package/dist/modules/eventCatalogs.js.map +1 -1
- package/dist/modules/forms/embed.d.ts +20 -6
- package/dist/modules/forms/embed.d.ts.map +1 -1
- package/dist/modules/forms/embed.js +359 -43
- package/dist/modules/forms/embed.js.map +1 -1
- package/dist/modules/forms/events.d.ts +20 -7
- package/dist/modules/forms/events.d.ts.map +1 -1
- package/dist/modules/forms/events.js +20 -2
- package/dist/modules/forms/events.js.map +1 -1
- package/dist/modules/forms/fields.d.ts +14 -1
- package/dist/modules/forms/fields.d.ts.map +1 -1
- package/dist/modules/forms/fields.js +87 -3
- package/dist/modules/forms/fields.js.map +1 -1
- package/dist/modules/forms/index.d.ts.map +1 -1
- package/dist/modules/forms/index.js +12 -1
- package/dist/modules/forms/index.js.map +1 -1
- package/dist/modules/forms/mapping.d.ts +62 -5
- package/dist/modules/forms/mapping.d.ts.map +1 -1
- package/dist/modules/forms/mapping.js +139 -5
- package/dist/modules/forms/mapping.js.map +1 -1
- package/dist/modules/forms/publicRoutes.d.ts.map +1 -1
- package/dist/modules/forms/publicRoutes.js +29 -1
- package/dist/modules/forms/publicRoutes.js.map +1 -1
- package/dist/modules/forms/repository.d.ts +31 -0
- package/dist/modules/forms/repository.d.ts.map +1 -1
- package/dist/modules/forms/repository.js +90 -1
- package/dist/modules/forms/repository.js.map +1 -1
- package/dist/modules/forms/routes.d.ts +83 -1
- package/dist/modules/forms/routes.d.ts.map +1 -1
- package/dist/modules/forms/routes.js +185 -2
- package/dist/modules/forms/routes.js.map +1 -1
- package/dist/modules/forms/schema.d.ts +672 -1
- package/dist/modules/forms/schema.d.ts.map +1 -1
- package/dist/modules/forms/schema.js +146 -3
- package/dist/modules/forms/schema.js.map +1 -1
- package/dist/modules/forms/service.d.ts +54 -1
- package/dist/modules/forms/service.d.ts.map +1 -1
- package/dist/modules/forms/service.js +338 -28
- package/dist/modules/forms/service.js.map +1 -1
- package/dist/modules/forms/submission.d.ts +15 -0
- package/dist/modules/forms/submission.d.ts.map +1 -1
- package/dist/modules/forms/submission.js +418 -40
- package/dist/modules/forms/submission.js.map +1 -1
- package/dist/modules/import-export/drafts.d.ts +10 -0
- package/dist/modules/import-export/drafts.d.ts.map +1 -1
- package/dist/modules/import-export/drafts.js +16 -2
- package/dist/modules/import-export/drafts.js.map +1 -1
- package/dist/modules/import-export/exportRows.d.ts +7 -4
- package/dist/modules/import-export/exportRows.d.ts.map +1 -1
- package/dist/modules/import-export/exportRows.js +20 -5
- package/dist/modules/import-export/exportRows.js.map +1 -1
- package/dist/modules/import-export/plan.d.ts +12 -1
- package/dist/modules/import-export/plan.d.ts.map +1 -1
- package/dist/modules/import-export/plan.js +29 -2
- package/dist/modules/import-export/plan.js.map +1 -1
- package/dist/modules/import-export/presets.d.ts.map +1 -1
- package/dist/modules/import-export/presets.js +10 -0
- package/dist/modules/import-export/presets.js.map +1 -1
- package/dist/modules/import-export/repository.d.ts +11 -1
- package/dist/modules/import-export/repository.d.ts.map +1 -1
- package/dist/modules/import-export/repository.js +42 -9
- package/dist/modules/import-export/repository.js.map +1 -1
- package/dist/modules/import-export/routes.d.ts.map +1 -1
- package/dist/modules/import-export/routes.js +4 -0
- package/dist/modules/import-export/routes.js.map +1 -1
- package/dist/modules/import-export/schema.d.ts +17 -0
- package/dist/modules/import-export/schema.d.ts.map +1 -1
- package/dist/modules/import-export/schema.js +11 -0
- package/dist/modules/import-export/schema.js.map +1 -1
- package/dist/modules/import-export/service.d.ts +6 -0
- package/dist/modules/import-export/service.d.ts.map +1 -1
- package/dist/modules/import-export/service.js +14 -2
- package/dist/modules/import-export/service.js.map +1 -1
- package/dist/modules/import-export/streams.d.ts.map +1 -1
- package/dist/modules/import-export/streams.js +3 -3
- package/dist/modules/import-export/streams.js.map +1 -1
- package/dist/modules/import-export/tools.d.ts.map +1 -1
- package/dist/modules/import-export/tools.js +8 -0
- package/dist/modules/import-export/tools.js.map +1 -1
- package/dist/modules/import-export/validation.d.ts.map +1 -1
- package/dist/modules/import-export/validation.js +22 -1
- package/dist/modules/import-export/validation.js.map +1 -1
- package/dist/modules/import-export/writes.d.ts.map +1 -1
- package/dist/modules/import-export/writes.js +37 -4
- package/dist/modules/import-export/writes.js.map +1 -1
- package/dist/modules/lists/events.d.ts +42 -0
- package/dist/modules/lists/events.d.ts.map +1 -0
- package/dist/modules/lists/events.js +16 -0
- package/dist/modules/lists/events.js.map +1 -0
- package/dist/modules/lists/index.d.ts +10 -0
- package/dist/modules/lists/index.d.ts.map +1 -0
- package/dist/modules/lists/index.js +35 -0
- package/dist/modules/lists/index.js.map +1 -0
- package/dist/modules/lists/repository.d.ts +80 -0
- package/dist/modules/lists/repository.d.ts.map +1 -0
- package/dist/modules/lists/repository.js +178 -0
- package/dist/modules/lists/repository.js.map +1 -0
- package/dist/modules/lists/routes.d.ts +55 -0
- package/dist/modules/lists/routes.d.ts.map +1 -0
- package/dist/modules/lists/routes.js +168 -0
- package/dist/modules/lists/routes.js.map +1 -0
- package/dist/modules/lists/schema.d.ts +281 -0
- package/dist/modules/lists/schema.d.ts.map +1 -0
- package/dist/modules/lists/schema.js +83 -0
- package/dist/modules/lists/schema.js.map +1 -0
- package/dist/modules/lists/service.d.ts +82 -0
- package/dist/modules/lists/service.d.ts.map +1 -0
- package/dist/modules/lists/service.js +262 -0
- package/dist/modules/lists/service.js.map +1 -0
- package/dist/modules/lists/tools.d.ts +4 -0
- package/dist/modules/lists/tools.d.ts.map +1 -0
- package/dist/modules/lists/tools.js +86 -0
- package/dist/modules/lists/tools.js.map +1 -0
- package/dist/modules/mcp/index.d.ts.map +1 -1
- package/dist/modules/mcp/index.js +5 -0
- package/dist/modules/mcp/index.js.map +1 -1
- package/dist/modules/notes/routes.d.ts +1 -0
- package/dist/modules/notes/routes.d.ts.map +1 -1
- package/dist/modules/opportunities/index.d.ts.map +1 -1
- package/dist/modules/opportunities/index.js +3 -1
- package/dist/modules/opportunities/index.js.map +1 -1
- package/dist/modules/opportunities/repository.d.ts +2 -0
- package/dist/modules/opportunities/repository.d.ts.map +1 -1
- package/dist/modules/opportunities/repository.js +4 -0
- package/dist/modules/opportunities/repository.js.map +1 -1
- package/dist/modules/opportunities/routes.d.ts +16 -0
- package/dist/modules/opportunities/routes.d.ts.map +1 -1
- package/dist/modules/opportunities/routes.js +13 -0
- package/dist/modules/opportunities/routes.js.map +1 -1
- package/dist/modules/opportunities/schema.d.ts +20 -0
- package/dist/modules/opportunities/schema.d.ts.map +1 -1
- package/dist/modules/opportunities/schema.js +6 -1
- package/dist/modules/opportunities/schema.js.map +1 -1
- package/dist/modules/opportunities/service.d.ts +20 -3
- package/dist/modules/opportunities/service.d.ts.map +1 -1
- package/dist/modules/opportunities/service.js +99 -18
- package/dist/modules/opportunities/service.js.map +1 -1
- package/dist/modules/opportunities/tools.d.ts.map +1 -1
- package/dist/modules/opportunities/tools.js +2 -0
- package/dist/modules/opportunities/tools.js.map +1 -1
- package/dist/modules/partnerships/index.d.ts.map +1 -1
- package/dist/modules/partnerships/index.js +3 -1
- package/dist/modules/partnerships/index.js.map +1 -1
- package/dist/modules/partnerships/repository.d.ts +0 -17
- package/dist/modules/partnerships/repository.d.ts.map +1 -1
- package/dist/modules/partnerships/repository.js +6 -82
- package/dist/modules/partnerships/repository.js.map +1 -1
- package/dist/modules/partnerships/routes.d.ts +14 -0
- package/dist/modules/partnerships/routes.d.ts.map +1 -1
- package/dist/modules/partnerships/routes.js +7 -0
- package/dist/modules/partnerships/routes.js.map +1 -1
- package/dist/modules/partnerships/schema.d.ts +20 -41
- package/dist/modules/partnerships/schema.d.ts.map +1 -1
- package/dist/modules/partnerships/schema.js +6 -10
- package/dist/modules/partnerships/schema.js.map +1 -1
- package/dist/modules/partnerships/service.d.ts +11 -1
- package/dist/modules/partnerships/service.d.ts.map +1 -1
- package/dist/modules/partnerships/service.js +43 -20
- package/dist/modules/partnerships/service.js.map +1 -1
- package/dist/modules/people/consentHydration.d.ts +26 -0
- package/dist/modules/people/consentHydration.d.ts.map +1 -0
- package/dist/modules/people/consentHydration.js +100 -0
- package/dist/modules/people/consentHydration.js.map +1 -0
- package/dist/modules/people/index.d.ts.map +1 -1
- package/dist/modules/people/index.js +3 -1
- package/dist/modules/people/index.js.map +1 -1
- package/dist/modules/people/personConsentWrites.d.ts +40 -0
- package/dist/modules/people/personConsentWrites.d.ts.map +1 -0
- package/dist/modules/people/personConsentWrites.js +98 -0
- package/dist/modules/people/personConsentWrites.js.map +1 -0
- package/dist/modules/people/repository.d.ts +11 -0
- package/dist/modules/people/repository.d.ts.map +1 -1
- package/dist/modules/people/repository.js +21 -1
- package/dist/modules/people/repository.js.map +1 -1
- package/dist/modules/people/routes.d.ts +57 -4
- package/dist/modules/people/routes.d.ts.map +1 -1
- package/dist/modules/people/routes.js +104 -5
- package/dist/modules/people/routes.js.map +1 -1
- package/dist/modules/people/schema.d.ts +366 -1
- package/dist/modules/people/schema.d.ts.map +1 -1
- package/dist/modules/people/schema.js +92 -2
- package/dist/modules/people/schema.js.map +1 -1
- package/dist/modules/people/service.d.ts +30 -1
- package/dist/modules/people/service.d.ts.map +1 -1
- package/dist/modules/people/service.js +131 -36
- package/dist/modules/people/service.js.map +1 -1
- package/dist/modules/people/tools.d.ts.map +1 -1
- package/dist/modules/people/tools.js +4 -1
- package/dist/modules/people/tools.js.map +1 -1
- package/dist/modules/personLinks.d.ts +79 -0
- package/dist/modules/personLinks.d.ts.map +1 -0
- package/dist/modules/personLinks.js +155 -0
- package/dist/modules/personLinks.js.map +1 -0
- package/dist/modules/pipelines/routes.d.ts +1 -0
- package/dist/modules/pipelines/routes.d.ts.map +1 -1
- package/dist/modules/plans/routes.d.ts +1 -0
- package/dist/modules/plans/routes.d.ts.map +1 -1
- package/dist/modules/positions/routes.d.ts.map +1 -1
- package/dist/modules/positions/routes.js +4 -2
- package/dist/modules/positions/routes.js.map +1 -1
- package/dist/modules/raises/index.d.ts.map +1 -1
- package/dist/modules/raises/index.js +3 -1
- package/dist/modules/raises/index.js.map +1 -1
- package/dist/modules/raises/repository.d.ts +0 -17
- package/dist/modules/raises/repository.d.ts.map +1 -1
- package/dist/modules/raises/repository.js +6 -77
- package/dist/modules/raises/repository.js.map +1 -1
- package/dist/modules/raises/routes.d.ts +14 -0
- package/dist/modules/raises/routes.d.ts.map +1 -1
- package/dist/modules/raises/routes.js +7 -0
- package/dist/modules/raises/routes.js.map +1 -1
- package/dist/modules/raises/schema.d.ts +20 -41
- package/dist/modules/raises/schema.d.ts.map +1 -1
- package/dist/modules/raises/schema.js +6 -10
- package/dist/modules/raises/schema.js.map +1 -1
- package/dist/modules/raises/service.d.ts +11 -1
- package/dist/modules/raises/service.d.ts.map +1 -1
- package/dist/modules/raises/service.js +41 -18
- package/dist/modules/raises/service.js.map +1 -1
- package/dist/modules/recordTargets.d.ts.map +1 -1
- package/dist/modules/recordTargets.js +2 -0
- package/dist/modules/recordTargets.js.map +1 -1
- package/dist/modules/references.d.ts +10 -0
- package/dist/modules/references.d.ts.map +1 -1
- package/dist/modules/references.js +27 -4
- package/dist/modules/references.js.map +1 -1
- package/dist/modules/sample-data/fixture.d.ts +160 -0
- package/dist/modules/sample-data/fixture.d.ts.map +1 -0
- package/dist/modules/sample-data/fixture.js +501 -0
- package/dist/modules/sample-data/fixture.js.map +1 -0
- package/dist/modules/sample-data/index.d.ts +11 -0
- package/dist/modules/sample-data/index.d.ts.map +1 -0
- package/dist/modules/sample-data/index.js +44 -0
- package/dist/modules/sample-data/index.js.map +1 -0
- package/dist/modules/sample-data/routes.d.ts +15 -0
- package/dist/modules/sample-data/routes.d.ts.map +1 -0
- package/dist/modules/sample-data/routes.js +25 -0
- package/dist/modules/sample-data/routes.js.map +1 -0
- package/dist/modules/sample-data/service.d.ts +39 -0
- package/dist/modules/sample-data/service.d.ts.map +1 -0
- package/dist/modules/sample-data/service.js +481 -0
- package/dist/modules/sample-data/service.js.map +1 -0
- package/dist/modules/sample-data/tools.d.ts +4 -0
- package/dist/modules/sample-data/tools.d.ts.map +1 -0
- package/dist/modules/sample-data/tools.js +22 -0
- package/dist/modules/sample-data/tools.js.map +1 -0
- package/dist/modules/search/index.d.ts +1 -1
- package/dist/modules/search/index.d.ts.map +1 -1
- package/dist/modules/search/index.js +2 -1
- package/dist/modules/search/index.js.map +1 -1
- package/dist/modules/search/repository.d.ts +1 -0
- package/dist/modules/search/repository.d.ts.map +1 -1
- package/dist/modules/search/repository.js +23 -0
- package/dist/modules/search/repository.js.map +1 -1
- package/dist/modules/search/service.d.ts +3 -3
- package/dist/modules/search/service.d.ts.map +1 -1
- package/dist/modules/search/service.js +5 -4
- package/dist/modules/search/service.js.map +1 -1
- package/dist/modules/smtp-email/index.d.ts +1 -0
- package/dist/modules/smtp-email/index.d.ts.map +1 -1
- package/dist/modules/smtp-email/index.js +1 -0
- package/dist/modules/smtp-email/index.js.map +1 -1
- package/dist/modules/stagedRecords.d.ts +3 -3
- package/dist/modules/stagedRecords.d.ts.map +1 -1
- package/dist/modules/stagedRecords.js +9 -0
- package/dist/modules/stagedRecords.js.map +1 -1
- package/dist/modules/webhooks/payloads.d.ts.map +1 -1
- package/dist/modules/webhooks/payloads.js +15 -2
- package/dist/modules/webhooks/payloads.js.map +1 -1
- package/dist/modules/workspace/repository.d.ts +2 -0
- package/dist/modules/workspace/repository.d.ts.map +1 -1
- package/dist/modules/workspace/repository.js +7 -0
- package/dist/modules/workspace/repository.js.map +1 -1
- package/dist/modules/workspace/service.d.ts.map +1 -1
- package/dist/modules/workspace/service.js +20 -1
- package/dist/modules/workspace/service.js.map +1 -1
- package/dist/modules/workspace/starters.d.ts.map +1 -1
- package/dist/modules/workspace/starters.js +5 -0
- package/dist/modules/workspace/starters.js.map +1 -1
- package/dist/runtime/events.d.ts +1 -1
- package/dist/runtime/events.d.ts.map +1 -1
- package/dist/runtime/events.js +1 -0
- package/dist/runtime/events.js.map +1 -1
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +4 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/testing/database.d.ts +5 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +81 -10
- package/dist/testing/database.js.map +1 -1
- package/migrations/0021_certain_maggott.sql +30 -0
- package/migrations/0022_stormy_manta.sql +1 -0
- package/migrations/0023_funny_maddog.sql +1 -0
- package/migrations/0024_third_king_cobra.sql +46 -0
- package/migrations/0025_worthless_chimera.sql +3 -0
- package/migrations/0026_late_aqueduct.sql +46 -0
- package/migrations/0027_brainy_silver_sable.sql +3 -0
- package/migrations/0028_freezing_scrambler.sql +19 -0
- package/migrations/0029_custom_fields.sql +26 -0
- package/migrations/0030_enquiries.sql +79 -0
- package/migrations/0031_consent.sql +45 -0
- package/migrations/0032_form_field_statement.sql +1 -0
- package/migrations/0033_form_field_consent_purpose_ids.sql +5 -0
- package/migrations/0034_drop_form_field_consent_purpose_id.sql +1 -0
- package/migrations/0035_form_field_consent_purpose_labels.sql +1 -0
- package/migrations/0036_form_field_notice_type.sql +2 -0
- package/migrations/meta/0021_snapshot.json +5389 -0
- package/migrations/meta/0022_snapshot.json +5396 -0
- package/migrations/meta/0023_snapshot.json +5403 -0
- package/migrations/meta/0024_snapshot.json +5516 -0
- package/migrations/meta/0025_snapshot.json +5336 -0
- package/migrations/meta/0026_snapshot.json +5710 -0
- package/migrations/meta/0027_snapshot.json +5716 -0
- package/migrations/meta/0028_snapshot.json +5740 -0
- package/migrations/meta/0029_snapshot.json +5935 -0
- package/migrations/meta/0030_snapshot.json +6245 -0
- package/migrations/meta/0031_snapshot.json +6572 -0
- package/migrations/meta/0032_snapshot.json +6578 -0
- package/migrations/meta/0033_snapshot.json +6572 -0
- package/migrations/meta/0034_snapshot.json +6566 -0
- package/migrations/meta/0035_snapshot.json +6573 -0
- package/migrations/meta/0036_snapshot.json +6573 -0
- package/migrations/meta/_journal.json +112 -0
- package/package.json +3 -2
- package/src/lib/consumerEmailDomains.ts +62 -0
- package/src/lib/email.ts +7 -0
- package/src/lib/emailContent.ts +91 -0
- package/src/lib/emailDomainAutoLink.ts +165 -0
- package/src/lib/ids.ts +13 -0
- package/src/modules/activities/repository.ts +22 -23
- package/src/modules/activities/wording.ts +18 -0
- package/src/modules/agent-tasks/catalog.ts +63 -0
- package/src/modules/agent-tasks/resolve.ts +64 -24
- package/src/modules/attachedRecords.ts +37 -3
- package/src/modules/auth/preferences.ts +13 -1
- package/src/modules/auth/routes.ts +22 -0
- package/src/modules/auth/schema.ts +12 -2
- package/src/modules/auth/service.ts +37 -3
- package/src/modules/companies/index.ts +3 -1
- package/src/modules/companies/repository.ts +3 -0
- package/src/modules/companies/routes.ts +20 -0
- package/src/modules/companies/schema.ts +11 -1
- package/src/modules/companies/service.ts +72 -12
- package/src/modules/consent-purposes/capabilities.ts +12 -0
- package/src/modules/consent-purposes/events.ts +38 -0
- package/src/modules/consent-purposes/index.ts +48 -0
- package/src/modules/consent-purposes/repository.ts +163 -0
- package/src/modules/consent-purposes/routes.ts +122 -0
- package/src/modules/consent-purposes/schema.ts +46 -0
- package/src/modules/consent-purposes/service.ts +423 -0
- package/src/modules/consent-purposes/starters.ts +32 -0
- package/src/modules/consent-purposes/tools.ts +44 -0
- package/src/modules/core.ts +21 -0
- package/src/modules/custom-fields/capabilities.ts +17 -0
- package/src/modules/custom-fields/events.ts +51 -0
- package/src/modules/custom-fields/index.ts +61 -0
- package/src/modules/custom-fields/repository.ts +225 -0
- package/src/modules/custom-fields/routes.ts +155 -0
- package/src/modules/custom-fields/schema.ts +61 -0
- package/src/modules/custom-fields/service.ts +439 -0
- package/src/modules/custom-fields/tools.ts +53 -0
- package/src/modules/custom-fields/values.ts +352 -0
- package/src/modules/custom-fields/wire.ts +32 -0
- package/src/modules/dashboard/repository.ts +4 -3
- package/src/modules/deals/index.ts +5 -2
- package/src/modules/deals/repository.ts +6 -106
- package/src/modules/deals/routes.ts +7 -0
- package/src/modules/deals/schema.ts +7 -15
- package/src/modules/deals/service.ts +92 -23
- package/src/modules/decisions/repository.ts +2 -0
- package/src/modules/email-domain-linker/index.ts +40 -0
- package/src/modules/email-domain-linker/routes.ts +40 -0
- package/src/modules/email-domain-linker/service.ts +122 -0
- package/src/modules/enquiries/events.ts +45 -0
- package/src/modules/enquiries/index.ts +50 -0
- package/src/modules/enquiries/repository.ts +164 -0
- package/src/modules/enquiries/routes.ts +172 -0
- package/src/modules/enquiries/schema.ts +59 -0
- package/src/modules/enquiries/service.ts +644 -0
- package/src/modules/enquiries/tools.ts +66 -0
- package/src/modules/eventCatalogs.ts +4 -0
- package/src/modules/forms/embed.ts +391 -44
- package/src/modules/forms/events.ts +30 -2
- package/src/modules/forms/fields.ts +102 -2
- package/src/modules/forms/index.ts +12 -1
- package/src/modules/forms/mapping.ts +183 -6
- package/src/modules/forms/publicRoutes.ts +43 -1
- package/src/modules/forms/repository.ts +162 -1
- package/src/modules/forms/routes.ts +212 -2
- package/src/modules/forms/schema.ts +166 -4
- package/src/modules/forms/service.ts +565 -41
- package/src/modules/forms/submission.ts +718 -44
- package/src/modules/import-export/drafts.ts +20 -1
- package/src/modules/import-export/exportRows.ts +21 -5
- package/src/modules/import-export/plan.ts +47 -2
- package/src/modules/import-export/presets.ts +10 -0
- package/src/modules/import-export/repository.ts +73 -8
- package/src/modules/import-export/routes.ts +4 -0
- package/src/modules/import-export/schema.ts +11 -0
- package/src/modules/import-export/service.ts +28 -2
- package/src/modules/import-export/streams.ts +3 -1
- package/src/modules/import-export/tools.ts +10 -0
- package/src/modules/import-export/validation.ts +28 -0
- package/src/modules/import-export/writes.ts +70 -5
- package/src/modules/lists/events.ts +41 -0
- package/src/modules/lists/index.ts +41 -0
- package/src/modules/lists/repository.ts +343 -0
- package/src/modules/lists/routes.ts +255 -0
- package/src/modules/lists/schema.ts +95 -0
- package/src/modules/lists/service.ts +505 -0
- package/src/modules/lists/tools.ts +128 -0
- package/src/modules/mcp/index.ts +5 -0
- package/src/modules/opportunities/index.ts +3 -1
- package/src/modules/opportunities/repository.ts +11 -0
- package/src/modules/opportunities/routes.ts +13 -0
- package/src/modules/opportunities/schema.ts +7 -1
- package/src/modules/opportunities/service.ts +188 -22
- package/src/modules/opportunities/tools.ts +2 -0
- package/src/modules/partnerships/index.ts +3 -1
- package/src/modules/partnerships/repository.ts +6 -117
- package/src/modules/partnerships/routes.ts +7 -0
- package/src/modules/partnerships/schema.ts +7 -14
- package/src/modules/partnerships/service.ts +93 -22
- package/src/modules/people/consentHydration.ts +167 -0
- package/src/modules/people/index.ts +3 -1
- package/src/modules/people/personConsentWrites.ts +177 -0
- package/src/modules/people/repository.ts +31 -0
- package/src/modules/people/routes.ts +127 -18
- package/src/modules/people/schema.ts +109 -3
- package/src/modules/people/service.ts +205 -39
- package/src/modules/people/tools.ts +5 -1
- package/src/modules/personLinks.ts +278 -0
- package/src/modules/positions/routes.ts +4 -2
- package/src/modules/raises/index.ts +3 -1
- package/src/modules/raises/repository.ts +6 -107
- package/src/modules/raises/routes.ts +7 -0
- package/src/modules/raises/schema.ts +7 -14
- package/src/modules/raises/service.ts +91 -20
- package/src/modules/recordTargets.ts +2 -0
- package/src/modules/references.ts +43 -4
- package/src/modules/sample-data/fixture.ts +690 -0
- package/src/modules/sample-data/index.ts +51 -0
- package/src/modules/sample-data/routes.ts +50 -0
- package/src/modules/sample-data/service.ts +679 -0
- package/src/modules/sample-data/tools.ts +32 -0
- package/src/modules/search/index.ts +2 -1
- package/src/modules/search/repository.ts +33 -1
- package/src/modules/search/service.ts +7 -5
- package/src/modules/smtp-email/index.ts +8 -1
- package/src/modules/stagedRecords.ts +18 -3
- package/src/modules/webhooks/payloads.ts +20 -2
- package/src/modules/workspace/repository.ts +12 -0
- package/src/modules/workspace/service.ts +27 -1
- package/src/modules/workspace/starters.ts +5 -0
- package/src/runtime/events.ts +1 -0
- package/src/schema/index.ts +4 -0
- package/src/testing/database.ts +97 -11
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
import type { CustomFieldWireValue } from '@kelpie/schemas'
|
|
2
|
+
|
|
3
|
+
import { changedKeys } from '../../lib/changes.ts'
|
|
4
|
+
import type { Database } from '../../lib/database.ts'
|
|
5
|
+
import { AppError } from '../../lib/errors.ts'
|
|
6
|
+
import type { IdFactory } from '../../lib/ids.ts'
|
|
7
|
+
import { readListWindow, toPage } from '../../lib/pagination.ts'
|
|
8
|
+
import type { ListQueryParameters, Page } from '../../lib/pagination.ts'
|
|
9
|
+
import type { TransactionScope } from '../../runtime/transaction.ts'
|
|
10
|
+
import type { ActivityRecorder } from '../activities/recorder.ts'
|
|
11
|
+
import {
|
|
12
|
+
describeConversion,
|
|
13
|
+
describeCreation,
|
|
14
|
+
describeCreationFrom,
|
|
15
|
+
describeLink,
|
|
16
|
+
describeStageChange,
|
|
17
|
+
describeUnlink,
|
|
18
|
+
describeUpdate,
|
|
19
|
+
} from '../activities/wording.ts'
|
|
20
|
+
import type { FieldLabels } from '../activities/wording.ts'
|
|
21
|
+
import { toEventActor } from '../../lib/actor.ts'
|
|
22
|
+
import type { Actor } from '../auth/actor.ts'
|
|
23
|
+
import { actorMemberId, requireWorkspaceId } from '../auth/actor.ts'
|
|
24
|
+
import './events.ts'
|
|
25
|
+
import '../deals/events.ts'
|
|
26
|
+
import { deleteRecordsAttachedTo } from '../attachedRecords.ts'
|
|
27
|
+
import * as companyRepository from '../companies/repository.ts'
|
|
28
|
+
import type { CustomFieldValuesValidator } from '../custom-fields/values.ts'
|
|
29
|
+
import * as dealRepository from '../deals/repository.ts'
|
|
30
|
+
import type { DealRecord } from '../deals/repository.ts'
|
|
31
|
+
import * as personLinks from '../personLinks.ts'
|
|
32
|
+
import * as pipelineRepository from '../pipelines/repository.ts'
|
|
33
|
+
import type { PipelineStageRecord } from '../pipelines/repository.ts'
|
|
34
|
+
import * as repository from './repository.ts'
|
|
35
|
+
import { DEFAULT_ENQUIRY_SORT, ENQUIRY_SORTS } from './repository.ts'
|
|
36
|
+
import type { EnquiryFilters, EnquiryRecord } from './repository.ts'
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Enquiries: the top-of-funnel pipeline. Inbound requests that may become a
|
|
40
|
+
* Deal once qualified. People attach through `person_links`; company is
|
|
41
|
+
* optional (some enquiries arrive before a company is on file).
|
|
42
|
+
*
|
|
43
|
+
* A stage move is an ordinary PATCH of `stage_id`, and it is the one change
|
|
44
|
+
* that files a `stage_changed` activity and a `stage.changed` event instead of
|
|
45
|
+
* the generic update pair.
|
|
46
|
+
*
|
|
47
|
+
* The one non-CRUD action is `convertToDeal`, which is what
|
|
48
|
+
* `POST /v1/enquiries/:id/convert` calls: it inserts a new deal, copies the
|
|
49
|
+
* enquiry's people to it, sets `convertedDealId`, and moves the enquiry to
|
|
50
|
+
* its first closed stage.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
export interface EnquiriesDependencies {
|
|
54
|
+
readonly db: Database
|
|
55
|
+
readonly transaction: TransactionScope
|
|
56
|
+
readonly createId: IdFactory
|
|
57
|
+
readonly now: () => Date
|
|
58
|
+
readonly recordActivity: ActivityRecorder
|
|
59
|
+
readonly customFields: CustomFieldValuesValidator
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** What a changed column is called on a timeline. */
|
|
63
|
+
const ENQUIRY_FIELD_LABELS: FieldLabels = {
|
|
64
|
+
name: 'Name',
|
|
65
|
+
source: 'Source',
|
|
66
|
+
companyId: 'Company',
|
|
67
|
+
ownerId: 'Owner',
|
|
68
|
+
summary: 'Summary',
|
|
69
|
+
tags: 'Tags',
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** An enquiry as the API returns one: the stored row minus tenancy, plus its people. */
|
|
73
|
+
export type EnquiryView = Omit<EnquiryRecord, 'workspaceId'> & {
|
|
74
|
+
readonly personIds: readonly string[]
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface CreateEnquiryInput {
|
|
78
|
+
readonly name: string
|
|
79
|
+
/** Free text ("Website", "Email", "Referral"). Empty means unclassified. */
|
|
80
|
+
readonly source: string
|
|
81
|
+
/** Absent means the pipeline's default stage: the first open one. */
|
|
82
|
+
readonly stageId: string | undefined
|
|
83
|
+
readonly companyId: string | null
|
|
84
|
+
/** Absent means the caller: the member creating an enquiry starts as its owner. */
|
|
85
|
+
readonly ownerId: string | null | undefined
|
|
86
|
+
readonly personIds: readonly string[]
|
|
87
|
+
readonly summary: string
|
|
88
|
+
readonly tags: readonly string[]
|
|
89
|
+
/** Wire shape for a create body: `null` values are ignored, non-null are validated. */
|
|
90
|
+
readonly customFields: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** PATCH semantics: an absent field is left alone, and null clears a nullable one. */
|
|
94
|
+
export interface UpdateEnquiryInput {
|
|
95
|
+
readonly name?: string | undefined
|
|
96
|
+
readonly source?: string | undefined
|
|
97
|
+
readonly stageId?: string | undefined
|
|
98
|
+
readonly companyId?: string | null | undefined
|
|
99
|
+
readonly ownerId?: string | null | undefined
|
|
100
|
+
/** Replaces the set. The service works out who was added and who left. */
|
|
101
|
+
readonly personIds?: readonly string[] | undefined
|
|
102
|
+
readonly summary?: string | undefined
|
|
103
|
+
readonly tags?: readonly string[] | undefined
|
|
104
|
+
/**
|
|
105
|
+
* Partial merge patch (wire shape): sent keys change, `null` clears a key,
|
|
106
|
+
* absent keys are left alone. Unknown keys are `422`.
|
|
107
|
+
*/
|
|
108
|
+
readonly customFields?: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** What `convertToDeal` returns: the freshly created deal, plus its people. */
|
|
112
|
+
export interface ConvertedDealView {
|
|
113
|
+
readonly deal: DealRecord
|
|
114
|
+
readonly personIds: readonly string[]
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface EnquiriesService {
|
|
118
|
+
list(
|
|
119
|
+
actor: Actor,
|
|
120
|
+
filters: EnquiryFilters,
|
|
121
|
+
query: ListQueryParameters,
|
|
122
|
+
): Promise<Page<EnquiryView>>
|
|
123
|
+
get(actor: Actor, id: string): Promise<EnquiryView>
|
|
124
|
+
create(actor: Actor, input: CreateEnquiryInput): Promise<EnquiryView>
|
|
125
|
+
update(actor: Actor, id: string, changes: UpdateEnquiryInput): Promise<EnquiryView>
|
|
126
|
+
remove(actor: Actor, id: string): Promise<void>
|
|
127
|
+
convertToDeal(actor: Actor, id: string): Promise<ConvertedDealView>
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function toView(record: EnquiryRecord, personIds: readonly string[]): EnquiryView {
|
|
131
|
+
const { workspaceId: _workspaceId, ...view } = record
|
|
132
|
+
|
|
133
|
+
return { ...view, personIds }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function toStoredColumns(input: UpdateEnquiryInput): Partial<repository.EnquiryColumns> {
|
|
137
|
+
return {
|
|
138
|
+
...(input.name === undefined ? {} : { name: input.name }),
|
|
139
|
+
...(input.source === undefined ? {} : { source: input.source }),
|
|
140
|
+
...(input.stageId === undefined ? {} : { stageId: input.stageId }),
|
|
141
|
+
...(input.companyId === undefined ? {} : { companyId: input.companyId }),
|
|
142
|
+
...(input.ownerId === undefined ? {} : { ownerId: input.ownerId }),
|
|
143
|
+
...(input.summary === undefined ? {} : { summary: input.summary }),
|
|
144
|
+
...(input.tags === undefined ? {} : { tags: [...input.tags] }),
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function createEnquiriesService(dependencies: EnquiriesDependencies): EnquiriesService {
|
|
149
|
+
async function require(workspaceId: string, id: string): Promise<EnquiryRecord> {
|
|
150
|
+
const enquiry = await repository.findEnquiry(dependencies.db, workspaceId, id)
|
|
151
|
+
|
|
152
|
+
if (enquiry === undefined) {
|
|
153
|
+
throw AppError.notFound('Enquiry not found')
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return enquiry
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async function requireCompany(workspaceId: string, companyId: string): Promise<void> {
|
|
160
|
+
const company = await companyRepository.findCompany(dependencies.db, workspaceId, companyId)
|
|
161
|
+
|
|
162
|
+
if (company === undefined) {
|
|
163
|
+
throw AppError.notFound('Company not found')
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* A stage an enquiry may sit in: exists in this workspace and belongs to the
|
|
169
|
+
* enquiry pipeline. The wrong-workspace case reads as missing; the
|
|
170
|
+
* wrong-pipeline case is a request naming a real stage that can never hold an
|
|
171
|
+
* enquiry, which is a validation error rather than a missing record.
|
|
172
|
+
*/
|
|
173
|
+
async function requireEnquiryStage(
|
|
174
|
+
workspaceId: string,
|
|
175
|
+
stageId: string,
|
|
176
|
+
): Promise<PipelineStageRecord> {
|
|
177
|
+
const stage = await pipelineRepository.findStage(dependencies.db, workspaceId, stageId)
|
|
178
|
+
|
|
179
|
+
if (stage === undefined) {
|
|
180
|
+
throw AppError.notFound('Pipeline stage not found')
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (stage.kind !== 'enquiry') {
|
|
184
|
+
throw AppError.validationFailed('That stage is not part of the enquiry pipeline', [
|
|
185
|
+
{ field: 'stage_id', message: `It belongs to the ${stage.kind} pipeline` },
|
|
186
|
+
])
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return stage
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** The default stage for a new enquiry: the first open one, or the first if none are open. */
|
|
193
|
+
async function defaultEnquiryStage(workspaceId: string): Promise<PipelineStageRecord> {
|
|
194
|
+
const rows = await pipelineRepository.listStagesOfKind(
|
|
195
|
+
dependencies.db,
|
|
196
|
+
workspaceId,
|
|
197
|
+
'enquiry',
|
|
198
|
+
)
|
|
199
|
+
const first = rows.find((row) => row.open) ?? rows[0]
|
|
200
|
+
|
|
201
|
+
if (first === undefined) {
|
|
202
|
+
// Unreachable through the API: workspaces seed stages and the last stage
|
|
203
|
+
// of a pipeline cannot be removed.
|
|
204
|
+
throw AppError.conflict('This workspace has no enquiry stages')
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return first
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function requireOwner(workspaceId: string, ownerId: string): Promise<void> {
|
|
211
|
+
if (!(await repository.memberExists(dependencies.db, workspaceId, ownerId))) {
|
|
212
|
+
throw AppError.notFound('Team member not found')
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** @returns Each person's name, for the link activities. Any id missing here is a 404. */
|
|
217
|
+
async function requirePeople(
|
|
218
|
+
workspaceId: string,
|
|
219
|
+
personIds: readonly string[],
|
|
220
|
+
): Promise<ReadonlyMap<string, string>> {
|
|
221
|
+
const named = await personLinks.findPeopleNamed(dependencies.db, workspaceId, personIds)
|
|
222
|
+
const missing = personIds.filter((id) => !named.has(id))
|
|
223
|
+
|
|
224
|
+
if (missing.length > 0) {
|
|
225
|
+
throw new AppError(
|
|
226
|
+
'not_found',
|
|
227
|
+
'Person not found',
|
|
228
|
+
missing.map((id) => ({ field: 'person_ids', message: `No person ${id} here` })),
|
|
229
|
+
)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return named
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function toViews(
|
|
236
|
+
workspaceId: string,
|
|
237
|
+
records: readonly EnquiryRecord[],
|
|
238
|
+
): Promise<EnquiryView[]> {
|
|
239
|
+
const peopleByEnquiry = await personLinks.listPersonIdsFor(
|
|
240
|
+
dependencies.db,
|
|
241
|
+
workspaceId,
|
|
242
|
+
'enquiry',
|
|
243
|
+
records.map((record) => record.id),
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
return records.map((record) => toView(record, peopleByEnquiry.get(record.id) ?? []))
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return {
|
|
250
|
+
async list(actor, filters, query) {
|
|
251
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
252
|
+
const window = readListWindow(query, ENQUIRY_SORTS, DEFAULT_ENQUIRY_SORT)
|
|
253
|
+
const rows = await repository.listEnquiries(dependencies.db, workspaceId, filters, window)
|
|
254
|
+
const page = toPage(rows, window, (enquiry) => enquiry.id)
|
|
255
|
+
|
|
256
|
+
return { items: await toViews(workspaceId, page.items), nextCursor: page.nextCursor }
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
async get(actor, id) {
|
|
260
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
261
|
+
const enquiry = await require(workspaceId, id)
|
|
262
|
+
|
|
263
|
+
return toView(
|
|
264
|
+
enquiry,
|
|
265
|
+
await personLinks.listPersonIds(dependencies.db, workspaceId, {
|
|
266
|
+
targetType: 'enquiry',
|
|
267
|
+
targetId: id,
|
|
268
|
+
}),
|
|
269
|
+
)
|
|
270
|
+
},
|
|
271
|
+
|
|
272
|
+
async create(actor, input) {
|
|
273
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
274
|
+
|
|
275
|
+
if (input.companyId !== null) {
|
|
276
|
+
await requireCompany(workspaceId, input.companyId)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const stage =
|
|
280
|
+
input.stageId === undefined
|
|
281
|
+
? await defaultEnquiryStage(workspaceId)
|
|
282
|
+
: await requireEnquiryStage(workspaceId, input.stageId)
|
|
283
|
+
const ownerId = input.ownerId === undefined ? actorMemberId(actor) : input.ownerId
|
|
284
|
+
|
|
285
|
+
if (ownerId !== null) {
|
|
286
|
+
await requireOwner(workspaceId, ownerId)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const personIds = [...new Set(input.personIds)]
|
|
290
|
+
const named = await requirePeople(workspaceId, personIds)
|
|
291
|
+
const id = dependencies.createId('enquiry')
|
|
292
|
+
|
|
293
|
+
return dependencies.transaction(async ({ tx, events }) => {
|
|
294
|
+
const customFields = await dependencies.customFields.forCreate(
|
|
295
|
+
tx,
|
|
296
|
+
workspaceId,
|
|
297
|
+
'enquiry',
|
|
298
|
+
input.customFields,
|
|
299
|
+
)
|
|
300
|
+
const created = await repository.insertEnquiry(tx, {
|
|
301
|
+
id,
|
|
302
|
+
workspaceId,
|
|
303
|
+
name: input.name,
|
|
304
|
+
source: input.source,
|
|
305
|
+
stageId: stage.id,
|
|
306
|
+
companyId: input.companyId,
|
|
307
|
+
ownerId,
|
|
308
|
+
convertedDealId: null,
|
|
309
|
+
summary: input.summary,
|
|
310
|
+
tags: [...input.tags],
|
|
311
|
+
customFields,
|
|
312
|
+
})
|
|
313
|
+
|
|
314
|
+
await personLinks.linkPeople(
|
|
315
|
+
tx,
|
|
316
|
+
dependencies.createId,
|
|
317
|
+
workspaceId,
|
|
318
|
+
{ targetType: 'enquiry', targetId: id },
|
|
319
|
+
personIds,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
323
|
+
targetType: 'enquiry',
|
|
324
|
+
targetId: id,
|
|
325
|
+
kind: 'created',
|
|
326
|
+
...describeCreation('Enquiry'),
|
|
327
|
+
})
|
|
328
|
+
|
|
329
|
+
for (const personId of personIds) {
|
|
330
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
331
|
+
targetType: 'enquiry',
|
|
332
|
+
targetId: id,
|
|
333
|
+
kind: 'linked',
|
|
334
|
+
...describeLink('person', named.get(personId) ?? personId),
|
|
335
|
+
})
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
events.emit('enquiries.enquiry.created', { type: 'enquiry', id }, {})
|
|
339
|
+
|
|
340
|
+
return toView(created, personIds)
|
|
341
|
+
}, { workspaceId, actor: toEventActor(actor) })
|
|
342
|
+
},
|
|
343
|
+
|
|
344
|
+
async update(actor, id, changes) {
|
|
345
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
346
|
+
const existing = await require(workspaceId, id)
|
|
347
|
+
|
|
348
|
+
if (typeof changes.companyId === 'string' && changes.companyId !== existing.companyId) {
|
|
349
|
+
await requireCompany(workspaceId, changes.companyId)
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const stageMove =
|
|
353
|
+
changes.stageId === undefined || changes.stageId === existing.stageId
|
|
354
|
+
? undefined
|
|
355
|
+
: {
|
|
356
|
+
from: await requireEnquiryStage(workspaceId, existing.stageId),
|
|
357
|
+
to: await requireEnquiryStage(workspaceId, changes.stageId),
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (typeof changes.ownerId === 'string' && changes.ownerId !== existing.ownerId) {
|
|
361
|
+
await requireOwner(workspaceId, changes.ownerId)
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const currentPeople = await personLinks.listPersonIds(dependencies.db, workspaceId, {
|
|
365
|
+
targetType: 'enquiry',
|
|
366
|
+
targetId: id,
|
|
367
|
+
})
|
|
368
|
+
const nextPeople =
|
|
369
|
+
changes.personIds === undefined ? undefined : [...new Set(changes.personIds)]
|
|
370
|
+
const added =
|
|
371
|
+
nextPeople === undefined
|
|
372
|
+
? []
|
|
373
|
+
: nextPeople.filter((personId) => !currentPeople.includes(personId))
|
|
374
|
+
const removed =
|
|
375
|
+
nextPeople === undefined
|
|
376
|
+
? []
|
|
377
|
+
: currentPeople.filter((personId) => !nextPeople.includes(personId))
|
|
378
|
+
const named = await requirePeople(workspaceId, [...added, ...removed])
|
|
379
|
+
|
|
380
|
+
const columns = toStoredColumns(changes)
|
|
381
|
+
const scalarChanged = changedKeys(existing, columns)
|
|
382
|
+
const linksChanged = added.length > 0 || removed.length > 0
|
|
383
|
+
|
|
384
|
+
return dependencies.transaction(async ({ tx, events }) => {
|
|
385
|
+
const cf = await dependencies.customFields.forUpdate(
|
|
386
|
+
tx,
|
|
387
|
+
workspaceId,
|
|
388
|
+
'enquiry',
|
|
389
|
+
existing.customFields,
|
|
390
|
+
changes.customFields,
|
|
391
|
+
)
|
|
392
|
+
const customFieldsChanged = cf !== undefined && cf.changedPaths.length > 0
|
|
393
|
+
|
|
394
|
+
if (scalarChanged.length === 0 && !linksChanged && !customFieldsChanged) {
|
|
395
|
+
return toView(existing, currentPeople)
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const updated = await repository.updateEnquiry(tx, workspaceId, id, {
|
|
399
|
+
...columns,
|
|
400
|
+
...(customFieldsChanged ? { customFields: cf.merged } : {}),
|
|
401
|
+
updatedAt: dependencies.now(),
|
|
402
|
+
})
|
|
403
|
+
|
|
404
|
+
if (updated === undefined) {
|
|
405
|
+
throw AppError.notFound('Enquiry not found')
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
await personLinks.linkPeople(
|
|
409
|
+
tx,
|
|
410
|
+
dependencies.createId,
|
|
411
|
+
workspaceId,
|
|
412
|
+
{ targetType: 'enquiry', targetId: id },
|
|
413
|
+
added,
|
|
414
|
+
)
|
|
415
|
+
await personLinks.unlinkPeople(
|
|
416
|
+
tx,
|
|
417
|
+
workspaceId,
|
|
418
|
+
{ targetType: 'enquiry', targetId: id },
|
|
419
|
+
removed,
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
if (stageMove !== undefined) {
|
|
423
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
424
|
+
targetType: 'enquiry',
|
|
425
|
+
targetId: id,
|
|
426
|
+
kind: 'stage_changed',
|
|
427
|
+
...describeStageChange(stageMove.from.label, stageMove.to.label),
|
|
428
|
+
})
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
const otherChanged = scalarChanged.filter((field) => field !== 'stageId')
|
|
432
|
+
const customFieldPaths = cf?.changedPaths ?? []
|
|
433
|
+
const activityChanged = [...otherChanged, ...customFieldPaths]
|
|
434
|
+
|
|
435
|
+
if (activityChanged.length > 0) {
|
|
436
|
+
const labels: Record<string, string> = { ...ENQUIRY_FIELD_LABELS, ...cf?.labels }
|
|
437
|
+
const before: Record<string, unknown> = { ...existing, ...cf?.flatBefore }
|
|
438
|
+
const after: Record<string, unknown> = { ...columns, ...cf?.flatAfter }
|
|
439
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
440
|
+
targetType: 'enquiry',
|
|
441
|
+
targetId: id,
|
|
442
|
+
kind: 'updated',
|
|
443
|
+
...describeUpdate(activityChanged, labels, before, after),
|
|
444
|
+
})
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
for (const personId of added) {
|
|
448
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
449
|
+
targetType: 'enquiry',
|
|
450
|
+
targetId: id,
|
|
451
|
+
kind: 'linked',
|
|
452
|
+
...describeLink('person', named.get(personId) ?? personId),
|
|
453
|
+
})
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
for (const personId of removed) {
|
|
457
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
458
|
+
targetType: 'enquiry',
|
|
459
|
+
targetId: id,
|
|
460
|
+
kind: 'unlinked',
|
|
461
|
+
...describeUnlink('person', named.get(personId) ?? personId),
|
|
462
|
+
})
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
events.emit(
|
|
466
|
+
'enquiries.enquiry.updated',
|
|
467
|
+
{ type: 'enquiry', id },
|
|
468
|
+
{
|
|
469
|
+
changed: [
|
|
470
|
+
...scalarChanged,
|
|
471
|
+
...(linksChanged ? ['personIds'] : []),
|
|
472
|
+
...customFieldPaths,
|
|
473
|
+
],
|
|
474
|
+
},
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
if (stageMove !== undefined) {
|
|
478
|
+
events.emit(
|
|
479
|
+
'enquiries.enquiry.stage_changed',
|
|
480
|
+
{ type: 'enquiry', id },
|
|
481
|
+
{ fromStageId: stageMove.from.id, toStageId: stageMove.to.id },
|
|
482
|
+
)
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
return toView(updated, nextPeople ?? currentPeople)
|
|
486
|
+
}, { workspaceId, actor: toEventActor(actor) })
|
|
487
|
+
},
|
|
488
|
+
|
|
489
|
+
async remove(actor, id) {
|
|
490
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
491
|
+
|
|
492
|
+
await dependencies.transaction(async ({ tx, events }) => {
|
|
493
|
+
await require(workspaceId, id)
|
|
494
|
+
|
|
495
|
+
// Notes, activities, decisions, plan items, person_links, list
|
|
496
|
+
// memberships and form_attach_targets rows are removed here in the
|
|
497
|
+
// same transaction. `form_submissions.enquiry_id` is a set-null FK, so
|
|
498
|
+
// the DB clears it on its own.
|
|
499
|
+
await deleteRecordsAttachedTo(tx, workspaceId, 'enquiry', id)
|
|
500
|
+
await repository.deleteEnquiry(tx, workspaceId, id)
|
|
501
|
+
|
|
502
|
+
events.emit('enquiries.enquiry.deleted', { type: 'enquiry', id }, {})
|
|
503
|
+
}, { workspaceId, actor: toEventActor(actor) })
|
|
504
|
+
},
|
|
505
|
+
|
|
506
|
+
async convertToDeal(actor, id) {
|
|
507
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
508
|
+
const existing = await require(workspaceId, id)
|
|
509
|
+
|
|
510
|
+
if (existing.convertedDealId !== null) {
|
|
511
|
+
throw new AppError(
|
|
512
|
+
'conflict',
|
|
513
|
+
'This enquiry has already been converted to a deal',
|
|
514
|
+
[{ field: 'converted_deal_id', message: `Deal ${existing.convertedDealId}` }],
|
|
515
|
+
)
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
if (existing.companyId === null) {
|
|
519
|
+
throw AppError.validationFailed('An enquiry needs a company before it can become a deal', [
|
|
520
|
+
{ field: 'company_id', message: 'Link a company to the enquiry first' },
|
|
521
|
+
])
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
const dealStages = await pipelineRepository.listStagesOfKind(
|
|
525
|
+
dependencies.db,
|
|
526
|
+
workspaceId,
|
|
527
|
+
'deal',
|
|
528
|
+
)
|
|
529
|
+
const openDealStage = dealStages.find((row) => row.open) ?? dealStages[0]
|
|
530
|
+
|
|
531
|
+
if (openDealStage === undefined) {
|
|
532
|
+
// Unreachable through the API: workspaces seed stages and the last
|
|
533
|
+
// deal stage cannot be removed.
|
|
534
|
+
throw AppError.conflict('This workspace has no deal stages')
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
const enquiryStages = await pipelineRepository.listStagesOfKind(
|
|
538
|
+
dependencies.db,
|
|
539
|
+
workspaceId,
|
|
540
|
+
'enquiry',
|
|
541
|
+
)
|
|
542
|
+
// A closed enquiry stage is where a converted enquiry lands. If the
|
|
543
|
+
// workspace has deleted every closed stage we leave the enquiry where it
|
|
544
|
+
// is rather than refuse the conversion over board cosmetics.
|
|
545
|
+
const closedEnquiryStage = enquiryStages.find((row) => !row.open)
|
|
546
|
+
|
|
547
|
+
const personIds = await personLinks.listPersonIds(dependencies.db, workspaceId, {
|
|
548
|
+
targetType: 'enquiry',
|
|
549
|
+
targetId: id,
|
|
550
|
+
})
|
|
551
|
+
const dealId = dependencies.createId('deal')
|
|
552
|
+
const now = dependencies.now()
|
|
553
|
+
|
|
554
|
+
return dependencies.transaction(async ({ tx, events }) => {
|
|
555
|
+
const deal = await dealRepository.insertDeal(tx, {
|
|
556
|
+
id: dealId,
|
|
557
|
+
workspaceId,
|
|
558
|
+
name: existing.name,
|
|
559
|
+
companyId: existing.companyId as string,
|
|
560
|
+
stageId: openDealStage.id,
|
|
561
|
+
valueCents: null,
|
|
562
|
+
currency: null,
|
|
563
|
+
ownerId: existing.ownerId,
|
|
564
|
+
expectedClose: null,
|
|
565
|
+
competitors: [],
|
|
566
|
+
risks: '',
|
|
567
|
+
whyWin: '',
|
|
568
|
+
summary: existing.summary,
|
|
569
|
+
tags: [...existing.tags],
|
|
570
|
+
externalId: null,
|
|
571
|
+
customFields: {},
|
|
572
|
+
})
|
|
573
|
+
|
|
574
|
+
await personLinks.linkPeople(
|
|
575
|
+
tx,
|
|
576
|
+
dependencies.createId,
|
|
577
|
+
workspaceId,
|
|
578
|
+
{ targetType: 'deal', targetId: dealId },
|
|
579
|
+
personIds,
|
|
580
|
+
)
|
|
581
|
+
|
|
582
|
+
const stageChanged =
|
|
583
|
+
closedEnquiryStage !== undefined && closedEnquiryStage.id !== existing.stageId
|
|
584
|
+
const currentEnquiryStage = enquiryStages.find((row) => row.id === existing.stageId)
|
|
585
|
+
|
|
586
|
+
const updatedEnquiry = await repository.updateEnquiry(tx, workspaceId, id, {
|
|
587
|
+
convertedDealId: dealId,
|
|
588
|
+
...(stageChanged ? { stageId: closedEnquiryStage.id } : {}),
|
|
589
|
+
updatedAt: now,
|
|
590
|
+
})
|
|
591
|
+
|
|
592
|
+
if (updatedEnquiry === undefined) {
|
|
593
|
+
throw AppError.notFound('Enquiry not found')
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
597
|
+
targetType: 'deal',
|
|
598
|
+
targetId: dealId,
|
|
599
|
+
kind: 'created',
|
|
600
|
+
...describeCreationFrom('Deal', 'Enquiry', existing.name),
|
|
601
|
+
})
|
|
602
|
+
|
|
603
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
604
|
+
targetType: 'enquiry',
|
|
605
|
+
targetId: id,
|
|
606
|
+
kind: 'updated',
|
|
607
|
+
...describeConversion('Deal', deal.name),
|
|
608
|
+
})
|
|
609
|
+
|
|
610
|
+
if (stageChanged && currentEnquiryStage !== undefined) {
|
|
611
|
+
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
612
|
+
targetType: 'enquiry',
|
|
613
|
+
targetId: id,
|
|
614
|
+
kind: 'stage_changed',
|
|
615
|
+
...describeStageChange(currentEnquiryStage.label, closedEnquiryStage.label),
|
|
616
|
+
})
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
events.emit('deals.deal.created', { type: 'deal', id: dealId }, {})
|
|
620
|
+
events.emit(
|
|
621
|
+
'enquiries.enquiry.updated',
|
|
622
|
+
{ type: 'enquiry', id },
|
|
623
|
+
{
|
|
624
|
+
changed: stageChanged
|
|
625
|
+
? ['convertedDealId', 'stageId']
|
|
626
|
+
: ['convertedDealId'],
|
|
627
|
+
},
|
|
628
|
+
)
|
|
629
|
+
|
|
630
|
+
if (stageChanged && currentEnquiryStage !== undefined) {
|
|
631
|
+
events.emit(
|
|
632
|
+
'enquiries.enquiry.stage_changed',
|
|
633
|
+
{ type: 'enquiry', id },
|
|
634
|
+
{ fromStageId: currentEnquiryStage.id, toStageId: closedEnquiryStage.id },
|
|
635
|
+
)
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
events.emit('enquiries.enquiry.converted', { type: 'enquiry', id }, { dealId })
|
|
639
|
+
|
|
640
|
+
return { deal, personIds }
|
|
641
|
+
}, { workspaceId, actor: toEventActor(actor) })
|
|
642
|
+
},
|
|
643
|
+
}
|
|
644
|
+
}
|