Checkpoint: Création de la page Factures BAP et restructuration de l'interface

Nouvelles fonctionnalités :
 Nouvelle page "Factures BAP" qui affiche uniquement les factures avec Abonnement = NON (isSubscription = 0)
 La page Factures BAP inclut les colonnes Type d'achat et Ventilation comptable avec édition directe
 Les colonnes Type d'achat et Ventilation ont été supprimées de la page Factures principale
 Menu "Factures BAP" ajouté dans la navigation du DashboardLayout
 Route /invoices-bap configurée dans App.tsx

Architecture :
- client/src/pages/InvoicesBAP.tsx : Nouvelle page pour les factures BAP (non-abonnement)
- client/src/pages/Invoices.tsx : Page principale modifiée (colonnes Type d'achat et Ventilation supprimées)
- client/src/App.tsx : Route /invoices-bap ajoutée
- client/src/components/DashboardLayout.tsx : Menu "Factures BAP" ajouté

Fonctionnement :
1. La page "Factures" affiche toutes les factures avec les colonnes : Fournisseur, N° Facture, Date, Montant, Service, Abonnement, Score, Statut, Actions
2. La page "Factures BAP" affiche uniquement les factures non-abonnement (Abonnement = NON) avec les colonnes supplémentaires : Type d'achat et Ventilation comptable
3. Les deux pages conservent toutes les fonctionnalités d'édition directe, export, suppression, etc.
4. Le filtrage est automatique basé sur le champ isSubscription (0 = NON, 1 = OUI)

Cette restructuration permet une meilleure organisation des factures selon leur nature (abonnement ou BAP).
This commit is contained in:
Manus
2026-02-11 11:10:23 -05:00
parent 7cb2fee76e
commit e11d24cb94
5 changed files with 702 additions and 43 deletions

View File

@@ -407,8 +407,6 @@ export default function Invoices() {
<TableHead>Date</TableHead>
<TableHead>Montant</TableHead>
<TableHead>Service</TableHead>
<TableHead>Type achat</TableHead>
<TableHead>Ventilation</TableHead>
<TableHead>Abonnement</TableHead>
<TableHead>Score</TableHead>
<TableHead>Statut</TableHead>
@@ -469,47 +467,6 @@ export default function Invoices() {
<option value="__ADD_NEW__" className="font-semibold text-blue-600"> Ajouter...</option>
</select>
</TableCell>
<TableCell className="text-sm">
<select
value={invoice.typeAchat || ""}
onChange={(e) => {
updateFieldMutation.mutate({
id: invoice.id,
data: { typeAchat: e.target.value as "CAPEX" | "OPEX" | undefined },
});
}}
className="w-full px-2 py-1 border rounded text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<option value="">-</option>
<option value="CAPEX">CAPEX</option>
<option value="OPEX">OPEX</option>
</select>
</TableCell>
<TableCell className="text-sm">
<select
value={invoice.ventilationComptable || ""}
onChange={(e) => {
if (e.target.value === "__ADD_NEW__") {
setPendingInvoiceId(invoice.id);
setAddDialogType("ventilation");
setAddDialogOpen(true);
e.target.value = invoice.ventilationComptable || "";
} else {
updateFieldMutation.mutate({
id: invoice.id,
data: { ventilationComptable: e.target.value || undefined },
});
}
}}
className="w-full px-2 py-1 border rounded text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<option value="">-</option>
{allocations?.map((alloc) => (
<option key={alloc.id} value={alloc.name}>{alloc.name}</option>
))}
<option value="__ADD_NEW__" className="font-semibold text-blue-600"> Ajouter...</option>
</select>
</TableCell>
<TableCell className="text-sm">
<select
value={invoice.isSubscription ? "OUI" : "NON"}