Files
FEDEO/src/routes/staff/time.ts
2025-12-08 12:15:20 +01:00

174 lines
5.5 KiB
TypeScript

import { FastifyInstance } from "fastify"
import {
stafftimeentries,
stafftimenetryconnects
} from "../../../db/schema"
import {
eq,
and,
gte,
lte,
desc
} from "drizzle-orm"
export default async function staffTimeRoutes(server: FastifyInstance) {
// -------------------------------------------------------------
// ▶ Neue Zeit starten
// -------------------------------------------------------------
server.post("/staff/time", async (req, reply) => {
try {
const { user_id, ...rest } = req.body as any
const userId = req.user.user_id
const tenantId = req.user.tenant_id
const newEntry = {
tenant_id: tenantId,
user_id: user_id || userId,
...rest
}
const [created] = await server.db
.insert(stafftimeentries)
.values(newEntry)
.returning()
return created
} catch (err: any) {
console.error(err)
return reply.code(400).send({ error: err.message })
}
})
// -------------------------------------------------------------
// ▶ Zeit stoppen
// -------------------------------------------------------------
server.put("/staff/time/:id/stop", async (req, reply) => {
try {
const { id } = req.params as any
const { stopped_at } = req.body as any
const [updated] = await server.db
.update(stafftimeentries)
.set({
stopped_at,
updated_at: new Date()
})
.where(eq(stafftimeentries.id, id))
.returning()
return updated
} catch (err) {
return reply.code(400).send({ error: (err as Error).message })
}
})
// -------------------------------------------------------------
// ▶ Liste aller Zeiten
// -------------------------------------------------------------
server.get("/staff/time", async (req, reply) => {
try {
const { from, to, type, user_id } = req.query as any
const { tenant_id, user_id: currentUserId } = req.user
let where = and(eq(stafftimeentries.tenant_id, tenant_id))
// Zugriffsbeschränkung
if (!req.hasPermission("staff.time.read_all")) {
where = and(where, eq(stafftimeentries.user_id, currentUserId))
} else if (user_id) {
where = and(where, eq(stafftimeentries.user_id, user_id))
}
if (from) where = and(where, gte(stafftimeentries.started_at, from))
if (to) where = and(where, lte(stafftimeentries.started_at, to))
if (type) where = and(where, eq(stafftimeentries.type, type))
const rows = await server.db
.select()
.from(stafftimeentries)
.where(where)
.orderBy(desc(stafftimeentries.started_at))
return rows
} catch (err) {
console.error(err)
return reply.code(400).send({ error: (err as Error).message })
}
})
// -------------------------------------------------------------
// ▶ Einzelne Zeit (inkl. Connects)
// -------------------------------------------------------------
server.get("/staff/time/:id", async (req, reply) => {
try {
const { id } = req.params as any
const rows = await server.db
.select()
.from(stafftimeentries)
.where(eq(stafftimeentries.id, id))
.limit(1)
if (!rows.length) return reply.code(404).send({ error: "Not found" })
const entry = rows[0]
const connects = await server.db
.select()
.from(stafftimenetryconnects)
.where(eq(stafftimenetryconnects.stafftimeentry, id))
return {
...entry,
staff_time_entry_connects: connects
}
} catch (err) {
return reply.code(400).send({ error: (err as Error).message })
}
})
// -------------------------------------------------------------
// ▶ Zeit bearbeiten
// -------------------------------------------------------------
server.put("/staff/time/:id", async (req, reply) => {
try {
const { id } = req.params as any
const updateData = {
// @ts-ignore
...req.body,
updated_at: new Date()
}
const [updated] = await server.db
.update(stafftimeentries)
.set(updateData)
.where(eq(stafftimeentries.id, id))
.returning()
return updated
} catch (err) {
return reply.code(400).send({ error: (err as Error).message })
}
})
// -------------------------------------------------------------
// ▶ Zeit löschen
// -------------------------------------------------------------
server.delete("/staff/time/:id", async (req, reply) => {
try {
const { id } = req.params as any
await server.db
.delete(stafftimeentries)
.where(eq(stafftimeentries.id, id))
return { success: true }
} catch (err) {
return reply.code(400).send({ error: (err as Error).message })
}
})
}