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 { insertCustomerOrderSchema, type CustomerOrderWithRelations, type Group, type Supplier } from "@shared/schema"; import { useStore } from "@/components/Layout"; const customerOrderFormSchema = insertCustomerOrderSchema.extend({ deposit: z.string().optional(), gencode: z.string().min(1, "Le gencode est obligatoire"), customerName: z.string().min(1, "Le nom du client est obligatoire"), quantity: z.union([z.string(), z.number()]).transform(val => typeof val === 'string' ? parseInt(val) || 1 : val), supplierId: z.union([z.string(), z.number()]).transform(val => typeof val === 'string' ? parseInt(val) : val), groupId: z.union([z.string(), z.number()]).transform(val => typeof val === 'string' ? parseInt(val) : val).optional(), createdBy: z.string().optional(), // Will be set automatically }); 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'], }); const form = useForm({ resolver: zodResolver(customerOrderFormSchema), defaultValues: { orderTaker: order?.orderTaker || user?.name || "", customerName: order?.customerName || "", customerPhone: order?.customerPhone || "", productDesignation: 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 ? order.deposit.toString() : "0", isPromotionalPrice: order?.isPromotionalPrice || false, customerNotified: order?.customerNotified || false, groupId: order?.groupId || (user?.role === 'admin' && selectedStoreId ? selectedStoreId : user?.userGroups?.[0]?.groupId) || undefined, // Respect admin store selection }, }); 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 - prioritize selectedStoreId for admins let groupId = data.groupId; if (!groupId) { if (user?.role === 'admin' && selectedStoreId) { // Admin has selected a specific store - use it groupId = selectedStoreId; console.log("🏪 Using admin selected store:", selectedStoreId); } else if (user?.userGroups?.[0]?.groupId) { groupId = user.userGroups[0].groupId; } else if (user?.role === 'admin' && groups.length > 0) { groupId = groups[0].id; // Admin in "tous magasins" mode - use first group } } if (!groupId) { console.error("No groupId available - user groups:", user?.userGroups, "available groups:", groups); return; } // Prepare data with proper types const submitData = { ...data, customerName: data.customerName.trim(), // Clean the customer name deposit: data.deposit || "0.00", // Keep as string for decimal field groupId: typeof groupId === 'number' ? groupId : parseInt(groupId.toString()), createdBy: user?.id || '', // Add the current user ID }; console.log("Processed submit data:", submitData); 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