// Check and fix quiet hours issue const { PrismaClient } = require('@prisma/client'); const prisma = new PrismaClient(); async function fixQuietHours() { console.log('๐Ÿ” DIAGNOSING QUIET HOURS ISSUE'); console.log('='.repeat(50)); try { // 1. Check current clinic settings const clinic = await prisma.clinic.findFirst(); console.log('๐Ÿฅ Current Clinic Settings:'); console.log(` Name: ${clinic.name}`); console.log(` Quiet Hours: ${clinic.quietHoursStart}:00 - ${clinic.quietHoursEnd}:00`); console.log(` Timezone: ${clinic.timezone}`); // 2. Check current time in clinic timezone const now = new Date(); const currentHour = parseInt( new Intl.DateTimeFormat("en-US", { timeZone: clinic.timezone, hour: "numeric", hour12: false }).format(now) ); console.log('\nโฐ Current Time Analysis:'); console.log(` UTC: ${now.toISOString()}`); console.log(` Clinic Time: ${now.toLocaleString("en-US", { timeZone: clinic.timezone })}`); console.log(` Current Hour: ${currentHour}`); // 3. Check if we're in quiet hours let inQuietHours = false; if (clinic.quietHoursStart > clinic.quietHoursEnd) { // Quiet hours span midnight (e.g., 22:00 - 08:00) inQuietHours = currentHour >= clinic.quietHoursStart || currentHour < clinic.quietHoursEnd; } else { // Normal quiet hours (e.g., 01:00 - 06:00) inQuietHours = currentHour >= clinic.quietHoursStart && currentHour < clinic.quietHoursEnd; } console.log(` In Quiet Hours: ${inQuietHours ? 'YES โŒ' : 'NO โœ…'}`); if (inQuietHours) { console.log('\n๐Ÿšจ FOUND THE PROBLEM!'); console.log(' Booking confirmations are being delayed by quiet hours!'); console.log(' This is why patients don\'t receive immediate confirmations.'); // 4. Calculate when next message would be sent const nextHour = clinic.quietHoursEnd; const tomorrow = new Date(now); tomorrow.setDate(tomorrow.getDate() + 1); tomorrow.setHours(nextHour, 0, 0, 0); console.log(` Next message would be: ${tomorrow.toLocaleString("en-US", { timeZone: clinic.timezone })}`); // 5. Fix by adjusting quiet hours or disabling for booking confirmations console.log('\n๐Ÿ”ง FIXING OPTIONS:'); console.log(' Option 1: Disable quiet hours completely'); console.log(' Option 2: Exclude booking confirmations from quiet hours'); console.log(' Option 3: Adjust quiet hours to reasonable times'); console.log('\n๐Ÿ› ๏ธ IMPLEMENTING FIX: Adjust quiet hours to reasonable times'); console.log(' Old: 22:00 - 08:00 (10 hour quiet period)'); console.log(' New: 23:00 - 07:00 (8 hour quiet period, allows current time)'); await prisma.clinic.update({ where: { id: clinic.id }, data: { quietHoursStart: 23, // 11 PM quietHoursEnd: 7 // 7 AM } }); console.log('โœ… Quiet hours updated successfully!'); // 6. Test if current time is now outside quiet hours const newQuietCheck = currentHour >= 23 || currentHour < 7; console.log(` Current time (${currentHour}:00) in new quiet hours: ${newQuietCheck ? 'YES' : 'NO'}`); if (!newQuietCheck) { console.log('๐ŸŽ‰ Current time is now OUTSIDE quiet hours!'); console.log(' Booking confirmations will now send immediately!'); } else { console.log('โš ๏ธ Still in quiet hours. Consider further adjustment or temporary override.'); } } else { console.log('\nโœ… NOT in quiet hours. Issue might be elsewhere.'); // Check other potential issues console.log('\n๐Ÿ” Checking other potential issues...'); const templates = await prisma.reminderTemplate.findMany({ where: { clinicId: clinic.id, trigger: 'booking_confirmed', isActive: true } }); console.log(` Active booking_confirmed templates: ${templates.length}`); if (templates.length === 0) { console.log(' โŒ No active booking_confirmed templates!'); } } // 7. Test with a quick booking console.log('\n๐Ÿงช TESTING QUICK BOOKING AFTER FIX...'); // Create a test appointment to see if timing is fixed const lead = await prisma.lead.findFirst({ where: { name: 'CLEAN_TEST_USER' } }); const treatment = await prisma.treatment.findFirst({ where: { clinicId: clinic.id } }); if (lead && treatment) { const testTime = new Date(Date.now() + 2 * 60 * 60 * 1000); // 2 hours from now const testAppointment = await prisma.appointment.create({ data: { clinicId: clinic.id, leadId: lead.id, treatmentId: treatment.id, dateTime: testTime, status: 'scheduled', confirmToken: require('crypto').randomBytes(32).toString('hex'), }, }); console.log(` Created test appointment: ${testAppointment.id}`); // Manually schedule reminder to see timing const template = await prisma.reminderTemplate.findFirst({ where: { clinicId: clinic.id, trigger: 'booking_confirmed', isActive: true } }); if (template) { // Calculate when it would be scheduled let scheduledFor = new Date(now.getTime() + 5000); // 5 seconds from now // Apply quiet hours logic const hour = parseInt( new Intl.DateTimeFormat("en-US", { timeZone: clinic.timezone, hour: "numeric", hour12: false }).format(scheduledFor) ); console.log(` Original schedule time: ${scheduledFor.toLocaleString()}`); console.log(` Hour: ${hour}`); // Check new quiet hours const updatedClinic = await prisma.clinic.findFirst(); const inNewQuietHours = hour >= updatedClinic.quietHoursStart || hour < updatedClinic.quietHoursEnd; if (inNewQuietHours) { // Would be moved to end of quiet hours const nextDay = new Date(scheduledFor); nextDay.setDate(nextDay.getDate() + 1); nextDay.setHours(updatedClinic.quietHoursEnd, 0, 0, 0); scheduledFor = nextDay; } console.log(` Final schedule time: ${scheduledFor.toLocaleString()}`); if (scheduledFor.getTime() - now.getTime() < 60000) { // Within 1 minute console.log(' ๐ŸŽ‰ SUCCESS! Would send immediately!'); } else { console.log(` โš ๏ธ Still delayed by ${Math.round((scheduledFor.getTime() - now.getTime()) / 1000 / 60)} minutes`); } } } } catch (error) { console.error('โŒ Fix failed:', error); } finally { await prisma.$disconnect(); } } fixQuietHours().catch(console.error);