diff --git a/client/src/pages/general-planning.tsx b/client/src/pages/general-planning.tsx index 2264879..0a5ee27 100644 --- a/client/src/pages/general-planning.tsx +++ b/client/src/pages/general-planning.tsx @@ -280,9 +280,9 @@ export default function GeneralPlanning() { data-testid={`cell-${site.siteId}-${day.date}`} onClick={() => daySiteData && handleCellClick(site.siteId, site.siteName, day.date, daySiteData)} > - {daySiteData && daySiteData.shiftsCount > 0 ? ( + {daySiteData ? (
- {/* Riepilogo guardie necessarie/assegnate/mancanti */} + {/* Riepilogo guardie necessarie/assegnate/mancanti - SEMPRE VISIBILE */}
{daySiteData.missingGuards > 0 ? ( @@ -333,11 +333,13 @@ export default function GeneralPlanning() {
)} - {/* Info copertura */} -
-
Turni: {daySiteData.shiftsCount}
-
Tot. ore: {daySiteData.totalShiftHours}h
-
+ {/* Info copertura - mostra solo se ci sono turni */} + {daySiteData.shiftsCount > 0 && ( +
+
Turni: {daySiteData.shiftsCount}
+
Tot. ore: {daySiteData.totalShiftHours}h
+
+ )}
) : (
diff --git a/database-backups/vigilanzaturni_v1.0.11_20251017_093145.sql.gz b/database-backups/vigilanzaturni_v1.0.11_20251017_093145.sql.gz deleted file mode 100644 index f503e58..0000000 Binary files a/database-backups/vigilanzaturni_v1.0.11_20251017_093145.sql.gz and /dev/null differ diff --git a/database-backups/vigilanzaturni_v1.0.21_20251018_081811.sql.gz b/database-backups/vigilanzaturni_v1.0.21_20251018_081811.sql.gz new file mode 100644 index 0000000..03d447a Binary files /dev/null and b/database-backups/vigilanzaturni_v1.0.21_20251018_081811.sql.gz differ diff --git a/server/routes.ts b/server/routes.ts index 8ba8d95..ace9353 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -956,7 +956,6 @@ export async function registerRoutes(app: Express): Promise { .filter(Boolean); // Calcolo guardie mancanti - // Formula: ceil(24 / maxOreGuardia) × minGuardie - guardieAssegnate const maxOreGuardia = 9; // Max ore per guardia const minGuardie = site.minGuards || 1; @@ -967,17 +966,25 @@ export async function registerRoutes(app: Express): Promise { return sum + differenceInHours(end, start); }, 0); - // Slot necessari per coprire le ore totali - const slotsNeeded = totalShiftHours > 0 ? Math.ceil(totalShiftHours / maxOreGuardia) : 0; - - // Guardie totali necessarie (slot × min guardie contemporanee) - const totalGuardsNeeded = slotsNeeded * minGuardie; - // Guardie uniche assegnate (conta ogni guardia una volta anche se ha più turni) const uniqueGuardsAssigned = new Set(guardsWithHours.map((g: any) => g.guardId)).size; - // Guardie mancanti - const missingGuards = Math.max(0, totalGuardsNeeded - uniqueGuardsAssigned); + // Calcolo guardie necessarie e mancanti + let totalGuardsNeeded: number; + let missingGuards: number; + + if (totalShiftHours > 0) { + // Se ci sono turni: calcola basandosi sulle ore + // Slot necessari per coprire le ore totali + const slotsNeeded = Math.ceil(totalShiftHours / maxOreGuardia); + // Guardie totali necessarie (slot × min guardie contemporanee) + totalGuardsNeeded = slotsNeeded * minGuardie; + missingGuards = Math.max(0, totalGuardsNeeded - uniqueGuardsAssigned); + } else { + // Se NON ci sono turni: serve almeno la copertura minima + totalGuardsNeeded = minGuardie; + missingGuards = minGuardie; // Tutte mancanti perché non ci sono turni + } return { siteId: site.id, diff --git a/server/storage.ts b/server/storage.ts index ce1f4fb..98a46ee 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -163,32 +163,22 @@ export class DatabaseStorage implements IStorage { } async upsertUser(userData: UpsertUser): Promise { - // Check if user already exists by email (unique constraint) - const existingUser = await db - .select() - .from(users) - .where(eq(users.email, userData.email || '')) - .limit(1); - - if (existingUser.length > 0) { - // Update existing user - const [updated] = await db - .update(users) - .set({ - ...userData, + // Use onConflictDoUpdate to handle both insert and update cases + // This handles conflicts on both id (primary key) and email (unique constraint) + const [user] = await db + .insert(users) + .values(userData) + .onConflictDoUpdate({ + target: users.id, + set: { + email: userData.email, + name: userData.name, + role: userData.role, updatedAt: new Date(), - }) - .where(eq(users.email, userData.email || '')) - .returning(); - return updated; - } else { - // Insert new user - const [user] = await db - .insert(users) - .values(userData) - .returning(); - return user; - } + }, + }) + .returning(); + return user; } async getAllUsers(): Promise { diff --git a/version.json b/version.json index f7d8292..6a11071 100644 --- a/version.json +++ b/version.json @@ -1,7 +1,13 @@ { - "version": "1.0.20", - "lastUpdate": "2025-10-18T07:41:49.922Z", + "version": "1.0.21", + "lastUpdate": "2025-10-18T08:18:27.659Z", "changelog": [ + { + "version": "1.0.21", + "date": "2025-10-18", + "type": "patch", + "description": "Deployment automatico v1.0.21" + }, { "version": "1.0.20", "date": "2025-10-18",