Benutzerverwaltung mit Rollen/Rechten und Urlaubsplanung

Führt Login mit vier Rollen (Admin, Teamleiter, Mitarbeiter, Beobachter) ein,
über die Teammitglieder eigenen Urlaub inkl. Pflicht-Vertreter eintragen
können. Die Auslastungsberechnung berücksichtigt Urlaub jetzt als reduzierte
Kapazität. Neue Konten vergeben ihr Passwort selbst beim ersten Login.
Migrationsskript für bestehende Mitarbeiter aus der Vorversion inklusive.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 22:57:25 +02:00
parent 60a0928d2f
commit 06ea149d41
20 changed files with 1139 additions and 91 deletions
+52
View File
@@ -0,0 +1,52 @@
// Legt einen Admin-Zugang für einen bestehenden Mitarbeiter an oder setzt ihn zurück.
//
// Ohne --password: Konto wird (neu) angelegt, das Passwort wird beim nächsten
// Login vom Nutzer selbst vergeben (gleicher Mechanismus wie bei der Benutzerverwaltung).
// Mit --password: setzt sofort ein Passwort (Notfall-Wiederherstellung, falls der
// Admin sich ausgesperrt hat).
//
// Aufruf:
// node scripts/reset-admin.js --employee-id 3
// node scripts/reset-admin.js --email admin@example.com --password neuesPasswort
const bcrypt = require('bcryptjs');
const db = require('../db');
function readArg(name) {
const idx = process.argv.indexOf(`--${name}`);
return idx !== -1 ? process.argv[idx + 1] : undefined;
}
const employeeId = readArg('employee-id');
let email = readArg('email');
const password = readArg('password');
if (!employeeId && !email) {
console.error(
'Nutzung: node scripts/reset-admin.js --employee-id <id> [--password <passwort>]\n' +
' oder node scripts/reset-admin.js --email <email> [--password <passwort>]'
);
process.exit(1);
}
if (employeeId && !email) {
const employee = db.prepare('SELECT email FROM employees WHERE id = ?').get(employeeId);
if (!employee || !employee.email) {
console.error(`Mitarbeiter ${employeeId} wurde nicht gefunden oder hat keine E-Mail hinterlegt.`);
process.exit(1);
}
email = employee.email;
}
const passwordHash = password ? bcrypt.hashSync(password, 10) : null;
db.prepare(
`INSERT INTO users (employee_id, email, password_hash, role) VALUES (?, ?, ?, 'admin')
ON CONFLICT (email) DO UPDATE SET role = 'admin', password_hash = excluded.password_hash`
).run(employeeId || null, email, passwordHash);
console.log(
password
? `Admin-Zugang für ${email} wurde mit dem angegebenen Passwort gesetzt.`
: `Admin-Zugang für ${email} wurde angelegt/zurückgesetzt. Passwort wird beim nächsten Login vergeben.`
);