import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { useToast } from '@/hooks/use-toast'; import { useAuth } from '@/hooks/useAuth'; import { useStoreContext } from '@/hooks/useStoreContext'; import { apiRequest } from '@/lib/queryClient'; import { validateRequiredFields, validateEAN13, ARTICLE_CATEGORY_MAPPING, IDENTITY_TYPES } from '@/lib/validation'; import { Package, User, Users, Save, X } from 'lucide-react'; interface FormData { vendeur: string; dateVente: string; typeArticle: string; categorie: string; quantite: string; gencode: string; nom: string; prenom: string; dateNaissance: string; lieuNaissance: string; typeIdentite: string; numeroIdentite: string; autoriteDelivrance: string; dateDelivrance: string; } export default function NewSaleForm() { const { toast } = useToast(); const queryClient = useQueryClient(); const { user } = useAuth(); const { selectedStoreId } = useStoreContext(); const [isSubmitting, setIsSubmitting] = useState(false); const form = useForm({ defaultValues: { vendeur: '', dateVente: new Date().toISOString().split('T')[0], typeArticle: '', categorie: '', quantite: '', gencode: '', nom: '', prenom: '', dateNaissance: '', lieuNaissance: '', typeIdentite: '', numeroIdentite: '', autoriteDelivrance: '', dateDelivrance: '', } }); const typeArticle = form.watch('typeArticle'); const availableCategories = typeArticle ? ARTICLE_CATEGORY_MAPPING[typeArticle as keyof typeof ARTICLE_CATEGORY_MAPPING] || [] : []; const createSaleMutation = useMutation({ mutationFn: async (saleData: any) => { const dataToSend = { ...saleData, // Include storeId for admin users ...(user?.role === 'admin' && selectedStoreId && { storeId: selectedStoreId }) }; const response = await apiRequest('/api/sales', { method: 'POST', body: JSON.stringify(dataToSend), }); return response.json(); }, onSuccess: () => { // Invalidate all sales queries to refresh the history queryClient.invalidateQueries({ queryKey: ['/api/sales'], exact: false }); toast({ title: "Vente enregistrée", description: "La vente a été enregistrée avec succès", }); form.reset({ vendeur: '', dateVente: new Date().toISOString().split('T')[0], typeArticle: '', categorie: '', quantite: '', gencode: '', nom: '', prenom: '', dateNaissance: '', lieuNaissance: '', typeIdentite: '', numeroIdentite: '', autoriteDelivrance: '', dateDelivrance: '', }); }, onError: (error: any) => { toast({ title: "Erreur", description: error.message || "Erreur lors de l'enregistrement de la vente", variant: "destructive", }); }, }); const onSubmit = async (data: FormData) => { try { setIsSubmitting(true); // Validate required fields const missingFields = validateRequiredFields(data); if (missingFields.length > 0) { toast({ title: "Champs manquants", description: `Veuillez remplir: ${missingFields.join(', ')}`, variant: "destructive", }); return; } // Validate EAN13 if (!validateEAN13(data.gencode)) { toast({ title: "Code EAN13 invalide", description: "Le gencode doit être un code EAN13 valide à 13 chiffres", variant: "destructive", }); return; } const saleData = { vendeur: data.vendeur, dateVente: data.dateVente, typeArticle: data.typeArticle, categorie: data.categorie as 'F2' | 'F3', quantite: parseInt(data.quantite), gencode: data.gencode, nom: data.nom, prenom: data.prenom, dateNaissance: data.dateNaissance, lieuNaissance: data.lieuNaissance || undefined, typeIdentite: data.typeIdentite, numeroIdentite: data.numeroIdentite, autoriteDelivrance: data.autoriteDelivrance, dateDelivrance: data.dateDelivrance, }; await createSaleMutation.mutateAsync(saleData); } catch (error) { console.error('Sale creation error:', error); } finally { setIsSubmitting(false); } }; return (
Nouvelle Vente

Enregistrement d'une vente de feux d'artifice

{/* Seller Information */}

Informations Vendeur

( Vendeur * )} /> ( Date de vente )} />
{/* Product Information */}

Informations Produit

( Type d'article * )} /> ( Catégorie réglementaire * )} /> ( Quantité * )} /> ( Gencode (EAN13) * )} />
Information réglementaire :
  • • F1 : petits artifices (clac-doigts, mini-fontaines), accessibles dès 12 ans.
  • • F2, F3 : artifices plus puissants, vente et utilisation réservées aux majeurs.
{/* Customer Information */}

Informations Client

( Nom de famille * )} /> ( Prénom * )} /> ( Date de naissance * )} /> ( Lieu de naissance )} />
{/* Identity Information */}

Pièce d'Identité

( Type de pièce d'identité * )} /> ( Numéro de pièce d'identité * )} /> ( Autorité de délivrance * )} /> ( Date de délivrance * )} />
{/* Form Actions */}
); }