====== Sprint 4 — Réservation & Calendrier ====== ===== Objectif du Sprint ===== Mettre en œuvre le moteur de réservation de la plateforme. À l'issue du Sprint 4 : * Un client peut vérifier la disponibilité d'un bien * Un client peut calculer le coût de son séjour * Un client peut créer une réservation * Les voyageurs sont enregistrés * Le calendrier est automatiquement bloqué * L'agence peut gérer les réservations * Les conflits de réservation sont empêchés Ce sprint constitue le premier parcours métier complet générateur de chiffre d'affaires. ---- ====== Périmètre ====== ===== Modules concernés ===== ReservationsModule ReservationCalendarModule ReservationGuestModule PricingModule AvailabilityEngineModule ---- ====== Workflow métier ====== Recherche Bien ↓ Consultation Disponibilité ↓ Sélection Dates ↓ Calcul Tarif ↓ Saisie Voyageurs ↓ Création Réservation ↓ Blocage Calendrier ↓ Confirmation ---- ====== User Stories ====== ===== US-401 : Vérifier la disponibilité ===== **En tant que client** Je souhaite connaître les dates disponibles Afin de réserver un séjour. ---- ===== Endpoint ===== GET /properties/{id}/availability ---- ===== Paramètres ===== startDate endDate ---- ===== Réponse ===== { "available": true, "conflicts": [] } ---- ===== Critères ===== * Vérification temps réel * Exclusion des périodes bloquées * Exclusion des réservations confirmées ---- ====== US-402 : Calculer un tarif ====== ===== Endpoint ===== POST /pricing/calculate ---- ===== Données ===== { "propertyId": "uuid", "startDate": "2027-07-01", "endDate": "2027-07-15", "guestCount": 4 } ---- ===== Calcul ===== Nombre de nuits + Tarif saisonnier + Taxes + Options = Montant total ---- ===== Réponse ===== { "nights": 14, "subtotal": 2100, "taxes": 150, "fees": 50, "total": 2300 } ---- ====== US-403 : Créer une réservation ====== ===== Endpoint ===== POST /reservations ---- ===== Données ===== { "propertyId": "uuid", "startDate": "2027-07-01", "endDate": "2027-07-15", "guestCount": 4 } ---- ===== Critères ===== * Disponibilité vérifiée * Tarif recalculé * Réservation créée * Numéro généré ---- ===== Numérotation ===== RES-2027-000001 ---- ====== US-404 : Ajouter les voyageurs ====== ===== Endpoint ===== POST /reservations/{id}/guests ---- ===== Données ===== Nom Prénom Date naissance Nationalité ---- ===== Contraintes ===== Nombre voyageurs ≤ capacité bien ---- ====== US-405 : Consulter une réservation ====== ===== Endpoint ===== GET /reservations/{id} ---- ===== Informations ===== Référence Bien Voyageurs Montant Statut Historique ---- ====== US-406 : Modifier une réservation ====== ===== Endpoint ===== PUT /reservations/{id} ---- ===== Modifications autorisées ===== Dates Nombre voyageurs Commentaires ---- ===== Conditions ===== Statut = PENDING ---- ====== US-407 : Annuler une réservation ====== ===== Endpoint ===== POST /reservations/{id}/cancel ---- ===== Conséquences ===== Statut = CANCELLED ↓ Libération calendrier ↓ Historisation ---- ====== Gestion du calendrier ====== ===== US-408 : Blocage automatique ===== Lorsqu'une réservation est créée : Création réservation ↓ Création événement calendrier ↓ Blocage période ---- ===== Statuts calendrier ===== AVAILABLE PENDING BOOKED MAINTENANCE BLOCKED ---- ====== US-409 : Visualiser le calendrier ====== ===== Endpoint ===== GET /properties/{id}/calendar ---- ===== Vues ===== Mensuelle Trimestrielle Annuelle ---- ====== Gestion tarifaire ====== ===== US-410 : Calcul saisonnier ===== ===== Exemple ===== Basse saison 100 € Haute saison 180 € Très haute saison 250 € ---- ===== Moteur ===== Le calcul doit : * Découper le séjour par période * Appliquer le tarif adéquat * Additionner les montants ---- ====== US-411 : Gestion des frais ===== ===== Types ===== Frais ménage Frais dossier Taxe séjour Caution ---- ====== Workflow réservation ====== ===== États ===== PENDING ↓ CONFIRMED ↓ SIGNED ↓ COMPLETED └── CANCELLED ---- ====== Modèle Prisma ====== ===== Reservation ===== 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()) } ---- ===== ReservationGuest ===== model ReservationGuest { id String @id @default(uuid()) reservationId String firstName String lastName String birthDate DateTime? nationality String? } ---- ===== ReservationEvent ===== model ReservationEvent { id String @id @default(uuid()) reservationId String eventType String payload Json createdAt DateTime } ---- ===== CalendarEvent ===== model CalendarEvent { id String @id @default(uuid()) propertyId String reservationId String? startDate DateTime endDate DateTime status String } ---- ====== Architecture Backend ====== src/modules/reservations ├── reservations │ ├── guests │ ├── pricing │ ├── calendar │ ├── availability │ └── events ---- ====== Domain Services ====== AvailabilityService ReservationService PricingService CalendarService ReservationNumberGenerator ---- ====== Événements métier ====== ===== ReservationCreated ===== ReservationCreated ---- ===== ReservationCancelled ===== ReservationCancelled ---- ===== ReservationConfirmed ===== ReservationConfirmed ---- ====== Swagger ====== ===== Tags ===== Reservations ReservationGuests ReservationPricing ReservationCalendar ---- ===== Volume API ===== Environ : 25 endpoints ---- ====== Frontend ====== ===== Pages publiques ===== /property/[slug] /booking /booking/confirmation ---- ===== Espace client ===== /reservations /reservations/[id] ---- ===== Composants ===== AvailabilityCalendar BookingForm BookingSummary GuestForm ReservationTimeline ---- ====== Tests ====== ===== Unitaires ===== PricingService AvailabilityService ReservationService CalendarService ---- ===== Intégration ===== Check Availability ↓ Calculate Price ↓ Create Reservation ↓ Block Calendar ---- ===== E2E ===== Recherche ↓ Choix dates ↓ Calcul prix ↓ Création réservation ↓ Consultation réservation ---- ====== Définition de terminé ====== Le Sprint 4 est terminé lorsque : * Disponibilités fonctionnelles * Calcul tarifaire fonctionnel * Réservations fonctionnelles * Voyageurs fonctionnels * Calendrier fonctionnel * Blocages automatiques fonctionnels * Swagger à jour * Tests verts * CI verte ---- ====== Livrables ====== * ReservationsModule * ReservationGuestModule * ReservationCalendarModule * PricingModule * AvailabilityEngineModule * DTO * Swagger * Tests * Migrations Prisma ---- ====== Démonstration Sprint ====== 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 ---- ====== Sprint suivant ====== ===== Sprint 5 — Contrats & Signature Électronique ===== Objectif : Transformer une réservation en engagement contractuel juridiquement opposable. Modules concernés : ContractsModule ContractTemplateModule ContractGenerationModule SignatureModule DocumentModule Fonctionnalités : * Génération automatique du contrat * Gestion des modèles * Production PDF * Signature électronique * Archivage des documents * Téléchargement des contrats À l'issue du Sprint 5, une réservation pourra être contractualisée et signée électroniquement par le client.