From 248c9a775d15f4f665eb86d2f289040351bc9d3f Mon Sep 17 00:00:00 2001 From: SylvainP1 <5533467-SylvainP1@users.noreply.replit.com> Date: Tue, 14 Apr 2026 08:21:56 +0000 Subject: [PATCH] Prevent duplicate time entries and unify collaborator information Adds a unique constraint to the database schema for time entries, preventing duplicates for the same month and collaborator. Also updates the API to check for existing entries before creation and unifies the collaborator name used in the dialog. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 55837015-10e9-4be9-b857-7f5e6be73772 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 30c6f661-5ee7-47bf-80d3-9d74ec4d729b Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1cc377db-7ea0-49f2-97ce-c3e87e0228cc/55837015-10e9-4be9-b857-7f5e6be73772/NRBGdxQ Replit-Helium-Checkpoint-Created: true --- artifacts/api-server/src/routes/timesheets.ts | 14 ++++++++++++++ artifacts/cra-app/src/pages/timesheets.tsx | 2 +- attached_assets/image_1776154810677.png | Bin 0 -> 44945 bytes lib/db/src/schema/timesheets.ts | 6 ++++-- 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 attached_assets/image_1776154810677.png diff --git a/artifacts/api-server/src/routes/timesheets.ts b/artifacts/api-server/src/routes/timesheets.ts index 2275159..66a0d79 100644 --- a/artifacts/api-server/src/routes/timesheets.ts +++ b/artifacts/api-server/src/routes/timesheets.ts @@ -54,6 +54,20 @@ router.post("/timesheets", async (req, res): Promise => { return; } + const [existing] = await db + .select() + .from(timesheetsTable) + .where(and( + eq(timesheetsTable.year, parsed.data.year), + eq(timesheetsTable.month, parsed.data.month), + eq(timesheetsTable.collaborator, parsed.data.collaborator) + )); + + if (existing) { + res.status(409).json({ error: "Un CRA existe déjà pour ce mois et ce collaborateur" }); + return; + } + const [timesheet] = await db.insert(timesheetsTable).values(parsed.data).returning(); res.status(201).json(GetTimesheetResponse.parse({ ...timesheet, lines: [] })); }); diff --git a/artifacts/cra-app/src/pages/timesheets.tsx b/artifacts/cra-app/src/pages/timesheets.tsx index 99dc515..aae4e76 100644 --- a/artifacts/cra-app/src/pages/timesheets.tsx +++ b/artifacts/cra-app/src/pages/timesheets.tsx @@ -173,7 +173,7 @@ function CreateTimesheetDialog({ open, onOpenChange }: { open: boolean; onOpenCh data: { year: parseInt(year), month: parseInt(month), - collaborator: "Jean Dupont" // In a real app, from auth context + collaborator: "PHAM Sylvain" } }, { onSuccess: (data) => { diff --git a/attached_assets/image_1776154810677.png b/attached_assets/image_1776154810677.png new file mode 100644 index 0000000000000000000000000000000000000000..70287689c4defd869de5dbeea4e70c0242a04f34 GIT binary patch literal 44945 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 literal 0 HcmV?d00001 diff --git a/lib/db/src/schema/timesheets.ts b/lib/db/src/schema/timesheets.ts index 175e82e..54528a7 100644 --- a/lib/db/src/schema/timesheets.ts +++ b/lib/db/src/schema/timesheets.ts @@ -1,4 +1,4 @@ -import { pgTable, text, serial, timestamp, integer, real } from "drizzle-orm/pg-core"; +import { pgTable, text, serial, timestamp, integer, real, unique } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod/v4"; @@ -11,7 +11,9 @@ export const timesheetsTable = pgTable("timesheets", { totalHours: real("total_hours").notNull().default(0), createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(), updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => new Date()), -}); +}, (table) => [ + unique("timesheets_year_month_collaborator_unique").on(table.year, table.month, table.collaborator), +]); export const insertTimesheetSchema = createInsertSchema(timesheetsTable).omit({ id: true, totalHours: true, createdAt: true, updatedAt: true }); export type InsertTimesheet = z.infer;