ujusum:3-codage:2-sprints:6-sprint-6
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| ujusum:3-codage:2-sprints:6-sprint-6 [2026/06/10 18:16] – créée 83.202.252.200 | ujusum:3-codage:2-sprints:6-sprint-6 [2026/06/11 02:07] (Version actuelle) – 83.202.252.200 | ||
|---|---|---|---|
| Ligne 186: | Ligne 186: | ||
| ---- | ---- | ||
| - | ====== | + | ====== |
| - | ===== Sprint 6-A.1 ===== | + | ===== Objectif |
| - | Implémentation Prisma Portfolio Core | + | Créer la fondation Multi-Propriétés Enterprise. |
| - | Objectif | + | Cette couche permet de regrouper plusieurs propriétés dans des structures hiérarchiques |
| - | Créer les modèles | + | < |
| + | Tenant | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Portfolio | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Property Group | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Properties | ||
| + | </ | ||
| + | |||
| + | avec gestion des : | ||
| + | |||
| + | < | ||
| + | Propriétaires | ||
| + | |||
| + | Exploitants | ||
| + | |||
| + | Groupes | ||
| + | |||
| + | Portefeuilles | ||
| + | </ | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ Portfolio | ||
| + | |||
| + | ✓ PropertyGroup | ||
| + | |||
| + | ✓ Owner | ||
| + | |||
| + | ✓ Operator | ||
| + | |||
| + | ✓ Multi-Property Ready | ||
| + | |||
| + | ✓ Finance Ready | ||
| + | |||
| + | ✓ Reservation Ready | ||
| + | |||
| + | ✓ Analytics Ready | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Architecture cible ====== | ||
| + | |||
| + | < | ||
| + | Tenant | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Portfolio | ||
| + | |||
| + | ├── Property Groups | ||
| + | │ | ||
| + | ├── Owners | ||
| + | │ | ||
| + | ├── Operators | ||
| + | │ | ||
| + | └── Properties | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Reservations | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Finance | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Analytics | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.1-A ====== | ||
| + | |||
| + | ===== Extension Prisma ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 1 — Portfolio ====== | ||
| + | |||
| + | ===== Ajouter dans schema.prisma ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model Portfolio { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | name String | ||
| + | |||
| + | code String | ||
| + | @unique | ||
| + | |||
| + | description | ||
| + | |||
| + | active | ||
| + | @default(true) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | tenant | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | ) | ||
| + | |||
| + | propertyGroups | ||
| + | |||
| + | properties | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([active]) | ||
| + | |||
| + | @@index([code]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — PropertyGroup ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model PropertyGroup { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | |||
| + | name String | ||
| + | |||
| + | code String | ||
| + | |||
| + | description | ||
| + | |||
| + | active | ||
| + | @default(true) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | portfolio | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | onDelete: | ||
| + | ) | ||
| + | |||
| + | properties | ||
| + | |||
| + | @@unique([ | ||
| + | portfolioId, | ||
| + | code | ||
| + | ]) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([active]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — Owner ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model Owner { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | ownerCode | ||
| + | @unique | ||
| + | |||
| + | type OwnerType | ||
| + | |||
| + | companyName | ||
| + | |||
| + | firstName | ||
| + | |||
| + | lastName | ||
| + | |||
| + | email | ||
| + | |||
| + | phone | ||
| + | |||
| + | taxIdentifier | ||
| + | |||
| + | active | ||
| + | @default(true) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | properties | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([ownerCode]) | ||
| + | |||
| + | @@index([active]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — Operator ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model Operator { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | operatorCode | ||
| + | @unique | ||
| + | |||
| + | companyName | ||
| + | |||
| + | email | ||
| + | |||
| + | phone | ||
| + | |||
| + | active | ||
| + | @default(true) | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | properties | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([operatorCode]) | ||
| + | |||
| + | @@index([active]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — OwnerType ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | enum OwnerType { | ||
| + | |||
| + | INDIVIDUAL | ||
| + | |||
| + | COMPANY | ||
| + | |||
| + | INVESTMENT_FUND | ||
| + | |||
| + | REIT | ||
| + | |||
| + | GOVERNMENT | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.1-B ====== | ||
| + | |||
| + | ===== Extension du modèle Property ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 6 — Ajouter Portfolio ====== | ||
| + | |||
| + | ===== Dans Property ===== | ||
| + | |||
| + | <code prisma> | ||
| + | portfolioId | ||
| + | |||
| + | portfolio | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | ) | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 7 — Ajouter Property Group ====== | ||
| + | |||
| + | ===== Dans Property ===== | ||
| + | |||
| + | <code prisma> | ||
| + | propertyGroupId | ||
| + | |||
| + | propertyGroup | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | ) | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 8 — Ajouter Owner ====== | ||
| + | |||
| + | ===== Dans Property ===== | ||
| + | |||
| + | <code prisma> | ||
| + | ownerId | ||
| + | |||
| + | owner Owner? | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | ) | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 9 — Ajouter Operator ====== | ||
| + | |||
| + | ===== Dans Property ===== | ||
| + | |||
| + | <code prisma> | ||
| + | operatorId | ||
| + | |||
| + | operator | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | ) | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 10 — Ajouter Index ====== | ||
| + | |||
| + | <code prisma> | ||
| + | @@index([portfolioId]) | ||
| + | |||
| + | @@index([propertyGroupId]) | ||
| + | |||
| + | @@index([ownerId]) | ||
| + | |||
| + | @@index([operatorId]) | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.1-C ====== | ||
| + | |||
| + | ===== Relations Tenant ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 11 — Ajouter ====== | ||
| + | |||
| + | ===== Dans Tenant ===== | ||
| + | |||
| + | <code prisma> | ||
| + | portfolios Portfolio[] | ||
| + | |||
| + | owners Owner[] | ||
| + | |||
| + | operators Operator[] | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 12 — Multi-Tenant ====== | ||
| + | |||
| + | ===== Garantir ===== | ||
| + | |||
| + | que : | ||
| < | < | ||
| Ligne 206: | Ligne 620: | ||
| </ | </ | ||
| - | dans : | + | appartiennent toujours au même : |
| < | < | ||
| - | apps/ | + | tenantId |
| </ | </ | ||
| - | avec : | + | ---- |
| + | |||
| + | ====== Sprint 6-A.1-D ====== | ||
| + | |||
| + | ===== Contraintes Métier ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 13 — Portfolio ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| < | < | ||
| - | Multi-tenant | + | 1 Tenant |
| - | Multi-property | + | ↓ |
| - | Reservation Ready | + | N Portfolios |
| + | </ | ||
| - | Finance Ready | + | ---- |
| - | Analytics Ready | + | ====== Étape 14 — Property Group ====== |
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | 1 Portfolio | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | N Property Groups | ||
| </ | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 15 — Owner ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | 1 Owner | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | N Properties | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 16 — Operator ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | 1 Operator | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | N Properties | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.1-E ====== | ||
| + | |||
| + | ===== Finance Ready ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 17 — Préparer ===== | ||
| + | |||
| + | Compatible avec : | ||
| + | |||
| + | < | ||
| + | Revenue Sharing | ||
| + | |||
| + | Owner Statements | ||
| + | |||
| + | Commission Engine | ||
| + | |||
| + | Asset Accounting | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 18 — Préparer ===== | ||
| + | |||
| + | Compatible avec : | ||
| + | |||
| + | < | ||
| + | Multi-Owner Properties | ||
| + | |||
| + | Operator Contracts | ||
| + | |||
| + | Portfolio Finance | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.1-F ====== | ||
| + | |||
| + | ===== Reservation Ready ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 19 — Préparer ===== | ||
| + | |||
| + | Compatible avec : | ||
| + | |||
| + | < | ||
| + | Portfolio Occupancy | ||
| + | |||
| + | Group Reservations | ||
| + | |||
| + | Multi-Site Reporting | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 20 — Préparer ===== | ||
| + | |||
| + | Compatible avec : | ||
| + | |||
| + | < | ||
| + | Cross Property Search | ||
| + | |||
| + | Portfolio Analytics | ||
| + | |||
| + | Enterprise Reporting | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.1-G ====== | ||
| + | |||
| + | ===== Analytics Ready ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 21 — Préparer ===== | ||
| + | |||
| + | Compatible avec : | ||
| + | |||
| + | < | ||
| + | Portfolio Revenue | ||
| + | |||
| + | Portfolio Occupancy | ||
| + | |||
| + | Benchmarking | ||
| + | |||
| + | Forecasting | ||
| + | |||
| + | Asset Performance | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 22 — Préparer ===== | ||
| + | |||
| + | Compatible avec : | ||
| + | |||
| + | < | ||
| + | Executive Dashboard | ||
| + | |||
| + | Owner Dashboard | ||
| + | |||
| + | Operator Dashboard | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.1-H ====== | ||
| + | |||
| + | ===== Migration ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 23 — Générer ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name portfolio_core | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 24 — Générer ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma generate | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 25 — Vérifier ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma studio | ||
| + | </ | ||
| + | |||
| + | Présence de : | ||
| + | |||
| + | < | ||
| + | Portfolio | ||
| + | |||
| + | PropertyGroup | ||
| + | |||
| + | Owner | ||
| + | |||
| + | Operator | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Définition de terminé ====== | ||
| + | |||
| + | Le Sprint 6-A.1 est terminé lorsque : | ||
| + | |||
| + | < | ||
| + | ✓ Portfolio créé | ||
| + | |||
| + | ✓ PropertyGroup créé | ||
| + | |||
| + | ✓ Owner créé | ||
| + | |||
| + | ✓ Operator créé | ||
| + | |||
| + | ✓ Relations Property créées | ||
| + | |||
| + | ✓ Relations Tenant créées | ||
| + | |||
| + | ✓ Multi-Tenant Ready | ||
| + | |||
| + | ✓ Finance Ready | ||
| + | |||
| + | ✓ Analytics Ready | ||
| + | |||
| + | ✓ Migration exécutée | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Livrables ====== | ||
| + | |||
| + | < | ||
| + | Portfolio | ||
| + | |||
| + | PropertyGroup | ||
| + | |||
| + | Owner | ||
| + | |||
| + | Operator | ||
| + | |||
| + | OwnerType | ||
| + | |||
| + | Portfolio Core Schema | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2 — Gestion Multi-Propriétés Enterprise ====== | ||
| + | |||
| + | ===== Objectif ===== | ||
| + | |||
| + | Construire la couche métier Multi-Propriétés Enterprise. | ||
| + | |||
| + | Cette couche permet de gérer : | ||
| + | |||
| + | < | ||
| + | Portefeuilles | ||
| + | |||
| + | Groupes de propriétés | ||
| + | |||
| + | Propriétaires | ||
| + | |||
| + | Exploitants | ||
| + | |||
| + | Hiérarchie multi-sites | ||
| + | |||
| + | Sécurité multi-niveaux | ||
| + | </ | ||
| + | |||
| + | à partir d'une interface unique. | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ PortfolioModule | ||
| + | |||
| + | ✓ PropertyGroupModule | ||
| + | |||
| + | ✓ OwnerModule | ||
| + | |||
| + | ✓ OperatorModule | ||
| + | |||
| + | ✓ Portfolio Hierarchy | ||
| + | |||
| + | ✓ Portfolio Security | ||
| + | |||
| + | ✓ Portfolio Dashboard | ||
| + | |||
| + | ✓ Enterprise Multi-Site Management | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Architecture cible ====== | ||
| + | |||
| + | < | ||
| + | Portfolio | ||
| + | |||
| + | ├── Property Groups | ||
| + | │ | ||
| + | ├── Properties | ||
| + | │ | ||
| + | ├── Owners | ||
| + | │ | ||
| + | ├── Operators | ||
| + | │ | ||
| + | └── Portfolio Dashboard | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Reservations | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Finance | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Analytics | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-A ====== | ||
| + | |||
| + | ===== Modules Métier ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 1 — Création ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── portfolio | ||
| + | │ | ||
| + | ├── property-groups | ||
| + | │ | ||
| + | ├── owners | ||
| + | │ | ||
| + | ├── operators | ||
| + | │ | ||
| + | ├── dashboard | ||
| + | │ | ||
| + | └── portfolio.module.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — Services ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | PortfolioService | ||
| + | |||
| + | PropertyGroupService | ||
| + | |||
| + | OwnerService | ||
| + | |||
| + | OperatorService | ||
| + | |||
| + | PortfolioHierarchyService | ||
| + | |||
| + | PortfolioDashboardService | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — Controllers ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | PortfolioController | ||
| + | |||
| + | PropertyGroupController | ||
| + | |||
| + | OwnerController | ||
| + | |||
| + | OperatorController | ||
| + | |||
| + | PortfolioDashboardController | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-B ====== | ||
| + | |||
| + | ===== Gestion des Portefeuilles ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — PortfolioService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | portfolio.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | createPortfolio() | ||
| + | |||
| + | updatePortfolio() | ||
| + | |||
| + | archivePortfolio() | ||
| + | |||
| + | getPortfolio() | ||
| + | |||
| + | getPortfolioSummary() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — Endpoints ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET /portfolios | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | PUT / | ||
| + | |||
| + | DELETE / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 6 — Validation ====== | ||
| + | |||
| + | ===== Vérifier ===== | ||
| + | |||
| + | < | ||
| + | tenantId | ||
| + | |||
| + | unicité code | ||
| + | |||
| + | ownership | ||
| + | </ | ||
| + | |||
| + | sur chaque opération. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-C ====== | ||
| + | |||
| + | ===== Gestion des Groupes ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 7 — PropertyGroupService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | property-group.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | createGroup() | ||
| + | |||
| + | assignProperty() | ||
| + | |||
| + | removeProperty() | ||
| + | |||
| + | moveProperty() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 8 — Structure ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Portfolio | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Region | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | City | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Properties | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 9 — Endpoints ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | PUT / | ||
| + | |||
| + | DELETE / | ||
| + | |||
| + | POST / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-D ====== | ||
| + | |||
| + | ===== Gestion des Propriétaires ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 10 — OwnerService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | owner.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | createOwner() | ||
| + | |||
| + | updateOwner() | ||
| + | |||
| + | assignProperty() | ||
| + | |||
| + | getOwnerPortfolio() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 11 — Informations ====== | ||
| + | |||
| + | ===== Gérer ===== | ||
| + | |||
| + | < | ||
| + | Personne physique | ||
| + | |||
| + | Société | ||
| + | |||
| + | Coordonnées | ||
| + | |||
| + | Fiscalité | ||
| + | |||
| + | Contrats | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 12 — Endpoints ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET /owners | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | PUT / | ||
| + | |||
| + | DELETE / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-E ====== | ||
| + | |||
| + | ===== Gestion des Exploitants ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 13 — OperatorService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | operator.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | createOperator() | ||
| + | |||
| + | updateOperator() | ||
| + | |||
| + | assignProperty() | ||
| + | |||
| + | getOperatorPerformance() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 14 — Endpoints ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET /operators | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | PUT / | ||
| + | |||
| + | DELETE / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-F ====== | ||
| + | |||
| + | ===== Hiérarchie Enterprise ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 15 — PortfolioHierarchyService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | portfolio-hierarchy.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Construire ===== | ||
| + | |||
| + | < | ||
| + | Portfolio | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | PropertyGroup | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Property | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 16 — Fonctions ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | <code ts> | ||
| + | getTree() | ||
| + | |||
| + | getChildren() | ||
| + | |||
| + | getAncestors() | ||
| + | |||
| + | calculateAggregates() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 17 — Agrégations ====== | ||
| + | |||
| + | ===== Calculer ===== | ||
| + | |||
| + | < | ||
| + | Properties Count | ||
| + | |||
| + | Revenue | ||
| + | |||
| + | Occupancy | ||
| + | |||
| + | Reservations | ||
| + | |||
| + | Reviews | ||
| + | </ | ||
| + | |||
| + | par niveau. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-G ====== | ||
| + | |||
| + | ===== Portfolio Security ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 18 — Portfolio Scope ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | < | ||
| + | portfolioId | ||
| + | |||
| + | propertyGroupId | ||
| + | |||
| + | propertyId | ||
| + | </ | ||
| + | |||
| + | comme scopes de sécurité. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 19 — RBAC ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Portfolio Admin | ||
| + | |||
| + | Portfolio Manager | ||
| + | |||
| + | Group Manager | ||
| + | |||
| + | Property Manager | ||
| + | |||
| + | Owner Viewer | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 20 — Filtrage ====== | ||
| + | |||
| + | ===== Imposer ===== | ||
| + | |||
| + | sur toutes les requêtes : | ||
| + | |||
| + | < | ||
| + | tenantId | ||
| + | |||
| + | portfolioId | ||
| + | </ | ||
| + | |||
| + | afin d' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 21 — Decorators ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | <code ts> | ||
| + | @PortfolioScope() | ||
| + | |||
| + | @PropertyGroupScope() | ||
| + | </ | ||
| + | |||
| + | pour les futurs modules. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-H ====== | ||
| + | |||
| + | ===== Dashboard Portfolio ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 22 — PortfolioDashboardService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | portfolio-dashboard.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Agréger ===== | ||
| + | |||
| + | < | ||
| + | Properties | ||
| + | |||
| + | Reservations | ||
| + | |||
| + | Revenue | ||
| + | |||
| + | Occupancy | ||
| + | |||
| + | Reviews | ||
| + | |||
| + | Incidents | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 23 — Endpoint ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 24 — Exemple ====== | ||
| + | |||
| + | ===== Réponse ===== | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 25 — KPIs ====== | ||
| + | |||
| + | ===== Mesurer ===== | ||
| + | |||
| + | < | ||
| + | Revenue | ||
| + | |||
| + | Occupancy | ||
| + | |||
| + | ADR | ||
| + | |||
| + | RevPAR | ||
| + | |||
| + | Reservations | ||
| + | |||
| + | Guest Satisfaction | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-I ====== | ||
| + | |||
| + | ===== API Enterprise ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 26 — Recherche ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 27 — Pagination ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Page | ||
| + | |||
| + | Limit | ||
| + | |||
| + | Sort | ||
| + | |||
| + | Filters | ||
| + | </ | ||
| + | |||
| + | sur tous les endpoints. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 28 — Export ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | Formats : | ||
| + | |||
| + | < | ||
| + | CSV | ||
| + | |||
| + | Excel | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-A.2-J ====== | ||
| + | |||
| + | ===== Gouvernance ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 29 — Permissions ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | < | ||
| + | portfolio.read | ||
| + | |||
| + | portfolio.create | ||
| + | |||
| + | portfolio.update | ||
| + | |||
| + | portfolio.delete | ||
| + | |||
| + | portfolio.dashboard | ||
| + | |||
| + | owner.manage | ||
| + | |||
| + | operator.manage | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 30 — Audit ====== | ||
| + | |||
| + | ===== Journaliser ===== | ||
| + | |||
| + | < | ||
| + | PORTFOLIO_CREATED | ||
| + | |||
| + | PORTFOLIO_UPDATED | ||
| + | |||
| + | PROPERTY_ASSIGNED | ||
| + | |||
| + | OWNER_ASSIGNED | ||
| + | |||
| + | OPERATOR_ASSIGNED | ||
| + | |||
| + | PORTFOLIO_DASHBOARD_VIEWED | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 31 — Préparation Sprint 6-B ===== | ||
| + | |||
| + | Compatible avec : | ||
| + | |||
| + | < | ||
| + | Assets | ||
| + | |||
| + | Equipment | ||
| + | |||
| + | Lifecycle | ||
| + | |||
| + | Depreciation | ||
| + | |||
| + | Capital Expenditure | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Définition de terminé ====== | ||
| + | |||
| + | Le Sprint 6-A.2 est terminé lorsque : | ||
| + | |||
| + | < | ||
| + | ✓ PortfolioModule créé | ||
| + | |||
| + | ✓ PropertyGroupModule créé | ||
| + | |||
| + | ✓ OwnerModule créé | ||
| + | |||
| + | ✓ OperatorModule créé | ||
| + | |||
| + | ✓ Portfolio Hierarchy créée | ||
| + | |||
| + | ✓ Portfolio Security créée | ||
| + | |||
| + | ✓ Portfolio Dashboard créé | ||
| + | |||
| + | ✓ Audit intégré | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Livrables ====== | ||
| + | |||
| + | < | ||
| + | PortfolioModule | ||
| + | |||
| + | PropertyGroupModule | ||
| + | |||
| + | OwnerModule | ||
| + | |||
| + | OperatorModule | ||
| + | |||
| + | PortfolioHierarchyService | ||
| + | |||
| + | PortfolioDashboardService | ||
| + | |||
| + | Portfolio Security Layer | ||
| + | |||
| + | Enterprise Multi-Property Platform | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1 — Asset Management Core ====== | ||
| + | |||
| + | ===== Objectif ===== | ||
| + | |||
| + | Mettre en place le moteur de gestion des actifs physiques du parc immobilier. | ||
| + | |||
| + | Cette couche permet de gérer : | ||
| + | |||
| + | < | ||
| + | Mobilier | ||
| + | |||
| + | Équipements | ||
| + | |||
| + | Électroménager | ||
| + | |||
| + | Matériel technique | ||
| + | |||
| + | Inventaire | ||
| + | |||
| + | Cycle de vie | ||
| + | </ | ||
| + | |||
| + | sur l' | ||
| + | |||
| + | À l' | ||
| + | |||
| + | < | ||
| + | ✓ Asset | ||
| + | |||
| + | ✓ AssetCategory | ||
| + | |||
| + | ✓ AssetAssignment | ||
| + | |||
| + | ✓ AssetLifecycle | ||
| + | |||
| + | ✓ AssetInventory | ||
| + | |||
| + | ✓ AssetTracking | ||
| + | |||
| + | ✓ Enterprise Asset Management | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Architecture cible ====== | ||
| + | |||
| + | < | ||
| + | Portfolio | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Properties | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Asset Management | ||
| + | |||
| + | ├── Asset Catalog | ||
| + | ├── Asset Assignment | ||
| + | ├── Lifecycle | ||
| + | ├── Inventory | ||
| + | ├── Tracking | ||
| + | └── Maintenance Integration | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Operations | ||
| + | |||
| + | ↓ | ||
| + | |||
| + | Finance | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-A ====== | ||
| + | |||
| + | ===== Extension Prisma ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 1 — AssetCategory ====== | ||
| + | |||
| + | ===== Ajouter dans schema.prisma ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetCategory { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | name String | ||
| + | |||
| + | code String | ||
| + | |||
| + | description | ||
| + | |||
| + | depreciationYears | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | assets | ||
| + | |||
| + | @@unique([ | ||
| + | tenantId, | ||
| + | code | ||
| + | ]) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 2 — Asset ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model Asset { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | assetCode | ||
| + | @unique | ||
| + | |||
| + | categoryId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | name String | ||
| + | |||
| + | description | ||
| + | |||
| + | serialNumber | ||
| + | |||
| + | manufacturer | ||
| + | |||
| + | model | ||
| + | |||
| + | purchaseDate | ||
| + | |||
| + | purchasePrice | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | currentValue | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | status | ||
| + | |||
| + | condition | ||
| + | |||
| + | warrantyUntil | ||
| + | |||
| + | qrCode | ||
| + | |||
| + | barcode | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | updatedAt | ||
| + | @updatedAt | ||
| + | |||
| + | category | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | ) | ||
| + | |||
| + | assignments | ||
| + | |||
| + | lifecycleEvents | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([categoryId]) | ||
| + | |||
| + | @@index([propertyId]) | ||
| + | |||
| + | @@index([status]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 3 — AssetAssignment ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetAssignment { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | assetId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | assignedAt | ||
| + | @default(now()) | ||
| + | |||
| + | unassignedAt | ||
| + | |||
| + | assignedBy | ||
| + | |||
| + | notes | ||
| + | |||
| + | asset Asset | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | onDelete: | ||
| + | ) | ||
| + | |||
| + | @@index([assetId]) | ||
| + | |||
| + | @@index([propertyId]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 4 — AssetLifecycle ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetLifecycle { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | assetId | ||
| + | |||
| + | eventType | ||
| + | |||
| + | eventDate | ||
| + | @default(now()) | ||
| + | |||
| + | description | ||
| + | |||
| + | cost Decimal? | ||
| + | @db.Decimal(14, | ||
| + | |||
| + | metadata | ||
| + | |||
| + | asset Asset | ||
| + | @relation( | ||
| + | fields: | ||
| + | references: | ||
| + | onDelete: | ||
| + | ) | ||
| + | |||
| + | @@index([assetId]) | ||
| + | |||
| + | @@index([eventType]) | ||
| + | |||
| + | @@index([eventDate]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 5 — AssetInventory ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetInventory { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | tenantId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | inventoryDate | ||
| + | |||
| + | totalAssets | ||
| + | |||
| + | verifiedAssets | ||
| + | |||
| + | missingAssets | ||
| + | |||
| + | notes | ||
| + | |||
| + | createdAt | ||
| + | @default(now()) | ||
| + | |||
| + | @@index([tenantId]) | ||
| + | |||
| + | @@index([propertyId]) | ||
| + | |||
| + | @@index([inventoryDate]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 6 — AssetTracking ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | model AssetTracking { | ||
| + | |||
| + | id String | ||
| + | @id | ||
| + | @default(uuid()) | ||
| + | |||
| + | assetId | ||
| + | |||
| + | propertyId | ||
| + | |||
| + | locationDescription | ||
| + | |||
| + | trackedAt | ||
| + | @default(now()) | ||
| + | |||
| + | source | ||
| + | |||
| + | metadata | ||
| + | |||
| + | @@index([assetId]) | ||
| + | |||
| + | @@index([trackedAt]) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 7 — Enums ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code prisma> | ||
| + | enum AssetStatus { | ||
| + | |||
| + | ACTIVE | ||
| + | |||
| + | IN_STOCK | ||
| + | |||
| + | IN_MAINTENANCE | ||
| + | |||
| + | RETIRED | ||
| + | |||
| + | LOST | ||
| + | |||
| + | DISPOSED | ||
| + | } | ||
| + | |||
| + | enum AssetCondition { | ||
| + | |||
| + | EXCELLENT | ||
| + | |||
| + | GOOD | ||
| + | |||
| + | FAIR | ||
| + | |||
| + | POOR | ||
| + | |||
| + | DAMAGED | ||
| + | } | ||
| + | |||
| + | enum AssetLifecycleEvent { | ||
| + | |||
| + | PURCHASED | ||
| + | |||
| + | ASSIGNED | ||
| + | |||
| + | MOVED | ||
| + | |||
| + | INSPECTED | ||
| + | |||
| + | MAINTAINED | ||
| + | |||
| + | REPAIRED | ||
| + | |||
| + | RETIRED | ||
| + | |||
| + | DISPOSED | ||
| + | } | ||
| + | |||
| + | enum TrackingSource { | ||
| + | |||
| + | MANUAL | ||
| + | |||
| + | QR_CODE | ||
| + | |||
| + | BARCODE | ||
| + | |||
| + | RFID | ||
| + | |||
| + | NFC | ||
| + | |||
| + | IOT | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 8 — Migration ====== | ||
| + | |||
| + | ===== Générer ===== | ||
| + | |||
| + | <code bash> | ||
| + | npx prisma migrate dev \ | ||
| + | --name asset_management_core | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-B ====== | ||
| + | |||
| + | ===== Asset Management Module ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 9 — Création ====== | ||
| + | |||
| + | < | ||
| + | src/ | ||
| + | |||
| + | ├── assets | ||
| + | │ | ||
| + | ├── categories | ||
| + | │ | ||
| + | ├── assignments | ||
| + | │ | ||
| + | ├── lifecycle | ||
| + | │ | ||
| + | ├── inventory | ||
| + | │ | ||
| + | ├── tracking | ||
| + | │ | ||
| + | └── assets.module.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 10 — Services ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | AssetService | ||
| + | |||
| + | AssetCategoryService | ||
| + | |||
| + | AssetAssignmentService | ||
| + | |||
| + | AssetLifecycleService | ||
| + | |||
| + | AssetInventoryService | ||
| + | |||
| + | AssetTrackingService | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-C ====== | ||
| + | |||
| + | ===== Gestion des Actifs ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 11 — AssetService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | asset.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | createAsset() | ||
| + | |||
| + | updateAsset() | ||
| + | |||
| + | retireAsset() | ||
| + | |||
| + | searchAssets() | ||
| + | |||
| + | calculateCurrentValue() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 12 — Types d' | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Mobilier | ||
| + | |||
| + | TV | ||
| + | |||
| + | Climatisation | ||
| + | |||
| + | Électroménager | ||
| + | |||
| + | Literie | ||
| + | |||
| + | Sécurité | ||
| + | |||
| + | Équipements extérieurs | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 13 — Codes ====== | ||
| + | |||
| + | ===== Générer ===== | ||
| + | |||
| + | < | ||
| + | AST-2027-000001 | ||
| + | </ | ||
| + | |||
| + | pour chaque actif. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-D ====== | ||
| + | |||
| + | ===== Affectation ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 14 — AssetAssignmentService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | asset-assignment.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | assignAsset() | ||
| + | |||
| + | moveAsset() | ||
| + | |||
| + | unassignAsset() | ||
| + | |||
| + | getAssetHistory() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 15 — Historiser ====== | ||
| + | |||
| + | ===== Conserver ===== | ||
| + | |||
| + | < | ||
| + | Date | ||
| + | |||
| + | Property | ||
| + | |||
| + | Utilisateur | ||
| + | |||
| + | Action | ||
| + | </ | ||
| + | |||
| + | pour chaque mouvement. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-E ====== | ||
| + | |||
| + | ===== Cycle de Vie ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 16 — AssetLifecycleService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | asset-lifecycle.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Journaliser ===== | ||
| + | |||
| + | < | ||
| + | Achat | ||
| + | |||
| + | Affectation | ||
| + | |||
| + | Déplacement | ||
| + | |||
| + | Réparation | ||
| + | |||
| + | Retrait | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 17 — Méthodes ====== | ||
| + | |||
| + | <code ts> | ||
| + | recordEvent() | ||
| + | |||
| + | getTimeline() | ||
| + | |||
| + | calculateLifecycleCost() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 18 — Finance ====== | ||
| + | |||
| + | ===== Préparer ===== | ||
| + | |||
| + | < | ||
| + | Amortissement | ||
| + | |||
| + | CAPEX | ||
| + | |||
| + | OPEX | ||
| + | </ | ||
| + | |||
| + | pour Sprint 6-B.2. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-F ====== | ||
| + | |||
| + | ===== Inventaire ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 19 — AssetInventoryService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | asset-inventory.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | createInventory() | ||
| + | |||
| + | verifyAsset() | ||
| + | |||
| + | closeInventory() | ||
| + | |||
| + | generateVarianceReport() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 20 — Contrôles ====== | ||
| + | |||
| + | ===== Identifier ===== | ||
| + | |||
| + | < | ||
| + | Actifs présents | ||
| + | |||
| + | Actifs manquants | ||
| + | |||
| + | Actifs déplacés | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-G ====== | ||
| + | |||
| + | ===== Tracking ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 21 — AssetTrackingService ====== | ||
| + | |||
| + | ===== Créer ===== | ||
| + | |||
| + | < | ||
| + | asset-tracking.service.ts | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Méthodes ===== | ||
| + | |||
| + | <code ts> | ||
| + | trackAsset() | ||
| + | |||
| + | scanQrCode() | ||
| + | |||
| + | scanBarcode() | ||
| + | |||
| + | getLastLocation() | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 22 — Technologies ====== | ||
| + | |||
| + | ===== Préparer ===== | ||
| + | |||
| + | < | ||
| + | QR Code | ||
| + | |||
| + | Barcode | ||
| + | |||
| + | RFID | ||
| + | |||
| + | NFC | ||
| + | |||
| + | IoT | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 23 — Temps réel ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Position | ||
| + | |||
| + | Historique | ||
| + | |||
| + | Mouvements | ||
| + | </ | ||
| + | |||
| + | des actifs. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-H ====== | ||
| + | |||
| + | ===== API Asset Management ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 24 — Endpoints ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET /assets | ||
| + | |||
| + | GET / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | PUT / | ||
| + | |||
| + | DELETE / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | POST / | ||
| + | |||
| + | GET / | ||
| + | |||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 25 — Recherche ====== | ||
| + | |||
| + | ===== Supporter ===== | ||
| + | |||
| + | < | ||
| + | Catégorie | ||
| + | |||
| + | Statut | ||
| + | |||
| + | Property | ||
| + | |||
| + | Condition | ||
| + | |||
| + | Valeur | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 26 — Export ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | <code http> | ||
| + | GET / | ||
| + | </ | ||
| + | |||
| + | Formats : | ||
| + | |||
| + | < | ||
| + | CSV | ||
| + | |||
| + | Excel | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-I ====== | ||
| + | |||
| + | ===== Sécurité ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 27 — Permissions ====== | ||
| + | |||
| + | ===== Ajouter ===== | ||
| + | |||
| + | < | ||
| + | asset.read | ||
| + | |||
| + | asset.create | ||
| + | |||
| + | asset.update | ||
| + | |||
| + | asset.assign | ||
| + | |||
| + | asset.inventory | ||
| + | |||
| + | asset.dispose | ||
| + | |||
| + | asset.admin | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 28 — Multi-Propriété ====== | ||
| + | |||
| + | ===== Filtrer ===== | ||
| + | |||
| + | par : | ||
| + | |||
| + | < | ||
| + | Portfolio | ||
| + | |||
| + | PropertyGroup | ||
| + | |||
| + | Property | ||
| + | </ | ||
| + | |||
| + | sur toutes les requêtes. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 29 — Audit ====== | ||
| + | |||
| + | ===== Journaliser ===== | ||
| + | |||
| + | < | ||
| + | ASSET_CREATED | ||
| + | |||
| + | ASSET_ASSIGNED | ||
| + | |||
| + | ASSET_MOVED | ||
| + | |||
| + | ASSET_RETIRED | ||
| + | |||
| + | INVENTORY_COMPLETED | ||
| + | |||
| + | TRACKING_SCAN | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.1-J ====== | ||
| + | |||
| + | ===== Préparation Sprint 6-B.2 ===== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Étape 30 — Compatible ====== | ||
| + | |||
| + | Préparer : | ||
| + | |||
| + | < | ||
| + | Depreciation Engine | ||
| + | |||
| + | Asset Valuation | ||
| + | |||
| + | Capital Planning | ||
| + | |||
| + | Lifecycle Forecasting | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Définition de terminé ====== | ||
| + | |||
| + | Le Sprint 6-B.1 est terminé lorsque : | ||
| + | |||
| + | < | ||
| + | ✓ Asset créé | ||
| + | |||
| + | ✓ AssetCategory créé | ||
| + | |||
| + | ✓ AssetAssignment créé | ||
| + | |||
| + | ✓ AssetLifecycle créé | ||
| + | |||
| + | ✓ AssetInventory créé | ||
| + | |||
| + | ✓ AssetTracking créé | ||
| + | |||
| + | ✓ Audit intégré | ||
| + | |||
| + | ✓ Multi-Property Ready | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Livrables ====== | ||
| + | |||
| + | < | ||
| + | Asset | ||
| + | |||
| + | AssetCategory | ||
| + | |||
| + | AssetAssignment | ||
| + | |||
| + | AssetLifecycle | ||
| + | |||
| + | AssetInventory | ||
| + | |||
| + | AssetTracking | ||
| + | |||
| + | AssetService | ||
| + | |||
| + | AssetAssignmentService | ||
| + | |||
| + | AssetLifecycleService | ||
| + | |||
| + | AssetInventoryService | ||
| + | |||
| + | AssetTrackingService | ||
| + | |||
| + | Enterprise Asset Management Platform | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Sprint 6-B.2 — Asset Intelligence & Lifecycle Management ====== | ||
| + | |||
| + | ===== Objectif ===== | ||
| + | |||
| + | Transformer le registre d' | ||
| + | |||
| + | 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.1781108200.txt.gz · Dernière modification : 2026/06/10 18:16 de 83.202.252.200