160 lines
5.0 KiB
TypeScript
160 lines
5.0 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { useAuthStore } from '~/stores/auth'
|
|
|
|
export const useStaffTime = () => {
|
|
const { $api, $dayjs } = useNuxtApp()
|
|
const auth = useAuthStore()
|
|
|
|
/**
|
|
* Lädt die Zeitspannen (Spans) für die Liste.
|
|
* Nutzt jetzt GET /api/staff/time/spans
|
|
*/
|
|
const list = async (filter?: { user_id?: string, from?: string, to?: string }) => {
|
|
// Standard: Aktueller Monat
|
|
const from = filter?.from || $dayjs().startOf('month').format('YYYY-MM-DD')
|
|
const to = filter?.to || $dayjs().endOf('month').format('YYYY-MM-DD')
|
|
|
|
// Ziel-User: Entweder aus Filter (Admin-Ansicht) oder eigener User
|
|
const targetUserId = filter?.user_id || auth.user.id
|
|
|
|
const params = new URLSearchParams({
|
|
from,
|
|
to,
|
|
// Der Endpoint erwartet targetUserId, wenn man Daten eines anderen Users will
|
|
targetUserId
|
|
})
|
|
|
|
try {
|
|
// 💡 UPDATE: Prefix /api hinzugefügt
|
|
const spans = await $api(`/api/staff/time/spans?${params.toString()}`)
|
|
|
|
return (spans || []).map((span: any) => {
|
|
const start = $dayjs(span.startedAt)
|
|
// Wenn endedAt null ist, läuft die Zeit noch -> Dauer bis "jetzt" berechnen für Anzeige
|
|
const end = span.endedAt ? $dayjs(span.endedAt) : $dayjs()
|
|
const duration = end.diff(start, 'minute')
|
|
|
|
return {
|
|
// ID: Wir nehmen die erste Event-ID (Start-Event) als Referenz für Aktionen
|
|
id: span.sourceEventIds && span.sourceEventIds.length > 0 ? span.sourceEventIds[0] : null,
|
|
|
|
// Mapping Backend-Status -> Frontend-State
|
|
state: span.status,
|
|
|
|
// Zeitstempel
|
|
started_at: span.startedAt,
|
|
stopped_at: span.endedAt,
|
|
|
|
duration_minutes: duration,
|
|
|
|
// Da der Endpoint nur die Spans zurückgibt, setzen wir die UserID
|
|
// auf den User, den wir angefragt haben.
|
|
user_id: targetUserId,
|
|
|
|
type: span.type,
|
|
|
|
// Payload/Description falls vorhanden
|
|
description: span.payload?.description || ''
|
|
}
|
|
}).sort((a: any, b: any) => $dayjs(b.started_at).valueOf() - $dayjs(a.started_at).valueOf()) // Sortierung: Neueste oben
|
|
|
|
} catch (error) {
|
|
console.error("Fehler beim Laden der Zeiten:", error)
|
|
return []
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Startet einen neuen Zeiteintrag.
|
|
* POST /api/staff/time/event
|
|
*/
|
|
const start = async (description = "Arbeitszeit") => {
|
|
try {
|
|
// 💡 UPDATE: Prefix /api hinzugefügt
|
|
await $api('/api/staff/time/event', {
|
|
method: 'POST',
|
|
body: {
|
|
eventtype: 'work_start',
|
|
eventtime: new Date().toISOString(),
|
|
payload: { description }
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error("Fehler beim Starten:", error)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Stoppt die aktuelle Zeit.
|
|
* POST /api/staff/time/event
|
|
*/
|
|
const stop = async (entryId?: string) => {
|
|
try {
|
|
// 💡 UPDATE: Prefix /api hinzugefügt
|
|
await $api('/api/staff/time/event', {
|
|
method: 'POST',
|
|
body: {
|
|
eventtype: 'work_end',
|
|
eventtime: new Date().toISOString()
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error("Fehler beim Stoppen:", error)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reicht einen Eintrag ein.
|
|
* POST /api/staff/time/submit
|
|
*/
|
|
const submit = async (entryId: string) => {
|
|
if (!entryId) return
|
|
try {
|
|
// 💡 UPDATE: Prefix /api hinzugefügt
|
|
await $api('/api/staff/time/submit', {
|
|
method: 'POST',
|
|
body: {
|
|
eventIds: [entryId]
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error("Fehler beim Einreichen:", error)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Genehmigt einen Eintrag.
|
|
* POST /api/staff/time/approve
|
|
*/
|
|
const approve = async (entry: any) => {
|
|
if (!entry || !entry.id || !entry.user_id) {
|
|
console.error("Ungültiger Eintrag für Genehmigung (ID oder UserID fehlt)", entry)
|
|
return
|
|
}
|
|
|
|
try {
|
|
// 💡 UPDATE: Prefix /api hinzugefügt
|
|
await $api('/api/staff/time/approve', {
|
|
method: 'POST',
|
|
body: {
|
|
eventIds: [entry.id],
|
|
employeeUserId: entry.user_id
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error("Fehler beim Genehmigen:", error)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
return {
|
|
list,
|
|
start,
|
|
stop,
|
|
submit,
|
|
approve
|
|
}
|
|
} |