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",