Référence Détaillée des Améliorations CRM - Aaperture
Note : Ce document est une référence détaillée organisée par domaine fonctionnel. Pour les priorités de développement, consultez PRIORITES.md qui est la source de vérité pour la planification.
Ce document consolide toutes les améliorations futures identifiées dans la documentation et propose de nouvelles suggestions basées sur l'analyse du système actuel, organisées par domaine fonctionnel.
Gouvernance de la documentation produit
- Les décisions CRM actives restent dans ce document et dans
docs/PRIORITES.md. - Les anciens plans non actifs doivent être retirés de
docs/(contenu fusionné ou abandonné) ; l’historique détaillé reste dans git. - Toute nouvelle évolution CRM doit mettre à jour:
- ce document (détail),
PRIORITES.md(priorisation),docs/README.md(index).
📝 Changelog docs
- 2026-07-24: Vague A cleanup — progression/gamification + Cmd+K recommendations deleted; SMS UI hidden (provider future); Friends KEEP + port
aaperture-mobilevia/mobile/network; Gmail FREEZE; billing = export CSV (not Pennylane); InsightsCREATE_TASKnavigatesdeepLink. SeeAPP_CLEANUP_MAP.md. - 2026-04-20: requalification de la stratégie facturation/conformité: Aaperture reste la source de vérité métier, mais la conformité fiscale et la facturation externe passent dans un lot
Billing externalisé / Pennylaneau lieu d’un chantier principal de certification interne complète. Ajout du lotStorage abstraction / Scaleway, révision de la roadmap par horizon et réalignement des priorités actives. - 2026-04-07: le plan
docs/GMAIL_PLUGIN_IMPLEMENTATION_PLAN.mdest recadré pour verrouiller le vrai lotPlugin Gmail: un Google Workspace Add-on utilisé dans Gmail, avec Aaperture comme moteur CRM/Iris. Décision explicite: pas d’inbox Gmail embarquée dans l’app web. - 2026-04-06: le lot
Proposal / expérience clientavance visiblement côté frontend: builder Proposal (Share & Send) et étapes publiquesconfirm/finalrepris avec des surfaces plus sobres, une meilleure lisibilité des statuts/liens et une fin de flow client plus claire. - 2026-04-06: le lot
Assistant CRM / chat workspacepasse de refonte de shell à stabilisation produit: contexte unifié, mémoire conversationnelle courte, rendu messages/formulaires/résultats largement harmonisé, et ajout du lotmessages / inbox workspacedans les surfaces CRM livrées. - 2026-03-31: ajout du lot
Assistant CRM / chat workspacedans la planification active. Décision produit: arrêter de traiter le chat agent comme un simple panneau technique et le faire converger vers un vrai workspace conversationnel partagé (sidebar,window,mobile,fullscreen) avec pièces jointes, actions et résultats au même niveau de finition. - 2026-03-14: clôture formelle du lot
modales create/editdans la planification active: la migration modal-first couvre maintenant les écrans documents, CRM contextualisé et data/settings les plus fréquents (quotes,invoices,contracts,organizations,user session types,user providers,rates,payment plans,task types). Le lot quitte le focus principal et passe en finition opportuniste sur les écrans secondaires restants. - 2026-03-14: lot
modales create/editsuffisamment avancé pour sortir du focus immédiat: patternFormEntityModalétendu àquotes,invoices,contracts,organizations,user session types,user providers,rates,payment plansettask types, avec duplication locale pourratesetpayment plans, formulaires rendus compatiblesisModal / onClose / onSaved, et harmonisation visuelle des contenus modaux sans cadres internes redondants. - 2026-03-14: panneau détail pipeline passé en mode plus contextuel et mobile-friendly: édition contact en modale, conversion lead -> session avec ouverture immédiate de la session en modale, consultation soumission lead form en modale, et clics timeline
session / devis / facturequi ouvrent désormais les éditeurs correspondants en modale sans quitter le pipeline. - 2026-03-14: lot
modales create/editdémarré côté documents commerciaux: les listesquotesetinvoicesouvrent désormais leurs vrais formulaires (QuoteFormPage,InvoiceFormPage) dansFormEntityModal, avec fermeture propre après sauvegarde, scroll modal corrigé, et conservation d’une étape de sélectioncontact/sessionavant ouverture du formulaire. - 2026-03-13: panneau détail pipeline enrichi avec
actions suggéréescontextuelles sans nouveau backend: création rapide d’un item pipeline depuis un contact existant, assignation de la première étape commerciale et planification d’une relance rapide. - 2026-03-13: lot
CRM pipeline unifiépartiellement livré et documenté: soumission lead form -> upsert pipeline, navigation bidirectionnelle pipeline/soumission, badges statut/étape sur les soumissions, édition rapide depuis le détail de soumission, aperçu structuré de la soumission et timeline d’activité contact en lecture seule dans le panneau pipeline. Le prochain incrément prioritaire devient la densification du panneau détail, pas une nouvelle refonte large. - 2026-03-13: panneau détail pipeline densifié sans nouveau backend: cartes
dernière activité / prochaine action, résumé compact de l’activité (sessions, devis, factures, emails) et timeline recentrée sur les événements les plus utiles. - 2026-03-09: priorités CRM resserrées après stabilisation lead forms / emails. Le lot "lead forms reliability" sort du focus immédiat; le prochain focus recommandé redevient
Proposal v3+ tableau de suivi clientèle + migration create/edit en modales. - 2026-03-07: gouvernance docs mise à jour (index simplifié, source de vérité par domaine, nouveaux SKILLs
.agents/frontend-performanceet.agents/docs-performance). - 2026-03-06: ajout du plan "Visual Day Planner mariage" basé sur scheduler React (FullCalendar), avec publication client et workflow de propositions/review.
- 2026-03-05: ajout du plan "relation clientèle" (tableau de suivi clientèle, migration création/édition en modales, plugin Gmail pour demandes entrantes), aligné avec
docs/PRIORITES.md. - 2026-02-22: Proposal v2 (socle) documenté puis DELETED du produit (FE/BE) — historique git ; day-planner proposals KEEP. Voir
APP_CLEANUP_MAP.mdVague C. - 2026-02-24: Proposal v3 documenté puis DELETED du produit (FE/BE) — historique git. Voir
APP_CLEANUP_MAP.mdVague C. - 2026-02-21: refonte graphique/typographique des emails transactionnels (wrappers shared + wordmark typographique
Aaperture, palette light premium, CTA/containers harmonisés), normalisation des sujets sans crochets (Aaperture · ...), et amélioration visuelle des statuts Ops (up/down/protected) dans l'admin. - 2026-02-21: gestion des doublons contacts améliorée avec synchronisation URL des filtres (
groupBy,q,showIgnored) et factorisation UIListHeaderActionssur les listes Contacts/Sessions/Quotes/Invoices/Contracts. - 2026-02-21: alerting applicatif observabilité enrichi avec détection de spike
queue_jobs_total{status="failed"}(scheduler) en plus des spikes HTTP. - 2026-02-21: observabilité renforcée avec alertes SLO HTTP (warning/critical sur error rate) et dashboard Grafana enrichi (success rate, error budget remaining, burn rate SLO).
- 2026-02-21: correctif frontend des limites admin sur listes
sessions/contacts(normalisationADMIN_ACCESS=> limite illimitée), avec test unitaire dédié pour éviter la régression "limit=0". - 2026-02-21: refresh des pages légales publiques (Privacy Policy / Terms of Use / GDPR), harmonisation FR/EN, dates de mise à jour 2026, et standardisation du footer légal sur les pages non loguées.
- 2026-02-21: mise à jour Dashboard Hub + Session Wizard (multi-étapes), clarification workflow/type de session/prestation/plan de paiement, résumé de validation lisible, et création automatique de ligne prestation sur devis/facture.
- 2026-02-16: ajout des axes Hub Projet (pivot), multi-sessions, merge projets, wizard projet, collaborateurs/permissions et moodboards projet.
- 2026-02-18: suppression du concept Projet — collaborateurs et moodboards rattachés directement aux sessions. Simplification des rôles (VIEWER/EDITOR/ADMIN).
Décisions structurantes 2026
1) Externalisation de la conformité / facturation via Pennylane
- Décision produit : Aaperture ne doit plus porter seul, à court terme, toute la complexité réglementaire de facturation France/UE comme axe principal.
- Positionnement cible :
Aaperture = source de vérité métierPennylane = source de vérité fiscale / facturation externe
- Conséquence roadmap :
- le socle billing interne existant reste stratégique pour les devis, l’expérience commerciale, les montants, les statuts métier, les paiements visibles et l’historique côté CRM/portail,
- l’ancien axe "conformité fiscale complète portée en interne" est requalifié : il n’est pas supprimé, mais déplacé vers un chantier d’encadrement, d’intégration provider et de relais d’états.
- Chantier explicite à ouvrir :
BillingModuleBillingProviderPennylaneProvider- synchronisation des factures externes,
- stockage des IDs externes, statuts, PDF et métadonnées.
2) Migration du stockage objet vers Scaleway ⏸️ (en pause, on reste sur R2)
- Décision plateforme : le stockage objet devient un axe infra produit officiel avec migration progressive vers une solution française / souveraine.
- Principe d’architecture :
- le stockage reste S3-compatible,
- les modules applicatifs ne connaissent pas le provider concret,
StorageProviderdevient le contrat d’accès unifié,R2StorageProvideretScalewayStorageProvidercoexistent pendant la transition.
- Périmètre concerné :
- documents,
- fichiers du portail,
- galeries,
- assets de slideshow / rendu vidéo.
3) Conséquence sur la roadmap et les priorités
- Court terme :
Billing / export comptable CSV✅ (Pennylane in-app deleted)Storage abstraction ✅ + migration Scaleway ⏸️ (en pause)Relances automatiques- Cleanup Vague D (orphan schema + galleries F002) —
APP_CLEANUP_MAP.md
- Moyen terme :
- portail client V2 enrichi avec documents,
- analytics business,
Iris proactive V1.
- Long terme :
- relais des statuts de facturation électronique,
Irisavancée,- marketplace de templates,
- élargissement multi-métiers.
Soldé : produit commercial Proposal — DELETED FE/BE/DB (
0277). Day-planner proposals KEEP.
📋 Légende
- ✅ Implémenté - Fonctionnalité complètement implémentée et opérationnelle
- ⚠️ Partiellement implémenté - Fonctionnalité en partie implémentée, nécessite des améliorations
- 🚀 En cours / Priorité - Fonctionnalité en cours de développement ou priorisée
- Non implémenté - Fonctionnalité proposée mais pas encore développée
🎯 Focus Actuel
IA Proactive Insights (LOT A - MVP) - ✅ 100% COMPLÉTÉ (2026-01-27) - Système d'insights proactifs opérationnel avec 8 règles déterministes, génération automatique quotidienne, notifications, et interface complète. Toutes les fonctionnalités MVP sont implémentées et testées.
Global Search & Intelligence Artificielle - Développement d'un assistant IA intégré au Global Search pour permettre aux utilisateurs de builder des vues personnalisées et d'exécuter des actions complexes via des prompts en langage naturel. ✅ Phase 1 et 2 complétées.
🧭 Mise à jour Produit (2026-02)
Priorités actives validées pour le repositionnement produit et la cohérence des flux:
-
✅ Sessions comme entité pivot (complété)
sessionsest l'entité métier principale — le concept "projet" a été supprimé.- Collaborateurs et moodboards rattachés directement aux sessions.
-
✅ Collaborateurs session & permissions (complété)
- Rôles simplifiés :
VIEWER,EDITOR,ADMIN. - Identification flexible : user existant, email invité, ou prestataire lié.
- Invitation/recherche unifiée (utilisateurs existants, prestataires, email).
- Rôles simplifiés :
-
✅ Moodboards session (complété)
- Plusieurs moodboards par session.
- Upload multiple d'images (max 10 à la fois).
- Partage avec le client (
is_shared_with_client). - Catégorisation optionnelle des items.
- Édition côté utilisateur et côté portail client.
-
✅ Accueil Dashboard = Hub simplifié (complété)
- Réduction de la densité d’information en page d’accueil.
- Les vues spécialisées restent dans les pages métier dédiées.
- Les actions clés sont exposées via un bloc
Quick Actionsdirect.
-
✅ Session Wizard opérationnel (complété)
- Modal multi-étapes orientée exécution rapide:
- Session
- Configuration
- Documents
- Validation
- Logique de préremplissage par type de session (workflow et plan de paiement par défaut).
- Cohérence UX sur les dépendances (champs activés/désactivés selon prérequis).
- Si devis/facture est demandé, la prestation sélectionnée est ajoutée en ligne d’item à la création.
- Modal multi-étapes orientée exécution rapide:
-
✅ Conformité pages légales publiques (complété)
- Footer légal unifié sur les écrans non logués:
- Privacy Policy
- Terms of Use
- GDPR
- copyright + année courante
- Terminologie FR harmonisée (
Politique de confidentialité). lastUpdatedDatesynchronisée FR/EN (Février 2026 / February 2026).
- Footer légal unifié sur les écrans non logués:
🆕 Plan d'amélioration relation clientèle (2026-03)
Objectif: réduire les pertes de contexte, accélérer le traitement des demandes entrantes, et centraliser le suivi commercial dans un flux unique.
Lot CRM unifié - état actuel
Le lot d’unification CRM est maintenant partiellement livré.
Travail déjà livré :
- soumission de lead form -> upsert d’un item pipeline CRM,
- navigation
pipeline -> soumission, - navigation
soumission -> pipeline, - badges statut / étape CRM visibles sur les soumissions,
- édition rapide du statut et de l’étape depuis le détail de soumission,
- aperçu structuré de la soumission dans le panneau latéral pipeline,
- timeline d’activité contact en lecture seule dans le panneau latéral pipeline,
- panneau pipeline désormais modal-first pour les actions contextuelles principales:
- modifier le contact,
- ouvrir la soumission,
- convertir en session puis finaliser la session,
- ouvrir depuis la timeline une session, un devis ou une facture,
- densité mobile corrigée dans le panneau détail (cartes et actions empilées sur petit écran).
Prochain incrément recommandé :
- enrichir le panneau pipeline avec une activité plus dense et plus actionnable,
- sans ouvrir un nouveau chantier CRM transverse ni créer de backend dédié supplémentaire à ce stade.
Compléments déjà livrés sur ce prochain incrément :
- cartes compactes
dernière activitéetprochaine action, - résumé d’activité agrégé dans le panneau pipeline,
- timeline recentrée sur les événements récents les plus utiles,
- bloc
actions suggéréespour accélérer les prochaines actions sans quitter le panneau détail, - résumé
santé du lead(coordonnées + rythme de suivi) pour aider à prioriser rapidement.
1) Tableau de suivi clientèle (Priorité Haute) 🚀
- But produit : disposer d'une vue pipeline unique
lead -> contact qualifié -> session/devis. - État actuel : le socle unifié est lancé et partiellement livré ; le prochain incrément prioritaire est maintenant la densification du panneau détail (activité, contexte, prochaines actions), pas une nouvelle refonte large.
- Périmètre MVP :
- colonnes par statut (Nouveau, Qualifié, En attente, Converti, Fermé),
- cartes avec source de demande, dernière interaction, propriétaire, prochaine action,
- actions rapides (changer statut, assigner, créer session/devis).
- Source de vérité :
- activités commerciales et relances restent traçables dans les entités existantes (contacts/sessions/tasks),
- le tableau est une projection opérationnelle, pas une duplication métier.
- KPI cible :
- délai moyen de première réponse,
- taux de conversion lead -> session,
- volume de demandes non traitées > 48h.
2) Création/édition en modales (Lot largement livré) ✅
- But produit : éviter les ruptures de navigation et accélérer les micro-opérations de saisie.
- État actuel : le lot est désormais formellement refermé sur les écrans les plus fréquents; il ne reste plus qu’une finition opportuniste sur quelques écrans secondaires.
- Décision UX :
- remplacer les pages de création/édition fréquentes par des modales (
create/edit) avec formulaire réutilisable, - conserver une page dédiée uniquement pour les formulaires longs/avancés.
- remplacer les pages de création/édition fréquentes par des modales (
- Règles d'implémentation :
- même schéma de validation entre modal et formulaire existant,
- sauvegarde inline + retour immédiat à la vue d'origine,
- support mobile via full-screen modal quand nécessaire.
- Livré récemment :
quotes,invoices,contracts,organizations,user session types,user providers,rates,payment plans,task typessont maintenant passés sur le patternFormEntityModal,- duplication locale gardée quand utile (
rates,payment plans), - compat modal/page harmonisée (
forcedId,isModal,onClose,onSaved) et rendu modal nettoyé sans wrappers internes redondants.
- Reste éventuel :
- garder les écrans secondaires restants pour une passe opportuniste, sans relancer un chantier transversal dédié,
- conserver une vraie page dédiée uniquement pour les formulaires longs ou les flux guidés spécifiques.
3) Plugin Gmail natif dans Gmail — FREEZE / deferred (Vague A)
- Statut : not active; see
docs/GMAIL_PLUGIN_IMPLEMENTATION_PLAN.md(FREEZE banner). - But produit (when reopened) : aider l’utilisateur à traiter les emails entrants directement dans Gmail, avec le contexte CRM Aaperture et les actions Iris disponibles au bon moment.
- Plan dédié :
docs/GMAIL_PLUGIN_IMPLEMENTATION_PLAN.md - Périmètre initial :
- panneau latéral
Aaperturedans Gmail, - lecture du contexte du thread courant,
- matching déterministe vers contact/lead/session,
- création ou liaison rapide sans quitter Gmail,
- appel à Iris pour
next step, angle de réponse et follow-up.
- panneau latéral
- Contraintes techniques :
- contraintes propres aux Google Workspace Add-ons,
- auth propre entre Gmail et Aaperture,
- respecter un MVP sans sync de boîte ni client mail embarqué.
- Risques :
- sur-scoper vers une inbox ou une sync Gmail complète,
- complexifier trop tôt l’UI si on part sur une extension Chrome au lieu d’un add-on natif.
- Approche recommandée :
- MVP en Google Workspace Add-on,
- Aaperture comme backend métier,
- enrichissement progressif après validation usage réel.
Séquencement transversal recommandé
- Livrer le tableau de suivi clientèle (valeur business immédiate).
- Garder les modales create/edit en chantier de finition opportuniste, plus comme lot principal.
- Brancher le plugin Gmail natif sur un périmètre minimal utile puis étendre.
4) Assistant CRM / chat workspace (Priorité Haute) 🚀
- But produit : faire du chat agent un vrai espace de conversation/action CRM, et non un panneau secondaire difficile à lire.
- Problème actuel :
- divergence entre
sidebar,window,mobileetfullscreen, - rendu encore trop “outil technique” sur certaines surfaces,
- pièces jointes et résultats d’actions pas assez intégrés dans la logique conversationnelle,
- markdown et blocs système visuellement trop proches d’un dump brut.
- divergence entre
- Décision UX :
- shell unique du chat quel que soit le mode d’affichage,
- messages, pièces jointes, formulaires inline et résultats d’action traités comme des objets de conversation de même niveau,
- composer plus clair, plus dense, et plus orienté action.
- Périmètre MVP du lot :
- unifier la composition
header / messages / composer, - harmoniser les surfaces de message user / assistant / système,
- revoir les cartes de fichiers et l’état vide,
- clarifier les actions de shell (
close,switch mode,minimize), - fiabiliser les uploads agent avec stratégie
presigned URLen chemin principal et fallback backend en sécurité.
- unifier la composition
- État actuel :
- le shell et le rendu conversationnel sont désormais largement livrés,
- le lot ne se pilote plus comme une refonte visuelle générale,
- le prochain incrément utile est la stabilisation métier: scénarios E2E, actions CRM plus prescriptives, et derniers cas de contexte/runtime.
- Règles d’implémentation :
- une source de vérité de composition (
AgentPanelContentou équivalent), - ne pas multiplier les variantes stylistiques locales par mode,
- conserver des actions compactes et cohérentes avec le reste de l’app,
- garder les comportements temps réel et upload robustes pendant la refonte.
- une source de vérité de composition (
- E2E recommandé :
- ouvrir le chat,
- envoyer un message,
- joindre un fichier image,
- vérifier l’apparition du fichier dans la conversation,
- couvrir le cas de fallback upload si l’upload signé échoue.
5) Messages / inbox workspace (Lot livré, suivi opportuniste) ✅
- But produit : faire de
Messagesun vrai espace de travail quotidien cohérent avecIris,pipelineet les autres workspaces métier. - Livré :
- shell page allégé,
- liste de conversations densifiée,
- threads client/ami harmonisés,
- panneau fichiers clarifié,
- modal
nouvelle conversationrestructurée autour du choix du destinataire puis du premier message.
- Suite éventuelle :
- correctifs opportunistes,
- scénarios E2E ciblés si la messagerie entre dans la suite critique CI,
- meilleures actions contextuelles entre conversation, contact, session et assistant.
🆕 Visual Day Planner mariage (2026-03)
Objectif: fournir un builder visuel de journée mariage co-utilisable par photographe et client, sans duplication de source, avec validation côté photographe avant publication.
Décisions verrouillées
- Vue principale: timeline verticale journée.
- Collaboration client: modèle "proposition -> validation photographe" (pas d’override direct client).
- Activation initiale: sessions mariage.
- Stack: FullCalendar React (
@fullcalendar/react,@fullcalendar/core,@fullcalendar/timegrid,@fullcalendar/interaction).
Périmètre MVP
- Builder interne:
- template de journée mariage pré-rempli,
- CRUD des blocs (titre, début/fin, lieu, responsable, notes, catégorie),
- drag/drop + resize + snap 10 minutes.
- Portail client:
- lecture de la version publiée,
- action "Proposer une modification" vers une proposition séparée.
- Review:
- inbox de propositions côté photographe,
- accepter/refuser/ajuster puis publier la version client.
Backend/API
- Endpoints:
GET /api/sessions/:id/planning/day?scope=internal|published|proposalsPOST /api/sessions/:id/planning/day/template/applyPOST /api/sessions/:id/planning/day/publishPOST /api/sessions/:id/planning/day/proposalsPUT /api/sessions/:id/planning/day/proposals/:proposalId/reviewGET /api/client-accounts/me/sessions/:sessionId/planning/day?scope=published|proposalsPOST /api/client-accounts/me/sessions/:sessionId/planning/day/proposals
- Modèle (extension
session_planning_items):end_date,category,responsible,visibility,source,review_status,parent_item_id,reviewed_at,reviewed_by.
Frontend/UX
- Session > Planning & Logistics:
- sous-section Day Planner avec FullCalendar custom tokens premium.
- actions compactes:
+ bloc,Template,Publier,....
- Portail client:
- timeline publiée en lecture seule,
- modal de proposition de modification.
Séquencement recommandé
- Sprint 1: intégration scheduler + CRUD interne + template.
- Sprint 2: propositions client + review + publication.
- Sprint 3: mobile touch, accessibilité clavier, export PDF jour J, analytics d’adoption.
🆕 Billing externalisé / Pennylane
Contexte
Le socle facturation Aaperture est déjà robuste côté métier, mais le produit ne doit plus viser à court terme une internalisation croissante de la conformité fiscale comme avantage principal. La décision 2026 consiste à garder Aaperture comme cockpit commercial et documentaire, tout en déléguant la vérité réglementaire de facturation à un provider externe spécialisé.
Objectif produit
Permettre au photographe de continuer à piloter ses devis, sa conversion commerciale et son portail client dans Aaperture, tout en externalisant la création et le cycle fiscal des factures vers Pennylane sans rupture de parcours.
Périmètre MVP
- création d’une facture externe Pennylane depuis un devis accepté,
- récupération du PDF de facture,
- affichage de la facture externe dans la session, les écrans documents et le portail client,
- stockage des identifiants et métadonnées minimales pour relier le document externe au CRM.
Architecture cible
BillingModuleorchestre le workflow métier de facturation dans le backend NestJS.BillingProviderdéfinit le contrat métier commun:createInvoiceFromQuote,getInvoice,getInvoicePdf,listInvoicesForSession|Contact,syncInvoiceStatus.
PennylaneProviderimplémente ce contrat via API externe.- Aaperture conserve la relation métier:
- organisation,
- contact,
- session,
- quote,
- invoice intent / invoice mirror.
- Le frontend React/TanStack consomme une API Aaperture stable, pas l’API Pennylane directement.
Impacts backend
- nouveau module NestJS dédié au provider billing,
- services de mapping
quote -> payload Pennylane, - endpoints de création et de lecture des factures externes,
- jobs BullMQ pour sync asynchrone, retries, récupération PDF et refresh des métadonnées,
- garde multi-tenant par organisation sur tous les objets synchronisés.
Impacts frontend
- CTA métier dans les écrans devis pour "créer la facture externe",
- visualisation claire du statut
brouillon externe / envoyée / payée / partiellement payée / annuléevia l’API Aaperture, - lien PDF et bloc de provenance externe dans les vues
invoice,session,contactsi pertinent, - distinction explicite entre état métier interne et état fiscal/provider quand les deux coexistent.
Impacts portail client
- affichage des factures externes dans
/portal/documentset la vue séance, - téléchargement du PDF Pennylane sans exposer directement le provider,
- base UX inchangée pour le client: Aaperture reste la surface de consultation.
Impacts data / DB
- table ou extension de modèle pour stocker:
billing_provider,external_invoice_id,external_status,external_number,external_pdf_key|url,external_payload_snapshot,last_synced_at,sync_error,organization_id,session_id,quote_id,invoice_idsi miroir local.
- conserver un mapping fort organisation/provider pour rester multi-tenant.
- prévoir des index par
organization_id,external_invoice_idetquote_id. - Plan dédié :
docs/ACCOUNTING_EXPORT_GUIDE.md(export comptable; sync Pennylane in-app retiré)
Risques
- divergence entre données métier Aaperture et états Pennylane si la sync est incomplète,
- dépendance externe sur disponibilité API/provider,
- complexité de mapping taxes/avoirs/paiements partiels si le MVP est sur-scopé,
- confusion UX si les statuts externes remplacent trop tôt les statuts métier existants.
Séquencement recommandé
- MVP:
- contrat
BillingProvider, PennylaneProvider,- création facture depuis devis accepté,
- récupération PDF,
- affichage app + portail.
- contrat
- Phase suivante:
- webhooks,
- sync statuts,
- paiements,
- avoirs,
- paiements partiels.
- Long terme:
- relais des statuts de facturation électronique,
- conservation des métadonnées de conformité sans réinternaliser la logique réglementaire.
⏸️ Storage abstraction / Scaleway
Statut (2026-10-23) : étape 1 livrée (abstraction sur R2). Migration Scaleway en pause : on reste sur R2. Point ouvert à la reprise : stratégie de dual-read pour les URLs signées (fallback par existence + cache de localisation, ou copie en masse puis bascule).
Contexte
Le produit repose déjà largement sur du stockage objet pour les documents, fichiers du portail, galeries et rendus média. La décision 2026 consiste à repositionner ce socle vers un fournisseur français / souverain, sans casser les modules applicatifs existants ni réécrire les usages S3.
Objectif technique
Rendre le stockage transparent pour les modules métier via une abstraction stable, puis migrer progressivement de R2 vers Scaleway en gardant une compatibilité S3 complète.
Architecture cible
StorageProvidercomme contrat principal:- upload,
- download,
- delete,
- signed URL,
- copy / move,
- metadata lookup.
R2StorageProviderpour l’existant.ScalewayStorageProviderpour la cible.StorageServiceet les modules applicatifs consomment uniquement l’interface commune.- Les clés métier et conventions de chemins restent stables quel que soit le provider.
Stratégie de migration
- nouveaux uploads dirigés vers Scaleway dès que le provider est prêt,
- dual-read temporaire:
- lecture d’abord sur Scaleway,
- fallback sur R2 pour l’existant,
- lazy migration:
- recopier à la lecture ou par batch worker selon le type de fichier,
- extinction progressive de R2 quand les taux de fallback deviennent marginaux.
Impacts backend / workers / fichiers / galeries
- backend:
- refactor des accès stockage pour éliminer les dépendances directes à R2,
- conservation des URLs signées et règles d’accès existantes.
- workers BullMQ:
- jobs de migration batch,
- copie/réconciliation d’objets,
- vérification checksums et métadonnées.
- documents:
- PDFs générés,
- exports,
- pièces jointes.
- portail:
- upload/download fichiers client,
- lecture de documents et médias.
- galeries et slideshow:
- origin files,
- dérivés,
- assets de rendu vidéo et médias publiés.
Risques
- dette de chemin d’accès si des modules continuent à appeler R2 en direct,
- coût/performance variable pendant la phase dual-read,
- edge cases de signed URLs et headers S3-compatibles selon provider,
- migration incomplète sur les objets rarement lus sans batch complémentaire.
Séquencement recommandé
- ✅ (2026-10-23) Introduire
StorageProvideret le brancher sur R2 sans changement fonctionnel.- un seul
S3CompatibleStorageProvider(backend/src/storage/providers/), configuré par provider : R2 aujourd'hui, Scaleway demain (pas de classe dédiée par provider) ; - plus aucun accès S3 direct hors
storage/providers/: streaming vidéo galeries viaStorageService.getObjectStream(helper partagégalleries-slideshow-stream.utils.ts),file_objects.provider/bucketrenseignés parFileObjectsServicedepuis le provider actif ; - restant pour le dual-read :
r2://et clés nues ne portent pas le provider (seulfile_objectsle fait) ; URLs publiques/signées stockées dans les colonnes*_url;proxyImagen'autorise quecloudflarestorage.com; CSPmediaSrc 'self'.
- un seul
- Ajouter
ScalewayStorageProvideret basculer les nouveaux uploads. - Activer dual-read et lazy migration pour l’existant.
- Ajouter un worker BullMQ de migration/réconciliation pour les buckets volumineux.
- Mesurer fallback, erreurs et latence avant extinction de R2.
État Actuel du Global Search
✅ Fonctionnalités Implémentées :
- Recherche unifiée dans sessions, contacts, devis, factures, et Notion
- Recherche en temps réel avec debounce (300ms)
- Intégration Notion avec recherche dans pages et bases de données
- Navigation complète au clavier (Cmd+K / Ctrl+K, flèches, Enter, Escape)
- Actions rapides (créer session, créer contact)
- Résultats groupés par catégorie avec compteurs
- Interface utilisateur optimisée avec états de chargement séparés
✅ Phase 1 Complétée :
- ✅ Assistant conversationnel IA intégré
- ✅ Builder de vues personnalisées via prompts
- ✅ Génération d'actions complexes
- ✅ Traduction de requêtes en langage naturel en filtres
✅ Phase 2 Complétée :
- ✅ Création assistée par IA d'entités
- ✅ Génération de rapports intelligents
- ✅ Rédaction assistée
🚀 Phase 3 (plan détaillé) : Voir GLOBAL_SEARCH_PHASE3_PLAN.md.
- Priorité haute : Suggestions d’actions contextuelles (selon la route), lien Insights ↔ Global Search/Agent (bloc « Insights récents »).
- Priorité moyenne : Résumé et synthèse (commande/intention « Résumer session/contact »).
- Reporté : Affinage conversationnel multi-tour, prédictions/recommandations (Phase 3.1/3.2).
- Note : L’analyse et insights automatiques sont déjà couverts par le système IA Proactive Insights (LOT A).
📊 Analytics & Reporting
Améliorations identifiées dans la documentation
- ✅ Custom date range presets - Présélections de plages de dates (semaine, mois, trimestre, année)
- Implémenté : Frontend avec presets (week, month, quarter, year, all) dans
AnalyticsPage.tsx
- Implémenté : Frontend avec presets (week, month, quarter, year, all) dans
- ⚠️ Scheduled report generation - Génération automatique de rapports planifiés
- Partiellement implémenté : Les emails peuvent être planifiés (devis, factures, contrats), mais pas la génération automatique de rapports analytics
- ⚠️ Email delivery of reports - Envoi automatique de rapports par email
- Partiellement implémenté : Les emails de devis/factures peuvent être envoyés/planifiés, mais pas les rapports analytics
- ✅ Export to other formats - Export vers Excel, CSV en plus du PDF
- Implémenté : Backend
ExportServicesupporte CSV, Excel (XLSX), JSON et PDF
- Implémenté : Backend
- ⚠️ Custom metrics and KPIs - Métriques personnalisables par l'utilisateur
- À vérifier : Les métriques semblent fixes, pas de personnalisation visible
- ⚠️ Comparison between periods - Comparaison entre différentes périodes (mois vs mois précédent, année vs année précédente)
- À vérifier : Support de date range mais pas d'interface claire pour comparer des périodes
Suggestions supplémentaires
- Tableaux de bord personnalisables - Permettre aux utilisateurs de créer leurs propres tableaux de bord avec les métriques qu'ils souhaitent
- Alertes sur métriques - Notifications automatiques lorsque certaines métriques atteignent des seuils (ex: revenu mensuel > X€)
- Graphiques interactifs - Graphiques cliquables pour explorer les données en détail
- Analyse de tendances prédictives - Utiliser les données historiques pour prédire les tendances futures
- Rapports comparatifs multi-utilisateurs - Comparer les performances entre différents utilisateurs (pour les admins)
📤 Export & Import
Améliorations identifiées dans la documentation
- ✅ Système d'export centralisé - Système unifié pour tous les exports
- Implémenté : Service centralisé
ExportServiceavec support multi-formats - Formats supportés : PDF, Word (DOCX), CSV, Excel (XLSX), JSON
- Entités : Sessions, Contacts, Quotes, Invoices, Conversations, Roadmaps, Contract Templates
- Documentation :
docs/EXPORT_SYSTEM.md
- Implémenté : Service centralisé
- ✅ Exports multi-formats - Support de plusieurs formats pour chaque type d'export
- Implémenté : Tous les exports supportent maintenant PDF, Word, CSV, Excel selon le contexte
- Backend : Endpoints unifiés avec paramètre
format - Frontend : Composant
ExportFormatDialogréutilisable
- ✅ Import functionality for CSV/Excel - Fonctionnalité d'import depuis CSV/Excel
- Implémenté : Service d'import complet avec support CSV et Excel (XLSX, XLS)
- Backend :
ImportServicepour parser les fichiers, services spécialisés pour chaque entité - Entités supportées : Contacts, Sessions, Quotes, Invoices
- Endpoints :
POST /api/import/contacts- Import de contactsPOST /api/import/sessions- Import de sessionsPOST /api/import/quotes- Import de quotesPOST /api/import/invoices- Import d'invoices
- Fonctionnalités : Auto-détection de mapping, validation des données, rapport d'erreurs détaillé, import incrémental
- Renforcement (2026-02-09) : compatibilité Google Contacts améliorée (headers standards) + warnings de déduplication assistée pendant l'import contacts
- Renforcement (2026-02-09, v2) : étape de revue avant import contacts avec pré-analyse backend (
/import/contacts/preview) et décision par ligne (create/update/skip) - Frontend : Composants
ImportButtonet dialogs spécialisés (ImportContactsDialog,ImportSessionsDialog,ImportQuotesDialog,ImportInvoicesDialog) intégrés dans toutes les pages de liste - Documentation :
backend/src/import/,docs/IMPORT_SYSTEM.md
- ✅ Scheduled exports - Exports planifiés automatiques
- Implémenté : Système complet avec table
scheduled_exports, scheduler, et support de récurrence - Fonctionnalités : Récurrence (daily/weekly/monthly/yearly), envoi par email automatique, gestion des statuts
- Endpoints :
GET/POST/PUT/DELETE /api/scheduled-exports - Documentation :
backend/src/scheduled-exports/
- Implémenté : Système complet avec table
- ✅ Email delivery of exports - Envoi automatique d'exports par email
- Implémenté : Support complet dans le processor d'export avec pièces jointes
- Fonctionnalités : Envoi automatique avec sujet et message personnalisables
- Intégration : Utilise
UserEmailSenderServicepour l'envoi
- ✅ Custom field selection - Sélection personnalisée des champs à exporter
- Implémenté : Support via paramètre
fieldsdans les endpoints d'export - Format : Liste de champs séparés par virgules (ex:
?fields=id,title,email) - Disponible pour : Sessions, Contacts, Quotes, Invoices
- Implémenté : Support via paramètre
- ✅ Export templates - Templates d'export pré-configurés
- Implémenté : Système complet avec table
export_templates - Fonctionnalités : Templates réutilisables avec champs sélectionnés, templates par défaut
- Endpoints :
GET/POST/PUT/DELETE /api/export-templates - Documentation :
backend/src/export-templates/
- Implémenté : Système complet avec table
Suggestions supplémentaires
- ✅ Import avec validation - Validation des données importées avec rapport d'erreurs
- Implémenté : Validation complète avec rapport d'erreurs détaillé par ligne
- ✅ Import incrémental - Possibilité de mettre à jour des données existantes via import
- Implémenté : Support via paramètre
updateExisting=true, matching par email ou nom
- Implémenté : Support via paramètre
- ✅ Mapping de champs personnalisé - Permettre le mapping de colonnes CSV vers les champs du CRM
- Implémenté : Auto-détection automatique + support de mapping personnalisé via paramètre JSON
- ❌ Import depuis autres sources - Import depuis Google Contacts, Outlook, etc.
- Non implémenté : À venir
- ❌ Synchronisation bidirectionnelle - Synchronisation automatique avec des sources externes
- Non implémenté : À venir
🔍 Recherche & Filtrage
Recherche Globale (Global Search)
- ✅ Recherche globale unifiée - Recherche unifiée dans toutes les entités (sessions, contacts, devis, factures, Notion)
- ✅ Recherche en temps réel - Recherche avec debounce pour optimiser les performances
- ✅ Intégration Notion - Recherche dans les pages et bases de données Notion
- ✅ Navigation au clavier - Navigation complète au clavier (Cmd+K / Ctrl+K, flèches, Enter)
- ✅ Actions rapides - Actions rapides depuis la recherche (créer session, créer contact)
- ✅ Résultats groupés - Résultats organisés par catégorie avec compteurs
- ⚠️ Recherche sémantique - Recherche intelligente basée sur le sens (partiellement implémenté via filtrage Notion)
- ⚠️ Historique de recherche - Conserver l'historique des recherches récentes (non implémenté)
🤖 Global Search & Intelligence Artificielle
Phase 1 : Assistant IA pour la construction de vues et actions (Priorité Haute) ✅
- ✅ Assistant conversationnel intégré - Un chatbot IA accessible directement depuis le Global Search (Cmd+K) pour répondre aux questions et exécuter des commandes
- Exemple : "Quel est le revenu total du mois dernier ?", "Montre-moi les sessions avec Jean Dupont."
- Implémenté : Détection multilingue (français/anglais), vérification OpenAI, traitement automatique
- ✅ Création assistée par IA de vues personnalisées - Générer des vues filtrées et personnalisées à partir de prompts en langage naturel
- Exemple : "Crée une vue des sessions de mariage du mois de juillet avec un montant supérieur à 2000€"
- Exemple : "Affiche tous les contacts qui n'ont pas eu de session depuis 6 mois"
- Exemple : "Montre-moi les devis en attente pour les sessions de type 'portrait'"
- Implémenté : Génération de filtres intelligents, application automatique des filtres
- ✅ Génération d'actions complexes - L'IA peut générer et exécuter des actions complexes basées sur des prompts
- Exemple : "Crée une facture pour toutes les sessions payées du mois dernier"
- Exemple : "Je veux créer une session pour Fred Le Marquier pour son mariage le 22 août 2026"
- Exemple : "Créez moi un contact et un devis de 2000€ pour cette session"
- Implémenté : Auto-exécution des actions, actions composites (contact + session + devis), notifications automatiques
- ✅ Builder de filtres intelligents - L'IA traduit les requêtes en langage naturel en filtres complexes
- Exemple : "Sessions de mariage en été 2024 avec montant > 3000€" → Filtres automatiques appliqués
- Implémenté : Traduction automatique en filtres structurés, application aux requêtes DB
- Exemple : "Contacts actifs avec au moins 2 sessions cette année" → Filtres et agrégations automatiques
Phase 2 : Création assistée par IA (Priorité Moyenne) ✅
- ✅ Création assistée par IA d'entités - Générer des brouillons de sessions, contacts, devis, factures à partir de prompts
- Exemple : "Crée une nouvelle session photo pour le mariage de Marie et Pierre le 15 juillet 2024 à Paris, avec un devis de 2500€."
- Implémenté : Service
AiCreationServiceavec endpointPOST /api/ai-assistant/draft - Fonctionnalités : Génération de brouillons pour sessions, contacts, devis, factures avec suggestions et avertissements
- Fichiers :
backend/src/ai-assistant/ai-creation.service.ts
- ✅ Génération de rapports intelligents - Demander des rapports personnalisés via des prompts, l'IA agrège les données et génère le rapport
- Exemple : "Génère un rapport PDF des revenus par type de session pour le dernier trimestre."
- Implémenté : Service
AiReportServiceavec endpointPOST /api/ai-assistant/report - Fonctionnalités : Génération de rapports avec sections, insights, recommandations basées sur les données fournies
- Fichiers :
backend/src/ai-assistant/ai-report.service.ts
- ✅ Rédaction assistée - Utiliser l'IA pour générer des ébauches d'emails, de descriptions de sessions, de notes de contact, etc.
- Exemple : "Rédige un email de suivi pour le devis #2024-001 en rappelant les avantages de notre offre."
- Implémenté : Service
AiWritingServiceavec endpointPOST /api/ai-assistant/writing - Fonctionnalités : Génération d'emails, descriptions, notes avec support de contexte, ton, langue
- Fichiers :
backend/src/ai-assistant/ai-writing.service.ts
- Statut : ✅ Complété (2025-01-XX)
- Documentation :
backend/src/ai-assistant/README.md,docs/AI_SEARCH_ARCHITECTURE.md
Phase 3 : Intelligence avancée (plan révisé 2026-02-28)
Voir le plan détaillé GLOBAL_SEARCH_PHASE3_PLAN.md.
- Analyse et insights automatiques : Déjà couvert par le système IA Proactive Insights (LOT A). Phase 3 = lien Global Search/Agent vers les insights (bloc « Insights récents »).
- Suggestions d'actions contextuelles : À implémenter – selon la route/page actuelle, afficher des actions rapides (ex. « Créer une session », « Voir les devis ») dans le Global Search ou l’Agent.
- Recherche conversationnelle : Partiellement couverte (requêtes en langage naturel). Affinage multi-tour reporté en Phase 3.1.
- Prédictions et recommandations : Reporté (Phase 3.2), chantier métier/ML dédié.
- Résumé et synthèse : À implémenter – commande/intention « Résumer session/contact » via le service d’écriture IA existant.
🤖 Chat agent & commandes (Priorité)
- ✅ Complété (2026-02-06) : Refonte du chat avec commandes en
/(ex./contact,/session,/devis,/facture,/aide) et auto‑complétion. Détection backend, routage vers form builder structuré. Frontend : suggestions à la saisie, navigation clavier, tokens inline (actions/contexte). - ✅ Complété (2026-02-06) : Dual‑mode (commandes vs conversation libre) + fichiers de conversation avec OCR pour enrichir le contexte IA.
- Objectifs : Sécurisation des insertions, UX guidée, réduction des données incomplètes ou en double.
- Documentation : REFONTE_CHAT_AGENT.md
Sécurisation des insertions (agent & commandes)
- ✅ Complété (2026-02-06) :
- Contact : email requis pour toute création via l’agent (création uniquement via form builder).
- Session : start_date, title, location obligatoires via l’agent.
- Doublons : Interdiction de créer un contact dont l’email existe déjà pour le même owner. Pas d’option "Créer quand même" pour l’email ; seule action proposée : "Utiliser le contact existant". L’option "Créer quand même" est conservée uniquement pour le doublon par nom (similarité prénom/nom), avec confirmation explicite. Optionnel : même règle pour le numéro de téléphone.
Gestion des doublons (contacts)
- Accès : Bouton "Gérer les doublons" en haut de la liste des contacts et sur le dashboard d’accueil.
- Regroupement : Détection des groupes de contacts susceptibles d’être la même personne par email (même email normalisé) ou par numéro de téléphone (même numéro normalisé). Vue par critère (email, téléphone, ou combinée).
- Fusion : Pour chaque groupe, prévisualisation des fiches et des données liées (sessions, devis, factures, documents, etc.). L’utilisateur choisit le contact à conserver ; le système réattribue toutes les entités liées au contact conservé puis supprime les anciennes fiches (avec confirmation explicite, optionnellement soft-delete + délai de restauration).
- État d’implémentation (2026-02-08) :
- ✅ UI workspace
frontend/src/pages/contacts/ContactDuplicatesPage/ContactDuplicatesPage.tsx: tri, recherche, badges de confiance, prévisualisation. - ✅ Endpoint preview
POST /contacts/merge/preview: conflits de champs + réattributions. - ✅ Endpoint merge enrichi
POST /contacts/merge:fieldOverrides+ réponse détailléereassignedEntities. - ✅ Audit enrichi sur fusion (
MERGE CONTACT) avec metadata (IDs fusionnés et métriques de réattribution). - ✅ E2E
frontend/e2e/contacts-duplicates.spec.ts(wizard de preview). - ✅ Liste contacts : sélection multiple + suppression en lot + raccourci "Fusionner la sélection".
- ✅ Dashboard : CTA vers dédoublonnage masqué automatiquement quand aucun doublon n’est détecté.
- ✅ Liste sessions : mode sélection + suppression en lot + règles UI harmonisées (colonne actions conservée, menu désactivé en mode sélection).
- ✅ Listes quotes & invoices : mode sélection + suppression en lot + comportement UI aligné avec les autres listes.
- ✅ Nettoyage OCR list views : bloc "Documents avec OCR" retiré des vues Session et Contact pour alléger l'UX.
- ✅ Page
/documentsretirée du frontend (routes + navigation nettoyées). - ✅ Documents liés (SessionView + ContactView) : mode sélection + suppression en lot branchés via
FileList. - ✅ Standard de sélection factorisé : composant partagé
ListHeaderActionsbranché sur Contacts/Sessions/Quotes/Invoices/Contracts. - ✅ Workspace dédoublonnage : filtres synchronisés à l'URL (
groupBy,q,showIgnored) pour restauration/partage de l'état.
- ✅ UI workspace
- Documentation : Référence dans PRIORITES.md.
💬 Messagerie & Communication
État actuel
- ✅ Messagerie globale (app) : vue centralisée avec liste de contacts + amis, tri par dernier message, pastilles non‑lus, actions rapides
- ✅ Messages portail client : fil de discussion client avec notifications UI et gestion “compte client non créé”
- ✅ Fichiers en conversation : pièces jointes client ↔ photographe, previews images sécurisées via URL signées, modal plein écran
- ✅ Upload résilient : presigned URL + fallback backend en cas de CORS
- ✅ Temps réel : événements WebSocket communs pour messages + fichiers (rafraîchissement conversations et fichiers)
- ✅ Routes agnostiques : endpoints app en
/client-messages/app/*(alias legacy conservé) - ✅ Invitations auto : si le client n’a pas de compte, l’email d’invitation est envoyé avec aperçu du message
- ✅ Notifications différées : email d’alerte sur le 1er message non‑lu après délai, annulé si lecture
- ✅ Préférences utilisateur : toggle pour activer/désactiver ces notifications dans une sidebar settings
Améliorations futures
- ⚠️ Présence temps réel complète : WebSocket + last_seen_at plus précis pour clients et amis
- ⚠️ Recherche avancée : recherche plein‑texte dans conversations et messages
- ⚠️ Archivage : archivage/restauration de conversations côté app et portail
Suggestions supplémentaires
- Filtres sauvegardés - Sauvegarder des combinaisons de filtres fréquemment utilisées
- Recherche par tags - Recherche et filtrage avancé par tags avec opérateurs logiques (ET, OU, SAUF)
- Suggestions de recherche - Autocomplétion intelligente basée sur les données existantes
💡 Insights Proactifs & Intelligence
LOT A : IA Proactive Insights (MVP Production) ✅ 100% COMPLÉTÉ
Objectif : Générer des insights actionnables basés sur les données CRM (devis, factures, sessions, bookings, checklists, emails), les pousser en notifications in-app + push, et les afficher dans un panneau Insights.
Approche MVP : Règles déterministes (pas de LLM au début) pour garantir la fiabilité et la performance.
Statut : ✅ 100% complété (2026-01-27) - Toutes les fonctionnalités MVP implémentées et opérationnelles
Documentation : PLAN_AMELIORATIONS_CRM.md (sections Insights / lots livrés)
Fonctionnalités implémentées :
- ✅ 8 règles d'insights (QuoteStale, InvoiceOverdue, InvoicePartiallyPaid, SessionPrepMissing, SessionPostprodLag, SessionWithoutDelivery, BookingUpcoming, ChecklistIncomplete)
- ✅ Génération automatique quotidienne (scheduler 3h du matin)
- ✅ Génération réactive via events (quote status changed, invoice created, etc.)
- ✅ Queue BullMQ avec processor et retry/backoff
- ✅ API complète (7 endpoints REST)
- ✅ Interface utilisateur avec filtres avancés
- ✅ Notifications in-app + WebSocket + push
- ✅ Badge compteur dans sidebar
- ✅ Tests unitaires (>80% coverage)
- ✅ i18n FR/EN complet
- ✅ Vague A: action
CREATE_TASKnavigates todeepLink(no inline task create from Insights card)
A1. Modèle & Persistence
- Tables :
ai_insights,ai_insight_events,ai_insight_feedback - Enums :
insight_type,insight_severity,insight_status,insight_feedback_rating,insight_event_type - Indexes : Optimisés pour requêtes par owner_id, status, type, severity
- Déduplication : Contrainte unique sur
(unique_key, owner_id)pour éviter les doublons - Migrations : Liquibase avec up/down
- Types : Kysely types complets
Types d'insights prévus :
QUOTE_STALE- Devis envoyés > N jours sans réponseINVOICE_OVERDUE- Factures en retardINVOICE_PARTIALLY_PAID- Factures partiellement payéesSESSION_PREP_MISSING- Sessions proches sans checklist complèteSESSION_POSTPROD_LAG- Sessions passées sans tâche post-prodSESSION_WITHOUT_DELIVERY- Sessions passées sans livraisonBOOKING_UPCOMING- Réservations à venirCHECKLIST_INCOMPLETE- Checklists incomplètes pour sessions proches
A2. Génération "Rules First"
- Engine de règles :
InsightRuleEngineServiceorchestrant toutes les règles - Règles isolées : Chaque règle dans un fichier séparé, testable individuellement
- 0 appel OpenAI : Approche déterministe en MVP pour garantir la fiabilité
- Structure :
backend/src/insights/generation/rules/- Toutes les règlesbackend/src/insights/generation/insight-rule-engine.service.ts- Engine principalbackend/src/insights/generation/insights-generator.service.ts- Service de génération
Exemple de règle : QuoteStaleRule détecte les devis envoyés depuis plus de 7 jours sans réponse, calcule la sévérité (INFO/WARN/CRITICAL) selon le nombre de jours, génère un insight avec actions suggérées (voir devis, envoyer rappel).
A3. Job + Queue + Notifications
- Queue BullMQ :
ai-insightsavec processor dédié - Scheduler quotidien : Génération automatique à 2h du matin pour tous les utilisateurs actifs
- Triggers event-driven : Génération immédiate sur événements (quote status changed, invoice overdue, session date approaching)
- Notifications :
- Notification in-app via
NotificationsService - WebSocket event
insights:newpour updates temps réel - Push notification (si activé)
- Notification in-app via
- Idempotence : Unique jobId pour éviter les exécutions multiples
- Retry/Backoff : Gestion des erreurs avec retry exponentiel
A4. API + UI
Backend :
GET /api/insights- Liste paginée avec filtres (status, severity, type)GET /api/insights/unread-count- Compteur d'insights non lusPOST /api/insights/:id/read- Marquer comme luPOST /api/insights/:id/archive- ArchiverPOST /api/insights/:id/feedback- Feedback utilisateur (UP/DOWN)POST /api/insights/run- Déclencher génération manuelle (debug/admin)
Frontend :
- Page Insights Center :
/insightsavec onglets (Open / Read / Archived) - Composant InsightCard : Affichage avec titre, résumé, sévérité, actions suggérées
- Badge compteur : Dans le header avec nombre d'insights non lus
- Filtres : Par type, sévérité, statut
- Actions : Deep links vers entités, CTA pour actions suggérées
- WebSocket : Updates temps réel lors de création d'insights
Fonctionnalités :
- ✅ Déduplication automatique via
unique_key - ✅ TTL logique avec
expires_atpour insights obsolètes - ✅ Feedback utilisateur pour améliorer la pertinence
- ✅ Audit trail complet via
ai_insight_events
Corrections Post-MVP (2026-01-27)
Problèmes résolus :
- ✅ Correction des noms de colonnes SQL (
invoice_number→number) - ✅ Correction des références aux alias dans les clauses
having - ✅ Sérialisation JSONB explicite pour éviter les erreurs de double sérialisation
- ✅ Gestion des paramètres de requête avec valeurs par défaut
- ✅ Configuration complète de la navigation et breadcrumbs
LOT B : Insights v2 - LLM-assisted summarization ✅ 100% COMPLÉTÉ
Statut : ✅ 100% complété (2026-01-27) - Service d'enrichissement LLM opérationnel
Objectif : Enrichir (pas remplacer) les insights générés par les règles avec :
- ✅ Titre plus naturel et contextuel
- ✅ Résumé court (1-2 lignes) généré par LLM
- ⚠️ Recommandations plus intelligentes basées sur le contexte (futur)
- ⚠️ Déduplication sémantique (détecter des insights similaires) (futur)
Fonctionnalités implémentées :
- ✅ Service
InsightEnrichmentServicepour enrichir les insights avec LLM - ✅ Cache des résultats (7 jours) pour éviter les appels répétés
- ✅ Anonymisation des données avant envoi à OpenAI (IDs remplacés par
[ID]) - ✅ Fallback gracieux sur les valeurs originales en cas d'erreur
- ✅ Gestion des timeouts avec
withTimeout - ✅ Intégration dans
InsightsGeneratorServiceavec dégradation gracieuse - ✅ Activation automatique basée sur la présence d'une clé OpenAI dans les métadonnées utilisateur
- ✅ Tests unitaires complets (11 tests, 100% passants)
Contraintes respectées :
- ✅ Ne remplace pas les règles déterministes (garantie de fiabilité)
- ✅ Utilise OpenAI uniquement pour l'enrichissement
- ✅ Cache des résultats LLM pour éviter les coûts répétés
- ✅ Fallback sur les valeurs générées par les règles si LLM échoue
- ✅ Appels OpenAI uniquement pour enrichissement, sur payload minimal + anonymisé
- ✅ Cache TTL (7 jours) + timeouts configurés
Activation :
- L'enrichissement LLM est automatiquement activé si l'utilisateur a une clé OpenAI configurée dans ses métadonnées
- Si la clé OpenAI n'est pas configurée, les valeurs originales (générées par les règles) sont utilisées
- Aucune configuration supplémentaire n'est nécessaire
Documentation : PLAN_AMELIORATIONS_CRM.md (sections Insights / lots livrés) - Section "LOT B"
LOT C : Support Multi-Tenant ✅ 100% COMPLÉTÉ
Statut : ✅ 100% complété (2026-01-27) - Support multi-tenant opérationnel
Objectif : Étendre le système d'insights pour supporter les organisations.
Fonctionnalités implémentées :
- ✅ Génération d'insights au niveau organisation (insights partagés entre membres)
- ✅ Filtrage par organisation dans l'API et l'UI
- ✅ Permissions : Vérification de l'appartenance à l'organisation avant accès
- ✅ Notifications : Tous les membres de l'organisation sont notifiés des nouveaux insights
- ✅ Déduplication : Insights personnels et organisation séparés avec clés uniques distinctes
- ✅ Backward compatibility : Par défaut, affichage des insights personnels uniquement
- ✅ Listener WebSocket
insights:newdans le frontend pour mise à jour en temps réel
Comportement :
- Insights personnels :
organization_id = null, visibles uniquement par le propriétaire - Insights organisation :
organization_id = "org-1", visibles par tous les membres de l'organisation - Lors de la génération, les insights sont créés à la fois au niveau personnel ET au niveau de chaque organisation de l'utilisateur
- Le frontend permet de filtrer entre insights personnels et insights d'organisation via un sélecteur
Documentation : PLAN_AMELIORATIONS_CRM.md (sections Insights / lots livrés) - Section "LOT C"
LOT D : Personnalisation et Configuration ✅ 100% COMPLÉTÉ
Statut : ✅ 100% complété (2026-01-27) - Système de configuration complet et opérationnel
Objectif : Permettre aux utilisateurs de personnaliser les règles d'insights et les notifications.
Fonctionnalités implémentées :
- ✅ Configuration des seuils (ex: nombre de jours pour "devis en attente")
- ✅ Activation/désactivation de règles spécifiques
- ✅ Configuration des emails d'insights :
- ✅ Activation/désactivation de l'envoi d'emails par utilisateur ou organisation
- ✅ Configuration du contenu : types d'insights à inclure (par type, sévérité)
- ✅ Configuration de l'heure de diffusion (ex: résumé quotidien à 8h, hebdomadaire le lundi)
- ✅ Format : résumé quotidien/hebdomadaire ou notification immédiate pour insights critiques
- ✅ Templates HTML avec statistiques et liens directs
- ✅ Support multi-tenant (settings personnels et organisation, avec fusion intelligente)
- ✅ Intégration dans le rule engine (seuils configurables appliqués automatiquement)
- ⚠️ Règles personnalisées (futur : permettre aux utilisateurs de créer leurs propres règles)
Détails emails d'insights :
- ✅ Niveau utilisateur : Configuration personnelle dans les paramètres utilisateur
- ✅ Niveau organisation : Configuration partagée pour tous les membres (gérée par OWNER/ADMIN)
- ✅ Types de diffusion :