diff --git a/client/src/components/modals/ReconciliationModal.tsx b/client/src/components/modals/ReconciliationModal.tsx index 13a5e26..f0275b9 100644 --- a/client/src/components/modals/ReconciliationModal.tsx +++ b/client/src/components/modals/ReconciliationModal.tsx @@ -77,19 +77,9 @@ export default function ReconciliationModal({ const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - - // Validation basique - if (!formData.blNumber.trim()) { - toast({ - title: "Erreur", - description: "Le numéro de BL est requis", - variant: "destructive", - }); - return; - } updateDeliveryMutation.mutate({ - blNumber: formData.blNumber.trim(), + blNumber: formData.blNumber.trim() || null, blAmount: formData.blAmount ? formData.blAmount.toString() : null, invoiceReference: formData.invoiceReference.trim() || null, invoiceAmount: formData.invoiceAmount ? formData.invoiceAmount.toString() : null, @@ -97,17 +87,8 @@ export default function ReconciliationModal({ }; const handleValidateReconciliation = () => { - if (!formData.blNumber.trim()) { - toast({ - title: "Erreur", - description: "Veuillez d'abord renseigner le numéro de BL", - variant: "destructive", - }); - return; - } - updateDeliveryMutation.mutate({ - blNumber: formData.blNumber.trim(), + blNumber: formData.blNumber.trim() || null, blAmount: formData.blAmount ? formData.blAmount.toString() : null, invoiceReference: formData.invoiceReference.trim() || null, invoiceAmount: formData.invoiceAmount ? formData.invoiceAmount.toString() : null, @@ -117,7 +98,7 @@ export default function ReconciliationModal({ }; const isAutomaticMode = delivery?.supplier?.automaticReconciliation; - const canValidate = formData.blNumber.trim().length > 0; + const canValidate = true; // Plus de restriction sur le numéro BL return ( @@ -176,13 +157,12 @@ export default function ReconciliationModal({

Bon de Livraison (BL)

- + setFormData(prev => ({ ...prev, blNumber: e.target.value }))} - placeholder="Ex: BL-2025-001" - required + placeholder="Ex: BL-2025-001 (optionnel)" />
@@ -263,8 +243,8 @@ export default function ReconciliationModal({ {/* Note d'aide */}
- Note : Le numéro de BL est obligatoire pour valider un rapprochement. - Les montants sont optionnels mais recommandés pour un suivi précis. + Note : Tous les champs sont optionnels. + Les données BL et facture sont recommandées pour un suivi précis mais pas obligatoires.
diff --git a/client/src/components/modals/ValidateDeliveryModal.tsx b/client/src/components/modals/ValidateDeliveryModal.tsx index 8de83c5..2966d1e 100644 --- a/client/src/components/modals/ValidateDeliveryModal.tsx +++ b/client/src/components/modals/ValidateDeliveryModal.tsx @@ -13,7 +13,7 @@ import { isUnauthorizedError } from "@/lib/authUtils"; import { Check, X } from "lucide-react"; const validateDeliverySchema = z.object({ - blNumber: z.string().min(1, "Le numéro de BL est obligatoire"), + blNumber: z.string().optional(), blAmount: z.string().optional(), }); @@ -45,9 +45,12 @@ export default function ValidateDeliveryModal({ const validateDeliveryMutation = useMutation({ mutationFn: async (data: ValidateDeliveryForm) => { - const payload: any = { - blNumber: data.blNumber, - }; + const payload: any = {}; + + // Ajouter blNumber seulement s'il est fourni + if (data.blNumber && data.blNumber.trim() !== '') { + payload.blNumber = data.blNumber.trim(); + } if (data.blAmount && data.blAmount.trim() !== '') { payload.blAmount = parseFloat(data.blAmount); @@ -134,10 +137,10 @@ export default function ValidateDeliveryModal({ name="blNumber" render={({ field }) => ( - N° Bon de Livraison * + N° Bon de Livraison diff --git a/client/src/pages/BLReconciliation.tsx b/client/src/pages/BLReconciliation.tsx index e406ce3..5822bb4 100644 --- a/client/src/pages/BLReconciliation.tsx +++ b/client/src/pages/BLReconciliation.tsx @@ -90,11 +90,15 @@ export default function BLReconciliation() { // Auto-remplissage si facture trouvée via BL if (result.exists && result.matchType === 'bl_number' && result.invoiceReference) { - // Auto-remplir les champs dans la livraison - updateDeliveryMutation.mutate({ - id: variables.deliveryId, + // Auto-remplir les champs dans la livraison via API + apiRequest(`/api/deliveries/${variables.deliveryId}`, "PUT", { invoiceReference: result.invoiceReference, invoiceAmount: result.invoiceAmount + }).then(() => { + queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); + }).catch((error) => { + console.error('Erreur auto-remplissage:', error); }); } @@ -263,17 +267,11 @@ export default function BLReconciliation() { setIsModalOpen(false); }; - const handleSaveReconciliation = async (data: any) => { + const handleSaveReconciliation = async () => { try { - await apiRequest(`/api/deliveries/${selectedDelivery.id}`, "PUT", data); - - toast({ - title: "Succès", - description: "Données de rapprochement mises à jour", - }); - // Invalidation cache + refetch forcé pour mise à jour immédiate queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); refetch(); handleCloseModal(); } catch (error) { @@ -720,18 +718,12 @@ export default function BLReconciliation() { {(delivery.group?.nocodbTableName || delivery.group?.nocodbConfigId || delivery.group?.webhookUrl) && (
{verifyingDeliveries.has(delivery.id) ? ( - + ) : verificationResults[delivery.id] ? ( verificationResults[delivery.id].exists ? ( - + ) : ( - + ) ) : (