package metier.reservations;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import metier.GestionConnection;
import data.abonne.Abonne;
import data.programmation.Piece;
import data.reservation.Personne;
import data.reservation.Reservation;
import factories.*;
/**
* Classe métier du cas d'utilisation 1 : Demande de réservation.
* Cette classe permet donc d'effectuer toutes les opérations associés au cas d'utilisation
* de demande de réservation tels que :
* <ul>
* <li> Récupérer la liste des piéces, des zones, des séances d'une piéce ..
* <li> Récupérer les informations sur les zones, les piéces, les séances ...
* <li> Récupérer et créer des réservations, la récupération de nouvels identiants de réservation
* <li> Obtenir des informations sur les abonnés, leur participation à une piéce ou non, la validité de leur abonnement ...
* <li> Calculer le prix d'une réservation
* <li> ...
* </ul>
*
*
* @author Ait Elhaj Brahim
*
*/
public class Demande {
/* Gestion de la connection à la base */
private GestionConnection gc;
/**
* Création de l'objet métier <code>Demande</code>.
*
*/
public Demande(){
gc = new GestionConnection();
}
/**
* Renvoie le prix d'une réservation dans une piéce particuliére.
*
* Le prix consiste en la somme de prix pour chacune des personnes
* constituant la réservation. Les prix sont définies pour une zone
* et une catégorie de personne pour chaque piéce.
*
*
* @param r La représentation
* @param p La piéce associée à la représentation
* @return Le prix calculé pour cette représentation
*/
public double calculerPrix(Reservation r,Piece p){
double prix = 0;
Iterator personnes = r.getLesPersonnes().iterator();
//L'abonné est compté parmi les personnes
while(personnes.hasNext()){
Personne pers = (Personne)personnes.next();
//System.out.println("[DEMANDE] : "+pers.getCategorie().toString());
prix+= p.getTarif(pers.getCategorie().toString(), r.getIdZone());
//System.out.println("Prix : "+p.getTarif(pers.getCategorie().toString(), r.getIdZone()));
}
return prix;
}
/**
* Renvoie les piéces se déroulant dans une période précise.
*
* @param date La date pour laquelle on veut obtenir les piéces se jouant dans le théatre
* @return Une liste de piéces.
*/
public Collection getLesPieces(java.util.Date date){
Collection pieces = null;
/* Utilisation de la fabrique de pièce */
FabPiece fp = FabPiece.getInstance();
try{
fp.setConnection(gc.getConnection());
pieces = fp.getLesPieces(new java.sql.Date(date.getTime()));
}catch(SQLException se){
se.printStackTrace();
}
return pieces;
}
/**
* Renvoie la liste des zones existantes dans le théatre.
*
* @return La liste des zones du théatre
*/
public Collection getZones(){
/* Utilisation de la fabrique de théatre */
FabTheatre ft = FabTheatre.getInstance();
Collection listZones = null ;
try{
ft.setConnection(gc.getConnection());
listZones = ft.getZones();
}catch(SQLException se){
se.printStackTrace();
}
return listZones;
}
/**
* Permet de récupérer un objet <code>Abonne</code> associé à un identifiant d'abonné.
*
*
* @param idAbonne L'identifiant de l'abonné
* @return L'obet <code>Abonne</code> ou null si l'identifiant n'est associé à aucun abonné.
*/
public Abonne abonneExiste(String idAbonne){
FabAbonne fa = FabAbonne.getInstance();
Abonne a = null;
try{
fa.setConnection(gc.getConnection());
a = fa.rechercher(idAbonne);
}catch(SQLException se){
se.printStackTrace();
}
return a;
}
/**
* Indique si l'abonnement d'un abonné est valide à une date donnée.
*
* @param a L'abonné
* @param d La date courante
* @return true si l'abonnement de l'abonné est valide pour la date <b>d</b>
*/
public boolean abonnementValide(Abonne a, Date d){
return a.getValiditeDebut().getTime() <= d.getTime() &&
a.getValiditeFin().getTime() >= d.getTime();
}
/**
* Indique si un abonné a déja réservé pour une piéce.
*
*
* @param idAbonne L'identifiant de l'abonné
* @param idPiece L'identifiant de la piéce.
* @return true si l'abonné a déja réservé pour cette piéce
*/
public boolean aReserve(String idAbonne, String idPiece) {
FabAbonne fa = FabAbonne.getInstance();
Abonne a = null;
try{
fa.setConnection(gc.getConnection());
String idReservation = fa.aReserve(idAbonne, idPiece);
//System.out.println("idDejaReserve = "+idReservation);
return idReservation!=null;
}catch(SQLException se){
se.printStackTrace();
}
return true;
}
/**
* Fournit un identifiant de réservation disponible pouvant être affecté à une nouvelle
* réservation
*
* @return un nouvelle identifiant de réservation
*/
public String getNewId(String idSeance){
GestionConnection gcDemande = new GestionConnection();
/* Utilisation de la fabrique de théatre */
FabReservation fr = FabReservation.getInstance();
try{
fr.setConnection(gcDemande.getConnection());
//On récupère l'id de la nouvelle réservation
return fr.getNewId(idSeance);
}catch(SQLException se){
se.printStackTrace();
}
return null;
}
/**
* Crée une nouvelle réservation et indique le bon déourlement de l'opération
*
* @param r La réservation à créer
* @return true si la création s'est bien déroulée, false sinon
*/
public boolean creerReservation(Reservation r){
GestionConnection gcDemande = new GestionConnection();
/* Utilisation de la fabrique de théatre */
FabReservation fr = FabReservation.getInstance();
try{
fr.setConnection(gcDemande.getConnection());
//On récupère l'id de la nouvelle réservation
//String idNouvelleReservation = fr.getNewId(r.getIdSeance());
//On fixe l'id de la réservation
//r.setIdReserv(idNouvelleReservation);
fr.creerReservation(r);
//On ferme la connection pour assurer le commit
gcDemande.shutDown();
return true;
}catch(SQLException se){
se.printStackTrace();
}
// La réservation n'a pas été crée
return false;
}
/**
* Renvoie le titre d'une piéce associée à un identifiant de séance
*
* @param idSeance L'identifiant de la séance
* @return Le titre de la piéce
*/
public String getTitrePiece(String idSeance){
/* Utilisation de la fabrique de pièce */
FabPiece fp = FabPiece.getInstance();
String titrePiece = "";
try{
fp.setConnection(gc.getConnection());
titrePiece = fp.getTitrePiece(idSeance);
}catch(SQLException se){
se.printStackTrace();
}
return titrePiece;
}
/**
* Indication du nombre de places libres disponibles pour une séance dans une zone
* précise du théatre
*
*
* @param idSeance L'identifiant de la séance
* @param idZone L'identifiant de la zone
* @return Le nombre de places libres
*/
public int getNbPlacesLibres(String idSeance, String idZone){
/* Utilisation de la fabrique de théatre */
FabTheatre ft = FabTheatre.getInstance();
int nbPlacesLibres = 0;
try{
ft.setConnection(gc.getConnection());
nbPlacesLibres = ft.getPlacesRestantes(idSeance, idZone);
}catch(SQLException se){
se.printStackTrace();
}
return nbPlacesLibres;
}
}