import React, { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { safeFormat } from "@/lib/dateUtils"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useToast } from "@/hooks/use-toast"; import { apiRequest } from "@/lib/queryClient"; import { useStore } from "@/components/Layout"; import { useAuthUnified } from "@/hooks/useAuthUnified"; import { usePermissions } from "@shared/permissions"; import { Search, Edit, FileText, Settings, Eye, AlertTriangle, X, Check, Trash2, Ban } from "lucide-react"; import ReconciliationModal from "@/components/modals/ReconciliationModal"; export default function BLReconciliation() { const { user } = useAuthUnified(); const { selectedStoreId } = useStore(); const { toast } = useToast(); const queryClient = useQueryClient(); const permissions = usePermissions(user?.role); // Redirection pour les employés if (user?.role === 'employee') { return (
Accès restreint
Seuls les managers et administrateurs peuvent accéder au module de rapprochement BL/Factures.
Gestion des rapprochements manuels et automatiques
Les livraisons de fournisseurs en mode manuel apparaîtront ici.
| Fournisseur | N° BL | Date Livr. | Montant BL | Ref. Facture | Montant Fact. | Écart | Magasin | Actions |
|---|---|---|---|---|---|---|---|---|
|
{delivery.supplier?.name}
|
{delivery.blNumber || (
Non renseigné
)}
|
{safeFormat(delivery.scheduledDate, 'dd/MM/yy')}
|
{delivery.blAmount ?
`${parseFloat(delivery.blAmount).toFixed(2)}€` :
Non renseigné
}
|
{delivery.invoiceReference || (
Non renseigné
)}
|
{delivery.invoiceAmount ?
`${parseFloat(delivery.invoiceAmount).toFixed(2)}€` :
Non renseigné
}
|
{(() => {
const blAmount = delivery.blAmount ? parseFloat(delivery.blAmount) : 0;
const invoiceAmount = delivery.invoiceAmount ? parseFloat(delivery.invoiceAmount) : 0;
if (blAmount && invoiceAmount) {
const diff = blAmount - invoiceAmount;
const diffAbs = Math.abs(diff);
return (
10 ? 'text-red-600' : 'text-orange-600'
}`}>
{diff > 0 ? '+' : ''}{diff.toFixed(2)}€
);
}
return -;
})()}
|
{delivery.group?.name}
|
{/* Actions selon le statut de rapprochement et les permissions */}
{!delivery.reconciled ? (
// Livraison non rapprochée : Valider + Supprimer
<>
{permissions.canValidate('reconciliation') && (
)}
{permissions.canDelete('reconciliation') && (
)}
>
) : (
// Livraison rapprochée : Dévalider (admin seulement) + Supprimer
<>
{user?.role === 'admin' && (
)}
{permissions.canDelete('reconciliation') && (
)}
>
)}
{/* Bouton Modifier : disponible seulement si pas encore validé */}
{!delivery.reconciled && (
)}
|
Les livraisons de fournisseurs en mode automatique sont validées automatiquement lorsqu'elles ont le statut "delivered" et un numéro de BL. {user?.role === 'admin' ? ( " Vous pouvez dévalider ces rapprochements si nécessaire." ) : ( " Seuls les administrateurs peuvent dévalider ces rapprochements." )}
Les livraisons de fournisseurs en mode automatique apparaîtront ici.
|
Fournisseur
|
N° BL | Date Livr. | Date Valid. | Montant BL | Ref. Facture | Montant Fact. | Écart | Magasin | Actions |
|---|---|---|---|---|---|---|---|---|---|
|
{delivery.supplier?.name}
|
{delivery.blNumber || '-'}
|
{safeFormat(delivery.scheduledDate, 'dd/MM/yy')}
|
{delivery.reconciled && delivery.updatedAt ?
safeFormat(delivery.updatedAt, 'dd/MM/yy') :
'-'
}
|
{delivery.blAmount ?
`${parseFloat(delivery.blAmount).toFixed(2)}€` :
'-'
}
|
{delivery.invoiceReference || '-'}
|
{delivery.invoiceAmount ?
`${parseFloat(delivery.invoiceAmount).toFixed(2)}€` :
'-'
}
|
{(() => {
const blAmount = delivery.blAmount ? parseFloat(delivery.blAmount) : 0;
const invoiceAmount = delivery.invoiceAmount ? parseFloat(delivery.invoiceAmount) : 0;
if (blAmount && invoiceAmount) {
const diff = blAmount - invoiceAmount;
const diffAbs = Math.abs(diff);
return (
10 ? 'text-red-600' : 'text-orange-600'
}`}>
{diff > 0 ? '+' : ''}{diff.toFixed(2)}€
);
}
return -;
})()}
|
{delivery.group?.name}
|
{user?.role === 'admin' && delivery.reconciled && (
)}
{user?.role === 'admin' && (
)}
{/* Bouton Modifier : disponible seulement si pas encore validé */}
{!delivery.reconciled && (
)}
|