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
This commit is contained in:
81
cron-email-sync.ts
Normal file
81
cron-email-sync.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user