From 9f09cec2094a1568544bac87e929278ef109679a Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Tue, 12 Aug 2025 11:22:41 +0000 Subject: [PATCH] Add validation, deletion, and devalidation options for delivery reconciliation Implement new API endpoints and frontend logic for delivery reconciliation, allowing admins and directors to validate and delete deliveries, and admins to devalidate them. Replit-Commit-Author: Agent Replit-Commit-Session-Id: b163d4c0-de5e-4f4e-a9c0-aed4c7049718 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/b163d4c0-de5e-4f4e-a9c0-aed4c7049718/EsLIknD --- client/src/pages/BLReconciliation.tsx | 223 ++++++++++++++++++++++---- 1 file changed, 191 insertions(+), 32 deletions(-) diff --git a/client/src/pages/BLReconciliation.tsx b/client/src/pages/BLReconciliation.tsx index 8566a08..d9c09ee 100644 --- a/client/src/pages/BLReconciliation.tsx +++ b/client/src/pages/BLReconciliation.tsx @@ -9,7 +9,8 @@ import { useToast } from "@/hooks/use-toast"; import { apiRequest } from "@/lib/queryClient"; import { useStore } from "@/components/Layout"; import { useAuthUnified } from "@/hooks/useAuthUnified"; -import { Search, Edit, FileText, Settings, Eye, AlertTriangle, X } from "lucide-react"; +import { usePermissions } from "@shared/permissions"; +import { Search, Edit, FileText, Settings, Eye, AlertTriangle, X, Check, Trash2, Ban } from "lucide-react"; export default function BLReconciliation() { const { user } = useAuthUnified(); @@ -81,17 +82,126 @@ export default function BLReconciliation() { return supplier?.automaticReconciliation; }); - // Fonction pour dévalider un rapprochement automatique (directeurs et admins uniquement) - const handleDevalidateAutoReconciliation = async (deliveryId: number) => { - if (user?.role !== 'directeur' && user?.role !== 'admin') { + // Fonction pour valider un rapprochement (admins et directeurs) + const handleValidateReconciliation = async (deliveryId: number) => { + if (!permissions.canValidate('reconciliation')) { toast({ title: "Accès refusé", - description: "Seuls les directeurs et administrateurs peuvent dévalider les rapprochements automatiques", + description: "Vous n'avez pas les permissions pour valider les rapprochements", variant: "destructive", }); return; } + if (!window.confirm("Êtes-vous sûr de vouloir valider ce rapprochement ?")) { + return; + } + + try { + await apiRequest(`/api/deliveries/${deliveryId}`, "PUT", { + reconciled: true, + validatedAt: new Date().toISOString() + }); + + toast({ + title: "Succès", + description: "Rapprochement validé avec succès", + }); + + queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + } catch (error) { + toast({ + title: "Erreur", + description: "Impossible de valider le rapprochement", + variant: "destructive", + }); + } + }; + + // Fonction pour dévalider un rapprochement (admins uniquement) + const handleDevalidateReconciliation = async (deliveryId: number) => { + if (user?.role !== 'admin') { + toast({ + title: "Accès refusé", + description: "Seuls les administrateurs peuvent dévalider les rapprochements", + variant: "destructive", + }); + return; + } + + if (!window.confirm("Êtes-vous sûr de vouloir dévalider ce rapprochement ?")) { + return; + } + + try { + await apiRequest(`/api/deliveries/${deliveryId}`, "PUT", { + reconciled: false, + validatedAt: null + }); + + toast({ + title: "Succès", + description: "Rapprochement dévalidé avec succès", + }); + + queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + } catch (error) { + toast({ + title: "Erreur", + description: "Impossible de dévalider le rapprochement", + variant: "destructive", + }); + } + }; + + // Fonction pour supprimer une livraison (admins uniquement) + const handleDeleteDelivery = async (deliveryId: number) => { + if (!permissions.canDelete('reconciliation')) { + toast({ + title: "Accès refusé", + description: "Seuls les administrateurs peuvent supprimer les livraisons", + variant: "destructive", + }); + return; + } + + if (!window.confirm("Êtes-vous sûr de vouloir supprimer cette livraison ? Cette action est irréversible.")) { + return; + } + + try { + await apiRequest(`/api/deliveries/${deliveryId}`, "DELETE"); + + toast({ + title: "Succès", + description: "Livraison supprimée avec succès", + }); + + queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + } catch (error) { + toast({ + title: "Erreur", + description: "Impossible de supprimer la livraison", + variant: "destructive", + }); + } + }; + + // Fonction pour dévalider un rapprochement automatique (admins uniquement) + const handleDevalidateAutoReconciliation = async (deliveryId: number) => { + if (user?.role !== 'admin') { + toast({ + title: "Accès refusé", + description: "Seuls les administrateurs peuvent dévalider les rapprochements automatiques", + variant: "destructive", + }); + return; + } + + if (!window.confirm("Êtes-vous sûr de vouloir dévalider ce rapprochement automatique ?")) { + return; + } + try { await apiRequest(`/api/deliveries/${deliveryId}`, "PUT", { reconciled: false, @@ -235,7 +345,12 @@ export default function BLReconciliation() {
{filteredManualDeliveries.map((delivery: any) => ( -Les livraisons de fournisseurs en mode automatique sont validées automatiquement lorsqu'elles ont le statut "delivered" et un numéro de BL. - {canModify ? ( + {user?.role === 'admin' ? ( " Vous pouvez dévalider ces rapprochements si nécessaire." ) : ( - " Seuls les directeurs et administrateurs peuvent modifier ces rapprochements." + " Seuls les administrateurs peuvent dévalider ces rapprochements." )}
@@ -367,7 +529,12 @@ export default function BLReconciliation() {