cb168fbd18
- 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>
91 lines
2.7 KiB
TypeScript
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) });
|
|
}
|