124 lines
5.0 KiB
TypeScript
124 lines
5.0 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { useAuthStore } from '~/stores/auth'
|
|
|
|
export const useStaffTime = () => {
|
|
const { $api, $dayjs } = useNuxtApp()
|
|
const auth = useAuthStore()
|
|
|
|
// ... (list Funktion bleibt gleich) ...
|
|
const list = async (filter?: { user_id?: string, from?: string, to?: string }) => {
|
|
// ... (Code wie zuvor)
|
|
const from = filter?.from || $dayjs().startOf('month').format('YYYY-MM-DD')
|
|
const to = filter?.to || $dayjs().endOf('month').format('YYYY-MM-DD')
|
|
const targetUserId = filter?.user_id || auth.user.id
|
|
const params = new URLSearchParams({ from, to, targetUserId })
|
|
try {
|
|
const spans = await $api(`/api/staff/time/spans?${params.toString()}`)
|
|
return (spans || []).map((span: any) => {
|
|
const start = $dayjs(span.startedAt)
|
|
const end = span.endedAt ? $dayjs(span.endedAt) : $dayjs()
|
|
return {
|
|
id: span.sourceEventIds && span.sourceEventIds.length > 0 ? span.sourceEventIds[0] : null,
|
|
eventIds: span.sourceEventIds || [],
|
|
state: span.status,
|
|
started_at: span.startedAt,
|
|
stopped_at: span.endedAt,
|
|
duration_minutes: end.diff(start, 'minute'),
|
|
user_id: targetUserId,
|
|
type: span.type,
|
|
description: span.payload?.description || ''
|
|
}
|
|
}).sort((a: any, b: any) => $dayjs(b.started_at).valueOf() - $dayjs(a.started_at).valueOf())
|
|
} catch (error) {
|
|
console.error("Fehler beim Laden:", error)
|
|
return []
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Startet "jetzt" (Live-Modus).
|
|
* Kann optional eine Zeit empfangen (für manuelle Korrekturen),
|
|
* aber wir nutzen dafür besser die createEntry Funktion unten.
|
|
*/
|
|
const start = async (description = "Arbeitszeit", time?: string) => {
|
|
await $api('/api/staff/time/event', {
|
|
method: 'POST',
|
|
body: {
|
|
eventtype: 'work_start',
|
|
eventtime: time || new Date().toISOString(), // 💡 Fix: Zeit akzeptieren
|
|
payload: { description }
|
|
}
|
|
})
|
|
}
|
|
|
|
const stop = async () => {
|
|
await $api('/api/staff/time/event', { method: 'POST', body: { eventtype: 'work_end', eventtime: new Date().toISOString() } })
|
|
}
|
|
|
|
const submit = async (entry: any) => {
|
|
const ids = entry.eventIds || (entry.id ? [entry.id] : [entry]);
|
|
if (!ids || ids.length === 0) return
|
|
await $api('/api/staff/time/submit', { method: 'POST', body: { eventIds: ids } })
|
|
}
|
|
|
|
const approve = async (entry: any) => {
|
|
if (!entry?.user_id) return
|
|
const ids = entry.eventIds || [entry.id];
|
|
await $api('/api/staff/time/approve', { method: 'POST', body: { eventIds: ids, employeeUserId: entry.user_id } })
|
|
}
|
|
|
|
const reject = async (entry: any, reason = "Abgelehnt") => {
|
|
if (!entry?.user_id) return
|
|
const ids = entry.eventIds || [entry.id];
|
|
await $api('/api/staff/time/reject', { method: 'POST', body: { eventIds: ids, employeeUserId: entry.user_id, reason } })
|
|
}
|
|
|
|
const update = async (entry: any, newData: { start: string, end: string | null, type: string, description: string }) => {
|
|
if (!entry || !entry.eventIds || entry.eventIds.length === 0) {
|
|
throw new Error("Bearbeiten fehlgeschlagen: Keine IDs.")
|
|
}
|
|
await $api('/api/staff/time/edit', {
|
|
method: 'POST',
|
|
body: {
|
|
originalEventIds: entry.eventIds,
|
|
newStart: newData.start,
|
|
newEnd: newData.end,
|
|
newType: newData.type,
|
|
description: newData.description,
|
|
reason: "Manuelle Bearbeitung"
|
|
}
|
|
})
|
|
}
|
|
|
|
// 🆕 NEU: Manuellen Eintrag erstellen (Vergangenheit oder Zeitraum)
|
|
const createEntry = async (data: { start: string, end: string | null, type: string, description: string, user_id: string }) => {
|
|
// 1. Start Event senden
|
|
// Wir nutzen den dynamischen Typ (work_start, vacation_start etc.)
|
|
console.log(data)
|
|
|
|
await $api('/api/staff/time/event', {
|
|
method: 'POST',
|
|
body: {
|
|
eventtype: `${data.type}_start`,
|
|
eventtime: data.start,
|
|
payload: { description: data.description },
|
|
user_id: data.user_id,
|
|
}
|
|
})
|
|
|
|
// 2. End Event senden (falls vorhanden)
|
|
if (data.end) {
|
|
await $api('/api/staff/time/event', {
|
|
method: 'POST',
|
|
body: {
|
|
eventtype: `${data.type}_end`,
|
|
eventtime: data.end,
|
|
payload: { description: data.description },
|
|
user_id: data.user_id,
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
return { list, start, stop, submit, approve, reject, update, createEntry }
|
|
} |