====== 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