port-nimara-client-portal/server/tasks/eoi-reminders.ts

110 lines
3.3 KiB
TypeScript
Raw Normal View History

import { getInterests } from '~/server/utils/nocodb';
import { checkDocumentSignatureStatus } from '~/server/utils/documeso';
// Track if tasks are already scheduled
let tasksScheduled = false;
2025-06-10 14:05:09 +02:00
export async function scheduleEOIReminders() {
if (tasksScheduled) {
console.log('[EOI Reminders] Tasks already scheduled');
return;
}
console.log('[EOI Reminders] Scheduling reminder tasks...');
2025-06-10 14:05:09 +02:00
// Dynamic import for node-cron to avoid ESM issues
const cron = await import('node-cron');
// Schedule for 9am daily
cron.schedule('0 9 * * *', async () => {
console.log('[EOI Reminders] Running 9am reminder check...');
await processReminders();
}, {
timezone: 'Europe/Paris'
});
// Schedule for 4pm daily
cron.schedule('0 16 * * *', async () => {
console.log('[EOI Reminders] Running 4pm reminder check...');
await processReminders();
}, {
timezone: 'Europe/Paris'
});
tasksScheduled = true;
console.log('[EOI Reminders] Tasks scheduled successfully');
}
async function processReminders() {
try {
// Get all interests
const response = await getInterests();
const interests = response.list || [];
console.log(`[EOI Reminders] Processing ${interests.length} interests...`);
for (const interest of interests) {
try {
// Skip if no document ID or reminders disabled
const documentId = (interest as any)['documeso_document_id'];
const remindersEnabled = (interest as any)['reminder_enabled'] !== false;
if (!documentId || !remindersEnabled) {
continue;
}
// Check if we should send reminder (not sent in last 12 hours)
const lastReminderSent = (interest as any)['last_reminder_sent'];
if (lastReminderSent) {
const lastSentTime = new Date(lastReminderSent).getTime();
const twelveHoursAgo = Date.now() - (12 * 60 * 60 * 1000);
if (lastSentTime > twelveHoursAgo) {
continue; // Skip if reminder sent within last 12 hours
}
}
// Send reminder
await sendReminder(interest);
} catch (error) {
console.error(`[EOI Reminders] Error processing interest ${interest.Id}:`, error);
}
}
console.log('[EOI Reminders] Reminder processing completed');
} catch (error) {
console.error('[EOI Reminders] Error in processReminders:', error);
}
}
async function sendReminder(interest: any) {
try {
const response = await $fetch<{
success: boolean;
remindersSent: number;
results: any[];
message?: string;
}>('/api/eoi/send-reminders', {
method: 'POST',
headers: {
'x-tag': '094ut234' // System tag for automated processes
},
body: {
interestId: interest.Id.toString(),
documentId: (interest as any)['documeso_document_id']
}
});
if (response.success) {
console.log(`[EOI Reminders] Sent ${response.remindersSent} reminders for interest ${interest.Id}`);
}
} catch (error) {
console.error(`[EOI Reminders] Failed to send reminder for interest ${interest.Id}:`, error);
}
}
// Export function to manually trigger reminders (for testing)
export async function triggerReminders() {
console.log('[EOI Reminders] Manually triggering reminder check...');
await processReminders();
}