diff --git a/.replit b/.replit index 048618b..a2fd13c 100644 --- a/.replit +++ b/.replit @@ -23,6 +23,10 @@ externalPort = 3001 localPort = 41343 externalPort = 3000 +[[ports]] +localPort = 41607 +externalPort = 3003 + [[ports]] localPort = 42175 externalPort = 3002 diff --git a/replit.md b/replit.md index 2c62241..498f871 100644 --- a/replit.md +++ b/replit.md @@ -1,7 +1,7 @@ # VigilanzaTurni - Sistema Gestione Turni per Istituti di Vigilanza ## Overview -VigilanzaTurni is a professional 24/7 shift management system designed for security companies. It offers multi-role authentication (Admin, Coordinator, Guard, Client), comprehensive guard and site management, 24/7 shift planning, a live operational dashboard with KPIs, reporting for worked hours, and a notification system. The project aims to streamline operations and enhance efficiency for security institutes. +VigilanzaTurni is a professional 24/7 shift management system designed for security companies. It offers multi-role authentication (Admin, Coordinator, Guard, Client), comprehensive guard and site management, 24/7 shift planning, a live operational dashboard with KPIs, reporting for worked hours, and a notification system. The system supports multi-location operations (Roccapiemonte, Milano, Roma) managing 250+ security personnel across different branches. The project aims to streamline operations and enhance efficiency for security institutes. ## User Preferences - Interfaccia in italiano diff --git a/shared/schema.ts b/shared/schema.ts index eba0016..485bd5e 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -85,6 +85,12 @@ export const vehicleTypeEnum = pgEnum("vehicle_type", [ "suv", // SUV ]); +export const locationEnum = pgEnum("location", [ + "roccapiemonte", // Sede Roccapiemonte (Salerno) + "milano", // Sede Milano + "roma", // Sede Roma +]); + // ============= SESSION & AUTH TABLES (Replit Auth) ============= // Session storage table - mandatory for Replit Auth @@ -118,6 +124,7 @@ export const guards = pgTable("guards", { userId: varchar("user_id").references(() => users.id), badgeNumber: varchar("badge_number").notNull().unique(), phoneNumber: varchar("phone_number"), + location: locationEnum("location").notNull().default("roccapiemonte"), // Sede di appartenenza // Skills isArmed: boolean("is_armed").default(false), @@ -151,6 +158,7 @@ export const vehicles = pgTable("vehicles", { model: varchar("model").notNull(), // Modello vehicleType: vehicleTypeEnum("vehicle_type").notNull(), year: integer("year"), // Anno immatricolazione + location: locationEnum("location").notNull().default("roccapiemonte"), // Sede di appartenenza // Assegnazione assignedGuardId: varchar("assigned_guard_id").references(() => guards.id, { onDelete: "set null" }), @@ -173,6 +181,7 @@ export const sites = pgTable("sites", { name: varchar("name").notNull(), address: varchar("address").notNull(), clientId: varchar("client_id").references(() => users.id), + location: locationEnum("location").notNull().default("roccapiemonte"), // Sede gestionale // Service requirements shiftType: shiftTypeEnum("shift_type").notNull(), @@ -300,6 +309,11 @@ export const contractParameters = pgTable("contract_parameters", { // Pause obbligatorie pauseMinutesIfOver6Hours: integer("pause_minutes_if_over_6_hours").notNull().default(10), + // Buoni pasto + mealVoucherEnabled: boolean("meal_voucher_enabled").default(true), // Buoni pasto attivi + mealVoucherAfterHours: integer("meal_voucher_after_hours").default(6), // Ore minime per diritto buono pasto + mealVoucherAmount: integer("meal_voucher_amount").default(8), // Importo buono pasto in euro (facoltativo) + // Limiti notturni (22:00-06:00) maxNightHoursPerWeek: integer("max_night_hours_per_week").default(48),