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 = insertCustomerOrderFrontendSchema.extend({ groupId: z.coerce.number().int().positive().optional(), createdBy: 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(); // Fetch groups for store selection const { data: groups = [] } = useQuery({ queryKey: ['/api/groups'], }); // Fetch suppliers for supplier selection const { data: suppliers = [] } = useQuery({ queryKey: ['/api/suppliers'], }); // Calculate correct groupId with PRIORITY for user's assigned group const getDefaultGroupId = () => { if (order?.groupId) return order.groupId; // PRIORITY 1: User's assigned group (works for employees assigned to specific stores) if (user?.userGroups?.[0]?.groupId) { console.log("🎯 CustomerOrderForm defaultValue: Using user's assigned group:", user.userGroups[0].groupId); return user.userGroups[0].groupId; } // PRIORITY 2: Admin selected store (only if no assigned group) if (user?.role === 'admin' && selectedStoreId) { console.log("🎯 CustomerOrderForm defaultValue: Using admin selected store:", selectedStoreId); return selectedStoreId; } // FALLBACK: Default to 1 console.log("🚨 CustomerOrderForm defaultValue: Using fallback groupId 1"); return 1; }; 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 || undefined, status: "En attente de Commande", // Statut fixe deposit: order?.deposit || 0, isPromotionalPrice: order?.isPromotionalPrice || false, customerNotified: order?.customerNotified || false, groupId: getDefaultGroupId(), // ✅ PRIORITÉ CORRECTE APPLIQUÉE }, }); const handleSubmit = (data: CustomerOrderFormData) => { console.log("Form submission data:", data); console.log("Form errors:", form.formState.errors); console.log("Form is valid:", form.formState.isValid); // Validate required fields if (!data.customerName || data.customerName.trim() === '') { console.error("Customer name is required but empty"); return; } // Ensure groupId is set - force assignment for ALL users let groupId = data.groupId; console.log("🔍 CUSTOMER ORDER FRONTEND DEBUG - Complete user data:", { userRole: user?.role, selectedStoreId, userHasGroups: !!user?.userGroups, userGroupsLength: user?.userGroups?.length, userGroups: user?.userGroups?.map(ug => ({ groupId: ug.groupId || ug.group?.id, groupName: ug.group?.name, fullGroupData: ug })), initialGroupId: groupId, availableGroups: groups.map(g => ({id: g.id, name: g.name})), fullUserObject: user }); // Override groupId if needed (defaultValues might be calculated before userGroups is loaded) if (!groupId || groupId === 1) { if (user?.userGroups?.[0]?.groupId) { groupId = user.userGroups[0].groupId; console.log("🔧 Customer Order Override: Using user's assigned group:", groupId); } else if (user?.role === 'admin' && selectedStoreId) { groupId = selectedStoreId; console.log("🔧 Customer Order Override: Using admin selected store:", groupId); } } console.log("✅ Customer Order: Final groupId after override check:", groupId); console.log("✅ CUSTOMER ORDER - Final groupId selected:", groupId, typeof groupId); // Prepare data with proper types for frontend schema const submitData = { customerName: data.customerName.trim(), contactNumber: data.contactNumber || '', productName: data.productName || '', quantity: data.quantity, groupId: typeof groupId === 'number' ? groupId : parseInt(groupId.toString()), isPickup: false, notes: data.notes, deposit: data.deposit || 0, isPromotionalPrice: data.isPromotionalPrice || false, customerEmail: data.customerEmail, gencode: data.gencode || '', supplierId: data.supplierId || 1, }; console.log("🔍 CUSTOMER ORDER - Frontend submit data final:", submitData); console.log("🔍 CUSTOMER ORDER - Submit data groupId:", submitData.groupId, typeof submitData.groupId); onSubmit(submitData); }; // Get available groups for the user const availableGroups = user?.role === 'admin' ? groups : user?.userGroups?.map(ug => ug.group) || []; // Auto-select group for users respecting admin store selection const currentGroupId = form.getValues('groupId'); if (!currentGroupId) { if (user?.role === 'admin' && selectedStoreId) { // Admin has selected a specific store - use it form.setValue('groupId', selectedStoreId); console.log("🏪 Auto-selecting admin store:", selectedStoreId); } else if (user?.userGroups?.[0]?.groupId) { // User has assigned groups - use first one form.setValue('groupId', user.userGroups[0].groupId); } else if (user?.role === 'admin' && groups.length > 0) { // Admin with no specific groups - use first available group form.setValue('groupId', groups[0].id); } } return (
{/* Informations de commande */}

Informations de commande

( Qui a pris la commande )} /> ( Nom du client )} /> ( N° de téléphone )} /> ( Fournisseur )} /> {/* Magasin automatiquement sélectionné - pas de champ visible */}

Informations produit

( Désignation du produit