commit de fin

This commit is contained in:
dumasa 2022-03-22 06:10:18 -07:00
commit 8080015638
248 changed files with 1543 additions and 0 deletions

BIN
Main.jar Normal file

Binary file not shown.

1
PROJETIHM_FA/Chemin.txt Normal file
View File

@ -0,0 +1 @@
Class-Path: libs/mariadb-client.jar

BIN
PROJETIHM_FA/Main.jar Normal file

Binary file not shown.

142
PROJETIHM_FA/Makefile Normal file
View File

@ -0,0 +1,142 @@
# COMMANDES #
JAVAC = javac
# note $$ to get a single shell $
JAVAC_OPTIONS = -encoding "UTF-8" -d build -cp "libs/mariadb-client.jar" -sourcepath "src" -implicit:none
JAVA = java
JAR = jar
EXEC_JAR = ${JAVA} -jar
# CHEMINS RELATIFS
SRC = src/fr/iutfbleau/projetIHM2021FI2
BUILD = build/fr/iutfbleau/projetIHM2021FI2
DOC = doc/fr/iutfbleau/projetIHM2021FI2
# CHOIX NOMS
JAR_MAIN = Main.jar
# BUTS FACTICES #
.PHONY : run clean doc
# BUT PAR DEFAUT #
run : ${JAR_MAIN}
${EXEC_JAR} ${JAR_MAIN} -cp "libs/mariadb-client.jar"
# AUTRE BUTS
doc :
javadoc -d doc -cp "libs/mariadb-client.jar" src/fr/iutfbleau/projetIHM2021FI2/API/*.java src/fr/iutfbleau/projetIHM2021FI2/IHM1/*.java src/fr/iutfbleau/projetIHM2021FI2/Model/*.java src/fr/iutfbleau/projetIHM2021FI2/Controller/*.java src/fr/iutfbleau/projetIHM2021FI2/View/*.java
clean :
rm -rf ${BUILD}/* *.jar
# REGLES DE DEPENDANCE #
## API ##
${BUILD}/API/MonPrint.class : ${SRC}/API/MonPrint.java
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/MonPrint.java
${BUILD}/API/TypeChambre.class : ${SRC}/API/TypeChambre.java
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/TypeChambre.java
${BUILD}/API/Chambre.class : ${SRC}/API/Chambre.java \
${BUILD}/API/TypeChambre.class\
${BUILD}/API/MonPrint.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/Chambre.java
${BUILD}/API/Client.class : ${SRC}/API/Client.java \
${BUILD}/API/MonPrint.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/Client.java
${BUILD}/API/Prereservation.class : ${SRC}/API/Prereservation.java \
${BUILD}/API/TypeChambre.class \
${BUILD}/API/Client.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/Prereservation.java
${BUILD}/API/Reservation.class : ${SRC}/API/Reservation.java \
${BUILD}/API/Prereservation.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/Reservation.java
${BUILD}/API/PrereservationFactory.class : ${SRC}/API/PrereservationFactory.java \
${BUILD}/API/Prereservation.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/PrereservationFactory.java
${BUILD}/API/ReservationFactory.class : ${SRC}/API/ReservationFactory.java \
${BUILD}/API/Prereservation.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/ReservationFactory.java
# ## JARS ##
${JAR_MAIN} : ${BUILD}/Main.class
${JAR} cvfem ${JAR_MAIN} fr.iutfbleau.projetIHM2021FI2.Main Chemin.txt -C build fr
## Model ##
${BUILD}/Model/ConnexionBDD.class : ${SRC}/Model/ConnexionBDD.java
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Model/ConnexionBDD.java
${BUILD}/Model/ConnexionBDD.class : ${SRC}/Model/ConnexionBDD.java
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Model/ConnexionBDD.java
${BUILD}/Model/RecupChambre.class : ${SRC}/Model/RecupChambre.java \
${BUILD}/API/Client.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Model/RecupChambre.java
${BUILD}/Model/PrereservationModel.class : ${SRC}/Model/PrereservationModel.java \
${BUILD}/API/Prereservation.class \
${BUILD}/Model/RecupChambre.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Model/PrereservationModel.java
${BUILD}/Model/PrereservationFactoryModel.class : ${SRC}/Model/PrereservationFactoryModel.java \
${BUILD}/API/PrereservationFactory.class \
${BUILD}/Model/PrereservationModel.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Model/PrereservationFactoryModel.java
${BUILD}/Model/RecupClient.class : ${SRC}/Model/RecupClient.java \
${BUILD}/API/Chambre.class \
${BUILD}/Model/ConnexionBDD.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Model/RecupClient.java
## Controller ##
${BUILD}/Controller/MainWindowController.class : ${SRC}/Controller/MainWindowController.java
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Controller/MainWindowController.java
${BUILD}/Controller/SearchButtonController.class : ${SRC}/Controller/SearchButtonController.java \
${BUILD}/Model/PrereservationFactoryModel.class \
${BUILD}/View/PrereservationView.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Controller/SearchButtonController.java
${BUILD}/Controller/SelectButtonController.class : ${SRC}/Controller/SelectButtonController.java \
${BUILD}/View/ChambresView.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Controller/SelectButtonController.java
## View ##
${BUILD}/View/WindowView.class : ${SRC}/View/WindowView.java \
${BUILD}/Controller/MainWindowController.class \
${BUILD}/View/PrereservationView.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/View/WindowView.java
${BUILD}/View/PrereservationView.class : ${SRC}/View/PrereservationView.java
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/View/PrereservationView.java
${BUILD}/View/ChambresView.class : ${SRC}/View/ChambresView.java \
${BUILD}/Model/RecupClient.class \
${SRC}/Controller/SelectButtonController.java
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/View/ChambresView.java
## Main ##
${BUILD}/Main.class : ${SRC}/Main.java \
${BUILD}/Model/ConnexionBDD.class \
${BUILD}/Controller/SearchButtonController.class \
${BUILD}/Controller/SelectButtonController.class \
${BUILD}/View/WindowView.class
${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Main.java

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,57 @@
package fr.iutfbleau.projetIHM2021FI2.API;
/**
* Une chambre
*/
public interface Chambre extends MonPrint {
/**
* permet de récupérer le numéro de la chambre.
* @return le numéro.
*/
public int getNumero();
/**
* permet de savoir si la chambre a un seul lit qui est simple
* @return vrai si c'est le cas.
* @deprecated replaced by {@link #getType()}
*/
@Deprecated
public boolean unLitSimple();
/**
* permet de savoir si la chambre a deux lits simples
* @return vrai si c'est le cas.
* @deprecated replaced by {@link #getType()}
*/
@Deprecated
public boolean deuxLitsSimples();
/**
* permet de savoir si la chambre a un lit double
* @return vrai si c'est le cas.
* @deprecated replaced by {@link #getType()}
*/
@Deprecated
public boolean unLitDouble();
/**
* @return le type de chambre (un type énuméré de l'API)
*
* NB. Les trois méthodes ci-dessus sont assez moches.
* De toute façon Chambre ou Prérerservation exposent le type énuméré TypeChambre à la vue.
* Il est donc plus simple d'ajouter des types de chambre à ce type énuméré plutôt que d'ajouter des tests ici.
* Je laisse les méthodes obsolètes pour illustrer l'annotation <pre>@deprecated</pre> de la javadoc.
*/
public TypeChambre getType();
/**
* @return un string contenant les informations de la chambre
* @see MonPrint
* NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici.
*/
public default String monPrint() {
return String.format("Chambre " + getNumero() + " ("+ getType() +")");
}
}

View File

@ -0,0 +1,35 @@
package fr.iutfbleau.projetIHM2021FI2.API;
/**
* Un client
*/
public interface Client extends MonPrint{
/**
* permet de récupérer l'identifiant du client (qu'on suppose être le même pour les différents systèmes, internes et externes à l'hôtel).
* @return l'identifiant.
*/
public int getId();
/**
* permet de récupérer
* @return le nom du client.
*/
public String getNom();
/**
* permet de récupérer
* @return le prénom du client
*/
public String getPrenom();
/**
* @return un string contenant les informations du client
* @see MonPrint
* NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici.
*/
public default String monPrint() {
return String.format("Nom " + getNom() + " Prenom " + getPrenom() + " (id="+getId()+")");
}
}

View File

@ -0,0 +1,12 @@
package fr.iutfbleau.projetIHM2021FI2.API;
/**
* Toutes nos interfaces vont étendre cette interface.
*/
public interface MonPrint {
/**
* Fonctionne comme ToPrint() sauf car une interface n'a pas le droit de faire un override sur ToPrint().
* Toutes nos interfaces vont étendre cette interface.
*/
public String monPrint();
}

View File

@ -0,0 +1,54 @@
package fr.iutfbleau.projetIHM2021FI2.API;
import java.time.LocalDate;
/**
* Une préréservation
*
* e.g. utilisé par le système de réservation externe à l'hôtel.
*
*/
public interface Prereservation extends MonPrint{
/**
* permet de récupérer
* @return la référence.
*/
public String getReference();
/**
* permet de récupérer
* @return la date de début
*
* A priori seule la date est importante, le reste est sans importance.
*/
public LocalDate getDateDebut();
/**
* permet de récupérer
* @return la durée en jours (mais comme un entier)
*/
public int getJours();
/**
* permet de récupérer
* @return le type de chambre
*/
public TypeChambre getTypeChambre();
/**
* permet de récupérer
* @return le client
*/
public Client getClient();
/**
* @return un string contenant les informations de la réservation
* @see MonPrint
* NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici.
*/
public default String monPrint() {
return String.format("Préréservation " + getReference() + ": " + getClient().monPrint() + " le " + getDateDebut().toString() + " pour " + getJours() + " nuit(s) ");
}
}

View File

@ -0,0 +1,34 @@
package fr.iutfbleau.projetIHM2021FI2.API;
import java.util.*;
/**
* Cette interface est une usine abstraite.
*
* Elle permet de rechercher les préréservations à partir du numéro d'une préréservation, ou bien du nom et prenom d'un Client.
*
*/
public interface PrereservationFactory{
/**
* Recherche une préréservation par reference
* @param r la référence du système de préréservation
* @return la préréservation.
* @throws NullPointerException si un argument est null
* @throws IllegalStateException si la Préréservation avec cette référence n'existe pas.
*
* Ne devrait pas retourner un objet null.
*/
public Prereservation getPrereservation(String r);
/**
* Recherche une préréservation par nom et prenom
* @param n le nom
* @param p le prenom
* @return un ensemble de préréservations.
* @throws NullPointerException si un argument est null
* @throws IllegalStateException si aucune préréservation n'existe avec ce nom
*
* Ne devrait pas retourner un objet null ou un ensemble vide.
*/
public Set<Prereservation> getPrereservations(String n, String p);
}

View File

@ -0,0 +1,56 @@
package fr.iutfbleau.projetIHM2021FI2.API;
import java.time.LocalDate;
/**
* Une Réservation
*
* e.g. utilisé par le système de réservation interne à l'hôtel.
*
*/
public interface Reservation {
/**
* permet de récupérer
* @return la référence.
*/
public String getReference();
/**
* permet de récupérer
* @return la date de début
*
* A priori seule la date est importante, le reste est sans importance.
*/
public LocalDate getDateDebut();
/**
* permet de récupérer
* @return la durée en jours (mais comme un entier)
*/
public int getJours();
/**
* permet de récupérer
* @return la chambre
*/
public Chambre getChambre();
/**
* permet de récupérer
* @return le client
*/
public Client getClient();
/**
* @return un string contenant les informations de la réservation
* @see MonPrint
* NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici.
*/
public default String monPrint() {
return String.format("Réservation " + getReference() + ": " + getClient().monPrint() + " le " + getDateDebut().toString() + " pour " + getJours() + " nuit(s) " + getChambre().monPrint());
}
}

View File

@ -0,0 +1,182 @@
package fr.iutfbleau.projetIHM2021FI2.API;
import java.time.LocalDate;
import java.util.*;
/**
* Cette interface est une usine abstraite.
*
* Elle permet de trouver une ou des chambres à partir d'une préréservation, de créer une réservation.
* Elle permet aussi de compter toutes les chambres d'un certain type (disponibles ou non).
*
* Conseil :
* si vous instantiez cette classe pour proposer un modèle persistent avec une base de données, attention à ne pas faire des choses qu'on peut faire efficacement en BdD côté Java.
* En particulier, ne pas faire des jointures ou de l'aggrégat côté java alors que votre bdd fait ça beaucoup plus efficacement.
* Plus de détails ici : https://use-the-index-luke.com/sql/join/nested-loops-join-n1-problem
*
* Autre conseil :
* vous n'êtes probablement pas obligé de coder toutes les méthodes listées ici pour que votre projet soit terminé.
* Cette interface est volontairement assez complète pour permettre de faire varier le sujet du projet sans la changer.
*
* Je ne l'ai pas ajouté individuellement pour la documentation de chaque méthode, mais si la classe réalisant cette interface ne réalise pas vraiment une méthode, vous pouvez lever
* java.lang.UnsupportedOperationException
* avec un message "pas encore implanté" ou "aucune implantation prévue" selon les cas.
*
* La raison de cette absence dans la documentation ci-dessous c'est qu'il s'agit d'une Exception héritant de RuntimeException.
* La doc indique aussi :
* "RuntimeException and its subclasses are unchecked exceptions. Unchecked exceptions do not need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary."
*
*/
public interface ReservationFactory{
/**
* Recherche une chambre adéquate à partir de
* @param p une préréservation
* @return la chambre
* @throws NullPointerException si un argument est null
* @throws IllegalStateException si une chambre correspondant à cette Préréservation n'existe pas.
*
* Ne devrait pas retourner un objet null.
*/
public Chambre getChambre(Prereservation p);
/**
* Recherche toutes les chambres adéquates à partir de
* @param p une préréservation
* @return les chambres (set de chambre)
* @throws NullPointerException si un argument est null
* @throws IllegalStateException si une chambre correspondant à cette Préréservation n'existe pas.
*
* Ne devrait pas retourner un objet null.
*/
public Set<Chambre> getChambres(Prereservation p);
/**
* Fabrique (ajoute) une réservation
* @param p une préréservation
* @param c une chambre (normalement libre et adaptée à la préréservation)
* @return la réservation
* @throws NullPointerException si un argument est null
* @throws IllegalArgumentException si la chambre ne correspondant pas au type de chambre de la préréservation.
* @throws IllegalStateException si la chambre n'est pas disponible.
*
* Ne devrait pas retourner un objet null.
*/
public Reservation createReservation(Prereservation p, Chambre c);
/**
* Cherche les réservations
* @param d une date
* @return la ou les réservation(s) à cette date sous forme d'un ensemble
* @throws NullPointerException si un argument est null
*
* Ne devrait pas retourner un objet null, par contre peut être un ensemble qui est vide.
*/
public Set<Reservation> getReservation(LocalDate d);
/**
* Cherche le nombre de chambres disponibles pour une date (réservées ou non).
* @param d une date
* @return un entier
* @throws NullPointerException si un argument est null
*
* Ne devrait pas retourner un entier négatif.
*/
public int getDisponibles(LocalDate d);
/**
* Cherche les réservations
* @param d une date
* @param t un type de chambre
* @return la ou les réservation(s) pour ce type de chambre à cette date sous forme d'un ensemble
* @throws NullPointerException si un argument est null
*
* Ne devrait pas retourner un objet null, par contre peut être un ensemble qui est vide.
*/
public Set<Reservation> getReservation(LocalDate d, TypeChambre t);
/**
* Cherche le nombre de chambres disponibles d'un certain type pour une date (réservées ou non).
* @param d une date
* @param t un type de chambre
* @return un entier
* @throws NullPointerException si un argument est null
*
* Ne devrait pas retourner un entier négatif.
*/
public int getDisponibles(LocalDate d, TypeChambre t);
/**
* Cherche la proportion de chambres disponibles pour une date (réservées sur réservables).
* @param d une date
* @return un entier entre 0 et 100
* @throws NullPointerException si un argument est null
*/
public int getRatio(LocalDate d);
/**
* Cherche la proportion de chambres disponibles d'un certain type pour une date (réservées sur réservables).
* @param d une date
* @param t un type de chambre
* @return un entier entre 0 et 100
* @throws NullPointerException si un argument est null
*/
public int getRatio(LocalDate d, TypeChambre t);
/**
* Cherche le nombre moyen de chambres disponibles entre deux date (réservées ou non), arrondies à l'entier inférieur.
* @param d1 une date
* @param d2 une date
* @return un entier
* @throws NullPointerException si un argument est null
* @throws IllegalArgumentException si l'ordre temporel d1 avant d2 n'est pas respecté.
*
* Ne devrait pas retourner un entier négatif.
*/
public int getDisponibles(LocalDate d1, LocalDate d2);
/**
* Cherche les réservations
* @param d1 une date
* @param d2 une date
* @param t un type de chambre
* @return la ou les réservation(s) pour ce type de chambre entre les dates sous forme d'un ensemble
* @throws NullPointerException si un argument est null
* @throws IllegalArgumentException si l'ordre temporel d1 avant d2 n'est pas respecté.
*
* Ne devrait pas retourner un objet null, par contre peut être un ensemble qui est vide.
*/
public Set<Reservation> getReservation(LocalDate d1, LocalDate d2, TypeChambre t);
/**
* Cherche le <b>nombre moyen</b> de chambres disponibles d'un certain type entre deux date (réservées ou non), arrondies à l'entier inférieur.
* @param d1 une date
* @param d2 une date
* @param t un type de chambre
* @return un entier
* @throws NullPointerException si un argument est null
* @throws IllegalArgumentException si l'ordre temporel d1 avant d2 n'est pas respecté.
*
* Ne devrait pas retourner un entier négatif.
*/
public int getDisponibles(LocalDate d1, LocalDate d2, TypeChambre t);
/**
* Cherche la <b>proportion moyenne</b> de chambres disponibles pour une date (réservées sur réservables).
* @param d1 une date
* @param d2 une date
* @return un entier entre 0 et 100
* @throws NullPointerException si un argument est null
*/
public int getRatio(LocalDate d1, LocalDate d2);
/**
* Cherche la <b>proportion moyenne</b> de chambres disponibles d'un certain type pour une date (réservées sur réservables).
* @param d1 une date
* @param d2 une date
* @param t un type de chambre
* @return un entier entre 0 et 100
* @throws NullPointerException si un argument est null
*/
public int getRatio(LocalDate d1, LocalDate d2, TypeChambre t);
}

View File

@ -0,0 +1,10 @@
package fr.iutfbleau.projetIHM2021FI2.API;
public enum TypeChambre {
UNLS ("Un lit simple"), DEUXLS ("Deux lits simples"), UNLD ("Un lit double");
private final String name;
private TypeChambre(String s) {
name = s;
}
}

View File

@ -0,0 +1,36 @@
package fr.iutfbleau.projetIHM2021FI2.Controller;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import fr.iutfbleau.projetIHM2021FI2.Model.ConnexionBDD;
/**
* La classe MainWindowController permet de se déconnecter de la base de données lorsqu'on ferme la fenêtre.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class MainWindowController implements WindowListener {
public void windowActivated (WindowEvent e) {
}
public void windowClosed (WindowEvent e) {
}
public void windowClosing (WindowEvent e) {
ConnexionBDD.getInstance().close();
}
public void windowDeactivated (WindowEvent e) {
}
public void windowDeiconified (WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowOpened(WindowEvent e) {
}
}

View File

@ -0,0 +1,68 @@
package fr.iutfbleau.projetIHM2021FI2.Controller;
import fr.iutfbleau.projetIHM2021FI2.View.*;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import fr.iutfbleau.projetIHM2021FI2.Model.PrereservationFactoryModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.util.Set;
/**
* La classe SearchButtonController permet de répertorier les actions effectués lors d'une recherche.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class SearchButtonController implements ActionListener {
private JTextField champNom;
private JTextField champPrenom;
private JTextField champRef;
public SearchButtonController(JTextField champNom, JTextField champPrenom, JTextField champRef) {
this.champNom = champNom;
this.champPrenom = champPrenom;
this.champRef = champRef;
}
public void fillTable(String nom, String prenom) {
PrereservationFactoryModel factory = new PrereservationFactoryModel();
Set<Prereservation> cResSet = factory.getPrereservations(nom, prenom);
for (Prereservation currRes : cResSet) {
String[] rowToAdd = {currRes.getReference(), currRes.getDateDebut().toString(), String.valueOf(currRes.getJours()), currRes.getTypeChambre().name()};
PrereservationView.getInstance().ajoutTuples(rowToAdd);
}
}
public void fillTable(String reference) {
PrereservationFactoryModel factory = new PrereservationFactoryModel();
Prereservation cRes = factory.getPrereservation(reference);
String[] rowToAdd = {cRes.getReference(), cRes.getDateDebut().toString(), String.valueOf(cRes.getJours()), cRes.getTypeChambre().name()};
PrereservationView.getInstance().ajoutTuples(rowToAdd);
}
public void actionPerformed(ActionEvent e)
{
PrereservationView.getInstance().viderTableau();
System.out.println(this.champNom.getText() + champPrenom.getText() + this.champRef.getText());
if (this.champRef.getText().isEmpty()) {
fillTable(this.champNom.getText(), champPrenom.getText());
}
else {
fillTable(this.champRef.getText());
}
}
}

View File

@ -0,0 +1,48 @@
package fr.iutfbleau.projetIHM2021FI2.Controller;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import fr.iutfbleau.projetIHM2021FI2.Model.*;
import fr.iutfbleau.projetIHM2021FI2.View.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.util.ArrayList;
/**
* La classe SelectButtonController permet de répertorier les actions effectués lors d'une recherche de chambre.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class SelectButtonController implements ActionListener {
public SelectButtonController(JButton button) {
}
public void actionPerformed(ActionEvent e)
{
String Command = e.getActionCommand();
Prereservation preRes = PrereservationView.getInstance().getSelectedReservation();
if (Command == "Valider la préréservation") {
RecupChambre availableRoom = RecupChambre.byDate(preRes.getDateDebut());
int rep = JOptionPane.showOptionDialog(null, availableRoom.monPrint() + " est disponible", "Recherche de chambre", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] { "Oui", "Choisir une autre chambre" }, JOptionPane.YES_OPTION);
if (rep == JOptionPane.YES_OPTION) {
availableRoom.reserve(preRes.getDateDebut());
}
else {
ArrayList<RecupChambre> rooms = RecupChambre.allByDate(preRes.getDateDebut());
// CREATION LISTE DE CHAMBRES
ChambresView.getInstance().update(rooms);
}
}
else if (Command == "Sélectionner cette chambre") {
ChambresView.getInstance().chambreSelectionnee().reserve(preRes.getDateDebut());
}
}
}

View File

@ -0,0 +1,31 @@
package fr.iutfbleau.projetIHM2021FI2.Controller;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
/**
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class TextFieldController implements ActionListener {
private JTextField champPrenom;
private JTextField champRef;
public TextFieldController(JTextField champPrenom, JTextField champNom, JTextField champRef) {
this.champPrenom = champPrenom;
this.champRef = champRef;
}
public void actionPerformed(ActionEvent e)
{
if (this.champPrenom.getText() != "") {
this.champRef.setEditable(false);
}
}
}

View File

@ -0,0 +1,19 @@
package fr.iutfbleau.projetIHM2021FI2;
import fr.iutfbleau.projetIHM2021FI2.Model.*;
import fr.iutfbleau.projetIHM2021FI2.View.*;
/**
* La classe Main permet le démarrage du programme.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class Main {
static public void main(String[] args) {
ConnexionBDD.getInstance();
WindowView window = new WindowView();
}
}

View File

@ -0,0 +1,59 @@
package fr.iutfbleau.projetIHM2021FI2.Model;
import java.sql.*;
import javax.swing.JOptionPane;
/**
* La classe ConnexionBDD permet de se connecter à notre base de données.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class ConnexionBDD {
private static ConnexionBDD connexionInstance = null;
private Connection sqlCo;
//Constructeur
private ConnexionBDD() {
this.sqlCo = null;
this.connect();
}
// CONNEXION BDD TAJGALT
public void connect() {
try {
Class.forName("org.mariadb.jdbc.Driver");
try {
this.sqlCo = DriverManager.getConnection("jdbc:mariadb://dwarves.iut-fbleau.fr/tajgalt", "tajgalt", "tajgalt");
}
catch(SQLException e) {
System.err.println("Identifiants incorrects, vérifiez !");
}
}
catch(ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "Connexion Impossible !", "Connexion", JOptionPane.ERROR_MESSAGE);
}
}
// DECONNEXION BDD
public void close() {
try {
this.sqlCo.close();
}
catch(SQLException e) {
System.err.println("Impossible de se déconnecter");
}
}
public static ConnexionBDD getInstance() {
if (connexionInstance == null) {
connexionInstance = new ConnexionBDD();
}
return connexionInstance;
}
public static Connection getSQLco() {
return connexionInstance.sqlCo;
}
}

View File

@ -0,0 +1,84 @@
package fr.iutfbleau.projetIHM2021FI2.Model;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import java.time.LocalDate;
import java.util.*;
import java.util.function.Predicate;
import java.sql.*;
/**
* La classe PrereservationFactoryModel permet de gérer les préréservations.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class PrereservationFactoryModel implements PrereservationFactory {
private HashMap<String,Prereservation> map =new HashMap<String,Prereservation>();
/** Constructeur */
public PrereservationFactoryModel() {
try {
PreparedStatement pst = ConnexionBDD.getSQLco().prepareStatement(
"SELECT DISTINCT client, reference, debut, nuits, categorie FROM Reservation JOIN Client c ON c.id = client");
pst.executeUpdate();
ResultSet rs = pst.executeQuery();
// On ajoute toutes les préreservations au map
while (rs.next()) {
RecupClient c = RecupClient.byId(rs.getInt("client"));
this.map.put(rs.getString("reference"), new PrereservationModel(rs.getString("reference"), LocalDate.parse(rs.getString("debut")), rs.getInt("nuits"), TypeChambre.values()[rs.getInt("categorie") - 1], c));
}
rs.close();
pst.close();
}
catch(SQLException e) {
System.err.println("Problème lors de la récupération des préréservations.");
}
}
/**
* Recherche par référence
* Ne devrait pas retourner un objet null.
*/
public Prereservation getPrereservation(String r){
Objects.requireNonNull(r,"La référence recherchée est vide.");
if (this.map.containsKey(r)){
return this.map.get(r);
}
else {
throw new IllegalStateException("Il n'existe pas de préréservation avec la référence : " + r);
}
}
/**
* Recherche par nom et prénom
* Ne devrait pas retourner un objet null ou un ensemble vide.
*/
public Set<Prereservation> getPrereservations(String n, String p){
Objects.requireNonNull(n,"Le nom est vide.");
Objects.requireNonNull(p,"Le prénom est vide.");
Collection<Prereservation> c = this.map.values();
Predicate<Prereservation> filtre = preresa -> !preresa.getClient().getNom().equals(n) || !preresa.getClient().getPrenom().equals(p);
// COLLECTION
c.removeIf(filtre);
if (c.isEmpty()){
throw new IllegalStateException("Pas de préréservation au nom de : " + n + p);
}
// on fabrique un ensemble.
Set<Prereservation> found = new HashSet<Prereservation>(c);
return found;
}
/**
* Récupération de toutes les préréservations.
*/
public Set<Prereservation> getAllPrereservations() {
return new HashSet<Prereservation>(this.map.values());
}
}

View File

@ -0,0 +1,53 @@
package fr.iutfbleau.projetIHM2021FI2.Model;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import java.time.LocalDate;
import java.util.*;
/**
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class PrereservationModel implements Prereservation {
private String reference;
private LocalDate dateDebut;
private int jours;
private TypeChambre type;
private Client client;
public PrereservationModel(String reference, LocalDate dateDebut, int jours, TypeChambre t, Client client){
Objects.requireNonNull(reference,"La référence est null.");
Objects.requireNonNull(dateDebut,"La date est null.");
if (jours<1) {
throw new IllegalArgumentException("Nombres de jours négatif ou null.");
}
Objects.requireNonNull(t,"Le type de chambre est null.");
Objects.requireNonNull(client,"Le client est null.");
this.reference=reference;
this.dateDebut=dateDebut;
this.jours=jours;
this.type=t;
this.client=client;
}
public String getReference(){
return this.reference;
}
public LocalDate getDateDebut(){
return this.dateDebut;
}
public int getJours(){
return this.jours;
}
public TypeChambre getTypeChambre(){
return this.type;
}
public Client getClient(){
return this.client;
}
}

View File

@ -0,0 +1,120 @@
package fr.iutfbleau.projetIHM2021FI2.Model;
import java.sql.*;
import java.sql.Date;
import java.time.LocalDate;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import java.util.*;
import javax.swing.JOptionPane;
/**
* La classe RecupChambre nous permet de récupérer et traiter les chambres grâce à la base de données.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class RecupChambre implements Chambre {
private int numero;
private TypeChambre type;
public RecupChambre(int numero, TypeChambre t){
Objects.requireNonNull(t,"Type de chambre est null.");
this.numero=numero;
this.type=t;
}
public int getNumero(){
return this.numero;
}
public boolean unLitSimple(){
//https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals
return (this.type == TypeChambre.UNLS);
}
public boolean deuxLitsSimples(){
return (this.type == TypeChambre.DEUXLS);
}
public boolean unLitDouble(){
return (this.type == TypeChambre.UNLD);
}
public TypeChambre getType(){
return this.type;
}
static public RecupChambre byDate(LocalDate date) {
RecupChambre room = null;
try {
PreparedStatement pst = ConnexionBDD.getInstance().getSQLco().prepareStatement(
"SELECT id, type FROM Chambre WHERE DATEDIFF(?, dateDispo) > 0");
pst.setDate(1, Date.valueOf(date));
pst.executeUpdate();
ResultSet rs = pst.executeQuery();
rs.next();
// CREATION CHAMBRE
room = new RecupChambre(rs.getInt("id"), TypeChambre.values()[rs.getInt("type") - 1]);
rs.close();
pst.close();
}
catch(SQLException e) {
System.err.println("erreur bydate");
System.out.println("error code " + e.getErrorCode());
System.out.println(" sqlState " + e.getSQLState());
}
return room;
}
static public ArrayList<RecupChambre> allByDate(LocalDate date) {
ArrayList<RecupChambre> rooms = new ArrayList<RecupChambre>();
try {
PreparedStatement pst = ConnexionBDD.getInstance().getSQLco().prepareStatement(
"SELECT id, type FROM Chambre WHERE DATEDIFF(?, dateDispo) > 0");
pst.setDate(1, Date.valueOf(date));
pst.executeUpdate();
ResultSet rs = pst.executeQuery();
while (rs.next()) {
rooms.add(new RecupChambre(rs.getInt("id"), TypeChambre.values()[rs.getInt("type") - 1]));
}
rs.close();
pst.close();
}
catch(SQLException e) {
System.err.println("Aucune chambre à partir de cette date là");
}
return rooms;
}
public void reserve(LocalDate date) {
try {
PreparedStatement pst = ConnexionBDD.getInstance().getSQLco().prepareStatement(
"UPDATE Chambre SET dateDispo = ? WHERE id = ?;");
pst.setDate(1, Date.valueOf(date));
pst.setInt(2, this.getNumero());
pst.executeUpdate();
pst.executeQuery();
JOptionPane.showMessageDialog(null, "La chambre " + this.getNumero() + " a été réservée pour le " + date + " avec succès !", "Réservation", JOptionPane.INFORMATION_MESSAGE);
}
catch(SQLException e) {
System.err.println("Impossible de réserver la chambre");
}
}
}

View File

@ -0,0 +1,90 @@
package fr.iutfbleau.projetIHM2021FI2.Model;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import java.util.*;
import java.sql.*;
/**
* La classe RecupClient permet de récupérer et traiter les clients grâce à la base de données.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class RecupClient implements Client {
private int id;
private String nom;
private String prenom;
public RecupClient(int id, String prenom, String nom){
Objects.requireNonNull(nom,"nom est null.");
Objects.requireNonNull(prenom,"prenom est null.");
this.id=id;
this.nom=nom;
this.prenom=prenom;
}
public int getId(){
return this.id;
}
public String getNom(){
return this.nom;
}
public String getPrenom(){
return this.prenom;
}
static public RecupClient byId(int id) {
RecupClient customer = null;
try {
PreparedStatement pst = ConnexionBDD.getSQLco().prepareStatement(
"SELECT * FROM Client WHERE id = ?");
pst.setInt(1, id);
pst.executeUpdate();
ResultSet rs = pst.executeQuery();
rs.next();
customer = new RecupClient(rs.getInt("id"), rs.getString("prenom"), rs.getString("nom"));
rs.close();
pst.close();
}
catch(SQLException e) {
System.err.println("Erreur lors de la recherche.");
}
return customer;
}
static public String nom(int id) {
String customer = null;
try {
PreparedStatement pst = ConnexionBDD.getSQLco().prepareStatement(
"SELECT * FROM Client WHERE id = ?");
pst.setInt(1, id);
pst.executeUpdate();
ResultSet rs = pst.executeQuery();
rs.next();
customer = rs.getString("nom");
rs.close();
pst.close();
}
catch(SQLException e) {
System.err.println("Problème lors de la recherche");
}
return customer;
}
}

View File

@ -0,0 +1,112 @@
package fr.iutfbleau.projetIHM2021FI2.View;
import fr.iutfbleau.projetIHM2021FI2.Controller.*;
import fr.iutfbleau.projetIHM2021FI2.Model.*;
import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.util.ArrayList;
/**
* La classe ChambresView permet d'afficher les autres chambres disponibles que l'on peut sélectionner.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class ChambresView extends JFrame {
private JLabel instructionsLabel;
private JButton confirmBtn;
private JScrollPane scrollPane;
// MODELE TABLE
private DefaultTableModel model;
// TABLE
private JTable table;
private ArrayList<RecupChambre> rooms;
private static ChambresView instance = null;
private ChambresView() {
super();
this.rooms = null;
this.setLayout(new GridBagLayout());
this.scrollPane = new JScrollPane();
this.instructionsLabel = new JLabel("Selectionnez une chambre");
this.confirmBtn = new JButton("Sélectionner");
SelectButtonController btnListener = new SelectButtonController(this.confirmBtn);
this.confirmBtn.addActionListener(btnListener);
this.setSize(550, 600);
this.setLocation(500,400);
String[] columnName = {"Chambres disponibles"};
this.model = new DefaultTableModel(null, columnName);
this.table = new JTable(this.model);
scrollPane.setViewportView(this.table);
GridBagConstraints gridBtn = new GridBagConstraints();
gridBtn.gridx = 0;
gridBtn.gridy = 2;
gridBtn.fill = GridBagConstraints.HORIZONTAL;
gridBtn.insets = new Insets(10, 10, 10, 10);
GridBagConstraints gridLabel = new GridBagConstraints();
gridLabel.gridx = 0;
gridLabel.gridy = 0;
gridLabel.fill = GridBagConstraints.HORIZONTAL;
gridLabel.insets = new Insets(10, 10, 10, 10);
GridBagConstraints gridRoom = new GridBagConstraints();
gridRoom.gridx = 0;
gridRoom.gridy = 1;
gridRoom.fill = GridBagConstraints.BOTH;
gridRoom.insets = new Insets(10, 10, 10, 10);
gridRoom.weighty = 10.0;
this.add(this.instructionsLabel, gridLabel);
this.add(this.scrollPane, gridRoom);
this.add(this.confirmBtn, gridBtn);
this.setVisible(true);
}
public void ajoutTuples(String[] data) {
this.model.addRow(data);
}
public void viderTableau() {
this.model.setRowCount(0);
}
public RecupChambre chambreSelectionnee() {
int selectedRow = this.table.getSelectedRow();
return this.rooms.get(selectedRow);
}
public void update(ArrayList<RecupChambre> rooms) {
this.rooms = rooms;
this.viderTableau();
for (int i = 0; i<rooms.size(); i++) {
this.ajoutTuples(new String[]{rooms.get(i).monPrint()});
}
}
public static ChambresView getInstance() {
if (instance == null)
instance = new ChambresView();
return instance;
}
}

View File

@ -0,0 +1,65 @@
package fr.iutfbleau.projetIHM2021FI2.View;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import fr.iutfbleau.projetIHM2021FI2.Model.*;
import javax.swing.*;
import javax.swing.table.*;
/**
* Ce fichier nous permet d'afficher le JTable contenant les informations de la base de données.
* Ainsi, l'utilisateur obtient, dans la page principale, le contenu de la base de données concernant la liste des chambres disponibles.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class PrereservationView extends JScrollPane {
private static PrereservationView instance;
private DefaultTableModel model;
private JTable table;
/**
* Constructeur
*/
private PrereservationView() {
super();
String[] header = {"Référence", "Date de début", "Nombre de nuits", "Catégorie chambre"};
this.model = new DefaultTableModel(null, header);
this.table = new JTable(this.model);
this.setViewportView(this.table);
}
// AJOUT DES BONS TUPLES APRES LA RECHERCHE
public void ajoutTuples(String[] data) {
this.model.addRow(data);
}
// MISE A ZERO DU TABLEAU
public void viderTableau() {
this.model.setRowCount(0);
}
// SELECT RESERVATION
public Prereservation getSelectedReservation() {
PrereservationFactoryModel factory = new PrereservationFactoryModel();
Prereservation reserv = null;
int selectedRow = this.table.getSelectedRow();
reserv = factory.getPrereservation(this.table.getValueAt(selectedRow, 0).toString());
return reserv;
}
// GET INSTANCE DU TABLEAU
public static PrereservationView getInstance() {
if (instance == null) {
instance = new PrereservationView();
}
return instance;
}
}

View File

@ -0,0 +1,175 @@
package fr.iutfbleau.projetIHM2021FI2.View;
import fr.iutfbleau.projetIHM2021FI2.Controller.*;
import fr.iutfbleau.projetIHM2021FI2.Model.*;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.*;
/**
* Ce fichier permet d'ouvrir la fenetre principale. Au démarrage, après avoir exécuté la commande "make", l'utilisateur se retrouve sur cette page.
* Cette page permet à l'utilisateur de faire une recherche ainsi que de valider une préréservation.
*
* @version 1.0
* @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
*/
public class WindowView extends JFrame {
// CONSTRUCTEUR
public WindowView() {
super("Finir la réservation d'une Chambre");
this.setSize(1200, 700);
this.setLocation(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// CREATION PANEL
JPanel panel = new JPanel();
// ELEMENTS DU PANEL
JLabel phrase1 = new JLabel("Effectuer une recherche :");
JTextField reference = new JTextField("rentrer la référence");
reference.setPreferredSize(new Dimension(200, 30));
JTextField nom = new JTextField("rentrer le nom");
nom.setPreferredSize(new Dimension(200, 30));
JTextField prenom = new JTextField("rentrer le prenom");
prenom.setPreferredSize(new Dimension(200, 30));
// BOUTON
JButton buttonSearch = new JButton("Rechercher");
JButton selectR = new JButton("Valider la préréservation");
// LISTENERS
SearchButtonController searchBtnListener = new SearchButtonController(nom, prenom, reference);
buttonSearch.addActionListener(searchBtnListener);
SelectButtonController selectBtnListener = new SelectButtonController(selectR);
selectR.addActionListener(selectBtnListener);
// VIDER LE TEXTE DES CHAMPS
nom.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {
JTextField texteField = ((JTextField)e.getSource());
texteField.setText("");
}
});
reference.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {
JTextField texteField = ((JTextField)e.getSource());
texteField.setText("");
}
});
prenom.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {
JTextField texteField = ((JTextField)e.getSource());
texteField.setText("");
}
});
PrereservationView tableau = PrereservationView.getInstance();
PrereservationFactoryModel prefactory = new PrereservationFactoryModel();
Set<Prereservation> preresList = prefactory.getAllPrereservations();
// REMPLIS LE TABLEAU
for (Prereservation currRes : preresList) {
String[] rowToAdd = {currRes.getReference(),
currRes.getDateDebut().toString(),
String.valueOf(currRes.getJours()),
currRes.getTypeChambre().name()};
PrereservationView.getInstance().ajoutTuples(rowToAdd);
}
panel.setLayout(new GridBagLayout());
// TEXTE
GridBagConstraints gridP = new GridBagConstraints();
gridP.gridx = 0;
gridP.gridy = 0;
gridP.fill = GridBagConstraints.HORIZONTAL;
gridP.insets = new Insets(20, 20, 20, 20);
GridBagConstraints gridN = new GridBagConstraints();
gridN.gridx = 1;
gridN.gridy = 0;
gridN.fill = GridBagConstraints.HORIZONTAL;
gridN.insets = new Insets(20, 20, 20, 20);
GridBagConstraints gridR = new GridBagConstraints();
gridR.gridx = 2;
gridR.gridy = 0;
gridR.gridwidth = 1;
gridR.fill = GridBagConstraints.HORIZONTAL;
gridR.insets = new Insets(20, 20, 20, 20);
// BOUTON
GridBagConstraints gridS = new GridBagConstraints();
gridS.gridx = 0;
gridS.gridy = 1;
gridS.fill = GridBagConstraints.HORIZONTAL;
gridS.insets = new Insets(20, 20, 20, 20);
GridBagConstraints gridSelect = new GridBagConstraints();
gridSelect.gridx = 0;
gridSelect.gridy = 4;
gridSelect.gridwidth = 2;
gridSelect.fill = GridBagConstraints.BOTH;
gridSelect.insets = new Insets(20, 20, 20, 20);
// TABLEAU
GridBagConstraints gridT = new GridBagConstraints();
gridT.gridx = 0;
gridT.gridy = 3;
gridT.gridwidth = 4;
gridT.fill = GridBagConstraints.BOTH;
gridT.insets = new Insets(20, 20, 20, 20);
gridT.weightx = 1.0;
gridT.weighty = 1.0;
panel.add(nom,gridN);
panel.add(prenom,gridP);
panel.add(buttonSearch,gridS);
panel.add(reference,gridR);
panel.add(tableau, gridT);
panel.add(selectR, gridSelect);
this.add(panel);
this.setVisible(true);
}
}

Some files were not shown because too many files have changed in this diff Show More