Ceci est une ancienne révision du document !
J'ai maintenant une vue complète du schéma. Je vais produire une analyse structurée.Voici une analyse complète du schéma.—
## Architecture générale
Le schéma modélise une plateforme SaaS de gestion locative (type Property Management System). Il suit une architecture multi-tenant stricte où `Tenant` est l'agrégat racine — presque tous les autres modèles portent un `tenantId` et toutes les relations remontent à lui. L'isolation des données entre agences est donc garantie au niveau du schéma, pas seulement applicatif.
On compte ~75 modèles et ~38 enums, répartis en 20 domaines.
—
## Les 20 domaines en détail
Core infrastructure (teal)
`Tenant` est le point d'entrée unique. `User` porte l'auth complète : sessions, refresh tokens, historique de connexion, MFA multi-méthode, préférences. Le RBAC est flexible via `Role → Permission` avec une table de jointure `UserRole / RolePermission` — les rôles sont globaux (`code` unique), les assignations sont par user.
Transactionnel (coral)
C'est le cœur métier. `Reservation` est le pivot central autour duquel gravitent `Contract`, `Payment`, `Invoice`, `ReservationPricing`, `ReservationGuest`, et l'historique de statuts. Une réservation peut avoir plusieurs contrats (versions successives) et plusieurs paiements. La chaîne de valeur complète est tracée : réservation → contrat signé → paiement → facture → écriture comptable.
CRM (bleu)
Deux populations distinctes sont gérées : `Customer` (voyageurs ayant réservé) et `Lead` (prospects). Les leads avancent dans un `Pipeline` à travers des `PipelineStage` vers des `Opportunity`. Les deux populations sont reliées aux `Task`, `Activity`, `Campaign`, et peuvent participer aux `Conversation` comme les propriétaires et les utilisateurs internes.
OTA & Channel Manager (amber)
Un `Channel` (Airbnb, Booking, VRBO…) se connecte via `ChannelConnection` (credentials par tenant). Une `PropertyDistribution` lie un bien à une connexion de canal. Les réservations importées passent par `ChannelReservation`. Les synchros sont loggées dans `SyncExecution / SyncError` avec compteurs de succès/erreurs.
Revenue Management (amber)
`PricingRule` définit des règles conditionnelles (Json `conditions` + `actions`). `DynamicPrice` stocke le prix calculé par bien par jour avec ses facteurs (occupation, saisonnalité, demande, compétiteur). `RevenueForecast` et `RevenueSimulation` permettent la prévision et le what-if. `CompetitorSnapshot` et `MarketDemand` alimentent les facteurs externes.
Governance (gris)
`Workflow` avec `WorkflowStep`, `WorkflowInstance`, et `WorkflowExecution` modélise les circuits d'approbation multi-étapes. `AuditLog` trace toutes les actions (CREATE, UPDATE, DELETE, LOGIN…). `EntityHistory` snapshote les versions successives d'une entité. `FeatureFlag` permet le feature toggling par tenant.
Enterprise Security (gris)
`Consent` gère le RGPD (6 types de consentement, avec versionning). `SecurityPolicy` stocke les règles de sécurité configurables. `Risk` modélise une matrice de risques (probabilité × impact = score). `ComplianceAudit` supporte ISO27001, SOC2, NIS2. `SecurityIncident` trace les incidents avec gravité et actions correctives. `DataClassification` et `RetentionPolicy` complètent le dispositif.
IA — Phase 2-N (rose)
Trois nouvelles couches ajoutées. `AiConversation / AiMessage` historisent les échanges avec l'assistant (4 rôles : SYSTEM, USER, ASSISTANT, TOOL). `KnowledgeDocument / KnowledgeChunk` implémentent la base documentaire pour le RAG — un document est découpé en chunks avec un `embeddingId` (référence vers le vecteur stocké dans un vector store externe). `Recommendation` stocke les recommandations IA avec un `confidenceScore` et un flag `accepted`.
—
## Points de design notables
Patterns récurrents bien appliqués : soft delete via `deletedAt` sur User, Customer, Owner, Property. Unicité tenant-scoped (`@@unique([tenantId, code])`) sur une vingtaine de modèles. Timestamps `createdAt / updatedAt` systématiques. Index sur toutes les FK et les champs filtrés fréquemment.
Flexibilité via Json : `conditions`, `actions`, `configuration`, `assumptions`, `payload` sont stockés en Json sur plusieurs modèles — c'est un choix délibéré pour la variabilité des règles métier, au prix de l'impossibilité de les requêter côté DB.
Multi-acteur dans Messaging : `ConversationParticipant` et `Message` supportent trois types d'émetteurs (User, Customer, Owner) via des FK optionnelles. Le fix appliqué (UUID propre + `@@unique` nullable) est la bonne approche PostgreSQL.
Un point d'attention : `AutomationExecution` a maintenant `automationRuleId` et `automationScenarioId` tous deux optionnels — il n'y a pas de contrainte DB qui force qu'exactement l'un des deux soit renseigné. C'est à gérer au niveau applicatif (ou via une check constraint en migration SQL manuelle).