Files
Atlas/cron-email-sync.ts
Julia Wehden a2c95c70e7 feat: Equipment-System, Buchungsbearbeitung, Kundenadresse, LexOffice-Fix
- Vintage Modell hinzugefuegt
- Equipment Multi-Select (Neue Buchung + Bearbeitung)
- Kundenadresse in Formularen
- Bearbeiten-Seite fuer Buchungen
- Abbau-Zeiten in Formularen und Uebersicht
- Vertrag PDF nur bei Privatkunden
- LexOffice Kontakt-Erstellung Fix (BUSINESS)
- Zurueck-Pfeil auf Touren-Seite
2026-03-19 16:21:55 +01:00

82 lines
2.5 KiB
TypeScript

import cron from 'node-cron';
import { emailSyncService } from '../lib/email-sync';
import { prisma } from '../lib/prisma';
console.log('🚀 E-Mail-Sync Cron-Job gestartet...\n');
// Sync alle 5 Minuten
cron.schedule('*/5 * * * *', async () => {
console.log(`\n⏰ [${new Date().toLocaleString('de-DE')}] Starte E-Mail-Sync...`);
try {
const locations = await prisma.location.findMany({
where: { emailSyncEnabled: true },
select: { id: true, name: true, slug: true },
});
if (locations.length === 0) {
console.log('⚠️ Keine Locations mit aktiviertem E-Mail-Sync gefunden.');
return;
}
console.log(`📍 Sync für ${locations.length} Location(s)...\n`);
let totalNewEmails = 0;
let totalNewBookings = 0;
for (const location of locations) {
console.log(`🔄 ${location.name} (${location.slug})...`);
const result = await emailSyncService.syncLocationEmails(location.id);
if (result.success) {
console.log(`${result.newEmails} neue E-Mails, ${result.newBookings} neue Buchungen`);
totalNewEmails += result.newEmails;
totalNewBookings += result.newBookings;
} else {
console.log(` ❌ Fehler: ${result.errors.join(', ')}`);
}
}
console.log(`\n📊 Gesamt: ${totalNewEmails} E-Mails, ${totalNewBookings} Buchungen`);
console.log('─'.repeat(60));
} catch (error: any) {
console.error('❌ Cron-Job Fehler:', error.message);
}
});
console.log('✅ Cron-Job läuft - E-Mails werden alle 5 Minuten abgerufen');
console.log(' Drücken Sie CTRL+C zum Beenden\n');
// Sofort einmal ausführen beim Start
(async () => {
console.log('🔄 Initialer E-Mail-Sync beim Start...\n');
try {
const locations = await prisma.location.findMany({
where: { emailSyncEnabled: true },
select: { id: true, name: true },
});
for (const location of locations) {
console.log(`📍 ${location.name}...`);
const result = await emailSyncService.syncLocationEmails(location.id);
if (result.success) {
console.log(`${result.newEmails} E-Mails, ${result.newBookings} Buchungen\n`);
} else {
console.log(`${result.errors.join(', ')}\n`);
}
}
} catch (error: any) {
console.error('❌ Initialer Sync Fehler:', error.message);
}
})();
// Graceful shutdown
process.on('SIGINT', async () => {
console.log('\n\n👋 Beende E-Mail-Sync Cron-Job...');
await prisma.$disconnect();
process.exit(0);
});