@open-mercato/core 0.4.6-develop-e321a4e2a1 → 0.4.6-main-24e64eef39
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/AGENTS.md +0 -22
- package/dist/modules/api_docs/frontend/docs/api/page.js +1 -1
- package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
- package/dist/modules/attachments/api/library/[id]/route.js +1 -0
- package/dist/modules/attachments/api/library/[id]/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +1 -1
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/lib/partitionEnv.js +1 -1
- package/dist/modules/attachments/lib/partitionEnv.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +1 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/cli.js +1 -1
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/commands/users.js +1 -1
- package/dist/modules/auth/commands/users.js.map +2 -2
- package/dist/modules/business_rules/components/utils/formHelpers.js +1 -1
- package/dist/modules/business_rules/components/utils/formHelpers.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +1 -1
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +1 -1
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/shared.js +1 -1
- package/dist/modules/catalog/commands/shared.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +1 -1
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/products/productForm.js +1 -1
- package/dist/modules/catalog/components/products/productForm.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js.map +1 -1
- package/dist/modules/currencies/services/providers/raiffeisen.js +1 -1
- package/dist/modules/currencies/services/providers/raiffeisen.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +3 -3
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +3 -3
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +3 -3
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/cli.js +2 -2
- package/dist/modules/customers/cli.js.map +2 -2
- package/dist/modules/customers/lib/detailHelpers.js +1 -1
- package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
- package/dist/modules/entities/cli.js +1 -1
- package/dist/modules/entities/cli.js.map +2 -2
- package/dist/modules/entities/lib/field-definitions.js +1 -1
- package/dist/modules/entities/lib/field-definitions.js.map +2 -2
- package/dist/modules/entities/lib/install-from-ce.js +1 -1
- package/dist/modules/entities/lib/install-from-ce.js.map +2 -2
- package/dist/modules/inbox_ops/lib/emailParser.js +1 -1
- package/dist/modules/inbox_ops/lib/emailParser.js.map +2 -2
- package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +0 -8
- package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
- package/dist/modules/perspectives/services/perspectiveService.js +1 -1
- package/dist/modules/perspectives/services/perspectiveService.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/query_index/components/QueryIndexesTable.js +7 -7
- package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +1 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -3
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/resources/commands/resources.js +1 -1
- package/dist/modules/resources/commands/resources.js.map +2 -2
- package/dist/modules/resources/lib/seeds.js +1 -1
- package/dist/modules/resources/lib/seeds.js.map +2 -2
- package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js +1 -1
- package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js.map +2 -2
- package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js +1 -1
- package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -3
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +2 -2
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/channels/offerTableUtils.js +2 -3
- package/dist/modules/sales/components/channels/offerTableUtils.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +4 -4
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +1 -1
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/lib/shipments/snapshots.js.map +1 -1
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -8
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +2 -2
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -8
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -3
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -3
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -3
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -3
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +2 -2
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +1 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -1
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/lib/graph-utils.js +1 -1
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/package.json +2 -2
- package/src/modules/api_docs/frontend/docs/api/page.tsx +1 -1
- package/src/modules/attachments/api/library/[id]/route.ts +1 -0
- package/src/modules/attachments/components/AttachmentLibrary.tsx +1 -1
- package/src/modules/attachments/lib/partitionEnv.ts +1 -1
- package/src/modules/auth/backend/users/page.tsx +1 -1
- package/src/modules/auth/cli.ts +1 -1
- package/src/modules/auth/commands/users.ts +1 -1
- package/src/modules/business_rules/components/utils/formHelpers.ts +1 -1
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +1 -1
- package/src/modules/catalog/commands/products.ts +1 -1
- package/src/modules/catalog/commands/shared.ts +1 -1
- package/src/modules/catalog/components/PriceKindSettings.tsx +1 -1
- package/src/modules/catalog/components/products/productForm.ts +1 -1
- package/src/modules/configs/lib/upgrade-actions.ts +1 -1
- package/src/modules/currencies/services/providers/raiffeisen.ts +1 -1
- package/src/modules/customers/backend/customers/companies/page.tsx +3 -3
- package/src/modules/customers/backend/customers/deals/page.tsx +3 -3
- package/src/modules/customers/backend/customers/people/page.tsx +3 -3
- package/src/modules/customers/cli.ts +2 -2
- package/src/modules/customers/lib/detailHelpers.ts +1 -1
- package/src/modules/entities/cli.ts +1 -1
- package/src/modules/entities/lib/field-definitions.ts +1 -1
- package/src/modules/entities/lib/install-from-ce.ts +1 -1
- package/src/modules/inbox_ops/lib/emailParser.ts +1 -1
- package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +0 -8
- package/src/modules/perspectives/services/perspectiveService.ts +1 -1
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -3
- package/src/modules/query_index/components/QueryIndexesTable.tsx +7 -7
- package/src/modules/query_index/lib/engine.ts +1 -1
- package/src/modules/resources/backend/resources/resource-types/page.tsx +3 -2
- package/src/modules/resources/backend/resources/resources/page.tsx +3 -3
- package/src/modules/resources/commands/resources.ts +1 -1
- package/src/modules/resources/lib/seeds.ts +1 -1
- package/src/modules/sales/api/dashboard/widgets/new-orders/route.ts +1 -1
- package/src/modules/sales/api/dashboard/widgets/new-quotes/route.ts +1 -1
- package/src/modules/sales/backend/sales/channels/page.tsx +3 -3
- package/src/modules/sales/commands/documents.ts +2 -2
- package/src/modules/sales/components/channels/offerTableUtils.tsx +2 -3
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +4 -4
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +1 -1
- package/src/modules/sales/lib/shipments/snapshots.ts +1 -1
- package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -8
- package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -8
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +3 -3
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +3 -3
- package/src/modules/staff/backend/staff/team-members/page.tsx +3 -3
- package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -3
- package/src/modules/staff/backend/staff/teams/page.tsx +3 -2
- package/src/modules/workflows/backend/instances/page.tsx +2 -2
- package/src/modules/workflows/backend/tasks/page.tsx +1 -1
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -1
- package/src/modules/workflows/lib/graph-utils.ts +1 -1
- package/dist/modules/integrations/acl.js +0 -8
- package/dist/modules/integrations/acl.js.map +0 -7
- package/dist/modules/integrations/data/enrichers.js +0 -72
- package/dist/modules/integrations/data/enrichers.js.map +0 -7
- package/dist/modules/integrations/data/entities.js +0 -63
- package/dist/modules/integrations/data/entities.js.map +0 -7
- package/dist/modules/integrations/index.js +0 -9
- package/dist/modules/integrations/index.js.map +0 -7
- package/dist/modules/integrations/setup.js +0 -13
- package/dist/modules/integrations/setup.js.map +0 -7
- package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js +0 -69
- package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js.map +0 -7
- package/dist/modules/integrations/widgets/injection-table.js +0 -13
- package/dist/modules/integrations/widgets/injection-table.js.map +0 -7
- package/src/modules/integrations/acl.ts +0 -4
- package/src/modules/integrations/data/enrichers.ts +0 -98
- package/src/modules/integrations/data/entities.ts +0 -46
- package/src/modules/integrations/index.ts +0 -5
- package/src/modules/integrations/setup.ts +0 -11
- package/src/modules/integrations/widgets/injection/external-ids/widget.client.tsx +0 -94
- package/src/modules/integrations/widgets/injection-table.ts +0 -17
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/modules/customers/cli.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ModuleCli } from '@open-mercato/shared/modules/registry'\nimport { createRequestContainer, type AppContainer } from '@open-mercato/shared/lib/di/container'\nimport { cf } from '@open-mercato/shared/modules/dsl'\nimport { randomUUID } from 'crypto'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { Dictionary, DictionaryEntry, type DictionaryManagerVisibility } from '@open-mercato/core/modules/dictionaries/data/entities'\nimport { installCustomEntitiesFromModules } from '@open-mercato/core/modules/entities/lib/install-from-ce'\nimport type { CacheStrategy } from '@open-mercato/cache/types'\nimport { ensureCustomFieldDefinitions } from '@open-mercato/core/modules/entities/lib/field-definitions'\nimport { DefaultDataEngine, type DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { E as CoreEntities } from '#generated/entities.ids.generated'\nimport { createProgressBar } from '@open-mercato/shared/lib/cli/progress'\nimport { buildIndexDocument, type IndexCustomFieldValue } from '@open-mercato/core/modules/query_index/lib/document'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport {\n CustomerEntity,\n CustomerCompanyProfile,\n CustomerPersonProfile,\n CustomerDeal,\n CustomerDealPersonLink,\n CustomerDealCompanyLink,\n CustomerActivity,\n CustomerAddress,\n CustomerComment,\n CustomerPipeline,\n CustomerPipelineStage,\n} from './data/entities'\nimport { ensureDictionaryEntry } from './commands/shared'\n\ntype SeedArgs = {\n tenantId: string\n organizationId: string\n}\n\ntype DictionaryDefault = {\n value: string\n label: string\n color?: string\n icon?: string\n}\n\ntype CustomFieldValuesPayload = Parameters<DataEngine['setCustomFields']>[0]['values']\ntype ProgressBarHandle = ReturnType<typeof createProgressBar>\n\nconst DEAL_STATUS_DEFAULTS: DictionaryDefault[] = [\n { value: 'open', label: 'Open', color: '#2563eb', icon: 'lucide:circle' },\n { value: 'closed', label: 'Closed', color: '#6b7280', icon: 'lucide:check-circle' },\n { value: 'win', label: 'Win', color: '#22c55e', icon: 'lucide:trophy' },\n { value: 'loose', label: 'Loose', color: '#ef4444', icon: 'lucide:flag' },\n { value: 'in_progress', label: 'In progress', color: '#f59e0b', icon: 'lucide:activity' },\n]\n\nconst PIPELINE_STAGE_DEFAULTS: DictionaryDefault[] = [\n { value: 'opportunity', label: 'Opportunity', color: '#38bdf8', icon: 'lucide:target' },\n { value: 'marketing_qualified_lead', label: 'Marketing Qualified Lead', color: '#a855f7', icon: 'lucide:sparkles' },\n { value: 'sales_qualified_lead', label: 'Sales Qualified Lead', color: '#f97316', icon: 'lucide:users' },\n { value: 'offering', label: 'Offering', color: '#22c55e', icon: 'lucide:package' },\n { value: 'negotiations', label: 'Negotiations', color: '#facc15', icon: 'lucide:handshake' },\n { value: 'win', label: 'Win', color: '#16a34a', icon: 'lucide:award' },\n { value: 'loose', label: 'Loose', color: '#ef4444', icon: 'lucide:flag' },\n { value: 'stalled', label: 'Stalled', color: '#6b7280', icon: 'lucide:alert-circle' },\n]\n\nconst ENTITY_STATUS_DEFAULTS: DictionaryDefault[] = [\n { value: 'customer', label: 'Customer', color: '#16a34a', icon: 'lucide:handshake' },\n { value: 'active', label: 'Active', color: '#2563eb', icon: 'lucide:user-check' },\n { value: 'prospect', label: 'Prospect', color: '#f59e0b', icon: 'lucide:target' },\n { value: 'inactive', label: 'Inactive', color: '#6b7280', icon: 'lucide:archive' },\n]\n\nconst ENTITY_LIFECYCLE_STAGE_DEFAULTS: DictionaryDefault[] = [\n { value: 'prospect', label: 'Prospect', color: '#f59e0b', icon: 'lucide:sparkles' },\n { value: 'evaluation', label: 'Evaluation', color: '#a855f7', icon: 'lucide:clipboard-list' },\n { value: 'customer', label: 'Customer', color: '#22c55e', icon: 'lucide:handshake' },\n { value: 'expansion', label: 'Expansion', color: '#0ea5e9', icon: 'lucide:trending-up' },\n { value: 'churned', label: 'Churned', color: '#ef4444', icon: 'lucide:alert-circle' },\n]\n\nconst ENTITY_SOURCE_DEFAULTS: DictionaryDefault[] = [\n { value: 'partner_referral', label: 'Partner referral', color: '#6366f1', icon: 'lucide:handshake' },\n { value: 'customer_referral', label: 'Customer referral', color: '#22c55e', icon: 'lucide:thumbs-up' },\n { value: 'industry_event', label: 'Industry event', color: '#f97316', icon: 'lucide:calendar' },\n { value: 'inbound_web', label: 'Inbound web', color: '#0ea5e9', icon: 'lucide:globe' },\n { value: 'outbound_campaign', label: 'Outbound campaign', color: '#facc15', icon: 'lucide:megaphone' },\n]\n\nconst ADDRESS_TYPE_DEFAULTS: DictionaryDefault[] = [\n { value: 'office', label: 'Office', color: '#3b82f6', icon: 'lucide:building' },\n { value: 'work', label: 'Work', color: '#6366f1', icon: 'lucide:briefcase' },\n { value: 'billing', label: 'Billing', color: '#f97316', icon: 'lucide:wallet' },\n { value: 'shipping', label: 'Shipping', color: '#22c55e', icon: 'lucide:truck' },\n { value: 'home', label: 'Home', color: '#10b981', icon: 'lucide:map-pin' },\n]\n\nconst ACTIVITY_TYPE_DEFAULTS: DictionaryDefault[] = [\n { value: 'call', label: 'Call', color: '#2563eb', icon: 'lucide:phone-call' },\n { value: 'email', label: 'Email', color: '#16a34a', icon: 'lucide:mail' },\n { value: 'meeting', label: 'Meeting', color: '#f59e0b', icon: 'lucide:users' },\n { value: 'note', label: 'Note', color: '#a855f7', icon: 'lucide:notebook' },\n { value: 'task', label: 'Task', color: '#ef4444', icon: 'lucide:check-square' },\n]\n\nconst JOB_TITLE_DEFAULTS: DictionaryDefault[] = [\n { value: 'Director of Operations', label: 'Director of Operations', color: '#f97316', icon: 'lucide:settings' },\n { value: 'VP of Partnerships', label: 'VP of Partnerships', color: '#6366f1', icon: 'lucide:users' },\n { value: 'Founder & Principal', label: 'Founder & Principal', color: '#ec4899', icon: 'lucide:star' },\n { value: 'Senior Project Manager', label: 'Senior Project Manager', color: '#0ea5e9', icon: 'lucide:clipboard-list' },\n { value: 'Chief Revenue Officer', label: 'Chief Revenue Officer', color: '#8b5cf6', icon: 'lucide:bar-chart-3' },\n { value: 'Director of Retail Partnerships', label: 'Director of Retail Partnerships', color: '#f59e0b', icon: 'lucide:shopping-bag' },\n]\n\nconst INDUSTRY_DEFAULTS: DictionaryDefault[] = [\n { value: 'Renewable Energy', label: 'Renewable Energy' },\n { value: 'Software', label: 'Software' },\n { value: 'Interior Design', label: 'Interior Design' },\n { value: 'SaaS', label: 'SaaS' },\n { value: 'E-commerce', label: 'E-commerce' },\n { value: 'Healthcare', label: 'Healthcare' },\n { value: 'Manufacturing', label: 'Manufacturing' },\n { value: 'Logistics', label: 'Logistics' },\n { value: 'Financial Services', label: 'Financial Services' },\n { value: 'Retail', label: 'Retail' },\n { value: 'Hospitality', label: 'Hospitality' },\n { value: 'Energy', label: 'Energy' },\n { value: 'Media', label: 'Media' },\n]\n\nconst PRIORITY_CURRENCIES = ['EUR', 'USD', 'GBP', 'PLN']\n\ntype ExampleAddress = {\n name?: string\n purpose?: string\n addressLine1: string\n addressLine2?: string\n city?: string\n region?: string\n postalCode?: string\n country?: string\n latitude?: number\n longitude?: number\n buildingNumber?: string\n flatNumber?: string\n}\n\ntype ExamplePerson = {\n slug: string\n firstName: string\n lastName: string\n preferredName?: string\n jobTitle?: string\n department?: string\n seniority?: string\n email: string\n phone?: string\n timezone?: string\n linkedInUrl?: string\n twitterUrl?: string\n address?: ExampleAddress\n description?: string\n source?: string\n custom?: Record<string, unknown>\n}\n\ntype ExampleDealParticipant = {\n slug: string\n participantRole?: string\n}\n\ntype ExampleActivity = {\n slug: string\n entity: 'company' | 'person'\n personSlug?: string\n type: string\n subject?: string\n body?: string\n occurredAt: string\n icon?: string\n color?: string\n custom?: Record<string, unknown>\n}\n\ntype ExampleNote = {\n entity: 'company' | 'person'\n personSlug?: string\n body: string\n occurredAt?: string\n icon?: string\n color?: string\n}\n\ntype ExampleDeal = {\n slug: string\n title: string\n description?: string\n status: string\n pipelineStage?: string\n valueAmount?: number\n valueCurrency?: string\n probability?: number\n expectedCloseAt?: string\n people: ExampleDealParticipant[]\n activities?: ExampleActivity[]\n source?: string\n custom?: Record<string, unknown>\n}\n\ntype ExampleCompany = {\n slug: string\n displayName: string\n legalName?: string\n brandName?: string\n industry?: string\n sizeBucket?: string\n domain?: string\n websiteUrl?: string\n description?: string\n primaryEmail?: string\n primaryPhone?: string\n source?: string\n lifecycleStage?: string\n status?: string\n annualRevenue?: number\n address?: ExampleAddress\n people?: ExamplePerson[]\n deals?: ExampleDeal[]\n interactions?: ExampleActivity[]\n notes?: ExampleNote[]\n custom?: Record<string, unknown>\n}\n\nconst NOW = new Date()\n\nfunction isoDaysFromNow(days: number, options?: { hour?: number; minute?: number }): string {\n const base = new Date(NOW)\n const hour = options?.hour ?? 12\n const minute = options?.minute ?? 0\n base.setUTCHours(hour, minute, 0, 0)\n base.setUTCDate(base.getUTCDate() + days)\n return base.toISOString()\n}\n\nconst CUSTOMER_EXAMPLES: ExampleCompany[] = [\n {\n slug: 'brightside-solar',\n displayName: 'Brightside Solar',\n legalName: 'Brightside Solar LLC',\n brandName: 'Brightside Solar',\n industry: 'Renewable Energy',\n sizeBucket: '51-200',\n domain: 'brightsidesolar.com',\n websiteUrl: 'https://brightsidesolar.com',\n description:\n 'Community solar developer helping multifamily buildings reduce energy costs across California.',\n primaryEmail: 'hello@brightsidesolar.com',\n primaryPhone: '+1 415-555-0148',\n source: 'partner_referral',\n lifecycleStage: 'customer',\n status: 'customer',\n custom: {\n relationship_health: 'healthy',\n renewal_quarter: 'Q3',\n executive_notes: 'High NPS across HOA portfolio; exploring bundled battery upsell for 2025 budgets.',\n customer_marketing_case: true,\n },\n address: {\n name: 'Headquarters',\n purpose: 'office',\n addressLine1: '245 Market St Suite 400',\n city: 'San Francisco',\n region: 'CA',\n postalCode: '94105',\n country: 'US',\n latitude: 37.7936,\n longitude: -122.3965,\n },\n people: [\n {\n slug: 'mia-johnson',\n firstName: 'Mia',\n lastName: 'Johnson',\n preferredName: 'Mia',\n jobTitle: 'Director of Operations',\n department: 'Operations',\n seniority: 'director',\n email: 'mia.johnson@brightsidesolar.com',\n phone: '+1 415-555-0162',\n timezone: 'America/Los_Angeles',\n linkedInUrl: 'https://www.linkedin.com/in/miajohnson-operations/',\n source: 'partner_referral',\n custom: {\n buying_role: 'champion',\n preferred_pronouns: 'she/her',\n newsletter_opt_in: true,\n },\n address: {\n purpose: 'work',\n addressLine1: '245 Market St Suite 410',\n city: 'San Francisco',\n region: 'CA',\n postalCode: '94105',\n country: 'US',\n },\n },\n {\n slug: 'daniel-cho',\n firstName: 'Daniel',\n lastName: 'Cho',\n jobTitle: 'VP of Partnerships',\n department: 'Business Development',\n seniority: 'vp',\n email: 'daniel.cho@brightsidesolar.com',\n phone: '+1 628-555-0199',\n timezone: 'America/Los_Angeles',\n linkedInUrl: 'https://www.linkedin.com/in/danielcho-energy/',\n source: 'outbound_campaign',\n custom: {\n buying_role: 'economic_buyer',\n preferred_pronouns: 'he/him',\n newsletter_opt_in: false,\n },\n },\n ],\n deals: [\n {\n slug: 'redwood-residences',\n title: 'Redwood Residences Solar Rollout',\n description: '40-home solar installation with ongoing maintenance plan.',\n status: 'in_progress',\n pipelineStage: 'negotiations',\n valueAmount: 185000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(45),\n probability: 55,\n source: 'partner_referral',\n custom: {\n competitive_risk: 'medium',\n implementation_complexity: 'standard',\n estimated_seats: 40,\n requires_legal_review: true,\n },\n people: [\n { slug: 'mia-johnson', participantRole: 'Project Sponsor' },\n { slug: 'daniel-cho', participantRole: 'Executive Sponsor' },\n ],\n activities: [\n {\n slug: 'redwood-hoa-follow-up',\n entity: 'company',\n type: 'call',\n subject: 'Follow-up with HOA board',\n body: 'Reviewed financing options and clarified maintenance service tiers for the board.',\n occurredAt: isoDaysFromNow(-9, { hour: 17, minute: 30 }),\n icon: 'lucide:phone-call',\n color: '#2563eb',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: true,\n follow_up_owner: 'Sofia Nguyen',\n },\n },\n {\n slug: 'redwood-case-studies',\n entity: 'person',\n personSlug: 'mia-johnson',\n type: 'note',\n subject: 'Shared case studies',\n body: 'Sent two case studies highlighting 18% average utility bill savings for similar complexes.',\n occurredAt: isoDaysFromNow(-7, { hour: 19, minute: 15 }),\n icon: 'lucide:notebook',\n color: '#a855f7',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: false,\n follow_up_owner: 'Daniel Cho',\n },\n },\n ],\n },\n {\n slug: 'sunset-lofts-battery',\n title: 'Sunset Lofts Battery Upgrade',\n description: 'Battery upgrade for existing solar customers to extend overnight coverage.',\n status: 'open',\n pipelineStage: 'offering',\n valueAmount: 82000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(65),\n probability: 40,\n source: 'inbound_web',\n custom: {\n competitive_risk: 'high',\n implementation_complexity: 'complex',\n estimated_seats: 28,\n requires_legal_review: false,\n },\n people: [{ slug: 'mia-johnson', participantRole: 'Point of Contact' }],\n activities: [\n {\n slug: 'sunset-energy-audit',\n entity: 'company',\n type: 'meeting',\n subject: 'On-site energy audit completed',\n body: 'Audit identified 28 units that need inverter firmware updates before batteries ship.',\n occurredAt: isoDaysFromNow(-17, { hour: 21 }),\n icon: 'lucide:users',\n color: '#f59e0b',\n custom: {\n engagement_sentiment: 'neutral',\n shared_with_leadership: false,\n follow_up_owner: 'Mia Johnson',\n },\n },\n ],\n },\n ],\n interactions: [\n {\n slug: 'brightside-nps-email',\n entity: 'company',\n type: 'email',\n subject: 'Quarterly NPS survey sent',\n body: 'Shared Q2 satisfaction survey with portfolio property managers.',\n occurredAt: isoDaysFromNow(-20, { hour: 16 }),\n icon: 'lucide:mail',\n color: '#16a34a',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: false,\n follow_up_owner: 'Customer Success Team',\n },\n },\n ],\n notes: [\n {\n entity: 'company',\n body: 'Completed energy audit across 12 HOA buildings; evaluating maintenance bundle add-on.',\n occurredAt: isoDaysFromNow(-11, { hour: 18 }),\n icon: 'lucide:lightbulb',\n color: '#facc15',\n },\n {\n entity: 'person',\n personSlug: 'mia-johnson',\n body: 'Mia requested financing comparison deck before the board vote.',\n occurredAt: isoDaysFromNow(-9, { hour: 15, minute: 30 }),\n icon: 'lucide:bookmark',\n color: '#a855f7',\n },\n ],\n },\n {\n slug: 'harborview-analytics',\n displayName: 'Harborview Analytics',\n legalName: 'Harborview Analytics Inc.',\n brandName: 'Harborview Analytics',\n industry: 'Software',\n sizeBucket: '201-500',\n domain: 'harborviewanalytics.com',\n websiteUrl: 'https://harborviewanalytics.com',\n description:\n 'Boston-based analytics platform helping consumer brands optimize merchandising decisions.',\n primaryEmail: 'info@harborviewanalytics.com',\n primaryPhone: '+1 617-555-0024',\n source: 'industry_event',\n lifecycleStage: 'prospect',\n status: 'active',\n custom: {\n relationship_health: 'monitor',\n renewal_quarter: 'Q4',\n executive_notes: 'Pilot success metrics trending positive; CFO wants ROI modeling before expansion.',\n customer_marketing_case: false,\n },\n address: {\n name: 'Boston HQ',\n purpose: 'office',\n addressLine1: '355 Atlantic Ave Floor 6',\n city: 'Boston',\n region: 'MA',\n postalCode: '02210',\n country: 'US',\n latitude: 42.3522,\n longitude: -71.0507,\n },\n people: [\n {\n slug: 'arjun-patel',\n firstName: 'Arjun',\n lastName: 'Patel',\n jobTitle: 'Chief Revenue Officer',\n department: 'Revenue',\n seniority: 'c-level',\n email: 'arjun.patel@harborviewanalytics.com',\n phone: '+1 617-555-0168',\n timezone: 'America/New_York',\n linkedInUrl: 'https://www.linkedin.com/in/arjunpatel-sales/',\n source: 'industry_event',\n custom: {\n buying_role: 'economic_buyer',\n preferred_pronouns: 'he/him',\n newsletter_opt_in: true,\n },\n },\n {\n slug: 'lena-ortiz',\n firstName: 'Lena',\n lastName: 'Ortiz',\n jobTitle: 'Director of Retail Partnerships',\n department: 'Partnerships',\n seniority: 'director',\n email: 'lena.ortiz@harborviewanalytics.com',\n phone: '+1 617-555-0179',\n timezone: 'America/New_York',\n linkedInUrl: 'https://www.linkedin.com/in/lenaortiz-retail/',\n source: 'industry_event',\n custom: {\n buying_role: 'champion',\n preferred_pronouns: 'she/her',\n newsletter_opt_in: true,\n },\n },\n ],\n deals: [\n {\n slug: 'blue-harbor-pilot',\n title: 'Blue Harbor Grocers Pilot Program',\n description: 'Six-month pilot of merchandising analytics across 28 locations.',\n status: 'win',\n pipelineStage: 'win',\n valueAmount: 96000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(-25),\n probability: 100,\n source: 'industry_event',\n custom: {\n competitive_risk: 'low',\n implementation_complexity: 'standard',\n estimated_seats: 28,\n requires_legal_review: false,\n },\n people: [\n { slug: 'arjun-patel', participantRole: 'Executive Sponsor' },\n { slug: 'lena-ortiz', participantRole: 'Account Lead' },\n ],\n activities: [\n {\n slug: 'blue-harbor-contract',\n entity: 'company',\n type: 'meeting',\n subject: 'Contract signed with procurement',\n body: 'Procurement signed SOW; onboarding kickoff scheduled for next Tuesday.',\n occurredAt: isoDaysFromNow(-28, { hour: 14, minute: 30 }),\n icon: 'lucide:handshake',\n color: '#22c55e',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: true,\n follow_up_owner: 'Lena Ortiz',\n },\n },\n {\n slug: 'blue-harbor-onboarding-email',\n entity: 'person',\n personSlug: 'lena-ortiz',\n type: 'email',\n subject: 'Shared onboarding checklist',\n body: 'Sent checklist covering data exports and point-of-sale integrations required for go-live.',\n occurredAt: isoDaysFromNow(-27, { hour: 13, minute: 5 }),\n icon: 'lucide:mail',\n color: '#16a34a',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: false,\n follow_up_owner: 'Implementation Team',\n },\n },\n ],\n },\n {\n slug: 'midwest-outfitters',\n title: 'Midwest Outfitters Expansion',\n description: 'Expansion opportunity covering 120 stores in the Midwest region.',\n status: 'open',\n pipelineStage: 'opportunity',\n valueAmount: 210000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(120),\n probability: 35,\n source: 'outbound_campaign',\n custom: {\n competitive_risk: 'medium',\n implementation_complexity: 'complex',\n estimated_seats: 120,\n requires_legal_review: true,\n },\n people: [{ slug: 'lena-ortiz', participantRole: 'Account Lead' }],\n activities: [\n {\n slug: 'midwest-forecasting-call',\n entity: 'company',\n type: 'call',\n subject: 'Introduced predictive forecasting module',\n body: 'Walkthrough of demand forecasting module with COO and finance controller.',\n occurredAt: isoDaysFromNow(-14, { hour: 15, minute: 45 }),\n icon: 'lucide:phone-call',\n color: '#2563eb',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: true,\n follow_up_owner: 'Arjun Patel',\n },\n },\n ],\n },\n ],\n interactions: [\n {\n slug: 'harborview-pricing-note',\n entity: 'person',\n personSlug: 'arjun-patel',\n type: 'note',\n subject: 'Requested pricing comparison',\n body: 'Arjun asked for pricing comparison versus Qlik ahead of board review.',\n occurredAt: isoDaysFromNow(-18, { hour: 12, minute: 10 }),\n icon: 'lucide:notebook',\n color: '#a855f7',\n custom: {\n engagement_sentiment: 'neutral',\n shared_with_leadership: true,\n follow_up_owner: 'Finance Team',\n },\n },\n ],\n notes: [\n {\n entity: 'company',\n body: 'Pilot success metrics shared with board; expansion depends on Q4 budget review.',\n occurredAt: isoDaysFromNow(-16, { hour: 17, minute: 45 }),\n icon: 'lucide:bar-chart-3',\n color: '#38bdf8',\n },\n {\n entity: 'person',\n personSlug: 'lena-ortiz',\n body: 'Lena confirmed data team can supply POS exports within two weeks.',\n occurredAt: isoDaysFromNow(-13, { hour: 11, minute: 20 }),\n icon: 'lucide:clipboard-list',\n color: '#0ea5e9',\n },\n ],\n },\n {\n slug: 'copperleaf-design',\n displayName: 'Copperleaf Design Co.',\n legalName: 'Copperleaf Design Company',\n brandName: 'Copperleaf Design',\n industry: 'Interior Design',\n sizeBucket: '11-50',\n domain: 'copperleaf.design',\n websiteUrl: 'https://copperleaf.design',\n description:\n 'Boutique interior design studio specializing in hospitality and boutique retail projects across Texas.',\n primaryEmail: 'studio@copperleaf.design',\n primaryPhone: '+1 512-555-0456',\n source: 'customer_referral',\n lifecycleStage: 'customer',\n status: 'customer',\n custom: {\n relationship_health: 'healthy',\n renewal_quarter: 'Q1',\n executive_notes: 'Boutique studio with strong referrals; share sustainability case studies with ownership group.',\n customer_marketing_case: true,\n },\n address: {\n name: 'Austin Studio',\n purpose: 'office',\n addressLine1: '1101 E 6th St Suite 220',\n city: 'Austin',\n region: 'TX',\n postalCode: '78702',\n country: 'US',\n latitude: 30.2642,\n longitude: -97.7275,\n },\n people: [\n {\n slug: 'taylor-brooks',\n firstName: 'Taylor',\n lastName: 'Brooks',\n jobTitle: 'Founder & Principal',\n department: 'Leadership',\n seniority: 'c-level',\n email: 'taylor.brooks@copperleaf.design',\n phone: '+1 512-555-0489',\n timezone: 'America/Chicago',\n linkedInUrl: 'https://www.linkedin.com/in/taylorbrooks-design/',\n source: 'customer_referral',\n custom: {\n buying_role: 'economic_buyer',\n preferred_pronouns: 'they/them',\n newsletter_opt_in: false,\n },\n },\n {\n slug: 'naomi-harris',\n firstName: 'Naomi',\n lastName: 'Harris',\n jobTitle: 'Senior Project Manager',\n department: 'Projects',\n seniority: 'manager',\n email: 'naomi.harris@copperleaf.design',\n phone: '+1 512-555-0521',\n timezone: 'America/Chicago',\n linkedInUrl: 'https://www.linkedin.com/in/naomiharris-pm/',\n source: 'customer_referral',\n custom: {\n buying_role: 'influencer',\n preferred_pronouns: 'she/her',\n newsletter_opt_in: true,\n },\n },\n ],\n deals: [\n {\n slug: 'wanderstay-renovation',\n title: 'Wanderstay Boutique Renovation',\n description: 'Full lobby and guest suite redesign for the Wanderstay hospitality group.',\n status: 'in_progress',\n pipelineStage: 'sales_qualified_lead',\n valueAmount: 145000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(35),\n probability: 65,\n source: 'customer_referral',\n custom: {\n competitive_risk: 'medium',\n implementation_complexity: 'complex',\n estimated_seats: 12,\n requires_legal_review: true,\n },\n people: [\n { slug: 'taylor-brooks', participantRole: 'Principal Designer' },\n { slug: 'naomi-harris', participantRole: 'Project Lead' },\n ],\n activities: [\n {\n slug: 'wanderstay-workshop-recap',\n entity: 'person',\n personSlug: 'naomi-harris',\n type: 'meeting',\n subject: 'Design workshop recap',\n body: 'Captured lighting and materials feedback from onsite workshop with hospitality team.',\n occurredAt: isoDaysFromNow(-6, { hour: 20 }),\n icon: 'lucide:users',\n color: '#f59e0b',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: false,\n follow_up_owner: 'Naomi Harris',\n },\n },\n ],\n },\n {\n slug: 'cedar-creek-retreat',\n title: 'Cedar Creek Retreat Expansion',\n description: 'New wellness center build-out including retail area and treatment rooms.',\n status: 'loose',\n pipelineStage: 'loose',\n valueAmount: 98000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(-70),\n probability: 0,\n source: 'customer_referral',\n custom: {\n competitive_risk: 'high',\n implementation_complexity: 'standard',\n estimated_seats: 8,\n requires_legal_review: false,\n },\n people: [{ slug: 'taylor-brooks', participantRole: 'Principal Designer' }],\n activities: [\n {\n slug: 'cedar-creek-loss-note',\n entity: 'company',\n type: 'note',\n subject: 'Lost due to budget constraints',\n body: 'Retreat selected lower-cost vendor focused on prefabricated interiors.',\n occurredAt: isoDaysFromNow(-68, { hour: 18, minute: 45 }),\n icon: 'lucide:alert-circle',\n color: '#ef4444',\n custom: {\n engagement_sentiment: 'negative',\n shared_with_leadership: true,\n follow_up_owner: 'Taylor Brooks',\n },\n },\n ],\n },\n ],\n interactions: [\n {\n slug: 'copperleaf-referral-call',\n entity: 'company',\n type: 'call',\n subject: 'Referred by Venture Hospitality',\n body: 'Received referral from Venture Hospitality after successful Austin project.',\n occurredAt: isoDaysFromNow(-25, { hour: 16, minute: 45 }),\n icon: 'lucide:phone',\n color: '#2563eb',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: true,\n follow_up_owner: 'Taylor Brooks',\n },\n },\n ],\n notes: [\n {\n entity: 'company',\n body: 'Client interested in sustainable materials library review during next site visit.',\n occurredAt: isoDaysFromNow(-22, { hour: 19, minute: 10 }),\n icon: 'lucide:lightbulb',\n color: '#22c55e',\n },\n {\n entity: 'person',\n personSlug: 'naomi-harris',\n body: 'Naomi requested updated FF&E budget before presenting to ownership group.',\n occurredAt: isoDaysFromNow(-6, { hour: 21, minute: 5 }),\n icon: 'lucide:clipboard-list',\n color: '#0ea5e9',\n },\n ],\n },\n]\n\nconst STRESS_TEST_SOURCE = 'stress_test'\nconst STRESS_TEST_FIRST_NAMES = [\n 'Alex',\n 'Jordan',\n 'Taylor',\n 'Morgan',\n 'Casey',\n 'Riley',\n 'Hayden',\n 'Skyler',\n 'Quinn',\n 'Peyton',\n 'Harper',\n 'Rowan',\n 'Sawyer',\n 'Avery',\n 'Reese',\n]\nconst STRESS_TEST_LAST_NAMES = [\n 'Rivera',\n 'Chen',\n 'Nguyen',\n 'Harper',\n 'Ellis',\n 'Patel',\n 'Khan',\n 'Silva',\n 'Lopez',\n 'Murphy',\n 'Baker',\n 'Diaz',\n 'Foster',\n 'Gonzalez',\n 'Kim',\n]\nconst STRESS_TEST_JOB_TITLES = [\n 'Account Executive',\n 'Growth Manager',\n 'Customer Success Lead',\n 'Operations Specialist',\n 'Procurement Analyst',\n 'Demand Generation Manager',\n 'Solutions Consultant',\n 'Revenue Operations Partner',\n 'Implementation Manager',\n 'Sales Engineer',\n]\nconst STRESS_TEST_DEPARTMENTS = [\n 'Revenue',\n 'Operations',\n 'Customer Experience',\n 'Procurement',\n 'Strategy',\n 'Marketing',\n 'Sales',\n]\nconst STRESS_TEST_SENIORITY = ['junior', 'mid', 'senior', 'lead', 'director']\nconst STRESS_TEST_TIMEZONES = [\n 'America/New_York',\n 'America/Los_Angeles',\n 'America/Chicago',\n 'Europe/Berlin',\n 'Europe/Warsaw',\n 'Europe/London',\n 'Asia/Singapore',\n]\nconst STRESS_TEST_COMPANY_PREFIX = [\n 'Atlas',\n 'Northwind',\n 'Summit',\n 'Vertex',\n 'Harbor',\n 'Cobalt',\n 'Juniper',\n 'Orion',\n 'Beacon',\n 'Silverline',\n 'Brightside',\n 'Evergreen',\n 'Lakeshore',\n 'Bluefield',\n 'Aurora',\n]\nconst STRESS_TEST_COMPANY_SUFFIX = ['Industries', 'Partners', 'Holdings', 'Collective', 'Group', 'Ventures']\nconst STRESS_TEST_INDUSTRIES = [\n 'SaaS',\n 'E-commerce',\n 'Healthcare',\n 'Manufacturing',\n 'Logistics',\n 'Financial Services',\n 'Retail',\n 'Hospitality',\n 'Energy',\n 'Media',\n]\nconst STRESS_TEST_SIZE_BUCKETS = ['1-10', '11-50', '51-200', '201-500', '500+']\nconst STRESS_TEST_EMAIL_DOMAIN = 'stress.test'\nconst STRESS_TEST_BUYING_ROLES = ['economic_buyer', 'champion', 'technical_evaluator', 'influencer']\nconst STRESS_TEST_PRONOUNS = ['they/them', 'she/her', 'he/him']\nconst STRESS_TEST_RELATIONSHIP_HEALTH = ['healthy', 'monitor', 'at_risk']\nconst STRESS_TEST_RENEWAL_QUARTERS = ['Q1', 'Q2', 'Q3', 'Q4']\nconst STRESS_TEST_ACTIVITY_SENTIMENT = ['positive', 'neutral', 'negative']\nconst STRESS_TEST_ACTIVITY_OWNERS = [\n 'Jordan Lane',\n 'Alex Rivers',\n 'Morgan Ellis',\n 'Taylor Chen',\n 'Casey Ortega',\n 'Riley Summers',\n]\nconst STRESS_TEST_DEAL_ACTIVITY_TYPES = ACTIVITY_TYPE_DEFAULTS.map((entry) => entry.value)\nconst STRESS_TEST_DEAL_STATUSES = DEAL_STATUS_DEFAULTS.map((entry) => entry.value)\nconst STRESS_TEST_DEAL_PIPELINE = PIPELINE_STAGE_DEFAULTS.map((entry) => entry.value)\nconst STRESS_TEST_DEAL_CUSTOMER_ROLES = ['evaluation lead', 'decision maker', 'influencer', 'sponsor']\nconst STRESS_TEST_DEAL_RISK = ['low', 'medium', 'high']\nconst STRESS_TEST_IMPLEMENTATION = ['light', 'standard', 'complex']\nconst STRESS_TEST_ACTIVITY_ICONS = ['lucide:phone-call', 'lucide:mail', 'lucide:calendar', 'lucide:users']\nconst STRESS_TEST_ACTIVITY_SUBJECTS = [\n 'Discovery call',\n 'Quarterly business review',\n 'Implementation planning',\n 'Renewal alignment',\n 'Expansion pitch',\n 'Stakeholder sync',\n 'Onboarding follow-up',\n]\nconst STRESS_TEST_ACTIVITY_BODIES = [\n 'Reviewed account metrics and confirmed action plan for next quarter.',\n 'Aligned on implementation milestones and risk mitigation.',\n 'Shared updated proposal and captured feedback from stakeholders.',\n 'Clarified contract terms and renewal incentives.',\n 'Coordinated pilot scope with the core project team.',\n 'Captured next steps for executive briefing.',\n]\nconst STRESS_TEST_NOTE_SNIPPETS = [\n 'Customer excited about roadmap items for Q3.',\n 'Need to loop in billing once pricing draft is approved.',\n 'Leadership wants a success story before expansion.',\n 'Security questionnaire still pending from customer.',\n 'Plan to introduce CS lead during next onsite visit.',\n 'Team asked for sandbox access for analytics squad.',\n]\n\nfunction toAmount(value?: number): string | null {\n if (typeof value !== 'number') return null\n return value.toFixed(2)\n}\n\nfunction randomChoice<T>(values: readonly T[]): T {\n return values[Math.floor(Math.random() * values.length)]\n}\n\nfunction randomInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nfunction slugifyValue(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(?:^-+|-+$)/g, '')\n}\n\nfunction buildPhone(index: number): string {\n const block = String(400 + (index % 500)).padStart(3, '0')\n const last = String(1000 + (index % 9000)).slice(0, 4)\n return `+1-555-${block}-${last}`\n}\n\nfunction randomPastDate(maxDaysOffset: number): Date {\n const now = Date.now()\n const days = Math.random() * Math.max(1, maxDaysOffset)\n const ms = days * 24 * 60 * 60 * 1000\n return new Date(now - ms)\n}\n\nfunction randomFutureDate(maxDaysOffset: number): Date {\n const now = Date.now()\n const days = Math.random() * Math.max(1, maxDaysOffset)\n const ms = days * 24 * 60 * 60 * 1000\n return new Date(now + ms)\n}\n\ntype ProgressInfo = {\n completed: number\n total: number\n}\n\ntype ProgressCallback = (info: ProgressInfo) => void\n\ntype StressTestOptions = {\n count: number\n onProgress?: ProgressCallback\n includeExtras?: boolean\n}\n\nfunction parseArgs(rest: string[]): Record<string, string> {\n const args: Record<string, string> = {}\n for (let i = 0; i < rest.length; i += 1) {\n const part = rest[i]\n if (!part?.startsWith('--')) continue\n const [keyRaw, valueRaw] = part.slice(2).split('=')\n if (keyRaw) {\n if (valueRaw !== undefined) args[keyRaw] = valueRaw\n else if (i + 1 < rest.length && !rest[i + 1].startsWith('--')) args[keyRaw] = rest[i + 1]\n else args[keyRaw] = 'true'\n }\n }\n return args\n}\n\nasync function seedCustomerDictionaries(em: EntityManager, { tenantId, organizationId }: SeedArgs) {\n for (const entry of ENTITY_STATUS_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'status',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of ENTITY_LIFECYCLE_STAGE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'lifecycle_stage',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of ENTITY_SOURCE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'source',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of ADDRESS_TYPE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'address_type',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of ACTIVITY_TYPE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'activity_type',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of JOB_TITLE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'job_title',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of DEAL_STATUS_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'deal_status',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of PIPELINE_STAGE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'pipeline_stage',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of INDUSTRY_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'industry',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n}\n\nfunction resolveCurrencyCodes(): string[] {\n const normalizedPriority = PRIORITY_CURRENCIES.map((code) => code.toUpperCase())\n const intlWithSupportedValues = Intl as typeof Intl & {\n supportedValuesOf?: (input: 'currency') => string[]\n }\n const supported: string[] =\n typeof intlWithSupportedValues.supportedValuesOf === 'function'\n ? intlWithSupportedValues.supportedValuesOf('currency')\n : []\n const normalizedSupported = supported\n .map((code) => code.toUpperCase())\n .filter((code) => /^[A-Z]{3}$/.test(code))\n const uniqueSupported: string[] = []\n const seen = new Set<string>(normalizedPriority)\n for (const code of normalizedSupported) {\n if (seen.has(code)) continue\n seen.add(code)\n uniqueSupported.push(code)\n }\n if (!uniqueSupported.length) {\n console.warn('[customers.cli] Intl.supportedValuesOf(\"currency\") unavailable; seeding minimal currency list.')\n return normalizedPriority\n }\n uniqueSupported.sort((a, b) => a.localeCompare(b))\n return [...normalizedPriority, ...uniqueSupported]\n}\n\nfunction resolveCurrencyLabel(code: string): string {\n try {\n const intlWithDisplayNames = Intl as typeof Intl & {\n DisplayNames?: new (locales: string[], options: { type: 'currency' }) => {\n of(value: string): string | undefined\n }\n }\n if (typeof intlWithDisplayNames.DisplayNames === 'function') {\n const displayNames = new intlWithDisplayNames.DisplayNames(['en'], { type: 'currency' })\n const label = displayNames.of(code)\n if (typeof label === 'string' && label.trim().length) {\n return `${code} \u2013 ${label}`\n }\n }\n } catch (err) {\n console.warn('[customers.cli] Unable to resolve currency label for', code, err)\n }\n return code\n}\n\nasync function seedCurrencyDictionary(em: EntityManager, { tenantId, organizationId }: SeedArgs) {\n let dictionary = await em.findOne(Dictionary, {\n tenantId,\n organizationId,\n key: 'currency',\n deletedAt: null,\n })\n if (!dictionary) {\n dictionary = em.create(Dictionary, {\n key: 'currency',\n name: 'Currencies',\n description: 'ISO 4217 currencies',\n tenantId,\n organizationId,\n isSystem: true,\n isActive: true,\n managerVisibility: 'default' satisfies DictionaryManagerVisibility,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(dictionary)\n await em.flush()\n }\n\n const existingEntries = await em.find(DictionaryEntry, {\n dictionary,\n tenantId,\n organizationId,\n })\n const existingMap = new Map<string, DictionaryEntry>()\n existingEntries.forEach((entry) => existingMap.set(entry.value.toUpperCase(), entry))\n\n const currencyCodes = resolveCurrencyCodes()\n for (const code of currencyCodes) {\n const upper = code.toUpperCase()\n const normalizedValue = upper.toLowerCase()\n const label = resolveCurrencyLabel(upper)\n const current = existingMap.get(upper)\n if (current) {\n if (current.label !== label) {\n current.label = label\n current.updatedAt = new Date()\n em.persist(current)\n }\n continue\n }\n const entry = em.create(DictionaryEntry, {\n dictionary,\n tenantId,\n organizationId,\n value: upper,\n normalizedValue,\n label,\n color: null,\n icon: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(entry)\n }\n}\n\nasync function seedCustomerExamples(\n em: EntityManager,\n container: AppContainer,\n { tenantId, organizationId }: SeedArgs\n): Promise<boolean> {\n const exampleDealTitles = Array.from(\n new Set(\n CUSTOMER_EXAMPLES.flatMap((company) =>\n (company.deals ?? []).map((deal) => deal.title).filter((title): title is string => typeof title === 'string')\n )\n )\n )\n if (exampleDealTitles.length > 0) {\n const already = await em.count(CustomerDeal, {\n tenantId,\n organizationId,\n title: { $in: exampleDealTitles as any },\n })\n if (already > 0) {\n return false\n }\n }\n\n await seedCustomerDictionaries(em, { tenantId, organizationId })\n\n const seededIndustryValues = new Set(\n CUSTOMER_EXAMPLES.map((company) => (typeof company.industry === 'string' ? company.industry.trim() : ''))\n .filter((value): value is string => value.length > 0)\n )\n for (const value of seededIndustryValues) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'industry',\n value,\n label: value,\n })\n }\n\n let cache: CacheStrategy | null = null\n if (typeof (container as any).hasRegistration === 'function' && container.hasRegistration('cache')) {\n try {\n cache = (container.resolve('cache') as CacheStrategy)\n } catch {\n cache = null\n }\n }\n try {\n await installCustomEntitiesFromModules(em, cache, {\n tenantIds: [tenantId],\n includeGlobal: false,\n dryRun: false,\n logger: () => {},\n })\n } catch (err) {\n console.warn('[customers.cli] Failed to install custom entities before seeding examples', err)\n }\n\n try {\n await ensureCustomFieldDefinitions(\n em,\n CUSTOMER_CUSTOM_FIELD_SETS,\n { organizationId: null, tenantId }\n )\n } catch (err) {\n console.warn('[customers.cli] Failed to ensure customer custom field definitions', err)\n }\n\n const dataEngine = new DefaultDataEngine(em, container)\n const customFieldAssignments: Array<() => Promise<void>> = []\n\n const companyEntities = new Map<string, CustomerEntity>()\n const personEntities = new Map<string, CustomerEntity>()\n\n for (const company of CUSTOMER_EXAMPLES) {\n const companyEntity = em.create(CustomerEntity, {\n organizationId,\n tenantId,\n kind: 'company',\n displayName: company.displayName,\n description: company.description ?? null,\n primaryEmail: company.primaryEmail ?? null,\n primaryPhone: company.primaryPhone ?? null,\n lifecycleStage: company.lifecycleStage ?? null,\n status: company.status ?? null,\n source: company.source ?? null,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n const companyProfile = em.create(CustomerCompanyProfile, {\n organizationId,\n tenantId,\n entity: companyEntity,\n legalName: company.legalName ?? null,\n brandName: company.brandName ?? null,\n domain: company.domain ?? null,\n websiteUrl: company.websiteUrl ?? null,\n industry: typeof company.industry === 'string' ? company.industry.trim() || null : null,\n sizeBucket: company.sizeBucket ?? null,\n annualRevenue: typeof company.annualRevenue === 'number' ? toAmount(company.annualRevenue) : null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(companyEntity)\n em.persist(companyProfile)\n\n if (company.custom && Object.keys(company.custom).length) {\n const values = { ...company.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_company_profile,\n recordId: companyProfile.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n\n if (company.address?.addressLine1) {\n const address = em.create(CustomerAddress, {\n organizationId,\n tenantId,\n entity: companyEntity,\n name: company.address.name ?? null,\n purpose: company.address.purpose ?? 'office',\n addressLine1: company.address.addressLine1,\n addressLine2: company.address.addressLine2 ?? null,\n city: company.address.city ?? null,\n region: company.address.region ?? null,\n postalCode: company.address.postalCode ?? null,\n country: company.address.country ?? null,\n latitude: company.address.latitude ?? null,\n longitude: company.address.longitude ?? null,\n buildingNumber: company.address.buildingNumber ?? null,\n flatNumber: company.address.flatNumber ?? null,\n isPrimary: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(address)\n }\n\n companyEntities.set(company.slug, companyEntity)\n\n for (const person of company.people ?? []) {\n const nameParts = [person.firstName, person.lastName].filter((part) => !!part && part.trim().length)\n const displayName = nameParts.length ? nameParts.join(' ') : person.email\n const personEntity = em.create(CustomerEntity, {\n organizationId,\n tenantId,\n kind: 'person',\n displayName,\n description: person.description ?? null,\n primaryEmail: person.email,\n primaryPhone: person.phone ?? null,\n lifecycleStage: company.lifecycleStage ?? null,\n status: 'active',\n source: person.source ?? company.source ?? null,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n const personProfile = em.create(CustomerPersonProfile, {\n organizationId,\n tenantId,\n entity: personEntity,\n company: companyEntity,\n firstName: person.firstName,\n lastName: person.lastName,\n preferredName: person.preferredName ?? null,\n jobTitle: person.jobTitle ?? null,\n department: person.department ?? null,\n seniority: person.seniority ?? null,\n timezone: person.timezone ?? null,\n linkedInUrl: person.linkedInUrl ?? null,\n twitterUrl: person.twitterUrl ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(personEntity)\n em.persist(personProfile)\n\n if (person.custom && Object.keys(person.custom).length) {\n const values = { ...person.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_person_profile,\n recordId: personProfile.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n\n if (person.address?.addressLine1) {\n const address = em.create(CustomerAddress, {\n organizationId,\n tenantId,\n entity: personEntity,\n name: person.address.name ?? null,\n purpose: person.address.purpose ?? 'work',\n addressLine1: person.address.addressLine1,\n addressLine2: person.address.addressLine2 ?? null,\n city: person.address.city ?? null,\n region: person.address.region ?? null,\n postalCode: person.address.postalCode ?? null,\n country: person.address.country ?? null,\n latitude: person.address.latitude ?? null,\n longitude: person.address.longitude ?? null,\n buildingNumber: person.address.buildingNumber ?? null,\n flatNumber: person.address.flatNumber ?? null,\n isPrimary: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(address)\n }\n\n personEntities.set(person.slug, personEntity)\n }\n\n for (const interaction of company.interactions ?? []) {\n const targetEntity =\n interaction.entity === 'person' && interaction.personSlug\n ? personEntities.get(interaction.personSlug)\n : companyEntity\n if (!targetEntity) continue\n const activity = em.create(CustomerActivity, {\n organizationId,\n tenantId,\n entity: targetEntity,\n deal: null,\n activityType: interaction.type,\n subject: interaction.subject ?? null,\n body: interaction.body ?? null,\n occurredAt: interaction.occurredAt ? new Date(interaction.occurredAt) : null,\n appearanceIcon: interaction.icon ?? null,\n appearanceColor: interaction.color ?? null,\n authorUserId: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n\n if (interaction.custom && Object.keys(interaction.custom).length) {\n const values = { ...interaction.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_activity,\n recordId: activity.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n }\n\n for (const note of company.notes ?? []) {\n const targetEntity =\n note.entity === 'person' && note.personSlug ? personEntities.get(note.personSlug) : companyEntity\n if (!targetEntity) continue\n const comment = em.create(CustomerComment, {\n organizationId,\n tenantId,\n entity: targetEntity,\n deal: null,\n body: note.body,\n authorUserId: null,\n appearanceIcon: note.icon ?? null,\n appearanceColor: note.color ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n if (note.occurredAt) {\n const timestamp = new Date(note.occurredAt)\n if (!Number.isNaN(timestamp.getTime())) {\n comment.createdAt = timestamp\n comment.updatedAt = timestamp\n }\n }\n em.persist(comment)\n }\n }\n\n for (const company of CUSTOMER_EXAMPLES) {\n const companyEntity = companyEntities.get(company.slug)\n if (!companyEntity) continue\n for (const dealInfo of company.deals ?? []) {\n const deal = em.create(CustomerDeal, {\n organizationId,\n tenantId,\n title: dealInfo.title,\n description: dealInfo.description ?? null,\n status: dealInfo.status,\n pipelineStage: dealInfo.pipelineStage ?? null,\n valueAmount: toAmount(dealInfo.valueAmount),\n valueCurrency:\n dealInfo.valueCurrency ?? (typeof dealInfo.valueAmount === 'number' ? 'USD' : null),\n probability:\n typeof dealInfo.probability === 'number' ? Math.round(dealInfo.probability) : null,\n expectedCloseAt: dealInfo.expectedCloseAt ? new Date(dealInfo.expectedCloseAt) : null,\n ownerUserId: null,\n source: dealInfo.source ?? company.source ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(deal)\n\n if (dealInfo.custom && Object.keys(dealInfo.custom).length) {\n const values = { ...dealInfo.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_deal,\n recordId: deal.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n\n const companyLink = em.create(CustomerDealCompanyLink, {\n deal,\n company: companyEntity,\n createdAt: new Date(),\n })\n em.persist(companyLink)\n\n for (const participant of dealInfo.people ?? []) {\n const personEntity = personEntities.get(participant.slug)\n if (!personEntity) continue\n const link = em.create(CustomerDealPersonLink, {\n deal,\n person: personEntity,\n participantRole: participant.participantRole ?? null,\n createdAt: new Date(),\n })\n em.persist(link)\n }\n\n for (const activityInfo of dealInfo.activities ?? []) {\n const targetEntity =\n activityInfo.entity === 'person' && activityInfo.personSlug\n ? personEntities.get(activityInfo.personSlug)\n : companyEntity\n if (!targetEntity) continue\n const activity = em.create(CustomerActivity, {\n organizationId,\n tenantId,\n entity: targetEntity,\n deal,\n activityType: activityInfo.type,\n subject: activityInfo.subject ?? null,\n body: activityInfo.body ?? null,\n occurredAt: activityInfo.occurredAt ? new Date(activityInfo.occurredAt) : null,\n appearanceIcon: activityInfo.icon ?? null,\n appearanceColor: activityInfo.color ?? null,\n authorUserId: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n\n if (activityInfo.custom && Object.keys(activityInfo.custom).length) {\n const values = { ...activityInfo.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_activity,\n recordId: activity.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n }\n }\n }\n\n await em.flush()\n\n for (const assign of customFieldAssignments) {\n try {\n await assign()\n } catch (err) {\n console.warn('[customers.cli] Failed to set custom fields for seeded record', err)\n }\n }\n\n return true\n}\n\nasync function seedCustomerStressTest(\n em: EntityManager,\n container: AppContainer,\n { tenantId, organizationId }: SeedArgs,\n options: StressTestOptions\n): Promise<{ created: number; existing: number }> {\n const requested = Math.max(0, Math.floor(options.count ?? 0))\n if (requested <= 0) return { created: 0, existing: 0 }\n\n const includeExtras = options.includeExtras !== false\n\n const existingPersons = await em.count(CustomerEntity, {\n tenantId,\n organizationId,\n kind: 'person',\n source: STRESS_TEST_SOURCE,\n })\n\n if (existingPersons >= requested) {\n options.onProgress?.({ completed: 0, total: 0 })\n return { created: 0, existing: existingPersons }\n }\n\n const toCreate = requested - existingPersons\n const statusOptions = ENTITY_STATUS_DEFAULTS.map((entry) => entry.value)\n const lifecycleOptions = ENTITY_LIFECYCLE_STAGE_DEFAULTS.map((entry) => entry.value)\n const companyCount = Math.max(1, Math.min(toCreate, Math.round(toCreate / 3)))\n\n const total = toCreate\n options.onProgress?.({ completed: 0, total })\n const startedAt = Date.now()\n\n await seedCustomerDictionaries(em, { tenantId, organizationId })\n\n let cache: CacheStrategy | null = null\n if (includeExtras) {\n if (typeof (container as any).hasRegistration === 'function' && container.hasRegistration('cache')) {\n try {\n cache = (container.resolve('cache') as CacheStrategy)\n } catch {\n cache = null\n }\n }\n try {\n await installCustomEntitiesFromModules(em, cache, {\n tenantIds: [tenantId],\n includeGlobal: false,\n dryRun: false,\n logger: () => {},\n })\n } catch (err) {\n console.warn('[customers.cli] Failed to install custom entities before stress-test seeding', err)\n }\n try {\n await ensureCustomFieldDefinitions(em, CUSTOMER_CUSTOM_FIELD_SETS, { organizationId: null, tenantId })\n } catch (err) {\n console.warn('[customers.cli] Failed to ensure custom field definitions for stress-test seeding', err)\n }\n }\n\n type Primitive = string | number | boolean | null | undefined\n\n type PendingCustomFieldAssignment = {\n entityId: string\n organizationId: string | null\n tenantId: string | null\n values: Record<string, Primitive | Primitive[] | undefined>\n getRecordId: () => string | undefined\n registeredForIndex?: boolean\n }\n\n type CustomFieldInsertRow = {\n entityId: string\n recordId: string\n organizationId: string | null\n tenantId: string | null\n fieldKey: string\n valueText?: string | null\n valueMultiline?: string | null\n valueInt?: number | null\n valueFloat?: number | null\n valueBool?: boolean | null\n }\n\n const pendingAssignments: PendingCustomFieldAssignment[] = []\n const cfRowBuffer: CustomFieldInsertRow[] = []\n const assignmentFlushThreshold = includeExtras ? 100 : 0\n const cfInsertBatchSize = 500\n const flushInterval = 100\n const knex = em.getConnection().getKnex()\n const entityIndexesColumns = await knex('entity_indexes')\n .columnInfo()\n .catch(() => ({} as Record<string, unknown>))\n const hasColumn = (name: string) =>\n Object.keys(entityIndexesColumns).some((col) => col.toLowerCase() === name.toLowerCase())\n const supportsOrgCoalesced = hasColumn('organization_id_coalesced')\n\n type PendingIndexDoc = {\n entityType: string\n recordId: string\n organizationId: string | null\n tenantId: string | null\n baseRow: Record<string, any>\n customFields: IndexCustomFieldValue[]\n createdAt: Date\n updatedAt: Date\n }\n\n const pendingIndexDocs = new Map<string, Map<string, PendingIndexDoc>>()\n\n const ensureIndexDoc = (\n entityType: string,\n recordId: string,\n initializer: () => PendingIndexDoc,\n ): PendingIndexDoc => {\n let bucket = pendingIndexDocs.get(entityType)\n if (!bucket) {\n bucket = new Map<string, PendingIndexDoc>()\n pendingIndexDocs.set(entityType, bucket)\n }\n let doc = bucket.get(recordId)\n if (!doc) {\n doc = initializer()\n bucket.set(recordId, doc)\n }\n return doc\n }\n\n const registerIndexBaseRow = (entityType: string, row: Record<string, any>) => {\n const recordId = String((row as any).id)\n const createdAt = ((row as any).created_at as Date) ?? new Date()\n const updatedAt = ((row as any).updated_at as Date) ?? createdAt\n const organizationId = ((row as any).organization_id ?? null) as string | null\n const tenantId = ((row as any).tenant_id ?? null) as string | null\n const doc = ensureIndexDoc(entityType, recordId, () => ({\n entityType,\n recordId,\n organizationId,\n tenantId,\n baseRow: { ...row },\n customFields: [],\n createdAt,\n updatedAt,\n }))\n doc.entityType = entityType\n doc.recordId = recordId\n doc.organizationId = organizationId\n doc.tenantId = tenantId\n doc.baseRow = { ...row }\n doc.createdAt = createdAt\n doc.updatedAt = updatedAt\n }\n\n const appendIndexCustomFields = (\n entityType: string,\n recordId: string,\n scope: { organizationId: string | null; tenantId: string | null },\n values: Record<string, Primitive | Primitive[] | undefined>,\n ) => {\n const doc = ensureIndexDoc(entityType, recordId, () => ({\n entityType,\n recordId,\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n baseRow: {},\n customFields: [],\n createdAt: new Date(),\n updatedAt: new Date(),\n }))\n doc.organizationId = scope.organizationId\n doc.tenantId = scope.tenantId\n for (const [key, raw] of Object.entries(values)) {\n if (raw === undefined) continue\n const pushValue = (value: Primitive) => {\n doc.customFields.push({\n key,\n value: value ?? null,\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n })\n }\n if (Array.isArray(raw)) {\n for (const entry of raw as Primitive[]) pushValue(entry)\n } else {\n pushValue(raw as Primitive)\n }\n }\n }\n\n const flushIndexDocs = async (trx: any) => {\n const rows: Array<{\n entity_type: string\n entity_id: string\n organization_id: string | null\n tenant_id: string | null\n doc: Record<string, unknown>\n index_version: number\n created_at: Date\n updated_at: Date\n deleted_at: null\n }> = []\n for (const [entityType, bucket] of pendingIndexDocs.entries()) {\n for (const entry of bucket.values()) {\n if (!entry.baseRow || Object.keys(entry.baseRow).length === 0) continue\n rows.push({\n entity_type: entityType,\n entity_id: entry.recordId,\n organization_id: entry.organizationId,\n tenant_id: entry.tenantId,\n doc: buildIndexDocument(entry.baseRow, entry.customFields, {\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n }),\n index_version: 1,\n created_at: entry.createdAt,\n updated_at: entry.updatedAt,\n deleted_at: null,\n })\n }\n bucket.clear()\n }\n if (!rows.length) {\n pendingIndexDocs.clear()\n return\n }\n if (supportsOrgCoalesced) {\n await trx('entity_indexes')\n .insert(rows)\n .onConflict(['entity_type', 'entity_id', 'organization_id_coalesced'])\n .merge({\n doc: trx.raw('excluded.doc'),\n index_version: trx.raw('excluded.index_version'),\n organization_id: trx.raw('excluded.organization_id'),\n tenant_id: trx.raw('excluded.tenant_id'),\n deleted_at: trx.raw('excluded.deleted_at'),\n updated_at: trx.raw('excluded.updated_at'),\n })\n } else {\n for (const row of rows) {\n const updatePayload = {\n doc: row.doc,\n index_version: row.index_version,\n organization_id: row.organization_id,\n tenant_id: row.tenant_id,\n updated_at: row.updated_at,\n deleted_at: null as null,\n }\n const updated = await trx('entity_indexes')\n .where({\n entity_type: row.entity_type,\n entity_id: row.entity_id,\n organization_id: row.organization_id,\n })\n .update(updatePayload)\n if (updated) continue\n try {\n await trx('entity_indexes').insert(row)\n } catch {\n // ignored: row inserted concurrently\n }\n }\n }\n pendingIndexDocs.clear()\n }\n\n const queueCustomFieldAssignment = (assignment: PendingCustomFieldAssignment) => {\n if (!includeExtras) return\n const recordId = assignment.getRecordId()\n if (recordId) {\n appendIndexCustomFields(\n assignment.entityId,\n recordId,\n { organizationId: assignment.organizationId ?? null, tenantId: assignment.tenantId ?? null },\n assignment.values,\n )\n assignment.registeredForIndex = true\n }\n pendingAssignments.push(assignment)\n }\n\n const appendRow = (row: CustomFieldInsertRow) => {\n cfRowBuffer.push(row)\n }\n\n const materializeAssignments = () => {\n if (!pendingAssignments.length) return\n for (const assignment of pendingAssignments.splice(0)) {\n const recordId = assignment.getRecordId()\n if (!recordId) continue\n if (!assignment.registeredForIndex) {\n appendIndexCustomFields(\n assignment.entityId,\n recordId,\n { organizationId: assignment.organizationId ?? null, tenantId: assignment.tenantId ?? null },\n assignment.values,\n )\n assignment.registeredForIndex = true\n }\n for (const [fieldKey, raw] of Object.entries(assignment.values)) {\n if (raw === undefined) continue\n if (Array.isArray(raw)) {\n for (const val of raw as Primitive[]) {\n appendRow(buildCustomFieldRow(assignment, recordId, fieldKey, val))\n }\n } else {\n appendRow(buildCustomFieldRow(assignment, recordId, fieldKey, raw))\n }\n }\n }\n }\n\n const buildCustomFieldRow = (\n assignment: PendingCustomFieldAssignment,\n recordId: string,\n fieldKey: string,\n value: Primitive\n ): CustomFieldInsertRow => {\n const base: CustomFieldInsertRow = {\n entityId: assignment.entityId,\n recordId,\n organizationId: assignment.organizationId ?? null,\n tenantId: assignment.tenantId ?? null,\n fieldKey,\n }\n if (value === null || value === undefined) {\n base.valueText = null\n return base\n }\n if (typeof value === 'boolean') {\n base.valueBool = value\n return base\n }\n if (typeof value === 'number') {\n if (Number.isInteger(value)) base.valueInt = value\n else base.valueFloat = value\n return base\n }\n base.valueText = String(value)\n return base\n }\n\n const flushCustomFieldRows = async (force: boolean) => {\n if (!includeExtras) return\n if (!force && cfRowBuffer.length < cfInsertBatchSize) return\n if (!cfRowBuffer.length) return\n const chunkSize = cfInsertBatchSize\n while (cfRowBuffer.length) {\n const chunk = cfRowBuffer.splice(0, chunkSize)\n const timestamp = new Date()\n const payload = chunk.map((row) => ({\n entity_id: row.entityId,\n record_id: row.recordId,\n organization_id: row.organizationId,\n tenant_id: row.tenantId,\n field_key: row.fieldKey,\n value_text: row.valueText ?? null,\n value_multiline: row.valueMultiline ?? null,\n value_int: row.valueInt ?? null,\n value_float: row.valueFloat ?? null,\n value_bool: row.valueBool ?? null,\n created_at: timestamp,\n deleted_at: null,\n }))\n await knex.insert(payload).into('custom_field_values')\n }\n }\n\n const flushAssignments = async (force = false) => {\n if (!includeExtras) {\n if (force) await em.flush()\n return\n }\n if (!force && pendingAssignments.length < assignmentFlushThreshold && cfRowBuffer.length < cfInsertBatchSize) return\n await em.flush()\n materializeAssignments()\n await flushCustomFieldRows(force)\n }\n\n // bulk insert data structures and generation implemented below\n\n type CustomerEntityRow = {\n id: string\n organization_id: string\n tenant_id: string\n kind: 'company' | 'person'\n display_name: string\n description: string | null\n owner_user_id: string | null\n primary_email: string | null\n primary_phone: string | null\n status: string | null\n lifecycle_stage: string | null\n source: string | null\n next_interaction_at: Date | null\n next_interaction_name: string | null\n next_interaction_ref_id: string | null\n next_interaction_icon: string | null\n next_interaction_color: string | null\n is_active: boolean\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n }\n\n type CustomerCompanyProfileRow = {\n id: string\n organization_id: string\n tenant_id: string\n entity_id: string\n legal_name: string | null\n brand_name: string | null\n domain: string | null\n website_url: string | null\n industry: string | null\n size_bucket: string | null\n annual_revenue: string | null\n created_at: Date\n updated_at: Date\n }\n\n type CustomerPersonProfileRow = {\n id: string\n organization_id: string\n tenant_id: string\n entity_id: string\n company_entity_id: string | null\n first_name: string | null\n last_name: string | null\n preferred_name: string | null\n job_title: string | null\n department: string | null\n seniority: string | null\n timezone: string | null\n linked_in_url: string | null\n twitter_url: string | null\n created_at: Date\n updated_at: Date\n }\n\n type CustomerDealRow = {\n id: string\n organization_id: string\n tenant_id: string\n title: string\n description: string | null\n status: string\n pipeline_stage: string | null\n value_amount: string | null\n value_currency: string | null\n probability: number | null\n expected_close_at: Date | null\n owner_user_id: string | null\n source: string | null\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n }\n\n type CustomerDealCompanyRow = {\n id: string\n deal_id: string\n company_entity_id: string\n created_at: Date\n }\n\n type CustomerDealPersonRow = {\n id: string\n deal_id: string\n person_entity_id: string\n role: string | null\n created_at: Date\n }\n\n type CustomerActivityRow = {\n id: string\n organization_id: string\n tenant_id: string\n entity_id: string\n deal_id: string | null\n activity_type: string\n subject: string | null\n body: string | null\n occurred_at: Date | null\n author_user_id: string | null\n appearance_icon: string | null\n appearance_color: string | null\n created_at: Date\n updated_at: Date\n }\n\n type CustomerCommentRow = {\n id: string\n organization_id: string\n tenant_id: string\n entity_id: string\n deal_id: string | null\n body: string\n author_user_id: string | null\n appearance_icon: string | null\n appearance_color: string | null\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n }\n\n type CompanyRecord = {\n entityId: string\n companyProfileId: string\n status: string | null\n lifecycleStage: string | null\n source: string | null\n displayName: string\n }\n\n const customerEntityRows: CustomerEntityRow[] = []\n const companyProfileRows: CustomerCompanyProfileRow[] = []\n const personProfileRows: CustomerPersonProfileRow[] = []\n const dealRows: CustomerDealRow[] = []\n const dealCompanyRows: CustomerDealCompanyRow[] = []\n const dealPersonRows: CustomerDealPersonRow[] = []\n const activityRows: CustomerActivityRow[] = []\n const commentRows: CustomerCommentRow[] = []\n const companies: CompanyRecord[] = []\n const entityInsertBatchSize = 1000\n const contactsPerCompany = Math.max(1, Math.ceil(toCreate / companyCount))\n\n await warnIfStressTestSchemaChanged(knex)\n\n const insertRows = async (trx: any, table: string, rows: unknown[]) => {\n if (!rows.length) return\n await trx.batchInsert(table, rows, entityInsertBatchSize)\n rows.length = 0\n }\n\n const flushEntityRows = async (force = false) => {\n if (!force) return\n const pendingCount =\n customerEntityRows.length +\n companyProfileRows.length +\n personProfileRows.length +\n dealRows.length +\n dealCompanyRows.length +\n dealPersonRows.length +\n activityRows.length +\n commentRows.length\n if (pendingCount === 0) return\n await knex.transaction(async (trx) => {\n await insertRows(trx, 'customer_entities', customerEntityRows)\n await insertRows(trx, 'customer_companies', companyProfileRows)\n await insertRows(trx, 'customer_people', personProfileRows)\n if (includeExtras) {\n await insertRows(trx, 'customer_deals', dealRows)\n await insertRows(trx, 'customer_deal_companies', dealCompanyRows)\n await insertRows(trx, 'customer_deal_people', dealPersonRows)\n await insertRows(trx, 'customer_activities', activityRows)\n await insertRows(trx, 'customer_comments', commentRows)\n }\n await flushIndexDocs(trx)\n })\n }\n\n const createCompanyRecord = (): CompanyRecord => {\n const companyId = randomUUID()\n const profileId = randomUUID()\n const status = randomChoice(statusOptions)\n const lifecycleStage = randomChoice(lifecycleOptions)\n const prefix = randomChoice(STRESS_TEST_COMPANY_PREFIX)\n const suffix = randomChoice(STRESS_TEST_COMPANY_SUFFIX)\n const baseName = `${prefix} ${suffix}`\n const sequence = existingPersons + companies.length + 1\n const displayName = `${baseName} ${sequence}`\n const domainBase = slugifyValue(`${prefix}-${suffix}-${sequence}`) || `company-${sequence}`\n const domain = `${domainBase}.${STRESS_TEST_EMAIL_DOMAIN}`\n const websiteUrl = `https://www.${domain}`\n const primaryEmail = `hello@${domain}`\n const primaryPhone = buildPhone(sequence)\n const timestamp = new Date()\n const entityRow: CustomerEntityRow = {\n id: companyId,\n organization_id: organizationId,\n tenant_id: tenantId,\n kind: 'company',\n display_name: displayName,\n description: `Stress test company #${sequence}`,\n owner_user_id: null,\n primary_email: primaryEmail,\n primary_phone: primaryPhone,\n status,\n lifecycle_stage: lifecycleStage,\n source: STRESS_TEST_SOURCE,\n next_interaction_at: null,\n next_interaction_name: null,\n next_interaction_ref_id: null,\n next_interaction_icon: null,\n next_interaction_color: null,\n is_active: true,\n created_at: timestamp,\n updated_at: timestamp,\n deleted_at: null,\n }\n customerEntityRows.push(entityRow)\n registerIndexBaseRow(CoreEntities.customers.customer_entity, entityRow)\n const profileRow: CustomerCompanyProfileRow = {\n id: profileId,\n organization_id: organizationId,\n tenant_id: tenantId,\n entity_id: companyId,\n legal_name: `${displayName} LLC`,\n brand_name: baseName,\n domain,\n website_url: websiteUrl,\n industry: randomChoice(STRESS_TEST_INDUSTRIES),\n size_bucket: randomChoice(STRESS_TEST_SIZE_BUCKETS),\n annual_revenue: null,\n created_at: timestamp,\n updated_at: timestamp,\n }\n companyProfileRows.push(profileRow)\n registerIndexBaseRow(CoreEntities.customers.customer_company_profile, profileRow)\n const record: CompanyRecord = {\n entityId: companyId,\n companyProfileId: profileId,\n status,\n lifecycleStage,\n source: STRESS_TEST_SOURCE,\n displayName,\n }\n if (includeExtras) {\n const companyFieldValues: Record<string, Primitive | Primitive[]> = {\n relationship_health: randomChoice(STRESS_TEST_RELATIONSHIP_HEALTH),\n renewal_quarter: randomChoice(STRESS_TEST_RENEWAL_QUARTERS),\n customer_marketing_case: Math.random() < 0.35,\n }\n if (Math.random() < 0.4) companyFieldValues.executive_notes = randomChoice(STRESS_TEST_NOTE_SNIPPETS)\n queueCustomFieldAssignment({\n entityId: CoreEntities.customers.customer_company_profile,\n organizationId,\n tenantId,\n values: companyFieldValues,\n getRecordId: () => profileId,\n })\n }\n companies.push(record)\n return record\n }\n\n let created = 0\n for (let i = 0; i < toCreate; i += 1) {\n const desiredCompanyIndex = Math.floor(i / contactsPerCompany)\n while (companies.length <= desiredCompanyIndex && companies.length < companyCount) {\n createCompanyRecord()\n }\n const companyRecord =\n companies[Math.min(desiredCompanyIndex, companies.length - 1)] ?? createCompanyRecord()\n\n const sequence = existingPersons + i + 1\n const timestamp = new Date()\n const firstName = randomChoice(STRESS_TEST_FIRST_NAMES)\n const lastName = randomChoice(STRESS_TEST_LAST_NAMES)\n const displayName = `${firstName} ${lastName}`\n const emailHandle = slugifyValue(`${firstName}.${lastName}`) || `contact-${sequence}`\n const email = `${emailHandle}.${sequence}@${STRESS_TEST_EMAIL_DOMAIN}`\n const timezone = randomChoice(STRESS_TEST_TIMEZONES)\n const personEntityId = randomUUID()\n const personEntityRow: CustomerEntityRow = {\n id: personEntityId,\n organization_id: organizationId,\n tenant_id: tenantId,\n kind: 'person',\n display_name: displayName,\n description: `Stress test contact #${sequence}`,\n owner_user_id: null,\n primary_email: email,\n primary_phone: buildPhone(sequence),\n status: companyRecord.status,\n lifecycle_stage: companyRecord.lifecycleStage,\n source: companyRecord.source,\n next_interaction_at: null,\n next_interaction_name: null,\n next_interaction_ref_id: null,\n next_interaction_icon: null,\n next_interaction_color: null,\n is_active: true,\n created_at: timestamp,\n updated_at: timestamp,\n deleted_at: null,\n }\n customerEntityRows.push(personEntityRow)\n registerIndexBaseRow(CoreEntities.customers.customer_entity, personEntityRow)\n const personProfileId = randomUUID()\n const personProfileRow: CustomerPersonProfileRow = {\n id: personProfileId,\n organization_id: organizationId,\n tenant_id: tenantId,\n entity_id: personEntityId,\n company_entity_id: companyRecord.entityId,\n first_name: firstName,\n last_name: lastName,\n preferred_name: firstName,\n job_title: randomChoice(STRESS_TEST_JOB_TITLES),\n department: randomChoice(STRESS_TEST_DEPARTMENTS),\n seniority: randomChoice(STRESS_TEST_SENIORITY),\n timezone,\n linked_in_url: `https://www.linkedin.com/in/${emailHandle}${sequence}`,\n twitter_url: `https://twitter.com/${emailHandle}${sequence}`,\n created_at: timestamp,\n updated_at: timestamp,\n }\n personProfileRows.push(personProfileRow)\n registerIndexBaseRow(CoreEntities.customers.customer_person_profile, personProfileRow)\n\n if (includeExtras) {\n const personFieldValues: Record<string, Primitive | Primitive[]> = {\n buying_role: randomChoice(STRESS_TEST_BUYING_ROLES),\n preferred_pronouns: randomChoice(STRESS_TEST_PRONOUNS),\n newsletter_opt_in: Math.random() < 0.5,\n }\n queueCustomFieldAssignment({\n entityId: CoreEntities.customers.customer_person_profile,\n organizationId,\n tenantId,\n values: personFieldValues,\n getRecordId: () => personProfileId,\n })\n\n const monetaryBase = randomInt(5, 220) * 1000\n const pipelineStage = randomChoice(STRESS_TEST_DEAL_PIPELINE)\n const dealStatus = randomChoice(STRESS_TEST_DEAL_STATUSES)\n const dealId = randomUUID()\n const valueAmount = toAmount(monetaryBase + randomInt(0, 7500))\n const expectedCloseAt =\n dealStatus === 'win' || dealStatus === 'closed' || dealStatus === 'loose'\n ? randomPastDate(120)\n : randomFutureDate(120)\n const dealRow: CustomerDealRow = {\n id: dealId,\n organization_id: organizationId,\n tenant_id: tenantId,\n title: `${companyRecord.displayName} Opportunity ${sequence}`,\n description: `Stress test deal generated for contact #${sequence}`,\n status: dealStatus,\n pipeline_stage: pipelineStage ?? null,\n value_amount: valueAmount,\n value_currency: Math.random() < 0.6 ? 'USD' : 'EUR',\n probability: randomInt(25, 95),\n expected_close_at: expectedCloseAt,\n owner_user_id: null,\n source: companyRecord.source,\n created_at: timestamp,\n updated_at: timestamp,\n deleted_at: null,\n }\n dealRows.push(dealRow)\n registerIndexBaseRow(CoreEntities.customers.customer_deal, dealRow)\n dealCompanyRows.push({\n id: randomUUID(),\n deal_id: dealId,\n company_entity_id: companyRecord.entityId,\n created_at: timestamp,\n })\n dealPersonRows.push({\n id: randomUUID(),\n deal_id: dealId,\n person_entity_id: personEntityId,\n role: randomChoice(STRESS_TEST_DEAL_CUSTOMER_ROLES),\n created_at: timestamp,\n })\n\n queueCustomFieldAssignment({\n entityId: CoreEntities.customers.customer_deal,\n organizationId,\n tenantId,\n values: {\n competitive_risk: randomChoice(STRESS_TEST_DEAL_RISK),\n implementation_complexity: randomChoice(STRESS_TEST_IMPLEMENTATION),\n estimated_seats: randomInt(5, 250),\n requires_legal_review: Math.random() < 0.3,\n },\n getRecordId: () => dealId,\n })\n\n const activityCount = randomInt(2, 5)\n for (let idx = 0; idx < activityCount; idx += 1) {\n const activityType = randomChoice(STRESS_TEST_DEAL_ACTIVITY_TYPES)\n const activityId = randomUUID()\n const targetEntityId = activityType === 'person' ? personEntityId : companyRecord.entityId\n const occurredAt = randomPastDate(200)\n const activityRow: CustomerActivityRow = {\n id: activityId,\n organization_id: organizationId,\n tenant_id: tenantId,\n entity_id: targetEntityId,\n deal_id: dealId,\n activity_type: activityType,\n subject: randomChoice(STRESS_TEST_ACTIVITY_SUBJECTS),\n body: randomChoice(STRESS_TEST_ACTIVITY_BODIES),\n occurred_at: occurredAt,\n author_user_id: null,\n appearance_icon: randomChoice(STRESS_TEST_ACTIVITY_ICONS),\n appearance_color: randomChoice(['#2563eb', '#22c55e', '#f97316', '#a855f7', '#6366f1']),\n created_at: timestamp,\n updated_at: timestamp,\n }\n activityRows.push(activityRow)\n registerIndexBaseRow(CoreEntities.customers.customer_activity, activityRow)\n\n queueCustomFieldAssignment({\n entityId: CoreEntities.customers.customer_activity,\n organizationId,\n tenantId,\n values: {\n engagement_sentiment: randomChoice(STRESS_TEST_ACTIVITY_SENTIMENT),\n shared_with_leadership: Math.random() < 0.4,\n follow_up_owner: randomChoice(STRESS_TEST_ACTIVITY_OWNERS),\n },\n getRecordId: () => activityId,\n })\n }\n\n const noteCount = randomInt(2, 5)\n for (let idx = 0; idx < noteCount; idx += 1) {\n const noteTimestamp = randomPastDate(120)\n commentRows.push({\n id: randomUUID(),\n organization_id: organizationId,\n tenant_id: tenantId,\n entity_id: personEntityId,\n deal_id: dealId,\n body: randomChoice(STRESS_TEST_NOTE_SNIPPETS),\n author_user_id: null,\n appearance_icon: 'lucide:sticky-note',\n appearance_color: randomChoice(['#2563eb', '#22c55e', '#f97316', '#a855f7', '#6366f1']),\n created_at: noteTimestamp,\n updated_at: noteTimestamp,\n deleted_at: null,\n })\n }\n }\n\n created += 1\n const shouldFlush = created % flushInterval === 0\n if (shouldFlush) await flushEntityRows(true)\n options.onProgress?.({ completed: created, total })\n if (shouldFlush) await flushAssignments(true)\n else await flushAssignments()\n }\n\n await flushEntityRows(true)\n await flushAssignments(true)\n options.onProgress?.({ completed: total, total })\n const elapsedMs = Math.max(1, Date.now() - startedAt)\n const recordsPerSecond = toCreate > 0 ? (toCreate / elapsedMs) * 1000 : 0\n console.log(\n `\u26A1 Stress test seeding throughput: ${toCreate.toLocaleString()} records in ${(elapsedMs / 1000).toFixed(\n 1\n )}s (${recordsPerSecond.toFixed(1)} records/s${includeExtras ? '' : ' - lite mode'})`\n )\n\n return { created: toCreate, existing: existingPersons }\n}\n\n\nconst STRESS_TEST_REQUIRED_COLUMNS: Record<string, readonly string[]> = {\n customer_entities: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'kind',\n 'display_name',\n 'description',\n 'owner_user_id',\n 'primary_email',\n 'primary_phone',\n 'status',\n 'lifecycle_stage',\n 'source',\n 'next_interaction_at',\n 'next_interaction_name',\n 'next_interaction_ref_id',\n 'next_interaction_icon',\n 'next_interaction_color',\n 'is_active',\n 'created_at',\n 'updated_at',\n 'deleted_at',\n ],\n customer_companies: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'entity_id',\n 'legal_name',\n 'brand_name',\n 'domain',\n 'website_url',\n 'industry',\n 'size_bucket',\n 'annual_revenue',\n 'created_at',\n 'updated_at',\n ],\n customer_people: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'first_name',\n 'last_name',\n 'preferred_name',\n 'job_title',\n 'department',\n 'seniority',\n 'timezone',\n 'linked_in_url',\n 'twitter_url',\n 'created_at',\n 'updated_at',\n 'entity_id',\n 'company_entity_id',\n ],\n customer_deals: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'title',\n 'description',\n 'status',\n 'pipeline_stage',\n 'value_amount',\n 'value_currency',\n 'probability',\n 'expected_close_at',\n 'owner_user_id',\n 'source',\n 'created_at',\n 'updated_at',\n 'deleted_at',\n ],\n customer_deal_companies: ['id', 'deal_id', 'company_entity_id', 'created_at'],\n customer_deal_people: ['id', 'deal_id', 'person_entity_id', 'role', 'created_at'],\n customer_activities: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'entity_id',\n 'deal_id',\n 'activity_type',\n 'subject',\n 'body',\n 'occurred_at',\n 'author_user_id',\n 'appearance_icon',\n 'appearance_color',\n 'created_at',\n 'updated_at',\n ],\n customer_comments: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'entity_id',\n 'deal_id',\n 'body',\n 'author_user_id',\n 'appearance_icon',\n 'appearance_color',\n 'created_at',\n 'updated_at',\n 'deleted_at',\n ],\n custom_field_values: [\n 'entity_id',\n 'record_id',\n 'organization_id',\n 'tenant_id',\n 'field_key',\n 'value_text',\n 'value_multiline',\n 'value_int',\n 'value_float',\n 'value_bool',\n 'created_at',\n 'deleted_at',\n ],\n}\n\nasync function warnIfStressTestSchemaChanged(knex: any) {\n try {\n const warnings: string[] = []\n for (const [table, requiredColumns] of Object.entries(STRESS_TEST_REQUIRED_COLUMNS)) {\n const rows = await knex('information_schema.columns')\n .select('column_name')\n .where({ table_schema: 'public', table_name: table })\n const existing = new Set(rows.map((row: { column_name: string }) => row.column_name))\n const missing = requiredColumns.filter((column) => !existing.has(column))\n if (missing.length) warnings.push(`${table}: missing ${missing.join(', ')}`)\n }\n if (warnings.length) {\n console.warn('[customers.cli] Warning: stress-test bulk seeder detected schema differences. Bulk insert path may need updates:')\n warnings.forEach((warning) => console.warn(` - ${warning}`))\n }\n } catch (err) {\n console.warn('[customers.cli] Warning: unable to verify schema for stress-test bulk seeder', err)\n }\n}\n\nconst seedDictionaries: ModuleCli = {\n command: 'seed-dictionaries',\n async run(rest) {\n const args = parseArgs(rest)\n const tenantId = String(args.tenantId ?? args.tenant ?? '')\n const organizationId = String(args.organizationId ?? args.orgId ?? args.org ?? '')\n if (!tenantId || !organizationId) {\n console.error('Usage: mercato customers seed-dictionaries --tenant <tenantId> --org <organizationId>')\n return\n }\n const { resolve } = await createRequestContainer()\n const em = resolve<EntityManager>('em')\n await em.transactional(async (tem) => {\n await seedCustomerDictionaries(tem, { tenantId, organizationId })\n await seedCurrencyDictionary(tem, { tenantId, organizationId })\n await tem.flush()\n })\n console.log('\uD83D\uDCDA Customer dictionaries seeded for organization', organizationId)\n },\n}\n\nconst seedExamples: ModuleCli = {\n command: 'seed-examples',\n async run(rest) {\n const args = parseArgs(rest)\n const tenantId = String(args.tenantId ?? args.tenant ?? '')\n const organizationId = String(args.organizationId ?? args.orgId ?? args.org ?? '')\n if (!tenantId || !organizationId) {\n console.error('Usage: mercato customers seed-examples --tenant <tenantId> --org <organizationId>')\n return\n }\n const container = await createRequestContainer()\n const em = (container.resolve('em') as EntityManager)\n const seeded = await em.transactional(async (tem) =>\n seedCustomerExamples(tem, container, { tenantId, organizationId })\n )\n if (seeded) {\n console.log('Customer example data seeded for organization', organizationId)\n } else {\n console.log('Customer example data already present; skipping')\n }\n },\n}\n\nconst seedStressTest: ModuleCli = {\n command: 'seed-stresstest',\n async run(rest) {\n const args = parseArgs(rest)\n const tenantId = String(args.tenantId ?? args.tenant ?? '')\n const organizationId = String(args.organizationId ?? args.orgId ?? args.org ?? '')\n if (!tenantId || !organizationId) {\n console.error('Usage: mercato customers seed-stresstest --tenant <tenantId> --org <organizationId> [--count <number>] [--lite]')\n return\n }\n const defaultCount = 6000\n const countRaw =\n args.count ?? args.total ?? args.number ?? args.customers ?? String(defaultCount)\n const parsedCount = Number.parseInt(countRaw, 10)\n const count = Number.isFinite(parsedCount) && parsedCount > 0 ? parsedCount : defaultCount\n const liteFlag = (() => {\n if (typeof args.lite === 'string') {\n if (!args.lite.trim()) return true\n return parseBooleanToken(args.lite) === true\n }\n return false\n })()\n const liteMode =\n liteFlag ||\n args.mode === 'lite' ||\n args.payload === 'lite' ||\n args.variant === 'lite'\n\n const container = await createRequestContainer()\n const em = (container.resolve('em') as EntityManager)\n let progressBar: ProgressBarHandle | null = null\n const result = await seedCustomerStressTest(\n em,\n container,\n { tenantId, organizationId },\n {\n count,\n includeExtras: !liteMode,\n onProgress: ({ completed, total }) => {\n if (total <= 0) return\n if (!progressBar) {\n const label = liteMode ? 'Generating stress-test customers (lite)' : 'Generating stress-test customers'\n progressBar = createProgressBar(label, total)\n }\n if (progressBar) {\n ;(progressBar as unknown as { update(completed: number): void }).update(completed)\n }\n },\n }\n )\n if (progressBar) {\n ;(progressBar as unknown as { complete(): void }).complete()\n }\n\n try {\n const eventBus = (container.resolve('eventBus') as any)\n const coverageEntities = [\n CoreEntities.customers.customer_entity,\n CoreEntities.customers.customer_person_profile,\n CoreEntities.customers.customer_company_profile,\n ]\n await Promise.all(\n coverageEntities.map(async (entityType) => {\n await eventBus.emitEvent('query_index.coverage.refresh', {\n entityType,\n tenantId,\n organizationId,\n delayMs: 0,\n })\n await eventBus.emitEvent('query_index.coverage.refresh', {\n entityType,\n tenantId,\n organizationId: null,\n delayMs: 0,\n })\n })\n )\n } catch (err) {\n console.warn('[customers.cli] Failed to refresh query index coverage after stress-test seeding', err)\n }\n\n if (result.created > 0) {\n console.log(\n `Created ${result.created} stress test customer contacts (existing previously: ${result.existing})`\n )\n } else {\n console.log(\n `Stress test dataset already satisfied (existing contacts: ${result.existing}, requested: ${count})`\n )\n }\n },\n}\n\nasync function seedDefaultPipeline(em: EntityManager, { tenantId, organizationId }: SeedArgs): Promise<void> {\n const existing = await em.findOne(CustomerPipeline, { tenantId, organizationId, isDefault: true })\n if (existing) return\n\n const pipeline = em.create(CustomerPipeline, {\n tenantId,\n organizationId,\n name: 'Default Pipeline',\n isDefault: true,\n })\n em.persist(pipeline)\n await em.flush()\n\n for (let i = 0; i < PIPELINE_STAGE_DEFAULTS.length; i++) {\n const entry = PIPELINE_STAGE_DEFAULTS[i]\n em.persist(em.create(CustomerPipelineStage, {\n tenantId,\n organizationId,\n pipelineId: pipeline.id,\n label: entry.label,\n order: i,\n }))\n }\n await em.flush()\n}\n\nexport { seedCustomerDictionaries, seedCustomerExamples, seedCustomerStressTest, seedCurrencyDictionary, seedDefaultPipeline }\nexport type { SeedArgs as CustomerSeedArgs }\n\nconst customersCliCommands = [seedDictionaries, seedExamples, seedStressTest]\n\nexport default customersCliCommands\nconst CUSTOMER_CUSTOM_FIELD_SETS = [\n {\n entity: CoreEntities.customers.customer_person_profile,\n fields: [\n cf.select('buying_role', ['economic_buyer', 'champion', 'technical_evaluator', 'influencer'], {\n label: 'Buying role',\n description: 'Contact role within the buying committee.',\n filterable: true,\n }),\n cf.text('preferred_pronouns', {\n label: 'Preferred pronouns',\n description: 'How the contact prefers to be addressed.',\n }),\n cf.boolean('newsletter_opt_in', {\n label: 'Newsletter opt-in',\n description: 'Indicates whether marketing newsletters are permitted.',\n defaultValue: false,\n }),\n ],\n },\n {\n entity: CoreEntities.customers.customer_company_profile,\n fields: [\n cf.select('relationship_health', ['healthy', 'monitor', 'at_risk'], {\n label: 'Relationship health',\n description: 'Overall account health assessment.',\n filterable: true,\n }),\n cf.select('renewal_quarter', ['Q1', 'Q2', 'Q3', 'Q4'], {\n label: 'Renewal quarter',\n description: 'Expected renewal quarter for subscription accounts.',\n filterable: true,\n }),\n cf.multiline('executive_notes', {\n label: 'Executive notes',\n description: 'Context shared during executive reviews.',\n listVisible: false,\n }),\n cf.boolean('customer_marketing_case', {\n label: 'Marketing case study ready',\n description: 'The customer has approved participation in marketing collateral.',\n defaultValue: false,\n }),\n ],\n },\n {\n entity: CoreEntities.customers.customer_deal,\n fields: [\n cf.select('competitive_risk', ['low', 'medium', 'high'], {\n label: 'Competitive risk',\n description: 'Perceived threat level from competitors.',\n filterable: true,\n }),\n cf.select('implementation_complexity', ['light', 'standard', 'complex'], {\n label: 'Implementation complexity',\n description: 'Expected level of effort for delivery.',\n }),\n cf.integer('estimated_seats', {\n label: 'Estimated seats/licenses',\n description: 'Projected seat count for the opportunity.',\n filterable: true,\n }),\n cf.boolean('requires_legal_review', {\n label: 'Requires legal review',\n description: 'Deal includes terms that need legal approval.',\n defaultValue: false,\n }),\n ],\n },\n {\n entity: CoreEntities.customers.customer_activity,\n fields: [\n cf.select('engagement_sentiment', ['positive', 'neutral', 'negative'], {\n label: 'Engagement sentiment',\n description: 'Tone of the interaction based on the latest touchpoint.',\n filterable: true,\n }),\n cf.boolean('shared_with_leadership', {\n label: 'Shared with leadership',\n description: 'Activity summary was shared with leadership or executives.',\n defaultValue: false,\n }),\n cf.text('follow_up_owner', {\n label: 'Follow-up owner',\n description: 'Team member responsible for the next follow-up.',\n }),\n ],\n },\n]\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { ModuleCli } from '@open-mercato/shared/modules/registry'\nimport { createRequestContainer, type AppContainer } from '@open-mercato/shared/lib/di/container'\nimport { cf } from '@open-mercato/shared/modules/dsl'\nimport { randomUUID } from 'crypto'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { Dictionary, DictionaryEntry, type DictionaryManagerVisibility } from '@open-mercato/core/modules/dictionaries/data/entities'\nimport { installCustomEntitiesFromModules } from '@open-mercato/core/modules/entities/lib/install-from-ce'\nimport type { CacheStrategy } from '@open-mercato/cache/types'\nimport { ensureCustomFieldDefinitions } from '@open-mercato/core/modules/entities/lib/field-definitions'\nimport { DefaultDataEngine, type DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { E as CoreEntities } from '#generated/entities.ids.generated'\nimport { createProgressBar } from '@open-mercato/shared/lib/cli/progress'\nimport { buildIndexDocument, type IndexCustomFieldValue } from '@open-mercato/core/modules/query_index/lib/document'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport {\n CustomerEntity,\n CustomerCompanyProfile,\n CustomerPersonProfile,\n CustomerDeal,\n CustomerDealPersonLink,\n CustomerDealCompanyLink,\n CustomerActivity,\n CustomerAddress,\n CustomerComment,\n CustomerPipeline,\n CustomerPipelineStage,\n} from './data/entities'\nimport { ensureDictionaryEntry } from './commands/shared'\n\ntype SeedArgs = {\n tenantId: string\n organizationId: string\n}\n\ntype DictionaryDefault = {\n value: string\n label: string\n color?: string\n icon?: string\n}\n\ntype CustomFieldValuesPayload = Parameters<DataEngine['setCustomFields']>[0]['values']\ntype ProgressBarHandle = ReturnType<typeof createProgressBar>\n\nconst DEAL_STATUS_DEFAULTS: DictionaryDefault[] = [\n { value: 'open', label: 'Open', color: '#2563eb', icon: 'lucide:circle' },\n { value: 'closed', label: 'Closed', color: '#6b7280', icon: 'lucide:check-circle' },\n { value: 'win', label: 'Win', color: '#22c55e', icon: 'lucide:trophy' },\n { value: 'loose', label: 'Loose', color: '#ef4444', icon: 'lucide:flag' },\n { value: 'in_progress', label: 'In progress', color: '#f59e0b', icon: 'lucide:activity' },\n]\n\nconst PIPELINE_STAGE_DEFAULTS: DictionaryDefault[] = [\n { value: 'opportunity', label: 'Opportunity', color: '#38bdf8', icon: 'lucide:target' },\n { value: 'marketing_qualified_lead', label: 'Marketing Qualified Lead', color: '#a855f7', icon: 'lucide:sparkles' },\n { value: 'sales_qualified_lead', label: 'Sales Qualified Lead', color: '#f97316', icon: 'lucide:users' },\n { value: 'offering', label: 'Offering', color: '#22c55e', icon: 'lucide:package' },\n { value: 'negotiations', label: 'Negotiations', color: '#facc15', icon: 'lucide:handshake' },\n { value: 'win', label: 'Win', color: '#16a34a', icon: 'lucide:award' },\n { value: 'loose', label: 'Loose', color: '#ef4444', icon: 'lucide:flag' },\n { value: 'stalled', label: 'Stalled', color: '#6b7280', icon: 'lucide:alert-circle' },\n]\n\nconst ENTITY_STATUS_DEFAULTS: DictionaryDefault[] = [\n { value: 'customer', label: 'Customer', color: '#16a34a', icon: 'lucide:handshake' },\n { value: 'active', label: 'Active', color: '#2563eb', icon: 'lucide:user-check' },\n { value: 'prospect', label: 'Prospect', color: '#f59e0b', icon: 'lucide:target' },\n { value: 'inactive', label: 'Inactive', color: '#6b7280', icon: 'lucide:archive' },\n]\n\nconst ENTITY_LIFECYCLE_STAGE_DEFAULTS: DictionaryDefault[] = [\n { value: 'prospect', label: 'Prospect', color: '#f59e0b', icon: 'lucide:sparkles' },\n { value: 'evaluation', label: 'Evaluation', color: '#a855f7', icon: 'lucide:clipboard-list' },\n { value: 'customer', label: 'Customer', color: '#22c55e', icon: 'lucide:handshake' },\n { value: 'expansion', label: 'Expansion', color: '#0ea5e9', icon: 'lucide:trending-up' },\n { value: 'churned', label: 'Churned', color: '#ef4444', icon: 'lucide:alert-circle' },\n]\n\nconst ENTITY_SOURCE_DEFAULTS: DictionaryDefault[] = [\n { value: 'partner_referral', label: 'Partner referral', color: '#6366f1', icon: 'lucide:handshake' },\n { value: 'customer_referral', label: 'Customer referral', color: '#22c55e', icon: 'lucide:thumbs-up' },\n { value: 'industry_event', label: 'Industry event', color: '#f97316', icon: 'lucide:calendar' },\n { value: 'inbound_web', label: 'Inbound web', color: '#0ea5e9', icon: 'lucide:globe' },\n { value: 'outbound_campaign', label: 'Outbound campaign', color: '#facc15', icon: 'lucide:megaphone' },\n]\n\nconst ADDRESS_TYPE_DEFAULTS: DictionaryDefault[] = [\n { value: 'office', label: 'Office', color: '#3b82f6', icon: 'lucide:building' },\n { value: 'work', label: 'Work', color: '#6366f1', icon: 'lucide:briefcase' },\n { value: 'billing', label: 'Billing', color: '#f97316', icon: 'lucide:wallet' },\n { value: 'shipping', label: 'Shipping', color: '#22c55e', icon: 'lucide:truck' },\n { value: 'home', label: 'Home', color: '#10b981', icon: 'lucide:map-pin' },\n]\n\nconst ACTIVITY_TYPE_DEFAULTS: DictionaryDefault[] = [\n { value: 'call', label: 'Call', color: '#2563eb', icon: 'lucide:phone-call' },\n { value: 'email', label: 'Email', color: '#16a34a', icon: 'lucide:mail' },\n { value: 'meeting', label: 'Meeting', color: '#f59e0b', icon: 'lucide:users' },\n { value: 'note', label: 'Note', color: '#a855f7', icon: 'lucide:notebook' },\n { value: 'task', label: 'Task', color: '#ef4444', icon: 'lucide:check-square' },\n]\n\nconst JOB_TITLE_DEFAULTS: DictionaryDefault[] = [\n { value: 'Director of Operations', label: 'Director of Operations', color: '#f97316', icon: 'lucide:settings' },\n { value: 'VP of Partnerships', label: 'VP of Partnerships', color: '#6366f1', icon: 'lucide:users' },\n { value: 'Founder & Principal', label: 'Founder & Principal', color: '#ec4899', icon: 'lucide:star' },\n { value: 'Senior Project Manager', label: 'Senior Project Manager', color: '#0ea5e9', icon: 'lucide:clipboard-list' },\n { value: 'Chief Revenue Officer', label: 'Chief Revenue Officer', color: '#8b5cf6', icon: 'lucide:bar-chart-3' },\n { value: 'Director of Retail Partnerships', label: 'Director of Retail Partnerships', color: '#f59e0b', icon: 'lucide:shopping-bag' },\n]\n\nconst INDUSTRY_DEFAULTS: DictionaryDefault[] = [\n { value: 'Renewable Energy', label: 'Renewable Energy' },\n { value: 'Software', label: 'Software' },\n { value: 'Interior Design', label: 'Interior Design' },\n { value: 'SaaS', label: 'SaaS' },\n { value: 'E-commerce', label: 'E-commerce' },\n { value: 'Healthcare', label: 'Healthcare' },\n { value: 'Manufacturing', label: 'Manufacturing' },\n { value: 'Logistics', label: 'Logistics' },\n { value: 'Financial Services', label: 'Financial Services' },\n { value: 'Retail', label: 'Retail' },\n { value: 'Hospitality', label: 'Hospitality' },\n { value: 'Energy', label: 'Energy' },\n { value: 'Media', label: 'Media' },\n]\n\nconst PRIORITY_CURRENCIES = ['EUR', 'USD', 'GBP', 'PLN']\n\ntype ExampleAddress = {\n name?: string\n purpose?: string\n addressLine1: string\n addressLine2?: string\n city?: string\n region?: string\n postalCode?: string\n country?: string\n latitude?: number\n longitude?: number\n buildingNumber?: string\n flatNumber?: string\n}\n\ntype ExamplePerson = {\n slug: string\n firstName: string\n lastName: string\n preferredName?: string\n jobTitle?: string\n department?: string\n seniority?: string\n email: string\n phone?: string\n timezone?: string\n linkedInUrl?: string\n twitterUrl?: string\n address?: ExampleAddress\n description?: string\n source?: string\n custom?: Record<string, unknown>\n}\n\ntype ExampleDealParticipant = {\n slug: string\n participantRole?: string\n}\n\ntype ExampleActivity = {\n slug: string\n entity: 'company' | 'person'\n personSlug?: string\n type: string\n subject?: string\n body?: string\n occurredAt: string\n icon?: string\n color?: string\n custom?: Record<string, unknown>\n}\n\ntype ExampleNote = {\n entity: 'company' | 'person'\n personSlug?: string\n body: string\n occurredAt?: string\n icon?: string\n color?: string\n}\n\ntype ExampleDeal = {\n slug: string\n title: string\n description?: string\n status: string\n pipelineStage?: string\n valueAmount?: number\n valueCurrency?: string\n probability?: number\n expectedCloseAt?: string\n people: ExampleDealParticipant[]\n activities?: ExampleActivity[]\n source?: string\n custom?: Record<string, unknown>\n}\n\ntype ExampleCompany = {\n slug: string\n displayName: string\n legalName?: string\n brandName?: string\n industry?: string\n sizeBucket?: string\n domain?: string\n websiteUrl?: string\n description?: string\n primaryEmail?: string\n primaryPhone?: string\n source?: string\n lifecycleStage?: string\n status?: string\n annualRevenue?: number\n address?: ExampleAddress\n people?: ExamplePerson[]\n deals?: ExampleDeal[]\n interactions?: ExampleActivity[]\n notes?: ExampleNote[]\n custom?: Record<string, unknown>\n}\n\nconst NOW = new Date()\n\nfunction isoDaysFromNow(days: number, options?: { hour?: number; minute?: number }): string {\n const base = new Date(NOW)\n const hour = options?.hour ?? 12\n const minute = options?.minute ?? 0\n base.setUTCHours(hour, minute, 0, 0)\n base.setUTCDate(base.getUTCDate() + days)\n return base.toISOString()\n}\n\nconst CUSTOMER_EXAMPLES: ExampleCompany[] = [\n {\n slug: 'brightside-solar',\n displayName: 'Brightside Solar',\n legalName: 'Brightside Solar LLC',\n brandName: 'Brightside Solar',\n industry: 'Renewable Energy',\n sizeBucket: '51-200',\n domain: 'brightsidesolar.com',\n websiteUrl: 'https://brightsidesolar.com',\n description:\n 'Community solar developer helping multifamily buildings reduce energy costs across California.',\n primaryEmail: 'hello@brightsidesolar.com',\n primaryPhone: '+1 415-555-0148',\n source: 'partner_referral',\n lifecycleStage: 'customer',\n status: 'customer',\n custom: {\n relationship_health: 'healthy',\n renewal_quarter: 'Q3',\n executive_notes: 'High NPS across HOA portfolio; exploring bundled battery upsell for 2025 budgets.',\n customer_marketing_case: true,\n },\n address: {\n name: 'Headquarters',\n purpose: 'office',\n addressLine1: '245 Market St Suite 400',\n city: 'San Francisco',\n region: 'CA',\n postalCode: '94105',\n country: 'US',\n latitude: 37.7936,\n longitude: -122.3965,\n },\n people: [\n {\n slug: 'mia-johnson',\n firstName: 'Mia',\n lastName: 'Johnson',\n preferredName: 'Mia',\n jobTitle: 'Director of Operations',\n department: 'Operations',\n seniority: 'director',\n email: 'mia.johnson@brightsidesolar.com',\n phone: '+1 415-555-0162',\n timezone: 'America/Los_Angeles',\n linkedInUrl: 'https://www.linkedin.com/in/miajohnson-operations/',\n source: 'partner_referral',\n custom: {\n buying_role: 'champion',\n preferred_pronouns: 'she/her',\n newsletter_opt_in: true,\n },\n address: {\n purpose: 'work',\n addressLine1: '245 Market St Suite 410',\n city: 'San Francisco',\n region: 'CA',\n postalCode: '94105',\n country: 'US',\n },\n },\n {\n slug: 'daniel-cho',\n firstName: 'Daniel',\n lastName: 'Cho',\n jobTitle: 'VP of Partnerships',\n department: 'Business Development',\n seniority: 'vp',\n email: 'daniel.cho@brightsidesolar.com',\n phone: '+1 628-555-0199',\n timezone: 'America/Los_Angeles',\n linkedInUrl: 'https://www.linkedin.com/in/danielcho-energy/',\n source: 'outbound_campaign',\n custom: {\n buying_role: 'economic_buyer',\n preferred_pronouns: 'he/him',\n newsletter_opt_in: false,\n },\n },\n ],\n deals: [\n {\n slug: 'redwood-residences',\n title: 'Redwood Residences Solar Rollout',\n description: '40-home solar installation with ongoing maintenance plan.',\n status: 'in_progress',\n pipelineStage: 'negotiations',\n valueAmount: 185000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(45),\n probability: 55,\n source: 'partner_referral',\n custom: {\n competitive_risk: 'medium',\n implementation_complexity: 'standard',\n estimated_seats: 40,\n requires_legal_review: true,\n },\n people: [\n { slug: 'mia-johnson', participantRole: 'Project Sponsor' },\n { slug: 'daniel-cho', participantRole: 'Executive Sponsor' },\n ],\n activities: [\n {\n slug: 'redwood-hoa-follow-up',\n entity: 'company',\n type: 'call',\n subject: 'Follow-up with HOA board',\n body: 'Reviewed financing options and clarified maintenance service tiers for the board.',\n occurredAt: isoDaysFromNow(-9, { hour: 17, minute: 30 }),\n icon: 'lucide:phone-call',\n color: '#2563eb',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: true,\n follow_up_owner: 'Sofia Nguyen',\n },\n },\n {\n slug: 'redwood-case-studies',\n entity: 'person',\n personSlug: 'mia-johnson',\n type: 'note',\n subject: 'Shared case studies',\n body: 'Sent two case studies highlighting 18% average utility bill savings for similar complexes.',\n occurredAt: isoDaysFromNow(-7, { hour: 19, minute: 15 }),\n icon: 'lucide:notebook',\n color: '#a855f7',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: false,\n follow_up_owner: 'Daniel Cho',\n },\n },\n ],\n },\n {\n slug: 'sunset-lofts-battery',\n title: 'Sunset Lofts Battery Upgrade',\n description: 'Battery upgrade for existing solar customers to extend overnight coverage.',\n status: 'open',\n pipelineStage: 'offering',\n valueAmount: 82000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(65),\n probability: 40,\n source: 'inbound_web',\n custom: {\n competitive_risk: 'high',\n implementation_complexity: 'complex',\n estimated_seats: 28,\n requires_legal_review: false,\n },\n people: [{ slug: 'mia-johnson', participantRole: 'Point of Contact' }],\n activities: [\n {\n slug: 'sunset-energy-audit',\n entity: 'company',\n type: 'meeting',\n subject: 'On-site energy audit completed',\n body: 'Audit identified 28 units that need inverter firmware updates before batteries ship.',\n occurredAt: isoDaysFromNow(-17, { hour: 21 }),\n icon: 'lucide:users',\n color: '#f59e0b',\n custom: {\n engagement_sentiment: 'neutral',\n shared_with_leadership: false,\n follow_up_owner: 'Mia Johnson',\n },\n },\n ],\n },\n ],\n interactions: [\n {\n slug: 'brightside-nps-email',\n entity: 'company',\n type: 'email',\n subject: 'Quarterly NPS survey sent',\n body: 'Shared Q2 satisfaction survey with portfolio property managers.',\n occurredAt: isoDaysFromNow(-20, { hour: 16 }),\n icon: 'lucide:mail',\n color: '#16a34a',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: false,\n follow_up_owner: 'Customer Success Team',\n },\n },\n ],\n notes: [\n {\n entity: 'company',\n body: 'Completed energy audit across 12 HOA buildings; evaluating maintenance bundle add-on.',\n occurredAt: isoDaysFromNow(-11, { hour: 18 }),\n icon: 'lucide:lightbulb',\n color: '#facc15',\n },\n {\n entity: 'person',\n personSlug: 'mia-johnson',\n body: 'Mia requested financing comparison deck before the board vote.',\n occurredAt: isoDaysFromNow(-9, { hour: 15, minute: 30 }),\n icon: 'lucide:bookmark',\n color: '#a855f7',\n },\n ],\n },\n {\n slug: 'harborview-analytics',\n displayName: 'Harborview Analytics',\n legalName: 'Harborview Analytics Inc.',\n brandName: 'Harborview Analytics',\n industry: 'Software',\n sizeBucket: '201-500',\n domain: 'harborviewanalytics.com',\n websiteUrl: 'https://harborviewanalytics.com',\n description:\n 'Boston-based analytics platform helping consumer brands optimize merchandising decisions.',\n primaryEmail: 'info@harborviewanalytics.com',\n primaryPhone: '+1 617-555-0024',\n source: 'industry_event',\n lifecycleStage: 'prospect',\n status: 'active',\n custom: {\n relationship_health: 'monitor',\n renewal_quarter: 'Q4',\n executive_notes: 'Pilot success metrics trending positive; CFO wants ROI modeling before expansion.',\n customer_marketing_case: false,\n },\n address: {\n name: 'Boston HQ',\n purpose: 'office',\n addressLine1: '355 Atlantic Ave Floor 6',\n city: 'Boston',\n region: 'MA',\n postalCode: '02210',\n country: 'US',\n latitude: 42.3522,\n longitude: -71.0507,\n },\n people: [\n {\n slug: 'arjun-patel',\n firstName: 'Arjun',\n lastName: 'Patel',\n jobTitle: 'Chief Revenue Officer',\n department: 'Revenue',\n seniority: 'c-level',\n email: 'arjun.patel@harborviewanalytics.com',\n phone: '+1 617-555-0168',\n timezone: 'America/New_York',\n linkedInUrl: 'https://www.linkedin.com/in/arjunpatel-sales/',\n source: 'industry_event',\n custom: {\n buying_role: 'economic_buyer',\n preferred_pronouns: 'he/him',\n newsletter_opt_in: true,\n },\n },\n {\n slug: 'lena-ortiz',\n firstName: 'Lena',\n lastName: 'Ortiz',\n jobTitle: 'Director of Retail Partnerships',\n department: 'Partnerships',\n seniority: 'director',\n email: 'lena.ortiz@harborviewanalytics.com',\n phone: '+1 617-555-0179',\n timezone: 'America/New_York',\n linkedInUrl: 'https://www.linkedin.com/in/lenaortiz-retail/',\n source: 'industry_event',\n custom: {\n buying_role: 'champion',\n preferred_pronouns: 'she/her',\n newsletter_opt_in: true,\n },\n },\n ],\n deals: [\n {\n slug: 'blue-harbor-pilot',\n title: 'Blue Harbor Grocers Pilot Program',\n description: 'Six-month pilot of merchandising analytics across 28 locations.',\n status: 'win',\n pipelineStage: 'win',\n valueAmount: 96000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(-25),\n probability: 100,\n source: 'industry_event',\n custom: {\n competitive_risk: 'low',\n implementation_complexity: 'standard',\n estimated_seats: 28,\n requires_legal_review: false,\n },\n people: [\n { slug: 'arjun-patel', participantRole: 'Executive Sponsor' },\n { slug: 'lena-ortiz', participantRole: 'Account Lead' },\n ],\n activities: [\n {\n slug: 'blue-harbor-contract',\n entity: 'company',\n type: 'meeting',\n subject: 'Contract signed with procurement',\n body: 'Procurement signed SOW; onboarding kickoff scheduled for next Tuesday.',\n occurredAt: isoDaysFromNow(-28, { hour: 14, minute: 30 }),\n icon: 'lucide:handshake',\n color: '#22c55e',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: true,\n follow_up_owner: 'Lena Ortiz',\n },\n },\n {\n slug: 'blue-harbor-onboarding-email',\n entity: 'person',\n personSlug: 'lena-ortiz',\n type: 'email',\n subject: 'Shared onboarding checklist',\n body: 'Sent checklist covering data exports and point-of-sale integrations required for go-live.',\n occurredAt: isoDaysFromNow(-27, { hour: 13, minute: 5 }),\n icon: 'lucide:mail',\n color: '#16a34a',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: false,\n follow_up_owner: 'Implementation Team',\n },\n },\n ],\n },\n {\n slug: 'midwest-outfitters',\n title: 'Midwest Outfitters Expansion',\n description: 'Expansion opportunity covering 120 stores in the Midwest region.',\n status: 'open',\n pipelineStage: 'opportunity',\n valueAmount: 210000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(120),\n probability: 35,\n source: 'outbound_campaign',\n custom: {\n competitive_risk: 'medium',\n implementation_complexity: 'complex',\n estimated_seats: 120,\n requires_legal_review: true,\n },\n people: [{ slug: 'lena-ortiz', participantRole: 'Account Lead' }],\n activities: [\n {\n slug: 'midwest-forecasting-call',\n entity: 'company',\n type: 'call',\n subject: 'Introduced predictive forecasting module',\n body: 'Walkthrough of demand forecasting module with COO and finance controller.',\n occurredAt: isoDaysFromNow(-14, { hour: 15, minute: 45 }),\n icon: 'lucide:phone-call',\n color: '#2563eb',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: true,\n follow_up_owner: 'Arjun Patel',\n },\n },\n ],\n },\n ],\n interactions: [\n {\n slug: 'harborview-pricing-note',\n entity: 'person',\n personSlug: 'arjun-patel',\n type: 'note',\n subject: 'Requested pricing comparison',\n body: 'Arjun asked for pricing comparison versus Qlik ahead of board review.',\n occurredAt: isoDaysFromNow(-18, { hour: 12, minute: 10 }),\n icon: 'lucide:notebook',\n color: '#a855f7',\n custom: {\n engagement_sentiment: 'neutral',\n shared_with_leadership: true,\n follow_up_owner: 'Finance Team',\n },\n },\n ],\n notes: [\n {\n entity: 'company',\n body: 'Pilot success metrics shared with board; expansion depends on Q4 budget review.',\n occurredAt: isoDaysFromNow(-16, { hour: 17, minute: 45 }),\n icon: 'lucide:bar-chart-3',\n color: '#38bdf8',\n },\n {\n entity: 'person',\n personSlug: 'lena-ortiz',\n body: 'Lena confirmed data team can supply POS exports within two weeks.',\n occurredAt: isoDaysFromNow(-13, { hour: 11, minute: 20 }),\n icon: 'lucide:clipboard-list',\n color: '#0ea5e9',\n },\n ],\n },\n {\n slug: 'copperleaf-design',\n displayName: 'Copperleaf Design Co.',\n legalName: 'Copperleaf Design Company',\n brandName: 'Copperleaf Design',\n industry: 'Interior Design',\n sizeBucket: '11-50',\n domain: 'copperleaf.design',\n websiteUrl: 'https://copperleaf.design',\n description:\n 'Boutique interior design studio specializing in hospitality and boutique retail projects across Texas.',\n primaryEmail: 'studio@copperleaf.design',\n primaryPhone: '+1 512-555-0456',\n source: 'customer_referral',\n lifecycleStage: 'customer',\n status: 'customer',\n custom: {\n relationship_health: 'healthy',\n renewal_quarter: 'Q1',\n executive_notes: 'Boutique studio with strong referrals; share sustainability case studies with ownership group.',\n customer_marketing_case: true,\n },\n address: {\n name: 'Austin Studio',\n purpose: 'office',\n addressLine1: '1101 E 6th St Suite 220',\n city: 'Austin',\n region: 'TX',\n postalCode: '78702',\n country: 'US',\n latitude: 30.2642,\n longitude: -97.7275,\n },\n people: [\n {\n slug: 'taylor-brooks',\n firstName: 'Taylor',\n lastName: 'Brooks',\n jobTitle: 'Founder & Principal',\n department: 'Leadership',\n seniority: 'c-level',\n email: 'taylor.brooks@copperleaf.design',\n phone: '+1 512-555-0489',\n timezone: 'America/Chicago',\n linkedInUrl: 'https://www.linkedin.com/in/taylorbrooks-design/',\n source: 'customer_referral',\n custom: {\n buying_role: 'economic_buyer',\n preferred_pronouns: 'they/them',\n newsletter_opt_in: false,\n },\n },\n {\n slug: 'naomi-harris',\n firstName: 'Naomi',\n lastName: 'Harris',\n jobTitle: 'Senior Project Manager',\n department: 'Projects',\n seniority: 'manager',\n email: 'naomi.harris@copperleaf.design',\n phone: '+1 512-555-0521',\n timezone: 'America/Chicago',\n linkedInUrl: 'https://www.linkedin.com/in/naomiharris-pm/',\n source: 'customer_referral',\n custom: {\n buying_role: 'influencer',\n preferred_pronouns: 'she/her',\n newsletter_opt_in: true,\n },\n },\n ],\n deals: [\n {\n slug: 'wanderstay-renovation',\n title: 'Wanderstay Boutique Renovation',\n description: 'Full lobby and guest suite redesign for the Wanderstay hospitality group.',\n status: 'in_progress',\n pipelineStage: 'sales_qualified_lead',\n valueAmount: 145000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(35),\n probability: 65,\n source: 'customer_referral',\n custom: {\n competitive_risk: 'medium',\n implementation_complexity: 'complex',\n estimated_seats: 12,\n requires_legal_review: true,\n },\n people: [\n { slug: 'taylor-brooks', participantRole: 'Principal Designer' },\n { slug: 'naomi-harris', participantRole: 'Project Lead' },\n ],\n activities: [\n {\n slug: 'wanderstay-workshop-recap',\n entity: 'person',\n personSlug: 'naomi-harris',\n type: 'meeting',\n subject: 'Design workshop recap',\n body: 'Captured lighting and materials feedback from onsite workshop with hospitality team.',\n occurredAt: isoDaysFromNow(-6, { hour: 20 }),\n icon: 'lucide:users',\n color: '#f59e0b',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: false,\n follow_up_owner: 'Naomi Harris',\n },\n },\n ],\n },\n {\n slug: 'cedar-creek-retreat',\n title: 'Cedar Creek Retreat Expansion',\n description: 'New wellness center build-out including retail area and treatment rooms.',\n status: 'loose',\n pipelineStage: 'loose',\n valueAmount: 98000,\n valueCurrency: 'USD',\n expectedCloseAt: isoDaysFromNow(-70),\n probability: 0,\n source: 'customer_referral',\n custom: {\n competitive_risk: 'high',\n implementation_complexity: 'standard',\n estimated_seats: 8,\n requires_legal_review: false,\n },\n people: [{ slug: 'taylor-brooks', participantRole: 'Principal Designer' }],\n activities: [\n {\n slug: 'cedar-creek-loss-note',\n entity: 'company',\n type: 'note',\n subject: 'Lost due to budget constraints',\n body: 'Retreat selected lower-cost vendor focused on prefabricated interiors.',\n occurredAt: isoDaysFromNow(-68, { hour: 18, minute: 45 }),\n icon: 'lucide:alert-circle',\n color: '#ef4444',\n custom: {\n engagement_sentiment: 'negative',\n shared_with_leadership: true,\n follow_up_owner: 'Taylor Brooks',\n },\n },\n ],\n },\n ],\n interactions: [\n {\n slug: 'copperleaf-referral-call',\n entity: 'company',\n type: 'call',\n subject: 'Referred by Venture Hospitality',\n body: 'Received referral from Venture Hospitality after successful Austin project.',\n occurredAt: isoDaysFromNow(-25, { hour: 16, minute: 45 }),\n icon: 'lucide:phone',\n color: '#2563eb',\n custom: {\n engagement_sentiment: 'positive',\n shared_with_leadership: true,\n follow_up_owner: 'Taylor Brooks',\n },\n },\n ],\n notes: [\n {\n entity: 'company',\n body: 'Client interested in sustainable materials library review during next site visit.',\n occurredAt: isoDaysFromNow(-22, { hour: 19, minute: 10 }),\n icon: 'lucide:lightbulb',\n color: '#22c55e',\n },\n {\n entity: 'person',\n personSlug: 'naomi-harris',\n body: 'Naomi requested updated FF&E budget before presenting to ownership group.',\n occurredAt: isoDaysFromNow(-6, { hour: 21, minute: 5 }),\n icon: 'lucide:clipboard-list',\n color: '#0ea5e9',\n },\n ],\n },\n]\n\nconst STRESS_TEST_SOURCE = 'stress_test'\nconst STRESS_TEST_FIRST_NAMES = [\n 'Alex',\n 'Jordan',\n 'Taylor',\n 'Morgan',\n 'Casey',\n 'Riley',\n 'Hayden',\n 'Skyler',\n 'Quinn',\n 'Peyton',\n 'Harper',\n 'Rowan',\n 'Sawyer',\n 'Avery',\n 'Reese',\n]\nconst STRESS_TEST_LAST_NAMES = [\n 'Rivera',\n 'Chen',\n 'Nguyen',\n 'Harper',\n 'Ellis',\n 'Patel',\n 'Khan',\n 'Silva',\n 'Lopez',\n 'Murphy',\n 'Baker',\n 'Diaz',\n 'Foster',\n 'Gonzalez',\n 'Kim',\n]\nconst STRESS_TEST_JOB_TITLES = [\n 'Account Executive',\n 'Growth Manager',\n 'Customer Success Lead',\n 'Operations Specialist',\n 'Procurement Analyst',\n 'Demand Generation Manager',\n 'Solutions Consultant',\n 'Revenue Operations Partner',\n 'Implementation Manager',\n 'Sales Engineer',\n]\nconst STRESS_TEST_DEPARTMENTS = [\n 'Revenue',\n 'Operations',\n 'Customer Experience',\n 'Procurement',\n 'Strategy',\n 'Marketing',\n 'Sales',\n]\nconst STRESS_TEST_SENIORITY = ['junior', 'mid', 'senior', 'lead', 'director']\nconst STRESS_TEST_TIMEZONES = [\n 'America/New_York',\n 'America/Los_Angeles',\n 'America/Chicago',\n 'Europe/Berlin',\n 'Europe/Warsaw',\n 'Europe/London',\n 'Asia/Singapore',\n]\nconst STRESS_TEST_COMPANY_PREFIX = [\n 'Atlas',\n 'Northwind',\n 'Summit',\n 'Vertex',\n 'Harbor',\n 'Cobalt',\n 'Juniper',\n 'Orion',\n 'Beacon',\n 'Silverline',\n 'Brightside',\n 'Evergreen',\n 'Lakeshore',\n 'Bluefield',\n 'Aurora',\n]\nconst STRESS_TEST_COMPANY_SUFFIX = ['Industries', 'Partners', 'Holdings', 'Collective', 'Group', 'Ventures']\nconst STRESS_TEST_INDUSTRIES = [\n 'SaaS',\n 'E-commerce',\n 'Healthcare',\n 'Manufacturing',\n 'Logistics',\n 'Financial Services',\n 'Retail',\n 'Hospitality',\n 'Energy',\n 'Media',\n]\nconst STRESS_TEST_SIZE_BUCKETS = ['1-10', '11-50', '51-200', '201-500', '500+']\nconst STRESS_TEST_EMAIL_DOMAIN = 'stress.test'\nconst STRESS_TEST_BUYING_ROLES = ['economic_buyer', 'champion', 'technical_evaluator', 'influencer']\nconst STRESS_TEST_PRONOUNS = ['they/them', 'she/her', 'he/him']\nconst STRESS_TEST_RELATIONSHIP_HEALTH = ['healthy', 'monitor', 'at_risk']\nconst STRESS_TEST_RENEWAL_QUARTERS = ['Q1', 'Q2', 'Q3', 'Q4']\nconst STRESS_TEST_ACTIVITY_SENTIMENT = ['positive', 'neutral', 'negative']\nconst STRESS_TEST_ACTIVITY_OWNERS = [\n 'Jordan Lane',\n 'Alex Rivers',\n 'Morgan Ellis',\n 'Taylor Chen',\n 'Casey Ortega',\n 'Riley Summers',\n]\nconst STRESS_TEST_DEAL_ACTIVITY_TYPES = ACTIVITY_TYPE_DEFAULTS.map((entry) => entry.value)\nconst STRESS_TEST_DEAL_STATUSES = DEAL_STATUS_DEFAULTS.map((entry) => entry.value)\nconst STRESS_TEST_DEAL_PIPELINE = PIPELINE_STAGE_DEFAULTS.map((entry) => entry.value)\nconst STRESS_TEST_DEAL_CUSTOMER_ROLES = ['evaluation lead', 'decision maker', 'influencer', 'sponsor']\nconst STRESS_TEST_DEAL_RISK = ['low', 'medium', 'high']\nconst STRESS_TEST_IMPLEMENTATION = ['light', 'standard', 'complex']\nconst STRESS_TEST_ACTIVITY_ICONS = ['lucide:phone-call', 'lucide:mail', 'lucide:calendar', 'lucide:users']\nconst STRESS_TEST_ACTIVITY_SUBJECTS = [\n 'Discovery call',\n 'Quarterly business review',\n 'Implementation planning',\n 'Renewal alignment',\n 'Expansion pitch',\n 'Stakeholder sync',\n 'Onboarding follow-up',\n]\nconst STRESS_TEST_ACTIVITY_BODIES = [\n 'Reviewed account metrics and confirmed action plan for next quarter.',\n 'Aligned on implementation milestones and risk mitigation.',\n 'Shared updated proposal and captured feedback from stakeholders.',\n 'Clarified contract terms and renewal incentives.',\n 'Coordinated pilot scope with the core project team.',\n 'Captured next steps for executive briefing.',\n]\nconst STRESS_TEST_NOTE_SNIPPETS = [\n 'Customer excited about roadmap items for Q3.',\n 'Need to loop in billing once pricing draft is approved.',\n 'Leadership wants a success story before expansion.',\n 'Security questionnaire still pending from customer.',\n 'Plan to introduce CS lead during next onsite visit.',\n 'Team asked for sandbox access for analytics squad.',\n]\n\nfunction toAmount(value?: number): string | null {\n if (typeof value !== 'number') return null\n return value.toFixed(2)\n}\n\nfunction randomChoice<T>(values: readonly T[]): T {\n return values[Math.floor(Math.random() * values.length)]\n}\n\nfunction randomInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nfunction slugifyValue(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nfunction buildPhone(index: number): string {\n const block = String(400 + (index % 500)).padStart(3, '0')\n const last = String(1000 + (index % 9000)).slice(0, 4)\n return `+1-555-${block}-${last}`\n}\n\nfunction randomPastDate(maxDaysOffset: number): Date {\n const now = Date.now()\n const days = Math.random() * Math.max(1, maxDaysOffset)\n const ms = days * 24 * 60 * 60 * 1000\n return new Date(now - ms)\n}\n\nfunction randomFutureDate(maxDaysOffset: number): Date {\n const now = Date.now()\n const days = Math.random() * Math.max(1, maxDaysOffset)\n const ms = days * 24 * 60 * 60 * 1000\n return new Date(now + ms)\n}\n\ntype ProgressInfo = {\n completed: number\n total: number\n}\n\ntype ProgressCallback = (info: ProgressInfo) => void\n\ntype StressTestOptions = {\n count: number\n onProgress?: ProgressCallback\n includeExtras?: boolean\n}\n\nfunction parseArgs(rest: string[]): Record<string, string> {\n const args: Record<string, string> = {}\n for (let i = 0; i < rest.length; i += 1) {\n const part = rest[i]\n if (!part?.startsWith('--')) continue\n const [keyRaw, valueRaw] = part.slice(2).split('=')\n if (keyRaw) {\n if (valueRaw !== undefined) args[keyRaw] = valueRaw\n else if (i + 1 < rest.length && !rest[i + 1].startsWith('--')) args[keyRaw] = rest[i + 1]\n else args[keyRaw] = 'true'\n }\n }\n return args\n}\n\nasync function seedCustomerDictionaries(em: EntityManager, { tenantId, organizationId }: SeedArgs) {\n for (const entry of ENTITY_STATUS_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'status',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of ENTITY_LIFECYCLE_STAGE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'lifecycle_stage',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of ENTITY_SOURCE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'source',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of ADDRESS_TYPE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'address_type',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of ACTIVITY_TYPE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'activity_type',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of JOB_TITLE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'job_title',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of DEAL_STATUS_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'deal_status',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of PIPELINE_STAGE_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'pipeline_stage',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n for (const entry of INDUSTRY_DEFAULTS) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'industry',\n value: entry.value,\n label: entry.label,\n color: entry.color,\n icon: entry.icon,\n })\n }\n}\n\nfunction resolveCurrencyCodes(): string[] {\n const normalizedPriority = PRIORITY_CURRENCIES.map((code) => code.toUpperCase())\n const intlWithSupportedValues = Intl as typeof Intl & {\n supportedValuesOf?: (input: 'currency') => string[]\n }\n const supported: string[] =\n typeof intlWithSupportedValues.supportedValuesOf === 'function'\n ? intlWithSupportedValues.supportedValuesOf('currency')\n : []\n const normalizedSupported = supported\n .map((code) => code.toUpperCase())\n .filter((code) => /^[A-Z]{3}$/.test(code))\n const uniqueSupported: string[] = []\n const seen = new Set<string>(normalizedPriority)\n for (const code of normalizedSupported) {\n if (seen.has(code)) continue\n seen.add(code)\n uniqueSupported.push(code)\n }\n if (!uniqueSupported.length) {\n console.warn('[customers.cli] Intl.supportedValuesOf(\"currency\") unavailable; seeding minimal currency list.')\n return normalizedPriority\n }\n uniqueSupported.sort()\n return [...normalizedPriority, ...uniqueSupported]\n}\n\nfunction resolveCurrencyLabel(code: string): string {\n try {\n const intlWithDisplayNames = Intl as typeof Intl & {\n DisplayNames?: new (locales: string[], options: { type: 'currency' }) => {\n of(value: string): string | undefined\n }\n }\n if (typeof intlWithDisplayNames.DisplayNames === 'function') {\n const displayNames = new intlWithDisplayNames.DisplayNames(['en'], { type: 'currency' })\n const label = displayNames.of(code)\n if (typeof label === 'string' && label.trim().length) {\n return `${code} \u2013 ${label}`\n }\n }\n } catch (err) {\n console.warn('[customers.cli] Unable to resolve currency label for', code, err)\n }\n return code\n}\n\nasync function seedCurrencyDictionary(em: EntityManager, { tenantId, organizationId }: SeedArgs) {\n let dictionary = await em.findOne(Dictionary, {\n tenantId,\n organizationId,\n key: 'currency',\n deletedAt: null,\n })\n if (!dictionary) {\n dictionary = em.create(Dictionary, {\n key: 'currency',\n name: 'Currencies',\n description: 'ISO 4217 currencies',\n tenantId,\n organizationId,\n isSystem: true,\n isActive: true,\n managerVisibility: 'default' satisfies DictionaryManagerVisibility,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(dictionary)\n await em.flush()\n }\n\n const existingEntries = await em.find(DictionaryEntry, {\n dictionary,\n tenantId,\n organizationId,\n })\n const existingMap = new Map<string, DictionaryEntry>()\n existingEntries.forEach((entry) => existingMap.set(entry.value.toUpperCase(), entry))\n\n const currencyCodes = resolveCurrencyCodes()\n for (const code of currencyCodes) {\n const upper = code.toUpperCase()\n const normalizedValue = upper.toLowerCase()\n const label = resolveCurrencyLabel(upper)\n const current = existingMap.get(upper)\n if (current) {\n if (current.label !== label) {\n current.label = label\n current.updatedAt = new Date()\n em.persist(current)\n }\n continue\n }\n const entry = em.create(DictionaryEntry, {\n dictionary,\n tenantId,\n organizationId,\n value: upper,\n normalizedValue,\n label,\n color: null,\n icon: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(entry)\n }\n}\n\nasync function seedCustomerExamples(\n em: EntityManager,\n container: AppContainer,\n { tenantId, organizationId }: SeedArgs\n): Promise<boolean> {\n const exampleDealTitles = Array.from(\n new Set(\n CUSTOMER_EXAMPLES.flatMap((company) =>\n (company.deals ?? []).map((deal) => deal.title).filter((title): title is string => typeof title === 'string')\n )\n )\n )\n if (exampleDealTitles.length > 0) {\n const already = await em.count(CustomerDeal, {\n tenantId,\n organizationId,\n title: { $in: exampleDealTitles as any },\n })\n if (already > 0) {\n return false\n }\n }\n\n await seedCustomerDictionaries(em, { tenantId, organizationId })\n\n const seededIndustryValues = new Set(\n CUSTOMER_EXAMPLES.map((company) => (typeof company.industry === 'string' ? company.industry.trim() : ''))\n .filter((value): value is string => value.length > 0)\n )\n for (const value of seededIndustryValues) {\n await ensureDictionaryEntry(em, {\n tenantId,\n organizationId,\n kind: 'industry',\n value,\n label: value,\n })\n }\n\n let cache: CacheStrategy | null = null\n if (typeof (container as any).hasRegistration === 'function' && container.hasRegistration('cache')) {\n try {\n cache = (container.resolve('cache') as CacheStrategy)\n } catch {\n cache = null\n }\n }\n try {\n await installCustomEntitiesFromModules(em, cache, {\n tenantIds: [tenantId],\n includeGlobal: false,\n dryRun: false,\n logger: () => {},\n })\n } catch (err) {\n console.warn('[customers.cli] Failed to install custom entities before seeding examples', err)\n }\n\n try {\n await ensureCustomFieldDefinitions(\n em,\n CUSTOMER_CUSTOM_FIELD_SETS,\n { organizationId: null, tenantId }\n )\n } catch (err) {\n console.warn('[customers.cli] Failed to ensure customer custom field definitions', err)\n }\n\n const dataEngine = new DefaultDataEngine(em, container)\n const customFieldAssignments: Array<() => Promise<void>> = []\n\n const companyEntities = new Map<string, CustomerEntity>()\n const personEntities = new Map<string, CustomerEntity>()\n\n for (const company of CUSTOMER_EXAMPLES) {\n const companyEntity = em.create(CustomerEntity, {\n organizationId,\n tenantId,\n kind: 'company',\n displayName: company.displayName,\n description: company.description ?? null,\n primaryEmail: company.primaryEmail ?? null,\n primaryPhone: company.primaryPhone ?? null,\n lifecycleStage: company.lifecycleStage ?? null,\n status: company.status ?? null,\n source: company.source ?? null,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n const companyProfile = em.create(CustomerCompanyProfile, {\n organizationId,\n tenantId,\n entity: companyEntity,\n legalName: company.legalName ?? null,\n brandName: company.brandName ?? null,\n domain: company.domain ?? null,\n websiteUrl: company.websiteUrl ?? null,\n industry: typeof company.industry === 'string' ? company.industry.trim() || null : null,\n sizeBucket: company.sizeBucket ?? null,\n annualRevenue: typeof company.annualRevenue === 'number' ? toAmount(company.annualRevenue) : null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(companyEntity)\n em.persist(companyProfile)\n\n if (company.custom && Object.keys(company.custom).length) {\n const values = { ...company.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_company_profile,\n recordId: companyProfile.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n\n if (company.address?.addressLine1) {\n const address = em.create(CustomerAddress, {\n organizationId,\n tenantId,\n entity: companyEntity,\n name: company.address.name ?? null,\n purpose: company.address.purpose ?? 'office',\n addressLine1: company.address.addressLine1,\n addressLine2: company.address.addressLine2 ?? null,\n city: company.address.city ?? null,\n region: company.address.region ?? null,\n postalCode: company.address.postalCode ?? null,\n country: company.address.country ?? null,\n latitude: company.address.latitude ?? null,\n longitude: company.address.longitude ?? null,\n buildingNumber: company.address.buildingNumber ?? null,\n flatNumber: company.address.flatNumber ?? null,\n isPrimary: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(address)\n }\n\n companyEntities.set(company.slug, companyEntity)\n\n for (const person of company.people ?? []) {\n const nameParts = [person.firstName, person.lastName].filter((part) => !!part && part.trim().length)\n const displayName = nameParts.length ? nameParts.join(' ') : person.email\n const personEntity = em.create(CustomerEntity, {\n organizationId,\n tenantId,\n kind: 'person',\n displayName,\n description: person.description ?? null,\n primaryEmail: person.email,\n primaryPhone: person.phone ?? null,\n lifecycleStage: company.lifecycleStage ?? null,\n status: 'active',\n source: person.source ?? company.source ?? null,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n const personProfile = em.create(CustomerPersonProfile, {\n organizationId,\n tenantId,\n entity: personEntity,\n company: companyEntity,\n firstName: person.firstName,\n lastName: person.lastName,\n preferredName: person.preferredName ?? null,\n jobTitle: person.jobTitle ?? null,\n department: person.department ?? null,\n seniority: person.seniority ?? null,\n timezone: person.timezone ?? null,\n linkedInUrl: person.linkedInUrl ?? null,\n twitterUrl: person.twitterUrl ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(personEntity)\n em.persist(personProfile)\n\n if (person.custom && Object.keys(person.custom).length) {\n const values = { ...person.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_person_profile,\n recordId: personProfile.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n\n if (person.address?.addressLine1) {\n const address = em.create(CustomerAddress, {\n organizationId,\n tenantId,\n entity: personEntity,\n name: person.address.name ?? null,\n purpose: person.address.purpose ?? 'work',\n addressLine1: person.address.addressLine1,\n addressLine2: person.address.addressLine2 ?? null,\n city: person.address.city ?? null,\n region: person.address.region ?? null,\n postalCode: person.address.postalCode ?? null,\n country: person.address.country ?? null,\n latitude: person.address.latitude ?? null,\n longitude: person.address.longitude ?? null,\n buildingNumber: person.address.buildingNumber ?? null,\n flatNumber: person.address.flatNumber ?? null,\n isPrimary: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(address)\n }\n\n personEntities.set(person.slug, personEntity)\n }\n\n for (const interaction of company.interactions ?? []) {\n const targetEntity =\n interaction.entity === 'person' && interaction.personSlug\n ? personEntities.get(interaction.personSlug)\n : companyEntity\n if (!targetEntity) continue\n const activity = em.create(CustomerActivity, {\n organizationId,\n tenantId,\n entity: targetEntity,\n deal: null,\n activityType: interaction.type,\n subject: interaction.subject ?? null,\n body: interaction.body ?? null,\n occurredAt: interaction.occurredAt ? new Date(interaction.occurredAt) : null,\n appearanceIcon: interaction.icon ?? null,\n appearanceColor: interaction.color ?? null,\n authorUserId: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n\n if (interaction.custom && Object.keys(interaction.custom).length) {\n const values = { ...interaction.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_activity,\n recordId: activity.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n }\n\n for (const note of company.notes ?? []) {\n const targetEntity =\n note.entity === 'person' && note.personSlug ? personEntities.get(note.personSlug) : companyEntity\n if (!targetEntity) continue\n const comment = em.create(CustomerComment, {\n organizationId,\n tenantId,\n entity: targetEntity,\n deal: null,\n body: note.body,\n authorUserId: null,\n appearanceIcon: note.icon ?? null,\n appearanceColor: note.color ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n if (note.occurredAt) {\n const timestamp = new Date(note.occurredAt)\n if (!Number.isNaN(timestamp.getTime())) {\n comment.createdAt = timestamp\n comment.updatedAt = timestamp\n }\n }\n em.persist(comment)\n }\n }\n\n for (const company of CUSTOMER_EXAMPLES) {\n const companyEntity = companyEntities.get(company.slug)\n if (!companyEntity) continue\n for (const dealInfo of company.deals ?? []) {\n const deal = em.create(CustomerDeal, {\n organizationId,\n tenantId,\n title: dealInfo.title,\n description: dealInfo.description ?? null,\n status: dealInfo.status,\n pipelineStage: dealInfo.pipelineStage ?? null,\n valueAmount: toAmount(dealInfo.valueAmount),\n valueCurrency:\n dealInfo.valueCurrency ?? (typeof dealInfo.valueAmount === 'number' ? 'USD' : null),\n probability:\n typeof dealInfo.probability === 'number' ? Math.round(dealInfo.probability) : null,\n expectedCloseAt: dealInfo.expectedCloseAt ? new Date(dealInfo.expectedCloseAt) : null,\n ownerUserId: null,\n source: dealInfo.source ?? company.source ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(deal)\n\n if (dealInfo.custom && Object.keys(dealInfo.custom).length) {\n const values = { ...dealInfo.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_deal,\n recordId: deal.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n\n const companyLink = em.create(CustomerDealCompanyLink, {\n deal,\n company: companyEntity,\n createdAt: new Date(),\n })\n em.persist(companyLink)\n\n for (const participant of dealInfo.people ?? []) {\n const personEntity = personEntities.get(participant.slug)\n if (!personEntity) continue\n const link = em.create(CustomerDealPersonLink, {\n deal,\n person: personEntity,\n participantRole: participant.participantRole ?? null,\n createdAt: new Date(),\n })\n em.persist(link)\n }\n\n for (const activityInfo of dealInfo.activities ?? []) {\n const targetEntity =\n activityInfo.entity === 'person' && activityInfo.personSlug\n ? personEntities.get(activityInfo.personSlug)\n : companyEntity\n if (!targetEntity) continue\n const activity = em.create(CustomerActivity, {\n organizationId,\n tenantId,\n entity: targetEntity,\n deal,\n activityType: activityInfo.type,\n subject: activityInfo.subject ?? null,\n body: activityInfo.body ?? null,\n occurredAt: activityInfo.occurredAt ? new Date(activityInfo.occurredAt) : null,\n appearanceIcon: activityInfo.icon ?? null,\n appearanceColor: activityInfo.color ?? null,\n authorUserId: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n\n if (activityInfo.custom && Object.keys(activityInfo.custom).length) {\n const values = { ...activityInfo.custom } as CustomFieldValuesPayload\n customFieldAssignments.push(async () =>\n dataEngine.setCustomFields({\n entityId: CoreEntities.customers.customer_activity,\n recordId: activity.id,\n organizationId,\n tenantId,\n values,\n })\n )\n }\n }\n }\n }\n\n await em.flush()\n\n for (const assign of customFieldAssignments) {\n try {\n await assign()\n } catch (err) {\n console.warn('[customers.cli] Failed to set custom fields for seeded record', err)\n }\n }\n\n return true\n}\n\nasync function seedCustomerStressTest(\n em: EntityManager,\n container: AppContainer,\n { tenantId, organizationId }: SeedArgs,\n options: StressTestOptions\n): Promise<{ created: number; existing: number }> {\n const requested = Math.max(0, Math.floor(options.count ?? 0))\n if (requested <= 0) return { created: 0, existing: 0 }\n\n const includeExtras = options.includeExtras !== false\n\n const existingPersons = await em.count(CustomerEntity, {\n tenantId,\n organizationId,\n kind: 'person',\n source: STRESS_TEST_SOURCE,\n })\n\n if (existingPersons >= requested) {\n options.onProgress?.({ completed: 0, total: 0 })\n return { created: 0, existing: existingPersons }\n }\n\n const toCreate = requested - existingPersons\n const statusOptions = ENTITY_STATUS_DEFAULTS.map((entry) => entry.value)\n const lifecycleOptions = ENTITY_LIFECYCLE_STAGE_DEFAULTS.map((entry) => entry.value)\n const companyCount = Math.max(1, Math.min(toCreate, Math.round(toCreate / 3)))\n\n const total = toCreate\n options.onProgress?.({ completed: 0, total })\n const startedAt = Date.now()\n\n await seedCustomerDictionaries(em, { tenantId, organizationId })\n\n let cache: CacheStrategy | null = null\n if (includeExtras) {\n if (typeof (container as any).hasRegistration === 'function' && container.hasRegistration('cache')) {\n try {\n cache = (container.resolve('cache') as CacheStrategy)\n } catch {\n cache = null\n }\n }\n try {\n await installCustomEntitiesFromModules(em, cache, {\n tenantIds: [tenantId],\n includeGlobal: false,\n dryRun: false,\n logger: () => {},\n })\n } catch (err) {\n console.warn('[customers.cli] Failed to install custom entities before stress-test seeding', err)\n }\n try {\n await ensureCustomFieldDefinitions(em, CUSTOMER_CUSTOM_FIELD_SETS, { organizationId: null, tenantId })\n } catch (err) {\n console.warn('[customers.cli] Failed to ensure custom field definitions for stress-test seeding', err)\n }\n }\n\n type Primitive = string | number | boolean | null | undefined\n\n type PendingCustomFieldAssignment = {\n entityId: string\n organizationId: string | null\n tenantId: string | null\n values: Record<string, Primitive | Primitive[] | undefined>\n getRecordId: () => string | undefined\n registeredForIndex?: boolean\n }\n\n type CustomFieldInsertRow = {\n entityId: string\n recordId: string\n organizationId: string | null\n tenantId: string | null\n fieldKey: string\n valueText?: string | null\n valueMultiline?: string | null\n valueInt?: number | null\n valueFloat?: number | null\n valueBool?: boolean | null\n }\n\n const pendingAssignments: PendingCustomFieldAssignment[] = []\n const cfRowBuffer: CustomFieldInsertRow[] = []\n const assignmentFlushThreshold = includeExtras ? 100 : 0\n const cfInsertBatchSize = 500\n const flushInterval = 100\n const knex = em.getConnection().getKnex()\n const entityIndexesColumns = await knex('entity_indexes')\n .columnInfo()\n .catch(() => ({} as Record<string, unknown>))\n const hasColumn = (name: string) =>\n Object.keys(entityIndexesColumns).some((col) => col.toLowerCase() === name.toLowerCase())\n const supportsOrgCoalesced = hasColumn('organization_id_coalesced')\n\n type PendingIndexDoc = {\n entityType: string\n recordId: string\n organizationId: string | null\n tenantId: string | null\n baseRow: Record<string, any>\n customFields: IndexCustomFieldValue[]\n createdAt: Date\n updatedAt: Date\n }\n\n const pendingIndexDocs = new Map<string, Map<string, PendingIndexDoc>>()\n\n const ensureIndexDoc = (\n entityType: string,\n recordId: string,\n initializer: () => PendingIndexDoc,\n ): PendingIndexDoc => {\n let bucket = pendingIndexDocs.get(entityType)\n if (!bucket) {\n bucket = new Map<string, PendingIndexDoc>()\n pendingIndexDocs.set(entityType, bucket)\n }\n let doc = bucket.get(recordId)\n if (!doc) {\n doc = initializer()\n bucket.set(recordId, doc)\n }\n return doc\n }\n\n const registerIndexBaseRow = (entityType: string, row: Record<string, any>) => {\n const recordId = String((row as any).id)\n const createdAt = ((row as any).created_at as Date) ?? new Date()\n const updatedAt = ((row as any).updated_at as Date) ?? createdAt\n const organizationId = ((row as any).organization_id ?? null) as string | null\n const tenantId = ((row as any).tenant_id ?? null) as string | null\n const doc = ensureIndexDoc(entityType, recordId, () => ({\n entityType,\n recordId,\n organizationId,\n tenantId,\n baseRow: { ...row },\n customFields: [],\n createdAt,\n updatedAt,\n }))\n doc.entityType = entityType\n doc.recordId = recordId\n doc.organizationId = organizationId\n doc.tenantId = tenantId\n doc.baseRow = { ...row }\n doc.createdAt = createdAt\n doc.updatedAt = updatedAt\n }\n\n const appendIndexCustomFields = (\n entityType: string,\n recordId: string,\n scope: { organizationId: string | null; tenantId: string | null },\n values: Record<string, Primitive | Primitive[] | undefined>,\n ) => {\n const doc = ensureIndexDoc(entityType, recordId, () => ({\n entityType,\n recordId,\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n baseRow: {},\n customFields: [],\n createdAt: new Date(),\n updatedAt: new Date(),\n }))\n doc.organizationId = scope.organizationId\n doc.tenantId = scope.tenantId\n for (const [key, raw] of Object.entries(values)) {\n if (raw === undefined) continue\n const pushValue = (value: Primitive) => {\n doc.customFields.push({\n key,\n value: value ?? null,\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n })\n }\n if (Array.isArray(raw)) {\n for (const entry of raw as Primitive[]) pushValue(entry)\n } else {\n pushValue(raw as Primitive)\n }\n }\n }\n\n const flushIndexDocs = async (trx: any) => {\n const rows: Array<{\n entity_type: string\n entity_id: string\n organization_id: string | null\n tenant_id: string | null\n doc: Record<string, unknown>\n index_version: number\n created_at: Date\n updated_at: Date\n deleted_at: null\n }> = []\n for (const [entityType, bucket] of pendingIndexDocs.entries()) {\n for (const entry of bucket.values()) {\n if (!entry.baseRow || Object.keys(entry.baseRow).length === 0) continue\n rows.push({\n entity_type: entityType,\n entity_id: entry.recordId,\n organization_id: entry.organizationId,\n tenant_id: entry.tenantId,\n doc: buildIndexDocument(entry.baseRow, entry.customFields, {\n organizationId: entry.organizationId,\n tenantId: entry.tenantId,\n }),\n index_version: 1,\n created_at: entry.createdAt,\n updated_at: entry.updatedAt,\n deleted_at: null,\n })\n }\n bucket.clear()\n }\n if (!rows.length) {\n pendingIndexDocs.clear()\n return\n }\n if (supportsOrgCoalesced) {\n await trx('entity_indexes')\n .insert(rows)\n .onConflict(['entity_type', 'entity_id', 'organization_id_coalesced'])\n .merge({\n doc: trx.raw('excluded.doc'),\n index_version: trx.raw('excluded.index_version'),\n organization_id: trx.raw('excluded.organization_id'),\n tenant_id: trx.raw('excluded.tenant_id'),\n deleted_at: trx.raw('excluded.deleted_at'),\n updated_at: trx.raw('excluded.updated_at'),\n })\n } else {\n for (const row of rows) {\n const updatePayload = {\n doc: row.doc,\n index_version: row.index_version,\n organization_id: row.organization_id,\n tenant_id: row.tenant_id,\n updated_at: row.updated_at,\n deleted_at: null as null,\n }\n const updated = await trx('entity_indexes')\n .where({\n entity_type: row.entity_type,\n entity_id: row.entity_id,\n organization_id: row.organization_id,\n })\n .update(updatePayload)\n if (updated) continue\n try {\n await trx('entity_indexes').insert(row)\n } catch {\n // ignored: row inserted concurrently\n }\n }\n }\n pendingIndexDocs.clear()\n }\n\n const queueCustomFieldAssignment = (assignment: PendingCustomFieldAssignment) => {\n if (!includeExtras) return\n const recordId = assignment.getRecordId()\n if (recordId) {\n appendIndexCustomFields(\n assignment.entityId,\n recordId,\n { organizationId: assignment.organizationId ?? null, tenantId: assignment.tenantId ?? null },\n assignment.values,\n )\n assignment.registeredForIndex = true\n }\n pendingAssignments.push(assignment)\n }\n\n const appendRow = (row: CustomFieldInsertRow) => {\n cfRowBuffer.push(row)\n }\n\n const materializeAssignments = () => {\n if (!pendingAssignments.length) return\n for (const assignment of pendingAssignments.splice(0)) {\n const recordId = assignment.getRecordId()\n if (!recordId) continue\n if (!assignment.registeredForIndex) {\n appendIndexCustomFields(\n assignment.entityId,\n recordId,\n { organizationId: assignment.organizationId ?? null, tenantId: assignment.tenantId ?? null },\n assignment.values,\n )\n assignment.registeredForIndex = true\n }\n for (const [fieldKey, raw] of Object.entries(assignment.values)) {\n if (raw === undefined) continue\n if (Array.isArray(raw)) {\n for (const val of raw as Primitive[]) {\n appendRow(buildCustomFieldRow(assignment, recordId, fieldKey, val))\n }\n } else {\n appendRow(buildCustomFieldRow(assignment, recordId, fieldKey, raw))\n }\n }\n }\n }\n\n const buildCustomFieldRow = (\n assignment: PendingCustomFieldAssignment,\n recordId: string,\n fieldKey: string,\n value: Primitive\n ): CustomFieldInsertRow => {\n const base: CustomFieldInsertRow = {\n entityId: assignment.entityId,\n recordId,\n organizationId: assignment.organizationId ?? null,\n tenantId: assignment.tenantId ?? null,\n fieldKey,\n }\n if (value === null || value === undefined) {\n base.valueText = null\n return base\n }\n if (typeof value === 'boolean') {\n base.valueBool = value\n return base\n }\n if (typeof value === 'number') {\n if (Number.isInteger(value)) base.valueInt = value\n else base.valueFloat = value\n return base\n }\n base.valueText = String(value)\n return base\n }\n\n const flushCustomFieldRows = async (force: boolean) => {\n if (!includeExtras) return\n if (!force && cfRowBuffer.length < cfInsertBatchSize) return\n if (!cfRowBuffer.length) return\n const chunkSize = cfInsertBatchSize\n while (cfRowBuffer.length) {\n const chunk = cfRowBuffer.splice(0, chunkSize)\n const timestamp = new Date()\n const payload = chunk.map((row) => ({\n entity_id: row.entityId,\n record_id: row.recordId,\n organization_id: row.organizationId,\n tenant_id: row.tenantId,\n field_key: row.fieldKey,\n value_text: row.valueText ?? null,\n value_multiline: row.valueMultiline ?? null,\n value_int: row.valueInt ?? null,\n value_float: row.valueFloat ?? null,\n value_bool: row.valueBool ?? null,\n created_at: timestamp,\n deleted_at: null,\n }))\n await knex.insert(payload).into('custom_field_values')\n }\n }\n\n const flushAssignments = async (force = false) => {\n if (!includeExtras) {\n if (force) await em.flush()\n return\n }\n if (!force && pendingAssignments.length < assignmentFlushThreshold && cfRowBuffer.length < cfInsertBatchSize) return\n await em.flush()\n materializeAssignments()\n await flushCustomFieldRows(force)\n }\n\n // bulk insert data structures and generation implemented below\n\n type CustomerEntityRow = {\n id: string\n organization_id: string\n tenant_id: string\n kind: 'company' | 'person'\n display_name: string\n description: string | null\n owner_user_id: string | null\n primary_email: string | null\n primary_phone: string | null\n status: string | null\n lifecycle_stage: string | null\n source: string | null\n next_interaction_at: Date | null\n next_interaction_name: string | null\n next_interaction_ref_id: string | null\n next_interaction_icon: string | null\n next_interaction_color: string | null\n is_active: boolean\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n }\n\n type CustomerCompanyProfileRow = {\n id: string\n organization_id: string\n tenant_id: string\n entity_id: string\n legal_name: string | null\n brand_name: string | null\n domain: string | null\n website_url: string | null\n industry: string | null\n size_bucket: string | null\n annual_revenue: string | null\n created_at: Date\n updated_at: Date\n }\n\n type CustomerPersonProfileRow = {\n id: string\n organization_id: string\n tenant_id: string\n entity_id: string\n company_entity_id: string | null\n first_name: string | null\n last_name: string | null\n preferred_name: string | null\n job_title: string | null\n department: string | null\n seniority: string | null\n timezone: string | null\n linked_in_url: string | null\n twitter_url: string | null\n created_at: Date\n updated_at: Date\n }\n\n type CustomerDealRow = {\n id: string\n organization_id: string\n tenant_id: string\n title: string\n description: string | null\n status: string\n pipeline_stage: string | null\n value_amount: string | null\n value_currency: string | null\n probability: number | null\n expected_close_at: Date | null\n owner_user_id: string | null\n source: string | null\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n }\n\n type CustomerDealCompanyRow = {\n id: string\n deal_id: string\n company_entity_id: string\n created_at: Date\n }\n\n type CustomerDealPersonRow = {\n id: string\n deal_id: string\n person_entity_id: string\n role: string | null\n created_at: Date\n }\n\n type CustomerActivityRow = {\n id: string\n organization_id: string\n tenant_id: string\n entity_id: string\n deal_id: string | null\n activity_type: string\n subject: string | null\n body: string | null\n occurred_at: Date | null\n author_user_id: string | null\n appearance_icon: string | null\n appearance_color: string | null\n created_at: Date\n updated_at: Date\n }\n\n type CustomerCommentRow = {\n id: string\n organization_id: string\n tenant_id: string\n entity_id: string\n deal_id: string | null\n body: string\n author_user_id: string | null\n appearance_icon: string | null\n appearance_color: string | null\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n }\n\n type CompanyRecord = {\n entityId: string\n companyProfileId: string\n status: string | null\n lifecycleStage: string | null\n source: string | null\n displayName: string\n }\n\n const customerEntityRows: CustomerEntityRow[] = []\n const companyProfileRows: CustomerCompanyProfileRow[] = []\n const personProfileRows: CustomerPersonProfileRow[] = []\n const dealRows: CustomerDealRow[] = []\n const dealCompanyRows: CustomerDealCompanyRow[] = []\n const dealPersonRows: CustomerDealPersonRow[] = []\n const activityRows: CustomerActivityRow[] = []\n const commentRows: CustomerCommentRow[] = []\n const companies: CompanyRecord[] = []\n const entityInsertBatchSize = 1000\n const contactsPerCompany = Math.max(1, Math.ceil(toCreate / companyCount))\n\n await warnIfStressTestSchemaChanged(knex)\n\n const insertRows = async (trx: any, table: string, rows: unknown[]) => {\n if (!rows.length) return\n await trx.batchInsert(table, rows, entityInsertBatchSize)\n rows.length = 0\n }\n\n const flushEntityRows = async (force = false) => {\n if (!force) return\n const pendingCount =\n customerEntityRows.length +\n companyProfileRows.length +\n personProfileRows.length +\n dealRows.length +\n dealCompanyRows.length +\n dealPersonRows.length +\n activityRows.length +\n commentRows.length\n if (pendingCount === 0) return\n await knex.transaction(async (trx) => {\n await insertRows(trx, 'customer_entities', customerEntityRows)\n await insertRows(trx, 'customer_companies', companyProfileRows)\n await insertRows(trx, 'customer_people', personProfileRows)\n if (includeExtras) {\n await insertRows(trx, 'customer_deals', dealRows)\n await insertRows(trx, 'customer_deal_companies', dealCompanyRows)\n await insertRows(trx, 'customer_deal_people', dealPersonRows)\n await insertRows(trx, 'customer_activities', activityRows)\n await insertRows(trx, 'customer_comments', commentRows)\n }\n await flushIndexDocs(trx)\n })\n }\n\n const createCompanyRecord = (): CompanyRecord => {\n const companyId = randomUUID()\n const profileId = randomUUID()\n const status = randomChoice(statusOptions)\n const lifecycleStage = randomChoice(lifecycleOptions)\n const prefix = randomChoice(STRESS_TEST_COMPANY_PREFIX)\n const suffix = randomChoice(STRESS_TEST_COMPANY_SUFFIX)\n const baseName = `${prefix} ${suffix}`\n const sequence = existingPersons + companies.length + 1\n const displayName = `${baseName} ${sequence}`\n const domainBase = slugifyValue(`${prefix}-${suffix}-${sequence}`) || `company-${sequence}`\n const domain = `${domainBase}.${STRESS_TEST_EMAIL_DOMAIN}`\n const websiteUrl = `https://www.${domain}`\n const primaryEmail = `hello@${domain}`\n const primaryPhone = buildPhone(sequence)\n const timestamp = new Date()\n const entityRow: CustomerEntityRow = {\n id: companyId,\n organization_id: organizationId,\n tenant_id: tenantId,\n kind: 'company',\n display_name: displayName,\n description: `Stress test company #${sequence}`,\n owner_user_id: null,\n primary_email: primaryEmail,\n primary_phone: primaryPhone,\n status,\n lifecycle_stage: lifecycleStage,\n source: STRESS_TEST_SOURCE,\n next_interaction_at: null,\n next_interaction_name: null,\n next_interaction_ref_id: null,\n next_interaction_icon: null,\n next_interaction_color: null,\n is_active: true,\n created_at: timestamp,\n updated_at: timestamp,\n deleted_at: null,\n }\n customerEntityRows.push(entityRow)\n registerIndexBaseRow(CoreEntities.customers.customer_entity, entityRow)\n const profileRow: CustomerCompanyProfileRow = {\n id: profileId,\n organization_id: organizationId,\n tenant_id: tenantId,\n entity_id: companyId,\n legal_name: `${displayName} LLC`,\n brand_name: baseName,\n domain,\n website_url: websiteUrl,\n industry: randomChoice(STRESS_TEST_INDUSTRIES),\n size_bucket: randomChoice(STRESS_TEST_SIZE_BUCKETS),\n annual_revenue: null,\n created_at: timestamp,\n updated_at: timestamp,\n }\n companyProfileRows.push(profileRow)\n registerIndexBaseRow(CoreEntities.customers.customer_company_profile, profileRow)\n const record: CompanyRecord = {\n entityId: companyId,\n companyProfileId: profileId,\n status,\n lifecycleStage,\n source: STRESS_TEST_SOURCE,\n displayName,\n }\n if (includeExtras) {\n const companyFieldValues: Record<string, Primitive | Primitive[]> = {\n relationship_health: randomChoice(STRESS_TEST_RELATIONSHIP_HEALTH),\n renewal_quarter: randomChoice(STRESS_TEST_RENEWAL_QUARTERS),\n customer_marketing_case: Math.random() < 0.35,\n }\n if (Math.random() < 0.4) companyFieldValues.executive_notes = randomChoice(STRESS_TEST_NOTE_SNIPPETS)\n queueCustomFieldAssignment({\n entityId: CoreEntities.customers.customer_company_profile,\n organizationId,\n tenantId,\n values: companyFieldValues,\n getRecordId: () => profileId,\n })\n }\n companies.push(record)\n return record\n }\n\n let created = 0\n for (let i = 0; i < toCreate; i += 1) {\n const desiredCompanyIndex = Math.floor(i / contactsPerCompany)\n while (companies.length <= desiredCompanyIndex && companies.length < companyCount) {\n createCompanyRecord()\n }\n const companyRecord =\n companies[Math.min(desiredCompanyIndex, companies.length - 1)] ?? createCompanyRecord()\n\n const sequence = existingPersons + i + 1\n const timestamp = new Date()\n const firstName = randomChoice(STRESS_TEST_FIRST_NAMES)\n const lastName = randomChoice(STRESS_TEST_LAST_NAMES)\n const displayName = `${firstName} ${lastName}`\n const emailHandle = slugifyValue(`${firstName}.${lastName}`) || `contact-${sequence}`\n const email = `${emailHandle}.${sequence}@${STRESS_TEST_EMAIL_DOMAIN}`\n const timezone = randomChoice(STRESS_TEST_TIMEZONES)\n const personEntityId = randomUUID()\n const personEntityRow: CustomerEntityRow = {\n id: personEntityId,\n organization_id: organizationId,\n tenant_id: tenantId,\n kind: 'person',\n display_name: displayName,\n description: `Stress test contact #${sequence}`,\n owner_user_id: null,\n primary_email: email,\n primary_phone: buildPhone(sequence),\n status: companyRecord.status,\n lifecycle_stage: companyRecord.lifecycleStage,\n source: companyRecord.source,\n next_interaction_at: null,\n next_interaction_name: null,\n next_interaction_ref_id: null,\n next_interaction_icon: null,\n next_interaction_color: null,\n is_active: true,\n created_at: timestamp,\n updated_at: timestamp,\n deleted_at: null,\n }\n customerEntityRows.push(personEntityRow)\n registerIndexBaseRow(CoreEntities.customers.customer_entity, personEntityRow)\n const personProfileId = randomUUID()\n const personProfileRow: CustomerPersonProfileRow = {\n id: personProfileId,\n organization_id: organizationId,\n tenant_id: tenantId,\n entity_id: personEntityId,\n company_entity_id: companyRecord.entityId,\n first_name: firstName,\n last_name: lastName,\n preferred_name: firstName,\n job_title: randomChoice(STRESS_TEST_JOB_TITLES),\n department: randomChoice(STRESS_TEST_DEPARTMENTS),\n seniority: randomChoice(STRESS_TEST_SENIORITY),\n timezone,\n linked_in_url: `https://www.linkedin.com/in/${emailHandle}${sequence}`,\n twitter_url: `https://twitter.com/${emailHandle}${sequence}`,\n created_at: timestamp,\n updated_at: timestamp,\n }\n personProfileRows.push(personProfileRow)\n registerIndexBaseRow(CoreEntities.customers.customer_person_profile, personProfileRow)\n\n if (includeExtras) {\n const personFieldValues: Record<string, Primitive | Primitive[]> = {\n buying_role: randomChoice(STRESS_TEST_BUYING_ROLES),\n preferred_pronouns: randomChoice(STRESS_TEST_PRONOUNS),\n newsletter_opt_in: Math.random() < 0.5,\n }\n queueCustomFieldAssignment({\n entityId: CoreEntities.customers.customer_person_profile,\n organizationId,\n tenantId,\n values: personFieldValues,\n getRecordId: () => personProfileId,\n })\n\n const monetaryBase = randomInt(5, 220) * 1000\n const pipelineStage = randomChoice(STRESS_TEST_DEAL_PIPELINE)\n const dealStatus = randomChoice(STRESS_TEST_DEAL_STATUSES)\n const dealId = randomUUID()\n const valueAmount = toAmount(monetaryBase + randomInt(0, 7500))\n const expectedCloseAt =\n dealStatus === 'win' || dealStatus === 'closed' || dealStatus === 'loose'\n ? randomPastDate(120)\n : randomFutureDate(120)\n const dealRow: CustomerDealRow = {\n id: dealId,\n organization_id: organizationId,\n tenant_id: tenantId,\n title: `${companyRecord.displayName} Opportunity ${sequence}`,\n description: `Stress test deal generated for contact #${sequence}`,\n status: dealStatus,\n pipeline_stage: pipelineStage ?? null,\n value_amount: valueAmount,\n value_currency: Math.random() < 0.6 ? 'USD' : 'EUR',\n probability: randomInt(25, 95),\n expected_close_at: expectedCloseAt,\n owner_user_id: null,\n source: companyRecord.source,\n created_at: timestamp,\n updated_at: timestamp,\n deleted_at: null,\n }\n dealRows.push(dealRow)\n registerIndexBaseRow(CoreEntities.customers.customer_deal, dealRow)\n dealCompanyRows.push({\n id: randomUUID(),\n deal_id: dealId,\n company_entity_id: companyRecord.entityId,\n created_at: timestamp,\n })\n dealPersonRows.push({\n id: randomUUID(),\n deal_id: dealId,\n person_entity_id: personEntityId,\n role: randomChoice(STRESS_TEST_DEAL_CUSTOMER_ROLES),\n created_at: timestamp,\n })\n\n queueCustomFieldAssignment({\n entityId: CoreEntities.customers.customer_deal,\n organizationId,\n tenantId,\n values: {\n competitive_risk: randomChoice(STRESS_TEST_DEAL_RISK),\n implementation_complexity: randomChoice(STRESS_TEST_IMPLEMENTATION),\n estimated_seats: randomInt(5, 250),\n requires_legal_review: Math.random() < 0.3,\n },\n getRecordId: () => dealId,\n })\n\n const activityCount = randomInt(2, 5)\n for (let idx = 0; idx < activityCount; idx += 1) {\n const activityType = randomChoice(STRESS_TEST_DEAL_ACTIVITY_TYPES)\n const activityId = randomUUID()\n const targetEntityId = activityType === 'person' ? personEntityId : companyRecord.entityId\n const occurredAt = randomPastDate(200)\n const activityRow: CustomerActivityRow = {\n id: activityId,\n organization_id: organizationId,\n tenant_id: tenantId,\n entity_id: targetEntityId,\n deal_id: dealId,\n activity_type: activityType,\n subject: randomChoice(STRESS_TEST_ACTIVITY_SUBJECTS),\n body: randomChoice(STRESS_TEST_ACTIVITY_BODIES),\n occurred_at: occurredAt,\n author_user_id: null,\n appearance_icon: randomChoice(STRESS_TEST_ACTIVITY_ICONS),\n appearance_color: randomChoice(['#2563eb', '#22c55e', '#f97316', '#a855f7', '#6366f1']),\n created_at: timestamp,\n updated_at: timestamp,\n }\n activityRows.push(activityRow)\n registerIndexBaseRow(CoreEntities.customers.customer_activity, activityRow)\n\n queueCustomFieldAssignment({\n entityId: CoreEntities.customers.customer_activity,\n organizationId,\n tenantId,\n values: {\n engagement_sentiment: randomChoice(STRESS_TEST_ACTIVITY_SENTIMENT),\n shared_with_leadership: Math.random() < 0.4,\n follow_up_owner: randomChoice(STRESS_TEST_ACTIVITY_OWNERS),\n },\n getRecordId: () => activityId,\n })\n }\n\n const noteCount = randomInt(2, 5)\n for (let idx = 0; idx < noteCount; idx += 1) {\n const noteTimestamp = randomPastDate(120)\n commentRows.push({\n id: randomUUID(),\n organization_id: organizationId,\n tenant_id: tenantId,\n entity_id: personEntityId,\n deal_id: dealId,\n body: randomChoice(STRESS_TEST_NOTE_SNIPPETS),\n author_user_id: null,\n appearance_icon: 'lucide:sticky-note',\n appearance_color: randomChoice(['#2563eb', '#22c55e', '#f97316', '#a855f7', '#6366f1']),\n created_at: noteTimestamp,\n updated_at: noteTimestamp,\n deleted_at: null,\n })\n }\n }\n\n created += 1\n const shouldFlush = created % flushInterval === 0\n if (shouldFlush) await flushEntityRows(true)\n options.onProgress?.({ completed: created, total })\n if (shouldFlush) await flushAssignments(true)\n else await flushAssignments()\n }\n\n await flushEntityRows(true)\n await flushAssignments(true)\n options.onProgress?.({ completed: total, total })\n const elapsedMs = Math.max(1, Date.now() - startedAt)\n const recordsPerSecond = toCreate > 0 ? (toCreate / elapsedMs) * 1000 : 0\n console.log(\n `\u26A1 Stress test seeding throughput: ${toCreate.toLocaleString()} records in ${(elapsedMs / 1000).toFixed(\n 1\n )}s (${recordsPerSecond.toFixed(1)} records/s${includeExtras ? '' : ' - lite mode'})`\n )\n\n return { created: toCreate, existing: existingPersons }\n}\n\n\nconst STRESS_TEST_REQUIRED_COLUMNS: Record<string, readonly string[]> = {\n customer_entities: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'kind',\n 'display_name',\n 'description',\n 'owner_user_id',\n 'primary_email',\n 'primary_phone',\n 'status',\n 'lifecycle_stage',\n 'source',\n 'next_interaction_at',\n 'next_interaction_name',\n 'next_interaction_ref_id',\n 'next_interaction_icon',\n 'next_interaction_color',\n 'is_active',\n 'created_at',\n 'updated_at',\n 'deleted_at',\n ],\n customer_companies: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'entity_id',\n 'legal_name',\n 'brand_name',\n 'domain',\n 'website_url',\n 'industry',\n 'size_bucket',\n 'annual_revenue',\n 'created_at',\n 'updated_at',\n ],\n customer_people: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'first_name',\n 'last_name',\n 'preferred_name',\n 'job_title',\n 'department',\n 'seniority',\n 'timezone',\n 'linked_in_url',\n 'twitter_url',\n 'created_at',\n 'updated_at',\n 'entity_id',\n 'company_entity_id',\n ],\n customer_deals: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'title',\n 'description',\n 'status',\n 'pipeline_stage',\n 'value_amount',\n 'value_currency',\n 'probability',\n 'expected_close_at',\n 'owner_user_id',\n 'source',\n 'created_at',\n 'updated_at',\n 'deleted_at',\n ],\n customer_deal_companies: ['id', 'deal_id', 'company_entity_id', 'created_at'],\n customer_deal_people: ['id', 'deal_id', 'person_entity_id', 'role', 'created_at'],\n customer_activities: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'entity_id',\n 'deal_id',\n 'activity_type',\n 'subject',\n 'body',\n 'occurred_at',\n 'author_user_id',\n 'appearance_icon',\n 'appearance_color',\n 'created_at',\n 'updated_at',\n ],\n customer_comments: [\n 'id',\n 'organization_id',\n 'tenant_id',\n 'entity_id',\n 'deal_id',\n 'body',\n 'author_user_id',\n 'appearance_icon',\n 'appearance_color',\n 'created_at',\n 'updated_at',\n 'deleted_at',\n ],\n custom_field_values: [\n 'entity_id',\n 'record_id',\n 'organization_id',\n 'tenant_id',\n 'field_key',\n 'value_text',\n 'value_multiline',\n 'value_int',\n 'value_float',\n 'value_bool',\n 'created_at',\n 'deleted_at',\n ],\n}\n\nasync function warnIfStressTestSchemaChanged(knex: any) {\n try {\n const warnings: string[] = []\n for (const [table, requiredColumns] of Object.entries(STRESS_TEST_REQUIRED_COLUMNS)) {\n const rows = await knex('information_schema.columns')\n .select('column_name')\n .where({ table_schema: 'public', table_name: table })\n const existing = new Set(rows.map((row: { column_name: string }) => row.column_name))\n const missing = requiredColumns.filter((column) => !existing.has(column))\n if (missing.length) warnings.push(`${table}: missing ${missing.join(', ')}`)\n }\n if (warnings.length) {\n console.warn('[customers.cli] Warning: stress-test bulk seeder detected schema differences. Bulk insert path may need updates:')\n warnings.forEach((warning) => console.warn(` - ${warning}`))\n }\n } catch (err) {\n console.warn('[customers.cli] Warning: unable to verify schema for stress-test bulk seeder', err)\n }\n}\n\nconst seedDictionaries: ModuleCli = {\n command: 'seed-dictionaries',\n async run(rest) {\n const args = parseArgs(rest)\n const tenantId = String(args.tenantId ?? args.tenant ?? '')\n const organizationId = String(args.organizationId ?? args.orgId ?? args.org ?? '')\n if (!tenantId || !organizationId) {\n console.error('Usage: mercato customers seed-dictionaries --tenant <tenantId> --org <organizationId>')\n return\n }\n const { resolve } = await createRequestContainer()\n const em = resolve<EntityManager>('em')\n await em.transactional(async (tem) => {\n await seedCustomerDictionaries(tem, { tenantId, organizationId })\n await seedCurrencyDictionary(tem, { tenantId, organizationId })\n await tem.flush()\n })\n console.log('\uD83D\uDCDA Customer dictionaries seeded for organization', organizationId)\n },\n}\n\nconst seedExamples: ModuleCli = {\n command: 'seed-examples',\n async run(rest) {\n const args = parseArgs(rest)\n const tenantId = String(args.tenantId ?? args.tenant ?? '')\n const organizationId = String(args.organizationId ?? args.orgId ?? args.org ?? '')\n if (!tenantId || !organizationId) {\n console.error('Usage: mercato customers seed-examples --tenant <tenantId> --org <organizationId>')\n return\n }\n const container = await createRequestContainer()\n const em = (container.resolve('em') as EntityManager)\n const seeded = await em.transactional(async (tem) =>\n seedCustomerExamples(tem, container, { tenantId, organizationId })\n )\n if (seeded) {\n console.log('Customer example data seeded for organization', organizationId)\n } else {\n console.log('Customer example data already present; skipping')\n }\n },\n}\n\nconst seedStressTest: ModuleCli = {\n command: 'seed-stresstest',\n async run(rest) {\n const args = parseArgs(rest)\n const tenantId = String(args.tenantId ?? args.tenant ?? '')\n const organizationId = String(args.organizationId ?? args.orgId ?? args.org ?? '')\n if (!tenantId || !organizationId) {\n console.error('Usage: mercato customers seed-stresstest --tenant <tenantId> --org <organizationId> [--count <number>] [--lite]')\n return\n }\n const defaultCount = 6000\n const countRaw =\n args.count ?? args.total ?? args.number ?? args.customers ?? String(defaultCount)\n const parsedCount = Number.parseInt(countRaw, 10)\n const count = Number.isFinite(parsedCount) && parsedCount > 0 ? parsedCount : defaultCount\n const liteFlag = (() => {\n if (typeof args.lite === 'string') {\n if (!args.lite.trim()) return true\n return parseBooleanToken(args.lite) === true\n }\n return false\n })()\n const liteMode =\n liteFlag ||\n args.mode === 'lite' ||\n args.payload === 'lite' ||\n args.variant === 'lite'\n\n const container = await createRequestContainer()\n const em = (container.resolve('em') as EntityManager)\n let progressBar: ProgressBarHandle | null = null\n const result = await seedCustomerStressTest(\n em,\n container,\n { tenantId, organizationId },\n {\n count,\n includeExtras: !liteMode,\n onProgress: ({ completed, total }) => {\n if (total <= 0) return\n if (!progressBar) {\n const label = liteMode ? 'Generating stress-test customers (lite)' : 'Generating stress-test customers'\n progressBar = createProgressBar(label, total)\n }\n if (progressBar) {\n ;(progressBar as unknown as { update(completed: number): void }).update(completed)\n }\n },\n }\n )\n if (progressBar) {\n ;(progressBar as unknown as { complete(): void }).complete()\n }\n\n try {\n const eventBus = (container.resolve('eventBus') as any)\n const coverageEntities = [\n CoreEntities.customers.customer_entity,\n CoreEntities.customers.customer_person_profile,\n CoreEntities.customers.customer_company_profile,\n ]\n await Promise.all(\n coverageEntities.map(async (entityType) => {\n await eventBus.emitEvent('query_index.coverage.refresh', {\n entityType,\n tenantId,\n organizationId,\n delayMs: 0,\n })\n await eventBus.emitEvent('query_index.coverage.refresh', {\n entityType,\n tenantId,\n organizationId: null,\n delayMs: 0,\n })\n })\n )\n } catch (err) {\n console.warn('[customers.cli] Failed to refresh query index coverage after stress-test seeding', err)\n }\n\n if (result.created > 0) {\n console.log(\n `Created ${result.created} stress test customer contacts (existing previously: ${result.existing})`\n )\n } else {\n console.log(\n `Stress test dataset already satisfied (existing contacts: ${result.existing}, requested: ${count})`\n )\n }\n },\n}\n\nasync function seedDefaultPipeline(em: EntityManager, { tenantId, organizationId }: SeedArgs): Promise<void> {\n const existing = await em.findOne(CustomerPipeline, { tenantId, organizationId, isDefault: true })\n if (existing) return\n\n const pipeline = em.create(CustomerPipeline, {\n tenantId,\n organizationId,\n name: 'Default Pipeline',\n isDefault: true,\n })\n em.persist(pipeline)\n await em.flush()\n\n for (let i = 0; i < PIPELINE_STAGE_DEFAULTS.length; i++) {\n const entry = PIPELINE_STAGE_DEFAULTS[i]\n em.persist(em.create(CustomerPipelineStage, {\n tenantId,\n organizationId,\n pipelineId: pipeline.id,\n label: entry.label,\n order: i,\n }))\n }\n await em.flush()\n}\n\nexport { seedCustomerDictionaries, seedCustomerExamples, seedCustomerStressTest, seedCurrencyDictionary, seedDefaultPipeline }\nexport type { SeedArgs as CustomerSeedArgs }\n\nconst customersCliCommands = [seedDictionaries, seedExamples, seedStressTest]\n\nexport default customersCliCommands\nconst CUSTOMER_CUSTOM_FIELD_SETS = [\n {\n entity: CoreEntities.customers.customer_person_profile,\n fields: [\n cf.select('buying_role', ['economic_buyer', 'champion', 'technical_evaluator', 'influencer'], {\n label: 'Buying role',\n description: 'Contact role within the buying committee.',\n filterable: true,\n }),\n cf.text('preferred_pronouns', {\n label: 'Preferred pronouns',\n description: 'How the contact prefers to be addressed.',\n }),\n cf.boolean('newsletter_opt_in', {\n label: 'Newsletter opt-in',\n description: 'Indicates whether marketing newsletters are permitted.',\n defaultValue: false,\n }),\n ],\n },\n {\n entity: CoreEntities.customers.customer_company_profile,\n fields: [\n cf.select('relationship_health', ['healthy', 'monitor', 'at_risk'], {\n label: 'Relationship health',\n description: 'Overall account health assessment.',\n filterable: true,\n }),\n cf.select('renewal_quarter', ['Q1', 'Q2', 'Q3', 'Q4'], {\n label: 'Renewal quarter',\n description: 'Expected renewal quarter for subscription accounts.',\n filterable: true,\n }),\n cf.multiline('executive_notes', {\n label: 'Executive notes',\n description: 'Context shared during executive reviews.',\n listVisible: false,\n }),\n cf.boolean('customer_marketing_case', {\n label: 'Marketing case study ready',\n description: 'The customer has approved participation in marketing collateral.',\n defaultValue: false,\n }),\n ],\n },\n {\n entity: CoreEntities.customers.customer_deal,\n fields: [\n cf.select('competitive_risk', ['low', 'medium', 'high'], {\n label: 'Competitive risk',\n description: 'Perceived threat level from competitors.',\n filterable: true,\n }),\n cf.select('implementation_complexity', ['light', 'standard', 'complex'], {\n label: 'Implementation complexity',\n description: 'Expected level of effort for delivery.',\n }),\n cf.integer('estimated_seats', {\n label: 'Estimated seats/licenses',\n description: 'Projected seat count for the opportunity.',\n filterable: true,\n }),\n cf.boolean('requires_legal_review', {\n label: 'Requires legal review',\n description: 'Deal includes terms that need legal approval.',\n defaultValue: false,\n }),\n ],\n },\n {\n entity: CoreEntities.customers.customer_activity,\n fields: [\n cf.select('engagement_sentiment', ['positive', 'neutral', 'negative'], {\n label: 'Engagement sentiment',\n description: 'Tone of the interaction based on the latest touchpoint.',\n filterable: true,\n }),\n cf.boolean('shared_with_leadership', {\n label: 'Shared with leadership',\n description: 'Activity summary was shared with leadership or executives.',\n defaultValue: false,\n }),\n cf.text('follow_up_owner', {\n label: 'Follow-up owner',\n description: 'Team member responsible for the next follow-up.',\n }),\n ],\n },\n]\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["organizationId", "tenantId"]
|
|
7
7
|
}
|