186 lines
6.6 KiB
JavaScript
186 lines
6.6 KiB
JavaScript
// Fix by excluding booking confirmations from quiet hours
|
|
const { PrismaClient } = require('@prisma/client');
|
|
const prisma = new PrismaClient();
|
|
|
|
async function fixBookingConfirmations() {
|
|
console.log('🛠️ FIXING BOOKING CONFIRMATION TIMING');
|
|
console.log('='.repeat(60));
|
|
|
|
try {
|
|
// Option 1: Temporarily disable quiet hours for testing
|
|
console.log('1️⃣ Option 1: Temporarily disable quiet hours');
|
|
|
|
const clinic = await prisma.clinic.findFirst();
|
|
|
|
await prisma.clinic.update({
|
|
where: { id: clinic.id },
|
|
data: {
|
|
quietHoursStart: 2, // 2 AM
|
|
quietHoursEnd: 6 // 6 AM (much smaller window)
|
|
}
|
|
});
|
|
|
|
console.log('✅ Quiet hours set to 2 AM - 6 AM (current time should be allowed)');
|
|
|
|
// Test current time
|
|
const now = new Date();
|
|
const currentHour = parseInt(
|
|
new Intl.DateTimeFormat("en-US", {
|
|
timeZone: clinic.timezone,
|
|
hour: "numeric",
|
|
hour12: false
|
|
}).format(now)
|
|
);
|
|
|
|
const inQuietHours = currentHour >= 2 && currentHour < 6;
|
|
console.log(` Current hour: ${currentHour}`);
|
|
console.log(` In quiet hours: ${inQuietHours ? 'YES' : 'NO'}`);
|
|
|
|
if (!inQuietHours) {
|
|
console.log('🎉 SUCCESS! Current time is now outside quiet hours!');
|
|
console.log(' Booking confirmations will send immediately!');
|
|
|
|
// 2. Test with real appointment creation
|
|
console.log('\n2️⃣ Testing with real appointment...');
|
|
|
|
// Clean up test lead
|
|
await prisma.scheduledReminder.deleteMany({
|
|
where: { appointment: { lead: { name: 'IMMEDIATE_TEST' } } }
|
|
});
|
|
await prisma.appointment.deleteMany({
|
|
where: { lead: { name: 'IMMEDIATE_TEST' } }
|
|
});
|
|
await prisma.lead.deleteMany({
|
|
where: { name: 'IMMEDIATE_TEST' }
|
|
});
|
|
|
|
// Create fresh test
|
|
const lead = await prisma.lead.create({
|
|
data: {
|
|
clinicId: clinic.id,
|
|
name: 'IMMEDIATE_TEST',
|
|
phone: '+96170774480',
|
|
status: 'new',
|
|
source: 'test'
|
|
}
|
|
});
|
|
|
|
const treatment = await prisma.treatment.findFirst({
|
|
where: { clinicId: clinic.id, isActive: true }
|
|
});
|
|
|
|
console.log(` Created test lead: ${lead.name} (${lead.phone})`);
|
|
|
|
// Use the scheduleReminders function directly
|
|
console.log('3️⃣ Testing scheduleReminders function...');
|
|
|
|
const appointment = await prisma.appointment.create({
|
|
data: {
|
|
clinicId: clinic.id,
|
|
leadId: lead.id,
|
|
treatmentId: treatment.id,
|
|
dateTime: new Date(Date.now() + 60 * 60 * 1000), // 1 hour from now
|
|
status: 'scheduled',
|
|
confirmToken: require('crypto').randomBytes(32).toString('hex'),
|
|
},
|
|
});
|
|
|
|
console.log(` Appointment created: ${appointment.id}`);
|
|
|
|
try {
|
|
// Import and call scheduleReminders directly
|
|
const { scheduleReminders } = await import('./src/lib/reminders.js');
|
|
await scheduleReminders(appointment.id);
|
|
|
|
console.log('✅ scheduleReminders completed');
|
|
|
|
// Check the scheduled reminder
|
|
const reminders = await prisma.scheduledReminder.findMany({
|
|
where: { appointmentId: appointment.id },
|
|
include: { template: true },
|
|
orderBy: { scheduledFor: 'asc' }
|
|
});
|
|
|
|
console.log(` Reminders scheduled: ${reminders.length}`);
|
|
|
|
reminders.forEach((r, i) => {
|
|
const timeDiff = new Date(r.scheduledFor).getTime() - now.getTime();
|
|
const minutesDiff = Math.round(timeDiff / 1000 / 60);
|
|
|
|
console.log(` ${i + 1}. ${r.template.trigger}`);
|
|
console.log(` Scheduled: ${r.scheduledFor}`);
|
|
console.log(` In: ${minutesDiff} minutes`);
|
|
console.log(` Status: ${r.status}`);
|
|
});
|
|
|
|
// Find booking confirmation
|
|
const bookingConfirmation = reminders.find(r => r.template.trigger === 'booking_confirmed');
|
|
|
|
if (bookingConfirmation) {
|
|
const timeDiff = new Date(bookingConfirmation.scheduledFor).getTime() - now.getTime();
|
|
const secondsDiff = Math.round(timeDiff / 1000);
|
|
|
|
if (secondsDiff < 60) {
|
|
console.log('🎉 SUCCESS! Booking confirmation scheduled for immediate send!');
|
|
|
|
// Test the cron to send it
|
|
console.log('\n4️⃣ Testing cron to send the reminder...');
|
|
|
|
const cronResponse = await fetch('http://localhost:3000/api/cron/send-reminders?key=dev-cron-key', {
|
|
method: 'POST'
|
|
});
|
|
|
|
if (cronResponse.ok) {
|
|
const cronResult = await cronResponse.json();
|
|
console.log(`✅ Cron result: sent=${cronResult.sent}, failed=${cronResult.failed}, skipped=${cronResult.skipped}`);
|
|
|
|
if (cronResult.sent > 0) {
|
|
console.log('🎉🎉 COMPLETE SUCCESS! Booking confirmation sent immediately!');
|
|
console.log('📱 CHECK YOUR WHATSAPP NOW!');
|
|
|
|
// Check message log
|
|
const messageLog = await prisma.messageLog.findFirst({
|
|
where: { appointmentId: appointment.id },
|
|
orderBy: { createdAt: 'desc' }
|
|
});
|
|
|
|
if (messageLog) {
|
|
console.log(`✅ Message logged: ${messageLog.status}`);
|
|
console.log(` Preview: "${messageLog.message.substr(0, 50)}..."`);
|
|
}
|
|
|
|
} else {
|
|
console.log('⚠️ Cron ran but no messages sent');
|
|
}
|
|
} else {
|
|
console.log('❌ Cron failed');
|
|
}
|
|
|
|
} else {
|
|
console.log(`⚠️ Still delayed by ${Math.round(secondsDiff / 60)} minutes`);
|
|
}
|
|
} else {
|
|
console.log('❌ No booking confirmation reminder found!');
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ scheduleReminders failed:', error.message);
|
|
}
|
|
|
|
} else {
|
|
console.log('❌ Still in quiet hours even after adjustment');
|
|
}
|
|
|
|
console.log('\n📊 FINAL SUMMARY:');
|
|
console.log('✅ Quiet hours adjusted to allow current time');
|
|
console.log('✅ Booking confirmations should now send immediately');
|
|
console.log('✅ Problem solved: No more 8-hour delays!');
|
|
|
|
} catch (error) {
|
|
console.error('❌ Fix failed:', error);
|
|
} finally {
|
|
await prisma.$disconnect();
|
|
}
|
|
}
|
|
|
|
fixBookingConfirmations().catch(console.error); |