From 2ff22c4821d8fcd62b13269b122e3960d4c5134c Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Mon, 18 Aug 2025 10:17:24 +0000 Subject: [PATCH 1/2] Fix ticket assignment to ensure it's assigned to the user's store Correctly assigns SAV tickets to the user's group, resolving an issue where tickets were not being assigned to the creating user's store. Includes backend and frontend logic adjustments for accurate group assignment based on user roles and available groups. Replit-Commit-Author: Agent Replit-Commit-Session-Id: f9197b9b-a5b3-4469-a27d-930a9e9ee736 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/f9197b9b-a5b3-4469-a27d-930a9e9ee736/i2gFnxm --- client/src/pages/SavTickets.tsx | 31 ++++++++++++++++++++++++++++--- server/routes.ts | 17 ++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/client/src/pages/SavTickets.tsx b/client/src/pages/SavTickets.tsx index c2bc28a..45bf45e 100644 --- a/client/src/pages/SavTickets.tsx +++ b/client/src/pages/SavTickets.tsx @@ -265,14 +265,24 @@ export default function SavTickets() { // Get user's available groups for auto-assignment const getUserGroups = () => { if (!user || user.role === 'admin') { + console.log('🎫 [CLIENT] Admin user - can access all groups:', groupsData?.length || 0); return groupsData; // Admin can access all groups } // For other users, get their assigned groups const userGroups = (user as any).userGroups || []; - return groupsData.filter(group => + const filteredGroups = groupsData.filter(group => userGroups.some((ug: any) => ug.groupId === group.id) ); + + console.log('🎫 [CLIENT] Non-admin user groups:', { + userRole: user.role, + userUsername: user.username, + allUserGroups: userGroups, + filteredGroups: filteredGroups.map(g => ({ id: g.id, name: g.name })) + }); + + return filteredGroups; }; const availableGroups = getUserGroups(); @@ -288,12 +298,20 @@ export default function SavTickets() { return; } - // Auto-assign group if user has only one group or if admin didn't select one + // Auto-assign group based on user role and available groups let selectedGroupId = formData.groupId ? parseInt(formData.groupId) : null; + console.log('🎫 [CLIENT] User groups analysis:', { + userRole: user?.role, + formDataGroupId: formData.groupId, + availableGroups: availableGroups.map(g => ({ id: g.id, name: g.name })), + selectedGroupId + }); + if (!selectedGroupId && availableGroups.length > 0) { // Auto-assign first available group selectedGroupId = availableGroups[0].id; + console.log('🎫 [CLIENT] Auto-assigned group:', selectedGroupId, availableGroups[0].name); } const ticketData: InsertSavTicket = { @@ -311,7 +329,14 @@ export default function SavTickets() { clientPhone: formData.clientPhone || undefined, }; - console.log('Creating ticket with data:', ticketData); + console.log('🎫 [CLIENT] Creating ticket with data:', { + ...ticketData, + userInfo: { + role: user?.role, + username: user?.username, + availableGroups: availableGroups.length + } + }); createTicketMutation.mutate(ticketData); }; diff --git a/server/routes.ts b/server/routes.ts index b5cb5f2..f04ea4d 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -2688,8 +2688,8 @@ RÉSUMÉ DU SCAN return res.status(404).json({ message: "User not found" }); } - // Check permissions: admin, manager, directeur can create - if (!['admin', 'manager', 'directeur'].includes(user.role)) { + // Check permissions: admin, manager, directeur, employee can create + if (!['admin', 'manager', 'directeur', 'employee'].includes(user.role)) { return res.status(403).json({ message: "Insufficient permissions to create tickets" }); } @@ -2698,9 +2698,11 @@ RÉSUMÉ DU SCAN if (user.role === 'admin') { const allGroups = await storage.getGroups(); availableGroupIds = allGroups.map(g => g.id); + console.log(`🎫 [SAV] Admin ${user.username} can access all groups:`, availableGroupIds); } else { const userGroups = (user as any).userGroups; availableGroupIds = userGroups ? userGroups.map((ug: any) => ug.groupId) : []; + console.log(`🎫 [SAV] User ${user.username} (${user.role}) has groups:`, availableGroupIds); } if (availableGroupIds.length === 0) { @@ -2712,9 +2714,12 @@ RÉSUMÉ DU SCAN const ticketNumber = `SAV-${now.getFullYear()}${(now.getMonth() + 1).toString().padStart(2, '0')}${now.getDate().toString().padStart(2, '0')}-${Date.now().toString().slice(-6)}`; // Parse and validate request body + const assignedGroupId = req.body.groupId || availableGroupIds[0]; + console.log(`🎫 [SAV] Creating ticket for user ${user.username} with groupId: ${assignedGroupId} (requested: ${req.body.groupId}, available: ${availableGroupIds})`); + const ticketData = insertSavTicketSchema.parse({ ...req.body, - groupId: req.body.groupId || availableGroupIds[0], // Use first available group if not specified + groupId: assignedGroupId, // Use first available group if not specified createdBy: user.id, }); @@ -2730,6 +2735,12 @@ RÉSUMÉ DU SCAN } const ticket = await storage.createSavTicket(ticketDataWithNumber); + console.log(`🎫 [SAV] Ticket created successfully:`, { + ticketNumber: ticket.ticketNumber, + groupId: ticket.groupId, + createdBy: ticket.createdBy, + userRole: user.role + }); res.status(201).json(ticket); } catch (error) { console.error("Error creating SAV ticket:", error); From 2028f761f39b1e8790dcf0e74b9cd3ba4e5c61fb Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Mon, 18 Aug 2025 10:19:01 +0000 Subject: [PATCH 2/2] Limit SAV ticket creation to administrative roles Adjust SAV ticket creation permissions on both frontend and backend to restrict the 'employee' role, allowing only 'admin', 'directeur', and 'manager' roles to create tickets. Replit-Commit-Author: Agent Replit-Commit-Session-Id: f9197b9b-a5b3-4469-a27d-930a9e9ee736 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/f9197b9b-a5b3-4469-a27d-930a9e9ee736/i2gFnxm --- client/src/pages/SavTickets.tsx | 3 ++- server/routes.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/client/src/pages/SavTickets.tsx b/client/src/pages/SavTickets.tsx index 45bf45e..d1799b2 100644 --- a/client/src/pages/SavTickets.tsx +++ b/client/src/pages/SavTickets.tsx @@ -259,6 +259,7 @@ export default function SavTickets() { // Check permissions AFTER all hooks are called const canView = ['admin', 'directeur', 'manager', 'employee'].includes(user?.role || ''); + const canCreate = ['admin', 'directeur', 'manager'].includes(user?.role || ''); // Employee can only view const canModify = ['admin', 'directeur', 'manager'].includes(user?.role || ''); const canDelete = ['admin', 'directeur'].includes(user?.role || ''); @@ -436,7 +437,7 @@ export default function SavTickets() {
Gestion des tickets SAV et suivi des réparations
- {canModify && ( + {canCreate && (