Merge pull request #212 from R0m1k3/1.1

1.1
This commit is contained in:
LogiFlow authored and GitHub committed 2025-08-18 12:19:36 +02:00
commit 63ecc97318
2 files changed
+43 -6

No files matched your search

+30 -4
View File
@@ -259,20 +259,31 @@ export default function SavTickets() {
// Check permissions AFTER all hooks are called // Check permissions AFTER all hooks are called
const canView = ['admin', 'directeur', 'manager', 'employee'].includes(user?.role || ''); 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 canModify = ['admin', 'directeur', 'manager'].includes(user?.role || '');
const canDelete = ['admin', 'directeur'].includes(user?.role || ''); const canDelete = ['admin', 'directeur'].includes(user?.role || '');
// Get user's available groups for auto-assignment // Get user's available groups for auto-assignment
const getUserGroups = () => { const getUserGroups = () => {
if (!user || user.role === 'admin') { if (!user || user.role === 'admin') {
console.log('🎫 [CLIENT] Admin user - can access all groups:', groupsData?.length || 0);
return groupsData; // Admin can access all groups return groupsData; // Admin can access all groups
} }
// For other users, get their assigned groups // For other users, get their assigned groups
const userGroups = (user as any).userGroups || []; const userGroups = (user as any).userGroups || [];
return groupsData.filter(group => const filteredGroups = groupsData.filter(group =>
userGroups.some((ug: any) => ug.groupId === group.id) 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(); const availableGroups = getUserGroups();
@@ -288,12 +299,20 @@ export default function SavTickets() {
return; 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; 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) { if (!selectedGroupId && availableGroups.length > 0) {
// Auto-assign first available group // Auto-assign first available group
selectedGroupId = availableGroups[0].id; selectedGroupId = availableGroups[0].id;
console.log('🎫 [CLIENT] Auto-assigned group:', selectedGroupId, availableGroups[0].name);
} }
const ticketData: InsertSavTicket = { const ticketData: InsertSavTicket = {
@@ -311,7 +330,14 @@ export default function SavTickets() {
clientPhone: formData.clientPhone || undefined, 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); createTicketMutation.mutate(ticketData);
}; };
@@ -411,7 +437,7 @@ export default function SavTickets() {
<h1 className="text-2xl sm:text-3xl font-bold text-gray-900">Service Après-Vente</h1> <h1 className="text-2xl sm:text-3xl font-bold text-gray-900">Service Après-Vente</h1>
<p className="text-gray-600 mt-1">Gestion des tickets SAV et suivi des réparations</p> <p className="text-gray-600 mt-1">Gestion des tickets SAV et suivi des réparations</p>
</div> </div>
{canModify && ( {canCreate && (
<Dialog open={showCreateModal} onOpenChange={setShowCreateModal}> <Dialog open={showCreateModal} onOpenChange={setShowCreateModal}>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button className="w-full sm:w-auto"> <Button className="w-full sm:w-auto">
+13 -2
View File
@@ -2688,7 +2688,7 @@ RÉSUMÉ DU SCAN
return res.status(404).json({ message: "User not found" }); return res.status(404).json({ message: "User not found" });
} }
// Check permissions: admin, manager, directeur can create // Check permissions: admin, manager, directeur can create (employee can only view)
if (!['admin', 'manager', 'directeur'].includes(user.role)) { if (!['admin', 'manager', 'directeur'].includes(user.role)) {
return res.status(403).json({ message: "Insufficient permissions to create tickets" }); return res.status(403).json({ message: "Insufficient permissions to create tickets" });
} }
@@ -2698,9 +2698,11 @@ RÉSUMÉ DU SCAN
if (user.role === 'admin') { if (user.role === 'admin') {
const allGroups = await storage.getGroups(); const allGroups = await storage.getGroups();
availableGroupIds = allGroups.map(g => g.id); availableGroupIds = allGroups.map(g => g.id);
console.log(`🎫 [SAV] Admin ${user.username} can access all groups:`, availableGroupIds);
} else { } else {
const userGroups = (user as any).userGroups; const userGroups = (user as any).userGroups;
availableGroupIds = userGroups ? userGroups.map((ug: any) => ug.groupId) : []; availableGroupIds = userGroups ? userGroups.map((ug: any) => ug.groupId) : [];
console.log(`🎫 [SAV] User ${user.username} (${user.role}) has groups:`, availableGroupIds);
} }
if (availableGroupIds.length === 0) { 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)}`; 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 // 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({ const ticketData = insertSavTicketSchema.parse({
...req.body, ...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, createdBy: user.id,
}); });
@@ -2730,6 +2735,12 @@ RÉSUMÉ DU SCAN
} }
const ticket = await storage.createSavTicket(ticketDataWithNumber); 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); res.status(201).json(ticket);
} catch (error) { } catch (error) {
console.error("Error creating SAV ticket:", error); console.error("Error creating SAV ticket:", error);