174 lines
5.5 KiB
TypeScript
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 })
|
|
}
|
|
})
|
|
}
|