Système d'Export Centralisé
Vue d'ensemble
Le système d'export a été complètement refactorisé pour centraliser tous les exports de l'application et supporter plusieurs formats (PDF, Word/DOCX, CSV, Excel) pour tous les types de données.
✅ Migration complète terminée : Tous les exports utilisent maintenant le système unifié ExportFormatDialog / EntityExportDialog pour une expérience utilisateur cohérente.
Architecture détaillée : Voir EXPORT_STORAGE_ARCHITECTURE.md pour la documentation technique complète (sécurité, cleanup, monitoring, file_objects unifiés).
Sécurité et Performance (2026-01)
Contrôle d'accès
- Signed URLs : Vérification d'appartenance via
StorageAccessServiceavant génération - FileObjects : Vérification d'organisation pour tous les accès
- Rate Limiting : 10 req/min (sync), 5 req/min (async)
Cleanup automatique
- Export files : Suppression quotidienne des fichiers > 24h
- Orphaned files : Nettoyage hebdomadaire/mensuel des fichiers orphelins
- Avatars/Logos : Suppression automatique lors du remplacement
Monitoring
- Métriques Prometheus pour exports et cleanup
- Endpoint
/api/metricspour scraping
Formats Supportés
PDF
- Utilisation : Impression et partage
- Content-Type :
application/pdf - Extension :
.pdf - Disponible pour : Tous les exports
Word (DOCX)
- Utilisation : Édition et modification
- Content-Type :
application/vnd.openxmlformats-officedocument.wordprocessingml.document - Extension :
.docx - Disponible pour : Tous les exports
CSV
- Utilisation : Tableurs et analyse de données
- Content-Type :
text/csv - Extension :
.csv - Disponible pour : Tous les exports (sauf "all" entity)
Excel (XLSX)
- Utilisation : Analyse de données avancée
- Content-Type :
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - Extension :
.xlsx - Disponible pour : Tous les exports
JSON
- Utilisation : Sauvegarde et accès programmatique
- Content-Type :
application/json - Extension :
.json - Disponible pour : Tous les exports
Architecture
Backend
Service Centralisé : ExportService
- Fichier :
backend/src/export/export.service.ts - Responsabilités :
- Export de sessions, contacts, quotes, invoices
- Génération de tous les formats (CSV, DOCX, Excel, JSON, PDF)
- Gestion centralisée de la logique d'export
Contrôleur : ExportController
- Fichier :
backend/src/export/export.controller.ts - Endpoint :
GET /api/export?entity={entity}&format={format}&fields={fields} - Entités supportées :
sessions,contacts,quotes,invoices,all - Paramètres :
entity(required) : Type de données à exporterformat(required) : Format d'export (csv, excel, pdf, docx, json)fields(optional) : Liste de champs séparés par virgules (ex:id,title,email)
Frontend
Composant Réutilisable : ExportFormatDialog
- Fichier :
frontend/src/components/export/ExportFormatDialog.tsx - Utilisation : Dialog réutilisable pour sélectionner le format d'export
- Props :
availableFormats: Formats disponibles (optionnel, par défaut tous)onFormatSelect: Callback lors de la sélectiononOpenChange: Gestion de l'état d'ouvertureopen: État d'ouverturetitleKey/descriptionKey: Clés de traduction personnalisables
Exports Spécifiques
1. Roadmap Export (Sessions)
Backend :
- Endpoint :
GET /api/sessions/:id/roadmap?format={format} - Formats :
pdf,docx - Service :
SessionRoadmapService
Frontend :
- Composant :
RoadmapExportDialog(utiliseExportFormatDialog) - Fichier :
frontend/src/pages/sessions/SessionViewPage/components/RoadmapExportDialog.tsx
2. Conversation Export (Agent)
Backend :
- Endpoint :
GET /api/agent/conversations/:conversationId/export?format={format} - Formats :
pdf,docx,csv,excel,txt - Service :
AgentExportService
Frontend :
- Fonction :
exportConversation(format) - Fichier :
frontend/src/components/search/agent/exportConversation.ts
3. Quotes Export
Backend :
- Endpoint :
GET /api/quotes/:id/export?format={format} - Formats :
pdf,docx - Service :
QuotesController(utilisePdfServiceet conversion HTML→Word)
Frontend :
- Hook :
useQuoteActionsaveconExportClickcallback - Composant :
EntityExportDialogviauseEntityExport - Client :
getQuoteExportUrl(quoteId, format) - Status : ✅ Migré vers
ExportFormatDialog(PDF, DOCX)
4. Invoices Export
Backend :
- Endpoint :
GET /api/invoices/:id/export?format={format} - Formats :
pdf,docx - Service :
InvoicesController(utilisePdfServiceet conversion HTML→Word)
Frontend :
- Hook :
useInvoiceActionsaveconExportClickcallback - Composant :
EntityExportDialogviauseEntityExport - Client :
getInvoiceExportUrl(invoiceId, format) - Status : ✅ Migré vers
ExportFormatDialog(PDF, DOCX)
5. Contracts Export
Backend :
- Endpoint :
GET /api/contracts/:id/pdf - Formats :
pdf(DOCX à venir) - Service :
ContractsController(utilisePdfService)
Frontend :
- Hook :
useContractActionsaveconExportClickcallback - Composant :
EntityExportDialogviauseEntityExport - Client :
getContractExportUrl(contractId, format) - Status : ✅ Migré vers
ExportFormatDialog(PDF uniquement pour l'instant)
6. Contract Templates Export
Backend :
- Endpoint :
GET /api/contract-templates/:id/export?format={format} - Formats :
pdf,docx,csv,excel - Service :
ContractTemplatesController(utilisePdfServiceet conversion HTML→Word)
Frontend :
- Composant :
EntityExportDialogviauseEntityExport - Client :
getContractTemplateExportUrl(templateId, format) - Status : ✅ Migré vers
ExportFormatDialog(PDF, DOCX, CSV, Excel)
6. Analytics Export
Backend :
- Endpoints :
GET /api/analytics/pdf?startDate={date}&endDate={date}- Export PDFGET /api/analytics/excel?startDate={date}&endDate={date}- Export ExcelGET /api/analytics/word?startDate={date}&endDate={date}- Export Word
- Formats :
pdf,excel,docx - Services :
AnalyticsPdfService- Génération PDFAnalyticsExportService- Génération Excel et Word (utilise Python services)
Frontend :
- Composant :
DateRangeSelectoravecExportFormatDialog - Fichier :
frontend/src/pages/analytics/AnalyticsPage/AnalyticsPage/components/DateRangeSelector.tsx - Hook :
useAnalyticsPageavechandleExport(format, startDate?, endDate?) - Client :
getAnalyticsPdfUrl,getAnalyticsExcelUrl,getAnalyticsWordUrl - Status : ✅ Migré vers
ExportFormatDialogavec sélection de date
7. AI Report Export (Comprehensive Analytics Report)
Backend :
- Endpoints :
POST /api/ai-assistant/report/pdf- Export PDFPOST /api/ai-assistant/report/docx- Export Word
- Formats :
pdf,docx - Service :
AiAssistantService(utilise Python services)
Frontend :
- Composant :
AiReportGeneratoravecExportFormatDialog - Fichier :
frontend/src/components/search/AiReportGenerator.tsx - Status : ✅ Migré vers
ExportFormatDialog(remplace les boutons séparés PDF/DOCX)
9. Generic Data Export
Backend :
- Endpoint :
GET /api/export?entity={entity}&format={format} - Entités :
sessions,contacts,quotes,invoices,all - Formats :
csv,docx,excel,json,pdf - Service :
ExportService
Frontend :
- Composant :
ExportButton(utiliseExportFormatDialogquandshowDateRange=true) - Fichier :
frontend/src/components/export/ExportButton.tsx - Status : ✅ Utilise
ExportFormatDialogpour exports avec date range
Conversion HTML → Word
Pour les exports qui génèrent du HTML (quotes, invoices, contract templates), une méthode utilitaire htmlToWordDocument a été créée qui :
- Parse le HTML avec
cheerio - Extrait les éléments structurés (titres, paragraphes, tableaux)
- Convertit en document Word avec
docx - Préserve la structure et le formatage
Limitations :
- Conversion simplifiée (pas de styles complexes)
- Pour une meilleure qualité, considérer une bibliothèque dédiée HTML→DOCX
Traductions
Toutes les traductions sont centralisées sous export.formats.* :
{
"export": {
"title": "Exporter",
"description": "Choisissez le format d'export",
"formats": {
"pdf": { "title": "PDF", "description": "..." },
"docx": { "title": "Word (DOCX)", "description": "..." },
"csv": { "title": "CSV", "description": "..." },
"excel": { "title": "Excel (XLSX)", "description": "..." },
"json": { "title": "JSON", "description": "..." }
}
}
}
Utilisation
Backend
// Export sessions as Word
const buffer = await exportService.exportSessions(
userId,
ExportFormatValues.DOCX,
);
Frontend
Utilisation avec ExportFormatDialog (pour exports avec date range)
import { ExportFormatDialog } from "@/components/export";
<ExportFormatDialog
availableFormats={["pdf", "docx"]}
onFormatSelect={(format) => handleExport(format)}
onOpenChange={setOpen}
open={isOpen}
showDateRange
titleKey="sessions.roadmap.export.title"
descriptionKey="sessions.roadmap.export.description"
/>;
Utilisation avec EntityExportDialog (pour exports d'entités individuelles)
import { EntityExportDialog } from "@/components/export/EntityExportDialog";
import { useEntityExport } from "@/hooks/useEntityExport";
// Dans votre composant
const entityExport = useEntityExport({
availableFormats: ["pdf", "docx"],
entityName: "quote",
getFilename: (id) => `quote_${id}.pdf`,
onExport: async (format) => {
return await getQuoteExportUrl(id, format);
},
});
// Dans le JSX
<>
{entityExport.dialog}
<Button onClick={() => entityExport.openDialog(entityId)}>
Export
</Button>
</>
Fichiers Modifiés/Créés
Backend
backend/src/export/export.service.ts- Support DOCX, sélection de champsbackend/src/export/export.controller.ts- Support DOCX, paramètrefieldsbackend/src/export/README.md- Documentation complètebackend/src/import/- Module d'import complet (CSV/Excel)backend/src/scheduled-exports/- Module d'exports planifiésbackend/src/export-templates/- Module de templates d'exportbackend/src/queue/processors/export.processor.ts- Support envoi par emailbackend/src/queue/types/job-data.types.ts- Paramètres email et champsbackend/src/agent/agent-export.service.ts- Ajout PDF, CSV, Excel, TXTbackend/src/agent/agent.controller.ts- Endpoint unifié avec paramètreformatbackend/src/agent/agent.module.ts- AjoutPdfModulepour support PDFbackend/src/quotes-invoices/quotes.controller.ts- Support Word, conversion HTML→Wordbackend/src/quotes-invoices/invoices.controller.ts- Support Word, conversion HTML→Wordbackend/src/contract-templates/contract-templates.controller.ts- Support Word, CSV, Excelbackend/src/contract-templates/contract-templates.module.ts- AjoutStorageModulepour uploadsinfra/liquibase/changes/0139_create_scheduled_exports/- Migration scheduled exportsinfra/liquibase/changes/0140_create_export_templates/- Migration export templatesopenapi/components/export.yaml- Ajout format DOCXbackend/src/_generated/types.gen.ts- Types régénérés avec DOCX
Frontend
frontend/src/components/export/ExportFormatDialog.tsx- Composant centralisé pour sélection de formatfrontend/src/components/export/EntityExportDialog.tsx- Composant pour exports d'entités individuellesfrontend/src/components/export/index.ts- Fichier d'exportfrontend/src/hooks/useEntityExport.tsx- Hook pour gérer les exports d'entitésfrontend/src/components/import/ImportContactsDialog.tsx- Composant d'importfrontend/src/components/import/index.ts- Fichier d'export importfrontend/src/client/import/useImport.ts- Hook d'importfrontend/src/client/quotes-invoices/useQuotesInvoices.ts- Ajout degetQuoteExportUrletgetInvoiceExportUrlfrontend/src/client/contracts/useContracts.ts- Ajout degetContractExportUrletgetContractTemplateExportUrlfrontend/src/pages/sessions/SessionViewPage/components/RoadmapExportDialog.tsx- Refactoriséfrontend/src/components/search/agent/exportConversation.ts- Fonction unifiée avec support multi-formatsfrontend/src/hooks/useQuoteActions.tsx- Migré versExportFormatDialogaveconExportClickfrontend/src/hooks/useInvoiceActions.tsx- Migré versExportFormatDialogaveconExportClickfrontend/src/hooks/useContractActions.tsx- Migré versExportFormatDialogaveconExportClickfrontend/src/components/molecules/ExportButton.tsx- Migré versExportFormatDialogfrontend/src/i18n/locales/fr/translation.json- Traductions FR pour exportsfrontend/src/i18n/locales/en/translation.json- Traductions EN pour exports
Nouvelles Fonctionnalités
Sélection Personnalisée des Champs
Vous pouvez maintenant sélectionner les champs spécifiques à exporter via le paramètre fields :
# Exporter uniquement id, title et status pour les sessions
GET /api/export?entity=sessions&format=csv&fields=id,title,status
# Exporter uniquement first_name, last_name et email pour les contacts
GET /api/export?entity=contacts&format=excel&fields=first_name,last_name,email
Exports Planifiés (Scheduled Exports)
Système complet pour planifier des exports automatiques avec récurrence :
- Endpoints :
GET/POST/PUT/DELETE /api/scheduled-exports - Fonctionnalités :
- Récurrence : daily, weekly, monthly, yearly
- Envoi automatique par email
- Gestion des statuts (PENDING, ACTIVE, PAUSED, CANCELLED)
- Sélection de champs personnalisée
- Documentation : Voir
docs/SCHEDULED_EXPORTS.md
Templates d'Export
Système de templates pré-configurés pour réutiliser des configurations d'export :
- Endpoints :
GET/POST/PUT/DELETE /api/export-templates - Fonctionnalités :
- Templates réutilisables avec champs sélectionnés
- Templates par défaut par entité/format
- Documentation : Voir
docs/EXPORT_TEMPLATES.md
Envoi d'Exports par Email
Les exports peuvent être envoyés automatiquement par email :
- Support de pièces jointes
- Sujet et message personnalisables
- Intégré dans les scheduled exports
État des Migrations vers ExportFormatDialog
✅ Exports Migrés (utilisent ExportFormatDialog)
- Analytics Export -
DateRangeSelectoravec PDF, Excel, Word - AI Report Export -
AiReportGeneratoravec PDF, Word - Roadmap Export -
RoadmapExportDialogavec PDF, Word - Generic Data Export -
ExportButtonavec date range (tous formats)
✅ Exports Migrés (utilisent ExportFormatDialog)
-
Quotes Export (
useQuoteActions)- Fichier :
frontend/src/hooks/useQuoteActions.tsx - Backend supporte : PDF, DOCX
- Status : ✅ Migré vers
ExportFormatDialog(PDF, DOCX) - Composants mis à jour :
QuoteViewPageQuotesListPageContactQuotesTabQuotesInvoicesTab(SessionViewPage)
- Fichier :
-
Invoices Export (
useInvoiceActions)- Fichier :
frontend/src/hooks/useInvoiceActions.tsx - Backend supporte : PDF, DOCX
- Status : ✅ Migré vers
ExportFormatDialog(PDF, DOCX) - Composants mis à jour :
InvoiceViewPageInvoicesListPageContactInvoicesTabQuotesInvoicesTab(SessionViewPage)
- Fichier :
-
Contracts Export (
useContractActions,ContractViewPage)- Fichiers :
frontend/src/hooks/useContractActions.tsxfrontend/src/pages/contracts/ContractViewPage/ContractViewPage.tsx
- Backend supporte : PDF uniquement (pour l'instant)
- Status : ✅ Migré vers
ExportFormatDialog(PDF uniquement)
- Fichiers :
-
Contract Templates Export
- Fichier :
frontend/src/pages/contract-templates/ContractTemplatesPage/components/ContractTemplatesList.tsx - Backend supporte : PDF, DOCX, CSV, Excel
- Status : ✅ Migré vers
ExportFormatDialog(PDF, DOCX, CSV, Excel)
- Fichier :
-
Quotes/Invoices Export (
components/molecules/ExportButton.tsx)- Fichier :
frontend/src/components/molecules/ExportButton.tsx - Formats : CSV, Excel, JSON
- Status : ✅ Migré vers
ExportFormatDialog(CSV, Excel, JSON)
- Fichier :
⏳ Exports Non Migrés (peuvent rester avec des boutons directs)
Les exports suivants peuvent rester avec des boutons PDF directs car ils sont destinés à un usage simple par les clients (client portal) :
- Client Access Exports (ClientInvoicePage, ClientQuotePage, ClientContractPage)
- Fichiers :
frontend/src/pages/client/ClientInvoicePage/ClientInvoicePage.tsxfrontend/src/pages/client/ClientQuotePage/ClientQuotePage.tsxfrontend/src/pages/client/ClientContractPage/ClientContractPage.tsx
- Backend supporte : PDF uniquement (client access)
- Status : Bouton PDF direct (intentionnel - usage client simple)
- Fichiers :
Prochaines Étapes
- ✅ Système centralisé créé
- ✅ Formats multiples supportés
- ✅ Documentation complète
- ✅ Types TypeScript générés
- ✅ Backend complet pour tous les exports (quotes, invoices, contracts)
- ✅ Sélection personnalisée des champs
- ✅ Exports planifiés (scheduled exports)
- ✅ Templates d'export
- ✅ Envoi par email
- ✅ Analytics Export migré vers ExportFormatDialog (PDF, Excel, Word)
- ✅ AI Report Export migré vers ExportFormatDialog (PDF, Word)
- ✅ Quotes Export migré vers ExportFormatDialog (PDF, DOCX)
- ✅ Invoices Export migré vers ExportFormatDialog (PDF, DOCX)
- ✅ Contracts Export migré vers ExportFormatDialog (PDF)
- ✅ Contract Templates Export migré vers ExportFormatDialog (PDF, DOCX, CSV, Excel)
- ✅ Quotes/Invoices ExportButton (molecules) migré vers ExportFormatDialog (CSV, Excel, JSON)
- ✅ Contracts List Page migré vers ExportFormatDialog (PDF)
- ✅ Code mort supprimé (anciens handlers PDF directs)
- ✅ Documentation mise à jour (documentation interne)
- ⏳ Tests d'intégration (optionnel)
Notes Techniques
- Conversion HTML→Word : Utilise
cheeriopour parser etdocxpour générer - Performance : Les exports sont asynchrones et gèrent de gros volumes
- Stockage : Tous les fichiers sont uploadés sur R2 avec URLs signées
- Sécurité : Tous les exports sont filtrés par
owner_id