const sqlite3 = require('sqlite3').verbose(); const bcrypt = require('bcryptjs'); const path = require('path'); const fs = require('fs'); const dbPath = path.join(__dirname, 'stundenerfassung.db'); console.log('🔄 Setze Datenbank zurück...\n'); // Datenbank schließen falls offen let db = null; try { // Prüfe ob Datenbank existiert if (fs.existsSync(dbPath)) { console.log('📁 Datenbankdatei gefunden, lösche sie...'); fs.unlinkSync(dbPath); console.log('✅ Datenbankdatei gelöscht\n'); } else { console.log('ℹ️ Datenbankdatei existiert nicht, erstelle neue...\n'); } // Neue Datenbank erstellen db = new sqlite3.Database(dbPath); db.serialize(() => { console.log('📊 Erstelle Tabellen...\n'); // Benutzer-Tabelle db.run(`CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL, firstname TEXT NOT NULL, lastname TEXT NOT NULL, role TEXT NOT NULL DEFAULT 'mitarbeiter', last_week_start TEXT, personalnummer TEXT, wochenstunden REAL, urlaubstage REAL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP )`, (err) => { if (err) console.error('Fehler bei users:', err); else console.log('✅ Tabelle users erstellt'); }); // Stundenerfassung-Tabelle db.run(`CREATE TABLE timesheet_entries ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, date TEXT NOT NULL, start_time TEXT, end_time TEXT, break_minutes INTEGER DEFAULT 0, total_hours REAL, notes TEXT, activity1_desc TEXT, activity1_hours REAL, activity1_project_number TEXT, activity2_desc TEXT, activity2_hours REAL, activity2_project_number TEXT, activity3_desc TEXT, activity3_hours REAL, activity3_project_number TEXT, activity4_desc TEXT, activity4_hours REAL, activity4_project_number TEXT, activity5_desc TEXT, activity5_hours REAL, activity5_project_number TEXT, overtime_taken_hours REAL, vacation_type TEXT, status TEXT DEFAULT 'offen', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) )`, (err) => { if (err) console.error('Fehler bei timesheet_entries:', err); else console.log('✅ Tabelle timesheet_entries erstellt'); }); // Wöchentliche Stundenzettel-Tabelle db.run(`CREATE TABLE weekly_timesheets ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, week_start TEXT NOT NULL, week_end TEXT NOT NULL, version INTEGER DEFAULT 1, status TEXT DEFAULT 'eingereicht', submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP, reviewed_by INTEGER, reviewed_at DATETIME, pdf_downloaded_at DATETIME, pdf_downloaded_by INTEGER, version_reason TEXT, admin_comment TEXT, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (reviewed_by) REFERENCES users(id), FOREIGN KEY (pdf_downloaded_by) REFERENCES users(id) )`, (err) => { if (err) console.error('Fehler bei weekly_timesheets:', err); else console.log('✅ Tabelle weekly_timesheets erstellt'); }); // LDAP-Konfiguration-Tabelle db.run(`CREATE TABLE ldap_config ( id INTEGER PRIMARY KEY AUTOINCREMENT, enabled INTEGER DEFAULT 0, url TEXT, bind_dn TEXT, bind_password TEXT, base_dn TEXT, user_search_filter TEXT, username_attribute TEXT DEFAULT 'cn', firstname_attribute TEXT DEFAULT 'givenName', lastname_attribute TEXT DEFAULT 'sn', sync_interval INTEGER DEFAULT 0, last_sync DATETIME, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP )`, (err) => { if (err) console.error('Fehler bei ldap_config:', err); else console.log('✅ Tabelle ldap_config erstellt'); }); // LDAP-Sync-Log-Tabelle db.run(`CREATE TABLE ldap_sync_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, sync_type TEXT NOT NULL, status TEXT NOT NULL, users_synced INTEGER DEFAULT 0, error_message TEXT, sync_started_at DATETIME DEFAULT CURRENT_TIMESTAMP, sync_completed_at DATETIME )`, (err) => { if (err) console.error('Fehler bei ldap_sync_log:', err); else console.log('✅ Tabelle ldap_sync_log erstellt'); }); // Warte bis alle Tabellen erstellt sind db.run('SELECT 1', (err) => { if (err) { console.error('Fehler beim Warten:', err); return; } console.log('\n👤 Erstelle Standard-Benutzer...\n'); // Standard Admin-Benutzer const adminPassword = bcrypt.hashSync('admin123', 10); db.run(`INSERT INTO users (id, username, password, firstname, lastname, role) VALUES (1, 'admin', ?, 'System', 'Administrator', 'admin')`, [adminPassword], (err) => { if (err) console.error('Fehler beim Erstellen des Admin-Users:', err); else console.log('✅ Admin-User erstellt (admin / admin123)'); }); // Standard Verwaltungs-Benutzer const verwaltungPassword = bcrypt.hashSync('verwaltung123', 10); db.run(`INSERT INTO users (id, username, password, firstname, lastname, role) VALUES (2, 'verwaltung', ?, 'Verwaltung', 'User', 'verwaltung')`, [verwaltungPassword], (err) => { if (err) console.error('Fehler beim Erstellen des Verwaltungs-Users:', err); else console.log('✅ Verwaltungs-User erstellt (verwaltung / verwaltung123)'); }); // Test-Mitarbeiter (optional) const mitarbeiterPassword = bcrypt.hashSync('test123', 10); db.run(`INSERT INTO users (id, username, password, firstname, lastname, role, wochenstunden, urlaubstage) VALUES (3, 'test', ?, 'Test', 'Mitarbeiter', 'mitarbeiter', 40, 25)`, [mitarbeiterPassword], (err) => { if (err && !err.message.includes('UNIQUE constraint')) { console.error('Fehler beim Erstellen des Test-Users:', err); } else if (!err) { console.log('✅ Test-Mitarbeiter erstellt (test / test123, 40h/Woche, 25 Urlaubstage)'); } }); // Warte bis alle Benutzer erstellt sind setTimeout(() => { console.log('\n✨ Datenbank erfolgreich zurückgesetzt!\n'); console.log('📋 Standard-Zugangsdaten:'); console.log(' Admin: admin / admin123'); console.log(' Verwaltung: verwaltung / verwaltung123'); console.log(' Test-User: test / test123\n'); db.close((err) => { if (err) { console.error('Fehler beim Schließen der Datenbank:', err); process.exit(1); } else { console.log('✅ Datenbank geschlossen\n'); process.exit(0); } }); }, 500); }); }); } catch (error) { console.error('❌ Fehler beim Zurücksetzen der Datenbank:', error); if (db) { db.close(); } process.exit(1); }