Table des matières
Sprint 6 — Multi-Propriétés & Gestion du Parc
Objectif
Faire évoluer la plateforme d'un modèle mono-propriété vers une plateforme Enterprise multi-sites.
Cette couche permet de gérer :
Portefeuilles Groupes de propriétés Propriétaires Exploitants Actifs Performance globale
sur plusieurs centaines ou milliers de propriétés.
À l'issue du Sprint 6 :
✓ Portfolio Management ✓ Property Groups ✓ Owners ✓ Operators ✓ Asset Management ✓ Portfolio Analytics ✓ Enterprise Multi-Property Platform
Architecture cible
Tenant ↓ Portfolio ├── Property Groups ├── Properties ├── Owners ├── Operators ├── Assets └── Portfolio Analytics ↓ Reservations ↓ Finance ↓ Operations
Domaines métier
Le Sprint 6 introduit :
Portfolio PropertyGroup Owner Operator Asset AssetAssignment PortfolioAnalytics PortfolioKPI
Sous-sprints
Sprint 6-A
Fondation Multi-Propriétés
Portfolio Property Groups Owners Operators
Sprint 6-B
Asset Management
Assets Lifecycle Assignments Maintenance Integration
Sprint 6-C
Portfolio Analytics
Portfolio KPIs Revenue Occupancy Benchmarking Forecasting
Sprint 6-D
Enterprise Governance
Multi-Site RBAC Approvals Compliance Delegation
Livrables fin Sprint 6
Portfolio Engine Property Group Management Owner Management Operator Management Asset Platform Portfolio Analytics Enterprise Multi-Site Platform
Sprint 6-A.1 — Implémentation Prisma Portfolio Core
Objectif
Créer la fondation Multi-Propriétés Enterprise.
Cette couche permet de regrouper plusieurs propriétés dans des structures hiérarchiques :
Tenant ↓ Portfolio ↓ Property Group ↓ Properties
avec gestion des :
Propriétaires Exploitants Groupes Portefeuilles
À l'issue de cette étape :
✓ Portfolio ✓ PropertyGroup ✓ Owner ✓ Operator ✓ Multi-Property Ready ✓ Finance Ready ✓ Reservation Ready ✓ Analytics Ready
Architecture cible
Tenant ↓ Portfolio ├── Property Groups │ ├── Owners │ ├── Operators │ └── Properties ↓ Reservations ↓ Finance ↓ Analytics
Sprint 6-A.1-A
Extension Prisma
Étape 1 — Portfolio
Ajouter dans schema.prisma
model Portfolio {
id String
@id
@default(uuid())
tenantId String
name String
code String
@unique
description String?
active Boolean
@default(true)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
tenant Tenant
@relation(
fields:[tenantId],
references:[id]
)
propertyGroups PropertyGroup[]
properties Property[]
@@index([tenantId])
@@index([active])
@@index([code])
}
Étape 2 — PropertyGroup
Ajouter
model PropertyGroup {
id String
@id
@default(uuid())
tenantId String
portfolioId String
name String
code String
description String?
active Boolean
@default(true)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
portfolio Portfolio
@relation(
fields:[portfolioId],
references:[id],
onDelete:Cascade
)
properties Property[]
@@unique([
portfolioId,
code
])
@@index([tenantId])
@@index([portfolioId])
@@index([active])
}
Étape 3 — Owner
Ajouter
model Owner {
id String
@id
@default(uuid())
tenantId String
ownerCode String
@unique
type OwnerType
companyName String?
firstName String?
lastName String?
email String?
phone String?
taxIdentifier String?
active Boolean
@default(true)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
properties Property[]
@@index([tenantId])
@@index([ownerCode])
@@index([active])
}
Étape 4 — Operator
Ajouter
model Operator {
id String
@id
@default(uuid())
tenantId String
operatorCode String
@unique
companyName String
email String?
phone String?
active Boolean
@default(true)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
properties Property[]
@@index([tenantId])
@@index([operatorCode])
@@index([active])
}
Étape 5 — OwnerType
Ajouter
enum OwnerType {
INDIVIDUAL
COMPANY
INVESTMENT_FUND
REIT
GOVERNMENT
}
Sprint 6-A.1-B
Extension du modèle Property
Étape 6 — Ajouter Portfolio
Dans Property
portfolioId String?
portfolio Portfolio?
@relation(
fields:[portfolioId],
references:[id]
)
Étape 7 — Ajouter Property Group
Dans Property
propertyGroupId String?
propertyGroup PropertyGroup?
@relation(
fields:[propertyGroupId],
references:[id]
)
Étape 8 — Ajouter Owner
Dans Property
ownerId String?
owner Owner?
@relation(
fields:[ownerId],
references:[id]
)
Étape 9 — Ajouter Operator
Dans Property
operatorId String?
operator Operator?
@relation(
fields:[operatorId],
references:[id]
)
Étape 10 — Ajouter Index
@@index([portfolioId]) @@index([propertyGroupId]) @@index([ownerId]) @@index([operatorId])
Sprint 6-A.1-C
Relations Tenant
Étape 11 — Ajouter
Dans Tenant
portfolios Portfolio[] owners Owner[] operators Operator[]
Étape 12 — Multi-Tenant
Garantir
que :
Portfolio PropertyGroup Owner Operator
appartiennent toujours au même :
tenantId
Sprint 6-A.1-D
Contraintes Métier
Étape 13 — Portfolio
Supporter
1 Tenant ↓ N Portfolios
Étape 14 — Property Group
Supporter
1 Portfolio ↓ N Property Groups
Étape 15 — Owner
Supporter
1 Owner ↓ N Properties
Étape 16 — Operator
Supporter
1 Operator ↓ N Properties
Sprint 6-A.1-E
Finance Ready
Étape 17 — Préparer
Compatible avec :
Revenue Sharing Owner Statements Commission Engine Asset Accounting
Étape 18 — Préparer
Compatible avec :
Multi-Owner Properties Operator Contracts Portfolio Finance
Sprint 6-A.1-F
Reservation Ready
Étape 19 — Préparer
Compatible avec :
Portfolio Occupancy Group Reservations Multi-Site Reporting
Étape 20 — Préparer
Compatible avec :
Cross Property Search Portfolio Analytics Enterprise Reporting
Sprint 6-A.1-G
Analytics Ready
Étape 21 — Préparer
Compatible avec :
Portfolio Revenue Portfolio Occupancy Benchmarking Forecasting Asset Performance
Étape 22 — Préparer
Compatible avec :
Executive Dashboard Owner Dashboard Operator Dashboard
Sprint 6-A.1-H
Migration
Étape 23 — Générer
npx prisma migrate dev \
--name portfolio_core
Étape 24 — Générer
npx prisma generate
Étape 25 — Vérifier
npx prisma studio
Présence de :
Portfolio PropertyGroup Owner Operator
Définition de terminé
Le Sprint 6-A.1 est terminé lorsque :
✓ Portfolio créé ✓ PropertyGroup créé ✓ Owner créé ✓ Operator créé ✓ Relations Property créées ✓ Relations Tenant créées ✓ Multi-Tenant Ready ✓ Finance Ready ✓ Analytics Ready ✓ Migration exécutée
Livrables
Portfolio PropertyGroup Owner Operator OwnerType Portfolio Core Schema
Sprint 6-A.2 — Gestion Multi-Propriétés Enterprise
Objectif
Construire la couche métier Multi-Propriétés Enterprise.
Cette couche permet de gérer :
Portefeuilles Groupes de propriétés Propriétaires Exploitants Hiérarchie multi-sites Sécurité multi-niveaux
à partir d'une interface unique.
À l'issue de cette étape :
✓ PortfolioModule ✓ PropertyGroupModule ✓ OwnerModule ✓ OperatorModule ✓ Portfolio Hierarchy ✓ Portfolio Security ✓ Portfolio Dashboard ✓ Enterprise Multi-Site Management
Architecture cible
Portfolio ├── Property Groups │ ├── Properties │ ├── Owners │ ├── Operators │ └── Portfolio Dashboard ↓ Reservations ↓ Finance ↓ Analytics
Sprint 6-A.2-A
Modules Métier
Étape 1 — Création
src/modules/portfolio ├── portfolio │ ├── property-groups │ ├── owners │ ├── operators │ ├── dashboard │ └── portfolio.module.ts
Étape 2 — Services
Créer
PortfolioService PropertyGroupService OwnerService OperatorService PortfolioHierarchyService PortfolioDashboardService
Étape 3 — Controllers
Créer
PortfolioController PropertyGroupController OwnerController OperatorController PortfolioDashboardController
Sprint 6-A.2-B
Gestion des Portefeuilles
Étape 4 — PortfolioService
Créer
portfolio.service.ts
Méthodes
createPortfolio() updatePortfolio() archivePortfolio() getPortfolio() getPortfolioSummary()
Étape 5 — Endpoints
Ajouter
GET /portfolios
GET /portfolios/{id}
POST /portfolios
PUT /portfolios/{id}
DELETE /portfolios/{id}
Étape 6 — Validation
Vérifier
tenantId unicité code ownership
sur chaque opération.
Sprint 6-A.2-C
Gestion des Groupes
Étape 7 — PropertyGroupService
Créer
property-group.service.ts
Méthodes
createGroup() assignProperty() removeProperty() moveProperty()
Étape 8 — Structure
Supporter
Portfolio ↓ Region ↓ City ↓ Properties
Étape 9 — Endpoints
Ajouter
GET /property-groups
POST /property-groups
PUT /property-groups/{id}
DELETE /property-groups/{id}
POST /property-groups/{id}/properties
Sprint 6-A.2-D
Gestion des Propriétaires
Étape 10 — OwnerService
Créer
owner.service.ts
Méthodes
createOwner() updateOwner() assignProperty() getOwnerPortfolio()
Étape 11 — Informations
Gérer
Personne physique Société Coordonnées Fiscalité Contrats
Étape 12 — Endpoints
Ajouter
GET /owners
GET /owners/{id}
POST /owners
PUT /owners/{id}
DELETE /owners/{id}
Sprint 6-A.2-E
Gestion des Exploitants
Étape 13 — OperatorService
Créer
operator.service.ts
Méthodes
createOperator() updateOperator() assignProperty() getOperatorPerformance()
Étape 14 — Endpoints
Ajouter
GET /operators
GET /operators/{id}
POST /operators
PUT /operators/{id}
DELETE /operators/{id}
Sprint 6-A.2-F
Hiérarchie Enterprise
Étape 15 — PortfolioHierarchyService
Créer
portfolio-hierarchy.service.ts
Construire
Portfolio ↓ PropertyGroup ↓ Property
Étape 16 — Fonctions
Supporter
getTree() getChildren() getAncestors() calculateAggregates()
Étape 17 — Agrégations
Calculer
Properties Count Revenue Occupancy Reservations Reviews
par niveau.
Sprint 6-A.2-G
Portfolio Security
Étape 18 — Portfolio Scope
Ajouter
portfolioId propertyGroupId propertyId
comme scopes de sécurité.
Étape 19 — RBAC
Supporter
Portfolio Admin Portfolio Manager Group Manager Property Manager Owner Viewer
Étape 20 — Filtrage
Imposer
sur toutes les requêtes :
tenantId portfolioId
afin d'éviter toute fuite de données.
Étape 21 — Decorators
Créer
@PortfolioScope() @PropertyGroupScope()
pour les futurs modules.
Sprint 6-A.2-H
Dashboard Portfolio
Étape 22 — PortfolioDashboardService
Créer
portfolio-dashboard.service.ts
Agréger
Properties Reservations Revenue Occupancy Reviews Incidents
Étape 23 — Endpoint
Ajouter
GET /portfolios/{id}/dashboard
Étape 24 — Exemple
Réponse
{
"properties":124,
"occupancy":81.4,
"revenue":2450000,
"reservations":8421,
"rating":4.7
}
Étape 25 — KPIs
Mesurer
Revenue Occupancy ADR RevPAR Reservations Guest Satisfaction
Sprint 6-A.2-I
API Enterprise
Étape 26 — Recherche
Ajouter
GET /portfolios/search GET /owners/search GET /operators/search
Étape 27 — Pagination
Supporter
Page Limit Sort Filters
sur tous les endpoints.
Étape 28 — Export
Ajouter
GET /portfolios/{id}/export
Formats :
CSV Excel PDF
Sprint 6-A.2-J
Gouvernance
Étape 29 — Permissions
Ajouter
portfolio.read portfolio.create portfolio.update portfolio.delete portfolio.dashboard owner.manage operator.manage
Étape 30 — Audit
Journaliser
PORTFOLIO_CREATED PORTFOLIO_UPDATED PROPERTY_ASSIGNED OWNER_ASSIGNED OPERATOR_ASSIGNED PORTFOLIO_DASHBOARD_VIEWED
Étape 31 — Préparation Sprint 6-B
Compatible avec :
Assets Equipment Lifecycle Depreciation Capital Expenditure
Définition de terminé
Le Sprint 6-A.2 est terminé lorsque :
✓ PortfolioModule créé ✓ PropertyGroupModule créé ✓ OwnerModule créé ✓ OperatorModule créé ✓ Portfolio Hierarchy créée ✓ Portfolio Security créée ✓ Portfolio Dashboard créé ✓ Audit intégré
Livrables
PortfolioModule PropertyGroupModule OwnerModule OperatorModule PortfolioHierarchyService PortfolioDashboardService Portfolio Security Layer Enterprise Multi-Property Platform
Sprint 6-B.1 — Asset Management Core
Objectif
Mettre en place le moteur de gestion des actifs physiques du parc immobilier.
Cette couche permet de gérer :
Mobilier Équipements Électroménager Matériel technique Inventaire Cycle de vie
sur l'ensemble du portefeuille immobilier.
À l'issue de cette étape :
✓ Asset ✓ AssetCategory ✓ AssetAssignment ✓ AssetLifecycle ✓ AssetInventory ✓ AssetTracking ✓ Enterprise Asset Management
Architecture cible
Portfolio ↓ Properties ↓ Asset Management ├── Asset Catalog ├── Asset Assignment ├── Lifecycle ├── Inventory ├── Tracking └── Maintenance Integration ↓ Operations ↓ Finance
Sprint 6-B.1-A
Extension Prisma
Étape 1 — AssetCategory
Ajouter dans schema.prisma
model AssetCategory {
id String
@id
@default(uuid())
tenantId String
name String
code String
description String?
depreciationYears Int?
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
assets Asset[]
@@unique([
tenantId,
code
])
@@index([tenantId])
}
Étape 2 — Asset
Ajouter
model Asset {
id String
@id
@default(uuid())
tenantId String
assetCode String
@unique
categoryId String
propertyId String?
name String
description String?
serialNumber String?
manufacturer String?
model String?
purchaseDate DateTime?
purchasePrice Decimal?
@db.Decimal(14,2)
currentValue Decimal?
@db.Decimal(14,2)
status AssetStatus
condition AssetCondition
warrantyUntil DateTime?
qrCode String?
barcode String?
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
category AssetCategory
@relation(
fields:[categoryId],
references:[id]
)
assignments AssetAssignment[]
lifecycleEvents AssetLifecycle[]
@@index([tenantId])
@@index([categoryId])
@@index([propertyId])
@@index([status])
}
Étape 3 — AssetAssignment
Ajouter
model AssetAssignment {
id String
@id
@default(uuid())
assetId String
propertyId String
assignedAt DateTime
@default(now())
unassignedAt DateTime?
assignedBy String?
notes String?
asset Asset
@relation(
fields:[assetId],
references:[id],
onDelete:Cascade
)
@@index([assetId])
@@index([propertyId])
}
Étape 4 — AssetLifecycle
Ajouter
model AssetLifecycle {
id String
@id
@default(uuid())
assetId String
eventType AssetLifecycleEvent
eventDate DateTime
@default(now())
description String?
cost Decimal?
@db.Decimal(14,2)
metadata Json?
asset Asset
@relation(
fields:[assetId],
references:[id],
onDelete:Cascade
)
@@index([assetId])
@@index([eventType])
@@index([eventDate])
}
Étape 5 — AssetInventory
Ajouter
model AssetInventory {
id String
@id
@default(uuid())
tenantId String
propertyId String?
inventoryDate DateTime
totalAssets Int
verifiedAssets Int
missingAssets Int
notes String?
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([propertyId])
@@index([inventoryDate])
}
Étape 6 — AssetTracking
Ajouter
model AssetTracking {
id String
@id
@default(uuid())
assetId String
propertyId String?
locationDescription String?
trackedAt DateTime
@default(now())
source TrackingSource
metadata Json?
@@index([assetId])
@@index([trackedAt])
}
Étape 7 — Enums
Ajouter
enum AssetStatus {
ACTIVE
IN_STOCK
IN_MAINTENANCE
RETIRED
LOST
DISPOSED
}
enum AssetCondition {
EXCELLENT
GOOD
FAIR
POOR
DAMAGED
}
enum AssetLifecycleEvent {
PURCHASED
ASSIGNED
MOVED
INSPECTED
MAINTAINED
REPAIRED
RETIRED
DISPOSED
}
enum TrackingSource {
MANUAL
QR_CODE
BARCODE
RFID
NFC
IOT
}
Étape 8 — Migration
Générer
npx prisma migrate dev \
--name asset_management_core
Sprint 6-B.1-B
Asset Management Module
Étape 9 — Création
src/modules/assets ├── assets │ ├── categories │ ├── assignments │ ├── lifecycle │ ├── inventory │ ├── tracking │ └── assets.module.ts
Étape 10 — Services
Créer
AssetService AssetCategoryService AssetAssignmentService AssetLifecycleService AssetInventoryService AssetTrackingService
Sprint 6-B.1-C
Gestion des Actifs
Étape 11 — AssetService
Créer
asset.service.ts
Méthodes
createAsset() updateAsset() retireAsset() searchAssets() calculateCurrentValue()
Étape 12 — Types d'actifs
Supporter
Mobilier TV Climatisation Électroménager Literie Sécurité Équipements extérieurs
Étape 13 — Codes
Générer
AST-2027-000001
pour chaque actif.
Sprint 6-B.1-D
Affectation
Étape 14 — AssetAssignmentService
Créer
asset-assignment.service.ts
Méthodes
assignAsset() moveAsset() unassignAsset() getAssetHistory()
Étape 15 — Historiser
Conserver
Date Property Utilisateur Action
pour chaque mouvement.
Sprint 6-B.1-E
Cycle de Vie
Étape 16 — AssetLifecycleService
Créer
asset-lifecycle.service.ts
Journaliser
Achat Affectation Déplacement Réparation Retrait
Étape 17 — Méthodes
recordEvent() getTimeline() calculateLifecycleCost()
Étape 18 — Finance
Préparer
Amortissement CAPEX OPEX
pour Sprint 6-B.2.
Sprint 6-B.1-F
Inventaire
Étape 19 — AssetInventoryService
Créer
asset-inventory.service.ts
Méthodes
createInventory() verifyAsset() closeInventory() generateVarianceReport()
Étape 20 — Contrôles
Identifier
Actifs présents Actifs manquants Actifs déplacés
Sprint 6-B.1-G
Tracking
Étape 21 — AssetTrackingService
Créer
asset-tracking.service.ts
Méthodes
trackAsset() scanQrCode() scanBarcode() getLastLocation()
Étape 22 — Technologies
Préparer
QR Code Barcode RFID NFC IoT
Étape 23 — Temps réel
Supporter
Position Historique Mouvements
des actifs.
Sprint 6-B.1-H
API Asset Management
Étape 24 — Endpoints
Ajouter
GET /assets
GET /assets/{id}
POST /assets
PUT /assets/{id}
DELETE /assets/{id}
POST /assets/{id}/assign
POST /assets/{id}/move
GET /assets/{id}/timeline
GET /assets/inventory
Étape 25 — Recherche
Supporter
Catégorie Statut Property Condition Valeur
Étape 26 — Export
Ajouter
GET /assets/export
Formats :
CSV Excel PDF
Sprint 6-B.1-I
Sécurité
Étape 27 — Permissions
Ajouter
asset.read asset.create asset.update asset.assign asset.inventory asset.dispose asset.admin
Étape 28 — Multi-Propriété
Filtrer
par :
Portfolio PropertyGroup Property
sur toutes les requêtes.
Étape 29 — Audit
Journaliser
ASSET_CREATED ASSET_ASSIGNED ASSET_MOVED ASSET_RETIRED INVENTORY_COMPLETED TRACKING_SCAN
Sprint 6-B.1-J
Préparation Sprint 6-B.2
Étape 30 — Compatible
Préparer :
Depreciation Engine Asset Valuation Capital Planning Lifecycle Forecasting
Définition de terminé
Le Sprint 6-B.1 est terminé lorsque :
✓ Asset créé ✓ AssetCategory créé ✓ AssetAssignment créé ✓ AssetLifecycle créé ✓ AssetInventory créé ✓ AssetTracking créé ✓ Audit intégré ✓ Multi-Property Ready
Livrables
Asset AssetCategory AssetAssignment AssetLifecycle AssetInventory AssetTracking AssetService AssetAssignmentService AssetLifecycleService AssetInventoryService AssetTrackingService Enterprise Asset Management Platform
Sprint 6-B.2 — Asset Intelligence & Lifecycle Management
Objectif
Transformer le registre d'actifs en plateforme patrimoniale Enterprise.
Cette couche permet :
Valorisation Amortissement Prévision de cycle de vie Planification CAPEX Optimisation maintenance Pilotage patrimonial
À l'issue de cette étape :
✓ Depreciation Engine ✓ Asset Valuation ✓ Lifecycle Forecasting ✓ Replacement Planning ✓ Maintenance Cost Analytics ✓ Asset Health Score ✓ Asset Intelligence Platform
Architecture cible
Assets ↓ Asset Intelligence Engine ├── Depreciation Engine ├── Asset Valuation ├── Lifecycle Forecasting ├── Replacement Planning ├── Maintenance Analytics ├── Asset Health Scoring └── AI Recommendations ↓ Portfolio Analytics ↓ Capital Planning
Sprint 6-B.2-A
Extension Prisma
Étape 1 — AssetDepreciation
Ajouter dans schema.prisma
model AssetDepreciation {
assetId String
@id
acquisitionValue Decimal
@db.Decimal(14,2)
residualValue Decimal
@db.Decimal(14,2)
usefulLifeYears Int
annualDepreciation Decimal
@db.Decimal(14,2)
accumulatedDepreciation Decimal
@db.Decimal(14,2)
bookValue Decimal
@db.Decimal(14,2)
calculatedAt DateTime
@updatedAt
asset Asset
@relation(
fields:[assetId],
references:[id],
onDelete:Cascade
)
}
Étape 2 — AssetValuation
Ajouter
model AssetValuation {
id String
@id
@default(uuid())
assetId String
valuationDate DateTime
estimatedValue Decimal
@db.Decimal(14,2)
valuationMethod AssetValuationMethod
confidenceScore Float?
createdAt DateTime
@default(now())
asset Asset
@relation(
fields:[assetId],
references:[id],
onDelete:Cascade
)
@@index([assetId])
@@index([valuationDate])
}
Étape 3 — AssetForecast
Ajouter
model AssetForecast {
id String
@id
@default(uuid())
assetId String
forecastType AssetForecastType
forecastDate DateTime
predictedValue Float
confidenceScore Float?
createdAt DateTime
@default(now())
@@index([assetId])
@@index([forecastType])
@@index([forecastDate])
}
Étape 4 — AssetHealthScore
Ajouter
model AssetHealthScore {
assetId String
@id
overallScore Float
conditionScore Float
maintenanceScore Float
utilizationScore Float
ageScore Float
riskScore Float
calculatedAt DateTime
@updatedAt
}
Étape 5 — AssetRecommendation
Ajouter
model AssetRecommendation {
id String
@id
@default(uuid())
assetId String
recommendationType AssetRecommendationType
priority RecommendationPriority
title String
description String
estimatedCost Decimal?
@db.Decimal(14,2)
estimatedSavings Decimal?
@db.Decimal(14,2)
implemented Boolean
@default(false)
createdAt DateTime
@default(now())
@@index([assetId])
@@index([recommendationType])
@@index([priority])
}
Étape 6 — Enums
Ajouter
enum AssetValuationMethod {
BOOK_VALUE
MARKET_VALUE
REPLACEMENT_COST
AI_ESTIMATION
}
enum AssetForecastType {
REPLACEMENT
FAILURE_RISK
MAINTENANCE_COST
VALUE_EVOLUTION
}
enum AssetRecommendationType {
REPAIR
REPLACE
UPGRADE
INSPECT
RETIRE
}
enum RecommendationPriority {
LOW
MEDIUM
HIGH
CRITICAL
}
Étape 7 — Migration
Générer
npx prisma migrate dev \
--name asset_intelligence
Sprint 6-B.2-B
Asset Intelligence Module
Étape 8 — Création
src/modules/asset-intelligence ├── depreciation │ ├── valuation │ ├── forecasting │ ├── planning │ ├── health │ ├── recommendations │ └── asset-intelligence.module.ts
Étape 9 — Services
Créer
DepreciationEngineService AssetValuationService LifecycleForecastService ReplacementPlanningService MaintenanceCostAnalyticsService AssetHealthScoreService AssetRecommendationService
Sprint 6-B.2-C
Depreciation Engine
Étape 10 — DepreciationEngineService
Créer
depreciation-engine.service.ts
Méthodes
calculateStraightLine() calculateBookValue() calculateAccumulatedDepreciation() generateDepreciationSchedule()
Étape 11 — Méthodes comptables
Supporter
Linéaire Dégressif Personnalisé
Étape 12 — Exemple
Actif 10 000 € Durée 5 ans ↓ 2 000 €/an
Sprint 6-B.2-D
Asset Valuation
Étape 13 — AssetValuationService
Créer
asset-valuation.service.ts
Méthodes
estimateCurrentValue() estimateReplacementCost() estimateResidualValue()
Étape 14 — Facteurs
Utiliser
Âge État Maintenance Utilisation Marché
Étape 15 — Valorisation
Produire
Valeur brute Valeur nette Valeur marché Valeur remplacement
Sprint 6-B.2-E
Lifecycle Forecasting
Étape 16 — LifecycleForecastService
Créer
lifecycle-forecast.service.ts
Prévoir
Fin de vie Risque panne Coût futur Maintenance future
Étape 17 — Méthodes
forecastReplacement() forecastFailureRisk() forecastMaintenanceCost()
Étape 18 — Exemple
Climatisation Fin de vie estimée 14 mois
Sprint 6-B.2-F
Replacement Planning
Étape 19 — ReplacementPlanningService
Créer
replacement-planning.service.ts
Générer
CAPEX Forecast Replacement Calendar Investment Plan
Étape 20 — Priorisation
Classer
selon :
Health Score Coût maintenance Criticité ROI remplacement
Étape 21 — Exemple
2028 12 climatiseurs ↓ CAPEX 42 000 €
Sprint 6-B.2-G
Maintenance Cost Analytics
Étape 22 — MaintenanceCostAnalyticsService
Créer
maintenance-cost-analytics.service.ts
Analyser
Coûts maintenance Coût possession Coût panne ROI réparation
Étape 23 — Sources
Utiliser
MaintenanceWorkOrder AssetLifecycle AssetValuation
Étape 24 — KPI
Mesurer
Maintenance Cost Ratio Cost Per Asset Failure Cost Replacement ROI
Sprint 6-B.2-H
Asset Health Score
Étape 25 — AssetHealthScoreService
Créer
asset-health-score.service.ts
Calcul
Condition 30% Maintenance 25% Age 20% Utilization 15% Risk 10%
Étape 26 — Classification
90-100 Excellent 75-89 Healthy 50-74 Warning 0-49 Critical
Étape 27 — Exemple
Asset Health 92 Excellent
Sprint 6-B.2-I
Recommandations IA
Étape 28 — AssetRecommendationService
Créer
asset-recommendation.service.ts
Générer
Remplacement Réparation Inspection Upgrade Retrait
Étape 29 — Exemple
Climatisation Health Score 41 ↓ Remplacement recommandé
Étape 30 — Exemple
TV Health Score 82 ↓ Maintenance préventive
Sprint 6-B.2-J
Dashboard Intelligence
Étape 31 — Endpoints
Ajouter
GET /assets/intelligence
GET /assets/{id}/health
GET /assets/{id}/valuation
GET /assets/{id}/forecast
GET /assets/recommendations
GET /assets/capex-plan
Étape 32 — Exemple
Réponse
{
"healthScore":92,
"currentValue":8400,
"replacementRisk":"LOW",
"recommendations":[]
}
Étape 33 — Analytics
Mesurer
Forecast Accuracy Maintenance Savings Asset Lifespan CAPEX Accuracy Health Score Trends
Gouvernance
Étape 34 — Permissions
Ajouter
asset.intelligence.read asset.intelligence.forecast asset.intelligence.health asset.intelligence.capex asset.intelligence.admin
Étape 35 — Audit
Journaliser
ASSET_HEALTH_UPDATED ASSET_FORECAST_GENERATED ASSET_VALUATION_UPDATED ASSET_RECOMMENDATION_CREATED CAPEX_PLAN_GENERATED
Étape 36 — Jobs
Ajouter
Toutes les nuits Health Score Refresh Forecast Generation Valuation Refresh Recommendation Generation
Clôture Domaine Asset
À la fin du Sprint 6-B.2 :
✓ Asset Registry ✓ Asset Tracking ✓ Asset Lifecycle ✓ Depreciation Engine ✓ Asset Valuation ✓ Forecasting ✓ CAPEX Planning ✓ Asset Intelligence
sont entièrement opérationnels.
Sprint 6-C.1 — Portfolio Analytics & Multi-Site KPIs
Objectif
Construire le cockpit décisionnel consolidé du parc immobilier.
Cette couche permet d'obtenir une vue globale :
Portefeuilles Groupes Propriétés Revenus Occupation Performance
afin de piloter des dizaines, centaines ou milliers de propriétés depuis une interface unique.
À l'issue de cette étape :
✓ Portfolio Dashboard ✓ Portfolio Revenue ✓ Portfolio Occupancy ✓ Portfolio Benchmarking ✓ Multi-Site KPIs ✓ Executive Reporting ✓ Enterprise Portfolio Analytics
Architecture cible
Portfolio ↓ Portfolio Analytics Engine ├── Revenue Analytics ├── Occupancy Analytics ├── Reservation Analytics ├── Property Performance ├── Benchmarking ├── Executive KPIs └── Reporting ↓ Executive Dashboard ↓ Portfolio Intelligence
Sprint 6-C.1-A
Extension Prisma
Étape 1 — PortfolioAnalyticsSnapshot
Ajouter dans schema.prisma
model PortfolioAnalyticsSnapshot {
id String
@id
@default(uuid())
tenantId String
portfolioId String
snapshotDate DateTime
propertiesCount Int
@default(0)
reservationsCount Int
@default(0)
revenue Decimal
@db.Decimal(14,2)
occupancyRate Float?
averageRating Float?
adr Decimal?
@db.Decimal(14,2)
revPar Decimal?
@db.Decimal(14,2)
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([portfolioId])
@@index([snapshotDate])
}
Étape 2 — PortfolioKPI
Ajouter
model PortfolioKPI {
portfolioId String
@id
occupancyRate Float?
adr Float?
revPar Float?
revenueGrowth Float?
reservationGrowth Float?
guestSatisfaction Float?
updatedAt DateTime
@updatedAt
}
Étape 3 — PortfolioBenchmark
Ajouter
model PortfolioBenchmark {
id String
@id
@default(uuid())
portfolioId String
metric PortfolioBenchmarkMetric
portfolioValue Float
benchmarkValue Float
variancePercent Float
createdAt DateTime
@default(now())
@@index([portfolioId])
@@index([metric])
}
Étape 4 — ExecutiveReport
Ajouter
model ExecutiveReport {
id String
@id
@default(uuid())
tenantId String
portfolioId String?
reportType ExecutiveReportType
periodStart DateTime
periodEnd DateTime
generatedAt DateTime
@default(now())
storagePath String?
createdBy String?
@@index([tenantId])
@@index([portfolioId])
@@index([reportType])
}
Étape 5 — Enums
Ajouter
enum PortfolioBenchmarkMetric {
REVENUE
OCCUPANCY
ADR
REVPAR
SATISFACTION
RESERVATIONS
}
enum ExecutiveReportType {
DAILY
WEEKLY
MONTHLY
QUARTERLY
ANNUAL
CUSTOM
}
Étape 6 — Migration
Générer
npx prisma migrate dev \
--name portfolio_analytics
Sprint 6-C.1-B
Portfolio Analytics Module
Étape 7 — Création
src/modules/portfolio-analytics ├── dashboard │ ├── revenue │ ├── occupancy │ ├── benchmarking │ ├── reporting │ ├── kpis │ └── portfolio-analytics.module.ts
Étape 8 — Services
Créer
PortfolioDashboardService PortfolioRevenueService PortfolioOccupancyService PortfolioBenchmarkingService ExecutiveReportingService PortfolioKPIService
Sprint 6-C.1-C
Revenue Analytics
Étape 9 — PortfolioRevenueService
Créer
portfolio-revenue.service.ts
Calculer
Gross Revenue Net Revenue Revenue Growth Revenue By Property Revenue By Group
Étape 10 — Sources
Utiliser
Reservations Invoices Payments Refunds
Étape 11 — KPIs
Produire
ADR RevPAR Revenue Per Property Revenue Per Portfolio
Sprint 6-C.1-D
Occupancy Analytics
Étape 12 — PortfolioOccupancyService
Créer
portfolio-occupancy.service.ts
Mesurer
Occupancy Rate Available Nights Booked Nights Lost Nights Capacity Usage
Étape 13 — Segmentation
Analyser
par :
Portfolio Property Group Property Region Category
Étape 14 — KPIs
Calculer
Occupancy % Average Stay Booking Window Seasonality
Sprint 6-C.1-E
Multi-Site KPIs
Étape 15 — PortfolioKPIService
Créer
portfolio-kpi.service.ts
Agréger
Revenue Occupancy Reservations Reviews Operations Assets
Étape 16 — Executive KPIs
Calculer
ADR RevPAR Occupancy Revenue Growth Guest Satisfaction Asset Utilization
Étape 17 — Score Global
Construire
Portfolio Health Score
à partir de :
Revenue Occupancy Reviews Operations Assets
Sprint 6-C.1-F
Benchmarking
Étape 18 — PortfolioBenchmarkingService
Créer
portfolio-benchmarking.service.ts
Comparer
Portfolios Property Groups Properties
Étape 19 — Classements
Identifier
Top Revenue Top Occupancy Top Reviews Top Growth
Étape 20 — Variances
Calculer
Portfolio vs Average Portfolio
Sprint 6-C.1-G
Executive Reporting
Étape 21 — ExecutiveReportingService
Créer
executive-reporting.service.ts
Générer
Daily Report Weekly Report Monthly Report Board Report
Étape 22 — Formats
Supporter
PDF Excel CSV
Étape 23 — Contenu
Inclure
Revenue Occupancy Reservations Incidents Assets Forecasts
Sprint 6-C.1-H
Portfolio Dashboard
Étape 24 — PortfolioDashboardService
Créer
portfolio-dashboard.service.ts
Agréger
Revenue Occupancy Reservations Properties Reviews Assets
Étape 25 — Endpoint
Ajouter
GET /portfolio/dashboard
GET /portfolio/{id}/dashboard
Étape 26 — Exemple
Réponse
{
"properties":245,
"occupancy":82.4,
"revenue":8450000,
"adr":142,
"revpar":117,
"portfolioHealth":91
}
Sprint 6-C.1-I
API Analytics
Étape 27 — Endpoints
Ajouter
GET /portfolio/analytics/revenue GET /portfolio/analytics/occupancy GET /portfolio/analytics/kpis GET /portfolio/analytics/benchmark GET /portfolio/reports POST /portfolio/reports
Étape 28 — Filtres
Supporter
Portfolio Property Group Property Date Range Region Category
Étape 29 — Export
Ajouter
GET /portfolio/reports/{id}/download
Formats :
PDF Excel CSV
Sprint 6-C.1-J
Gouvernance
Étape 30 — Permissions
Ajouter
portfolio.analytics.read portfolio.analytics.export portfolio.analytics.benchmark portfolio.analytics.executive portfolio.analytics.admin
Étape 31 — Audit
Journaliser
PORTFOLIO_DASHBOARD_VIEWED PORTFOLIO_KPI_CALCULATED BENCHMARK_GENERATED EXECUTIVE_REPORT_CREATED REPORT_DOWNLOADED
Étape 32 — Jobs
Ajouter
Toutes les heures Portfolio KPI Refresh Toutes les nuits Analytics Snapshot Benchmark Refresh Executive Report Generation
Préparation Sprint 6-C.2
Compatible avec :
Forecasting Portfolio Intelligence Executive AI Investment Planning
Définition de terminé
Le Sprint 6-C.1 est terminé lorsque :
✓ Portfolio Dashboard créé ✓ Revenue Analytics créé ✓ Occupancy Analytics créé ✓ Benchmarking créé ✓ Executive Reporting créé ✓ Multi-Site KPIs créés ✓ Audit intégré
Livrables
PortfolioAnalyticsSnapshot PortfolioKPI PortfolioBenchmark ExecutiveReport PortfolioDashboardService PortfolioRevenueService PortfolioOccupancyService PortfolioBenchmarkingService ExecutiveReportingService Portfolio Analytics Platform
Sprint 6-C.2 — Portfolio Intelligence & Prévisions Multi-Sites
Objectif
Transformer les analytics consolidés en plateforme décisionnelle prédictive Enterprise.
Cette couche permet :
Prévisions Planification stratégique Détection d'opportunités Prévisions revenus Prévisions occupation Pilotage d'investissement
sur l'ensemble du portefeuille immobilier.
À l'issue de cette étape :
✓ Portfolio Forecasting ✓ Revenue Forecast ✓ Occupancy Forecast ✓ Investment Insights ✓ Portfolio Health Score ✓ Executive AI Insights ✓ Portfolio Intelligence Platform
Architecture cible
Portfolio Analytics ↓ Portfolio Intelligence Engine ├── Revenue Forecast ├── Occupancy Forecast ├── Investment Insights ├── Risk Analysis ├── Portfolio Health Score ├── Executive AI Insights └── Strategic Recommendations ↓ Executive Management ↓ Investment Planning
Sprint 6-C.2-A
Extension Prisma
Étape 1 — PortfolioForecast
Ajouter dans schema.prisma
model PortfolioForecast {
id String
@id
@default(uuid())
tenantId String
portfolioId String
forecastType PortfolioForecastType
forecastDate DateTime
predictedValue Float
confidenceScore Float?
generatedAt DateTime
@default(now())
@@index([tenantId])
@@index([portfolioId])
@@index([forecastType])
@@index([forecastDate])
}
Étape 2 — PortfolioInsight
Ajouter
model PortfolioInsight {
id String
@id
@default(uuid())
tenantId String
portfolioId String?
category PortfolioInsightCategory
severity InsightSeverity
title String
description String
recommendation String?
impactScore Float?
implemented Boolean
@default(false)
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([portfolioId])
@@index([category])
}
Étape 3 — PortfolioHealthScore
Ajouter
model PortfolioHealthScore {
portfolioId String
@id
overallScore Float
revenueScore Float
occupancyScore Float
guestScore Float
operationsScore Float
assetScore Float
growthScore Float
calculatedAt DateTime
@updatedAt
}
Étape 4 — InvestmentRecommendation
Ajouter
model InvestmentRecommendation {
id String
@id
@default(uuid())
portfolioId String
recommendationType InvestmentRecommendationType
priority RecommendationPriority
title String
description String
estimatedInvestment Decimal?
@db.Decimal(14,2)
estimatedReturn Decimal?
@db.Decimal(14,2)
roiPercent Float?
createdAt DateTime
@default(now())
@@index([portfolioId])
@@index([recommendationType])
@@index([priority])
}
Étape 5 — Enums
Ajouter
enum PortfolioForecastType {
REVENUE
OCCUPANCY
RESERVATIONS
REVPAR
ADR
}
enum PortfolioInsightCategory {
REVENUE
OCCUPANCY
OPERATIONS
ASSETS
INVESTMENT
GROWTH
}
enum InvestmentRecommendationType {
ACQUISITION
RENOVATION
REPLACEMENT
EXPANSION
OPTIMIZATION
DIVESTMENT
}
Étape 6 — Migration
Générer
npx prisma migrate dev \
--name portfolio_intelligence
Sprint 6-C.2-B
Portfolio Intelligence Module
Étape 7 — Création
src/modules/portfolio-intelligence ├── forecasts │ ├── revenue │ ├── occupancy │ ├── investments │ ├── health │ ├── insights │ └── portfolio-intelligence.module.ts
Étape 8 — Services
Créer
PortfolioForecastService RevenueForecastService OccupancyForecastService InvestmentInsightService PortfolioHealthScoreService ExecutiveInsightService InvestmentRecommendationService
Sprint 6-C.2-C
Revenue Forecast
Étape 9 — RevenueForecastService
Créer
revenue-forecast.service.ts
Méthodes
forecastRevenue() forecastADR() forecastRevPAR() forecastGrowth()
Étape 10 — Sources
Utiliser
Reservations Payments Invoices Portfolio Analytics Seasonality
Étape 11 — Prévisions
Produire
30 jours 90 jours 12 mois
Sprint 6-C.2-D
Occupancy Forecast
Étape 12 — OccupancyForecastService
Créer
occupancy-forecast.service.ts
Prévoir
Occupancy Available Nights Demand Booking Pace
Étape 13 — Méthodes
forecastOccupancy() forecastDemand() forecastSeasonality()
Étape 14 — Segmentation
Calculer
par :
Portfolio Property Group Property Region
Sprint 6-C.2-E
Investment Insights
Étape 15 — InvestmentInsightService
Créer
investment-insight.service.ts
Identifier
Expansion Renovation Asset Replacement Optimization Divestment
Étape 16 — Analyse
Utiliser
Revenue Occupancy Assets Maintenance Guest Satisfaction
Étape 17 — Exemple
Property Group Paris ROI potentiel 18% ↓ Rénovation recommandée
Sprint 6-C.2-F
Portfolio Health Score
Étape 18 — PortfolioHealthScoreService
Créer
portfolio-health-score.service.ts
Calcul
Revenue 25% Occupancy 20% Guest Score 15% Operations 15% Assets 15% Growth 10%
Étape 19 — Classification
90-100 Excellent 75-89 Healthy 50-74 Warning 0-49 Critical
Étape 20 — Exemple
Portfolio Health 93 Excellent
Sprint 6-C.2-G
Executive AI Insights
Étape 21 — ExecutiveInsightService
Créer
executive-insight.service.ts
Générer
Revenue Opportunities Occupancy Risks Growth Opportunities Asset Risks Investment Priorities
Étape 22 — Exemple
Les propriétés côtières ↑ 22% prévision revenus été ↓ Renforcer l'inventaire
Étape 23 — Exemple
Le groupe Europe Nord ↓ Occupation en baisse -7% ↓ Action recommandée
Sprint 6-C.2-H
Recommandations d'Investissement
Étape 24 — InvestmentRecommendationService
Créer
investment-recommendation.service.ts
Générer
CAPEX Expansion Acquisition Renovation Cession
Étape 25 — Priorisation
Utiliser
ROI Health Score Forecast Asset Age Revenue Potential
Étape 26 — Exemple
CAPEX 250 000 € ROI estimé 31%
Sprint 6-C.2-I
Dashboard Intelligence
Étape 27 — Endpoints
Ajouter
GET /portfolio/intelligence GET /portfolio/forecasts GET /portfolio/insights GET /portfolio/health GET /portfolio/investments GET /portfolio/recommendations
Étape 28 — Exemple
Réponse
{
"revenueForecast":12450000,
"occupancyForecast":84.2,
"portfolioHealth":93,
"investmentOpportunities":12
}
Étape 29 — Analytics IA
Mesurer
Forecast Accuracy Investment ROI Health Score Trend Revenue Prediction Accuracy Recommendation Adoption
Sprint 6-C.2-J
Gouvernance
Étape 30 — Permissions
Ajouter
portfolio.intelligence.read portfolio.intelligence.forecast portfolio.intelligence.investment portfolio.intelligence.health portfolio.intelligence.executive
Étape 31 — Audit
Journaliser
PORTFOLIO_FORECAST_GENERATED PORTFOLIO_HEALTH_UPDATED EXECUTIVE_INSIGHT_CREATED INVESTMENT_RECOMMENDATION_CREATED INTELLIGENCE_DASHBOARD_VIEWED
Étape 32 — Jobs
Ajouter
Toutes les nuits Portfolio Forecast Refresh Portfolio Health Refresh Executive Insights Generation Investment Recommendation Refresh
Clôture Domaine Analytics
À la fin du Sprint 6-C.2 :
✓ Portfolio Analytics ✓ Benchmarking ✓ Forecasting ✓ Executive Reporting ✓ Portfolio Health Score ✓ Investment Intelligence ✓ Executive AI Insights
sont entièrement opérationnels.
Préparation Sprint 6-D
Compatible avec :
Governance Delegation Approvals Compliance Enterprise Controls
Définition de terminé
Le Sprint 6-C.2 est terminé lorsque :
✓ Portfolio Forecasting créé ✓ Revenue Forecast créé ✓ Occupancy Forecast créé ✓ Investment Insights créés ✓ Portfolio Health Score créé ✓ Executive AI Insights créés ✓ Audit intégré
Livrables
PortfolioForecast PortfolioInsight PortfolioHealthScore InvestmentRecommendation PortfolioForecastService RevenueForecastService OccupancyForecastService InvestmentInsightService PortfolioHealthScoreService ExecutiveInsightService InvestmentRecommendationService Portfolio Intelligence Platform
Sprint 6-D.1 — Enterprise Governance & Multi-Site Security
Objectif
Mettre en place la couche de gouvernance Enterprise du parc immobilier.
Cette couche permet de contrôler :
Accès Délégations Validations Conformité Séparation des responsabilités Traçabilité
sur l'ensemble des portefeuilles, groupes et propriétés.
À l'issue de cette étape :
✓ Portfolio RBAC ✓ Delegation ✓ Approval Workflow ✓ Compliance Controls ✓ Multi-Site Permissions ✓ Governance Dashboard ✓ Enterprise Governance Platform
Architecture cible
Tenant ↓ Governance Layer ├── RBAC ├── Delegation ├── Approval Workflow ├── Compliance ├── Audit └── Governance Dashboard ↓ Portfolio ↓ Property Groups ↓ Properties
Sprint 6-D.1-A
Extension Prisma
Étape 1 — PortfolioRole
Ajouter dans schema.prisma
model PortfolioRole {
id String
@id
@default(uuid())
tenantId String
name String
code String
description String?
systemRole Boolean
@default(false)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
permissions PortfolioPermission[]
assignments PortfolioRoleAssignment[]
@@unique([tenantId, code])
@@index([tenantId])
}
Étape 2 — PortfolioPermission
Ajouter
model PortfolioPermission {
id String
@id
@default(uuid())
roleId String
permission String
role PortfolioRole
@relation(
fields:[roleId],
references:[id],
onDelete:Cascade
)
@@index([roleId])
@@index([permission])
}
Étape 3 — PortfolioRoleAssignment
Ajouter
model PortfolioRoleAssignment {
id String
@id
@default(uuid())
tenantId String
userId String
roleId String
portfolioId String?
propertyGroupId String?
propertyId String?
assignedAt DateTime
@default(now())
expiresAt DateTime?
role PortfolioRole
@relation(
fields:[roleId],
references:[id]
)
@@index([tenantId])
@@index([userId])
@@index([portfolioId])
@@index([propertyId])
}
Étape 4 — Delegation
Ajouter
model Delegation {
id String
@id
@default(uuid())
tenantId String
delegatorUserId String
delegateUserId String
portfolioId String?
propertyGroupId String?
propertyId String?
startDate DateTime
endDate DateTime
active Boolean
@default(true)
reason String?
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([delegatorUserId])
@@index([delegateUserId])
}
Étape 5 — ApprovalRequest
Ajouter
model ApprovalRequest {
id String
@id
@default(uuid())
tenantId String
approvalType ApprovalType
status ApprovalStatus
entityType String
entityId String
requestedBy String
approvedBy String?
requestedAt DateTime
@default(now())
approvedAt DateTime?
comment String?
@@index([tenantId])
@@index([status])
@@index([approvalType])
}
Étape 6 — ComplianceControl
Ajouter
model ComplianceControl {
id String
@id
@default(uuid())
tenantId String
code String
title String
category ComplianceCategory
enabled Boolean
@default(true)
severity ComplianceSeverity
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([category])
}
Étape 7 — Enums
Ajouter
enum ApprovalType {
PROPERTY_CREATION
PROPERTY_UPDATE
OWNER_ASSIGNMENT
OPERATOR_ASSIGNMENT
CAPEX_REQUEST
CONTRACT_APPROVAL
}
enum ApprovalStatus {
PENDING
APPROVED
REJECTED
CANCELLED
}
enum ComplianceCategory {
SECURITY
FINANCIAL
LEGAL
GDPR
OPERATIONS
}
enum ComplianceSeverity {
LOW
MEDIUM
HIGH
CRITICAL
}
Étape 8 — Migration
Générer
npx prisma migrate dev \
--name governance_core
Sprint 6-D.1-B
Governance Module
Étape 9 — Création
src/modules/governance ├── roles │ ├── permissions │ ├── delegations │ ├── approvals │ ├── compliance │ ├── dashboard │ └── governance.module.ts
Étape 10 — Services
Créer
PortfolioRBACService DelegationService ApprovalWorkflowService ComplianceControlService GovernanceDashboardService PermissionResolverService
Sprint 6-D.1-C
Portfolio RBAC
Étape 11 — PortfolioRBACService
Créer
portfolio-rbac.service.ts
Rôles système
PORTFOLIO_ADMIN PORTFOLIO_MANAGER GROUP_MANAGER PROPERTY_MANAGER OWNER_VIEWER AUDITOR
Étape 12 — Permissions
Supporter
Read Create Update Delete Approve Export Admin
par scope.
Étape 13 — Scopes
Appliquer
Portfolio Property Group Property
sur chaque permission.
Sprint 6-D.1-D
Délégations
Étape 14 — DelegationService
Créer
delegation.service.ts
Méthodes
createDelegation() revokeDelegation() validateDelegation() getActiveDelegations()
Étape 15 — Cas d'usage
Supporter
Congés Remplacement Mission temporaire Support régional
Étape 16 — Expiration
Désactiver
automatiquement à :
endDate
Sprint 6-D.1-E
Workflow d'Approbation
Étape 17 — ApprovalWorkflowService
Créer
approval-workflow.service.ts
Méthodes
submitApproval() approve() reject() cancelApproval()
Étape 18 — Workflows
Supporter
Nouvelle propriété Changement propriétaire CAPEX Contrat Suppression actif
Étape 19 — Validation
Exiger
un approbateur différent du demandeur.
Sprint 6-D.1-F
Contrôles de Conformité
Étape 20 — ComplianceControlService
Créer
compliance-control.service.ts
Vérifier
RGPD Audit Sécurité Finance Exploitation
Étape 21 — Méthodes
runControls() evaluateCompliance() createViolation() closeViolation()
Étape 22 — Scores
Calculer
Compliance Score Risk Score Violation Rate
Sprint 6-D.1-G
Dashboard Gouvernance
Étape 23 — GovernanceDashboardService
Créer
governance-dashboard.service.ts
Afficher
Approvals Pending Active Delegations Compliance Score Open Violations Audit Events
Étape 24 — KPI
Mesurer
Approval Time Compliance Rate Policy Violations Delegation Usage Audit Coverage
Étape 25 — Endpoint
Ajouter
GET /governance/dashboard
Sprint 6-D.1-H
API Gouvernance
Étape 26 — Endpoints
Ajouter
GET /governance/roles
POST /governance/roles
GET /governance/delegations
POST /governance/delegations
GET /governance/approvals
POST /governance/approvals
POST /governance/approvals/{id}/approve
POST /governance/approvals/{id}/reject
GET /governance/compliance
Étape 27 — Exemple
Approbation
{
"approvalType":"CAPEX_REQUEST",
"entityType":"Asset",
"entityId":"ast_123"
}
Sprint 6-D.1-I
Sécurité Enterprise
Étape 28 — Permission Resolver
Créer
permission-resolver.service.ts
Résoudre
dans l'ordre :
Role ↓ Delegation ↓ Portfolio Scope ↓ Property Scope
Étape 29 — Middleware
Ajouter
@RequirePortfolioPermission() @RequireApproval()
Étape 30 — Audit
Journaliser
ROLE_ASSIGNED DELEGATION_CREATED APPROVAL_SUBMITTED APPROVAL_APPROVED COMPLIANCE_CHECK_EXECUTED
Sprint 6-D.1-J
Gouvernance Continue
Étape 31 — Jobs
Ajouter
Toutes les heures Delegation Expiration Toutes les nuits Compliance Scan Approval Escalation Governance KPI Refresh
Étape 32 — Permissions
Ajouter
governance.read governance.manage governance.approve governance.compliance governance.audit governance.admin
Préparation Sprint 6-D.2
Compatible avec :
Enterprise Policies Risk Management Internal Controls Governance Intelligence Audit Automation
Définition de terminé
Le Sprint 6-D.1 est terminé lorsque :
✓ Portfolio RBAC créé ✓ Delegation créée ✓ Approval Workflow créé ✓ Compliance Controls créés ✓ Multi-Site Permissions créées ✓ Governance Dashboard créé ✓ Audit intégré
Livrables
PortfolioRole PortfolioPermission PortfolioRoleAssignment Delegation ApprovalRequest ComplianceControl PortfolioRBACService DelegationService ApprovalWorkflowService ComplianceControlService GovernanceDashboardService Enterprise Governance Platform
Sprint 6-C.2 — Portfolio Intelligence & Prévisions Multi-Sites
Objectif
Transformer les analytics consolidés en plateforme décisionnelle prédictive Enterprise.
Cette couche permet :
Prévisions Planification stratégique Détection d'opportunités Prévisions revenus Prévisions occupation Pilotage d'investissement
sur l'ensemble du portefeuille immobilier.
À l'issue de cette étape :
✓ Portfolio Forecasting ✓ Revenue Forecast ✓ Occupancy Forecast ✓ Investment Insights ✓ Portfolio Health Score ✓ Executive AI Insights ✓ Portfolio Intelligence Platform
Architecture cible
Portfolio Analytics ↓ Portfolio Intelligence Engine ├── Revenue Forecast ├── Occupancy Forecast ├── Investment Insights ├── Risk Analysis ├── Portfolio Health Score ├── Executive AI Insights └── Strategic Recommendations ↓ Executive Management ↓ Investment Planning
Sprint 6-C.2-A
Extension Prisma
Étape 1 — PortfolioForecast
Ajouter dans schema.prisma
model PortfolioForecast {
id String
@id
@default(uuid())
tenantId String
portfolioId String
forecastType PortfolioForecastType
forecastDate DateTime
predictedValue Float
confidenceScore Float?
generatedAt DateTime
@default(now())
@@index([tenantId])
@@index([portfolioId])
@@index([forecastType])
@@index([forecastDate])
}
Étape 2 — PortfolioInsight
Ajouter
model PortfolioInsight {
id String
@id
@default(uuid())
tenantId String
portfolioId String?
category PortfolioInsightCategory
severity InsightSeverity
title String
description String
recommendation String?
impactScore Float?
implemented Boolean
@default(false)
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([portfolioId])
@@index([category])
}
Étape 3 — PortfolioHealthScore
Ajouter
model PortfolioHealthScore {
portfolioId String
@id
overallScore Float
revenueScore Float
occupancyScore Float
guestScore Float
operationsScore Float
assetScore Float
growthScore Float
calculatedAt DateTime
@updatedAt
}
Étape 4 — InvestmentRecommendation
Ajouter
model InvestmentRecommendation {
id String
@id
@default(uuid())
portfolioId String
recommendationType InvestmentRecommendationType
priority RecommendationPriority
title String
description String
estimatedInvestment Decimal?
@db.Decimal(14,2)
estimatedReturn Decimal?
@db.Decimal(14,2)
roiPercent Float?
createdAt DateTime
@default(now())
@@index([portfolioId])
@@index([recommendationType])
@@index([priority])
}
Étape 5 — Enums
Ajouter
enum PortfolioForecastType {
REVENUE
OCCUPANCY
RESERVATIONS
REVPAR
ADR
}
enum PortfolioInsightCategory {
REVENUE
OCCUPANCY
OPERATIONS
ASSETS
INVESTMENT
GROWTH
}
enum InvestmentRecommendationType {
ACQUISITION
RENOVATION
REPLACEMENT
EXPANSION
OPTIMIZATION
DIVESTMENT
}
Étape 6 — Migration
Générer
npx prisma migrate dev \
--name portfolio_intelligence
Sprint 6-C.2-B
Portfolio Intelligence Module
Étape 7 — Création
src/modules/portfolio-intelligence ├── forecasts │ ├── revenue │ ├── occupancy │ ├── investments │ ├── health │ ├── insights │ └── portfolio-intelligence.module.ts
Étape 8 — Services
Créer
PortfolioForecastService RevenueForecastService OccupancyForecastService InvestmentInsightService PortfolioHealthScoreService ExecutiveInsightService InvestmentRecommendationService
Sprint 6-C.2-C
Revenue Forecast
Étape 9 — RevenueForecastService
Créer
revenue-forecast.service.ts
Méthodes
forecastRevenue() forecastADR() forecastRevPAR() forecastGrowth()
Étape 10 — Sources
Utiliser
Reservations Payments Invoices Portfolio Analytics Seasonality
Étape 11 — Prévisions
Produire
30 jours 90 jours 12 mois
Sprint 6-C.2-D
Occupancy Forecast
Étape 12 — OccupancyForecastService
Créer
occupancy-forecast.service.ts
Prévoir
Occupancy Available Nights Demand Booking Pace
Étape 13 — Méthodes
forecastOccupancy() forecastDemand() forecastSeasonality()
Étape 14 — Segmentation
Calculer
par :
Portfolio Property Group Property Region
Sprint 6-C.2-E
Investment Insights
Étape 15 — InvestmentInsightService
Créer
investment-insight.service.ts
Identifier
Expansion Renovation Asset Replacement Optimization Divestment
Étape 16 — Analyse
Utiliser
Revenue Occupancy Assets Maintenance Guest Satisfaction
Étape 17 — Exemple
Property Group Paris ROI potentiel 18% ↓ Rénovation recommandée
Sprint 6-C.2-F
Portfolio Health Score
Étape 18 — PortfolioHealthScoreService
Créer
portfolio-health-score.service.ts
Calcul
Revenue 25% Occupancy 20% Guest Score 15% Operations 15% Assets 15% Growth 10%
Étape 19 — Classification
90-100 Excellent 75-89 Healthy 50-74 Warning 0-49 Critical
Étape 20 — Exemple
Portfolio Health 93 Excellent
Sprint 6-C.2-G
Executive AI Insights
Étape 21 — ExecutiveInsightService
Créer
executive-insight.service.ts
Générer
Revenue Opportunities Occupancy Risks Growth Opportunities Asset Risks Investment Priorities
Étape 22 — Exemple
Les propriétés côtières ↑ 22% prévision revenus été ↓ Renforcer l'inventaire
Étape 23 — Exemple
Le groupe Europe Nord ↓ Occupation en baisse -7% ↓ Action recommandée
Sprint 6-C.2-H
Recommandations d'Investissement
Étape 24 — InvestmentRecommendationService
Créer
investment-recommendation.service.ts
Générer
CAPEX Expansion Acquisition Renovation Cession
Étape 25 — Priorisation
Utiliser
ROI Health Score Forecast Asset Age Revenue Potential
Étape 26 — Exemple
CAPEX 250 000 € ROI estimé 31%
Sprint 6-C.2-I
Dashboard Intelligence
Étape 27 — Endpoints
Ajouter
GET /portfolio/intelligence GET /portfolio/forecasts GET /portfolio/insights GET /portfolio/health GET /portfolio/investments GET /portfolio/recommendations
Étape 28 — Exemple
Réponse
{
"revenueForecast":12450000,
"occupancyForecast":84.2,
"portfolioHealth":93,
"investmentOpportunities":12
}
Étape 29 — Analytics IA
Mesurer
Forecast Accuracy Investment ROI Health Score Trend Revenue Prediction Accuracy Recommendation Adoption
Sprint 6-C.2-J
Gouvernance
Étape 30 — Permissions
Ajouter
portfolio.intelligence.read portfolio.intelligence.forecast portfolio.intelligence.investment portfolio.intelligence.health portfolio.intelligence.executive
Étape 31 — Audit
Journaliser
PORTFOLIO_FORECAST_GENERATED PORTFOLIO_HEALTH_UPDATED EXECUTIVE_INSIGHT_CREATED INVESTMENT_RECOMMENDATION_CREATED INTELLIGENCE_DASHBOARD_VIEWED
Étape 32 — Jobs
Ajouter
Toutes les nuits Portfolio Forecast Refresh Portfolio Health Refresh Executive Insights Generation Investment Recommendation Refresh
Clôture Domaine Analytics
À la fin du Sprint 6-C.2 :
✓ Portfolio Analytics ✓ Benchmarking ✓ Forecasting ✓ Executive Reporting ✓ Portfolio Health Score ✓ Investment Intelligence ✓ Executive AI Insights
sont entièrement opérationnels.
Préparation Sprint 6-D
Compatible avec :
Governance Delegation Approvals Compliance Enterprise Controls
Définition de terminé
Le Sprint 6-C.2 est terminé lorsque :
✓ Portfolio Forecasting créé ✓ Revenue Forecast créé ✓ Occupancy Forecast créé ✓ Investment Insights créés ✓ Portfolio Health Score créé ✓ Executive AI Insights créés ✓ Audit intégré
Livrables
PortfolioForecast PortfolioInsight PortfolioHealthScore InvestmentRecommendation PortfolioForecastService RevenueForecastService OccupancyForecastService InvestmentInsightService PortfolioHealthScoreService ExecutiveInsightService InvestmentRecommendationService Portfolio Intelligence Platform
Sprint 6-D.1 — Enterprise Governance & Multi-Site Security
Objectif
Mettre en place la couche de gouvernance Enterprise du parc immobilier.
Cette couche permet de contrôler :
Accès Délégations Validations Conformité Séparation des responsabilités Traçabilité
sur l'ensemble des portefeuilles, groupes et propriétés.
À l'issue de cette étape :
✓ Portfolio RBAC ✓ Delegation ✓ Approval Workflow ✓ Compliance Controls ✓ Multi-Site Permissions ✓ Governance Dashboard ✓ Enterprise Governance Platform
Architecture cible
Tenant ↓ Governance Layer ├── RBAC ├── Delegation ├── Approval Workflow ├── Compliance ├── Audit └── Governance Dashboard ↓ Portfolio ↓ Property Groups ↓ Properties
Sprint 6-D.1-A
Extension Prisma
Étape 1 — PortfolioRole
Ajouter dans schema.prisma
model PortfolioRole {
id String
@id
@default(uuid())
tenantId String
name String
code String
description String?
systemRole Boolean
@default(false)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
permissions PortfolioPermission[]
assignments PortfolioRoleAssignment[]
@@unique([tenantId, code])
@@index([tenantId])
}
Étape 2 — PortfolioPermission
Ajouter
model PortfolioPermission {
id String
@id
@default(uuid())
roleId String
permission String
role PortfolioRole
@relation(
fields:[roleId],
references:[id],
onDelete:Cascade
)
@@index([roleId])
@@index([permission])
}
Étape 3 — PortfolioRoleAssignment
Ajouter
model PortfolioRoleAssignment {
id String
@id
@default(uuid())
tenantId String
userId String
roleId String
portfolioId String?
propertyGroupId String?
propertyId String?
assignedAt DateTime
@default(now())
expiresAt DateTime?
role PortfolioRole
@relation(
fields:[roleId],
references:[id]
)
@@index([tenantId])
@@index([userId])
@@index([portfolioId])
@@index([propertyId])
}
Étape 4 — Delegation
Ajouter
model Delegation {
id String
@id
@default(uuid())
tenantId String
delegatorUserId String
delegateUserId String
portfolioId String?
propertyGroupId String?
propertyId String?
startDate DateTime
endDate DateTime
active Boolean
@default(true)
reason String?
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([delegatorUserId])
@@index([delegateUserId])
}
Étape 5 — ApprovalRequest
Ajouter
model ApprovalRequest {
id String
@id
@default(uuid())
tenantId String
approvalType ApprovalType
status ApprovalStatus
entityType String
entityId String
requestedBy String
approvedBy String?
requestedAt DateTime
@default(now())
approvedAt DateTime?
comment String?
@@index([tenantId])
@@index([status])
@@index([approvalType])
}
Étape 6 — ComplianceControl
Ajouter
model ComplianceControl {
id String
@id
@default(uuid())
tenantId String
code String
title String
category ComplianceCategory
enabled Boolean
@default(true)
severity ComplianceSeverity
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([category])
}
Étape 7 — Enums
Ajouter
enum ApprovalType {
PROPERTY_CREATION
PROPERTY_UPDATE
OWNER_ASSIGNMENT
OPERATOR_ASSIGNMENT
CAPEX_REQUEST
CONTRACT_APPROVAL
}
enum ApprovalStatus {
PENDING
APPROVED
REJECTED
CANCELLED
}
enum ComplianceCategory {
SECURITY
FINANCIAL
LEGAL
GDPR
OPERATIONS
}
enum ComplianceSeverity {
LOW
MEDIUM
HIGH
CRITICAL
}
Étape 8 — Migration
Générer
npx prisma migrate dev \
--name governance_core
Sprint 6-D.1-B
Governance Module
Étape 9 — Création
src/modules/governance ├── roles │ ├── permissions │ ├── delegations │ ├── approvals │ ├── compliance │ ├── dashboard │ └── governance.module.ts
Étape 10 — Services
Créer
PortfolioRBACService DelegationService ApprovalWorkflowService ComplianceControlService GovernanceDashboardService PermissionResolverService
Sprint 6-D.1-C
Portfolio RBAC
Étape 11 — PortfolioRBACService
Créer
portfolio-rbac.service.ts
Rôles système
PORTFOLIO_ADMIN PORTFOLIO_MANAGER GROUP_MANAGER PROPERTY_MANAGER OWNER_VIEWER AUDITOR
Étape 12 — Permissions
Supporter
Read Create Update Delete Approve Export Admin
par scope.
Étape 13 — Scopes
Appliquer
Portfolio Property Group Property
sur chaque permission.
Sprint 6-D.1-D
Délégations
Étape 14 — DelegationService
Créer
delegation.service.ts
Méthodes
createDelegation() revokeDelegation() validateDelegation() getActiveDelegations()
Étape 15 — Cas d'usage
Supporter
Congés Remplacement Mission temporaire Support régional
Étape 16 — Expiration
Désactiver
automatiquement à :
endDate
Sprint 6-D.1-E
Workflow d'Approbation
Étape 17 — ApprovalWorkflowService
Créer
approval-workflow.service.ts
Méthodes
submitApproval() approve() reject() cancelApproval()
Étape 18 — Workflows
Supporter
Nouvelle propriété Changement propriétaire CAPEX Contrat Suppression actif
Étape 19 — Validation
Exiger
un approbateur différent du demandeur.
Sprint 6-D.1-F
Contrôles de Conformité
Étape 20 — ComplianceControlService
Créer
compliance-control.service.ts
Vérifier
RGPD Audit Sécurité Finance Exploitation
Étape 21 — Méthodes
runControls() evaluateCompliance() createViolation() closeViolation()
Étape 22 — Scores
Calculer
Compliance Score Risk Score Violation Rate
Sprint 6-D.1-G
Dashboard Gouvernance
Étape 23 — GovernanceDashboardService
Créer
governance-dashboard.service.ts
Afficher
Approvals Pending Active Delegations Compliance Score Open Violations Audit Events
Étape 24 — KPI
Mesurer
Approval Time Compliance Rate Policy Violations Delegation Usage Audit Coverage
Étape 25 — Endpoint
Ajouter
GET /governance/dashboard
Sprint 6-D.1-H
API Gouvernance
Étape 26 — Endpoints
Ajouter
GET /governance/roles
POST /governance/roles
GET /governance/delegations
POST /governance/delegations
GET /governance/approvals
POST /governance/approvals
POST /governance/approvals/{id}/approve
POST /governance/approvals/{id}/reject
GET /governance/compliance
Étape 27 — Exemple
Approbation
{
"approvalType":"CAPEX_REQUEST",
"entityType":"Asset",
"entityId":"ast_123"
}
Sprint 6-D.1-I
Sécurité Enterprise
Étape 28 — Permission Resolver
Créer
permission-resolver.service.ts
Résoudre
dans l'ordre :
Role ↓ Delegation ↓ Portfolio Scope ↓ Property Scope
Étape 29 — Middleware
Ajouter
@RequirePortfolioPermission() @RequireApproval()
Étape 30 — Audit
Journaliser
ROLE_ASSIGNED DELEGATION_CREATED APPROVAL_SUBMITTED APPROVAL_APPROVED COMPLIANCE_CHECK_EXECUTED
Sprint 6-D.1-J
Gouvernance Continue
Étape 31 — Jobs
Ajouter
Toutes les heures Delegation Expiration Toutes les nuits Compliance Scan Approval Escalation Governance KPI Refresh
Étape 32 — Permissions
Ajouter
governance.read governance.manage governance.approve governance.compliance governance.audit governance.admin
Préparation Sprint 6-D.2
Compatible avec :
Enterprise Policies Risk Management Internal Controls Governance Intelligence Audit Automation
Définition de terminé
Le Sprint 6-D.1 est terminé lorsque :
✓ Portfolio RBAC créé ✓ Delegation créée ✓ Approval Workflow créé ✓ Compliance Controls créés ✓ Multi-Site Permissions créées ✓ Governance Dashboard créé ✓ Audit intégré
Livrables
PortfolioRole PortfolioPermission PortfolioRoleAssignment Delegation ApprovalRequest ComplianceControl PortfolioRBACService DelegationService ApprovalWorkflowService ComplianceControlService GovernanceDashboardService Enterprise Governance Platform
Sprint 6-D.2 — Governance Intelligence & Risk Management
Objectif
Transformer la gouvernance opérationnelle en plateforme de pilotage des risques Enterprise.
Cette couche permet :
Gestion des risques Politiques Enterprise Contrôles internes Prévision conformité Analyse d'audit Pilotage exécutif
sur l'ensemble des portefeuilles, groupes et propriétés.
À l'issue de cette étape :
✓ Risk Engine ✓ Policy Engine ✓ Segregation of Duties ✓ Audit Intelligence ✓ Compliance Forecasting ✓ Governance Score ✓ Governance Intelligence Platform
Architecture cible
Governance Layer ↓ Governance Intelligence Engine ├── Risk Engine ├── Policy Engine ├── SoD Engine ├── Audit Intelligence ├── Compliance Forecasting ├── Governance Score └── Executive Recommendations ↓ Executive Governance ↓ Enterprise Controls
Sprint 6-D.2-A
Extension Prisma
Étape 1 — GovernanceRisk
Ajouter dans schema.prisma
model GovernanceRisk {
id String
@id
@default(uuid())
tenantId String
portfolioId String?
propertyGroupId String?
propertyId String?
category RiskCategory
severity RiskSeverity
title String
description String
riskScore Float
likelihood Float?
impact Float?
mitigationPlan String?
ownerUserId String?
status RiskStatus
detectedAt DateTime
@default(now())
resolvedAt DateTime?
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([category])
@@index([severity])
@@index([status])
}
Étape 2 — GovernancePolicy
Ajouter
model GovernancePolicy {
id String
@id
@default(uuid())
tenantId String
code String
title String
description String?
category PolicyCategory
active Boolean
@default(true)
version String
effectiveDate DateTime?
reviewDate DateTime?
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
@@unique([tenantId, code])
@@index([tenantId])
@@index([category])
}
Étape 3 — SoDViolation
Ajouter
model SoDViolation {
id String
@id
@default(uuid())
tenantId String
userId String
ruleCode String
conflictDescription String
severity RiskSeverity
resolved Boolean
@default(false)
detectedAt DateTime
@default(now())
resolvedAt DateTime?
@@index([tenantId])
@@index([userId])
@@index([resolved])
}
Étape 4 — GovernanceForecast
Ajouter
model GovernanceForecast {
id String
@id
@default(uuid())
tenantId String
forecastType GovernanceForecastType
forecastDate DateTime
predictedValue Float
confidenceScore Float?
generatedAt DateTime
@default(now())
@@index([tenantId])
@@index([forecastType])
@@index([forecastDate])
}
Étape 5 — GovernanceScore
Ajouter
model GovernanceScore {
tenantId String
@id
overallScore Float
complianceScore Float
auditScore Float
riskScore Float
controlsScore Float
segregationScore Float
calculatedAt DateTime
@updatedAt
}
Étape 6 — Enums
Ajouter
enum RiskCategory {
SECURITY
FINANCIAL
OPERATIONAL
COMPLIANCE
LEGAL
GOVERNANCE
}
enum RiskSeverity {
LOW
MEDIUM
HIGH
CRITICAL
}
enum RiskStatus {
OPEN
MITIGATING
ACCEPTED
RESOLVED
}
enum PolicyCategory {
ACCESS
SECURITY
FINANCE
OPERATIONS
GDPR
AUDIT
}
enum GovernanceForecastType {
COMPLIANCE_SCORE
RISK_EXPOSURE
AUDIT_FINDINGS
POLICY_VIOLATIONS
}
Étape 7 — Migration
npx prisma migrate dev \
--name governance_intelligence
Sprint 6-D.2-B
Governance Intelligence Module
Étape 8 — Structure
src/modules/governance-intelligence ├── risk ├── policy ├── sod ├── audit ├── forecasting ├── scoring ├── recommendations └── governance-intelligence.module.ts
Étape 9 — Services
RiskEngineService PolicyEngineService SegregationOfDutiesService AuditIntelligenceService ComplianceForecastingService GovernanceScoreService GovernanceRecommendationService
Sprint 6-D.2-C
Risk Engine
Étape 10 — RiskEngineService
Créer
risk-engine.service.ts
Capacités
Risk Registry Risk Scoring Risk Classification Risk Mitigation Risk Monitoring
Étape 11 — Détecter
Accès excessifs Violations politiques Fraudes potentielles Conflits SoD Défauts conformité Anomalies d'audit
Étape 12 — Méthodes
detectRisks() calculateRiskScore() classifyRisk() createMitigationPlan() resolveRisk()
Sprint 6-D.2-D
Policy Engine
Étape 13 — PolicyEngineService
Créer
policy-engine.service.ts
Supporter
Policies Rules Exceptions Escalations Approvals
Étape 14 — Méthodes
evaluatePolicy() registerException() validateAction() triggerEscalation() auditExecution()
Étape 15 — Exemples
CAPEX > 50 000 € ↓ Double approbation
Suppression propriété ↓ Validation exécutive
Sprint 6-D.2-E
Segregation of Duties
Étape 16 — SegregationOfDutiesService
Créer
segregation-of-duties.service.ts
Contrôler
Création Validation Paiement Audit Administration
Étape 17 — Détection
Identifier
Demandeur + Approbateur Créateur + Auditeur Administrateur + Contrôleur
Étape 18 — Méthodes
detectConflict() validateRoleAssignment() createViolation() resolveViolation()
Sprint 6-D.2-F
Audit Intelligence
Étape 19 — AuditIntelligenceService
Créer
audit-intelligence.service.ts
Analyser
Audit Logs Approvals Permissions Violations Incidents
Étape 20 — Détecter
Anomalies Patterns Abus potentiels Contrôles manquants Zones à risque
Étape 21 — Méthodes
analyzeAuditLogs() detectAnomalies() generateFindings() identifyControlGaps()
Sprint 6-D.2-G
Compliance Forecasting
Étape 22 — ComplianceForecastingService
Créer
compliance-forecasting.service.ts
Prévoir
Violations Audit Findings Risk Exposure Compliance Trend
Étape 23 — Sources
Compliance Controls Audit Logs Governance Risks SoD Violations
Étape 24 — Méthodes
forecastCompliance() forecastRiskExposure() forecastAuditFindings()
Sprint 6-D.2-H
Governance Score
Étape 25 — GovernanceScoreService
Créer
governance-score.service.ts
Pondération
Compliance 25% Risk 25% Audit 20% Controls 15% SoD 15%
Étape 26 — Classification
90-100 Excellent 75-89 Healthy 50-74 Warning 0-49 Critical
Étape 27 — Exemple
Governance Score 94 Excellent
Sprint 6-D.2-I
Executive Intelligence
Étape 28 — GovernanceRecommendationService
Créer
governance-recommendation.service.ts
Générer
Réduction risques Renforcement contrôles Corrections conformité Optimisation processus Actions audit
Étape 29 — Exemples
18 violations SoD ↓ Séparer les rôles Finance
Risque conformité en hausse ↓ Audit ciblé recommandé
Sprint 6-D.2-J
Dashboard Intelligence
Étape 30 — Endpoints
GET /governance/intelligence GET /governance/risks GET /governance/policies GET /governance/score GET /governance/forecasts GET /governance/recommendations GET /governance/sod
Étape 31 — Exemple
{
"governanceScore":94,
"openRisks":7,
"criticalRisks":1,
"sodViolations":3,
"complianceForecast":91
}
Étape 32 — Permissions
governance.intelligence.read governance.risk.manage governance.policy.manage governance.audit.intelligence governance.executive
Étape 33 — Audit
RISK_DETECTED POLICY_VIOLATION SOD_VIOLATION_CREATED FORECAST_GENERATED GOVERNANCE_SCORE_UPDATED EXECUTIVE_RECOMMENDATION_CREATED
Étape 34 — Jobs
Toutes les heures Risk Detection Toutes les nuits Compliance Forecast Refresh Governance Score Refresh Audit Intelligence Refresh Recommendation Generation
Clôture Sprint 6
À la fin du Sprint 6 :
✓ Portfolio Management ✓ Asset Management ✓ Portfolio Analytics ✓ Portfolio Intelligence ✓ Enterprise Governance ✓ Risk Management ✓ Executive Controls
sont entièrement opérationnels.
Préparation Sprint 7
Compatible avec :
Marketplace OTA Distribution Partners Channels Revenue Sharing
Définition de terminé
Le Sprint 6-D.2 est terminé lorsque :
✓ Risk Engine créé ✓ Policy Engine créé ✓ Segregation of Duties créée ✓ Audit Intelligence créée ✓ Compliance Forecasting créé ✓ Governance Score créé ✓ Executive Intelligence créée ✓ Gouvernance Enterprise finalisée
Livrables
GovernanceRisk GovernancePolicy SoDViolation GovernanceForecast GovernanceScore RiskEngineService PolicyEngineService SegregationOfDutiesService AuditIntelligenceService ComplianceForecastingService GovernanceScoreService GovernanceRecommendationService Governance Intelligence Platform