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
Properties ↓ Distribution Core ├── Channels ├── Connections ├── Mapping ├── Inventory ├── Pricing └── Rules Engine ↓ OTA / Marketplace ↓ Reservations
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])
}
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])
}
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])
}
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])
}
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])
}
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])
}
enum ChannelCategory {
OTA
DIRECT
MARKETPLACE
WHOLESALER
CORPORATE
CHANNEL_MANAGER
}
enum ChannelConnectionStatus {
PENDING
CONNECTED
ERROR
DISCONNECTED
}
npx prisma migrate dev \
--name distribution_core
src/modules/distribution ├── channels ├── connections ├── mappings ├── inventory ├── pricing ├── rules └── distribution.module.ts
ChannelService ChannelConnectionService ChannelMappingService DistributionRuleService ChannelInventoryService ChannelPricingService
channel.service.ts
Airbnb Booking.com Expedia Abritel Direct Website Mobile App
getChannels() createChannel() activateChannel() deactivateChannel()
channel-connection.service.ts
connectChannel() disconnectChannel() refreshConnection() validateCredentials()
API Keys OAuth Tokens Secrets
dans le coffre-fort sécurisé existant.
channel-mapping.service.ts
mapProperty() unmapProperty() validateMapping() syncExternalListing()
Associer :
Property ↓ External Listing
sur chaque canal.
distribution-rule.service.ts
Inventory Rules Pricing Rules Channel Restrictions Priority Rules
Si Occupancy > 90% ↓ +15% prix
Si Channel = OTA ↓ Min Stay = 2 nuits
channel-inventory.service.ts
syncInventory() pushAvailability() pullAvailability() resolveInventoryConflict()
Temps réel Batch Webhook
channel-pricing.service.ts
syncPricing() pushRates() pullRates() applyChannelMarkup()
Prix base Prix OTA Prix Corporate Prix Promotion
GET /distribution/channels POST /distribution/channels/connect GET /distribution/mappings POST /distribution/mappings GET /distribution/inventory GET /distribution/pricing POST /distribution/rules
{
"channel":"Booking.com",
"status":"CONNECTED",
"mappedProperties":124
}
Portfolio Property Group Property
comme niveau de distribution.
distribution.read distribution.connect distribution.mapping distribution.inventory distribution.pricing distribution.admin
CHANNEL_CONNECTED CHANNEL_DISCONNECTED PROPERTY_MAPPED INVENTORY_SYNCED PRICING_SYNCED DISTRIBUTION_RULE_CREATED
Toutes les 5 minutes Inventory Sync Pricing Sync Connection Health Check
Compatible avec :
OTA APIs Webhook Sync Channel Intelligence Rate Optimization
Le Sprint 7-A.1 est terminé lorsque :
✓ Channel créé ✓ ChannelConnection créé ✓ ChannelMapping créé ✓ DistributionRule créé ✓ ChannelInventory créé ✓ ChannelPricing créé ✓ Distribution Core opérationnel
Channel ChannelConnection ChannelMapping DistributionRule ChannelInventory ChannelPricing ChannelService ChannelConnectionService ChannelMappingService DistributionRuleService ChannelInventoryService ChannelPricingService Distribution Core Platform
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
Properties ↓ Distribution Core ↓ OTA Integration Layer ├── Airbnb Connector ├── Booking Connector ├── Expedia Connector ├── Webhook Engine ├── Inventory Sync ├── Rate Sync └── Reservation Sync ↓ External Channels
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])
}
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])
}
model ChannelSyncState {
channelConnectionId String
@id
lastInventorySync DateTime?
lastPricingSync DateTime?
lastReservationSync DateTime?
lastSuccessfulSync DateTime?
updatedAt DateTime
@updatedAt
}
enum SyncType {
INVENTORY
PRICING
RESERVATION
FULL
}
enum SyncStatus {
PENDING
RUNNING
SUCCESS
FAILED
PARTIAL
}
npx prisma migrate dev \
--name ota_integrations
src/modules/distribution-integrations ├── airbnb ├── booking ├── expedia ├── webhooks ├── sync ├── jobs └── distribution-integrations.module.ts
AirbnbIntegrationService BookingIntegrationService ExpediaIntegrationService WebhookEngineService InventorySyncService PricingSyncService ReservationSyncService ChannelSyncOrchestrator
airbnb-integration.service.ts
OAuth Listings Sync Availability Sync Rate Sync Reservation Import
connect() syncListings() syncAvailability() syncPricing() importReservations()
Property ↓ Airbnb Listing
booking-integration.service.ts
Connectivity API Availability API Rates API Reservations API
connect() pushAvailability() pushRates() pullReservations()
Rate Limits Retries Backoff Dead Letter Queue
expedia-integration.service.ts
Rapid API Inventory API Pricing API Booking API
connect() syncInventory() syncPricing() importBookings()
webhook-engine.service.ts
OTA Events Reservations Cancellations Availability Changes Pricing Changes
POST /webhooks/airbnb POST /webhooks/booking POST /webhooks/expedia
Receive ↓ Validate ↓ Store ↓ Process ↓ Publish Event
inventory-sync.service.ts
Availability Blocked Dates Inventory Changes
pushInventory() pullInventory() resolveConflicts() rebuildInventory()
Reservation Engine ↓ Property Availability ↓ OTA Data
pricing-sync.service.ts
Base Rate Seasonal Rate Promotion Rate Channel Rate
pushRates() pullRates() applyRateAdjustments() rebuildRates()
PropertyPricing ↓ Distribution Rules ↓ OTA
reservation-sync.service.ts
New Reservation Modification Cancellation Guest Update
importReservation() updateReservation() cancelReservation() deduplicateReservation()
External Reservation ID Channel Guest Dates
POST /distribution/connect/airbnb POST /distribution/connect/booking POST /distribution/connect/expedia GET /distribution/sync-jobs POST /distribution/sync/full GET /distribution/webhooks
Connected Channels Sync Status Last Sync Failed Jobs Webhook Health
distribution.sync distribution.webhooks distribution.channels distribution.monitoring distribution.admin
CHANNEL_SYNC_STARTED CHANNEL_SYNC_COMPLETED WEBHOOK_RECEIVED RESERVATION_IMPORTED RATE_SYNCED INVENTORY_SYNCED
Toutes les minutes Webhook Processing Toutes les 5 minutes Availability Sync Pricing Sync Toutes les 15 minutes Reservation Sync Toutes les nuits Full Reconciliation
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
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
ChannelSyncJob ChannelWebhook ChannelSyncState AirbnbIntegrationService BookingIntegrationService ExpediaIntegrationService WebhookEngineService InventorySyncService PricingSyncService ReservationSyncService ChannelSyncOrchestrator OTA Integration Platform
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
Marketplace ↓ Partner Management ├── Partners ├── Contracts ├── Commissions ├── Listings ├── Performance └── Partner Portal ↓ Distribution ↓ Reservations ↓ Finance
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])
}
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])
}
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])
}
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])
}
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
}
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])
}
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
}
npx prisma migrate dev \
--name marketplace_partner_core
src/modules/partners ├── partners ├── contracts ├── commissions ├── listings ├── performance ├── portal └── partners.module.ts
PartnerService PartnerContractService PartnerCommissionService MarketplaceListingService PartnerPerformanceService PartnerPortalService
partner.service.ts
createPartner() updatePartner() activatePartner() suspendPartner() searchPartners()
Agences Affiliés OTA Corporate Revendeurs
partner-contract.service.ts
createContract() renewContract() terminateContract() uploadContract()
Contrats Avenants Renouvellements Échéances
à :
30 jours 15 jours 7 jours
avant expiration.
partner-commission.service.ts
Commission fixe Pourcentage Paliers Bonus
calculateCommission() approveCommission() payCommission() generateStatement()
Reservations Invoices Payments
marketplace-listing.service.ts
publishListing() pauseListing() archiveListing() syncListing()
Publication Synchronisation Statut Distribution
partner-performance.service.ts
Revenue Réservations Conversion Commissions Satisfaction
Revenue Generated Bookings Average Booking Value Commission Ratio Partner Score
partner-portal.service.ts
Dashboard Commissions Réservations Listings Contrats
Admin Manager Viewer
pour chaque partenaire.
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
{
"partner":"Travel Agency Europe",
"revenue":125000,
"reservations":842,
"commissionPaid":18500,
"score":91
}
partner.read partner.create partner.update partner.contracts partner.commissions partner.portal partner.admin
PARTNER_CREATED PARTNER_ACTIVATED CONTRACT_CREATED LISTING_PUBLISHED COMMISSION_CALCULATED PARTNER_PORTAL_LOGIN
Toutes les nuits Commission Calculation Performance Refresh Contract Expiration Check
Compatible avec :
Partner Intelligence Partner Scoring Commission Optimization Marketplace Analytics Partner Recommendations
Le Sprint 7-B.1 est terminé lorsque :
✓ Partner créé ✓ PartnerContract créé ✓ PartnerCommission créé ✓ MarketplaceListing créé ✓ PartnerPerformance créé ✓ PartnerPortal créé ✓ Marketplace Core opérationnel
Partner PartnerContract PartnerCommission MarketplaceListing PartnerPerformance PartnerPortalAccess PartnerService PartnerContractService PartnerCommissionService MarketplaceListingService PartnerPerformanceService PartnerPortalService Marketplace Core Platform
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
Partner Ecosystem ↓ Partner Intelligence Engine ├── Partner Scoring ├── Revenue Forecasting ├── Commission Analytics ├── Marketplace Analytics ├── Recommendation Engine ├── Health Scoring └── Executive Insights ↓ Partner Management ↓ Revenue Growth
model PartnerScore {
partnerId String
@id
overallScore Float
revenueScore Float
growthScore Float
qualityScore Float
conversionScore Float
satisfactionScore Float
calculatedAt DateTime
@updatedAt
}
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])
}
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])
}
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])
}
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])
}
enum PartnerForecastType {
REVENUE
BOOKINGS
COMMISSIONS
CONVERSION
}
enum PartnerInsightCategory {
REVENUE
PERFORMANCE
COMMISSION
MARKETPLACE
GROWTH
}
enum PartnerRecommendationType {
PROMOTION
COMMISSION_ADJUSTMENT
EXPANSION
TRAINING
REACTIVATION
}
npx prisma migrate dev \
--name partner_intelligence
src/modules/partner-intelligence ├── scoring ├── forecasting ├── commissions ├── analytics ├── recommendations ├── health └── partner-intelligence.module.ts
PartnerScoreService PartnerForecastService CommissionIntelligenceService MarketplaceAnalyticsService PartnerRecommendationService PartnerHealthScoreService PartnerInsightService
partner-score.service.ts
Revenue Bookings Conversion Satisfaction Growth
Revenue 30% Bookings 25% Growth 20% Conversion 15% Satisfaction 10%
90-100 Elite 75-89 Premium 50-74 Standard 0-49 At Risk
partner-forecast.service.ts
Revenue Bookings Commissions Growth
forecastRevenue() forecastBookings() forecastCommissions() forecastGrowth()
30 jours 90 jours 12 mois
commission-intelligence.service.ts
Commission Cost Commission ROI Revenue Share Partner Profitability
Sous-performance Sur-commission Opportunités optimisation
Commission 18% ↓ ROI faible ↓ Révision recommandée
marketplace-analytics.service.ts
Marketplace Revenue Partner Revenue Bookings Conversion Commissions
Revenue Per Partner Bookings Per Partner Commission Ratio Partner Growth Marketplace Health
Top Revenue Top Conversion Top Growth Top ROI
partner-health-score.service.ts
Revenue 25% Growth 20% Bookings 20% Conversion 15% Satisfaction 10% Activity 10%
90-100 Excellent 75-89 Healthy 50-74 Warning 0-49 Critical
Partner Health 92 Excellent
partner-recommendation.service.ts
Commission Adjustment Cross-Sell Upsell Expansion Reactivation
Agence Europe ↑ 28% croissance ↓ Expansion recommandée
Affilié A45 ↓ activité ↓ Programme réactivation
GET /partners/intelligence GET /partners/analytics GET /partners/forecasts GET /partners/recommendations GET /partners/health GET /partners/leaderboard
{
"partnerScore":94,
"healthScore":91,
"forecastRevenue":450000,
"recommendations":3
}
Forecast Accuracy Partner ROI Commission Efficiency Partner Retention Marketplace Growth
partner.analytics.read partner.forecast.read partner.recommendations.read partner.health.read partner.intelligence.admin
PARTNER_SCORE_UPDATED PARTNER_FORECAST_GENERATED COMMISSION_ANALYSIS_COMPLETED MARKETPLACE_ANALYTICS_REFRESHED PARTNER_RECOMMENDATION_CREATED
Toutes les nuits Partner Score Refresh Partner Health Refresh Forecast Generation Recommendation Generation Marketplace Analytics Snapshot
Compatible avec :
Revenue Sharing Settlement Engine Partner Billing Commission Payments Financial Distribution
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
PartnerScore PartnerForecast PartnerInsight MarketplaceAnalyticsSnapshot PartnerRecommendation PartnerScoreService PartnerForecastService CommissionIntelligenceService MarketplaceAnalyticsService PartnerRecommendationService PartnerHealthScoreService Partner Intelligence Platform
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
Reservations ↓ Revenue Engine ↓ Settlement Engine ├── Revenue Sharing ├── Commission Billing ├── Partner Ledger ├── Payout Engine ├── Reconciliation └── Financial Reporting ↓ Partners ↓ Accounting
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])
}
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])
}
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])
}
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])
}
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])
}
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
}
npx prisma migrate dev \
--name revenue_sharing_core
src/modules/partner-finance ├── revenue-share ├── settlements ├── payouts ├── ledger ├── reconciliation └── partner-finance.module.ts
RevenueShareService SettlementService PartnerPayoutService PartnerLedgerService FinancialReconciliationService PartnerFinanceDashboardService
revenue-share.service.ts
Revenue Split Partner Share Platform Share Commission Deduction
Pourcentage Fixe Paliers Hybride
calculateRevenueShare() applyCommissionModel() generateRevenueEntries()
settlement.service.ts
Partner Statements Settlement Reports Financial Summaries
generateSettlement() approveSettlement() closeSettlement() exportSettlement()
Hebdomadaire Mensuelle Trimestrielle
partner-payout.service.ts
SEPA Virement bancaire Stripe Connect PayPal
createPayout() executePayout() retryPayout() cancelPayout()
Double validation Montant maximum Journalisation complète
pour les paiements.
partner-ledger.service.ts
Grand livre comptable partenaire.
Revenue Commission Payout Refund Adjustment
postEntry() calculateBalance() generateStatement() exportLedger()
financial-reconciliation.service.ts
Payments Settlements Payouts Commissions
Écarts Paiements manquants Doubles paiements Commissions incorrectes
runReconciliation() detectVariance() createInvestigation() closeInvestigation()
partner-finance-dashboard.service.ts
Revenue Shared Pending Settlements Payouts Commissions Outstanding Balance
Partner Revenue Commission Cost Settlement Cycle Time Payout Success Rate Reconciliation Accuracy
GET /partner-finance/dashboard GET /partner-finance/settlements POST /partner-finance/settlements POST /partner-finance/payouts GET /partner-finance/ledger GET /partner-finance/reconciliation
{
"partner":"Agency Europe",
"grossRevenue":120000,
"commission":18000,
"netSettlement":102000,
"status":"APPROVED"
}
partner.finance.read partner.finance.settlement partner.finance.payout partner.finance.reconciliation partner.finance.approve partner.finance.admin
REVENUE_SHARE_CALCULATED SETTLEMENT_GENERATED SETTLEMENT_APPROVED PAYOUT_CREATED PAYOUT_EXECUTED RECONCILIATION_COMPLETED
Toutes les nuits Revenue Share Calculation Settlement Generation Reconciliation Run Toutes les heures Payout Processing
Compatible avec :
Revenue Intelligence Commission Optimization Cash Forecasting Partner Profitability Financial Analytics
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
RevenueShare Settlement PartnerPayout PartnerLedger ReconciliationRecord RevenueShareService SettlementService PartnerPayoutService PartnerLedgerService FinancialReconciliationService PartnerFinanceDashboardService Partner Financial Platform
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
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
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
}
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])
}
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])
}
model FinancialHealthScore {
partnerId String
@id
overallScore Float
profitabilityScore Float
paymentScore Float
growthScore Float
settlementScore Float
riskScore Float
calculatedAt DateTime
@updatedAt
}
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])
}
enum FinancialForecastType {
REVENUE
CASHFLOW
COMMISSION
PAYOUT
PROFITABILITY
}
enum SettlementInsightType {
DELAY_RISK
PAYMENT_ANOMALY
COMMISSION_VARIANCE
CASHFLOW_RISK
RECONCILIATION_ISSUE
}
npx prisma migrate dev \
--name revenue_intelligence
src/modules/revenue-intelligence ├── profitability ├── forecasting ├── commissions ├── settlements ├── health ├── insights └── revenue-intelligence.module.ts
PartnerProfitabilityService RevenueForecastService CashFlowForecastService CommissionOptimizationService SettlementIntelligenceService FinancialHealthScoreService FinancialInsightService
partner-profitability.service.ts
Revenue Commission Cost Acquisition Cost Net Profit Margin
calculateProfitability() calculateMargin() calculateROI() rankPartnersByProfitability()
ROI > 30% Strategic ROI 15-30% Healthy ROI 5-15% Watch ROI < 5% At Risk
revenue-forecast.service.ts
Revenue Commission Profit Bookings
30 jours 90 jours 12 mois
Reservations Settlements Revenue Share Partner Analytics
cashflow-forecast.service.ts
Incoming Cash Outgoing Payouts Commission Liabilities Settlement Exposure
forecastCashIn() forecastCashOut() forecastNetCashFlow() forecastLiquidity()
Cash Position Liquidity Ratio Forecast Accuracy
commission-optimization.service.ts
Commission Rate Revenue Contribution Margin Impact Partner Performance
Increase Decrease Tiered Model Bonus Program
Commission 18% ↓ Optimisée 15% ↓ +12% marge
settlement-intelligence.service.ts
Retards Variances Anomalies Risques de paiement
detectSettlementRisks() analyzeSettlementPerformance() generateSettlementInsights()
Partner A Retard moyen 14 jours ↓ Risque élevé
financial-health-score.service.ts
Profitability 30% Payments 25% Growth 20% Settlement 15% Risk 10%
90-100 Excellent 75-89 Healthy 50-74 Warning 0-49 Critical
Financial Health 93 Excellent
financial-insight.service.ts
Profitability Opportunities Commission Optimization Cash Flow Alerts Partner Risks Growth Opportunities
Top 10 partenaires ↓ 72% du revenu ↓ Programme premium recommandé
Commission moyenne 21% ↓ Au-dessus marché ↓ Optimisation suggérée
GET /partner-finance/intelligence GET /partner-finance/profitability GET /partner-finance/forecasts GET /partner-finance/cashflow GET /partner-finance/health GET /partner-finance/recommendations
{
"profitabilityScore":92,
"financialHealth":93,
"forecastRevenue":1850000,
"cashflowForecast":420000,
"recommendations":7
}
Profit Margin Forecast Accuracy Commission Efficiency Cash Flow Accuracy Partner ROI Financial Health Trend
partner.finance.analytics partner.finance.forecast partner.finance.health partner.finance.intelligence partner.finance.executive
PROFITABILITY_CALCULATED FORECAST_GENERATED CASHFLOW_FORECAST_GENERATED COMMISSION_OPTIMIZATION_CREATED FINANCIAL_HEALTH_UPDATED FINANCIAL_INSIGHT_CREATED
Toutes les nuits Profitability Refresh Forecast Generation Cash Flow Forecast Health Score Refresh Recommendation Generation
À 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.
Compatible avec :
Marketing Campaigns Loyalty Customer Engagement Growth Platform
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
PartnerProfitability FinancialForecast SettlementInsight FinancialHealthScore CommissionOptimization PartnerProfitabilityService RevenueForecastService CashFlowForecastService CommissionOptimizationService SettlementIntelligenceService FinancialHealthScoreService FinancialInsightService Revenue Intelligence Platform