Files
arbeitszeit/lib/db.ts
T
admin 01a7ac8e0b Initiale Arbeitszeiterfassung (Next.js 16 + SQLite)
Web-App zur Erfassung der Arbeitszeit, Layout/Architektur an Projekt logbuch
angelehnt, mit grüner Grundfarbe und SQLite3 statt MySQL.

- Eingabemaske: Datum (mit Wochentag), Ort (Kunde FFM/Homeoffice/Andrena),
  Beginn/Ende, Reisezeit, Vertriebsunterstützung (default 2h), Kommentar (max 500)
- Berechnung: Arbeitszeit = Ende-Beginn; Mehrarbeit = Arbeitszeit - 8h - Pause
- Pause als globale Einstellung (Einstellungen-Tab)
- Tabs Eingabe/Liste/Einstellungen, letzte 10 Einträge unter der Maske
- Single-User-Login (Benutzer Birgit + Passwort fest in .env), JWT-Cookie via jose
- better-sqlite3, Docker-Setup für docker.citysensor.de

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 09:53:44 +02:00

50 lines
1.3 KiB
TypeScript

import Database from 'better-sqlite3';
import { mkdirSync } from 'fs';
import { dirname } from 'path';
let db: Database.Database | null = null;
function dbPath(): string {
return process.env.DB_PATH || './data/arbeitszeit.db';
}
/** Singleton-Zugriff auf die SQLite-Datenbank. Legt Datei + Schema beim ersten Aufruf an. */
export function getDb(): Database.Database {
if (db) return db;
const path = dbPath();
mkdirSync(dirname(path), { recursive: true });
db = new Database(path);
db.pragma('journal_mode = WAL');
db.exec(`
CREATE TABLE IF NOT EXISTS arbeitszeit (
id INTEGER PRIMARY KEY AUTOINCREMENT,
datum TEXT NOT NULL,
ort TEXT NOT NULL,
beginn TEXT NOT NULL,
ende TEXT NOT NULL,
reisezeit REAL NOT NULL DEFAULT 0,
vertriebsunterstuetzung REAL NOT NULL DEFAULT 2,
kommentar TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_arbeitszeit_datum ON arbeitszeit (datum);
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
);
`);
// Standard-Pause beim ersten Start setzen (0,5 h)
db.prepare(
`INSERT INTO settings (key, value) VALUES ('pause', '0.5')
ON CONFLICT(key) DO NOTHING`
).run();
return db;
}