import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { useQuery } from "@tanstack/react-query"; import { useAuthUnified } from "@/hooks/useAuthUnified"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Checkbox } from "@/components/ui/checkbox"; import { insertCustomerOrderFrontendSchema, type CustomerOrderWithRelations, type Group, type Supplier } from "@shared/schema"; import { useStore } from "@/components/Layout"; const customerOrderFormSchema = z.object({ orderTaker: z.string().min(1, "Qui a pris la commande est requis"), customerName: z.string().min(1, "Nom du client est requis"), contactNumber: z.string().optional(), productName: z.string().min(1, "Désignation du produit est requise"), productReference: z.string().optional(), gencode: z.string().optional(), quantity: z.coerce.number().int().positive().default(1), supplierId: z.coerce.number().int().positive().default(1), groupId: z.coerce.number().int().positive(), deposit: z.coerce.number().default(0), isPromotionalPrice: z.boolean().default(false), customerNotified: z.boolean().default(false), notes: z.string().optional(), customerEmail: z.string().optional(), }); type CustomerOrderFormData = z.infer; interface CustomerOrderFormProps { order?: CustomerOrderWithRelations; onSubmit: (data: CustomerOrderFormData) => void; onCancel: () => void; isLoading?: boolean; } const STATUS_OPTIONS = [ "En attente de Commande", "Commande en Cours", "Disponible", "Retiré", "Annulé" ]; export function CustomerOrderForm({ order, onSubmit, onCancel, isLoading = false }: CustomerOrderFormProps) { const { user } = useAuthUnified(); const { selectedStoreId } = useStore(); // DEBUG: Log user data to see what we actually receive console.log("🔍 FRONTEND USER DEBUG:", { user: user, userRole: user?.role, userGroups: user?.userGroups, userGroupsType: typeof user?.userGroups, userGroupsLength: user?.userGroups?.length, fullUserObject: JSON.stringify(user, null, 2) }); // Fetch groups for store selection const { data: groups = [] } = useQuery({ queryKey: ['/api/groups'], }); // Fetch suppliers for supplier selection const { data: suppliers = [] } = useQuery({ queryKey: ['/api/suppliers'], }); // Get user's assigned group automatically - no selection needed const getUserAssignedGroupId = () => { // Priority 1: User's first assigned group (employees have exactly one group) if (user?.userGroups?.[0]?.groupId) { return user.userGroups[0].groupId; } // Priority 2: Admin can use selected store if (user?.role === 'admin' && selectedStoreId) { return selectedStoreId; } // Priority 3: Admin gets first available group if no store selected if (user?.role === 'admin' && groups.length > 0) { return groups[0].id; } return null; }; const form = useForm({ resolver: zodResolver(customerOrderFormSchema), defaultValues: { orderTaker: order?.orderTaker || user?.name || "", customerName: order?.customerName || "", contactNumber: order?.customerPhone || "", productName: order?.productDesignation || "", productReference: order?.productReference || "", gencode: order?.gencode || "", quantity: order?.quantity || 1, supplierId: order?.supplierId || 1, status: "En attente de Commande", // Statut fixe deposit: order?.deposit || 0, isPromotionalPrice: order?.isPromotionalPrice || false, customerNotified: order?.customerNotified || false, groupId: order?.groupId || getUserAssignedGroupId() || 1, }, }); const handleSubmit = (data: CustomerOrderFormData) => { console.log("🚀 FORM SUBMIT STARTED"); console.log("📝 Form submission data:", data); console.log("🔍 Form errors:", form.formState.errors); console.log("✅ Form is valid:", form.formState.isValid); console.log("👤 User context DETAILED:", { role: user?.role, userGroups: user?.userGroups, userGroupsLength: user?.userGroups?.length, userGroupsData: user?.userGroups?.map(ug => ({ groupId: ug.groupId, group: ug.group, fullObject: ug })), selectedStoreId, fullUser: user }); // Validate required fields if (!data.customerName || data.customerName.trim() === '') { console.error("❌ Customer name is required but empty"); return; } // Always use user's assigned group - no override needed const groupId = getUserAssignedGroupId(); if (!groupId) { console.error("❌❌❌ CRITICAL: No group available for user:", { role: user?.role, userGroups: user?.userGroups, userGroupsCount: user?.userGroups?.length, selectedStoreId, getUserAssignedGroupIdResult: groupId }); alert("ERREUR: Votre utilisateur n'a pas de magasin assigné. Contactez l'administrateur."); return; } console.log("✅ Customer Order: Using assigned group:", groupId, "for user:", user?.role); // Prepare final data with user's assigned group const submitData = { orderTaker: data.orderTaker || user?.firstName + ' ' + user?.lastName || user?.username || "Inconnu", customerName: data.customerName.trim(), customerPhone: data.contactNumber || '', customerEmail: data.customerEmail || '', productDesignation: data.productName || '', productReference: data.productReference || '', gencode: data.gencode || '', quantity: data.quantity, supplierId: data.supplierId || 1, status: data.status || "En attente de Commande", deposit: data.deposit || 0, isPromotionalPrice: data.isPromotionalPrice || false, customerNotified: data.customerNotified || false, notes: data.notes || '', groupId: groupId, // Always use the assigned group }; console.log("✅ Customer Order Submit FINAL:", { userRole: user?.role, assignedGroupId: groupId, submitData: submitData }); console.log("🔥 CALLING onSubmit with data:", submitData); onSubmit(submitData); console.log("🔥 onSubmit CALLED"); }; // Auto-ensure groupId is always set to user's assigned group const currentGroupId = form.getValues('groupId'); const userGroupId = getUserAssignedGroupId(); if (!currentGroupId && userGroupId) { form.setValue('groupId', userGroupId); console.log("🏪 Auto-setting user's assigned group:", userGroupId); } return (
{/* Informations de commande */}

Informations de commande

( Qui a pris la commande )} /> ( Nom du client )} /> ( N° de téléphone )} /> ( Fournisseur )} /> {/* Magasin automatiquement assigné selon l'utilisateur */}

Informations produit

( Désignation du produit