git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
499 lines
20 KiB
JavaScript
499 lines
20 KiB
JavaScript
"use strict";
|
|
/**
|
|
* Customer Relationship Management (CRM) Data Generation
|
|
* Simulates Salesforce, Microsoft Dynamics CRM, and HubSpot scenarios
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.generateLeads = generateLeads;
|
|
exports.generateOpportunities = generateOpportunities;
|
|
exports.generateContactInteractions = generateContactInteractions;
|
|
exports.generateAccounts = generateAccounts;
|
|
exports.generateSupportTickets = generateSupportTickets;
|
|
exports.generateCustomerLTV = generateCustomerLTV;
|
|
exports.simulateSalesFunnel = simulateSalesFunnel;
|
|
exports.generateCompleteCRMDataset = generateCompleteCRMDataset;
|
|
exports.streamCRMInteractions = streamCRMInteractions;
|
|
const index_js_1 = require("../../src/index.js");
|
|
// Salesforce Lead Schema
|
|
const leadSchema = {
|
|
leadId: { type: 'string', required: true },
|
|
firstName: { type: 'string', required: true },
|
|
lastName: { type: 'string', required: true },
|
|
email: { type: 'string', required: true },
|
|
phone: { type: 'string', required: false },
|
|
company: { type: 'string', required: true },
|
|
title: { type: 'string', required: true },
|
|
industry: { type: 'string', required: true },
|
|
numberOfEmployees: { type: 'number', required: false },
|
|
annualRevenue: { type: 'number', required: false },
|
|
leadSource: { type: 'string', required: true },
|
|
status: { type: 'string', required: true },
|
|
rating: { type: 'string', required: true },
|
|
address: { type: 'object', required: false, properties: {
|
|
street: { type: 'string' },
|
|
city: { type: 'string' },
|
|
state: { type: 'string' },
|
|
postalCode: { type: 'string' },
|
|
country: { type: 'string' }
|
|
} },
|
|
description: { type: 'string', required: false },
|
|
website: { type: 'string', required: false },
|
|
leadScore: { type: 'number', required: true },
|
|
conversionProbability: { type: 'number', required: true },
|
|
ownerId: { type: 'string', required: true },
|
|
ownerName: { type: 'string', required: true },
|
|
createdDate: { type: 'string', required: true },
|
|
lastActivityDate: { type: 'string', required: false },
|
|
convertedDate: { type: 'string', required: false },
|
|
convertedAccountId: { type: 'string', required: false },
|
|
convertedContactId: { type: 'string', required: false },
|
|
convertedOpportunityId: { type: 'string', required: false }
|
|
};
|
|
// Salesforce Sales Pipeline (Opportunity) Schema
|
|
const opportunitySchema = {
|
|
opportunityId: { type: 'string', required: true },
|
|
opportunityName: { type: 'string', required: true },
|
|
accountId: { type: 'string', required: true },
|
|
accountName: { type: 'string', required: true },
|
|
type: { type: 'string', required: true },
|
|
stage: { type: 'string', required: true },
|
|
amount: { type: 'number', required: true },
|
|
probability: { type: 'number', required: true },
|
|
expectedRevenue: { type: 'number', required: true },
|
|
closeDate: { type: 'string', required: true },
|
|
nextStep: { type: 'string', required: false },
|
|
leadSource: { type: 'string', required: true },
|
|
campaignId: { type: 'string', required: false },
|
|
ownerId: { type: 'string', required: true },
|
|
ownerName: { type: 'string', required: true },
|
|
createdDate: { type: 'string', required: true },
|
|
lastModifiedDate: { type: 'string', required: true },
|
|
products: { type: 'array', required: true, items: {
|
|
productId: { type: 'string' },
|
|
productName: { type: 'string' },
|
|
quantity: { type: 'number' },
|
|
listPrice: { type: 'number' },
|
|
salesPrice: { type: 'number' },
|
|
discount: { type: 'number' },
|
|
totalPrice: { type: 'number' }
|
|
} },
|
|
competitors: { type: 'array', required: false },
|
|
description: { type: 'string', required: false },
|
|
isClosed: { type: 'boolean', required: true },
|
|
isWon: { type: 'boolean', required: false },
|
|
lostReason: { type: 'string', required: false },
|
|
forecastCategory: { type: 'string', required: true }
|
|
};
|
|
// HubSpot Contact Interaction Schema
|
|
const contactInteractionSchema = {
|
|
interactionId: { type: 'string', required: true },
|
|
contactId: { type: 'string', required: true },
|
|
contactEmail: { type: 'string', required: true },
|
|
interactionType: { type: 'string', required: true },
|
|
timestamp: { type: 'string', required: true },
|
|
channel: { type: 'string', required: true },
|
|
subject: { type: 'string', required: false },
|
|
body: { type: 'string', required: false },
|
|
duration: { type: 'number', required: false },
|
|
outcome: { type: 'string', required: false },
|
|
sentiment: { type: 'string', required: false },
|
|
engagement: { type: 'object', required: true, properties: {
|
|
opened: { type: 'boolean' },
|
|
clicked: { type: 'boolean' },
|
|
replied: { type: 'boolean' },
|
|
bounced: { type: 'boolean' },
|
|
unsubscribed: { type: 'boolean' }
|
|
} },
|
|
associatedDealId: { type: 'string', required: false },
|
|
associatedTicketId: { type: 'string', required: false },
|
|
ownerId: { type: 'string', required: true },
|
|
properties: { type: 'object', required: false }
|
|
};
|
|
// Microsoft Dynamics 365 Account Management Schema
|
|
const accountSchema = {
|
|
accountId: { type: 'string', required: true },
|
|
accountName: { type: 'string', required: true },
|
|
accountNumber: { type: 'string', required: true },
|
|
parentAccountId: { type: 'string', required: false },
|
|
accountType: { type: 'string', required: true },
|
|
industry: { type: 'string', required: true },
|
|
subIndustry: { type: 'string', required: false },
|
|
annualRevenue: { type: 'number', required: true },
|
|
numberOfEmployees: { type: 'number', required: true },
|
|
ownership: { type: 'string', required: true },
|
|
website: { type: 'string', required: false },
|
|
phone: { type: 'string', required: true },
|
|
fax: { type: 'string', required: false },
|
|
billingAddress: { type: 'object', required: true, properties: {
|
|
street1: { type: 'string' },
|
|
street2: { type: 'string' },
|
|
city: { type: 'string' },
|
|
stateProvince: { type: 'string' },
|
|
postalCode: { type: 'string' },
|
|
country: { type: 'string' }
|
|
} },
|
|
shippingAddress: { type: 'object', required: true, properties: {
|
|
street1: { type: 'string' },
|
|
street2: { type: 'string' },
|
|
city: { type: 'string' },
|
|
stateProvince: { type: 'string' },
|
|
postalCode: { type: 'string' },
|
|
country: { type: 'string' }
|
|
} },
|
|
primaryContact: { type: 'object', required: true, properties: {
|
|
contactId: { type: 'string' },
|
|
fullName: { type: 'string' },
|
|
title: { type: 'string' },
|
|
email: { type: 'string' },
|
|
phone: { type: 'string' }
|
|
} },
|
|
accountRating: { type: 'string', required: true },
|
|
creditLimit: { type: 'number', required: false },
|
|
paymentTerms: { type: 'string', required: true },
|
|
preferredContactMethod: { type: 'string', required: true },
|
|
ownerId: { type: 'string', required: true },
|
|
ownerName: { type: 'string', required: true },
|
|
teamId: { type: 'string', required: false },
|
|
territory: { type: 'string', required: true },
|
|
createdOn: { type: 'string', required: true },
|
|
modifiedOn: { type: 'string', required: true },
|
|
lastInteractionDate: { type: 'string', required: false },
|
|
description: { type: 'string', required: false }
|
|
};
|
|
// Salesforce Service Cloud Support Ticket Schema
|
|
const supportTicketSchema = {
|
|
caseId: { type: 'string', required: true },
|
|
caseNumber: { type: 'string', required: true },
|
|
subject: { type: 'string', required: true },
|
|
description: { type: 'string', required: true },
|
|
status: { type: 'string', required: true },
|
|
priority: { type: 'string', required: true },
|
|
severity: { type: 'string', required: true },
|
|
type: { type: 'string', required: true },
|
|
origin: { type: 'string', required: true },
|
|
reason: { type: 'string', required: false },
|
|
contactId: { type: 'string', required: true },
|
|
contactName: { type: 'string', required: true },
|
|
contactEmail: { type: 'string', required: true },
|
|
contactPhone: { type: 'string', required: false },
|
|
accountId: { type: 'string', required: true },
|
|
accountName: { type: 'string', required: true },
|
|
productId: { type: 'string', required: false },
|
|
productName: { type: 'string', required: false },
|
|
ownerId: { type: 'string', required: true },
|
|
ownerName: { type: 'string', required: true },
|
|
createdDate: { type: 'string', required: true },
|
|
closedDate: { type: 'string', required: false },
|
|
firstResponseDate: { type: 'string', required: false },
|
|
firstResponseSLA: { type: 'number', required: true },
|
|
resolutionSLA: { type: 'number', required: true },
|
|
escalated: { type: 'boolean', required: true },
|
|
escalationDate: { type: 'string', required: false },
|
|
resolution: { type: 'string', required: false },
|
|
comments: { type: 'array', required: false, items: {
|
|
commentId: { type: 'string' },
|
|
author: { type: 'string' },
|
|
timestamp: { type: 'string' },
|
|
text: { type: 'string' },
|
|
isPublic: { type: 'boolean' }
|
|
} },
|
|
satisfaction: { type: 'object', required: false, properties: {
|
|
score: { type: 'number' },
|
|
feedback: { type: 'string' },
|
|
surveyDate: { type: 'string' }
|
|
} }
|
|
};
|
|
// Customer Lifetime Value Schema
|
|
const customerLifetimeValueSchema = {
|
|
customerId: { type: 'string', required: true },
|
|
customerName: { type: 'string', required: true },
|
|
segment: { type: 'string', required: true },
|
|
acquisitionDate: { type: 'string', required: true },
|
|
acquisitionChannel: { type: 'string', required: true },
|
|
acquisitionCost: { type: 'number', required: true },
|
|
metrics: { type: 'object', required: true, properties: {
|
|
totalRevenue: { type: 'number' },
|
|
totalOrders: { type: 'number' },
|
|
averageOrderValue: { type: 'number' },
|
|
totalProfit: { type: 'number' },
|
|
profitMargin: { type: 'number' },
|
|
retentionRate: { type: 'number' },
|
|
churnProbability: { type: 'number' }
|
|
} },
|
|
ltv: { type: 'object', required: true, properties: {
|
|
currentLTV: { type: 'number' },
|
|
predictedLTV: { type: 'number' },
|
|
ltvCACRatio: { type: 'number' },
|
|
paybackPeriod: { type: 'number' },
|
|
timeHorizon: { type: 'string' }
|
|
} },
|
|
engagement: { type: 'object', required: true, properties: {
|
|
lastPurchaseDate: { type: 'string' },
|
|
daysSinceLastPurchase: { type: 'number' },
|
|
averageDaysBetweenPurchases: { type: 'number' },
|
|
emailOpenRate: { type: 'number' },
|
|
emailClickRate: { type: 'number' },
|
|
websiteVisits: { type: 'number' },
|
|
supportTickets: { type: 'number' },
|
|
npsScore: { type: 'number' }
|
|
} },
|
|
crossSell: { type: 'array', required: false, items: {
|
|
productCategory: { type: 'string' },
|
|
probability: { type: 'number' },
|
|
potentialRevenue: { type: 'number' }
|
|
} },
|
|
churnRisk: { type: 'object', required: true, properties: {
|
|
score: { type: 'number' },
|
|
factors: { type: 'array' },
|
|
mitigationActions: { type: 'array' }
|
|
} }
|
|
};
|
|
/**
|
|
* Generate Salesforce Leads
|
|
*/
|
|
async function generateLeads(count = 100) {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini',
|
|
apiKey: process.env.GEMINI_API_KEY
|
|
});
|
|
console.log(`Generating ${count} Salesforce leads...`);
|
|
const result = await synth.generateStructured({
|
|
count,
|
|
schema: leadSchema,
|
|
format: 'json'
|
|
});
|
|
console.log(`Generated ${result.data.length} leads in ${result.metadata.duration}ms`);
|
|
console.log('Sample lead:', result.data[0]);
|
|
return result;
|
|
}
|
|
/**
|
|
* Generate Sales Pipeline (Opportunities)
|
|
*/
|
|
async function generateOpportunities(count = 75) {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini'
|
|
});
|
|
console.log(`Generating ${count} sales opportunities...`);
|
|
const result = await synth.generateStructured({
|
|
count,
|
|
schema: opportunitySchema,
|
|
format: 'json'
|
|
});
|
|
console.log(`Generated ${result.data.length} opportunities in ${result.metadata.duration}ms`);
|
|
console.log('Sample opportunity:', result.data[0]);
|
|
return result;
|
|
}
|
|
/**
|
|
* Generate HubSpot Contact Interactions (time-series)
|
|
*/
|
|
async function generateContactInteractions(count = 500) {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini'
|
|
});
|
|
console.log(`Generating ${count} contact interactions...`);
|
|
const result = await synth.generateEvents({
|
|
count,
|
|
eventTypes: ['email', 'call', 'meeting', 'chat', 'website_visit', 'form_submission', 'social_media'],
|
|
distribution: 'poisson',
|
|
timeRange: {
|
|
start: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000), // 90 days ago
|
|
end: new Date()
|
|
}
|
|
});
|
|
console.log(`Generated ${result.data.length} interactions in ${result.metadata.duration}ms`);
|
|
console.log('Sample interaction:', result.data[0]);
|
|
return result;
|
|
}
|
|
/**
|
|
* Generate Microsoft Dynamics 365 Accounts
|
|
*/
|
|
async function generateAccounts(count = 50) {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini'
|
|
});
|
|
console.log(`Generating ${count} CRM accounts...`);
|
|
const result = await synth.generateStructured({
|
|
count,
|
|
schema: accountSchema,
|
|
format: 'json'
|
|
});
|
|
console.log(`Generated ${result.data.length} accounts in ${result.metadata.duration}ms`);
|
|
console.log('Sample account:', result.data[0]);
|
|
return result;
|
|
}
|
|
/**
|
|
* Generate Salesforce Service Cloud Support Tickets
|
|
*/
|
|
async function generateSupportTickets(count = 200) {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini'
|
|
});
|
|
console.log(`Generating ${count} support tickets...`);
|
|
const result = await synth.generateStructured({
|
|
count,
|
|
schema: supportTicketSchema,
|
|
format: 'json'
|
|
});
|
|
console.log(`Generated ${result.data.length} tickets in ${result.metadata.duration}ms`);
|
|
console.log('Sample ticket:', result.data[0]);
|
|
return result;
|
|
}
|
|
/**
|
|
* Generate Customer Lifetime Value Analysis
|
|
*/
|
|
async function generateCustomerLTV(count = 100) {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini'
|
|
});
|
|
console.log(`Generating ${count} customer LTV records...`);
|
|
const result = await synth.generateStructured({
|
|
count,
|
|
schema: customerLifetimeValueSchema,
|
|
format: 'json'
|
|
});
|
|
console.log(`Generated ${result.data.length} LTV records in ${result.metadata.duration}ms`);
|
|
console.log('Sample LTV:', result.data[0]);
|
|
return result;
|
|
}
|
|
/**
|
|
* Simulate complete sales funnel with conversion metrics
|
|
*/
|
|
async function simulateSalesFunnel() {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini',
|
|
cacheStrategy: 'memory'
|
|
});
|
|
console.log('Simulating complete sales funnel...');
|
|
console.time('Sales funnel simulation');
|
|
// Generate funnel stages in sequence to maintain conversion logic
|
|
const leads = await generateLeads(1000);
|
|
const qualifiedLeadCount = Math.floor(leads.data.length * 0.4); // 40% qualification rate
|
|
const opportunities = await generateOpportunities(qualifiedLeadCount);
|
|
const wonOpportunityCount = Math.floor(opportunities.data.length * 0.25); // 25% win rate
|
|
const accounts = await generateAccounts(wonOpportunityCount);
|
|
console.timeEnd('Sales funnel simulation');
|
|
const metrics = {
|
|
leads: leads.data.length,
|
|
qualifiedLeads: qualifiedLeadCount,
|
|
opportunities: opportunities.data.length,
|
|
wonDeals: wonOpportunityCount,
|
|
accounts: accounts.data.length,
|
|
conversionRates: {
|
|
leadToQualified: (qualifiedLeadCount / leads.data.length * 100).toFixed(2) + '%',
|
|
qualifiedToOpportunity: '100%', // By design
|
|
opportunityToWon: (wonOpportunityCount / opportunities.data.length * 100).toFixed(2) + '%',
|
|
leadToCustomer: (accounts.data.length / leads.data.length * 100).toFixed(2) + '%'
|
|
},
|
|
totalPipelineValue: opportunities.data.reduce((sum, opp) => sum + (opp.amount || 0), 0),
|
|
averageDealSize: opportunities.data.reduce((sum, opp) => sum + (opp.amount || 0), 0) / opportunities.data.length
|
|
};
|
|
console.log('Sales Funnel Metrics:', metrics);
|
|
return {
|
|
leads: leads.data,
|
|
opportunities: opportunities.data,
|
|
accounts: accounts.data,
|
|
metrics
|
|
};
|
|
}
|
|
/**
|
|
* Generate complete CRM dataset in parallel
|
|
*/
|
|
async function generateCompleteCRMDataset() {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini',
|
|
cacheStrategy: 'memory'
|
|
});
|
|
console.log('Generating complete CRM dataset in parallel...');
|
|
console.time('Total CRM generation');
|
|
const [leads, opportunities, interactions, accounts, tickets, ltv] = await Promise.all([
|
|
generateLeads(100),
|
|
generateOpportunities(50),
|
|
generateContactInteractions(300),
|
|
generateAccounts(30),
|
|
generateSupportTickets(100),
|
|
generateCustomerLTV(50)
|
|
]);
|
|
console.timeEnd('Total CRM generation');
|
|
return {
|
|
leads: leads.data,
|
|
opportunities: opportunities.data,
|
|
interactions: interactions.data,
|
|
accounts: accounts.data,
|
|
supportTickets: tickets.data,
|
|
customerLTV: ltv.data,
|
|
metadata: {
|
|
totalRecords: leads.data.length + opportunities.data.length +
|
|
interactions.data.length + accounts.data.length +
|
|
tickets.data.length + ltv.data.length,
|
|
generatedAt: new Date().toISOString()
|
|
}
|
|
};
|
|
}
|
|
/**
|
|
* Stream CRM interactions for real-time analysis
|
|
*/
|
|
async function streamCRMInteractions(duration = 3600) {
|
|
const synth = (0, index_js_1.createSynth)({
|
|
provider: 'gemini',
|
|
streaming: true
|
|
});
|
|
console.log(`Streaming CRM interactions for ${duration} seconds...`);
|
|
const endTime = Date.now() + (duration * 1000);
|
|
let interactionCount = 0;
|
|
while (Date.now() < endTime) {
|
|
for await (const interaction of synth.generateStream('events', {
|
|
count: 10,
|
|
eventTypes: ['email', 'call', 'meeting', 'chat'],
|
|
distribution: 'poisson'
|
|
})) {
|
|
interactionCount++;
|
|
console.log(`[${new Date().toISOString()}] Interaction ${interactionCount}:`, interaction);
|
|
// Simulate real-time processing delay
|
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
}
|
|
}
|
|
console.log(`Completed streaming ${interactionCount} interactions`);
|
|
}
|
|
// Example usage
|
|
async function runCRMExamples() {
|
|
console.log('=== CRM Data Generation Examples ===\n');
|
|
// Example 1: Lead Generation
|
|
console.log('1. Lead Generation (Salesforce)');
|
|
await generateLeads(10);
|
|
// Example 2: Sales Pipeline
|
|
console.log('\n2. Sales Pipeline (Opportunities)');
|
|
await generateOpportunities(10);
|
|
// Example 3: Contact Interactions
|
|
console.log('\n3. Contact Interactions (HubSpot)');
|
|
await generateContactInteractions(50);
|
|
// Example 4: Account Management
|
|
console.log('\n4. Account Management (Dynamics 365)');
|
|
await generateAccounts(5);
|
|
// Example 5: Support Tickets
|
|
console.log('\n5. Support Tickets (Service Cloud)');
|
|
await generateSupportTickets(20);
|
|
// Example 6: Customer LTV
|
|
console.log('\n6. Customer Lifetime Value');
|
|
await generateCustomerLTV(10);
|
|
// Example 7: Sales Funnel Simulation
|
|
console.log('\n7. Complete Sales Funnel Simulation');
|
|
await simulateSalesFunnel();
|
|
// Example 8: Complete CRM dataset
|
|
console.log('\n8. Complete CRM Dataset (Parallel)');
|
|
const completeDataset = await generateCompleteCRMDataset();
|
|
console.log('Total records generated:', completeDataset.metadata.totalRecords);
|
|
}
|
|
// Uncomment to run
|
|
// runCRMExamples().catch(console.error);
|
|
exports.default = {
|
|
generateLeads,
|
|
generateOpportunities,
|
|
generateContactInteractions,
|
|
generateAccounts,
|
|
generateSupportTickets,
|
|
generateCustomerLTV,
|
|
simulateSalesFunnel,
|
|
generateCompleteCRMDataset,
|
|
streamCRMInteractions
|
|
};
|
|
//# sourceMappingURL=crm-simulation.js.map
|