Mettre en œuvre le moteur de réservation de la plateforme.
À l'issue du Sprint 4 :
Ce sprint constitue le premier parcours métier complet générateur de chiffre d'affaires.
ReservationsModule ReservationCalendarModule ReservationGuestModule PricingModule AvailabilityEngineModule
Recherche Bien ↓ Consultation Disponibilité ↓ Sélection Dates ↓ Calcul Tarif ↓ Saisie Voyageurs ↓ Création Réservation ↓ Blocage Calendrier ↓ Confirmation
En tant que client
Je souhaite connaître les dates disponibles
Afin de réserver un séjour.
GET /properties/{id}/availability
startDate endDate
{
"available": true,
"conflicts": []
}
POST /pricing/calculate
{
"propertyId": "uuid",
"startDate": "2027-07-01",
"endDate": "2027-07-15",
"guestCount": 4
}
Nombre de nuits + Tarif saisonnier + Taxes + Options = Montant total
{
"nights": 14,
"subtotal": 2100,
"taxes": 150,
"fees": 50,
"total": 2300
}
POST /reservations
{
"propertyId": "uuid",
"startDate": "2027-07-01",
"endDate": "2027-07-15",
"guestCount": 4
}
RES-2027-000001
POST /reservations/{id}/guests
Nom Prénom Date naissance Nationalité
Nombre voyageurs ≤ capacité bien
GET /reservations/{id}
Référence Bien Voyageurs Montant Statut Historique
PUT /reservations/{id}
Dates Nombre voyageurs Commentaires
Statut = PENDING
POST /reservations/{id}/cancel
Statut = CANCELLED ↓ Libération calendrier ↓ Historisation
Lorsqu'une réservation est créée :
Création réservation ↓ Création événement calendrier ↓ Blocage période
AVAILABLE PENDING BOOKED MAINTENANCE BLOCKED
GET /properties/{id}/calendar
Mensuelle Trimestrielle Annuelle
Basse saison 100 € Haute saison 180 € Très haute saison 250 €
Le calcul doit :
Frais ménage Frais dossier Taxe séjour Caution
PENDING ↓ CONFIRMED ↓ SIGNED ↓ COMPLETED └── CANCELLED
model Reservation {
id String @id @default(uuid())
reservationNumber String @unique
propertyId String
tenantId String
startDate DateTime
endDate DateTime
guestCount Int
totalAmount Decimal
status ReservationStatus
createdAt DateTime @default(now())
}
model ReservationGuest {
id String @id @default(uuid())
reservationId String
firstName String
lastName String
birthDate DateTime?
nationality String?
}
model ReservationEvent {
id String @id @default(uuid())
reservationId String
eventType String
payload Json
createdAt DateTime
}
model CalendarEvent {
id String @id @default(uuid())
propertyId String
reservationId String?
startDate DateTime
endDate DateTime
status String
}
src/modules/reservations ├── reservations │ ├── guests │ ├── pricing │ ├── calendar │ ├── availability │ └── events
AvailabilityService ReservationService PricingService CalendarService ReservationNumberGenerator
ReservationCreated
ReservationCancelled
ReservationConfirmed
Reservations ReservationGuests ReservationPricing ReservationCalendar
Environ :
25 endpoints
/property/[slug] /booking /booking/confirmation
/reservations /reservations/[id]
AvailabilityCalendar BookingForm BookingSummary GuestForm ReservationTimeline
PricingService AvailabilityService ReservationService CalendarService
Check Availability ↓ Calculate Price ↓ Create Reservation ↓ Block Calendar
Recherche ↓ Choix dates ↓ Calcul prix ↓ Création réservation ↓ Consultation réservation
Le Sprint 4 est terminé lorsque :
Scénario métier :
1. Consultation d'un bien 2. Vérification disponibilité 3. Calcul tarif 4. Création réservation 5. Ajout voyageurs 6. Blocage calendrier 7. Consultation réservation
Objectif :
Transformer une réservation en engagement contractuel juridiquement opposable.
Modules concernés :
ContractsModule ContractTemplateModule ContractGenerationModule SignatureModule DocumentModule
Fonctionnalités :
À l'issue du Sprint 5, une réservation pourra être contractualisée et signée électroniquement par le client.