mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-21 05:58:23 +02:00
2 files changed
+43
-6
No files matched your search
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in new issue
Block a user