Mini Projet : application pour gérer lés réservations des chambres d’hotels


Évaluation du projet : ce projet se déroule durant 6 semaines


L’avancement et le sérieux durant cette activité sont prises en compte


Démonstration

semaine 1 :
* Réaliser le MCD (Modèle Conceptuel de Données) à partir du MR (Modèle Relationnel) sur le logiciel “looping”.
* Modifier le script SQL de looping, de façon à avoir un script SQL pour supprimer puis re-créer toutes les tables en étant conforme au modèle relationnel joint, utiliser ensuite le jeu de test en fin de TP sans le modifier.
* Compléter/Modifier le code (uniquement les requêtes SQL) du contrôleur de la table station de façon à faire fonctionner le CRUD de l’application sur cette table

semaine 2 :
* Compléter/Modifier le code (uniquement les requêtes SQL) du contrôleur de la table client de façon à faire fonctionner le CRUD de l’application sur cette table.
* Mettre en MVC (Modède/Vue/Controleur) le code dans les dossiers Modele et Controller (et validator) de façon à ce que le CRUD sur la table station soit toujours fonctionnel.

Évaluation du MCD, du script SQL, du CRUD (Create/Read/Update/Delete) de la table station

semaine 3 :

semaine 4 :

semaine 5 :

Mettre en MVC (Modède/Vue/Controleur) le code dans les dossiers Modele et Controller de façon à ce que le CRUD sur la table hotel soit toujours fonctionnel.

Évaluation du CRUD sur la table chambre,
Évaluation de la version MVC (Modède/Vue/Controleur) du CRUD de l’application sur la table hotel

semaine 6 : dernière évaluation
Finaliser l’application

Évaluation des différentes fonctionnalités de l’application sur la table emprunt :

Évaluation de la version MVC (Modède/Vue/Controleur) du CRUD de l’application sur la table client


Remarque importante :


On désire dans cet exercice, modéliser de façon simplifiée le système d’information de gestions des chambres dans un(des) hotel(s).

Soit le modèle relationnel suivant :



STATION(idStation,nomStation,altitude,region)

HOTEL(idHotel,nomHotel,#station_id, categorie)

CHAMBRE(#idHotel, numChambre, nbLits, prixLocationJour, fraisService)

CLIENT(idClient ,nomClient, adresse, telephone)

RESERVATION(#idClient,#idHotel,#numChambre,dateDebut, dateFin, nbPersonne, acompte, paiementSolde, remise )




Semaine 1 : Définition des données (LDD), premier CRUD : auteur

Question 1 : MCD

Établir le modèle conceptuel des données (MCD) associé à ce modèle relationnel sur le logiciel Looping.

SQL, création des tables et importation des données

En utilisant le script généré par looping :

Écrire dans un fichier script_tp5.sql le script de création des tables correspondant au modèle ci dessus.


(Utiliser les mots clés IF EXISTS lors de la suppression de la table et IF NOT EXISTS lors de la création des tables.)

Logiciel pour gérer les reservations : la table “station”

Commencer par tester des requêtes (sur un terminal ou ‘datagrip’) avant de les utiliser dans une application python pour gérer les hôtels, leurs chambres, les clients et les stations et enfin les réservations des chambres.


Dans un terminal ou sur le logiciel ‘datagrip’, réaliser les requêtes suivantes :

Interrogation des données (LID) : SELECT

+-----------+--------------------+----------+----------------+----------+
| idStation | nomStation         | altitude | region         | nbHotels |
+-----------+--------------------+----------+----------------+----------+
|         1 | Metabief           |     1512 | Jura           |        2 |
|         2 | Courchevel         |     1820 | Haute-Savoie   |        2 |
|         3 | Meribel            |     1920 | Haute-Savoie   |        2 |
|         4 | Chapelle-des-bois  |     1100 | Jura           |        2 |
|         5 | le ballon d alsace |     1100 | Tre de Belfort |        0 |
+-----------+--------------------+----------+----------------+----------+

Manipulation des données (LMD) : INSERT – UPDATE – DELETE


application python (flask) pour gérer les réservations d’un hotel ( table : les stations)


Configurer le fichier de connexion à la base de données : connexion_db.py avec vos paramètres : host,login,password,database


Ré-utiliser les requêtes ci-dessus dans le fichier controllers/admin_station.py ; tester l’application pour afficher/ajouter/supprimer/modifier des enregistrements.

L’interface web (mini-projet) ci-dessous réutilise le résultat de cette requête .

résultat dans l’application python

Pour la suppression d’une station, décommenter le code dans la fonction delete_station, de façon à ce que l’on ne puisse pas supprimer une station qui possède des hôtels dans la base de données, mais indiquer avec un message le nombre d’hôtel(s) à supprimer

Semaine 2 : la table “client”

Dans un terminal ou sur le logiciel datagrip, réaliser les requêtes suivantes :

Interrogation des données (LID) : SELECT

Pour faire ce calcul, faire une jointure à gauche (ou droite) sur la table réservation

Faire un premier test et afficher le nombre de réservations

Dans l’interface de l’application si ce nombre de réservation (< 2 ans) est supérieur à 2, un message indique qu’il faudrait faire une remise lors de sa prochaine réservation au client

Documentation (CURRENT_DATE() ou NOW() ou CURRENT_DATE() )

+----------+-------------------+-----------------------------------------+------------+----------------+--------------------------+
| idClient | nomClient         | adresse                                 | telephone  | nbReservations | nbReservations_moins2ans |
+----------+-------------------+-----------------------------------------+------------+----------------+--------------------------+
|        1 | Dupont Paul       | 8 rue du jardin BELFORT                 | 0602030405 |              2 |                        1 |
|        2 | Lang Coralie      | 83 Avenue Millies Lacroix TOULOUSE      | 0661521923 |             10 |                        4 |
|        3 | Durand Jacques    | 11 rue de la lavande AVIGNON            | 0684623597 |              2 |                        1 |
|        4 | Martin Thomas     | 14 rue du rocher PARIS                  | 0612457896 |              2 |                        1 |
|        5 | Michel Pascal     | 11 rue de la lavande AVIGNON            | 0684623597 |              2 |                        1 |
|        6 | Nadeau Alexandrin | 15 rue de la Mare aux Carats MONTROUGE  | 0631743559 |              2 |                        1 |
|        7 | Chatigny Arthur   | 82 Place Charles de Gaulle VILLEMOMBLE  | 0643520365 |              4 |                        2 |
+----------+-------------------+-----------------------------------------+------------+----------------+--------------------------+

Manipulation des données (LMD) : INSERT – UPDATE – DELETE

application python (flask) pour les réservations d’un hotel ( table : client)


Recopier les requêtes ci-dessus controllers/admin_client.py ; tester l’application pour afficher/ajouter/supprimer/modifier des enregistrements

L’interface web (mini-projet) ci-dessous réutilise le résultat de cette requête

résultat dans l’application python




Semaine 3 : la table “hotel”

Dans un terminal ou sur le logiciel datagrip, réaliser les requêtes suivantes :

Interrogation des données (LID) : SELECT

LEFT JOIN CHAMBRE AS CH2 on CH1.idHotel = CH2.idHotel AND  CH1.numChambre = CH2.numChambre AND CH2.disponible=0

résultat

+---------+--------------------+-------------------+----------------+--------------+------------------+------------+------------+
| idHotel | nomHotel           | nomStation        | categorie      | region       | photo    | nbChambres | nbChambresNonDisponible
+---------+--------------------+-------------------+----------------+--------------+------------------+------------+------------+
|      30 | au jura            | Chapelle-des-bois | deux étoiles   | Jura         | hotel_jura1.png  |          4 |          1 |
|      31 | source du herisson | Chapelle-des-bois | deux étoiles   | Jura         | hotel_jura2.png  |          2 |          0 |
|      16 | Bellevue           | Courchevel        | deux étoiles   | Haute-Savoie | hotel_alpes1.png |          3 |          0 |
|      10 | Neige Blanche      | Courchevel        | trois étoiles  | Haute-Savoie | hotel_alpes1.png |          3 |          0 |
|       5 | Le Lac Bleu        | Meribel           | deux étoiles   | Haute-Savoie | hotel_alpes3.png |          1 |          0 |
|       4 | Le Savoy Méribel   | Meribel           | deux étoiles   | Haute-Savoie | hotel_alpes2.png |          2 |          0 |
|      22 | Douce Brise        | Metabief          | deux étoiles   | Jura         | hotel_jura3.png  |          4 |          1 |
|      20 | Les marmottes      | Metabief          | trois étoiles  | Jura         |                  |          3 |          0 |
+---------+--------------------+-------------------+----------------+--------------+------------------+------------+------------+

Manipulation des données (LMD) : INSERT – UPDATE – DELETE

application python (flask) pour gérer l’hotel


Recopier les requêtes ci-dessus controllers/admin_hotel.py ; tester l’application pour afficher/ajouter/supprimer/modifier des enregistrements

L’interface web (mini-projet) ci-dessous réutilise le résultat de ces requêtes

résultat dans l’application python

Semaine 4 : la table “chambre”


Dans le logiciel qui gère les réservations des hôtels, la gestion des chambres est différente des autres tables.


Le lien “gérer les chambres” depuis l’interface d’affichage des hôtels permet de gérer les chambres uniquement de l’hôtel sélectionné. Chaque requête par la suite va faire référence au numéro de l’hôtel passé dans le lien.

résultat dans l’application python

Dans un terminal ou sur le logiciel datagrip, réaliser les requêtes suivantes :

Interrogation des données (LID) : SELECT

exemple de résultat pour l’hotel d’identifiant 30 :

+---------+------------+--------+--------------+--------------+------------+----------------------+
| idHotel | numChambre | nbLits | prixLocation | fraisService | disponible | disponibleAujourdhui |
+---------+------------+--------+--------------+--------------+------------+----------------------+
|      30 |          1 |      3 |       250.00 |         4.00 |          1 | nonLibre             |
|      30 |          2 |      2 |       150.00 |         5.00 |          1 | libre                |
|      30 |          3 |      2 |       150.00 |         5.00 |          1 | libre                |
|      30 |          4 |      2 |       150.00 |         5.00 |          0 | libre                |
+---------+------------+--------+--------------+--------------+------------+----------------------+

exemple de résultat pour l’hotel d’identifiant 30 :

exemple de résultat pour l’hotel d’identifiant 30 :

+---------+----------+-------------------+---------------+--------+-----------------+------------+---------------+-----------------+
| idHotel | nomHotel | nomStation        | categorie     | region | photo           | nbChambres | nbChambresNon | nbChambresDispo |
|         |          |                   |               |        |                 |            |   Disponible  | nibleAujourdhui |
+---------+----------+-------------------+---------------+--------+-----------------+------------+---------------+-----------------+
|      30 | au jura  | Chapelle-des-bois | deux étoiles  | Jura   | hotel_jura1.png |          4 |         1     |               2 |
+---------+----------+-------------------+---------------+--------+-----------------+------------+---------------+-----------------+

mettre les requetes dans l’application python

résultat dans l’application python

Manipulation des données (LMD) : INSERT – UPDATE – DELETE

Pour modifier un enregistrement :

Pour supprimer un enregistrement :

application python (flask) pour gérer l’hotel


Recopier les requêtes ci-dessus controllers/admin_chambre.py ; tester l’application pour afficher/ajouter/supprimer/modifier des enregistrements

L’interface web (mini-projet) ci-dessous réutilise le résultat de cette requête

exemple d’interface dans l’application python




Semaine 5 : la table “reservation”

Méthodes nécessaires pour faire l’application

Interface : selection du client ?

exemple de résultat

Interface affichage des réservation du client

idée : calcul du cout de chaque réservation exemple de résultat

Interface 1 : sélectionner 2 dates et une station ou un région et proposer toutes les chambres disponibles exemple de résultat

Interface 2 : proposer pour 1 mois (ou 2 mois) les réservations des chambres dans une station ou toutes les station

exemple de résultat

Interface 3 : réservation et facturation

calcul du cout de réservation d’une chambre

Interface supprimer en cascade des réservation

exemple de résultat

Pour sélectionner un client ; fonction : reservation_select_client

Dans le fichier controllers/admin_reservation.py, pour sélectionner des clients, il y a 2 cas :

exemple de résultat

Lors de la suppression des reservations (en cascade)

Liste des reservations idClient(id), numChambre(id), idHotel, nomHotel nomClient , date_debut, date_retour , nombre de jours entre la date d’aujourd’hui (curdate) et la date_debut, si le paramètre idClient est vide, afficher tous les reservations (find_clients_select_reservations(idClient))


bilan et ca ; taux d’occupation …

Afficher le CA des chambres dans un hotel pour 1 mois ; 1 an Afficher le taux d’occupation dans un hotel des chambres pour une période donnée


ANNEXE


INSERT INTO STATION(idStation,nomStation,altitude,region) VALUES
                          (1, 'Metabief', 1512, 'Jura'),
                          (2, 'Courchevel', 1820, 'Haute-Savoie'),
                          (3, 'Meribel', 1920, 'Haute-Savoie'),
                          (4, 'Chapelle-des-bois',1100, 'Jura'),
                          (5, 'le ballon d alsace',1100, 'Tre de Belfort');


INSERT INTO HOTEL(idHotel,nomHotel,station_id, categorie, photo) VALUES
                        (22, 'Douce Brise', 1, 'deux étoiles', 'hotel_jura3.png'),
                        (20, 'Les marmottes', 1, 'trois étoiles', ''),
                        (16, 'Bellevue', 2, 'deux étoiles', 'hotel_alpes1.png'),
                        (10, 'Neige Blanche', 2, 'trois étoiles', 'hotel_alpes1.png'),
                        (4, 'Le Savoy Méribel', 3, 'deux étoiles', 'hotel_alpes2.png'),
                        (5, 'Le Lac Bleu', 3, 'deux étoiles', 'hotel_alpes3.png'),
                        (30, 'au jura', 4, 'deux étoiles', 'hotel_jura1.png'),
                        (31, 'source du herisson', 4, 'deux étoiles', 'hotel_jura2.png');

INSERT INTO CHAMBRE(idHotel,numChambre,nbLits, prixLocation,fraisService,disponible) VALUES
                          (22, 1, 2, 75,9,1),
                          (22, 2, 1, 50,8,1),
                          (22, 3, 3, 100,3,1),
                          (22, 4, 3, 100,3,0),
                          (20, 1, 2, 150,7,1),
                          (20, 2, 1, 200,15,1),
                          (20, 3, 3, 250,0,1),
                          (16, 1, 2, 75,1,1),
                          (16, 2, 1, 50,0,1),
                          (16, 3, 3, 100,8,1),
                          (10, 1, 2, 150,6,1),
                          (10, 2, 3, 250,4,1),
                          (10, 3, 3, 250,5,1),
                          (4, 1, 2, 150,3,1),
                          (4, 2, 1, 100,1,1),
                          (5, 1, 3, 120,2,1),
                          (30, 1, 3, 250,4,1),
                          (30, 2, 2, 150,5,1),
                          (30, 3, 2, 150,5,0),
                          (30, 4, 2, 150,5,0),
                          (31, 1, 1, 100,0,1),
                          (31, 2, 3, 120,5,1);

INSERT INTO CLIENT(idClient,nomClient, adresse, telephone) VALUES
                        (1, 'Dupont Paul', '8 rue du jardin BELFORT', '0602030405'),
                         (2, 'Lang Coralie', '83 Avenue Millies Lacroix TOULOUSE', '0661521923'),
                         (3, 'Durand Jacques', '11 rue de la lavande AVIGNON', '0684623597'),
                         (4, 'Martin Thomas', '14 rue du rocher PARIS', '0612457896'),
                         (5, 'Michel Pascal', '11 rue de la lavande AVIGNON', '0684623597'),
                         (6, 'Nadeau Alexandrin', '15 rue de la Mare aux Carats MONTROUGE', '0631743559'),
                         (7, 'Chatigny Arthur', '82 Place Charles de Gaulle VILLEMOMBLE ', '0643520365');


INSERT INTO RESERVATION(idClient,idHotel, numChambre, dateDebut,dateFin, nbPersonne,acompte,paiementSolde,remise) VALUES
                              (1, 22, 1, '2017-01-16', '2017-01-24', 1,58,0,0),
                              (2, 22, 2, '2017-01-14', '2017-01-18', 1,48,0,0),
                              (3, 16, 2, '2017-01-10', '2017-01-22', 1,95,0,0),
                              (4, 16, 3, '2017-02-10', '2017-02-20', 3,58,0,0),
                              (5, 10, 3, '2017-02-05', '2017-02-20', 3,63,0,0),
                              (6, 4, 1, '2017-02-10', '2017-02-18', 2,15,0,0),
                              (7, 5, 1, '2017-02-10', '2017-02-18', 3,87,0,0),
                              (2, 4, 2, '2016-12-10', '2016-12-20', 1,52,0,0),
                              (2, 4, 1, '2016-12-10', '2016-12-20', 1,50,0,0),
                              (7, 30, 1, '2018-02-10', '2018-02-18', 3,15,0,0),
                              (2, 30, 2, '2017-12-10', '2017-12-20', 1,18,0,0),
                              (2, 31, 2, '2018-12-10', '2018-12-20', 1,19,0,0);

INSERT INTO RESERVATION(idClient,idHotel, numChambre, dateDebut,dateFin, nbPersonne,acompte,paiementSolde,remise) VALUES
                              (1, 22, 1, '2021-01-16', '2021-01-24', 1,58,0,0),
                              (2, 22, 2, '2021-01-14', '2021-01-18', 1,48,0,0),
                              (3, 16, 2, '2021-01-10', '2021-01-22', 1,95,0,0),
                              (4, 16, 3, '2021-02-10', '2021-02-20', 3,58,0,0),
                              (5, 10, 3, '2021-02-05', '2021-02-20', 3,63,0,0),
                              (6, 4, 1, '2021-02-10', '2021-02-18', 2,15,0,0),
                              (7, 5, 1, '2021-02-10', '2021-02-18', 3,87,0,0),
                              (2, 4, 2, '2019-12-10', '2019-12-20', 1,52,0,0),
                              (2, 4, 1, '2020-12-10', '2020-12-20', 1,50,0,0),
                              (7, 30, 1, '2022-02-10', '2022-02-18', 3,15,0,0),
                              (2, 30, 2, '2021-12-10', '2021-12-20', 1,18,0,0),
                              (2, 31, 2, '2022-12-10', '2022-12-20', 1,19,0,0);