====== Sprint 5 — Réservations ====== ===== Objectif ===== Implémenter le cœur transactionnel de la plateforme. Ce sprint transforme la plateforme Property Management en véritable plateforme de réservation exploitable. À l'issue du Sprint 5 : ✓ Reservation ✓ Guest ✓ Booking Workflow ✓ Check-In ✓ Check-Out ✓ Payments Integration ✓ Billing ✓ Stay Management ✓ Reservation Intelligence ---- ====== Architecture cible ====== Customer ↓ Reservation ↓ Booking Workflow ↓ Payment ↓ Check-In ↓ Stay Management ↓ Check-Out ↓ Billing ↓ Analytics ---- ====== Domaines métier ====== Le Sprint 5 introduit les domaines suivants : Reservation Guest ReservationGuest ReservationPayment ReservationInvoice ReservationTimeline CheckIn CheckOut Stay ReservationDocument ---- ====== Sous-sprints ====== ===== Sprint 5-A ===== Fondation Réservation Reservation Core Guest Management Reservation Lifecycle Workflow Engine ---- ===== Sprint 5-B ===== Paiement & Facturation Payment Integration Invoices Refunds Transactions ---- ===== Sprint 5-C ===== Check-In / Check-Out Arrival Workflow Departure Workflow Digital Check-In Stay Tracking ---- ===== Sprint 5-D ===== Exploitation Séjour Guest Requests Incidents Housekeeping Maintenance ---- ===== Sprint 5-E ===== Reservation Intelligence Reservation Analytics Fraud Detection Booking Insights Forecasting ---- ====== Livrables fin Sprint 5 ====== Reservation Engine Booking Workflow Engine Payment Platform Invoice Engine Check-In Platform Stay Management Reservation Analytics Enterprise Booking System ---- ====== Sprint 5-A.1 — Implémentation Prisma Reservation Core ====== ===== Objectif ===== Créer le cœur du moteur de réservation. Cette couche constitue la fondation transactionnelle de toute la plateforme. À l'issue de cette étape : ✓ Reservation ✓ Guest ✓ ReservationGuest ✓ Multi-tenant ✓ Property Ready ✓ Customer Ready ✓ Payment Ready ✓ Analytics Ready ---- ====== Architecture cible ====== Customer ↓ Reservation ↓ ReservationGuest ↓ Guests ↓ Payments ↓ Check-In ---- ====== Sprint 5-A.1-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — Création Reservation ====== ===== Ajouter dans schema.prisma ===== model Reservation { id String @id @default(uuid()) tenantId String propertyId String customerId String reservationNumber String @unique status ReservationStatus source ReservationSource checkInDate DateTime checkOutDate DateTime nights Int adults Int @default(1) children Int @default(0) infants Int @default(0) totalGuests Int currency String @default("EUR") subtotalAmount Decimal @db.Decimal(12,2) taxesAmount Decimal @db.Decimal(12,2) feesAmount Decimal @db.Decimal(12,2) discountAmount Decimal @db.Decimal(12,2) @default(0) totalAmount Decimal @db.Decimal(12,2) paidAmount Decimal @db.Decimal(12,2) @default(0) notes String? internalNotes String? confirmedAt DateTime? cancelledAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation( fields:[tenantId], references:[id] ) property Property @relation( fields:[propertyId], references:[id] ) customer Customer @relation( fields:[customerId], references:[id] ) guests ReservationGuest[] @@index([tenantId]) @@index([propertyId]) @@index([customerId]) @@index([status]) @@index([checkInDate]) @@index([checkOutDate]) @@index([reservationNumber]) } ---- ====== Étape 2 — Création Guest ====== ===== Ajouter ===== model Guest { id String @id @default(uuid()) tenantId String firstName String lastName String email String? phone String? dateOfBirth DateTime? nationality String? documentType String? documentNumber String? emergencyContact String? emergencyPhone String? notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation( fields:[tenantId], references:[id] ) reservations ReservationGuest[] @@index([tenantId]) @@index([email]) @@index([lastName]) @@index([documentNumber]) } ---- ====== Étape 3 — Création ReservationGuest ====== ===== Ajouter ===== model ReservationGuest { id String @id @default(uuid()) reservationId String guestId String isPrimaryGuest Boolean @default(false) createdAt DateTime @default(now()) reservation Reservation @relation( fields:[reservationId], references:[id], onDelete:Cascade ) guest Guest @relation( fields:[guestId], references:[id], onDelete:Cascade ) @@unique([ reservationId, guestId ]) @@index([reservationId]) @@index([guestId]) } ---- ====== Sprint 5-A.1-B ====== ===== Enums ===== ---- ====== Étape 4 — ReservationStatus ====== ===== Ajouter ===== enum ReservationStatus { DRAFT PENDING CONFIRMED CHECKED_IN CHECKED_OUT COMPLETED CANCELLED NO_SHOW } ---- ====== Étape 5 — ReservationSource ====== ===== Ajouter ===== enum ReservationSource { DIRECT WEBSITE MOBILE_APP AIRBNB BOOKING EXPEDIA MANUAL API } ---- ====== Sprint 5-A.1-C ====== ===== Relations Existantes ===== ---- ====== Étape 6 — Customer ====== ===== Ajouter ===== reservations Reservation[] ---- ====== Étape 7 — Property ====== ===== Ajouter ===== reservations Reservation[] ---- ====== Étape 8 — Tenant ====== ===== Ajouter ===== reservations Reservation[] guests Guest[] ---- ====== Sprint 5-A.1-D ====== ===== Contraintes Métier ===== ---- ====== Étape 9 — Validation ====== ===== Vérifier ===== checkInDate < checkOutDate ---- ====== Étape 10 — Vérifier ====== ===== Calcul automatique ===== nights = checkOutDate - checkInDate ---- ====== Étape 11 — Vérifier ====== ===== Calcul automatique ===== totalGuests = adults + children + infants ---- ====== Étape 12 — Prévenir ====== ===== Double réservation ===== via : PropertyAvailability Reservation Engine ---- ====== Sprint 5-A.1-E ====== ===== Indexation Enterprise ===== ---- ====== Étape 13 — Ajouter ===== @@index([ tenantId, status ]) @@index([ propertyId, checkInDate ]) @@index([ propertyId, checkOutDate ]) @@index([ customerId, createdAt ]) ---- ====== Étape 14 — Recherche ====== Optimiser : Réservation Client Propriété Date Statut ---- ====== Sprint 5-A.1-F ====== ===== Analytics Ready ===== ---- ====== Étape 15 — Préparer ===== Compatible avec : Occupancy Analytics Revenue Analytics Booking Analytics Forecasting ---- ====== Étape 16 — Préparer ===== Compatible avec : Customer Analytics Guest Analytics Travel Patterns ---- ====== Sprint 5-A.1-G ====== ===== Migration ===== ---- ====== Étape 17 — Générer ===== npx prisma migrate dev \ --name reservation_core ---- ====== Étape 18 — Générer ===== npx prisma generate ---- ====== Étape 19 — Vérifier ===== npx prisma studio Présence de : Reservation Guest ReservationGuest ---- ====== Définition de terminé ====== Le Sprint 5-A.1 est terminé lorsque : ✓ Reservation créé ✓ Guest créé ✓ ReservationGuest créé ✓ Enums créés ✓ Relations créées ✓ Multi-tenant Ready ✓ Payment Ready ✓ Analytics Ready ✓ Migration exécutée ---- ====== Livrables ====== Reservation Guest ReservationGuest ReservationStatus ReservationSource Reservation Core Schema ---- ====== Sprint 5-A.2 — Workflow de Réservation & Lifecycle ====== ===== Objectif ===== Transformer le modèle Reservation en véritable moteur transactionnel Enterprise. Cette couche gère : Lifecycle Workflow Automatisation Audit Historique Orchestration de toutes les réservations. À l'issue de cette étape : ✓ ReservationTimeline ✓ ReservationEvent ✓ ReservationWorkflow ✓ Status Machine ✓ Lifecycle Automation ✓ Audit Trail ✓ Booking Orchestration Engine ---- ====== Architecture cible ====== Reservation ↓ Workflow Engine ├── State Machine ├── Timeline ├── Events ├── Automation ├── Notifications └── Audit Trail ↓ Payments ↓ Check-In ↓ Stay Management ---- ====== Sprint 5-A.2-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — ReservationTimeline ====== ===== Ajouter dans schema.prisma ===== model ReservationTimeline { id String @id @default(uuid()) reservationId String eventType ReservationEventType title String description String? metadata Json? createdBy String? createdAt DateTime @default(now()) reservation Reservation @relation( fields:[reservationId], references:[id], onDelete:Cascade ) @@index([reservationId]) @@index([eventType]) @@index([createdAt]) } ---- ====== Étape 2 — ReservationEvent ====== ===== Ajouter ===== model ReservationEvent { id String @id @default(uuid()) reservationId String eventType ReservationEventType oldStatus ReservationStatus? newStatus ReservationStatus? payload Json? processed Boolean @default(false) createdAt DateTime @default(now()) reservation Reservation @relation( fields:[reservationId], references:[id], onDelete:Cascade ) @@index([reservationId]) @@index([processed]) @@index([eventType]) } ---- ====== Étape 3 — ReservationWorkflow ====== ===== Ajouter ===== model ReservationWorkflow { reservationId String @id currentStatus ReservationStatus lastTransitionAt DateTime? workflowVersion String @default("1.0") automated Boolean @default(true) updatedAt DateTime @updatedAt reservation Reservation @relation( fields:[reservationId], references:[id], onDelete:Cascade ) } ---- ====== Étape 4 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name reservation_workflow ---- ====== Sprint 5-A.2-B ====== ===== Workflow Engine ===== ---- ====== Étape 5 — Création Module ====== src/modules/reservation-workflow ├── workflow │ ├── state-machine │ ├── timeline │ ├── events │ ├── automation │ └── reservation-workflow.module.ts ---- ====== Étape 6 — Services ====== ===== Créer ===== ReservationWorkflowService ReservationStateMachineService ReservationTimelineService ReservationEventService ReservationAutomationService ---- ====== Sprint 5-A.2-C ====== ===== State Machine ===== ---- ====== Étape 7 — Définir le Workflow ====== DRAFT ↓ PENDING ↓ CONFIRMED ↓ CHECKED_IN ↓ CHECKED_OUT ↓ COMPLETED ---- ====== Étape 8 — États alternatifs ====== PENDING ↓ CANCELLED ---- CONFIRMED ↓ NO_SHOW ---- ====== Étape 9 — Transitions autorisées ====== const transitions = { DRAFT: [ PENDING, CANCELLED ], PENDING: [ CONFIRMED, CANCELLED ], CONFIRMED: [ CHECKED_IN, CANCELLED, NO_SHOW ], CHECKED_IN: [ CHECKED_OUT ], CHECKED_OUT: [ COMPLETED ] }; ---- ====== Étape 10 — Validation ====== ===== Refuser ===== toute transition invalide. ---- ====== Sprint 5-A.2-D ====== ===== Timeline ===== ---- ====== Étape 11 — Timeline Service ====== ===== Créer ===== reservation-timeline.service.ts ---- ===== Méthodes ===== addEvent() getTimeline() buildHistory() ---- ====== Étape 12 — Historiser ====== Création Confirmation Paiement Check-In Check-Out Annulation ---- ====== Étape 13 — Exemple ====== { "event":"CONFIRMED", "timestamp":"2027-01-10T12:00:00Z" } ---- ====== Sprint 5-A.2-E ====== ===== Event Bus ===== ---- ====== Étape 14 — ReservationEventService ====== ===== Créer ===== reservation-event.service.ts ---- ===== Émettre ===== RESERVATION_CREATED RESERVATION_CONFIRMED RESERVATION_CANCELLED CHECKIN_STARTED CHECKOUT_COMPLETED ---- ====== Étape 15 — Préparer ====== Compatible avec : Payments Notifications Invoices Analytics ---- ====== Étape 16 — Pattern ====== ===== Utiliser ===== Domain Events pour les futurs microservices. ---- ====== Sprint 5-A.2-F ====== ===== Lifecycle Automation ===== ---- ====== Étape 17 — ReservationAutomationService ====== ===== Créer ===== reservation-automation.service.ts ---- ===== Automatiser ===== Confirmation Reminders Check-In Check-Out Completion ---- ====== Étape 18 — Jobs ====== ===== Ajouter ===== J-7 Arrival Reminder J-1 Arrival Reminder Check-In Reminder Check-Out Reminder ---- ====== Étape 19 — Auto-completion ====== ===== Passer ===== CHECKED_OUT ↓ COMPLETED après validation du séjour. ---- ====== Sprint 5-A.2-G ====== ===== Audit Trail ===== ---- ====== Étape 20 — Audit Intégral ====== ===== Journaliser ===== Status Change User Action System Action Automation Action ---- ====== Étape 21 — Exemple ====== Reservation #RSV-1001 CONFIRMED Par : Admin Le : 2027-01-05 14:32 ---- ====== Étape 22 — Intégration ====== ===== Réutiliser ===== AuditLog AuditModule déjà présent dans la plateforme. ---- ====== Sprint 5-A.2-H ====== ===== API Workflow ===== ---- ====== Étape 23 — Endpoints ====== ===== Ajouter ===== GET /reservations/{id}/timeline GET /reservations/{id}/workflow POST /reservations/{id}/confirm POST /reservations/{id}/cancel POST /reservations/{id}/check-in POST /reservations/{id}/check-out POST /reservations/{id}/complete ---- ====== Étape 24 — Exemple ====== ===== Workflow ===== { "status":"CONFIRMED", "lastTransitionAt":"2027-01-05T14:32:00Z" } ---- ====== Sprint 5-A.2-I ====== ===== Sécurité ===== ---- ====== Étape 25 — Permissions ====== ===== Ajouter ===== reservation.read reservation.create reservation.update reservation.cancel reservation.checkin reservation.checkout reservation.workflow ---- ====== Étape 26 — Multi-Tenant ====== ===== Vérifier ===== sur toutes les transitions : tenantId propertyId reservationId ---- ====== Étape 27 — Idempotence ====== ===== Garantir ===== qu'un événement : CHECK_IN CHECK_OUT CONFIRM ne soit pas exécuté deux fois. ---- ====== Sprint 5-A.2-J ====== ===== Préparation Sprint 5-B ===== ---- ====== Étape 28 — Compatible ====== Préparer : Payment Intent Invoice Refund Transaction ---- ====== Étape 29 — Compatible ====== Préparer : Notifications Emails SMS Push ---- ====== Étape 30 — Compatible ====== Préparer : Reservation Analytics Fraud Detection Revenue Analytics ---- ====== Définition de terminé ====== Le Sprint 5-A.2 est terminé lorsque : ✓ ReservationTimeline créé ✓ ReservationEvent créé ✓ ReservationWorkflow créé ✓ State Machine opérationnelle ✓ Lifecycle Automation opérationnelle ✓ Audit Trail opérationnel ✓ Event Bus opérationnel ---- ====== Livrables ====== ReservationTimeline ReservationEvent ReservationWorkflow ReservationWorkflowService ReservationStateMachineService ReservationTimelineService ReservationEventService ReservationAutomationService Booking Workflow Engine ---- ====== Sprint 5-B.1 — Intégration Paiements ====== ===== Objectif ===== Connecter le moteur de réservation au moteur financier. Cette couche gère : Paiements Intentions de paiement Transactions Remboursements Webhooks Réconciliation pour toutes les réservations. À l'issue de cette étape : ✓ ReservationPayment ✓ PaymentIntent ✓ Transaction ✓ Refund ✓ Stripe Integration ✓ Webhook Processing ✓ Financial Transaction Engine ---- ====== Architecture cible ====== Reservation ↓ Payment Engine ├── Payment Intent ├── Transaction ├── Refund ├── Webhooks ├── Reconciliation └── Audit ↓ Invoice Engine ↓ Revenue Analytics ---- ====== Sprint 5-B.1-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — ReservationPayment ====== ===== Ajouter dans schema.prisma ===== model ReservationPayment { id String @id @default(uuid()) tenantId String reservationId String paymentProvider PaymentProvider paymentStatus PaymentStatus currency String @default("EUR") amount Decimal @db.Decimal(12,2) paidAmount Decimal @db.Decimal(12,2) @default(0) dueAmount Decimal @db.Decimal(12,2) externalReference String? paidAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt reservation Reservation @relation( fields:[reservationId], references:[id], onDelete:Cascade ) transactions PaymentTransaction[] refunds PaymentRefund[] @@index([tenantId]) @@index([reservationId]) @@index([paymentStatus]) } ---- ====== Étape 2 — PaymentIntent ====== ===== Ajouter ===== model PaymentIntent { id String @id @default(uuid()) reservationPaymentId String providerIntentId String @unique amount Decimal @db.Decimal(12,2) currency String clientSecret String? status PaymentIntentStatus expiresAt DateTime? createdAt DateTime @default(now()) @@index([providerIntentId]) @@index([status]) } ---- ====== Étape 3 — PaymentTransaction ====== ===== Ajouter ===== model PaymentTransaction { id String @id @default(uuid()) reservationPaymentId String transactionReference String @unique providerTransactionId String? amount Decimal @db.Decimal(12,2) currency String status TransactionStatus metadata Json? processedAt DateTime? createdAt DateTime @default(now()) @@index([transactionReference]) @@index([status]) } ---- ====== Étape 4 — PaymentRefund ====== ===== Ajouter ===== model PaymentRefund { id String @id @default(uuid()) reservationPaymentId String transactionId String? refundReference String @unique amount Decimal @db.Decimal(12,2) reason String? status RefundStatus refundedAt DateTime? createdAt DateTime @default(now()) @@index([refundReference]) @@index([status]) } ---- ====== Étape 5 — Enums ====== ===== Ajouter ===== enum PaymentProvider { STRIPE PAYPAL ADYEN MANUAL } enum PaymentStatus { PENDING PARTIALLY_PAID PAID FAILED REFUNDED CANCELLED } enum PaymentIntentStatus { REQUIRES_PAYMENT_METHOD REQUIRES_CONFIRMATION PROCESSING SUCCEEDED CANCELED } enum TransactionStatus { PENDING SUCCESS FAILED CANCELLED } enum RefundStatus { PENDING PROCESSING COMPLETED FAILED } ---- ====== Étape 6 — Relations ====== ===== Ajouter dans Reservation ===== payments ReservationPayment[] ---- ====== Étape 7 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name reservation_payments ---- ====== Sprint 5-B.1-B ====== ===== Module Paiements ===== ---- ====== Étape 8 — Création ====== src/modules/payments ├── stripe │ ├── intents │ ├── transactions │ ├── refunds │ ├── webhooks │ └── payments.module.ts ---- ====== Étape 9 — Services ====== ===== Créer ===== PaymentService StripePaymentService PaymentIntentService TransactionService RefundService WebhookService ---- ====== Sprint 5-B.1-C ====== ===== Stripe Integration ===== ---- ====== Étape 10 — Installation ====== npm install stripe ---- ====== Étape 11 — Variables ====== ===== Ajouter ===== STRIPE_SECRET_KEY= STRIPE_WEBHOOK_SECRET= STRIPE_PUBLISHABLE_KEY= ---- ====== Étape 12 — StripePaymentService ====== ===== Créer ===== stripe-payment.service.ts ---- ===== Méthodes ===== createPaymentIntent() confirmPayment() cancelPayment() retrievePayment() ---- ====== Étape 13 — Création Intent ====== ===== Exemple ===== const intent = await stripe.paymentIntents.create({ amount: 12500, currency: 'eur', metadata: { reservationId } }); ---- ====== Sprint 5-B.1-D ====== ===== Paiement Réservation ===== ---- ====== Étape 14 — PaymentService ====== ===== Créer ===== payment.service.ts ---- ===== Méthodes ===== createReservationPayment() payReservation() capturePayment() cancelPayment() ---- ====== Étape 15 — Workflow ====== Reservation ↓ Payment Intent ↓ Stripe ↓ Webhook ↓ PAID ---- ====== Étape 16 — Mise à jour ====== ===== Synchroniser ===== Reservation.paidAmount ReservationPayment.status automatiquement. ---- ====== Sprint 5-B.1-E ====== ===== Transactions ===== ---- ====== Étape 17 — TransactionService ====== ===== Créer ===== transaction.service.ts ---- ===== Journaliser ===== Authorization Capture Failure Cancellation ---- ====== Étape 18 — Réconciliation ====== ===== Vérifier ===== Stripe = Base locale ---- ====== Étape 19 — Référence ====== ===== Générer ===== TX-2027-000001 pour chaque transaction. ---- ====== Sprint 5-B.1-F ====== ===== Remboursements ===== ---- ====== Étape 20 — RefundService ====== ===== Créer ===== refund.service.ts ---- ===== Méthodes ===== createRefund() approveRefund() executeRefund() ---- ====== Étape 21 — Supporter ===== Full Refund Partial Refund Policy Refund ---- ====== Étape 22 — Exemple ====== Paiement 500 € ↓ Refund 100 € ---- ====== Sprint 5-B.1-G ====== ===== Webhooks ===== ---- ====== Étape 23 — WebhookController ====== ===== Créer ===== webhook.controller.ts ---- ====== Étape 24 — Endpoint ====== ===== Ajouter ===== POST /payments/webhooks/stripe ---- ====== Étape 25 — Traiter ====== payment_intent.succeeded payment_intent.payment_failed charge.refunded charge.dispute.created ---- ====== Étape 26 — Sécuriser ====== ===== Vérifier ===== STRIPE_WEBHOOK_SECRET avant traitement. ---- ====== Sprint 5-B.1-H ====== ===== API Paiements ===== ---- ====== Étape 27 — Endpoints ====== ===== Ajouter ===== POST /reservations/{id}/payments GET /reservations/{id}/payments POST /payments/intents POST /payments/{id}/capture POST /payments/{id}/refund GET /payments/{id}/transactions ---- ====== Étape 28 — Exemple ====== ===== Retour ===== { "paymentIntentId":"pi_xxx", "clientSecret":"secret_xxx" } ---- ====== Sprint 5-B.1-I ====== ===== Sécurité ===== ---- ====== Étape 29 — Permissions ====== ===== Ajouter ===== payment.read payment.create payment.capture payment.refund payment.webhook payment.admin ---- ====== Étape 30 — Audit ====== ===== Journaliser ===== PAYMENT_CREATED PAYMENT_SUCCEEDED PAYMENT_FAILED REFUND_CREATED REFUND_COMPLETED WEBHOOK_RECEIVED ---- ====== Étape 31 — Idempotence ====== ===== Garantir ===== pour : Webhooks Captures Refunds afin d'éviter les doublons. ---- ====== Sprint 5-B.1-J ====== ===== Préparation Sprint 5-B.2 ===== ---- ====== Étape 32 — Compatible ====== Préparer : Invoices Credit Notes Taxes Accounting ---- ====== Étape 33 — Compatible ====== Préparer : Multi Currency Payment Plans Installments Deposit Payments ---- ====== Définition de terminé ====== Le Sprint 5-B.1 est terminé lorsque : ✓ ReservationPayment créé ✓ PaymentIntent créé ✓ PaymentTransaction créé ✓ PaymentRefund créé ✓ Stripe intégré ✓ Webhooks intégrés ✓ Refunds intégrés ✓ Audit intégré ---- ====== Livrables ====== ReservationPayment PaymentIntent PaymentTransaction PaymentRefund StripePaymentService PaymentService RefundService WebhookService Enterprise Payment Platform ---- ====== Sprint 5-B.2 — Facturation Enterprise & Comptabilité ====== ===== Objectif ===== Transformer le moteur de paiement en plateforme financière Enterprise. Cette couche gère : Facturation Avoirs Fiscalité Comptabilité Conformité financière Exports ERP À l'issue de cette étape : ✓ Invoice ✓ InvoiceLine ✓ CreditNote ✓ Tax Engine ✓ Accounting Export ✓ Financial Compliance ✓ Financial Platform ---- ====== Architecture cible ====== Reservation ↓ Payment ↓ Invoice Engine ├── Invoices ├── Invoice Lines ├── Credit Notes ├── Tax Engine ├── Accounting └── Compliance ↓ ERP ↓ Financial Reporting ---- ====== Sprint 5-B.2-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — Invoice ====== ===== Ajouter dans schema.prisma ===== model Invoice { id String @id @default(uuid()) tenantId String reservationId String? customerId String invoiceNumber String @unique status InvoiceStatus currency String @default("EUR") issueDate DateTime dueDate DateTime? subtotalAmount Decimal @db.Decimal(14,2) taxAmount Decimal @db.Decimal(14,2) totalAmount Decimal @db.Decimal(14,2) paidAmount Decimal @db.Decimal(14,2) @default(0) notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt lines InvoiceLine[] creditNotes CreditNote[] @@index([tenantId]) @@index([reservationId]) @@index([customerId]) @@index([status]) } ---- ====== Étape 2 — InvoiceLine ====== ===== Ajouter ===== model InvoiceLine { id String @id @default(uuid()) invoiceId String description String quantity Decimal @db.Decimal(10,2) unitPrice Decimal @db.Decimal(12,2) taxRate Decimal @db.Decimal(5,2) totalAmount Decimal @db.Decimal(14,2) createdAt DateTime @default(now()) invoice Invoice @relation( fields:[invoiceId], references:[id], onDelete:Cascade ) @@index([invoiceId]) } ---- ====== Étape 3 — CreditNote ====== ===== Ajouter ===== model CreditNote { id String @id @default(uuid()) tenantId String invoiceId String creditNoteNumber String @unique reason String amount Decimal @db.Decimal(14,2) status CreditNoteStatus issuedAt DateTime createdAt DateTime @default(now()) invoice Invoice @relation( fields:[invoiceId], references:[id] ) @@index([tenantId]) @@index([invoiceId]) @@index([status]) } ---- ====== Étape 4 — AccountingExport ====== ===== Ajouter ===== model AccountingExport { id String @id @default(uuid()) tenantId String exportType AccountingExportType fileName String status ExportStatus generatedAt DateTime? createdAt DateTime @default(now()) @@index([tenantId]) @@index([exportType]) @@index([status]) } ---- ====== Étape 5 — Enums ====== ===== Ajouter ===== enum InvoiceStatus { DRAFT ISSUED PARTIALLY_PAID PAID OVERDUE CANCELLED } enum CreditNoteStatus { DRAFT ISSUED APPLIED CANCELLED } enum AccountingExportType { CSV FEC SAGE CEGID QUICKBOOKS XERO } enum ExportStatus { PENDING PROCESSING COMPLETED FAILED } ---- ====== Étape 6 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name invoicing_accounting ---- ====== Sprint 5-B.2-B ====== ===== Invoice Module ===== ---- ====== Étape 7 — Création ====== src/modules/invoicing ├── invoices │ ├── credit-notes │ ├── taxes │ ├── exports │ ├── compliance │ └── invoicing.module.ts ---- ====== Étape 8 — Services ====== ===== Créer ===== InvoiceService InvoiceLineService CreditNoteService TaxEngineService AccountingExportService FinancialComplianceService ---- ====== Sprint 5-B.2-C ====== ===== Génération de Factures ===== ---- ====== Étape 9 — InvoiceService ====== ===== Créer ===== invoice.service.ts ---- ===== Méthodes ===== createInvoice() issueInvoice() markAsPaid() cancelInvoice() generatePdf() ---- ====== Étape 10 — Numérotation ====== ===== Générer ===== INV-2027-000001 de manière séquentielle. ---- ====== Étape 11 — Facturation Réservation ====== ===== Générer automatiquement ===== après : Reservation Confirmed ou Payment Completed selon configuration. ---- ====== Sprint 5-B.2-D ====== ===== Tax Engine ===== ---- ====== Étape 12 — TaxEngineService ====== ===== Créer ===== tax-engine.service.ts ---- ===== Supporter ===== TVA France TVA UE Taxe de séjour Taxes locales Exonérations ---- ====== Étape 13 — TaxRule ====== ===== Ajouter ===== model TaxRule { id String @id @default(uuid()) countryCode String regionCode String? taxType String rate Decimal @db.Decimal(6,3) active Boolean @default(true) createdAt DateTime @default(now()) @@index([countryCode]) @@index([taxType]) } ---- ====== Étape 14 — Calcul ====== ===== Supporter ===== HT TVA TTC pour toutes les factures. ---- ====== Sprint 5-B.2-E ====== ===== Avoirs ===== ---- ====== Étape 15 — CreditNoteService ====== ===== Créer ===== credit-note.service.ts ---- ===== Méthodes ===== createCreditNote() applyCreditNote() cancelCreditNote() ---- ====== Étape 16 — Cas d'usage ====== Annulation Remboursement Erreur facturation Geste commercial ---- ====== Étape 17 — Exemple ====== Facture 500 € ↓ Avoir 100 € ---- ====== Sprint 5-B.2-F ====== ===== Exports Comptables ===== ---- ====== Étape 18 — AccountingExportService ====== ===== Créer ===== accounting-export.service.ts ---- ===== Formats ===== CSV Excel FEC Sage Cegid QuickBooks Xero ---- ====== Étape 19 — Endpoints ====== ===== Ajouter ===== POST /accounting/exports GET /accounting/exports GET /accounting/exports/{id} ---- ====== Étape 20 — Jobs ====== ===== Générer ===== exports mensuels automatiques. ---- ====== Sprint 5-B.2-G ====== ===== Conformité Financière ===== ---- ====== Étape 21 — FinancialComplianceService ====== ===== Créer ===== financial-compliance.service.ts ---- ===== Contrôler ===== Numérotation Intégrité TVA Archivage Traçabilité ---- ====== Étape 22 — Audit ====== ===== Garantir ===== l'immutabilité des factures émises. ---- ====== Étape 23 — Archivage ====== ===== Supporter ===== PDF/A Stockage S3 Conservation légale ---- ====== Sprint 5-B.2-H ====== ===== API Facturation ===== ---- ====== Étape 24 — Endpoints ====== ===== Ajouter ===== GET /invoices GET /invoices/{id} POST /invoices POST /invoices/{id}/issue POST /invoices/{id}/pay POST /credit-notes GET /credit-notes ---- ====== Étape 25 — Exemple ====== ===== Réponse ===== { "invoiceNumber":"INV-2027-000001", "status":"ISSUED", "totalAmount":1250.00 } ---- ====== Sprint 5-B.2-I ====== ===== Sécurité ===== ---- ====== Étape 26 — Permissions ====== ===== Ajouter ===== invoice.read invoice.create invoice.issue invoice.pay invoice.export creditnote.manage accounting.admin ---- ====== Étape 27 — Multi-Tenant ====== ===== Vérifier ===== sur : Invoice CreditNote AccountingExport ---- ====== Étape 28 — Audit ====== ===== Journaliser ===== INVOICE_CREATED INVOICE_ISSUED INVOICE_PAID CREDIT_NOTE_CREATED ACCOUNTING_EXPORT_GENERATED ---- ====== Sprint 5-B.2-J ====== ===== Préparation Sprint 5-C ===== ---- ====== Étape 29 — Compatible ====== Préparer : Check-In Check-Out Guest Identity Arrival Workflow ---- ====== Étape 30 — Compatible ====== Préparer : Revenue Recognition Financial Reporting BI Platform Enterprise ERP ---- ====== Définition de terminé ====== Le Sprint 5-B.2 est terminé lorsque : ✓ Invoice créé ✓ InvoiceLine créé ✓ CreditNote créé ✓ Tax Engine créé ✓ Exports comptables créés ✓ Conformité financière créée ✓ Audit intégré ---- ====== Livrables ====== Invoice InvoiceLine CreditNote TaxRule AccountingExport InvoiceService CreditNoteService TaxEngineService AccountingExportService FinancialComplianceService Enterprise Financial Platform ---- ====== Sprint 5-C.1 — Check-In Digital & Gestion des Arrivées ====== ===== Objectif ===== Implémenter l'expérience d'arrivée complète des voyageurs. Cette couche transforme la réservation confirmée en séjour actif. À l'issue de cette étape : ✓ CheckIn ✓ Guest Verification ✓ Identity Documents ✓ Arrival Workflow ✓ Digital Signature ✓ Arrival Dashboard ✓ Digital Arrival Platform ---- ====== Architecture cible ====== Reservation ↓ Arrival Workflow ├── Guest Verification ├── Identity Documents ├── Digital Signature ├── Check-In Validation ├── Key Delivery └── Arrival Dashboard ↓ Stay Management ↓ Check-Out ---- ====== Sprint 5-C.1-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — CheckIn ====== ===== Ajouter dans schema.prisma ===== model CheckIn { id String @id @default(uuid()) tenantId String reservationId String @unique status CheckInStatus scheduledAt DateTime? startedAt DateTime? completedAt DateTime? verified Boolean @default(false) signatureCompleted Boolean @default(false) notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt reservation Reservation @relation( fields:[reservationId], references:[id], onDelete:Cascade ) documents IdentityDocument[] @@index([tenantId]) @@index([status]) } ---- ====== Étape 2 — IdentityDocument ====== ===== Ajouter ===== model IdentityDocument { id String @id @default(uuid()) checkInId String guestId String documentType IdentityDocumentType documentNumber String? storagePath String verificationStatus VerificationStatus verifiedAt DateTime? createdAt DateTime @default(now()) checkIn CheckIn @relation( fields:[checkInId], references:[id], onDelete:Cascade ) @@index([checkInId]) @@index([guestId]) @@index([verificationStatus]) } ---- ====== Étape 3 — GuestVerification ====== ===== Ajouter ===== model GuestVerification { id String @id @default(uuid()) guestId String verificationStatus VerificationStatus verificationMethod VerificationMethod riskScore Float? @default(0) verifiedAt DateTime? createdAt DateTime @default(now()) @@index([guestId]) @@index([verificationStatus]) } ---- ====== Étape 4 — DigitalSignature ====== ===== Ajouter ===== model DigitalSignature { id String @id @default(uuid()) reservationId String signerId String documentType String signaturePath String? signedAt DateTime? ipAddress String? status SignatureStatus createdAt DateTime @default(now()) @@index([reservationId]) @@index([signerId]) @@index([status]) } ---- ====== Étape 5 — Enums ====== ===== Ajouter ===== enum CheckInStatus { PENDING IN_PROGRESS VERIFIED COMPLETED REJECTED } enum IdentityDocumentType { PASSPORT ID_CARD DRIVER_LICENSE RESIDENCE_PERMIT } enum VerificationStatus { PENDING VERIFIED REJECTED MANUAL_REVIEW } enum VerificationMethod { MANUAL OCR BIOMETRIC THIRD_PARTY } ---- ====== Étape 6 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name digital_checkin ---- ====== Sprint 5-C.1-B ====== ===== Check-In Module ===== ---- ====== Étape 7 — Création ====== src/modules/checkin ├── checkin │ ├── verification │ ├── documents │ ├── signatures │ ├── arrivals │ └── checkin.module.ts ---- ====== Étape 8 — Services ====== ===== Créer ===== CheckInService GuestVerificationService IdentityDocumentService DigitalSignatureService ArrivalWorkflowService ArrivalDashboardService ---- ====== Sprint 5-C.1-C ====== ===== Workflow d'Arrivée ===== ---- ====== Étape 9 — ArrivalWorkflowService ====== ===== Créer ===== arrival-workflow.service.ts ---- ===== Workflow ===== Reservation Confirmed ↓ Document Upload ↓ Identity Verification ↓ Digital Signature ↓ Check-In Approval ↓ Arrival Completed ---- ====== Étape 10 — Validation ====== ===== Exiger ===== Document valide Signature valide Paiement conforme avant check-in. ---- ====== Étape 11 — Automatisation ====== ===== Déclencher ===== J-7 Arrival Email J-3 Reminder J-1 Check-In Link Arrival Instructions ---- ====== Sprint 5-C.1-D ====== ===== Vérification Voyageur ===== ---- ====== Étape 12 — GuestVerificationService ====== ===== Créer ===== guest-verification.service.ts ---- ===== Méthodes ===== verifyGuest() calculateRiskScore() approveVerification() rejectVerification() ---- ====== Étape 13 — Contrôles ====== ===== Vérifier ===== Identité Âge Document expiré Doublons Blacklist ---- ====== Étape 14 — Risk Score ====== ===== Calculer ===== à partir de : Documents Historique Pays Fraude ---- ====== Sprint 5-C.1-E ====== ===== Gestion Documentaire ===== ---- ====== Étape 15 — IdentityDocumentService ====== ===== Créer ===== identity-document.service.ts ---- ===== Méthodes ===== uploadDocument() validateDocument() extractDocumentData() deleteDocument() ---- ====== Étape 16 — Upload ====== ===== Supporter ===== Passport Carte identité Permis Titre séjour ---- ====== Étape 17 — Stockage ====== ===== Utiliser ===== MinIO S3 Encryption At Rest ---- ====== Étape 18 — OCR ====== ===== Extraire ===== Nom Prénom Date naissance Numéro document Expiration ---- ====== Sprint 5-C.1-F ====== ===== Signature Numérique ===== ---- ====== Étape 19 — DigitalSignatureService ====== ===== Créer ===== digital-signature.service.ts ---- ===== Méthodes ===== requestSignature() signDocument() verifySignature() ---- ====== Étape 20 — Documents ====== ===== Supporter ===== Contrat location Conditions générales Règlement intérieur Décharge responsabilité ---- ====== Étape 21 — Journaliser ====== Date IP Utilisateur Document ---- ====== Sprint 5-C.1-G ====== ===== Arrival Dashboard ===== ---- ====== Étape 22 — ArrivalDashboardService ====== ===== Créer ===== arrival-dashboard.service.ts ---- ===== Afficher ===== Arrivées du jour Check-In en attente Vérifications manuelles Documents manquants Signatures manquantes ---- ====== Étape 23 — KPI ====== ===== Mesurer ===== Arrival Completion Rate Average Check-In Time Verification Success Rate Digital Adoption Rate ---- ====== Étape 24 — Endpoint ====== ===== Ajouter ===== GET /arrivals/dashboard ---- ====== Sprint 5-C.1-H ====== ===== API Check-In ===== ---- ====== Étape 25 — Endpoints ====== ===== Ajouter ===== GET /reservations/{id}/checkin POST /reservations/{id}/checkin/start POST /reservations/{id}/documents POST /reservations/{id}/verify POST /reservations/{id}/signature POST /reservations/{id}/checkin/complete ---- ====== Étape 26 — Réponse ====== ===== Exemple ===== { "status":"VERIFIED", "documentsValid":true, "signatureCompleted":true } ---- ====== Sprint 5-C.1-I ====== ===== Sécurité ===== ---- ====== Étape 27 — Permissions ====== ===== Ajouter ===== checkin.read checkin.start checkin.verify checkin.complete checkin.documents checkin.admin ---- ====== Étape 28 — RGPD ====== ===== Appliquer ===== Consentement Chiffrement Conservation limitée Suppression automatique aux documents d'identité. ---- ====== Étape 29 — Audit ====== ===== Journaliser ===== CHECKIN_STARTED DOCUMENT_UPLOADED GUEST_VERIFIED SIGNATURE_COMPLETED CHECKIN_COMPLETED ---- ====== Sprint 5-C.1-J ====== ===== Préparation Sprint 5-C.2 ===== ---- ====== Étape 30 — Compatible ====== Préparer : Check-Out Damage Reports Deposit Release Guest Satisfaction ---- ====== Étape 31 — Compatible ====== Préparer : Smart Locks Keyless Entry IoT Access Mobile Keys ---- ====== Définition de terminé ====== Le Sprint 5-C.1 est terminé lorsque : ✓ CheckIn créé ✓ Guest Verification créée ✓ Identity Documents créés ✓ Arrival Workflow créé ✓ Digital Signature créée ✓ Arrival Dashboard créé ✓ Audit intégré ---- ====== Livrables ====== CheckIn IdentityDocument GuestVerification DigitalSignature CheckInService GuestVerificationService IdentityDocumentService DigitalSignatureService ArrivalWorkflowService ArrivalDashboardService Digital Check-In Platform ---- ====== Sprint 5-C.2 — Check-Out Digital & Clôture du Séjour ====== ===== Objectif ===== Finaliser le cycle de vie complet du séjour. Cette couche transforme un séjour actif en séjour clôturé tout en gérant : Départ Contrôle logement Dépôt de garantie Satisfaction client Clôture financière Clôture opérationnelle À l'issue de cette étape : ✓ CheckOut ✓ Damage Report ✓ Deposit Release ✓ Guest Feedback ✓ Stay Closure ✓ Departure Dashboard ✓ Digital Departure Platform ---- ====== Architecture cible ====== Stay ↓ Check-Out Workflow ├── Departure Validation ├── Damage Inspection ├── Deposit Release ├── Guest Feedback ├── Invoice Closure └── Reservation Completion ↓ Analytics ↓ CRM ↓ Reviews ---- ====== Sprint 5-C.2-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — CheckOut ====== ===== Ajouter dans schema.prisma ===== model CheckOut { id String @id @default(uuid()) tenantId String reservationId String @unique status CheckOutStatus scheduledAt DateTime? startedAt DateTime? completedAt DateTime? depositReleased Boolean @default(false) feedbackSubmitted Boolean @default(false) notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt reservation Reservation @relation( fields:[reservationId], references:[id], onDelete:Cascade ) damageReports DamageReport[] @@index([tenantId]) @@index([status]) } ---- ====== Étape 2 — DamageReport ====== ===== Ajouter ===== model DamageReport { id String @id @default(uuid()) checkOutId String severity DamageSeverity category DamageCategory title String description String? estimatedCost Decimal? @db.Decimal(12,2) resolved Boolean @default(false) createdAt DateTime @default(now()) checkOut CheckOut @relation( fields:[checkOutId], references:[id], onDelete:Cascade ) photos DamagePhoto[] @@index([checkOutId]) @@index([severity]) @@index([resolved]) } ---- ====== Étape 3 — DamagePhoto ====== ===== Ajouter ===== model DamagePhoto { id String @id @default(uuid()) damageReportId String imageUrl String createdAt DateTime @default(now()) damageReport DamageReport @relation( fields:[damageReportId], references:[id], onDelete:Cascade ) @@index([damageReportId]) } ---- ====== Étape 4 — GuestFeedback ====== ===== Ajouter ===== model GuestFeedback { id String @id @default(uuid()) reservationId String @unique overallRating Int cleanlinessRating Int? comfortRating Int? serviceRating Int? comment String? submittedAt DateTime @default(now()) reservation Reservation @relation( fields:[reservationId], references:[id], onDelete:Cascade ) } ---- ====== Étape 5 — Enums ====== ===== Ajouter ===== enum CheckOutStatus { PENDING IN_PROGRESS INSPECTED COMPLETED } enum DamageSeverity { LOW MEDIUM HIGH CRITICAL } enum DamageCategory { CLEANING FURNITURE ELECTRICAL PLUMBING SECURITY OTHER } ---- ====== Étape 6 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name digital_checkout ---- ====== Sprint 5-C.2-B ====== ===== Check-Out Module ===== ---- ====== Étape 7 — Création ====== src/modules/checkout ├── checkout │ ├── damages │ ├── deposits │ ├── feedback │ ├── departure │ └── checkout.module.ts ---- ====== Étape 8 — Services ====== ===== Créer ===== CheckOutService DamageReportService DepositReleaseService GuestFeedbackService StayClosureService DepartureDashboardService ---- ====== Sprint 5-C.2-C ====== ===== Workflow de Départ ===== ---- ====== Étape 9 — StayClosureService ====== ===== Créer ===== stay-closure.service.ts ---- ===== Workflow ===== Check-Out Started ↓ Inspection ↓ Damage Review ↓ Deposit Decision ↓ Feedback ↓ Reservation Completed ---- ====== Étape 10 — Validation ====== ===== Vérifier ===== Paiements finalisés Inspection terminée Aucune anomalie bloquante avant clôture. ---- ====== Étape 11 — Automatisation ====== ===== Déclencher ===== Check-Out Reminder Feedback Request Review Invitation CRM Update ---- ====== Sprint 5-C.2-D ====== ===== Gestion des Dégradations ===== ---- ====== Étape 12 — DamageReportService ====== ===== Créer ===== damage-report.service.ts ---- ===== Méthodes ===== createDamageReport() uploadDamagePhoto() estimateDamageCost() resolveDamage() ---- ====== Étape 13 — Catégories ====== ===== Supporter ===== Ménage Mobilier Électrique Plomberie Sécurité ---- ====== Étape 14 — IA Future ====== Préparer : Vision AI Damage Detection Cost Estimation ---- ====== Sprint 5-C.2-E ====== ===== Libération du Dépôt ===== ---- ====== Étape 15 — DepositReleaseService ====== ===== Créer ===== deposit-release.service.ts ---- ===== Méthodes ===== releaseDeposit() holdDeposit() partialRelease() chargeDamageCost() ---- ====== Étape 16 — Scénarios ====== ===== Supporter ===== Full Release Partial Release Full Retention ---- ====== Étape 17 — Intégration ====== ===== Connecter ===== SecurityDepositPolicy PaymentRefund ReservationPayment ---- ====== Sprint 5-C.2-F ====== ===== Feedback Voyageur ===== ---- ====== Étape 18 — GuestFeedbackService ====== ===== Créer ===== guest-feedback.service.ts ---- ===== Méthodes ===== submitFeedback() calculateSatisfaction() generateReviewRequest() ---- ====== Étape 19 — Notes ====== ===== Collecter ===== Propreté Confort Service Expérience globale ---- ====== Étape 20 — Intégration ====== ===== Alimenter ===== Property Reviews CRM Analytics Property Reputation ---- ====== Sprint 5-C.2-G ====== ===== Departure Dashboard ===== ---- ====== Étape 21 — DepartureDashboardService ====== ===== Créer ===== departure-dashboard.service.ts ---- ===== Afficher ===== Départs du jour Inspections en attente Dépôts à rembourser Feedbacks reçus Incidents ouverts ---- ====== Étape 22 — KPI ====== ===== Mesurer ===== Checkout Completion Rate Average Checkout Time Deposit Release Time Guest Satisfaction ---- ====== Étape 23 — Endpoint ====== ===== Ajouter ===== GET /departures/dashboard ---- ====== Sprint 5-C.2-H ====== ===== API Check-Out ===== ---- ====== Étape 24 — Endpoints ====== ===== Ajouter ===== GET /reservations/{id}/checkout POST /reservations/{id}/checkout/start POST /reservations/{id}/damage-reports POST /reservations/{id}/deposit/release POST /reservations/{id}/feedback POST /reservations/{id}/checkout/complete ---- ====== Étape 25 — Réponse ====== ===== Exemple ===== { "status":"COMPLETED", "depositReleased":true, "feedbackSubmitted":true } ---- ====== Sprint 5-C.2-I ====== ===== Sécurité ===== ---- ====== Étape 26 — Permissions ====== ===== Ajouter ===== checkout.read checkout.start checkout.complete checkout.damage checkout.deposit checkout.admin ---- ====== Étape 27 — Audit ====== ===== Journaliser ===== CHECKOUT_STARTED DAMAGE_REPORTED DEPOSIT_RELEASED FEEDBACK_SUBMITTED CHECKOUT_COMPLETED ---- ====== Étape 28 — Multi-Tenant ====== ===== Vérifier ===== sur : CheckOut DamageReport GuestFeedback ---- ====== Sprint 5-C.2-J ====== ===== Préparation Sprint 5-D ===== ---- ====== Étape 29 — Compatible ====== Préparer : Housekeeping Maintenance Guest Requests Incident Management ---- ====== Étape 30 — Compatible ====== Préparer : Guest Journey Customer Success Operational Excellence Service Automation ---- ====== Définition de terminé ====== Le Sprint 5-C.2 est terminé lorsque : ✓ CheckOut créé ✓ DamageReport créé ✓ Deposit Release créé ✓ Guest Feedback créé ✓ Stay Closure créé ✓ Departure Dashboard créé ✓ Audit intégré ---- ====== Livrables ====== CheckOut DamageReport DamagePhoto GuestFeedback CheckOutService DamageReportService DepositReleaseService GuestFeedbackService StayClosureService DepartureDashboardService Digital Check-Out Platform ---- ====== Sprint 5-D.1 — Gestion des Demandes Voyageurs & Service Desk ====== ===== Objectif ===== Mettre en place la couche opérationnelle du séjour. Cette couche permet de gérer : Demandes voyageurs Incidents Maintenance Tâches Communication Suivi opérationnel depuis l'arrivée jusqu'au départ. À l'issue de cette étape : ✓ GuestRequest ✓ ServiceTicket ✓ Incident ✓ TaskAssignment ✓ Guest Communication ✓ Service Dashboard ✓ Hospitality Service Desk ---- ====== Architecture cible ====== Guest ↓ Guest Request ↓ Service Desk ├── Tickets ├── Incidents ├── Tasks ├── Communications ├── Escalations └── SLA ↓ Operations ↓ Analytics ---- ====== Sprint 5-D.1-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — GuestRequest ====== ===== Ajouter dans schema.prisma ===== model GuestRequest { id String @id @default(uuid()) tenantId String reservationId String guestId String? requestType GuestRequestType priority TicketPriority status TicketStatus subject String description String requestedAt DateTime @default(now()) resolvedAt DateTime? satisfactionScore Int? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tickets ServiceTicket[] @@index([tenantId]) @@index([reservationId]) @@index([status]) @@index([priority]) } ---- ====== Étape 2 — ServiceTicket ====== ===== Ajouter ===== model ServiceTicket { id String @id @default(uuid()) tenantId String guestRequestId String assignedTo String? ticketNumber String @unique status TicketStatus priority TicketPriority slaDueAt DateTime? resolvedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt request GuestRequest @relation( fields:[guestRequestId], references:[id], onDelete:Cascade ) tasks TaskAssignment[] @@index([tenantId]) @@index([assignedTo]) @@index([status]) } ---- ====== Étape 3 — Incident ====== ===== Ajouter ===== model Incident { id String @id @default(uuid()) tenantId String reservationId String? propertyId String severity IncidentSeverity category IncidentCategory title String description String status IncidentStatus openedAt DateTime @default(now()) closedAt DateTime? createdAt DateTime @default(now()) @@index([tenantId]) @@index([propertyId]) @@index([status]) @@index([severity]) } ---- ====== Étape 4 — TaskAssignment ====== ===== Ajouter ===== model TaskAssignment { id String @id @default(uuid()) tenantId String ticketId String? incidentId String? assignedUserId String title String description String? dueDate DateTime? completed Boolean @default(false) completedAt DateTime? createdAt DateTime @default(now()) @@index([tenantId]) @@index([assignedUserId]) @@index([completed]) } ---- ====== Étape 5 — GuestCommunication ====== ===== Ajouter ===== model GuestCommunication { id String @id @default(uuid()) tenantId String reservationId String channel CommunicationChannel direction CommunicationDirection subject String? message String sentAt DateTime @default(now()) createdAt DateTime @default(now()) @@index([tenantId]) @@index([reservationId]) @@index([channel]) } ---- ====== Étape 6 — Enums ====== ===== Ajouter ===== enum GuestRequestType { HOUSEKEEPING MAINTENANCE AMENITY INFORMATION CHECKIN CHECKOUT TRANSPORT OTHER } enum TicketStatus { OPEN IN_PROGRESS WAITING RESOLVED CLOSED } enum TicketPriority { LOW MEDIUM HIGH URGENT } enum IncidentSeverity { LOW MEDIUM HIGH CRITICAL } enum IncidentStatus { OPEN INVESTIGATING RESOLVED CLOSED } enum IncidentCategory { FACILITY SECURITY CLEANING PAYMENT TECHNICAL OTHER } enum CommunicationChannel { EMAIL SMS PHONE WHATSAPP IN_APP } enum CommunicationDirection { INBOUND OUTBOUND } ---- ====== Étape 7 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name guest_service_desk ---- ====== Sprint 5-D.1-B ====== ===== Module Service Desk ===== ---- ====== Étape 8 — Création ====== src/modules/service-desk ├── guest-requests │ ├── tickets │ ├── incidents │ ├── tasks │ ├── communications │ ├── sla │ └── service-desk.module.ts ---- ====== Étape 9 — Services ====== ===== Créer ===== GuestRequestService ServiceTicketService IncidentService TaskAssignmentService GuestCommunicationService ServiceDashboardService ---- ====== Sprint 5-D.1-C ====== ===== Demandes Voyageurs ===== ---- ====== Étape 10 — GuestRequestService ====== ===== Créer ===== guest-request.service.ts ---- ===== Méthodes ===== createRequest() assignRequest() resolveRequest() rateSatisfaction() ---- ====== Étape 11 — Cas d'usage ====== ===== Supporter ===== Serviettes Ménage Réparation Questions Transport Assistance ---- ====== Étape 12 — Workflow ====== Guest Request ↓ Ticket ↓ Assignment ↓ Resolution ↓ Feedback ---- ====== Sprint 5-D.1-D ====== ===== Tickets & SLA ===== ---- ====== Étape 13 — ServiceTicketService ====== ===== Créer ===== service-ticket.service.ts ---- ===== SLA par priorité ===== LOW 48h MEDIUM 24h HIGH 8h URGENT 1h ---- ====== Étape 14 — Méthodes ====== createTicket() assignTicket() escalateTicket() closeTicket() ---- ====== Étape 15 — Numérotation ====== ===== Générer ===== TKT-2027-000001 ---- ====== Sprint 5-D.1-E ====== ===== Gestion des Incidents ===== ---- ====== Étape 16 — IncidentService ====== ===== Créer ===== incident.service.ts ---- ===== Méthodes ===== openIncident() investigateIncident() resolveIncident() closeIncident() ---- ====== Étape 17 — Types ====== ===== Supporter ===== Panne climatisation Fuite Problème serrure Sécurité Incident paiement ---- ====== Étape 18 — Escalade ====== ===== Automatique ===== si : Severity = CRITICAL ---- ====== Sprint 5-D.1-F ====== ===== Assignation des Tâches ===== ---- ====== Étape 19 — TaskAssignmentService ====== ===== Créer ===== task-assignment.service.ts ---- ===== Méthodes ===== assignTask() completeTask() reassignTask() ---- ====== Étape 20 — Assignation ====== ===== Supporter ===== Housekeeping Maintenance Reception Manager ---- ====== Étape 21 — Notifications ====== ===== Déclencher ===== lors des nouvelles tâches. ---- ====== Sprint 5-D.1-G ====== ===== Communications Voyageur ===== ---- ====== Étape 22 — GuestCommunicationService ====== ===== Créer ===== guest-communication.service.ts ---- ===== Méthodes ===== sendMessage() receiveMessage() getConversation() ---- ====== Étape 23 — Canaux ====== ===== Supporter ===== Email SMS Téléphone WhatsApp In-App ---- ====== Étape 24 — Timeline ====== ===== Centraliser ===== toutes les interactions client. ---- ====== Sprint 5-D.1-H ====== ===== Service Dashboard ===== ---- ====== Étape 25 — ServiceDashboardService ====== ===== Créer ===== service-dashboard.service.ts ---- ===== Afficher ===== Tickets ouverts Tickets SLA en retard Incidents actifs Tâches assignées Satisfaction client ---- ====== Étape 26 — KPI ====== ===== Mesurer ===== Resolution Time SLA Compliance Ticket Volume CSAT Incident Rate ---- ====== Étape 27 — Endpoint ====== ===== Ajouter ===== GET /service-desk/dashboard ---- ====== Sprint 5-D.1-I ====== ===== API Service Desk ===== ---- ====== Étape 28 — Endpoints ====== ===== Ajouter ===== GET /guest-requests POST /guest-requests PUT /guest-requests/{id} POST /tickets/{id}/assign POST /tickets/{id}/close POST /incidents PUT /incidents/{id} POST /tasks/{id}/complete GET /communications/{reservationId} ---- ====== Étape 29 — Exemple ====== ===== Création demande ===== { "requestType":"HOUSEKEEPING", "subject":"Serviettes supplémentaires" } ---- ====== Sprint 5-D.1-J ====== ===== Gouvernance ===== ---- ====== Étape 30 — Permissions ====== ===== Ajouter ===== service.read service.manage service.assign service.incident service.communication service.admin ---- ====== Étape 31 — Audit ====== ===== Journaliser ===== REQUEST_CREATED TICKET_ASSIGNED INCIDENT_OPENED TASK_COMPLETED MESSAGE_SENT SLA_BREACHED ---- ====== Étape 32 — Préparation Sprint 5-D.2 ===== Compatible avec : Housekeeping Automation Maintenance Management Operational Intelligence Work Orders ---- ====== Définition de terminé ====== Le Sprint 5-D.1 est terminé lorsque : ✓ GuestRequest créé ✓ ServiceTicket créé ✓ Incident créé ✓ TaskAssignment créé ✓ GuestCommunication créé ✓ Service Dashboard créé ✓ SLA intégré ✓ Audit intégré ---- ====== Livrables ====== GuestRequest ServiceTicket Incident TaskAssignment GuestCommunication GuestRequestService ServiceTicketService IncidentService TaskAssignmentService GuestCommunicationService ServiceDashboardService Hospitality Service Desk ---- ====== Sprint 5-D.2 — Housekeeping & Maintenance Operations ====== ===== Objectif ===== Automatiser les opérations terrain de la plateforme. Cette couche permet de piloter : Ménage Maintenance Statut des logements Inventaire Maintenance préventive Performance opérationnelle afin de transformer la plateforme en véritable PMS (Property Management System). À l'issue de cette étape : ✓ Housekeeping ✓ Room Status ✓ Maintenance Work Orders ✓ Preventive Maintenance ✓ Inventory Usage ✓ Operations Dashboard ✓ Operations Management Platform ---- ====== Architecture cible ====== Reservation ↓ Operations Engine ├── Housekeeping ├── Room Status ├── Maintenance ├── Preventive Maintenance ├── Inventory └── Operations Dashboard ↓ Property Operations ↓ Analytics ---- ====== Sprint 5-D.2-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — HousekeepingTask ====== ===== Ajouter dans schema.prisma ===== model HousekeepingTask { id String @id @default(uuid()) tenantId String propertyId String reservationId String? assignedUserId String? taskType HousekeepingTaskType status HousekeepingStatus priority TaskPriority scheduledAt DateTime? startedAt DateTime? completedAt DateTime? notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([tenantId]) @@index([propertyId]) @@index([status]) @@index([assignedUserId]) } ---- ====== Étape 2 — PropertyRoomStatus ====== ===== Ajouter ===== model PropertyRoomStatus { propertyId String @id status RoomStatus lastUpdatedAt DateTime @updatedAt notes String? property Property @relation( fields:[propertyId], references:[id], onDelete:Cascade ) } ---- ====== Étape 3 — MaintenanceWorkOrder ====== ===== Ajouter ===== model MaintenanceWorkOrder { id String @id @default(uuid()) tenantId String propertyId String assignedUserId String? category MaintenanceCategory priority TaskPriority status WorkOrderStatus title String description String? estimatedCost Decimal? @db.Decimal(12,2) actualCost Decimal? @db.Decimal(12,2) scheduledAt DateTime? completedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([tenantId]) @@index([propertyId]) @@index([status]) @@index([priority]) } ---- ====== Étape 4 — PreventiveMaintenance ====== ===== Ajouter ===== model PreventiveMaintenance { id String @id @default(uuid()) tenantId String propertyId String title String frequencyDays Int nextDueDate DateTime active Boolean @default(true) lastCompletedAt DateTime? createdAt DateTime @default(now()) @@index([tenantId]) @@index([propertyId]) @@index([nextDueDate]) } ---- ====== Étape 5 — InventoryUsage ====== ===== Ajouter ===== model InventoryUsage { id String @id @default(uuid()) tenantId String propertyId String itemName String quantity Decimal @db.Decimal(10,2) unit String usedAt DateTime @default(now()) referenceType String? referenceId String? @@index([tenantId]) @@index([propertyId]) @@index([usedAt]) } ---- ====== Étape 6 — Enums ====== ===== Ajouter ===== enum HousekeepingTaskType { CHECKOUT_CLEANING DEEP_CLEANING INSPECTION LINEN_CHANGE RESTOCK OTHER } enum HousekeepingStatus { PENDING ASSIGNED IN_PROGRESS COMPLETED CANCELLED } enum RoomStatus { AVAILABLE OCCUPIED DIRTY CLEANING INSPECTING OUT_OF_SERVICE } enum MaintenanceCategory { HVAC ELECTRICAL PLUMBING FURNITURE SECURITY APPLIANCE GENERAL } enum WorkOrderStatus { OPEN ASSIGNED IN_PROGRESS COMPLETED CANCELLED } enum TaskPriority { LOW MEDIUM HIGH URGENT } ---- ====== Étape 7 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name operations_management ---- ====== Sprint 5-D.2-B ====== ===== Operations Module ===== ---- ====== Étape 8 — Création ====== src/modules/operations ├── housekeeping │ ├── room-status │ ├── maintenance │ ├── preventive-maintenance │ ├── inventory │ ├── dashboard │ └── operations.module.ts ---- ====== Étape 9 — Services ====== ===== Créer ===== HousekeepingService RoomStatusService MaintenanceWorkOrderService PreventiveMaintenanceService InventoryUsageService OperationsDashboardService ---- ====== Sprint 5-D.2-C ====== ===== Housekeeping ===== ---- ====== Étape 10 — HousekeepingService ====== ===== Créer ===== housekeeping.service.ts ---- ===== Méthodes ===== createCleaningTask() assignTask() startCleaning() completeCleaning() ---- ====== Étape 11 — Automatisation ====== ===== Générer automatiquement ===== Check-Out ↓ Cleaning Task ---- ====== Étape 12 — Workflow ====== DIRTY ↓ CLEANING ↓ INSPECTING ↓ AVAILABLE ---- ====== Sprint 5-D.2-D ====== ===== Room Status ===== ---- ====== Étape 13 — RoomStatusService ====== ===== Créer ===== room-status.service.ts ---- ===== Méthodes ===== updateStatus() getStatus() transitionStatus() ---- ====== Étape 14 — Synchronisation ====== ===== Alimenter ===== à partir de : Reservation CheckIn CheckOut Housekeeping ---- ====== Étape 15 — Temps Réel ====== ===== Afficher ===== Occupé Disponible En ménage Hors service ---- ====== Sprint 5-D.2-E ====== ===== Maintenance ===== ---- ====== Étape 16 — MaintenanceWorkOrderService ====== ===== Créer ===== maintenance-work-order.service.ts ---- ===== Méthodes ===== createWorkOrder() assignTechnician() completeWorkOrder() calculateCosts() ---- ====== Étape 17 — Origines ====== ===== Supporter ===== Incident Inspection Preventive Maintenance Manual Request ---- ====== Étape 18 — Escalade ====== ===== Automatique ===== si : Priority = URGENT ---- ====== Sprint 5-D.2-F ====== ===== Maintenance Préventive ===== ---- ====== Étape 19 — PreventiveMaintenanceService ====== ===== Créer ===== preventive-maintenance.service.ts ---- ===== Méthodes ===== scheduleMaintenance() generateWorkOrders() markCompleted() ---- ====== Étape 20 — Exemples ====== Climatisation 90 jours ↓ Work Order auto ---- Détecteur fumée 180 jours ↓ Inspection auto ---- ====== Sprint 5-D.2-G ====== ===== Inventaire ===== ---- ====== Étape 21 — InventoryUsageService ====== ===== Créer ===== inventory-usage.service.ts ---- ===== Suivre ===== Produits ménage Linge Consommables Produits accueil ---- ====== Étape 22 — Méthodes ===== registerUsage() calculateConsumption() forecastInventory() ---- ====== Étape 23 — Alertes ====== ===== Déclencher ===== sur : Stock faible Surconsommation Rupture ---- ====== Sprint 5-D.2-H ====== ===== Operations Dashboard ===== ---- ====== Étape 24 — OperationsDashboardService ====== ===== Créer ===== operations-dashboard.service.ts ---- ===== Afficher ===== Nettoyages en attente Logements sales Work Orders ouverts Maintenances prévues Consommation inventaire ---- ====== Étape 25 — KPI ====== ===== Mesurer ===== Cleaning Time Room Turnover Time Maintenance SLA Inventory Cost Operational Efficiency ---- ====== Étape 26 — Endpoint ====== ===== Ajouter ===== GET /operations/dashboard ---- ====== Sprint 5-D.2-I ====== ===== API Operations ===== ---- ====== Étape 27 — Endpoints ====== ===== Ajouter ===== GET /housekeeping/tasks POST /housekeeping/tasks PUT /housekeeping/tasks/{id} GET /room-status PUT /room-status/{propertyId} GET /maintenance/work-orders POST /maintenance/work-orders PUT /maintenance/work-orders/{id} GET /preventive-maintenance POST /preventive-maintenance GET /inventory/usage ---- ====== Étape 28 — Exemple ====== ===== Work Order ===== { "category":"HVAC", "priority":"HIGH", "title":"Réparation climatisation" } ---- ====== Sprint 5-D.2-J ====== ===== Gouvernance ===== ---- ====== Étape 29 — Permissions ====== ===== Ajouter ===== operations.read operations.housekeeping operations.maintenance operations.inventory operations.dashboard operations.admin ---- ====== Étape 30 — Audit ====== ===== Journaliser ===== HOUSEKEEPING_CREATED HOUSEKEEPING_COMPLETED ROOM_STATUS_UPDATED WORK_ORDER_CREATED WORK_ORDER_COMPLETED PREVENTIVE_MAINTENANCE_EXECUTED ---- ====== Étape 31 — Jobs ====== ===== Ajouter ===== Toutes les heures Maintenance Scheduler Toutes les nuits Inventory Forecast Operations KPIs Refresh ---- ====== Clôture Domaine Opérations ====== À la fin du Sprint 5-D.2 : ✓ Service Desk ✓ Guest Requests ✓ Incidents ✓ Housekeeping ✓ Maintenance ✓ Inventory ✓ Operations Dashboard sont entièrement opérationnels. ---- ====== Sprint 5-E.1 — Reservation Analytics & Revenue KPIs ====== ===== Objectif ===== Mettre en place le cockpit analytique des réservations. Cette couche fournit une vision complète de : Réservations Revenus Annulations Voyageurs Performance Conversion afin de piloter l'activité commerciale et opérationnelle. À l'issue de cette étape : ✓ Reservation Dashboard ✓ Booking Analytics ✓ Revenue KPIs ✓ Cancellation Analytics ✓ Guest Analytics ✓ Reservation Performance ✓ Reservation Intelligence Dashboard ---- ====== Architecture cible ====== Reservations ↓ Reservation Analytics ├── Booking Analytics ├── Revenue Analytics ├── Cancellation Analytics ├── Guest Analytics ├── Conversion Analytics └── KPI Dashboard ↓ Revenue Management ↓ Executive Reporting ---- ====== Sprint 5-E.1-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — ReservationAnalyticsSnapshot ====== ===== Ajouter dans schema.prisma ===== model ReservationAnalyticsSnapshot { id String @id @default(uuid()) tenantId String snapshotDate DateTime reservationsCount Int @default(0) confirmedBookings Int @default(0) cancelledBookings Int @default(0) revenue Decimal @db.Decimal(14,2) averageBookingValue Decimal @db.Decimal(14,2) averageLengthOfStay Float? occupancyImpact Float? createdAt DateTime @default(now()) @@index([tenantId]) @@index([snapshotDate]) } ---- ====== Étape 2 — ReservationKPI ====== ===== Ajouter ===== model ReservationKPI { tenantId String @id bookingConversionRate Float? cancellationRate Float? averageBookingValue Float? averageStayLength Float? repeatGuestRate Float? revenuePerBooking Float? updatedAt DateTime @updatedAt } ---- ====== Étape 3 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name reservation_analytics ---- ====== Sprint 5-E.1-B ====== ===== Reservation Analytics Module ===== ---- ====== Étape 4 — Création ====== src/modules/reservation-analytics ├── dashboard │ ├── bookings │ ├── revenue │ ├── cancellations │ ├── guests │ ├── performance │ └── reservation-analytics.module.ts ---- ====== Étape 5 — Services ====== ===== Créer ===== ReservationDashboardService BookingAnalyticsService RevenueKPIService CancellationAnalyticsService GuestAnalyticsService ReservationPerformanceService ---- ====== Sprint 5-E.1-C ====== ===== Booking Analytics ===== ---- ====== Étape 6 — BookingAnalyticsService ====== ===== Créer ===== booking-analytics.service.ts ---- ===== Méthodes ===== calculateBookings() calculateBookingTrend() analyzeBookingSources() analyzeLeadTime() ---- ====== Étape 7 — Mesurer ====== Total Reservations Confirmed Reservations Pending Reservations No Shows Lead Time ---- ====== Étape 8 — Sources ====== ===== Analyser ===== Direct Website Mobile App Airbnb Booking Expedia ---- ====== Sprint 5-E.1-D ====== ===== Revenue KPIs ===== ---- ====== Étape 9 — RevenueKPIService ====== ===== Créer ===== revenue-kpi.service.ts ---- ===== Calculer ===== Gross Revenue Net Revenue Average Booking Value Revenue Per Booking Revenue Growth ---- ====== Étape 10 — Exemple ====== Revenue 125 000 € ↑ 14% ---- ====== Étape 11 — Intégration ====== ===== Utiliser ===== Reservation Payments Invoices Refunds ---- ====== Sprint 5-E.1-E ====== ===== Cancellation Analytics ===== ---- ====== Étape 12 — CancellationAnalyticsService ====== ===== Créer ===== cancellation-analytics.service.ts ---- ===== Méthodes ===== calculateCancellationRate() analyzeCancellationReasons() forecastCancellationRisk() ---- ====== Étape 13 — Mesurer ====== Cancellation Rate Refund Rate No Show Rate Cancellation Cost ---- ====== Étape 14 — Segmentation ====== ===== Analyser ===== par : Property Source Country Season ---- ====== Sprint 5-E.1-F ====== ===== Guest Analytics ===== ---- ====== Étape 15 — GuestAnalyticsService ====== ===== Créer ===== guest-analytics.service.ts ---- ===== Mesurer ===== Repeat Guests New Guests Average Group Size Countries Guest Lifetime Value ---- ====== Étape 16 — Méthodes ====== calculateRepeatGuestRate() analyzeGuestOrigins() calculateGuestLTV() ---- ====== Étape 17 — CRM ====== ===== Alimenter ===== Customer Score Customer Segment Loyalty Program ---- ====== Sprint 5-E.1-G ====== ===== Reservation Performance ===== ---- ====== Étape 18 — ReservationPerformanceService ====== ===== Créer ===== reservation-performance.service.ts ---- ===== Calculer ===== Booking Conversion Booking Velocity Reservation Growth Channel Performance Forecast Accuracy ---- ====== Étape 19 — Classements ====== ===== Identifier ===== Best Performing Properties Best Channels Best Markets ---- ====== Étape 20 — KPI Score ====== ===== Construire ===== Booking Score Revenue Score Guest Score Cancellation Score Global Reservation Score ---- ====== Sprint 5-E.1-H ====== ===== Dashboard Principal ===== ---- ====== Étape 21 — ReservationDashboardService ====== ===== Créer ===== reservation-dashboard.service.ts ---- ===== Agréger ===== Bookings Revenue Guests Cancellations Performance ---- ====== Étape 22 — Endpoint ====== ===== Ajouter ===== GET /reservations/dashboard ---- ====== Étape 23 — Exemple ====== ===== Réponse ===== { "bookings":842, "revenue":125000, "cancellationRate":4.2, "repeatGuests":31, "bookingScore":89 } ---- ====== Sprint 5-E.1-I ====== ===== API Analytics ===== ---- ====== Étape 24 — Endpoints ====== ===== Ajouter ===== GET /reservations/dashboard GET /reservations/analytics/bookings GET /reservations/analytics/revenue GET /reservations/analytics/cancellations GET /reservations/analytics/guests GET /reservations/analytics/performance ---- ====== Étape 25 — Filtres ====== ===== Supporter ===== Today 7 Days 30 Days 90 Days 12 Months Custom Range ---- ====== Étape 26 — Export ====== ===== Ajouter ===== GET /reservations/analytics/export Formats : CSV Excel PDF ---- ====== Sprint 5-E.1-J ====== ===== Gouvernance ===== ---- ====== Étape 27 — Permissions ====== ===== Ajouter ===== reservation.analytics.read reservation.analytics.export reservation.analytics.kpi reservation.analytics.admin ---- ====== Étape 28 — Audit ====== ===== Journaliser ===== RESERVATION_DASHBOARD_VIEWED BOOKING_ANALYTICS_VIEWED REVENUE_KPI_CALCULATED CANCELLATION_ANALYTICS_VIEWED ANALYTICS_EXPORTED ---- ====== Étape 29 — Jobs ====== ===== Ajouter ===== Toutes les heures KPI Refresh Toutes les nuits Analytics Snapshot Forecast Refresh ---- ====== Préparation Sprint 5-E.2 ====== Compatible avec : Fraud Detection Revenue Forecast Reservation Intelligence Predictive Booking ---- ====== Définition de terminé ====== Le Sprint 5-E.1 est terminé lorsque : ✓ Reservation Dashboard ✓ Booking Analytics ✓ Revenue KPIs ✓ Cancellation Analytics ✓ Guest Analytics ✓ Reservation Performance ✓ Export Analytics ✓ Audit intégré ---- ====== Livrables ====== ReservationAnalyticsSnapshot ReservationKPI ReservationDashboardService BookingAnalyticsService RevenueKPIService CancellationAnalyticsService GuestAnalyticsService ReservationPerformanceService Reservation Analytics Platform ---- ====== Sprint 5-E.2 — Reservation Intelligence & Analytics Prédictifs ====== ===== Objectif ===== Transformer le moteur analytique de réservation en plateforme Reservation Intelligence Enterprise. Cette couche permet : Prévision Détection de fraude Prédiction d'annulation Analyse de risque Optimisation des revenus Pilotage intelligent À l'issue de cette étape : ✓ Prévision réservations ✓ Prévision revenus ✓ Fraud Detection ✓ Cancellation Prediction ✓ Guest Risk Score ✓ Reservation Health Score ✓ Reservation Intelligence Platform ---- ====== Architecture cible ====== Reservation Analytics ↓ Reservation Intelligence Engine ├── Booking Forecast ├── Revenue Forecast ├── Cancellation Prediction ├── Fraud Detection ├── Guest Risk Scoring ├── Health Scoring └── AI Recommendations ↓ Revenue Management ↓ Executive Intelligence ---- ====== Sprint 5-E.2-A ====== ===== Extension Prisma ===== ---- ====== Étape 1 — ReservationForecast ====== ===== Ajouter dans schema.prisma ===== model ReservationForecast { id String @id @default(uuid()) tenantId String forecastType ReservationForecastType forecastDate DateTime predictedValue Float confidenceScore Float? generatedAt DateTime @default(now()) @@index([tenantId]) @@index([forecastType]) @@index([forecastDate]) } ---- ====== Étape 2 — ReservationInsight ====== ===== Ajouter ===== model ReservationInsight { id String @id @default(uuid()) tenantId String category ReservationInsightCategory severity InsightSeverity title String description String recommendation String? impactScore Float? resolved Boolean @default(false) createdAt DateTime @default(now()) @@index([tenantId]) @@index([category]) @@index([resolved]) } ---- ====== Étape 3 — GuestRiskScore ====== ===== Ajouter ===== model GuestRiskScore { guestId String @id overallRisk Float fraudRisk Float cancellationRisk Float paymentRisk Float behaviorRisk Float calculatedAt DateTime @updatedAt } ---- ====== Étape 4 — ReservationHealthScore ====== ===== Ajouter ===== model ReservationHealthScore { reservationId String @id overallScore Float paymentScore Float guestScore Float fraudScore Float completionScore Float calculatedAt DateTime @updatedAt } ---- ====== Étape 5 — Enums ====== ===== Ajouter ===== enum ReservationForecastType { BOOKINGS REVENUE CANCELLATIONS OCCUPANCY } enum ReservationInsightCategory { BOOKINGS REVENUE CANCELLATION FRAUD GUEST } ---- ====== Étape 6 — Migration ====== ===== Générer ===== npx prisma migrate dev \ --name reservation_intelligence ---- ====== Sprint 5-E.2-B ====== ===== Intelligence Module ===== ---- ====== Étape 7 — Création ====== src/modules/reservation-intelligence ├── forecasts │ ├── fraud │ ├── cancellation │ ├── risk │ ├── insights │ ├── health-score │ └── reservation-intelligence.module.ts ---- ====== Étape 8 — Services ====== ===== Créer ===== BookingForecastService RevenueForecastService CancellationPredictionService FraudDetectionService GuestRiskScoreService ReservationHealthScoreService ReservationInsightService ---- ====== Sprint 5-E.2-C ====== ===== Prévision des Réservations ===== ---- ====== Étape 9 — BookingForecastService ====== ===== Créer ===== booking-forecast.service.ts ---- ===== Méthodes ===== forecastBookings() forecastOccupancyImpact() forecastSeasonality() ---- ====== Étape 10 — Sources ====== ===== Utiliser ===== Reservations Property Analytics Seasonality Events Historical Trends ---- ====== Étape 11 — Exemple ====== 30 prochains jours Prévision +18% Réservations ---- ====== Sprint 5-E.2-D ====== ===== Prévision des Revenus ===== ---- ====== Étape 12 — RevenueForecastService ====== ===== Créer ===== revenue-forecast.service.ts ---- ===== Méthodes ===== forecastRevenue() forecastADR() forecastRevPAR() forecastCashFlow() ---- ====== Étape 13 — Alimenter ====== avec : Reservations Invoices Payments Refunds ---- ====== Étape 14 — Exemple ====== Revenue Forecast 145 000 € +11% ---- ====== Sprint 5-E.2-E ====== ===== Prédiction d'Annulation ===== ---- ====== Étape 15 — CancellationPredictionService ====== ===== Créer ===== cancellation-prediction.service.ts ---- ===== Méthodes ===== predictCancellation() calculateCancellationRisk() recommendRetentionAction() ---- ====== Étape 16 — Variables ====== ===== Utiliser ===== Lead Time Country Booking Source Past Behavior Price Sensitivity ---- ====== Étape 17 — Exemple ====== Reservation #RSV-1001 Cancellation Risk 72% ---- ====== Étape 18 — Actions ====== ===== Recommander ===== Reminder Special Offer Deposit Request ---- ====== Sprint 5-E.2-F ====== ===== Fraud Detection ===== ---- ====== Étape 19 — FraudDetectionService ====== ===== Créer ===== fraud-detection.service.ts ---- ===== Détecter ===== Card Fraud Identity Fraud Chargeback Risk Multi Account Abuse Bot Activity ---- ====== Étape 20 — Méthodes ====== calculateFraudRisk() detectSuspiciousPatterns() triggerFraudAlert() ---- ====== Étape 21 — Sources ====== ===== Utiliser ===== Payments Guest Verification Connection History Behavior Analysis ---- ====== Étape 22 — Alertes ====== ===== Générer ===== LOW MEDIUM HIGH CRITICAL ---- ====== Sprint 5-E.2-G ====== ===== Guest Risk Score ===== ---- ====== Étape 23 — GuestRiskScoreService ====== ===== Créer ===== guest-risk-score.service.ts ---- ===== Calcul ===== Fraude Paiement Historique Annulations Incidents ---- ====== Étape 24 — Classification ====== 0-25 Low Risk 26-50 Moderate 51-75 High 76-100 Critical ---- ====== Étape 25 — Exemple ====== Guest Risk 18 Low Risk ---- ====== Sprint 5-E.2-H ====== ===== Reservation Health Score ===== ---- ====== Étape 26 — ReservationHealthScoreService ====== ===== Créer ===== reservation-health-score.service.ts ---- ===== Calcul ===== Payment Status 30% Guest Risk 25% Fraud Risk 20% Workflow Progress 15% Communication 10% ---- ====== Étape 27 — Classification ====== 90-100 Excellent 75-89 Healthy 50-74 At Risk 0-49 Critical ---- ====== Étape 28 — Exemple ====== Reservation Health 91 Excellent ---- ====== Sprint 5-E.2-I ====== ===== Insights IA ===== ---- ====== Étape 29 — ReservationInsightService ====== ===== Créer ===== reservation-insight.service.ts ---- ===== Générer ===== Opportunités revenus Risques annulation Segments performants Canaux performants Alertes fraude ---- ====== Étape 30 — Exemple ====== Les réservations Airbnb ↑ 24% ↓ Renforcer ce canal ---- ====== Étape 31 — Exemple ====== Les annulations augmentent sur les réservations >60 jours ↓ Adapter la politique ---- ====== Sprint 5-E.2-J ====== ===== Dashboard Intelligence ===== ---- ====== Étape 32 — Endpoints ====== ===== Ajouter ===== GET /reservations/intelligence GET /reservations/forecasts GET /reservations/insights GET /reservations/fraud GET /reservations/health-score GET /guests/{id}/risk-score ---- ====== Étape 33 — Réponse ====== ===== Exemple ===== { "bookingForecast":1240, "revenueForecast":145000, "cancellationRisk":12, "fraudAlerts":2, "healthScore":91 } ---- ====== Étape 34 — Analytics IA ====== ===== Mesurer ===== Forecast Accuracy Fraud Detection Rate Cancellation Prediction Accuracy Health Score Trends Insight Adoption ---- ====== Gouvernance ====== ---- ====== Étape 35 — Permissions ====== ===== Ajouter ===== reservation.intelligence.read reservation.intelligence.forecast reservation.intelligence.fraud reservation.intelligence.health reservation.intelligence.admin ---- ====== Étape 36 — Audit ====== ===== Journaliser ===== FORECAST_GENERATED FRAUD_ALERT_TRIGGERED CANCELLATION_RISK_CALCULATED GUEST_RISK_UPDATED HEALTH_SCORE_UPDATED INTELLIGENCE_DASHBOARD_VIEWED ---- ====== Étape 37 — Jobs ====== ===== Ajouter ===== Toutes les heures Fraud Detection Toutes les nuits Forecast Generation Risk Recalculation Insight Generation ---- ====== Clôture Sprint 5 ====== À la fin du Sprint 5, la plateforme dispose désormais de : ✓ Reservation Engine ✓ Booking Workflow ✓ Payment Platform ✓ Invoicing Platform ✓ Digital Check-In ✓ Digital Check-Out ✓ Service Desk ✓ Housekeeping ✓ Maintenance ✓ Reservation Analytics ✓ Reservation Intelligence ---- ====== Préparation Sprint 6 ====== Compatible avec : Multi Property Management Portfolio Management Owners Operators Asset Management ---- ====== Préparation Sprint 20 ====== Compatible avec : Enterprise Hospitality OS AI Revenue Platform Predictive Operations Global Reservation Intelligence ---- ====== Définition de terminé ====== Le Sprint 5-E.2 est terminé lorsque : ✓ Prévision réservations ✓ Prévision revenus ✓ Fraud Detection ✓ Cancellation Prediction ✓ Guest Risk Score ✓ Reservation Health Score ✓ Insights IA ✓ Dashboard Intelligence ---- ====== Livrables ====== ReservationForecast ReservationInsight GuestRiskScore ReservationHealthScore BookingForecastService RevenueForecastService CancellationPredictionService FraudDetectionService GuestRiskScoreService ReservationHealthScoreService ReservationInsightService Reservation Intelligence Platform