Checkpoint: Checkpoint saved: Ajout de la fonctionnalité d'export intelligent des factures BAP

Nouvelle fonctionnalité implémentée :
 Sélection automatique des factures exportables uniquement
 Critères d'exportabilité renforcés : Score 100% + Type d'achat + Service + Ventilation remplis
 Case à cocher générale qui sélectionne toutes les factures exportables
 Cases à cocher individuelles désactivées pour les factures non exportables
 Bouton "Exporter" actif dès qu'au moins une facture est cochée
 Tooltips explicatifs sur les cases à cocher

Modifications techniques :
- client/src/pages/InvoicesBAP.tsx : Fonction isEligibleForExport modifiée avec critères complets
- client/src/pages/InvoicesBAP.tsx : handleSelectAll modifié pour sélectionner uniquement les factures exportables
- client/src/pages/InvoicesBAP.tsx : Ajout de l'attribut disabled sur les checkboxes non exportables
- client/src/pages/InvoicesBAP.tsx : Ajout de tooltips explicatifs
- client/src/pages/InvoicesBAP.tsx : Simplification du bouton "Exporter" (activation dès qu'une facture est cochée)

Fonctionnement :
1. Une facture BAP est exportable si et seulement si :
   - Score de qualité = 100%
   - Type d'achat rempli (CAPEX ou OPEX)
   - Service concerné rempli
   - Ventilation comptable remplie

2. La case à cocher générale (en-tête du tableau) sélectionne automatiquement toutes les factures qui remplissent ces critères

3. Les cases à cocher individuelles sont :
   - Actives pour les factures exportables
   - Désactivées (grisées) pour les factures non exportables
   - Avec tooltip explicatif sur les cases désactivées

4. Le bouton "Exporter" s'active dès qu'au moins une facture est cochée et affiche le nombre de factures sélectionnées

Cette fonctionnalité garantit que seules les factures complètes et validées peuvent être exportées, évitant ainsi les erreurs d'export de données incomplètes.
This commit is contained in:
Manus
2026-02-13 10:26:03 -05:00
parent 4c3b68fda5
commit 661e477d36
2 changed files with 78 additions and 9 deletions

View File

@@ -236,9 +236,11 @@ export default function InvoicesBAP() {
const handleSelectAll = (checked: boolean) => {
if (checked) {
// Select all invoices (no restriction)
const allIds = (filteredInvoices || []).map(inv => inv.id);
setSelectedIds(allIds);
// Select only exportable invoices
const exportableIds = (filteredInvoices || [])
.filter(inv => isEligibleForExport(inv))
.map(inv => inv.id);
setSelectedIds(exportableIds);
} else {
setSelectedIds([]);
}
@@ -291,7 +293,17 @@ export default function InvoicesBAP() {
};
const isEligibleForExport = (invoice: any) => {
return (invoice.qualityScore || 0) === 100;
// Une facture BAP est exportable si :
// 1. Score = 100%
// 2. Type d'achat rempli
// 3. Service concerné rempli
// 4. Ventilation comptable remplie
return (
(invoice.qualityScore || 0) === 100 &&
invoice.typeAchat &&
invoice.serviceConcerne &&
invoice.ventilationComptable
);
};
const hasOnlyEligibleSelected = selectedIds.length > 0 && selectedIds.every(id => {
@@ -322,12 +334,11 @@ export default function InvoicesBAP() {
</Button>
<Button
onClick={handleExport}
disabled={selectedIds.length === 0 || !hasOnlyEligibleSelected || exportMutation.isPending}
disabled={selectedIds.length === 0 || exportMutation.isPending}
className="bg-blue-600 hover:bg-blue-700"
title={!hasOnlyEligibleSelected && selectedIds.length > 0 ? "Seules les factures avec un score de 100% peuvent être exportées" : ""}
>
<Download className="w-4 h-4 mr-2" />
PDF ({selectedIds.length})
Exporter ({selectedIds.length})
</Button>
<Button
onClick={async () => {
@@ -419,6 +430,7 @@ export default function InvoicesBAP() {
<Checkbox
checked={allEligibleSelected}
onCheckedChange={handleSelectAll}
title="Sélectionner toutes les factures exportables (Score 100% + champs remplis)"
/>
</TableHead>
<TableHead>Fournisseur</TableHead>
@@ -442,6 +454,8 @@ export default function InvoicesBAP() {
<Checkbox
checked={selectedIds.includes(invoice.id)}
onCheckedChange={(checked) => handleSelectOne(invoice.id, checked as boolean)}
disabled={!isEligibleForExport(invoice)}
title={!isEligibleForExport(invoice) ? "Facture non exportable (score < 100% ou champs manquants)" : ""}
/>
</TableCell>
<TableCell className="font-medium">