Esempio n. 1
0
def ajouter_client(clients):
    """
    Methode qui permet de creer un nouveau client
    
    :param clients: liste des clients existants
    :return: nouveau client
    """

    new_id = 1
    if len(clients) != 0:
        new_id = clients[-1].id + 1
    nom = ihm.demander("Saisissez votre nom :")
    prenom = ihm.demander("Saisissez votre prénom :")
    date_naiss = None
    while True:
        try:
            date_naiss = ihm.demander(
                "Saisissez votre date de naissance (AAAA-MM-JJ) :")
            date_naiss = datetime.strptime(date_naiss, '%Y-%m-%d')
        except ValueError:
            ihm.afficher("Ceci n'est pas une date valide.")
            pass
        else:
            date_naiss = date_naiss.date()
            break
    client = Client(new_id, nom, prenom, date_naiss)
    return client
Esempio n. 2
0
def saisie_date(message, date_seuil, duree_limite=1):
    """
    Methode qui permet de saisir la date du vol
    
    :param message: 
    :param date_seuil: 
    :param duree_limite: 
    :return: la date saisie
    """

    date_saisie = None
    dans1an = date_seuil.replace(year=date_seuil.year + duree_limite)
    while True:
        try:
            date_saisie = ihm.demander(
                "Saisissez la {} (AAAA-MM-JJ) :".format(message))
            date_saisie = datetime.strptime(date_saisie, '%Y-%m-%d')
            if date_saisie <= date_seuil or date_saisie > dans1an:
                raise ValueError
        except ValueError:
            ihm.afficher("Ceci n'est pas une date valide.")
            pass
        else:
            break
    ihm.afficher("Vous avez choisi le {:%d/%m/%Y}".format(date_saisie))
    return date_saisie
Esempio n. 3
0
    def modifier_place(self):
        """
        Methode qui permet de modifier la place du passager en lui demandant la nouvelle place voulue
        et de changer la place sur le billet
        :return: 
        """

        # on stocke l'ancien rang et l'ancienne colonne
        old_rangee = int(self._place[0:-1])
        old_colonne = int(self._place[-1])

        # on demande le nouveau rang et la nouvelle colonne
        new_rang = ihm.demander("Saisissez le rang :")
        new_rangee = int(new_rang)
        new_colonne = ihm.demander("Saisissez la colonne :")
        self.vol.liberer_place(old_rangee, old_colonne)
        self.vol.reserver_place(new_rangee, new_colonne)

        new_place = (new_rang, new_colonne)
        self._place = "".join(new_place)
Esempio n. 4
0
    def creer_vols(self, debut=None, nb_jours=None):
        """
        Methode qui permet de creer des vols correspondants a l'horaire entre deux dates donnees

        :param debut: date de debut
        :param nb_jours: nombres de jours pour lesquels on veut creer des vols apres la date de debut
        :return:
        """

        if debut is None:
            debut = saisie_date("date de début", datetime.today())
        if nb_jours is None:
            nb_jours = int(ihm.demander("Saisissez un nombre de jours :"))
        for day in range(nb_jours):
            td = timedelta(days=day)
            jour = debut + td
            vol_deb = jour.replace(hour=self.heure_depart.hour,
                                   minute=self.heure_depart.minute)
            deb_tz = self.route.aeroport_depart.fuseau
            # On ajoute la timezone de depart
            vol_deb = deb_tz.localize(vol_deb)
            # On calcule la datetime d'arrivee dans la timezone de depart
            vol_fin = deb_tz.normalize(vol_deb + self.duree)
            # On transforme dans la timezone d'arrivee
            vol_fin = vol_fin.astimezone(self.route.aeroport_arrivee.fuseau)
            # On renleve l'information de timezeone
            vol_deb = vol_deb.replace(tzinfo=None)
            vol_fin = vol_fin.replace(tzinfo=None)
            # Creation de l'objet vol
            cle = "{}{}{}".format(self.compagnie.id_code_iata, self.numero,
                                  vol_deb)
            if cle not in Vol.cle_index:
                vol = Vol(self, vol_deb, vol_fin, self.duree, None,
                          self.config_avion.nb_places_premiere,
                          self.config_avion.nb_places_business,
                          self.config_avion.nb_places_eco_plus,
                          self.config_avion.nb_places_eco, EnumStatutVol(1))
                self.vols.append(vol)
                print(vol)
            else:
                print("Ce vol existe déjà")
        return
Esempio n. 5
0
def saisie_compagnie(compagnies):
    """
    Methode qui permet de choisir une compagnie par ses différents codes

    :param compagnies: liste des compagnies
    :return: la compagnie choisie
    """

    compagnie = None
    code = ihm.demander(
        "Tapez le code IATA (2 caractères) ou ICAO (3 caractères) :")
    results = [x for x in compagnies
               if x.id_code_iata == code or x.code_icao == code]
    if len(results) == 0:
        ihm.afficher("Désolé, nous n'avons pas trouvé votre compagnie !")
    else:
        compagnie = results[0]
    if compagnie is not None:
        ihm.afficher("Vous avez choisi la compagnie {}".format(compagnie))
    return compagnie
Esempio n. 6
0
    def ajouter_vols_toutes_routes(self):
        """
        Ajoute des vols entre deux dates donnees pour toutes les routes
        qui ont des horaires
        :return: 
        """

        debut = saisie_date("date de début", datetime.today())
        nb_jours = 0
        while True:
            try:
                nb_jours = int(ihm.demander("Saisissez un nombre de jours :"))
            except ValueError:
                ihm.afficher("Ce nombre n'est pas valide !")
            else:
                break
        for route in self._routes:
            ihm.afficher(route)
            for horaire in route.horaires:
                ihm.afficher(horaire)
                horaire.creer_vols(debut=debut, nb_jours=nb_jours)
        return
Esempio n. 7
0
def saisie_aeroport(message, aeroports):
    """
    Methode qui permet de saisir un aeroport
    
    :param message: 
    :param aeroports: 
    :return: 
    """

    aero = None
    while aero is None:
        code = ihm.demander(
            "Saisissez l'{} (code IATA ou ICAO ou ville) :".format(message))
        results = [x for x in aeroports
                   if x.id_code_iata == code or x.code_icao == code or
                   x.municipalite.lower().startswith(code)]
        if len(results) == 0:
            ihm.afficher("Désolé, nous n'avons pas trouvé votre aéroport !")
        elif len(results) > 1:
            aero = ihm.choisir_paginer(results, "Précisez votre choix :")
        else:
            aero = results[0]
    ihm.afficher("Vous avez choisi : {}".format(aero))
    return aero
Esempio n. 8
0
    def creer_horaire(self, compagnies):
        """
        Methode pour creer un horaire pour la route
        
        :return: 
        """

        new_hor = None
        # Saisir numero de vol
        num_vol = ihm.demander("Saisissez un numéro de vol (1 à 4 chiffres) :")
        # Si c'est un codeshare,
        choix_codeshare = ihm.choisir(
            ['Oui', 'Non'],
            "Est-ce que cet horaire est le codeshare de l'horaire "
            "d'une autre compagnie ?")
        if choix_codeshare == 'Oui':
            # alors saisir compagnie
            compagnie = saisie_compagnie(compagnies)
            cle_route = "{}{}{}".format(compagnie.id_code_iata,
                                        self._aeroport_depart.id_code_iata,
                                        self._aeroport_arrivee.id_code_iata)
            route = Route.cle_index[cle_route]
            # et choisir horaire
            hor_tri = route.horaires
            if len(hor_tri) == 0:
                ihm.afficher("Il n'y a pas d'horaire disponible !")
                return
            # On trie les routes par nombre d'horaires
            hor_tri.sort(key=lambda s: s.numero)
            hor = ihm.choisir_paginer(hor_tri, "Choisissez l'horaire :")
            ihm.afficher("Vous avez choisi l'horaire {}".format(hor))
            # Creation du nouvel horaire
            new_hor = Horaire(self, num_vol, None, None, None, None, hor, None)
        # Si ce n'est pas un codeshare
        else:
            # Saisir heure de depart
            str_h_dep = ihm.demander("Saisissez l'heure de départ (HH:MM) :")
            h_dep = datetime.strptime(str_h_dep, "%H:%M").time()
            # Saisir heure d'arrivee
            str_h_arr = ihm.demander("Saisissez l'heure d'arrivée (HH:MM) :")
            h_arr = datetime.strptime(str_h_arr, "%H:%M").time()
            # Saisir duree
            str_dur = ihm.demander("Saisissez la durée (HHhMM, ex : 0h55) :")
            t = datetime.strptime(str_dur, "%Hh%M")
            dur = timedelta(hours=t.hour, minutes=t.minute)
            # Saisir la periodicite : TODO
            period = ''
            configs = self.compagnie.configs
            configs_tri = [
                x for x in configs
                if x.type_avion.distance_franchissable_km > self._distance /
                1000
            ]
            configs_tri.sort(key=lambda s: s.nom)
            if len(configs_tri) == 0:
                ihm.afficher("Il n'y a pas de configuration disponible !")
                return
            # Choisir la config
            conf = ihm.choisir_paginer(self.compagnie.configs,
                                       "Choisissez une configuration d'avion")
            # Creation du nouvel horaire
            new_hor = Horaire(self, num_vol, h_dep, h_arr, dur, period, None,
                              conf)

        # Confirmer ou pas
        choix = ihm.choisir(
            ['Oui', 'Non'],
            "Confirmez-vous la création de l'horaire {} ?".format(new_hor))
        if choix == 'Oui':
            self._horaires.append(new_hor)
            if new_hor.horaire_operateur is not None:
                new_hor.horaire_operateur.horaires_codeshare.append(new_hor)
            ihm.afficher("L'horaire a été créé")
        else:
            ihm.afficher("L'horaire n'a pas été créé")
        return
Esempio n. 9
0
    def faire_reservation(self, compagnies, aeroports):
        """
        Methode qui consiste a faire une reservation
        (saisir_critere, afficher_vols, choisir_vols, saisir_passager, payer..)
        
        :param compagnies: listes de compagnies
        :param aeroports: listes des aeroports
        :return: None
        """

        # Saisie des criteres
        criteres = self.saisie_criteres(aeroports)
        aer_dep, aer_arr, date_dep, nb_passagers, classe, escales_max = criteres

        # Recherche des routes
        combinaisons_total = []
        for compagnie in compagnies:
            combinaisons = compagnie.chercher_routes_escales(
                aer_dep, aer_arr, escales_max)
            if combinaisons:
                combinaisons_total.extend(combinaisons)
        if len(combinaisons_total) == 0:
            ihm.afficher("Il n'y a pas de routes possibles entre ces destinations")
            return

        # Affiche les prix, distances
        self.affiche_prix_distance(combinaisons_total, classe)

        # On garde seulement les combinaisons avec horaires en base
        combinaisons_avec_horaires = []
        for combi in combinaisons_total:
            combi_ok = True
            for route in combi:
                if len(route.horaires) == 0:
                    combi_ok = False
            if combi_ok:
                combinaisons_avec_horaires.append(combi)
        if len(combinaisons_total) == 0:
            ihm.afficher("Il n'y a pas d'horaires disponibles pour ces destinations")
            return

        # On recupere les vols pour chaque combinaison
        combi_vols = self.recupere_vols(
            combinaisons_avec_horaires, date_dep, nb_passagers, classe)

        # On filtre les vols pour qu'ils s'enchainent bien
        vols_ok = self.arrange_vols(combi_vols, date_dep)
        if len(vols_ok) == 0:
            ihm.afficher("Il n'y a pas de vols disponibles pour ces destinations")
            return

        ihm.afficher("Parmi les routes, {} possédaient des places a la date demandée"
                     .format(len(vols_ok)))
        combi_test = []
        for combi in vols_ok:
            combi_new = []
            for route, vols in combi:
                combi_new.append(route)
            combi_test.append(combi_new)
        choix_combi = self.affiche_prix_distance(combi_test, classe, choix=True)

        combi = vols_ok[choix_combi]

        combi_final = []
        for route, vols in combi:
            ihm.afficher("Vols disponibles pour la route {} :".format(route))
            vol = ihm.choisir_paginer(vols, "Choisissez un vol :")
            combi_final.append(vol)

        id_resa = 0
        if Reservation.liste_ids:
            id_resa = Reservation.liste_ids[-1]
        id_resa += 1
        new_resa = Reservation(id_resa, self, 0, datetime.now(), True)

        for i in range(nb_passagers):
            nom = ihm.demander("Saisissez le nom du passager :")
            prenom = ihm.demander("Saisssez le prénom du passager :")
            passeport = ihm.demander("Saisissez le numéro de passeport :")
            date_naissance = None
            while True:
                try:
                    date_naissance = ihm.demander(
                        "Saisissez la date de naissance (AAAA-MM-JJ) :")
                    date_naissance = datetime.strptime(date_naissance, '%Y-%m-%d')
                except ValueError:
                    ihm.afficher("Ceci n'est pas une date valide.")
                    pass
                else:
                    date_naissance = date_naissance.date()
                    break

            id_billet = 0
            if Billet.liste_ids:
                id_billet = Billet.liste_ids[-1]
            id_billet += 1
            billet = Billet(id_billet, new_resa, nom, prenom, passeport, date_naissance, [])

            for vol in combi_final:
                ihm.afficher("Choisissez une place pour ce vol (les places libres sont représentées par un O) :")
                vol.afficher_places()
                place = ihm.demander("Saisissez le numéro de la place (ex : 35A) :")
                vol.reserver_place(int(place[:-1]),place[-1])

                id_segment = 0
                if Segment.liste_ids:
                    id_segment = Segment.liste_ids[-1]
                id_segment += 1
                seg = Segment(id_segment, billet, vol, vol.horaire, place, '', classe)
                billet.segments.append(seg)
                vol.segments.append(seg)

            new_resa.billets.append(billet)

        ihm.afficher("La réservation a été effectuée !")
        ihm.afficher(new_resa)
        print(*new_resa.billets)
        self.reservations.append(new_resa)
        return