diff --git a/shared/schema.ts b/shared/schema.ts index 2181b63..a63b5c7 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -257,10 +257,14 @@ export const shiftAssignments = pgTable("shift_assignments", { shiftId: varchar("shift_id").notNull().references(() => shifts.id, { onDelete: "cascade" }), guardId: varchar("guard_id").notNull().references(() => guards.id, { onDelete: "cascade" }), + // Planned shift times (when the guard is scheduled to work) + plannedStartTime: timestamp("planned_start_time").notNull(), + plannedEndTime: timestamp("planned_end_time").notNull(), + assignedAt: timestamp("assigned_at").defaultNow(), confirmedAt: timestamp("confirmed_at"), - // Actual check-in/out times + // Actual check-in/out times (recorded when guard clocks in/out) checkInTime: timestamp("check_in_time"), checkOutTime: timestamp("check_out_time"), }); @@ -700,10 +704,25 @@ export const insertShiftFormSchema = z.object({ status: z.enum(["planned", "active", "completed", "cancelled"]).default("planned"), }); -export const insertShiftAssignmentSchema = createInsertSchema(shiftAssignments).omit({ - id: true, - assignedAt: true, -}); +export const insertShiftAssignmentSchema = createInsertSchema(shiftAssignments) + .omit({ + id: true, + assignedAt: true, + }) + .extend({ + plannedStartTime: z.union([z.string(), z.date()], { + required_error: "Orario inizio richiesto", + invalid_type_error: "Orario inizio non valido", + }).transform((val) => new Date(val)), + plannedEndTime: z.union([z.string(), z.date()], { + required_error: "Orario fine richiesto", + invalid_type_error: "Orario fine non valido", + }).transform((val) => new Date(val)), + }) + .refine((data) => data.plannedEndTime > data.plannedStartTime, { + message: "L'orario di fine deve essere successivo all'orario di inizio", + path: ["plannedEndTime"], + }); export const insertCcnlSettingSchema = createInsertSchema(ccnlSettings).omit({ id: true,