diff --git a/src/routes/staff/time.ts b/src/routes/staff/time.ts index 4d00f76..5b4956c 100644 --- a/src/routes/staff/time.ts +++ b/src/routes/staff/time.ts @@ -18,19 +18,29 @@ export default async function staffTimeRoutes(server: FastifyInstance) { // ------------------------------------------------------------- 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 = { + const body = req.body as any + + const normalizeDate = (val: any) => { + if (!val) return null + const d = new Date(val) + return isNaN(d.getTime()) ? null : d + } + + const dataToInsert = { tenant_id: tenantId, - user_id: user_id || userId, - ...rest + user_id: body.user_id || userId, + type: body.type || "work", + description: body.description || null, + started_at: normalizeDate(body.started_at), + stopped_at: normalizeDate(body.stopped_at), } const [created] = await server.db .insert(stafftimeentries) - .values(newEntry) + .values(dataToInsert) .returning() return created @@ -43,23 +53,42 @@ export default async function staffTimeRoutes(server: FastifyInstance) { // ------------------------------------------------------------- // ▶ Zeit stoppen // ------------------------------------------------------------- - server.put("/staff/time/:id/stop", async (req, reply) => { + server.put<{ + Params: { id: string }, + Body: { stopped_at: string } + }>("/staff/time/:id/stop", async (req, reply) => { try { - const { id } = req.params as any - const { stopped_at } = req.body as any + const { id } = req.params + const { stopped_at } = req.body + + // Normalize timestamp + const normalizeDate = (val: any) => { + const d = new Date(val) + return isNaN(d.getTime()) ? null : d + } + + const stopTime = normalizeDate(stopped_at) + if (!stopTime) { + return reply.code(400).send({ error: "Invalid stopped_at timestamp" }) + } const [updated] = await server.db .update(stafftimeentries) .set({ - stopped_at, - updated_at: new Date() + stopped_at: stopTime, + updated_at: new Date(), }) .where(eq(stafftimeentries.id, id)) .returning() - return updated - } catch (err) { - return reply.code(400).send({ error: (err as Error).message }) + if (!updated) { + return reply.code(404).send({ error: "Time entry not found" }) + } + + return reply.send(updated) + } catch (err: any) { + console.error("STOP ERROR:", err) + return reply.code(500).send({ error: err.message || "Internal server error" }) } }) @@ -131,15 +160,43 @@ export default async function staffTimeRoutes(server: FastifyInstance) { // ------------------------------------------------------------- // ▶ Zeit bearbeiten // ------------------------------------------------------------- - server.put("/staff/time/:id", async (req, reply) => { + // ▶ Zeit bearbeiten + server.put<{ + Params: { id: string }, + }>("/staff/time/:id", async (req, reply) => { try { - const { id } = req.params as any + const { id } = req.params + const body = req.body + + // Normalize all timestamp fields + const normalizeDate = (val: any) => { + if (!val) return null + const d = new Date(val) + return isNaN(d.getTime()) ? null : d + } - const updateData = { + const updateData: any = { // @ts-ignore - ...req.body, - updated_at: new Date() + ...body, + updated_at: new Date(), + } + + // Only convert if present — avoid overriding with null unless sent + // @ts-ignore + if (body.started_at !== undefined) { + // @ts-ignore + updateData.started_at = normalizeDate(body.started_at) + } + // @ts-ignore + if (body.stopped_at !== undefined) { + // @ts-ignore + updateData.stopped_at = normalizeDate(body.stopped_at) + } + // @ts-ignore + if (body.approved_at !== undefined) { + // @ts-ignore + updateData.approved_at = normalizeDate(body.approved_at) } const [updated] = await server.db @@ -148,12 +205,18 @@ export default async function staffTimeRoutes(server: FastifyInstance) { .where(eq(stafftimeentries.id, id)) .returning() - return updated - } catch (err) { - return reply.code(400).send({ error: (err as Error).message }) + if (!updated) { + return reply.code(404).send({ error: "Time entry not found" }) + } + + return reply.send(updated) + } catch (err: any) { + console.error("UPDATE ERROR:", err) + return reply.code(500).send({ error: err.message || "Internal server error" }) } }) + // ------------------------------------------------------------- // ▶ Zeit löschen // -------------------------------------------------------------