Files
admin cb168fbd18 Reisezeit aus Start/Ende, Pause pro Eintrag in Minuten
- Reisezeit wird aus Reise-Beginn/-Ende zur Laufzeit berechnet (Spalte reisezeit entfernt),
  Anzeige in Vorschau und Liste wie Mehrarbeit
- Pause pro Eintrag in Minuten (Feld zwischen Beginn und Ende), Default aus globaler Einstellung
- Eingabefelder werden nach dem Speichern eines neuen Eintrags geleert
- DB-Migrationen für reise_beginn/reise_ende/pause-Spalten
- Version 0.1.2

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

91 lines
2.7 KiB
TypeScript

import { getDb } from './db';
import type { ArbeitszeitEintrag, ArbeitszeitInput } from '@/types/arbeitszeit';
interface ListParams {
limit: number;
offset: number;
month?: string; // "YYYY-MM"
}
interface ListResult {
entries: ArbeitszeitEintrag[];
total: number;
}
/** Einträge absteigend nach Datum (neueste zuerst), optional nach Monat gefiltert. */
export function listArbeitszeit({ limit, offset, month }: ListParams): ListResult {
const db = getDb();
const where = month ? `WHERE substr(datum, 1, 7) = ?` : '';
const args = month ? [month] : [];
const total = (
db.prepare(`SELECT COUNT(*) AS c FROM arbeitszeit ${where}`).get(...args) as { c: number }
).c;
const entries = db
.prepare(
`SELECT * FROM arbeitszeit ${where}
ORDER BY datum DESC, beginn DESC, id DESC
LIMIT ? OFFSET ?`
)
.all(...args, limit, offset) as ArbeitszeitEintrag[];
return { entries, total };
}
export function getArbeitszeit(id: number): ArbeitszeitEintrag | undefined {
return getDb().prepare('SELECT * FROM arbeitszeit WHERE id = ?').get(id) as
| ArbeitszeitEintrag
| undefined;
}
export function createArbeitszeit(input: ArbeitszeitInput): ArbeitszeitEintrag {
const db = getDb();
const info = db
.prepare(
`INSERT INTO arbeitszeit (datum, ort, beginn, ende, reise_beginn, reise_ende, pause, vertriebsunterstuetzung, kommentar)
VALUES (@datum, @ort, @beginn, @ende, @reise_beginn, @reise_ende, @pause, @vertriebsunterstuetzung, @kommentar)`
)
.run(input);
return getArbeitszeit(Number(info.lastInsertRowid))!;
}
export function updateArbeitszeit(
id: number,
input: ArbeitszeitInput
): ArbeitszeitEintrag | undefined {
const db = getDb();
db.prepare(
`UPDATE arbeitszeit SET
datum = @datum, ort = @ort, beginn = @beginn, ende = @ende,
reise_beginn = @reise_beginn, reise_ende = @reise_ende,
pause = @pause, vertriebsunterstuetzung = @vertriebsunterstuetzung,
kommentar = @kommentar
WHERE id = @id`
).run({ ...input, id });
return getArbeitszeit(id);
}
export function deleteArbeitszeit(id: number): boolean {
return getDb().prepare('DELETE FROM arbeitszeit WHERE id = ?').run(id).changes > 0;
}
// --- Einstellungen -------------------------------------------------------
export function getPause(): number {
const row = getDb().prepare(`SELECT value FROM settings WHERE key = 'pause'`).get() as
| { value: string }
| undefined;
const v = row ? parseFloat(row.value) : 0.5;
return isNaN(v) ? 0.5 : v;
}
export function setPause(value: number): void {
getDb()
.prepare(
`INSERT INTO settings (key, value) VALUES ('pause', @value)
ON CONFLICT(key) DO UPDATE SET value = @value`
)
.run({ value: String(value) });
}