M3105 : tp noté

N'oubliez pas de déposer ce TP sur votre archive gitlab. Déposez-le régulièrement (commit puis push) durant cette séance. La version qui sera notée sera celle que vous aurez déposée à 17h15. Aucun code déposé ou rendu par la suite ne sera autorisé. Votre travail doit être personnel. La copie sera sanctionnée.

Gestion d'un hôtel

Un hôtel comporte plusieurs catégories de chambres, dont le tarif varie avec la date, selon qu'on est en pleine saison ou en saison creuse.

Votre but est de réaliser un système de réservation et de gestion de l'hôtel pour pouvoir calculer le montant des factures dûes par les clients.

La classe LocalDate

Dans cet exercice, on utilisera les collections (en particulier les maps), ainsi que la classe LocalDate introduite en java 8 pour représenter de manière propre des dates.

Comme ce qui m'intéresse, c'est d'abord que vous maîtrisiez les collections, je vous guide un peu sur les méthodes les plus intéressantes de LocalDate : Dans la suite, nous allons nous intéresser aux classes qui constituent notre système une par une. Dans les premières questions, les classes à créer vous sont données, et vous avez "juste" à implémenter leur code. La dernière question est plus ouverte : je ne vous dis pas comment représenter les réservations, et je vous laisse libre de les implémenter comme vous le souhaitez.

La classe IntervalleDate

Comme les tarifs et les réservations sont assez naturellement définis par des intervalles entre deux dates, on a décidé de représenter ces intervalles par une classe, la classe IntervalleDate.

Un intervalleDate est défini par une date de début et une date de fin, et représente tous les jours compris entre la date de début (inclusivement) et la date de fin (exclusivement). Un effet secondaire de cette définition est que si je veux définir deux intervalles qui se suivent, la date de fin du premier est la date de début du second.

Implémentez les méthodes de la classe IntervalleDate pour faire tourner les tests.

CalendrierTarif

Le prix d'une chambre varie selon la date. Pour représenter ces variations, nous allons définir la classe CalendrierTarif. Elle permet par exemple d'enregistrer les différents prix en fonction des dates, et de calculer le prix d'un séjour, dont on connaît la date de début et la date de fin.

Implémentez les méthodes de la classe CalendrierTarif pour faire tourner les tests.

CategorieChambre

Les chambres d'un hôtel n'ont a priori pas toute le même prix. Au lieu de fixer le prix chambre par chambre, ce qui serait pénible, on définit la notion de catégorie de chambre.

Une categorie a un nom, indique la taille de chambre à laquelle elle correspond, et est associée à un calendrier de tarifs.

La classe CategorieChambre est déjà écrite... Vous n'avez rien à faire.

Chambre

Un objet de classe Chambre représente... une chambre.

La classe Chambre est déjà écrite... Vous n'avez rien à faire.

Sejour

Un objet séjour représente un séjour dans une chambre pour une période de temps donnée. Il sera utilisé dans HotelFrontOffice.

La classe Sejour est déjà écrite... Vous n'avez rien à faire.

HotelBackOffice

La classe HotelBackOffice représente l'hôtel vu de manière fixe, indépendamment des clients et de leurs séjours.

Implémentez la méthode getChambres de la classe HotelBackOffice pour faire tourner les tests.

HotelFrontOffice

La classe HotelFrontOffice représente le système de réservation et de facturation de l'hôtel.

Un objet HotelFrontOffice connaît les chambres et leurs catégories grâce à la classe HotelBackOffice ; il a cependant aussi besoin de représenter les réservations de chambre, pour savoir quelles sont les chambres libres, et qui occupe telle ou telle chambre à un moment donné.

Je vous laisse le soin de décider de la manière dont vous allez représenter cela. À vous de décider des structures de données que vous allez utiliser en interne. Vous pouvez éventuellement modifier d'autres classes (par exemple Chambre, mais ça n'est pas la seule solution), mais les tests fournis doivent continuer à passer sans modification.