228 lines
7.9 KiB
JavaScript
228 lines
7.9 KiB
JavaScript
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,
|
||
overtime_offset_hours REAL DEFAULT 0,
|
||
ping_ip TEXT,
|
||
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,
|
||
sick_status INTEGER DEFAULT 0,
|
||
pause_start_time TEXT,
|
||
pause_end_time 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');
|
||
});
|
||
|
||
// Ping-Status-Tabelle für IP-basierte Zeiterfassung
|
||
db.run(`CREATE TABLE ping_status (
|
||
user_id INTEGER NOT NULL,
|
||
date TEXT NOT NULL,
|
||
last_successful_ping DATETIME,
|
||
failed_ping_count INTEGER DEFAULT 0,
|
||
start_time_set INTEGER DEFAULT 0,
|
||
first_failed_ping_time DATETIME,
|
||
PRIMARY KEY (user_id, date),
|
||
FOREIGN KEY (user_id) REFERENCES users(id)
|
||
)`, (err) => {
|
||
if (err) console.error('Fehler bei ping_status:', err);
|
||
else console.log('✅ Tabelle ping_status 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 (Rolle als JSON-Array)
|
||
const adminPassword = bcrypt.hashSync('admin123', 10);
|
||
db.run(`INSERT INTO users (id, username, password, firstname, lastname, role)
|
||
VALUES (1, 'admin', ?, 'System', 'Administrator', ?)`,
|
||
[adminPassword, JSON.stringify(['admin'])], (err) => {
|
||
if (err) console.error('Fehler beim Erstellen des Admin-Users:', err);
|
||
else console.log('✅ Admin-User erstellt (admin / admin123)');
|
||
});
|
||
|
||
// Standard Verwaltungs-Benutzer (Rolle als JSON-Array)
|
||
const verwaltungPassword = bcrypt.hashSync('verwaltung123', 10);
|
||
db.run(`INSERT INTO users (id, username, password, firstname, lastname, role)
|
||
VALUES (2, 'verwaltung', ?, 'Verwaltung', 'User', ?)`,
|
||
[verwaltungPassword, JSON.stringify(['verwaltung'])], (err) => {
|
||
if (err) console.error('Fehler beim Erstellen des Verwaltungs-Users:', err);
|
||
else console.log('✅ Verwaltungs-User erstellt (verwaltung / verwaltung123)');
|
||
});
|
||
|
||
// Test-Mitarbeiter (optional, Rolle als JSON-Array)
|
||
const mitarbeiterPassword = bcrypt.hashSync('test123', 10);
|
||
db.run(`INSERT INTO users (id, username, password, firstname, lastname, role, wochenstunden, urlaubstage)
|
||
VALUES (3, 'test', ?, 'Test', 'Mitarbeiter', ?, 40, 25)`,
|
||
[mitarbeiterPassword, JSON.stringify(['mitarbeiter'])], (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);
|
||
}
|