igcrmapi/src/automation/automation.service.ts

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
}
}
}
}