====== Sprint 10-A.1 — Platform API & Developer Portal Core ====== ===== Objectif ===== Ouvrir la plateforme Enterprise à l'écosystème développeurs et partenaires. Cette couche permet : Public API API Keys OAuth2 Developer Portal API Documentation SDK Foundation afin de transformer la plateforme en écosystème extensible. À l'issue de cette étape : ✓ Public API ✓ API Keys ✓ OAuth2 ✓ Developer Portal ✓ API Documentation ✓ SDK Foundation ✓ Developer Platform ---- ====== Architecture cible ====== Platform Core ↓ API Platform ├── Public REST API ├── OAuth2 Provider ├── API Keys ├── Developer Portal ├── API Documentation ├── SDK Registry └── Usage Analytics ↓ Partners Developers Integrators Marketplace Apps ---- ====== Sprint 10-A.1-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — ApiApplication ====== ===== Ajouter dans schema.prisma ===== model ApiApplication { id String @id @default(uuid()) tenantId String? name String description String? clientId String @unique clientSecretHash String applicationType ApiApplicationType status ApiApplicationStatus createdBy String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt apiKeys ApiKey[] @@index([status]) } ---- ====== Étape 2 — ApiKey ====== ===== Ajouter ===== model ApiKey { id String @id @default(uuid()) applicationId String keyPrefix String keyHash String scopes String[] active Boolean @default(true) expiresAt DateTime? lastUsedAt DateTime? createdAt DateTime @default(now()) application ApiApplication @relation( fields:[applicationId], references:[id], onDelete:Cascade ) @@index([applicationId]) @@index([active]) } ---- ====== Étape 3 — OAuthClient ====== ===== Ajouter ===== model OAuthClient { id String @id @default(uuid()) applicationId String redirectUris String[] grantTypes String[] scopes String[] active Boolean @default(true) createdAt DateTime @default(now()) @@index([applicationId]) } ---- ====== Étape 4 — ApiAccessLog ====== ===== Ajouter ===== model ApiAccessLog { id String @id @default(uuid()) applicationId String? endpoint String method String statusCode Int responseTimeMs Int ipAddress String? createdAt DateTime @default(now()) @@index([applicationId]) @@index([createdAt]) @@index([endpoint]) } ---- ====== Étape 5 — ApiRateLimit ====== ===== Ajouter ===== model ApiRateLimit { id String @id @default(uuid()) applicationId String requestsPerMinute Int requestsPerHour Int requestsPerDay Int createdAt DateTime @default(now()) @@unique([applicationId]) } ---- ====== Étape 6 — Enums ====== ===== Ajouter ===== enum ApiApplicationType { INTERNAL PARTNER PUBLIC MARKETPLACE } enum ApiApplicationStatus { PENDING ACTIVE SUSPENDED REVOKED } ---- ====== Étape 7 — Migration ====== npx prisma migrate dev \ --name platform_api_core ---- ====== Sprint 10-A.1-B ====== ===== Platform API Module ===== ---- ====== Étape 8 — Structure ====== src/modules/platform-api ├── applications ├── api-keys ├── oauth ├── documentation ├── analytics ├── portal └── platform-api.module.ts ---- ====== Étape 9 — Services ====== ApiApplicationService ApiKeyService OAuthService ApiDocumentationService ApiAnalyticsService DeveloperPortalService ---- ====== Sprint 10-A.1-C ====== ===== API Keys ===== ---- ====== Étape 10 — ApiKeyService ====== ===== Créer ===== api-key.service.ts ---- ===== Fonctionnalités ===== Generate Key Rotate Key Revoke Key Scope Management Expiration ---- ====== Étape 11 — Format ====== pk_live_xxxxxxxxx pk_test_xxxxxxxxx ---- ====== Étape 12 — Méthodes ====== generateApiKey() rotateApiKey() revokeApiKey() validateApiKey() ---- ====== Sprint 10-A.1-D ====== ===== OAuth2 Provider ===== ---- ====== Étape 13 — OAuthService ====== ===== Créer ===== oauth.service.ts ---- ===== Supporter ===== Authorization Code Client Credentials Refresh Token PKCE ---- ====== Étape 14 — Endpoints OAuth ====== GET /oauth/authorize POST /oauth/token POST /oauth/revoke GET /oauth/userinfo ---- ====== Étape 15 — Scopes ====== crm.read crm.write property.read reservation.read reservation.write analytics.read ---- ====== Sprint 10-A.1-E ====== ===== Public API ===== ---- ====== Étape 16 — API Gateway ====== ===== Exposer ===== CRM API Property API Reservation API Finance API Marketing API ---- ====== Étape 17 — Versioning ====== ===== Supporter ===== /api/v1 /api/v2 ---- ====== Étape 18 — Standards ====== REST OpenAPI 3 JSON API Pagination Filtering Sorting ---- ====== Sprint 10-A.1-F ====== ===== Documentation API ===== ---- ====== Étape 19 — ApiDocumentationService ====== ===== Créer ===== api-documentation.service.ts ---- ===== Générer ===== Swagger OpenAPI Postman Collection SDK Examples ---- ====== Étape 20 — Documentation ====== ===== Fournir ===== Authentication Endpoints Examples Errors Rate Limits ---- ====== Sprint 10-A.1-G ====== ===== Developer Portal ===== ---- ====== Étape 21 — DeveloperPortalService ====== ===== Créer ===== developer-portal.service.ts ---- ===== Fonctionnalités ===== Applications API Keys Usage Analytics Documentation SDK Downloads ---- ====== Étape 22 — Dashboard ====== ===== Afficher ===== Requests Errors Latency Quota Usage Top APIs ---- ====== Sprint 10-A.1-H ====== ===== SDK Foundation ===== ---- ====== Étape 23 — SDK Registry ====== ===== Créer ===== sdk-registry.service.ts ---- ===== Préparer ===== TypeScript SDK Node.js SDK Python SDK PHP SDK Java SDK ---- ====== Étape 24 — Génération ====== ===== Basée sur ===== OpenAPI Codegen Versioning ---- ====== Étape 25 — Exemple ====== const client = new PlatformClient({ apiKey: process.env.API_KEY }); const properties = await client.properties.list(); ---- ====== Sprint 10-A.1-I ====== ===== API Analytics ===== ---- ====== Étape 26 — ApiAnalyticsService ====== ===== Créer ===== api-analytics.service.ts ---- ===== Mesurer ===== Requests Errors Latency Rate Limits Usage By Endpoint ---- ====== Étape 27 — Endpoints ====== GET /developer/apps POST /developer/apps POST /developer/api-keys GET /developer/analytics GET /developer/docs GET /developer/sdk ---- ====== Étape 28 — Exemple ====== { "application":"Partner PMS", "requestsToday":124550, "avgLatency":78, "errorRate":0.12, "quotaUsage":68 } ---- ====== Sprint 10-A.1-J ====== ===== Gouvernance ===== ---- ====== Étape 29 — Permissions ====== developer.read developer.apps.manage developer.keys.manage developer.analytics.read developer.docs.manage developer.admin ---- ====== Étape 30 — Audit ====== API_KEY_CREATED API_KEY_ROTATED OAUTH_CLIENT_CREATED APPLICATION_REGISTERED API_RATE_LIMIT_TRIGGERED SDK_GENERATED ---- ====== Étape 31 — Jobs ====== Toutes les heures API Analytics Aggregation Toutes les nuits Usage Rollup Quota Refresh SDK Publication Check ---- ====== Préparation Sprint 10-A.2 ====== Compatible avec : Webhooks Event Bus Realtime Events Partner Integrations Marketplace Apps ---- ====== Définition de terminé ====== Le Sprint 10-A.1 est terminé lorsque : ✓ Public API créée ✓ API Keys créées ✓ OAuth2 créé ✓ Developer Portal créé ✓ API Documentation créée ✓ SDK Foundation créée ✓ Developer Platform opérationnelle ---- ====== Livrables ====== ApiApplication ApiKey OAuthClient ApiAccessLog ApiRateLimit ApiApplicationService ApiKeyService OAuthService ApiDocumentationService DeveloperPortalService ApiAnalyticsService SDK Registry Developer Platform ---- ====== Sprint 10-A.2 — Webhooks, Events & Integration Platform ====== ===== Objectif ===== Construire la plateforme d'intégration Enterprise permettant à l'écosystème externe de réagir en temps réel aux événements métier. Cette couche permet : Webhook Engine Event Bus Event Catalog Realtime Events Partner Integrations Integration Dashboard afin d'interconnecter la plateforme avec : PMS ERP CRM OTA Paiements Marketing Marketplace Apps Partenaires À l'issue de cette étape : ✓ Webhook Engine ✓ Event Bus ✓ Event Catalog ✓ Realtime Events ✓ Partner Integrations ✓ Integration Dashboard ✓ Integration Platform ---- ====== Architecture cible ====== Platform Core ↓ Domain Events ↓ Event Bus ├── CRM Events ├── Property Events ├── Reservation Events ├── Finance Events ├── Marketing Events ├── Loyalty Events └── Marketplace Events ↓ Webhook Engine ↓ Partner Integrations ↓ External Systems ---- ====== Sprint 10-A.2-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — EventDefinition ====== ===== Ajouter dans schema.prisma ===== model EventDefinition { id String @id @default(uuid()) code String @unique category EventCategory name String description String? schemaVersion String active Boolean @default(true) createdAt DateTime @default(now()) @@index([category]) } ---- ====== Étape 2 — EventSubscription ====== ===== Ajouter ===== model EventSubscription { id String @id @default(uuid()) tenantId String applicationId String eventCode String active Boolean @default(true) createdAt DateTime @default(now()) @@index([tenantId]) @@index([applicationId]) @@index([eventCode]) } ---- ====== Étape 3 — WebhookEndpoint ====== ===== Ajouter ===== model WebhookEndpoint { id String @id @default(uuid()) tenantId String applicationId String? name String targetUrl String secretKeyHash String active Boolean @default(true) retryEnabled Boolean @default(true) createdAt DateTime @default(now()) @@index([tenantId]) @@index([active]) } ---- ====== Étape 4 — WebhookDelivery ====== ===== Ajouter ===== model WebhookDelivery { id String @id @default(uuid()) endpointId String eventCode String payload Json status WebhookDeliveryStatus responseCode Int? responseTimeMs Int? retryCount Int @default(0) deliveredAt DateTime? createdAt DateTime @default(now()) @@index([endpointId]) @@index([status]) @@index([createdAt]) } ---- ====== Étape 5 — IntegrationConnection ====== ===== Ajouter ===== model IntegrationConnection { id String @id @default(uuid()) tenantId String provider IntegrationProvider externalAccountId String? status IntegrationStatus configuration Json lastSyncAt DateTime? createdAt DateTime @default(now()) @@index([tenantId]) @@index([provider]) @@index([status]) } ---- ====== Étape 6 — EventLog ====== ===== Ajouter ===== model EventLog { id String @id @default(uuid()) tenantId String? eventCode String aggregateType String aggregateId String payload Json publishedAt DateTime @default(now()) @@index([eventCode]) @@index([publishedAt]) } ---- ====== Étape 7 — Enums ====== ===== Ajouter ===== enum EventCategory { CRM PROPERTY RESERVATION PAYMENT FINANCE MARKETING LOYALTY REFERRAL MARKETPLACE } enum WebhookDeliveryStatus { PENDING PROCESSING SUCCESS FAILED RETRYING DEAD_LETTER } enum IntegrationProvider { AIRBNB BOOKING EXPEDIA STRIPE HUBSPOT SALESFORCE ZAPIER MAKE CUSTOM } enum IntegrationStatus { PENDING ACTIVE FAILED DISCONNECTED } ---- ====== Étape 8 — Migration ====== npx prisma migrate dev \ --name integration_platform ---- ====== Sprint 10-A.2-B ====== ===== Integration Platform Module ===== ---- ====== Étape 9 — Structure ====== src/modules/integrations ├── events ├── webhooks ├── subscriptions ├── providers ├── dashboard └── integrations.module.ts ---- ====== Étape 10 — Services ====== EventBusService EventCatalogService WebhookEngineService WebhookDeliveryService IntegrationConnectionService IntegrationDashboardService ---- ====== Sprint 10-A.2-C ====== ===== Event Bus ===== ---- ====== Étape 11 — EventBusService ====== ===== Créer ===== event-bus.service.ts ---- ===== Fonctions ===== Publish Subscribe Replay Retry Dead Letter Queue ---- ====== Étape 12 — Méthodes ====== publish() subscribe() unsubscribe() replayEvent() moveToDeadLetter() ---- ====== Étape 13 — Événements standards ====== CUSTOMER_CREATED PROPERTY_CREATED RESERVATION_CREATED PAYMENT_COMPLETED CHECKIN_COMPLETED CHECKOUT_COMPLETED LOYALTY_POINTS_EARNED ---- ====== Sprint 10-A.2-D ====== ===== Event Catalog ===== ---- ====== Étape 14 — EventCatalogService ====== ===== Créer ===== event-catalog.service.ts ---- ===== Fournir ===== Schemas Payloads Versions Examples Compatibility ---- ====== Étape 15 — Exemple ====== { "event":"RESERVATION_CREATED", "version":"1.0", "reservationId":"..." } ---- ====== Sprint 10-A.2-E ====== ===== Webhook Engine ===== ---- ====== Étape 16 — WebhookEngineService ====== ===== Créer ===== webhook-engine.service.ts ---- ===== Supporter ===== HTTPS HMAC Signature Retries Backoff Dead Letter Queue ---- ====== Étape 17 — Sécurité ====== ===== Headers ===== X-Webhook-Signature X-Webhook-Event X-Webhook-Timestamp ---- ====== Étape 18 — Méthodes ====== registerEndpoint() dispatchWebhook() verifySignature() retryDelivery() ---- ====== Étape 19 — Politique Retry ====== 1 min 5 min 15 min 1 h 6 h ---- ====== Sprint 10-A.2-F ====== ===== Realtime Events ===== ---- ====== Étape 20 — Temps réel ====== ===== Utiliser ===== Kafka RabbitMQ NATS Redis Streams selon l'architecture cible. ---- ====== Étape 21 — Topics ====== crm.* reservation.* property.* payment.* marketing.* ---- ====== Étape 22 — Streaming ====== ===== Supporter ===== Event Replay Consumer Groups Partitioning Event Retention ---- ====== Sprint 10-A.2-G ====== ===== Partner Integrations ===== ---- ====== Étape 23 — IntegrationConnectionService ====== ===== Créer ===== integration-connection.service.ts ---- ===== Connecteurs ===== Airbnb Booking Expedia Stripe HubSpot Salesforce Zapier Make ---- ====== Étape 24 — Méthodes ====== connect() disconnect() sync() refreshToken() testConnection() ---- ====== Étape 25 — Connecteurs custom ====== ===== Supporter ===== REST Webhook OAuth2 API Key ---- ====== Sprint 10-A.2-H ====== ===== Dashboard Intégration ===== ---- ====== Étape 26 — IntegrationDashboardService ====== ===== Créer ===== integration-dashboard.service.ts ---- ===== Afficher ===== Events Published Webhook Success Rate Retry Queue Failed Deliveries Active Integrations ---- ====== Étape 27 — KPIs ====== Delivery Rate Average Latency Retry Rate Consumer Lag Integration Health ---- ====== Sprint 10-A.2-I ====== ===== API Intégration ===== ---- ====== Étape 28 — Endpoints ====== GET /integrations/events GET /integrations/subscriptions POST /integrations/webhooks GET /integrations/webhooks/deliveries GET /integrations/connections POST /integrations/connections GET /integrations/dashboard ---- ====== Étape 29 — Exemple ====== { "eventsPublished":152340, "deliveryRate":99.87, "failedDeliveries":42, "activeIntegrations":28, "avgLatencyMs":74 } ---- ====== Sprint 10-A.2-J ====== ===== Gouvernance ===== ---- ====== Étape 30 — Permissions ====== integration.read integration.webhooks.manage integration.events.manage integration.connections.manage integration.analytics.read integration.admin ---- ====== Étape 31 — Audit ====== EVENT_PUBLISHED WEBHOOK_REGISTERED WEBHOOK_DELIVERED WEBHOOK_FAILED INTEGRATION_CONNECTED INTEGRATION_DISCONNECTED ---- ====== Étape 32 — Jobs ====== Toutes les minutes Webhook Retry Processor Dead Letter Processor Toutes les heures Integration Health Check Event Retention Cleanup Analytics Aggregation ---- ====== Préparation Sprint 10-B.1 ====== Compatible avec : Marketplace Apps App Store Extensions Plugins Embedded Apps ---- ====== Définition de terminé ====== Le Sprint 10-A.2 est terminé lorsque : ✓ Webhook Engine créé ✓ Event Bus créé ✓ Event Catalog créé ✓ Realtime Events créés ✓ Partner Integrations créées ✓ Integration Dashboard créé ✓ Integration Platform opérationnelle ---- ====== Livrables ====== EventDefinition EventSubscription WebhookEndpoint WebhookDelivery IntegrationConnection EventLog EventBusService EventCatalogService WebhookEngineService WebhookDeliveryService IntegrationConnectionService IntegrationDashboardService Integration Platform ---- ====== Sprint 10-B.1 — Marketplace Apps & Extension Framework ====== ===== Objectif ===== Construire l'écosystème applicatif Enterprise permettant aux partenaires, intégrateurs et développeurs de distribuer des extensions sur la plateforme. Cette couche permet : App Marketplace App Installation Extension Framework Embedded Apps Plugin SDK App Management afin de transformer la plateforme en véritable système extensible. À l'issue de cette étape : ✓ App Marketplace ✓ App Installation ✓ Extension Framework ✓ Embedded Apps ✓ Plugin SDK ✓ App Management ✓ Ecosystem Platform ---- ====== Architecture cible ====== Developer Platform ↓ Marketplace Platform ├── App Registry ├── App Store ├── Installation Engine ├── Extension Framework ├── Embedded Apps ├── Plugin SDK └── App Analytics ↓ Customers Partners Developers Marketplace Ecosystem ---- ====== Sprint 10-B.1-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — MarketplaceApp ====== ===== Ajouter dans schema.prisma ===== model MarketplaceApp { id String @id @default(uuid()) developerId String code String @unique name String description String? version String category AppCategory status AppStatus logoUrl String? websiteUrl String? documentationUrl String? verified Boolean @default(false) publishedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([category]) @@index([status]) } ---- ====== Étape 2 — AppInstallation ====== ===== Ajouter ===== model AppInstallation { id String @id @default(uuid()) tenantId String appId String installedBy String status AppInstallationStatus configuration Json? installedAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([tenantId, appId]) @@index([tenantId]) @@index([status]) } ---- ====== Étape 3 — AppPermission ====== ===== Ajouter ===== model AppPermission { id String @id @default(uuid()) appId String permissionCode String required Boolean @default(true) createdAt DateTime @default(now()) @@index([appId]) @@index([permissionCode]) } ---- ====== Étape 4 — AppExtension ====== ===== Ajouter ===== model AppExtension { id String @id @default(uuid()) appId String extensionPoint String componentType ExtensionComponentType configuration Json active Boolean @default(true) createdAt DateTime @default(now()) @@index([appId]) @@index([extensionPoint]) } ---- ====== Étape 5 — AppUsageMetric ====== ===== Ajouter ===== model AppUsageMetric { id String @id @default(uuid()) appId String tenantId String metricDate DateTime activeUsers Int @default(0) apiCalls Int @default(0) executions Int @default(0) createdAt DateTime @default(now()) @@index([appId]) @@index([tenantId]) @@index([metricDate]) } ---- ====== Étape 6 — Enums ====== ===== Ajouter ===== enum AppCategory { CRM PROPERTY RESERVATION FINANCE MARKETING LOYALTY ANALYTICS OPERATIONS INTEGRATION PRODUCTIVITY } enum AppStatus { DRAFT REVIEW PUBLISHED SUSPENDED DEPRECATED } enum AppInstallationStatus { PENDING INSTALLED DISABLED FAILED UNINSTALLED } enum ExtensionComponentType { PAGE WIDGET ACTION WEBHOOK AUTOMATION SIDEBAR } ---- ====== Étape 7 — Migration ====== npx prisma migrate dev \ --name marketplace_apps_core ---- ====== Sprint 10-B.1-B ====== ===== Marketplace Module ===== ---- ====== Étape 8 — Structure ====== src/modules/marketplace ├── apps ├── installations ├── extensions ├── sdk ├── analytics ├── reviews └── marketplace.module.ts ---- ====== Étape 9 — Services ====== MarketplaceAppService AppInstallationService ExtensionFrameworkService PluginSDKService MarketplaceAnalyticsService AppManagementService ---- ====== Sprint 10-B.1-C ====== ===== App Marketplace ===== ---- ====== Étape 10 — MarketplaceAppService ====== ===== Créer ===== marketplace-app.service.ts ---- ===== Fonctionnalités ===== Publish App Update App Archive App Verify App Search Apps ---- ====== Étape 11 — Catégories ====== CRM Reservations Finance Marketing Analytics Operations Integrations ---- ====== Étape 12 — Méthodes ====== publishApp() submitForReview() verifyApp() searchMarketplace() getFeaturedApps() ---- ====== Sprint 10-B.1-D ====== ===== App Installation ===== ---- ====== Étape 13 — AppInstallationService ====== ===== Créer ===== app-installation.service.ts ---- ===== Supporter ===== Install Upgrade Disable Enable Uninstall ---- ====== Étape 14 — Workflow ====== Marketplace ↓ Review Permissions ↓ Install ↓ Configure ↓ Activate ---- ====== Étape 15 — Méthodes ====== installApp() upgradeApp() enableApp() disableApp() uninstallApp() ---- ====== Sprint 10-B.1-E ====== ===== Extension Framework ===== ---- ====== Étape 16 — ExtensionFrameworkService ====== ===== Créer ===== extension-framework.service.ts ---- ===== Extension Points ====== Dashboard Widgets Property Pages Reservation Pages CRM Pages Sidebar Menus Custom Actions ---- ====== Étape 17 — Runtime ====== ===== Supporter ===== Manifest Permissions Lifecycle Hooks Sandbox Isolation ---- ====== Étape 18 — Méthodes ====== registerExtension() loadExtension() executeExtension() validateManifest() ---- ====== Sprint 10-B.1-F ====== ===== Embedded Apps ===== ---- ====== Étape 19 — Embedded Apps ====== ===== Supporter ===== iFrame Apps Micro Frontends Remote Modules Widget Embedding ---- ====== Étape 20 — Sécurité ====== CSP Sandbox OAuth Context Scoped Permissions Tenant Isolation ---- ====== Étape 21 — Exemple Manifest ====== { "name":"Revenue Optimizer", "version":"1.0.0", "permissions":[ "analytics.read", "property.read" ], "extensions":[ { "type":"widget", "location":"dashboard" } ] } ---- ====== Sprint 10-B.1-G ====== ===== Plugin SDK ===== ---- ====== Étape 22 — PluginSDKService ====== ===== Créer ===== plugin-sdk.service.ts ---- ===== Fournir ===== TypeScript SDK React SDK REST SDK Webhook SDK Event SDK ---- ====== Étape 23 — Exemple ====== import { AppSDK } from '@platform/sdk'; const sdk = new AppSDK(); sdk.dashboard.registerWidget({ id: 'revenue-widget' }); ---- ====== Étape 24 — Capacités ====== API Access Events Storage Notifications UI Extensions ---- ====== Sprint 10-B.1-H ====== ===== App Management ===== ---- ====== Étape 25 — AppManagementService ====== ===== Créer ===== app-management.service.ts ---- ===== Gérer ===== Versions Permissions Usage Errors Licensing ---- ====== Étape 26 — Monitoring ====== ===== Mesurer ===== Installs Active Apps Crashes Latency Usage ---- ====== Sprint 10-B.1-I ====== ===== API Marketplace ===== ---- ====== Étape 27 — Endpoints ====== GET /marketplace/apps GET /marketplace/apps/{id} POST /marketplace/apps POST /marketplace/apps/{id}/publish POST /marketplace/installations DELETE /marketplace/installations/{id} GET /marketplace/analytics ---- ====== Étape 28 — Exemple ====== { "app":"Revenue Optimizer", "category":"ANALYTICS", "installs":824, "rating":4.8, "verified":true } ---- ====== Sprint 10-B.1-J ====== ===== Gouvernance ===== ---- ====== Étape 29 — Permissions ====== marketplace.read marketplace.publish marketplace.install marketplace.manage marketplace.analytics marketplace.admin ---- ====== Étape 30 — Audit ====== APP_PUBLISHED APP_VERIFIED APP_INSTALLED APP_UNINSTALLED EXTENSION_REGISTERED SDK_GENERATED ---- ====== Étape 31 — Jobs ====== Toutes les heures Marketplace Analytics Refresh Toutes les nuits App Health Check Permission Audit Version Compatibility Scan ---- ====== Préparation Sprint 10-B.2 ====== Compatible avec : Partner Ecosystem Monetization Billing Marketplace Revenue Sharing App Store Economy ---- ====== Définition de terminé ====== Le Sprint 10-B.1 est terminé lorsque : ✓ App Marketplace créé ✓ App Installation créée ✓ Extension Framework créé ✓ Embedded Apps créées ✓ Plugin SDK créé ✓ App Management créé ✓ Marketplace Platform opérationnelle ---- ====== Livrables ====== MarketplaceApp AppInstallation AppPermission AppExtension AppUsageMetric MarketplaceAppService AppInstallationService ExtensionFrameworkService PluginSDKService MarketplaceAnalyticsService AppManagementService Marketplace Platform ---- ====== Sprint 10-B.2 — Marketplace Monetization & Partner Ecosystem ====== ===== Objectif ===== Finaliser l'écosystème Marketplace Enterprise en ajoutant la monétisation, la gestion des partenaires et l'économie applicative. Cette couche permet : App Billing Subscriptions Revenue Sharing Partner Portal App Analytics Marketplace Economy afin de créer une plateforme économique complète autour du Marketplace. À l'issue de cette étape : ✓ App Billing ✓ Subscriptions ✓ Revenue Sharing ✓ Partner Portal ✓ App Analytics ✓ Marketplace Economy ✓ Partner Ecosystem Platform ---- ====== Architecture cible ====== Marketplace Platform ↓ Marketplace Economy Layer ├── Billing Engine ├── Subscription Management ├── Revenue Sharing ├── Partner Portal ├── Marketplace Analytics ├── Payout Engine └── Ecosystem Intelligence ↓ Partners Developers Vendors Integrators ---- ====== Sprint 10-B.2-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — MarketplaceSubscription ====== ===== Ajouter dans schema.prisma ===== model MarketplaceSubscription { id String @id @default(uuid()) tenantId String appId String planCode String status SubscriptionStatus monthlyPrice Decimal @db.Decimal(14,2) startedAt DateTime expiresAt DateTime? cancelledAt DateTime? createdAt DateTime @default(now()) @@index([tenantId]) @@index([appId]) @@index([status]) } ---- ====== Étape 2 — MarketplaceInvoice ====== ===== Ajouter ===== model MarketplaceInvoice { id String @id @default(uuid()) subscriptionId String invoiceNumber String @unique amount Decimal @db.Decimal(14,2) currency String status InvoiceStatus dueDate DateTime paidAt DateTime? createdAt DateTime @default(now()) @@index([subscriptionId]) @@index([status]) } ---- ====== Étape 3 — RevenueShare ====== ===== Ajouter ===== model RevenueShare { id String @id @default(uuid()) appId String partnerId String grossRevenue Decimal @db.Decimal(14,2) platformFee Decimal @db.Decimal(14,2) partnerRevenue Decimal @db.Decimal(14,2) settlementPeriod String calculatedAt DateTime @default(now()) @@index([appId]) @@index([partnerId]) } ---- ====== Étape 4 — PartnerProfile ====== ===== Ajouter ===== model PartnerProfile { id String @id @default(uuid()) companyName String legalName String? website String? contactEmail String status PartnerStatus verificationStatus VerificationStatus joinedAt DateTime @default(now()) @@index([status]) @@index([verificationStatus]) } ---- ====== Étape 5 — MarketplacePayout ====== ===== Ajouter ===== model MarketplacePayout { id String @id @default(uuid()) partnerId String payoutPeriod String amount Decimal @db.Decimal(14,2) currency String status PayoutStatus processedAt DateTime? createdAt DateTime @default(now()) @@index([partnerId]) @@index([status]) } ---- ====== Étape 6 — MarketplaceAnalyticsSnapshot ====== ===== Ajouter ===== model MarketplaceAnalyticsSnapshot { id String @id @default(uuid()) snapshotDate DateTime totalApps Int activeSubscriptions Int monthlyRevenue Decimal @db.Decimal(14,2) partnerRevenue Decimal @db.Decimal(14,2) activePartners Int createdAt DateTime @default(now()) @@index([snapshotDate]) } ---- ====== Étape 7 — Enums ====== ===== Ajouter ===== enum SubscriptionStatus { TRIAL ACTIVE PAST_DUE CANCELLED EXPIRED } enum InvoiceStatus { DRAFT ISSUED PAID VOID OVERDUE } enum PartnerStatus { ACTIVE SUSPENDED TERMINATED } enum VerificationStatus { PENDING VERIFIED REJECTED } enum PayoutStatus { PENDING PROCESSING COMPLETED FAILED } ---- ====== Étape 8 — Migration ====== npx prisma migrate dev \ --name marketplace_monetization ---- ====== Sprint 10-B.2-B ====== ===== Marketplace Economy Module ===== ---- ====== Étape 9 — Structure ====== src/modules/marketplace-economy ├── billing ├── subscriptions ├── revenue-sharing ├── partners ├── payouts ├── analytics └── marketplace-economy.module.ts ---- ====== Étape 10 — Services ====== MarketplaceBillingService SubscriptionService RevenueSharingService PartnerPortalService PayoutService MarketplaceEconomyAnalyticsService ---- ====== Sprint 10-B.2-C ====== ===== App Billing ===== ---- ====== Étape 11 — MarketplaceBillingService ====== ===== Créer ===== marketplace-billing.service.ts ---- ===== Supporter ===== Free Subscription Usage-Based Hybrid Enterprise Contract ---- ====== Étape 12 — Méthodes ====== createInvoice() collectPayment() refundInvoice() generateBillingCycle() ---- ====== Étape 13 — Intégration ====== ===== Utiliser ===== Stripe Invoices Taxes Payment Methods ---- ====== Sprint 10-B.2-D ====== ===== Subscription Management ===== ---- ====== Étape 14 — SubscriptionService ====== ===== Créer ===== subscription.service.ts ---- ===== Supporter ===== Trial Monthly Annual Enterprise ---- ====== Étape 15 — Méthodes ====== startSubscription() upgradePlan() downgradePlan() cancelSubscription() renewSubscription() ---- ====== Étape 16 — Plans ====== Starter Professional Business Enterprise ---- ====== Sprint 10-B.2-E ====== ===== Revenue Sharing ===== ---- ====== Étape 17 — RevenueSharingService ====== ===== Créer ===== revenue-sharing.service.ts ---- ===== Supporter ===== 70/30 80/20 85/15 Custom Contracts ---- ====== Étape 18 — Méthodes ====== calculateRevenueShare() generateSettlement() calculatePartnerRevenue() reconcileRevenue() ---- ====== Étape 19 — Exemple ====== 1000 € ↓ Plateforme 20% ↓ Partenaire 80% ---- ====== Sprint 10-B.2-F ====== ===== Partner Portal ===== ---- ====== Étape 20 — PartnerPortalService ====== ===== Créer ===== partner-portal.service.ts ---- ===== Fournir ===== Applications Revenue Installs Subscriptions Payouts Analytics ---- ====== Étape 21 — Dashboard ====== ===== Afficher ===== MRR ARR Installs Active Customers Revenue Share ---- ====== Étape 22 — Vérification ====== ===== Supporter ===== KYC Tax Forms Identity Bank Accounts ---- ====== Sprint 10-B.2-G ====== ===== Payout Engine ===== ---- ====== Étape 23 — PayoutService ====== ===== Créer ===== payout.service.ts ---- ===== Supporter ===== Bank Transfer SEPA ACH Stripe Connect ---- ====== Étape 24 — Méthodes ====== generatePayout() approvePayout() executePayout() trackPayout() ---- ====== Étape 25 — Cycle ====== Monthly Bi-Monthly Quarterly ---- ====== Sprint 10-B.2-H ====== ===== Marketplace Analytics ===== ---- ====== Étape 26 — MarketplaceEconomyAnalyticsService ====== ===== Créer ===== marketplace-economy-analytics.service.ts ---- ===== Mesurer ===== Marketplace MRR Marketplace ARR Partner Revenue Install Growth App Retention Revenue Per App ---- ====== Étape 27 — KPIs ====== Marketplace GMV Take Rate Partner LTV Partner Churn Subscription Growth ---- ====== Sprint 10-B.2-I ====== ===== API Marketplace Economy ===== ---- ====== Étape 28 — Endpoints ====== GET /marketplace/partners POST /marketplace/partners GET /marketplace/subscriptions POST /marketplace/subscriptions GET /marketplace/payouts GET /marketplace/revenue-sharing GET /marketplace/economy/dashboard ---- ====== Étape 29 — Exemple ====== { "marketplaceMrr":125000, "activePartners":84, "monthlyPayouts":92000, "takeRate":18.4, "subscriptionGrowth":12.8 } ---- ====== Sprint 10-B.2-J ====== ===== Gouvernance ===== ---- ====== Étape 30 — Permissions ====== marketplace.partner.read marketplace.partner.manage marketplace.billing.manage marketplace.payout.manage marketplace.economy.read marketplace.admin ---- ====== Étape 31 — Audit ====== PARTNER_REGISTERED PARTNER_VERIFIED SUBSCRIPTION_STARTED INVOICE_GENERATED PAYOUT_EXECUTED REVENUE_SHARE_CALCULATED ---- ====== Étape 32 — Jobs ====== Toutes les nuits Revenue Share Calculation Billing Cycle Processing Subscription Renewal Marketplace KPI Refresh Toutes les semaines Partner Health Review ---- ====== Clôture Sprint 10 ====== À la fin du Sprint 10-B.2 : ✓ Developer Platform ✓ Integration Platform ✓ Marketplace Platform ✓ Marketplace Economy ✓ Partner Portal ✓ Revenue Sharing ✓ Ecosystem Platform sont entièrement opérationnels. ---- ====== Préparation Sprint 11 ====== Compatible avec : Enterprise Platform Operations Observability SRE Platform Reliability Security Operations Compliance Operations ---- ====== Définition de terminé ====== Le Sprint 10-B.2 est terminé lorsque : ✓ App Billing créé ✓ Subscription Management créé ✓ Revenue Sharing créé ✓ Partner Portal créé ✓ Marketplace Analytics créé ✓ Marketplace Economy finalisée ---- ====== Livrables ====== MarketplaceSubscription MarketplaceInvoice RevenueShare PartnerProfile MarketplacePayout MarketplaceAnalyticsSnapshot MarketplaceBillingService SubscriptionService RevenueSharingService PartnerPortalService PayoutService MarketplaceEconomyAnalyticsService Marketplace Economy Platform