Skip to content

Module — Notes & Notifications

Synchronisé avec le code. Mettre à jour à chaque changement structurel.

Rôle

  • Notes : annotations textuelles polymorphes attachables à diverses entités (Booking, Travel, Customer, Occurrence, LoadingTable, etc.) via le mécanisme NoteTags.
  • Notifications : alertes poussées aux utilisateurs back-office (cloche dans l'UI), typiquement via SignalR.

Emplacement

  • Pages : src/Web/Pages/Notes/
  • Services : NoteService, NotificationService
  • Vue : src/Web/Frontend/Vue/src/notes/
  • Hubs SignalR : BookingTrackingHub, EditFormActivityTrackingHub (potentiels canaux de notification)

Entités principales

  • Note — annotation. Champs :
    • Tag (cf. Domain/Enum/NoteTags.cs) : sur quelle catégorie d'entité l'annotation est posée.
    • EntityId (Guid) : ID de l'entité ciblée.
    • Content : texte libre.
    • Auditable (qui, quand).
  • Notification — message destiné à un User back-office.

NoteTags enum (à valider)

Tags identifiés dans le code (utilisés via noteEntity = '@NoteTags.LoadingTable.ToString()' côté Razor) :

  • Booking, Travel, Customer, Occurrence, LoadingTable, …

Règles métier spécifiques

  • Une note est annotation pure (pas un événement métier déclencheur).
  • Les notifications sont transversales : tout module peut en émettre via INotificationService.
  • Le pattern Razor pour ouvrir le drawer de notes : initNotesDrawerButton('xxxNotesButton', true) côté JS, configuré avec noteEntity + noteEntityId globaux.

Points d'attention / pièges

  • Polymorphisme implicite : une Note est liée par Tag + EntityId (pas FK). Suppression de l'entité parente ne cascade PAS sur les notes — orphelins potentiels en base.
  • Index IX_Notes_Entity_EntityId (migration AddNotesEntityIndex, 11.08.2026) : la table fait ~780 000 lignes et n'avait que la PK sur Id. La lecture polymorphe NoteService.GetAllByEntity (WHERE EntityId = @p AND Entity = @p) scannait donc l'index cluster entier — 295 ms par appel, la requête la plus coûteuse de l'instance, sur tous les écrans affichant des annotations. La colonne Entity passe de nvarchar(max) à nvarchar(450) (contrainte SQL Server pour indexer) : sans risque, la plus longue valeur en prod fait 10 caractères pour 5 valeurs distinctes.
  • NoteTags doit rester synchro avec les usages côté UI (cf. _Layout.cshtml, partials avec noteEntity).
  • Notifications réseau via SignalR : les hubs sont déclarés dans Startup.cs > Configure.

Conventions locales

  • Le drawer de notes est un composant Vue partagé monté sur les pages qui le nécessitent.

Dépendances

  • ↔ Toutes les entités annotables (Booking, Travel, Customer, Occurrence, LoadingTable…).
  • → SignalR (notifications temps réel).

Contributors

No contributors

Changelog

No recent changes