Checkpoint: Ajout des filtres par statut d'export, export Excel et page de détail avec édition manuelle.
Nouvelles fonctionnalités : 1. Filtres par statut d'export : - Boutons de filtre rapide (Tous/Exportés/Non exportés/Erreurs) - Compteurs dynamiques pour chaque statut - Couleurs distinctives (vert/bleu/rouge) 2. Export Excel : - Nouveau bouton "Excel" dans la page Factures - Génération automatique de fichier .xlsx avec toutes les métadonnées - Colonnes : Fournisseur, N° Facture, Date, N° BL, N° Commande, Montant, Score, Statut, Dates 3. Page de détail de facture (/invoices/:id) : - Visualisation PDF intégrée dans iframe - Affichage des métadonnées extraites - Mode édition avec formulaire complet - Recalcul automatique du score de qualité après édition - Marquage "Modifié manuellement" - Badges de statut et qualité - Lien cliquable sur le nom du fournisseur dans la liste L'application offre maintenant une expérience complète de gestion des factures avec filtrage avancé, exports multiples et édition manuelle.
This commit is contained in:
@@ -424,6 +424,36 @@ export const appRouter = router({
|
||||
return { success };
|
||||
}),
|
||||
|
||||
exportToExcel: protectedProcedure
|
||||
.input(z.object({ invoiceIds: z.array(z.number()) }))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
const invoices = await Promise.all(
|
||||
input.invoiceIds.map(id => getInvoiceById(id))
|
||||
);
|
||||
|
||||
const validInvoices = invoices.filter(
|
||||
inv => inv && inv.userId === ctx.user.id
|
||||
);
|
||||
|
||||
// Return invoice data for Excel generation on client side
|
||||
return {
|
||||
success: true,
|
||||
invoices: validInvoices.map(inv => ({
|
||||
id: inv!.id,
|
||||
supplierName: inv!.supplierName || '',
|
||||
invoiceNumber: inv!.invoiceNumber || '',
|
||||
invoiceDate: inv!.invoiceDate ? new Date(inv!.invoiceDate).toLocaleDateString('fr-FR') : '',
|
||||
deliveryNoteNumber: inv!.deliveryNoteNumber || '',
|
||||
orderNumber: inv!.orderNumber || '',
|
||||
totalAmount: inv!.totalAmount ? parseFloat(inv!.totalAmount as string) : 0,
|
||||
qualityScore: inv!.qualityScore || 0,
|
||||
exportStatus: inv!.exportStatus || 'not_exported',
|
||||
exportedAt: inv!.exportedAt ? new Date(inv!.exportedAt).toLocaleDateString('fr-FR') : '',
|
||||
createdAt: new Date(inv!.createdAt).toLocaleDateString('fr-FR'),
|
||||
}))
|
||||
};
|
||||
}),
|
||||
|
||||
exportToPdf: protectedProcedure
|
||||
.input(z.object({ invoiceIds: z.array(z.number()) }))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
|
||||
Reference in New Issue
Block a user