igcrmapi/scratch/sync-leads.js

74 lines
2.0 KiB
JavaScript

const { PrismaClient } = require('@prisma/client');
const { v4: uuidv4 } = require('uuid');
const prisma = new PrismaClient();
async function syncLeadsToPipeline() {
console.log('--- Syncing Quality/Potential Clients to Pipeline ---');
// Find clients with statuses that should be in the pipeline
const clients = await prisma.client.findMany({
where: {
status: { in: ['QUALITY', 'POTENTIAL', 'DEMO', 'SALES', 'CLOSED'] }
},
include: {
opportunities: true
}
});
console.log(`Found ${clients.length} clients with relevant status.`);
const stageMap = {
'QUALITY': 'QUALIFIED',
'POTENTIAL': 'POTENTIAL',
'DEMO': 'DEMO',
'SALES': 'WON',
'CLOSED': 'WON'
};
let createdCount = 0;
let updatedCount = 0;
for (const client of clients) {
const targetStage = stageMap[client.status];
if (!targetStage) continue;
// Check if they already have an active opportunity
const activeOpp = client.opportunities.find(o => !['WON', 'LOST'].includes(o.stage));
if (activeOpp) {
if (activeOpp.stage !== targetStage) {
await prisma.opportunity.update({
where: { id: activeOpp.id },
data: { stage: targetStage }
});
updatedCount++;
}
} else {
// Check if they have a WON opportunity if status is SALES/CLOSED
const wonOpp = client.opportunities.find(o => o.stage === 'WON');
if (wonOpp) continue;
// Create new opportunity
await prisma.opportunity.create({
data: {
id: uuidv4(),
title: `${client.name} - ${client.status}`,
value: 0,
clientId: client.id,
assignedTo: client.assignedTo || '805c8cf3-db7c-47c3-b42e-588531ba89a1', // Default to Admin if no owner
stage: targetStage,
updatedAt: new Date()
}
});
createdCount++;
}
}
console.log(`Finished: Created ${createdCount} and updated ${updatedCount} opportunities.`);
}
syncLeadsToPipeline()
.catch(e => console.error(e))
.finally(() => prisma.$disconnect());