71 lines
2.5 KiB
TypeScript
71 lines
2.5 KiB
TypeScript
import { Injectable, Logger } from '@nestjs/common';
|
|
import { Cron, CronExpression } from '@nestjs/schedule';
|
|
import { PrismaService } from '../prisma/prisma.service';
|
|
import { WhatsappService } from '../whatsapp/whatsapp.service';
|
|
import { differenceInDays } from 'date-fns';
|
|
|
|
@Injectable()
|
|
export class AutomationService {
|
|
private readonly logger = new Logger(AutomationService.name);
|
|
|
|
constructor(
|
|
private prisma: PrismaService,
|
|
private whatsapp: WhatsappService,
|
|
) {}
|
|
|
|
@Cron(CronExpression.EVERY_DAY_AT_9AM)
|
|
async handleDailyAutomation() {
|
|
this.logger.log('Running Daily Follow-up Automation...');
|
|
|
|
await Promise.all([
|
|
this.processPhase1Nudges(),
|
|
this.processEscalations(),
|
|
]);
|
|
}
|
|
|
|
private async processPhase1Nudges() {
|
|
const leads = await this.prisma.client.findMany({
|
|
where: { status: 'LEAD' },
|
|
include: { user: true },
|
|
});
|
|
|
|
for (const lead of leads) {
|
|
const age = differenceInDays(new Date(), lead.createdAt);
|
|
|
|
let message = '';
|
|
if (age === 1) message = `Hi ${lead.name}, thanks for inquiring with Ignosi! Here is a quick intro to our services.`;
|
|
else if (age === 2) message = `Hi ${lead.name}, did you know that our CRM can increase your sales by 30%? Check this video.`;
|
|
else if (age === 3) message = `Hi ${lead.name}, here is what our customers say about us. [Testimonial Link]`;
|
|
else if (age === 5) message = `Still looking for a solution, ${lead.name}? We have a special offer for you today.`;
|
|
else if (age === 7) message = `Final follow-up, ${lead.name}. Would you like a free demo this week?`;
|
|
|
|
if (message && lead.phone) {
|
|
this.logger.log(`Triggering Day ${age} nudge for ${lead.name}`);
|
|
// await this.whatsapp.sendInternalMessage(lead.phone, message);
|
|
}
|
|
}
|
|
}
|
|
|
|
private async processEscalations() {
|
|
// Find opportunities where a demo has been scheduled but not yet done for 10+ days
|
|
const staleDemoOpps = await this.prisma.opportunity.findMany({
|
|
where: {
|
|
isDemoDone: false,
|
|
stage: { in: ['QUALIFIED', 'POTENTIAL'] },
|
|
updatedAt: { lte: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000) },
|
|
},
|
|
include: {
|
|
user: { include: { manager: true } },
|
|
client: true,
|
|
},
|
|
});
|
|
|
|
for (const opp of staleDemoOpps) {
|
|
if (opp.user?.manager?.email) {
|
|
this.logger.warn(`Escalating stale demo: ${opp.title} for user ${opp.user.name}`);
|
|
// Send alert to manager via Email/WhatsApp
|
|
}
|
|
}
|
|
}
|
|
}
|