ujusum:3-codage:2-sprints:6-sprint-6
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédente | |||
| ujusum:3-codage:2-sprints:6-sprint-6 [2026/06/10 18:27] – 83.202.252.200 | ujusum:3-codage:2-sprints:6-sprint-6 [2026/06/11 02:07] (Version actuelle) – 83.202.252.200 | ||
|---|---|---|---|
| Ligne 2632: | Ligne 2632: | ||
| Enterprise Asset Management Platform | Enterprise Asset Management Platform | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.2 — Asset Intelligence & Lifecycle Management ====== | ||
| + | |||
| + | ===== Objectif ===== | ||
| + | |||
| + | Transformer le registre d' | ||
| + | |||
| + | Cette couche permet : | ||
| + | |||
| + | < | ||
| + | Valorisation | ||
| + | |||
| + | Amortissement | ||
| + | |||
| + | Prévision de cycle de vie | ||
| + | |||
| + | Planification CAPEX | ||
| + | |||
| + | Optimisation maintenance | ||
| + | |||
| + | Pilotage patrimonial | ||
| + | </ | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ 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 ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetDepreciation { | ||
| + | |||
| + | assetId | ||
| + | @id | ||
| + | |||
| + | acquisitionValue | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | residualValue | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | usefulLifeYears | ||
| + | |||
| + | annualDepreciation | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | accumulatedDepreciation Decimal | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | bookValue | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | calculatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | asset Asset | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | onDelete: | ||
| + | ) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — AssetValuation ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetValuation { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | assetId | ||
| + | |||
| + | valuationDate | ||
| + | |||
| + | estimatedValue | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | valuationMethod | ||
| + | |||
| + | confidenceScore | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | asset Asset | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | onDelete: | ||
| + | ) | ||
| + | |||
| + | @@index([assetId]) | ||
| + | |||
| + | @@index([valuationDate]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — AssetForecast ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetForecast { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | assetId | ||
| + | |||
| + | forecastType | ||
| + | |||
| + | forecastDate | ||
| + | |||
| + | predictedValue | ||
| + | |||
| + | confidenceScore | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([assetId]) | ||
| + | |||
| + | @@index([forecastType]) | ||
| + | |||
| + | @@index([forecastDate]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — AssetHealthScore ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetHealthScore { | ||
| + | |||
| + | assetId | ||
| + | @id | ||
| + | |||
| + | overallScore | ||
| + | |||
| + | conditionScore | ||
| + | |||
| + | maintenanceScore | ||
| + | |||
| + | utilizationScore | ||
| + | |||
| + | ageScore | ||
| + | |||
| + | riskScore | ||
| + | |||
| + | calculatedAt | ||
| + | @updatedAt | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — AssetRecommendation ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetRecommendation { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | assetId | ||
| + | |||
| + | recommendationType | ||
| + | |||
| + | priority | ||
| + | |||
| + | title | ||
| + | |||
| + | description | ||
| + | |||
| + | estimatedCost | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | estimatedSavings | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | implemented | ||
| + | @default(false) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([assetId]) | ||
| + | |||
| + | @@index([recommendationType]) | ||
| + | |||
| + | @@index([priority]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 6 — Enums ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | 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 ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name asset_intelligence | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.2-B ====== | ||
| + | |||
| + | ===== Asset Intelligence Module ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 8 — Création ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── 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 ===== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ===== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 | ||
| + | |||
| + | Maintenance | ||
| + | |||
| + | Age 20% | ||
| + | |||
| + | Utilization | ||
| + | |||
| + | 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 ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 32 — Exemple ====== | ||
| + | |||
| + | ===== Réponse ===== | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== É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' | ||
| + | |||
| + | < | ||
| + | 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' | ||
| + | |||
| + | < | ||
| + | ✓ 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 ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioAnalyticsSnapshot { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | snapshotDate | ||
| + | |||
| + | propertiesCount | ||
| + | @default(0) | ||
| + | |||
| + | reservationsCount | ||
| + | @default(0) | ||
| + | |||
| + | revenue | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | occupancyRate | ||
| + | |||
| + | averageRating | ||
| + | |||
| + | adr | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | revPar | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([snapshotDate]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — PortfolioKPI ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioKPI { | ||
| + | |||
| + | portfolioId | ||
| + | @id | ||
| + | |||
| + | occupancyRate | ||
| + | |||
| + | adr | ||
| + | |||
| + | revPar | ||
| + | |||
| + | revenueGrowth | ||
| + | |||
| + | reservationGrowth | ||
| + | |||
| + | guestSatisfaction | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — PortfolioBenchmark ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioBenchmark { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | metric | ||
| + | |||
| + | portfolioValue | ||
| + | |||
| + | benchmarkValue | ||
| + | |||
| + | variancePercent | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([metric]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — ExecutiveReport ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model ExecutiveReport { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | reportType | ||
| + | |||
| + | periodStart | ||
| + | |||
| + | periodEnd | ||
| + | |||
| + | generatedAt | ||
| + | @default(now()) | ||
| + | |||
| + | storagePath | ||
| + | |||
| + | createdBy | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([reportType]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — Enums ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | enum PortfolioBenchmarkMetric { | ||
| + | |||
| + | REVENUE | ||
| + | |||
| + | OCCUPANCY | ||
| + | |||
| + | ADR | ||
| + | |||
| + | REVPAR | ||
| + | |||
| + | SATISFACTION | ||
| + | |||
| + | RESERVATIONS | ||
| + | } | ||
| + | |||
| + | enum ExecutiveReportType { | ||
| + | |||
| + | DAILY | ||
| + | |||
| + | WEEKLY | ||
| + | |||
| + | MONTHLY | ||
| + | |||
| + | QUARTERLY | ||
| + | |||
| + | ANNUAL | ||
| + | |||
| + | CUSTOM | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 6 — Migration ====== | ||
| + | |||
| + | ===== Générer ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name portfolio_analytics | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-C.1-B ====== | ||
| + | |||
| + | ===== Portfolio Analytics Module ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 7 — Création ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── 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 ===== | ||
| + | |||
| + | < | ||
| + | |||
| + | |||
| + | 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 ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 26 — Exemple ====== | ||
| + | |||
| + | ===== Réponse ===== | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-C.1-I ====== | ||
| + | |||
| + | ===== API Analytics ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 27 — Endpoints ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 28 — Filtres ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Portfolio | ||
| + | |||
| + | Property Group | ||
| + | |||
| + | Property | ||
| + | |||
| + | Date Range | ||
| + | |||
| + | Region | ||
| + | |||
| + | Category | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 29 — Export ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | Formats : | ||
| + | |||
| + | < | ||
| + | |||
| + | |||
| + | 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' | ||
| + | |||
| + | Prévisions revenus | ||
| + | |||
| + | Prévisions occupation | ||
| + | |||
| + | Pilotage d' | ||
| + | </ | ||
| + | |||
| + | sur l' | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ 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 ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioForecast { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | forecastType | ||
| + | |||
| + | forecastDate | ||
| + | |||
| + | predictedValue | ||
| + | |||
| + | confidenceScore | ||
| + | |||
| + | generatedAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([forecastType]) | ||
| + | |||
| + | @@index([forecastDate]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — PortfolioInsight ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioInsight { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | category | ||
| + | |||
| + | severity | ||
| + | |||
| + | title | ||
| + | |||
| + | description | ||
| + | |||
| + | recommendation | ||
| + | |||
| + | impactScore | ||
| + | |||
| + | implemented | ||
| + | @default(false) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([category]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — PortfolioHealthScore ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioHealthScore { | ||
| + | |||
| + | portfolioId | ||
| + | @id | ||
| + | |||
| + | overallScore | ||
| + | |||
| + | revenueScore | ||
| + | |||
| + | occupancyScore | ||
| + | |||
| + | guestScore | ||
| + | |||
| + | operationsScore | ||
| + | |||
| + | assetScore | ||
| + | |||
| + | growthScore | ||
| + | |||
| + | calculatedAt | ||
| + | @updatedAt | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — InvestmentRecommendation ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model InvestmentRecommendation { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | recommendationType | ||
| + | |||
| + | priority | ||
| + | |||
| + | title | ||
| + | |||
| + | description | ||
| + | |||
| + | estimatedInvestment | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | estimatedReturn | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | roiPercent | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([recommendationType]) | ||
| + | |||
| + | @@index([priority]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — Enums ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | 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 ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name portfolio_intelligence | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-C.2-B ====== | ||
| + | |||
| + | ===== Portfolio Intelligence Module ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 7 — Création ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── 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 ===== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 | ||
| + | |||
| + | Occupancy | ||
| + | |||
| + | Guest Score 15% | ||
| + | |||
| + | Operations | ||
| + | |||
| + | Assets | ||
| + | |||
| + | Growth | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== É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' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 23 — Exemple ====== | ||
| + | |||
| + | < | ||
| + | Le groupe Europe Nord | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Occupation en baisse | ||
| + | |||
| + | -7% | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Action recommandée | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-C.2-H ====== | ||
| + | |||
| + | ===== Recommandations d' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== É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 ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 28 — Exemple ====== | ||
| + | |||
| + | ===== Réponse ===== | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== É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' | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ 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 ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioRole { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | name String | ||
| + | |||
| + | code String | ||
| + | |||
| + | description | ||
| + | |||
| + | systemRole | ||
| + | @default(false) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | permissions | ||
| + | |||
| + | assignments | ||
| + | |||
| + | @@unique([tenantId, | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — PortfolioPermission ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioPermission { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | roleId | ||
| + | |||
| + | permission | ||
| + | |||
| + | role PortfolioRole | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | onDelete: | ||
| + | ) | ||
| + | |||
| + | @@index([roleId]) | ||
| + | |||
| + | @@index([permission]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — PortfolioRoleAssignment ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioRoleAssignment { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | userId | ||
| + | |||
| + | roleId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | propertyGroupId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | assignedAt | ||
| + | @default(now()) | ||
| + | |||
| + | expiresAt | ||
| + | |||
| + | role PortfolioRole | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | ) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([userId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([propertyId]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — Delegation ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model Delegation { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | delegatorUserId | ||
| + | |||
| + | delegateUserId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | propertyGroupId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | startDate | ||
| + | |||
| + | endDate | ||
| + | |||
| + | active | ||
| + | @default(true) | ||
| + | |||
| + | reason | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([delegatorUserId]) | ||
| + | |||
| + | @@index([delegateUserId]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — ApprovalRequest ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model ApprovalRequest { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | approvalType | ||
| + | |||
| + | status | ||
| + | |||
| + | entityType | ||
| + | |||
| + | entityId | ||
| + | |||
| + | requestedBy | ||
| + | |||
| + | approvedBy | ||
| + | |||
| + | requestedAt | ||
| + | @default(now()) | ||
| + | |||
| + | approvedAt | ||
| + | |||
| + | comment | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([status]) | ||
| + | |||
| + | @@index([approvalType]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 6 — ComplianceControl ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model ComplianceControl { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | code String | ||
| + | |||
| + | title | ||
| + | |||
| + | category | ||
| + | |||
| + | enabled | ||
| + | @default(true) | ||
| + | |||
| + | severity | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([category]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 7 — Enums ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | 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 ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name governance_core | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.1-B ====== | ||
| + | |||
| + | ===== Governance Module ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 9 — Création ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── 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 ===== | ||
| + | |||
| + | <code ts> | ||
| + | createDelegation() | ||
| + | |||
| + | revokeDelegation() | ||
| + | |||
| + | validateDelegation() | ||
| + | |||
| + | getActiveDelegations() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 15 — Cas d' | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Congés | ||
| + | |||
| + | Remplacement | ||
| + | |||
| + | Mission temporaire | ||
| + | |||
| + | Support régional | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 16 — Expiration ====== | ||
| + | |||
| + | ===== Désactiver ===== | ||
| + | |||
| + | automatiquement à : | ||
| + | |||
| + | < | ||
| + | endDate | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.1-E ====== | ||
| + | |||
| + | ===== Workflow d' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 17 — ApprovalWorkflowService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | approval-workflow.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.1-H ====== | ||
| + | |||
| + | ===== API Gouvernance ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 26 — Endpoints ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 27 — Exemple ====== | ||
| + | |||
| + | ===== Approbation ===== | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.1-I ====== | ||
| + | |||
| + | ===== Sécurité Enterprise ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 28 — Permission Resolver ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | permission-resolver.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Résoudre ===== | ||
| + | |||
| + | dans l' | ||
| + | |||
| + | < | ||
| + | Role | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Delegation | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Portfolio Scope | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Property Scope | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 29 — Middleware ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code ts> | ||
| + | @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' | ||
| + | |||
| + | Prévisions revenus | ||
| + | |||
| + | Prévisions occupation | ||
| + | |||
| + | Pilotage d' | ||
| + | </ | ||
| + | |||
| + | sur l' | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ 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 ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioForecast { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | forecastType | ||
| + | |||
| + | forecastDate | ||
| + | |||
| + | predictedValue | ||
| + | |||
| + | confidenceScore | ||
| + | |||
| + | generatedAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([forecastType]) | ||
| + | |||
| + | @@index([forecastDate]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — PortfolioInsight ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioInsight { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | category | ||
| + | |||
| + | severity | ||
| + | |||
| + | title | ||
| + | |||
| + | description | ||
| + | |||
| + | recommendation | ||
| + | |||
| + | impactScore | ||
| + | |||
| + | implemented | ||
| + | @default(false) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([category]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — PortfolioHealthScore ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioHealthScore { | ||
| + | |||
| + | portfolioId | ||
| + | @id | ||
| + | |||
| + | overallScore | ||
| + | |||
| + | revenueScore | ||
| + | |||
| + | occupancyScore | ||
| + | |||
| + | guestScore | ||
| + | |||
| + | operationsScore | ||
| + | |||
| + | assetScore | ||
| + | |||
| + | growthScore | ||
| + | |||
| + | calculatedAt | ||
| + | @updatedAt | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — InvestmentRecommendation ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model InvestmentRecommendation { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | recommendationType | ||
| + | |||
| + | priority | ||
| + | |||
| + | title | ||
| + | |||
| + | description | ||
| + | |||
| + | estimatedInvestment | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | estimatedReturn | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | roiPercent | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([recommendationType]) | ||
| + | |||
| + | @@index([priority]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — Enums ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | 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 ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name portfolio_intelligence | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-C.2-B ====== | ||
| + | |||
| + | ===== Portfolio Intelligence Module ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 7 — Création ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── 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 ===== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 | ||
| + | |||
| + | Occupancy | ||
| + | |||
| + | Guest Score 15% | ||
| + | |||
| + | Operations | ||
| + | |||
| + | Assets | ||
| + | |||
| + | Growth | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== É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' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 23 — Exemple ====== | ||
| + | |||
| + | < | ||
| + | Le groupe Europe Nord | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Occupation en baisse | ||
| + | |||
| + | -7% | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Action recommandée | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-C.2-H ====== | ||
| + | |||
| + | ===== Recommandations d' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== É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 ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 28 — Exemple ====== | ||
| + | |||
| + | ===== Réponse ===== | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== É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' | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ 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 ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioRole { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | name String | ||
| + | |||
| + | code String | ||
| + | |||
| + | description | ||
| + | |||
| + | systemRole | ||
| + | @default(false) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | permissions | ||
| + | |||
| + | assignments | ||
| + | |||
| + | @@unique([tenantId, | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — PortfolioPermission ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioPermission { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | roleId | ||
| + | |||
| + | permission | ||
| + | |||
| + | role PortfolioRole | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | onDelete: | ||
| + | ) | ||
| + | |||
| + | @@index([roleId]) | ||
| + | |||
| + | @@index([permission]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — PortfolioRoleAssignment ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PortfolioRoleAssignment { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | userId | ||
| + | |||
| + | roleId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | propertyGroupId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | assignedAt | ||
| + | @default(now()) | ||
| + | |||
| + | expiresAt | ||
| + | |||
| + | role PortfolioRole | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | ) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([userId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([propertyId]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — Delegation ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model Delegation { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | delegatorUserId | ||
| + | |||
| + | delegateUserId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | propertyGroupId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | startDate | ||
| + | |||
| + | endDate | ||
| + | |||
| + | active | ||
| + | @default(true) | ||
| + | |||
| + | reason | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([delegatorUserId]) | ||
| + | |||
| + | @@index([delegateUserId]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — ApprovalRequest ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model ApprovalRequest { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | approvalType | ||
| + | |||
| + | status | ||
| + | |||
| + | entityType | ||
| + | |||
| + | entityId | ||
| + | |||
| + | requestedBy | ||
| + | |||
| + | approvedBy | ||
| + | |||
| + | requestedAt | ||
| + | @default(now()) | ||
| + | |||
| + | approvedAt | ||
| + | |||
| + | comment | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([status]) | ||
| + | |||
| + | @@index([approvalType]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 6 — ComplianceControl ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model ComplianceControl { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | code String | ||
| + | |||
| + | title | ||
| + | |||
| + | category | ||
| + | |||
| + | enabled | ||
| + | @default(true) | ||
| + | |||
| + | severity | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([category]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 7 — Enums ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | 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 ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name governance_core | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.1-B ====== | ||
| + | |||
| + | ===== Governance Module ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 9 — Création ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── 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 ===== | ||
| + | |||
| + | <code ts> | ||
| + | createDelegation() | ||
| + | |||
| + | revokeDelegation() | ||
| + | |||
| + | validateDelegation() | ||
| + | |||
| + | getActiveDelegations() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 15 — Cas d' | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Congés | ||
| + | |||
| + | Remplacement | ||
| + | |||
| + | Mission temporaire | ||
| + | |||
| + | Support régional | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 16 — Expiration ====== | ||
| + | |||
| + | ===== Désactiver ===== | ||
| + | |||
| + | automatiquement à : | ||
| + | |||
| + | < | ||
| + | endDate | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.1-E ====== | ||
| + | |||
| + | ===== Workflow d' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 17 — ApprovalWorkflowService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | approval-workflow.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.1-H ====== | ||
| + | |||
| + | ===== API Gouvernance ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 26 — Endpoints ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 27 — Exemple ====== | ||
| + | |||
| + | ===== Approbation ===== | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.1-I ====== | ||
| + | |||
| + | ===== Sécurité Enterprise ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 28 — Permission Resolver ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | permission-resolver.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Résoudre ===== | ||
| + | |||
| + | dans l' | ||
| + | |||
| + | < | ||
| + | Role | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Delegation | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Portfolio Scope | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Property Scope | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 29 — Middleware ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code ts> | ||
| + | @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' | ||
| + | |||
| + | Pilotage exécutif | ||
| + | </ | ||
| + | |||
| + | sur l' | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ 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 ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model GovernanceRisk { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | propertyGroupId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | category | ||
| + | |||
| + | severity | ||
| + | |||
| + | title | ||
| + | |||
| + | description | ||
| + | |||
| + | riskScore | ||
| + | |||
| + | likelihood | ||
| + | |||
| + | impact | ||
| + | |||
| + | mitigationPlan | ||
| + | |||
| + | ownerUserId | ||
| + | |||
| + | status | ||
| + | |||
| + | detectedAt | ||
| + | @default(now()) | ||
| + | |||
| + | resolvedAt | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | @@index([category]) | ||
| + | @@index([severity]) | ||
| + | @@index([status]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — GovernancePolicy ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model GovernancePolicy { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | code String | ||
| + | |||
| + | title | ||
| + | |||
| + | description | ||
| + | |||
| + | category | ||
| + | |||
| + | active | ||
| + | @default(true) | ||
| + | |||
| + | version | ||
| + | |||
| + | effectiveDate | ||
| + | |||
| + | reviewDate | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | @@unique([tenantId, | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | @@index([category]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — SoDViolation ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model SoDViolation { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | userId | ||
| + | |||
| + | ruleCode | ||
| + | |||
| + | conflictDescription | ||
| + | |||
| + | severity | ||
| + | |||
| + | resolved | ||
| + | @default(false) | ||
| + | |||
| + | detectedAt | ||
| + | @default(now()) | ||
| + | |||
| + | resolvedAt | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | @@index([userId]) | ||
| + | @@index([resolved]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — GovernanceForecast ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model GovernanceForecast { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | forecastType | ||
| + | |||
| + | forecastDate | ||
| + | |||
| + | predictedValue | ||
| + | |||
| + | confidenceScore | ||
| + | |||
| + | generatedAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | @@index([forecastType]) | ||
| + | @@index([forecastDate]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — GovernanceScore ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model GovernanceScore { | ||
| + | |||
| + | tenantId | ||
| + | @id | ||
| + | |||
| + | overallScore | ||
| + | |||
| + | complianceScore | ||
| + | |||
| + | auditScore | ||
| + | |||
| + | riskScore | ||
| + | |||
| + | controlsScore | ||
| + | |||
| + | segregationScore | ||
| + | |||
| + | calculatedAt | ||
| + | @updatedAt | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 6 — Enums ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | 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 ====== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name governance_intelligence | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.2-B ====== | ||
| + | |||
| + | ===== Governance Intelligence Module ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 8 — Structure ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── 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' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 12 — Méthodes ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | 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 ====== | ||
| + | |||
| + | <code ts> | ||
| + | forecastCompliance() | ||
| + | |||
| + | forecastRiskExposure() | ||
| + | |||
| + | forecastAuditFindings() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-D.2-H ====== | ||
| + | |||
| + | ===== Governance Score ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 25 — GovernanceScoreService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | governance-score.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Pondération ===== | ||
| + | |||
| + | < | ||
| + | Compliance | ||
| + | |||
| + | Risk 25% | ||
| + | |||
| + | Audit 20% | ||
| + | |||
| + | Controls | ||
| + | |||
| + | SoD 15% | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 26 — Classification ====== | ||
| + | |||
| + | < | ||
| + | 90-100 | ||
| + | |||
| + | 75-89 | ||
| + | |||
| + | 50-74 | ||
| + | |||
| + | 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 ====== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 31 — Exemple ====== | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== É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 | ||
| </ | </ | ||
ujusum/3-codage/2-sprints/6-sprint-6.1781108824.txt.gz · Dernière modification : 2026/06/10 18:27 de 83.202.252.200