Table des matières
Sprint 7-A.1 — Distribution Core & Channel Management
Objectif
Mettre en place le socle de distribution multi-canaux Enterprise.
Cette couche permet de connecter les propriétés aux différents canaux de vente :
OTA Site Web Application Mobile Partenaires Marketplaces Channel Managers
afin de centraliser la gestion :
Inventaire Tarification Disponibilités Synchronisation Distribution
À l'issue de cette étape :
✓ Channel ✓ ChannelConnection ✓ ChannelMapping ✓ DistributionRule ✓ ChannelInventory ✓ ChannelPricing ✓ Distribution Core Platform
Architecture cible
Properties ↓ Distribution Core ├── Channels ├── Connections ├── Mapping ├── Inventory ├── Pricing └── Rules Engine ↓ OTA / Marketplace ↓ Reservations
Sprint 7-A.1-A
Extension Prisma
Étape 1 — Channel
Ajouter dans schema.prisma
model Channel {
id String
@id
@default(uuid())
code String
@unique
name String
category ChannelCategory
provider String
active Boolean
@default(true)
supportsInventory Boolean
@default(true)
supportsPricing Boolean
@default(true)
supportsReservations Boolean
@default(true)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
connections ChannelConnection[]
@@index([category])
@@index([active])
}
Étape 2 — ChannelConnection
Ajouter
model ChannelConnection {
id String
@id
@default(uuid())
tenantId String
channelId String
portfolioId String?
connectionName String
externalAccountId String?
status ChannelConnectionStatus
credentials Json?
lastSyncAt DateTime?
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
channel Channel
@relation(
fields:[channelId],
references:[id]
)
@@index([tenantId])
@@index([channelId])
@@index([status])
}
Étape 3 — ChannelMapping
Ajouter
model ChannelMapping {
id String
@id
@default(uuid())
tenantId String
propertyId String
channelConnectionId String
externalPropertyId String
externalListingId String?
active Boolean
@default(true)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
@@index([tenantId])
@@index([propertyId])
@@index([channelConnectionId])
}
Étape 4 — DistributionRule
Ajouter
model DistributionRule {
id String
@id
@default(uuid())
tenantId String
propertyId String?
portfolioId String?
name String
priority Int
@default(100)
enabled Boolean
@default(true)
conditions Json
actions Json
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
@@index([tenantId])
@@index([enabled])
@@index([priority])
}
Étape 5 — ChannelInventory
Ajouter
model ChannelInventory {
id String
@id
@default(uuid())
propertyId String
channelMappingId String
inventoryDate DateTime
availableUnits Int
blockedUnits Int
@default(0)
syncedAt DateTime?
createdAt DateTime
@default(now())
@@unique([
channelMappingId,
inventoryDate
])
@@index([propertyId])
@@index([inventoryDate])
}
Étape 6 — ChannelPricing
Ajouter
model ChannelPricing {
id String
@id
@default(uuid())
propertyId String
channelMappingId String
pricingDate DateTime
basePrice Decimal
@db.Decimal(12,2)
adjustedPrice Decimal?
@db.Decimal(12,2)
currency String
syncedAt DateTime?
createdAt DateTime
@default(now())
@@unique([
channelMappingId,
pricingDate
])
@@index([propertyId])
@@index([pricingDate])
}
Étape 7 — Enums
Ajouter
enum ChannelCategory {
OTA
DIRECT
MARKETPLACE
WHOLESALER
CORPORATE
CHANNEL_MANAGER
}
enum ChannelConnectionStatus {
PENDING
CONNECTED
ERROR
DISCONNECTED
}
Étape 8 — Migration
npx prisma migrate dev \
--name distribution_core
Sprint 7-A.1-B
Distribution Module
Étape 9 — Structure
src/modules/distribution ├── channels ├── connections ├── mappings ├── inventory ├── pricing ├── rules └── distribution.module.ts
Étape 10 — Services
ChannelService ChannelConnectionService ChannelMappingService DistributionRuleService ChannelInventoryService ChannelPricingService
Sprint 7-A.1-C
Gestion des Canaux
Étape 11 — ChannelService
Créer
channel.service.ts
Canaux supportés
Airbnb Booking.com Expedia Abritel Direct Website Mobile App
Étape 12 — Méthodes
getChannels() createChannel() activateChannel() deactivateChannel()
Sprint 7-A.1-D
Gestion des Connexions
Étape 13 — ChannelConnectionService
Créer
channel-connection.service.ts
Méthodes
connectChannel() disconnectChannel() refreshConnection() validateCredentials()
Étape 14 — Sécurité
Stocker
API Keys OAuth Tokens Secrets
dans le coffre-fort sécurisé existant.
Sprint 7-A.1-E
Mapping
Étape 15 — ChannelMappingService
Créer
channel-mapping.service.ts
Méthodes
mapProperty() unmapProperty() validateMapping() syncExternalListing()
Étape 16 — Objectif
Associer :
Property ↓ External Listing
sur chaque canal.
Sprint 7-A.1-F
Distribution Rules
Étape 17 — DistributionRuleService
Créer
distribution-rule.service.ts
Supporter
Inventory Rules Pricing Rules Channel Restrictions Priority Rules
Étape 18 — Exemples
Si Occupancy > 90% ↓ +15% prix
Si Channel = OTA ↓ Min Stay = 2 nuits
Sprint 7-A.1-G
Inventory Distribution
Étape 19 — ChannelInventoryService
Créer
channel-inventory.service.ts
Méthodes
syncInventory() pushAvailability() pullAvailability() resolveInventoryConflict()
Étape 20 — Synchronisation
Supporter
Temps réel Batch Webhook
Sprint 7-A.1-H
Pricing Distribution
Étape 21 — ChannelPricingService
Créer
channel-pricing.service.ts
Méthodes
syncPricing() pushRates() pullRates() applyChannelMarkup()
Étape 22 — Gestion
Prix base Prix OTA Prix Corporate Prix Promotion
Sprint 7-A.1-I
API Distribution
Étape 23 — Endpoints
GET /distribution/channels POST /distribution/channels/connect GET /distribution/mappings POST /distribution/mappings GET /distribution/inventory GET /distribution/pricing POST /distribution/rules
Étape 24 — Réponse
{
"channel":"Booking.com",
"status":"CONNECTED",
"mappedProperties":124
}
Étape 25 — Multi-Propriété
Supporter
Portfolio Property Group Property
comme niveau de distribution.
Sprint 7-A.1-J
Gouvernance
Étape 26 — Permissions
distribution.read distribution.connect distribution.mapping distribution.inventory distribution.pricing distribution.admin
Étape 27 — Audit
CHANNEL_CONNECTED CHANNEL_DISCONNECTED PROPERTY_MAPPED INVENTORY_SYNCED PRICING_SYNCED DISTRIBUTION_RULE_CREATED
Étape 28 — Jobs
Toutes les 5 minutes Inventory Sync Pricing Sync Connection Health Check
Préparation Sprint 7-A.2
Compatible avec :
OTA APIs Webhook Sync Channel Intelligence Rate Optimization
Définition de terminé
Le Sprint 7-A.1 est terminé lorsque :
✓ Channel créé ✓ ChannelConnection créé ✓ ChannelMapping créé ✓ DistributionRule créé ✓ ChannelInventory créé ✓ ChannelPricing créé ✓ Distribution Core opérationnel
Livrables
Channel ChannelConnection ChannelMapping DistributionRule ChannelInventory ChannelPricing ChannelService ChannelConnectionService ChannelMappingService DistributionRuleService ChannelInventoryService ChannelPricingService Distribution Core Platform
Sprint 7-A.2 — OTA Integrations & Synchronisation Temps Réel
Objectif
Connecter la plateforme aux principaux canaux de distribution mondiaux.
Cette couche permet :
Synchronisation temps réel Inventaire Tarification Réservations Disponibilités Webhooks
entre la plateforme et les OTA.
À l'issue de cette étape :
✓ Airbnb Integration ✓ Booking.com Integration ✓ Expedia Integration ✓ Webhook Engine ✓ Rate Sync ✓ Availability Sync ✓ OTA Distribution Platform
Architecture cible
Properties ↓ Distribution Core ↓ OTA Integration Layer ├── Airbnb Connector ├── Booking Connector ├── Expedia Connector ├── Webhook Engine ├── Inventory Sync ├── Rate Sync └── Reservation Sync ↓ External Channels
Sprint 7-A.2-A
Extension Prisma
Étape 1 — ChannelSyncJob
Ajouter dans schema.prisma
model ChannelSyncJob {
id String
@id
@default(uuid())
tenantId String
channelConnectionId String
syncType SyncType
status SyncStatus
startedAt DateTime?
completedAt DateTime?
recordsProcessed Int
@default(0)
errorMessage String?
metadata Json?
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([syncType])
@@index([status])
}
Étape 2 — ChannelWebhook
Ajouter
model ChannelWebhook {
id String
@id
@default(uuid())
tenantId String
channelId String
eventType String
externalEventId String?
payload Json
processed Boolean
@default(false)
processedAt DateTime?
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([processed])
@@index([eventType])
}
Étape 3 — ChannelSyncState
Ajouter
model ChannelSyncState {
channelConnectionId String
@id
lastInventorySync DateTime?
lastPricingSync DateTime?
lastReservationSync DateTime?
lastSuccessfulSync DateTime?
updatedAt DateTime
@updatedAt
}
Étape 4 — Enums
Ajouter
enum SyncType {
INVENTORY
PRICING
RESERVATION
FULL
}
enum SyncStatus {
PENDING
RUNNING
SUCCESS
FAILED
PARTIAL
}
Étape 5 — Migration
npx prisma migrate dev \
--name ota_integrations
Sprint 7-A.2-B
OTA Integration Module
Étape 6 — Création
src/modules/distribution-integrations ├── airbnb ├── booking ├── expedia ├── webhooks ├── sync ├── jobs └── distribution-integrations.module.ts
Étape 7 — Services
Créer
AirbnbIntegrationService BookingIntegrationService ExpediaIntegrationService WebhookEngineService InventorySyncService PricingSyncService ReservationSyncService ChannelSyncOrchestrator
Sprint 7-A.2-C
Airbnb Integration
Étape 8 — AirbnbIntegrationService
Créer
airbnb-integration.service.ts
Fonctionnalités
OAuth Listings Sync Availability Sync Rate Sync Reservation Import
Étape 9 — Méthodes
connect() syncListings() syncAvailability() syncPricing() importReservations()
Étape 10 — Mapping
Synchroniser
Property ↓ Airbnb Listing
Sprint 7-A.2-D
Booking.com Integration
Étape 11 — BookingIntegrationService
Créer
booking-integration.service.ts
Fonctionnalités
Connectivity API Availability API Rates API Reservations API
Étape 12 — Méthodes
connect() pushAvailability() pushRates() pullReservations()
Étape 13 — Gestion erreurs
Supporter
Rate Limits Retries Backoff Dead Letter Queue
Sprint 7-A.2-E
Expedia Integration
Étape 14 — ExpediaIntegrationService
Créer
expedia-integration.service.ts
Fonctionnalités
Rapid API Inventory API Pricing API Booking API
Étape 15 — Méthodes
connect() syncInventory() syncPricing() importBookings()
Sprint 7-A.2-F
Webhook Engine
Étape 16 — WebhookEngineService
Créer
webhook-engine.service.ts
Supporter
OTA Events Reservations Cancellations Availability Changes Pricing Changes
Étape 17 — Endpoints
POST /webhooks/airbnb POST /webhooks/booking POST /webhooks/expedia
Étape 18 — Pipeline
Receive ↓ Validate ↓ Store ↓ Process ↓ Publish Event
Sprint 7-A.2-G
Availability Sync
Étape 19 — InventorySyncService
Créer
inventory-sync.service.ts
Synchroniser
Availability Blocked Dates Inventory Changes
Étape 20 — Méthodes
pushInventory() pullInventory() resolveConflicts() rebuildInventory()
Étape 21 — Résolution conflits
Priorité
Reservation Engine ↓ Property Availability ↓ OTA Data
Sprint 7-A.2-H
Rate Sync
Étape 22 — PricingSyncService
Créer
pricing-sync.service.ts
Synchroniser
Base Rate Seasonal Rate Promotion Rate Channel Rate
Étape 23 — Méthodes
pushRates() pullRates() applyRateAdjustments() rebuildRates()
Étape 24 — Priorité
Source de vérité
PropertyPricing ↓ Distribution Rules ↓ OTA
Sprint 7-A.2-I
Reservation Sync
Étape 25 — ReservationSyncService
Créer
reservation-sync.service.ts
Supporter
New Reservation Modification Cancellation Guest Update
Étape 26 — Méthodes
importReservation() updateReservation() cancelReservation() deduplicateReservation()
Étape 27 — Anti-duplication
Utiliser
External Reservation ID Channel Guest Dates
Sprint 7-A.2-J
API & Monitoring
Étape 28 — Endpoints
POST /distribution/connect/airbnb POST /distribution/connect/booking POST /distribution/connect/expedia GET /distribution/sync-jobs POST /distribution/sync/full GET /distribution/webhooks
Étape 29 — Dashboard
Afficher
Connected Channels Sync Status Last Sync Failed Jobs Webhook Health
Étape 30 — Permissions
distribution.sync distribution.webhooks distribution.channels distribution.monitoring distribution.admin
Étape 31 — Audit
CHANNEL_SYNC_STARTED CHANNEL_SYNC_COMPLETED WEBHOOK_RECEIVED RESERVATION_IMPORTED RATE_SYNCED INVENTORY_SYNCED
Étape 32 — Jobs
Toutes les minutes Webhook Processing Toutes les 5 minutes Availability Sync Pricing Sync Toutes les 15 minutes Reservation Sync Toutes les nuits Full Reconciliation
Architecture Enterprise
Patterns recommandés
Outbox Pattern Inbox Pattern Retry Queue Dead Letter Queue Idempotency Keys Distributed Locks
afin d'éviter :
Double réservation Perte inventaire Conflits OTA Incohérences tarifaires
Définition de terminé
Le Sprint 7-A.2 est terminé lorsque :
✓ Airbnb connecté ✓ Booking.com connecté ✓ Expedia connecté ✓ Webhook Engine créé ✓ Availability Sync créé ✓ Pricing Sync créé ✓ Reservation Sync créé ✓ Monitoring opérationnel
Livrables
ChannelSyncJob ChannelWebhook ChannelSyncState AirbnbIntegrationService BookingIntegrationService ExpediaIntegrationService WebhookEngineService InventorySyncService PricingSyncService ReservationSyncService ChannelSyncOrchestrator OTA Integration Platform
Sprint 7-B.1 — Partner Management & Marketplace Core
Objectif
Construire le socle Marketplace et Partenaires Enterprise.
Cette couche permet de gérer :
Agences Revendeurs Partenaires commerciaux Affiliés Apporteurs d'affaires Canaux partenaires
afin d'étendre la distribution et les revenus de la plateforme.
À l'issue de cette étape :
✓ Partner ✓ PartnerContract ✓ PartnerCommission ✓ MarketplaceListing ✓ PartnerPerformance ✓ PartnerPortal ✓ Marketplace Core Platform
Architecture cible
Marketplace ↓ Partner Management ├── Partners ├── Contracts ├── Commissions ├── Listings ├── Performance └── Partner Portal ↓ Distribution ↓ Reservations ↓ Finance
Sprint 7-B.1-A
Extension Prisma
Étape 1 — Partner
Ajouter dans schema.prisma
model Partner {
id String
@id
@default(uuid())
tenantId String
partnerCode String
type PartnerType
companyName String
contactName String?
email String?
phone String?
website String?
status PartnerStatus
active Boolean
@default(true)
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
contracts PartnerContract[]
commissions PartnerCommission[]
listings MarketplaceListing[]
@@unique([tenantId, partnerCode])
@@index([tenantId])
@@index([type])
@@index([status])
}
Étape 2 — PartnerContract
Ajouter
model PartnerContract {
id String
@id
@default(uuid())
partnerId String
contractNumber String
startDate DateTime
endDate DateTime?
status ContractStatus
commissionModel CommissionModel
documentPath String?
metadata Json?
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
partner Partner
@relation(
fields:[partnerId],
references:[id],
onDelete:Cascade
)
@@index([partnerId])
@@index([status])
}
Étape 3 — PartnerCommission
Ajouter
model PartnerCommission {
id String
@id
@default(uuid())
partnerId String
reservationId String?
commissionType CommissionType
baseAmount Decimal
@db.Decimal(14,2)
commissionRate Float
commissionAmount Decimal
@db.Decimal(14,2)
currency String
status CommissionStatus
calculatedAt DateTime
@default(now())
paidAt DateTime?
partner Partner
@relation(
fields:[partnerId],
references:[id]
)
@@index([partnerId])
@@index([status])
}
Étape 4 — MarketplaceListing
Ajouter
model MarketplaceListing {
id String
@id
@default(uuid())
tenantId String
propertyId String
partnerId String
listingStatus ListingStatus
externalListingId String?
publishedAt DateTime?
metadata Json?
createdAt DateTime
@default(now())
updatedAt DateTime
@updatedAt
partner Partner
@relation(
fields:[partnerId],
references:[id]
)
@@index([tenantId])
@@index([propertyId])
@@index([partnerId])
}
Étape 5 — PartnerPerformance
Ajouter
model PartnerPerformance {
partnerId String
@id
reservationsCount Int
@default(0)
revenue Decimal
@db.Decimal(14,2)
commissionsPaid Decimal
@db.Decimal(14,2)
conversionRate Float?
satisfactionScore Float?
updatedAt DateTime
@updatedAt
}
Étape 6 — PartnerPortalAccess
Ajouter
model PartnerPortalAccess {
id String
@id
@default(uuid())
partnerId String
userId String
role PartnerPortalRole
active Boolean
@default(true)
lastLoginAt DateTime?
createdAt DateTime
@default(now())
@@index([partnerId])
@@index([userId])
}
Étape 7 — Enums
Ajouter
enum PartnerType {
AGENCY
RESELLER
AFFILIATE
OTA
CORPORATE
DISTRIBUTOR
}
enum PartnerStatus {
PROSPECT
ACTIVE
SUSPENDED
TERMINATED
}
enum ContractStatus {
DRAFT
ACTIVE
EXPIRED
TERMINATED
}
enum CommissionModel {
FIXED
PERCENTAGE
TIERED
HYBRID
}
enum CommissionType {
RESERVATION
REVENUE_SHARE
LEAD
BONUS
}
enum CommissionStatus {
PENDING
APPROVED
PAID
CANCELLED
}
enum ListingStatus {
DRAFT
PUBLISHED
PAUSED
ARCHIVED
}
enum PartnerPortalRole {
ADMIN
MANAGER
ANALYST
VIEWER
}
Étape 8 — Migration
npx prisma migrate dev \
--name marketplace_partner_core
Sprint 7-B.1-B
Partner Management Module
Étape 9 — Structure
src/modules/partners ├── partners ├── contracts ├── commissions ├── listings ├── performance ├── portal └── partners.module.ts
Étape 10 — Services
PartnerService PartnerContractService PartnerCommissionService MarketplaceListingService PartnerPerformanceService PartnerPortalService
Sprint 7-B.1-C
Gestion des Partenaires
Étape 11 — PartnerService
Créer
partner.service.ts
Méthodes
createPartner() updatePartner() activatePartner() suspendPartner() searchPartners()
Étape 12 — Segmentation
Supporter
Agences Affiliés OTA Corporate Revendeurs
Sprint 7-B.1-D
Gestion Contractuelle
Étape 13 — PartnerContractService
Créer
partner-contract.service.ts
Méthodes
createContract() renewContract() terminateContract() uploadContract()
Étape 14 — Gestion
Contrats Avenants Renouvellements Échéances
Étape 15 — Alertes
Déclencher
à :
30 jours 15 jours 7 jours
avant expiration.
Sprint 7-B.1-E
Gestion des Commissions
Étape 16 — PartnerCommissionService
Créer
partner-commission.service.ts
Calculer
Commission fixe Pourcentage Paliers Bonus
Étape 17 — Méthodes
calculateCommission() approveCommission() payCommission() generateStatement()
Étape 18 — Intégration
Connecter
Reservations Invoices Payments
Sprint 7-B.1-F
Marketplace Listings
Étape 19 — MarketplaceListingService
Créer
marketplace-listing.service.ts
Méthodes
publishListing() pauseListing() archiveListing() syncListing()
Étape 20 — Supporter
Publication Synchronisation Statut Distribution
Sprint 7-B.1-G
Performance Partenaires
Étape 21 — PartnerPerformanceService
Créer
partner-performance.service.ts
Mesurer
Revenue Réservations Conversion Commissions Satisfaction
Étape 22 — KPIs
Revenue Generated Bookings Average Booking Value Commission Ratio Partner Score
Sprint 7-B.1-H
Portail Partenaire
Étape 23 — PartnerPortalService
Créer
partner-portal.service.ts
Fournir
Dashboard Commissions Réservations Listings Contrats
Étape 24 — Accès
Supporter
Admin Manager Viewer
pour chaque partenaire.
Sprint 7-B.1-I
API Marketplace
Étape 25 — Endpoints
GET /partners
GET /partners/{id}
POST /partners
PUT /partners/{id}
GET /partners/{id}/contracts
GET /partners/{id}/commissions
GET /partners/{id}/performance
GET /partners/{id}/portal
Étape 26 — Dashboard
Exemple
{
"partner":"Travel Agency Europe",
"revenue":125000,
"reservations":842,
"commissionPaid":18500,
"score":91
}
Sprint 7-B.1-J
Gouvernance
Étape 27 — Permissions
partner.read partner.create partner.update partner.contracts partner.commissions partner.portal partner.admin
Étape 28 — Audit
PARTNER_CREATED PARTNER_ACTIVATED CONTRACT_CREATED LISTING_PUBLISHED COMMISSION_CALCULATED PARTNER_PORTAL_LOGIN
Étape 29 — Jobs
Toutes les nuits Commission Calculation Performance Refresh Contract Expiration Check
Préparation Sprint 7-B.2
Compatible avec :
Partner Intelligence Partner Scoring Commission Optimization Marketplace Analytics Partner Recommendations
Définition de terminé
Le Sprint 7-B.1 est terminé lorsque :
✓ Partner créé ✓ PartnerContract créé ✓ PartnerCommission créé ✓ MarketplaceListing créé ✓ PartnerPerformance créé ✓ PartnerPortal créé ✓ Marketplace Core opérationnel
Livrables
Partner PartnerContract PartnerCommission MarketplaceListing PartnerPerformance PartnerPortalAccess PartnerService PartnerContractService PartnerCommissionService MarketplaceListingService PartnerPerformanceService PartnerPortalService Marketplace Core Platform
Sprint 7-B.2 — Partner Intelligence & Marketplace Analytics
Objectif
Transformer le portail partenaires en plateforme d'intelligence commerciale Enterprise.
Cette couche permet :
Scoring partenaires Prévisions revenus Optimisation commissions Analyse marketplace Recommandations IA Pilotage du réseau partenaires
À l'issue de cette étape :
✓ Partner Score ✓ Partner Forecasting ✓ Commission Intelligence ✓ Marketplace Analytics ✓ Partner Recommendations ✓ Partner Health Score ✓ Partner Intelligence Platform
Architecture cible
Partner Ecosystem ↓ Partner Intelligence Engine ├── Partner Scoring ├── Revenue Forecasting ├── Commission Analytics ├── Marketplace Analytics ├── Recommendation Engine ├── Health Scoring └── Executive Insights ↓ Partner Management ↓ Revenue Growth
Sprint 7-B.2-A
Extension Prisma
Étape 1 — PartnerScore
Ajouter dans schema.prisma
model PartnerScore {
partnerId String
@id
overallScore Float
revenueScore Float
growthScore Float
qualityScore Float
conversionScore Float
satisfactionScore Float
calculatedAt DateTime
@updatedAt
}
Étape 2 — PartnerForecast
Ajouter
model PartnerForecast {
id String
@id
@default(uuid())
partnerId String
forecastType PartnerForecastType
forecastDate DateTime
predictedValue Float
confidenceScore Float?
generatedAt DateTime
@default(now())
@@index([partnerId])
@@index([forecastType])
@@index([forecastDate])
}
Étape 3 — PartnerInsight
Ajouter
model PartnerInsight {
id String
@id
@default(uuid())
partnerId String
category PartnerInsightCategory
severity InsightSeverity
title String
description String
recommendation String?
impactScore Float?
createdAt DateTime
@default(now())
@@index([partnerId])
@@index([category])
}
Étape 4 — MarketplaceAnalyticsSnapshot
Ajouter
model MarketplaceAnalyticsSnapshot {
id String
@id
@default(uuid())
tenantId String
snapshotDate DateTime
activePartners Int
activeListings Int
totalRevenue Decimal
@db.Decimal(14,2)
totalCommissions Decimal
@db.Decimal(14,2)
conversionRate Float?
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([snapshotDate])
}
Étape 5 — PartnerRecommendation
Ajouter
model PartnerRecommendation {
id String
@id
@default(uuid())
partnerId String
recommendationType PartnerRecommendationType
priority RecommendationPriority
title String
description String
estimatedImpact Float?
implemented Boolean
@default(false)
createdAt DateTime
@default(now())
@@index([partnerId])
@@index([priority])
}
Étape 6 — Enums
Ajouter
enum PartnerForecastType {
REVENUE
BOOKINGS
COMMISSIONS
CONVERSION
}
enum PartnerInsightCategory {
REVENUE
PERFORMANCE
COMMISSION
MARKETPLACE
GROWTH
}
enum PartnerRecommendationType {
PROMOTION
COMMISSION_ADJUSTMENT
EXPANSION
TRAINING
REACTIVATION
}
Étape 7 — Migration
npx prisma migrate dev \
--name partner_intelligence
Sprint 7-B.2-B
Partner Intelligence Module
Étape 8 — Structure
src/modules/partner-intelligence ├── scoring ├── forecasting ├── commissions ├── analytics ├── recommendations ├── health └── partner-intelligence.module.ts
Étape 9 — Services
PartnerScoreService PartnerForecastService CommissionIntelligenceService MarketplaceAnalyticsService PartnerRecommendationService PartnerHealthScoreService PartnerInsightService
Sprint 7-B.2-C
Partner Score
Étape 10 — PartnerScoreService
Créer
partner-score.service.ts
Calculer
Revenue Bookings Conversion Satisfaction Growth
Étape 11 — Pondération
Revenue 30% Bookings 25% Growth 20% Conversion 15% Satisfaction 10%
Étape 12 — Classification
90-100 Elite 75-89 Premium 50-74 Standard 0-49 At Risk
Sprint 7-B.2-D
Partner Forecasting
Étape 13 — PartnerForecastService
Créer
partner-forecast.service.ts
Prévoir
Revenue Bookings Commissions Growth
Étape 14 — Méthodes
forecastRevenue() forecastBookings() forecastCommissions() forecastGrowth()
Étape 15 — Horizons
30 jours 90 jours 12 mois
Sprint 7-B.2-E
Commission Intelligence
Étape 16 — CommissionIntelligenceService
Créer
commission-intelligence.service.ts
Analyser
Commission Cost Commission ROI Revenue Share Partner Profitability
Étape 17 — Identifier
Sous-performance Sur-commission Opportunités optimisation
Étape 18 — Exemple
Commission 18% ↓ ROI faible ↓ Révision recommandée
Sprint 7-B.2-F
Marketplace Analytics
Étape 19 — MarketplaceAnalyticsService
Créer
marketplace-analytics.service.ts
Mesurer
Marketplace Revenue Partner Revenue Bookings Conversion Commissions
Étape 20 — KPIs
Revenue Per Partner Bookings Per Partner Commission Ratio Partner Growth Marketplace Health
Étape 21 — Classements
Produire
Top Revenue Top Conversion Top Growth Top ROI
Sprint 7-B.2-G
Partner Health Score
Étape 22 — PartnerHealthScoreService
Créer
partner-health-score.service.ts
Calcul
Revenue 25% Growth 20% Bookings 20% Conversion 15% Satisfaction 10% Activity 10%
Étape 23 — Classification
90-100 Excellent 75-89 Healthy 50-74 Warning 0-49 Critical
Étape 24 — Exemple
Partner Health 92 Excellent
Sprint 7-B.2-H
Recommandations IA
Étape 25 — PartnerRecommendationService
Créer
partner-recommendation.service.ts
Générer
Commission Adjustment Cross-Sell Upsell Expansion Reactivation
Étape 26 — Exemple
Agence Europe ↑ 28% croissance ↓ Expansion recommandée
Affilié A45 ↓ activité ↓ Programme réactivation
Sprint 7-B.2-I
Dashboard Intelligence
Étape 27 — Endpoints
GET /partners/intelligence GET /partners/analytics GET /partners/forecasts GET /partners/recommendations GET /partners/health GET /partners/leaderboard
Étape 28 — Exemple
{
"partnerScore":94,
"healthScore":91,
"forecastRevenue":450000,
"recommendations":3
}
Étape 29 — Analytics
Mesurer
Forecast Accuracy Partner ROI Commission Efficiency Partner Retention Marketplace Growth
Sprint 7-B.2-J
Gouvernance
Étape 30 — Permissions
partner.analytics.read partner.forecast.read partner.recommendations.read partner.health.read partner.intelligence.admin
Étape 31 — Audit
PARTNER_SCORE_UPDATED PARTNER_FORECAST_GENERATED COMMISSION_ANALYSIS_COMPLETED MARKETPLACE_ANALYTICS_REFRESHED PARTNER_RECOMMENDATION_CREATED
Étape 32 — Jobs
Toutes les nuits Partner Score Refresh Partner Health Refresh Forecast Generation Recommendation Generation Marketplace Analytics Snapshot
Préparation Sprint 7-C.1
Compatible avec :
Revenue Sharing Settlement Engine Partner Billing Commission Payments Financial Distribution
Définition de terminé
Le Sprint 7-B.2 est terminé lorsque :
✓ Partner Score créé ✓ Partner Forecasting créé ✓ Commission Intelligence créée ✓ Marketplace Analytics créé ✓ Partner Recommendations créées ✓ Partner Health Score créé ✓ Partner Intelligence opérationnel
Livrables
PartnerScore PartnerForecast PartnerInsight MarketplaceAnalyticsSnapshot PartnerRecommendation PartnerScoreService PartnerForecastService CommissionIntelligenceService MarketplaceAnalyticsService PartnerRecommendationService PartnerHealthScoreService Partner Intelligence Platform
Sprint 7-C.1 — Revenue Sharing & Settlement Core
Objectif
Construire le moteur financier partenaires Enterprise.
Cette couche permet :
Partage de revenus Calcul commissions Paiements partenaires Facturation commissions Grand livre partenaire Réconciliation financière
afin de sécuriser l'ensemble des flux financiers Marketplace.
À l'issue de cette étape :
✓ Revenue Share ✓ Settlement ✓ Partner Payout ✓ Commission Billing ✓ Partner Ledger ✓ Financial Reconciliation ✓ Partner Financial Platform
Architecture cible
Reservations ↓ Revenue Engine ↓ Settlement Engine ├── Revenue Sharing ├── Commission Billing ├── Partner Ledger ├── Payout Engine ├── Reconciliation └── Financial Reporting ↓ Partners ↓ Accounting
Sprint 7-C.1-A
Extension Prisma
Étape 1 — RevenueShare
Ajouter dans schema.prisma
model RevenueShare {
id String
@id
@default(uuid())
tenantId String
reservationId String
partnerId String
grossRevenue Decimal
@db.Decimal(14,2)
partnerShare Decimal
@db.Decimal(14,2)
platformShare Decimal
@db.Decimal(14,2)
shareRate Float
calculatedAt DateTime
@default(now())
@@index([tenantId])
@@index([partnerId])
@@index([reservationId])
}
Étape 2 — Settlement
Ajouter
model Settlement {
id String
@id
@default(uuid())
tenantId String
partnerId String
settlementNumber String
periodStart DateTime
periodEnd DateTime
grossAmount Decimal
@db.Decimal(14,2)
commissionAmount Decimal
@db.Decimal(14,2)
netAmount Decimal
@db.Decimal(14,2)
status SettlementStatus
generatedAt DateTime
@default(now())
completedAt DateTime?
@@index([tenantId])
@@index([partnerId])
@@index([status])
}
Étape 3 — PartnerPayout
Ajouter
model PartnerPayout {
id String
@id
@default(uuid())
settlementId String
partnerId String
payoutMethod PayoutMethod
payoutReference String?
amount Decimal
@db.Decimal(14,2)
currency String
status PayoutStatus
paidAt DateTime?
createdAt DateTime
@default(now())
@@index([partnerId])
@@index([status])
}
Étape 4 — PartnerLedger
Ajouter
model PartnerLedger {
id String
@id
@default(uuid())
partnerId String
entryType LedgerEntryType
referenceType String
referenceId String
debit Decimal?
@db.Decimal(14,2)
credit Decimal?
@db.Decimal(14,2)
balance Decimal
@db.Decimal(14,2)
createdAt DateTime
@default(now())
@@index([partnerId])
@@index([entryType])
}
Étape 5 — ReconciliationRecord
Ajouter
model ReconciliationRecord {
id String
@id
@default(uuid())
tenantId String
reconciliationDate DateTime
sourceType ReconciliationSource
expectedAmount Decimal
@db.Decimal(14,2)
actualAmount Decimal
@db.Decimal(14,2)
variance Decimal
@db.Decimal(14,2)
status ReconciliationStatus
createdAt DateTime
@default(now())
@@index([tenantId])
@@index([status])
}
Étape 6 — Enums
Ajouter
enum SettlementStatus {
DRAFT
GENERATED
APPROVED
PAID
CANCELLED
}
enum PayoutMethod {
BANK_TRANSFER
SEPA
STRIPE_CONNECT
PAYPAL
}
enum PayoutStatus {
PENDING
PROCESSING
PAID
FAILED
CANCELLED
}
enum LedgerEntryType {
REVENUE
COMMISSION
PAYOUT
ADJUSTMENT
REFUND
}
enum ReconciliationSource {
PAYMENTS
SETTLEMENTS
COMMISSIONS
PAYOUTS
}
enum ReconciliationStatus {
MATCHED
VARIANCE
INVESTIGATION
}
Étape 7 — Migration
npx prisma migrate dev \
--name revenue_sharing_core
Sprint 7-C.1-B
Settlement Module
Étape 8 — Structure
src/modules/partner-finance ├── revenue-share ├── settlements ├── payouts ├── ledger ├── reconciliation └── partner-finance.module.ts
Étape 9 — Services
RevenueShareService SettlementService PartnerPayoutService PartnerLedgerService FinancialReconciliationService PartnerFinanceDashboardService
Sprint 7-C.1-C
Revenue Sharing
Étape 10 — RevenueShareService
Créer
revenue-share.service.ts
Calculer
Revenue Split Partner Share Platform Share Commission Deduction
Étape 11 — Modèles
Supporter
Pourcentage Fixe Paliers Hybride
Étape 12 — Méthodes
calculateRevenueShare() applyCommissionModel() generateRevenueEntries()
Sprint 7-C.1-D
Settlement Engine
Étape 13 — SettlementService
Créer
settlement.service.ts
Générer
Partner Statements Settlement Reports Financial Summaries
Étape 14 — Méthodes
generateSettlement() approveSettlement() closeSettlement() exportSettlement()
Étape 15 — Périodes
Hebdomadaire Mensuelle Trimestrielle
Sprint 7-C.1-E
Partner Payout
Étape 16 — PartnerPayoutService
Créer
partner-payout.service.ts
Supporter
SEPA Virement bancaire Stripe Connect PayPal
Étape 17 — Méthodes
createPayout() executePayout() retryPayout() cancelPayout()
Étape 18 — Sécurité
Exiger
Double validation Montant maximum Journalisation complète
pour les paiements.
Sprint 7-C.1-F
Partner Ledger
Étape 19 — PartnerLedgerService
Créer
partner-ledger.service.ts
Fonction
Grand livre comptable partenaire.
Étape 20 — Écritures
Revenue Commission Payout Refund Adjustment
Étape 21 — Méthodes
postEntry() calculateBalance() generateStatement() exportLedger()
Sprint 7-C.1-G
Financial Reconciliation
Étape 22 — FinancialReconciliationService
Créer
financial-reconciliation.service.ts
Réconcilier
Payments Settlements Payouts Commissions
Étape 23 — Détection
Identifier
Écarts Paiements manquants Doubles paiements Commissions incorrectes
Étape 24 — Méthodes
runReconciliation() detectVariance() createInvestigation() closeInvestigation()
Sprint 7-C.1-H
Dashboard Financier
Étape 25 — PartnerFinanceDashboardService
Créer
partner-finance-dashboard.service.ts
Afficher
Revenue Shared Pending Settlements Payouts Commissions Outstanding Balance
Étape 26 — KPIs
Partner Revenue Commission Cost Settlement Cycle Time Payout Success Rate Reconciliation Accuracy
Sprint 7-C.1-I
API Finance Partenaires
Étape 27 — Endpoints
GET /partner-finance/dashboard GET /partner-finance/settlements POST /partner-finance/settlements POST /partner-finance/payouts GET /partner-finance/ledger GET /partner-finance/reconciliation
Étape 28 — Exemple
{
"partner":"Agency Europe",
"grossRevenue":120000,
"commission":18000,
"netSettlement":102000,
"status":"APPROVED"
}
Sprint 7-C.1-J
Gouvernance
Étape 29 — Permissions
partner.finance.read partner.finance.settlement partner.finance.payout partner.finance.reconciliation partner.finance.approve partner.finance.admin
Étape 30 — Audit
REVENUE_SHARE_CALCULATED SETTLEMENT_GENERATED SETTLEMENT_APPROVED PAYOUT_CREATED PAYOUT_EXECUTED RECONCILIATION_COMPLETED
Étape 31 — Jobs
Toutes les nuits Revenue Share Calculation Settlement Generation Reconciliation Run Toutes les heures Payout Processing
Préparation Sprint 7-C.2
Compatible avec :
Revenue Intelligence Commission Optimization Cash Forecasting Partner Profitability Financial Analytics
Définition de terminé
Le Sprint 7-C.1 est terminé lorsque :
✓ Revenue Share créé ✓ Settlement créé ✓ Partner Payout créé ✓ Partner Ledger créé ✓ Financial Reconciliation créé ✓ Dashboard financier créé ✓ Moteur financier partenaires opérationnel
Livrables
RevenueShare Settlement PartnerPayout PartnerLedger ReconciliationRecord RevenueShareService SettlementService PartnerPayoutService PartnerLedgerService FinancialReconciliationService PartnerFinanceDashboardService Partner Financial Platform
Sprint 7-C.2 — Revenue Intelligence & Partner Profitability
Objectif
Transformer le moteur financier partenaires en plateforme d'intelligence financière Enterprise.
Cette couche permet :
Rentabilité partenaires Prévisions revenus Prévisions trésorerie Optimisation commissions Intelligence des règlements Pilotage financier avancé
À l'issue de cette étape :
✓ Partner Profitability ✓ Commission Optimization ✓ Revenue Forecasting ✓ Cash Flow Forecast ✓ Settlement Intelligence ✓ Financial Health Score ✓ Revenue Intelligence Platform
Architecture cible
Partner Finance ↓ Revenue Intelligence Engine ├── Profitability Engine ├── Commission Intelligence ├── Revenue Forecasting ├── Cash Flow Forecasting ├── Settlement Intelligence ├── Financial Health Scoring └── Executive Financial Insights ↓ Partner Finance Dashboard ↓ Financial Planning
Sprint 7-C.2-A
Extension Prisma
Étape 1 — PartnerProfitability
Ajouter dans schema.prisma
model PartnerProfitability {
partnerId String
@id
totalRevenue Decimal
@db.Decimal(14,2)
totalCommission Decimal
@db.Decimal(14,2)
netProfit Decimal
@db.Decimal(14,2)
marginPercent Float
roi Float?
calculatedAt DateTime
@updatedAt
}
Étape 2 — FinancialForecast
Ajouter
model FinancialForecast {
id String
@id
@default(uuid())
partnerId String?
forecastType FinancialForecastType
forecastDate DateTime
predictedValue Decimal
@db.Decimal(14,2)
confidenceScore Float?
generatedAt DateTime
@default(now())
@@index([partnerId])
@@index([forecastType])
@@index([forecastDate])
}
Étape 3 — SettlementInsight
Ajouter
model SettlementInsight {
id String
@id
@default(uuid())
settlementId String?
partnerId String
insightType SettlementInsightType
severity InsightSeverity
title String
description String
recommendation String?
impactAmount Decimal?
@db.Decimal(14,2)
createdAt DateTime
@default(now())
@@index([partnerId])
@@index([insightType])
}
Étape 4 — FinancialHealthScore
Ajouter
model FinancialHealthScore {
partnerId String
@id
overallScore Float
profitabilityScore Float
paymentScore Float
growthScore Float
settlementScore Float
riskScore Float
calculatedAt DateTime
@updatedAt
}
Étape 5 — CommissionOptimization
Ajouter
model CommissionOptimization {
id String
@id
@default(uuid())
partnerId String
currentRate Float
suggestedRate Float
expectedRevenueGain Decimal?
@db.Decimal(14,2)
expectedMarginGain Float?
implemented Boolean
@default(false)
createdAt DateTime
@default(now())
@@index([partnerId])
}
Étape 6 — Enums
Ajouter
enum FinancialForecastType {
REVENUE
CASHFLOW
COMMISSION
PAYOUT
PROFITABILITY
}
enum SettlementInsightType {
DELAY_RISK
PAYMENT_ANOMALY
COMMISSION_VARIANCE
CASHFLOW_RISK
RECONCILIATION_ISSUE
}
Étape 7 — Migration
npx prisma migrate dev \
--name revenue_intelligence
Sprint 7-C.2-B
Revenue Intelligence Module
Étape 8 — Structure
src/modules/revenue-intelligence ├── profitability ├── forecasting ├── commissions ├── settlements ├── health ├── insights └── revenue-intelligence.module.ts
Étape 9 — Services
PartnerProfitabilityService RevenueForecastService CashFlowForecastService CommissionOptimizationService SettlementIntelligenceService FinancialHealthScoreService FinancialInsightService
Sprint 7-C.2-C
Partner Profitability
Étape 10 — PartnerProfitabilityService
Créer
partner-profitability.service.ts
Calculer
Revenue Commission Cost Acquisition Cost Net Profit Margin
Étape 11 — Méthodes
calculateProfitability() calculateMargin() calculateROI() rankPartnersByProfitability()
Étape 12 — Classification
ROI > 30% Strategic ROI 15-30% Healthy ROI 5-15% Watch ROI < 5% At Risk
Sprint 7-C.2-D
Revenue Forecasting
Étape 13 — RevenueForecastService
Créer
revenue-forecast.service.ts
Prévoir
Revenue Commission Profit Bookings
Étape 14 — Horizons
30 jours 90 jours 12 mois
Étape 15 — Sources
Reservations Settlements Revenue Share Partner Analytics
Sprint 7-C.2-E
Cash Flow Forecast
Étape 16 — CashFlowForecastService
Créer
cashflow-forecast.service.ts
Prévoir
Incoming Cash Outgoing Payouts Commission Liabilities Settlement Exposure
Étape 17 — Méthodes
forecastCashIn() forecastCashOut() forecastNetCashFlow() forecastLiquidity()
Étape 18 — KPI
Cash Position Liquidity Ratio Forecast Accuracy
Sprint 7-C.2-F
Commission Optimization
Étape 19 — CommissionOptimizationService
Créer
commission-optimization.service.ts
Analyser
Commission Rate Revenue Contribution Margin Impact Partner Performance
Étape 20 — Recommandations
Increase Decrease Tiered Model Bonus Program
Étape 21 — Exemple
Commission 18% ↓ Optimisée 15% ↓ +12% marge
Sprint 7-C.2-G
Settlement Intelligence
Étape 22 — SettlementIntelligenceService
Créer
settlement-intelligence.service.ts
Détecter
Retards Variances Anomalies Risques de paiement
Étape 23 — Méthodes
detectSettlementRisks() analyzeSettlementPerformance() generateSettlementInsights()
Étape 24 — Exemple
Partner A Retard moyen 14 jours ↓ Risque élevé
Sprint 7-C.2-H
Financial Health Score
Étape 25 — FinancialHealthScoreService
Créer
financial-health-score.service.ts
Pondération
Profitability 30% Payments 25% Growth 20% Settlement 15% Risk 10%
Étape 26 — Classification
90-100 Excellent 75-89 Healthy 50-74 Warning 0-49 Critical
Étape 27 — Exemple
Financial Health 93 Excellent
Sprint 7-C.2-I
Executive Financial Intelligence
Étape 28 — FinancialInsightService
Créer
financial-insight.service.ts
Générer
Profitability Opportunities Commission Optimization Cash Flow Alerts Partner Risks Growth Opportunities
Étape 29 — Exemple
Top 10 partenaires ↓ 72% du revenu ↓ Programme premium recommandé
Commission moyenne 21% ↓ Au-dessus marché ↓ Optimisation suggérée
Sprint 7-C.2-J
Dashboard Intelligence
Étape 30 — Endpoints
GET /partner-finance/intelligence GET /partner-finance/profitability GET /partner-finance/forecasts GET /partner-finance/cashflow GET /partner-finance/health GET /partner-finance/recommendations
Étape 31 — Exemple
{
"profitabilityScore":92,
"financialHealth":93,
"forecastRevenue":1850000,
"cashflowForecast":420000,
"recommendations":7
}
Étape 32 — Analytics
Mesurer
Profit Margin Forecast Accuracy Commission Efficiency Cash Flow Accuracy Partner ROI Financial Health Trend
Gouvernance
Étape 33 — Permissions
partner.finance.analytics partner.finance.forecast partner.finance.health partner.finance.intelligence partner.finance.executive
Étape 34 — Audit
PROFITABILITY_CALCULATED FORECAST_GENERATED CASHFLOW_FORECAST_GENERATED COMMISSION_OPTIMIZATION_CREATED FINANCIAL_HEALTH_UPDATED FINANCIAL_INSIGHT_CREATED
Étape 35 — Jobs
Toutes les nuits Profitability Refresh Forecast Generation Cash Flow Forecast Health Score Refresh Recommendation Generation
Clôture Domaine Marketplace
À la fin du Sprint 7-C.2 :
✓ Distribution ✓ OTA Integrations ✓ Marketplace ✓ Partner Management ✓ Revenue Sharing ✓ Settlements ✓ Partner Intelligence ✓ Revenue Intelligence
sont entièrement opérationnels.
Préparation Sprint 8
Compatible avec :
Marketing Campaigns Loyalty Customer Engagement Growth Platform
Définition de terminé
Le Sprint 7-C.2 est terminé lorsque :
✓ Partner Profitability créé ✓ Commission Optimization créée ✓ Revenue Forecasting créé ✓ Cash Flow Forecast créé ✓ Settlement Intelligence créée ✓ Financial Health Score créé ✓ Revenue Intelligence finalisée
Livrables
PartnerProfitability FinancialForecast SettlementInsight FinancialHealthScore CommissionOptimization PartnerProfitabilityService RevenueForecastService CashFlowForecastService CommissionOptimizationService SettlementIntelligenceService FinancialHealthScoreService FinancialInsightService Revenue Intelligence Platform