Beispiel #1
0
def enregistrement():
    form = fu.Enregistrement()
    if form.validate_on_submit():
        # Géolocaliser l'adresse
        localisation = ' '.join([
            form.numero.data,
            form.adresse.data,
            form.ville.data
        ])
        position = geographie.geocoder(localisation)
        # Créer une adresse
        adresse = modeles.Adresse(
            nom_rue=form.adresse.data,
            numero=form.numero.data,
            cp=form.cp.data,
            ville=form.ville.data,
            position='POINT({0} {1})'.format(position['lat'], position['lon'])
        )
        # Ajouter l'adresse à la BD
        db.session.add(adresse)
        db.session.commit()
        # Créer un utilisateur qui n'a pas confirmé son mail
        utilisateur = modeles.Utilisateur(
            telephone=form.telephone.data,
            email=form.email.data,
            confirmation=False,
            civilite=form.civilite.data,
            categorie='Normal',
            prenom=form.prenom.data,
            nom=form.nom.data,
            notification_email=True,
            notification_sms=True,
            adresse=adresse.identifiant,
            mdp=form.mdp.data,
            inscription=datetime.utcnow()
        )
        # Insérer un utilisateur dans la BD
        db.session.add(utilisateur)
        db.session.commit()
        # Sujet du mail à envoyer
        sujet = 'Veuillez confirmer votre adresse email.'
        # Générer un token aléatoire
        token = ts.dumps(utilisateur.email, salt='email-confirm-key')
        # Construire un lien de confirmation à partir du token
        urlConfirmation = url_for('utilisateurbp.confirmation',
                                  token=token, _external=True)
        # Le corps du mail est un template écrit en HTML
        html = render_template('email/confirmation.html',
                               url_confirmation=urlConfirmation)
        # Envoyer le mail à l'utilisateur
        email.envoyer(utilisateur.email, sujet, html)
        # On renvoit à la page d'accueil
        signUpMsg = Markup(
            "<i class='mail outline icon'></i>Vérifiez vos mails pour confirmer votre adresse email.")
        flash(signUpMsg, 'positive')
        return redirect(url_for('index'))
    return render_template('utilisateur/enregistrement.html',
                           form=form, titre='Enregistrement')
Beispiel #2
0
def index():
    form = rs.Demande()
    if form.validate_on_submit():
        # Géolocaliser les adresses
        localisation_dep = ' '.join([
            form.numero_dep.data,
            form.adresse_dep.data,
            form.ville_dep.data
        ])

        localisation_arr = ' '.join([
            form.numero_arr.data,
            form.adresse_arr.data,
            form.ville_arr.data
        ])

        depart = {'position': geographie.geocoder(localisation_dep)}
        arrivee = {'position': geographie.geocoder(localisation_arr)}

        adresse_dep = modeles.Adresse(
            adresse=form.adresse_dep.data,
            numero=form.numero_dep.data,
            cp=form.cp_dep.data,
            ville=form.ville_dep.data,
            position='POINT({0} {1})'.format(
                depart['position']['lat'], depart['position']['lon'])
        )

        adresse_arr = modeles.Adresse(
            adresse=form.adresse_arr.data,
            numero=form.numero_arr.data,
            cp=form.cp_arr.data,
            ville=form.ville_arr.data,
            position='POINT({0} {1})'.format(
                arrivee['position']['lat'], arrivee['position']['lon'])
        )
        # Ajouter l'adresse à la BD
        db.session.add(adresse_dep)
        db.session.add(adresse_arr)

        db.session.commit()

        flash('La demande de réservation a été prise en compte.', 'positive')
        return redirect(url_for('index'))
    return render_template('index.html', form=form, titre='Réserver un taxi')
Beispiel #3
0
def enregistrement():
    form = fu.Enregistrement()
    if form.validate_on_submit():
        # Géolocaliser l'adresse
        localisation = ' '.join([
            form.numero.data,
            form.adresse.data,
            form.ville.data
        ])
        position = geographie.geocoder(localisation)
        # Créer une adresse
        adresse = modeles.Adresse(
            adresse=form.adresse.data,
            numero=form.numero.data,
            cp=form.cp.data,
            ville=form.ville.data,
            position='POINT({0} {1})'.format(position['lat'], position['lon'])
        )
        # Ajouter l'adresse à la BD
        db.session.add(adresse)
        db.session.commit()
        # Créer un utilisateur qui n'a pas confirmé son mail
        utilisateur = modeles.Utilisateur(
            telephone=form.telephone.data,
            email=form.email.data,
            confirmation=False,
            categorie='Normal',
            prenom=form.prenom.data,
            nom=form.nom.data,
            notification_email=True,
            notification_sms=True,
            adresse=adresse.identifiant,
            mdp=form.mdp.data,
            inscription=datetime.utcnow()
        )
        # Insérer un utilisateur dans la BD
        db.session.add(utilisateur)
        db.session.commit()
        # Sujet du mail à envoyer
        sujet = 'Veuillez confirmer votre adresse email.'
        # Générer un token aléatoire
        token = ts.dumps(utilisateur.email, salt='email-confirm-key')
        # Construire un lien de confirmation à partir du token
        urlConfirmation = url_for('utilisateurbp.confirmation',
                                  token=token, _external=True)
        # Le corps du mail est un template écrit en HTML
        html = render_template('email/confirmation.html',
                               url_confirmation=urlConfirmation)
        # Envoyer le mail à l'utilisateur
        email.envoyer(utilisateur.email, sujet, html)
        # On renvoit à la page d'accueil
        signUpMsg = Markup(
            "<i class='mail outline icon'></i>Vérifiez vos mails pour confirmer votre adresse email.")
        flash(signUpMsg, 'positive')
        return redirect(url_for('index'))
    return render_template('utilisateur/enregistrement.html',
                           form=form, titre='Enregistrement')
Beispiel #4
0
def index():
    form = rs.Demande()
    if form.validate_on_submit():

        # Géolocaliser les adresses
        localisation_dep = " ".join([form.numero_dep.data, form.adresse_dep.data, form.ville_dep.data])

        localisation_arr = " ".join([form.numero_arr.data, form.adresse_arr.data, form.ville_arr.data])

        depart = {"position": geographie.geocoder(localisation_dep)}
        arrivee = {"position": geographie.geocoder(localisation_arr)}

        adresse_dep = modeles.Adresse(
            adresse=form.adresse_dep.data,
            numero=form.numero_dep.data,
            cp=form.cp_dep.data,
            ville=form.ville_dep.data,
            position="POINT({0} {1})".format(depart["position"]["lat"], depart["position"]["lon"]),
        )

        adresse_arr = modeles.Adresse(
            adresse=form.adresse_arr.data,
            numero=form.numero_arr.data,
            cp=form.cp_arr.data,
            ville=form.ville_arr.data,
            position="POINT({0} {1})".format(arrivee["position"]["lat"], arrivee["position"]["lon"]),
        )

        # Ajouter l'adresse à la BD
        db.session.add(adresse_dep)
        db.session.add(adresse_arr)

        db.session.commit()

        flash("La demande de réservation a été prise en compte.", "positive")
        return redirect(url_for("index"))
    return render_template("index.html", form=form, titre="Réserver un taxi")
def gps(depart, arrivee):
    arrivee = geocoder(arrivee)
    base = 'https://maps.googleapis.com/maps/api/directions/json?'
    key = 'AIzaSyCBQSQ2Ze-8wEnZcT1V8__ug2WLdRmtdmA'
    url = '{0}'
def index():

    if current_user.is_authenticated == False:
        form = rs.Demande_NonAuth()
    else:
        form = rs.Demande_Auth()

    if form.validate_on_submit():

        # Formattage de la date
        date_course = str(form.date_debut.data) + " " + \
            str(form.heures.data) + ":" + str(form.minutes.data) + ":00"

        # On insère l'utilisateur s'il n'est pas dans la base
        if current_user.is_authenticated == False:
            utilisateur = modeles.Utilisateur(telephone=form.telephone.data,
                                              prenom=form.prenom.data,
                                              nom=form.nom.data,
                                              email=form.mail.data,
                                              categorie=form.categorie.data,
                                              civilite=form.civilite.data)
            db.session.add(utilisateur)
            db.session.commit()

        # On construit les adresses pour les géolocaliser
        localisation_dep = ' '.join(
            [form.numero_dep.data, form.adresse_dep.data, form.ville_dep.data])

        localisation_arr = ' '.join(
            [form.numero_arr.data, form.adresse_arr.data, form.ville_arr.data])

        # Géocalisation des adressses de départ et d'arrivée
        positions = {
            'depart': geographie.geocoder(localisation_dep),
            'arrivee': geographie.geocoder(localisation_arr)
        }

        # Adresse de départ
        adresse_dep = modeles.Adresse(nom_rue=form.adresse_dep.data,
                                      numero=form.numero_dep.data,
                                      cp=form.cp_dep.data,
                                      ville=form.ville_dep.data,
                                      position='POINT({0} {1})'.format(
                                          positions['depart']['lat'],
                                          positions['depart']['lon']))
        db.session.add(adresse_dep)
        db.session.commit()

        # Adresse d'arrivée
        adresse_arr = modeles.Adresse(nom_rue=form.adresse_arr.data,
                                      numero=form.numero_arr.data,
                                      cp=form.cp_arr.data,
                                      ville=form.ville_arr.data,
                                      position='POINT({0} {1})'.format(
                                          positions['arrivee']['lat'],
                                          positions['arrivee']['lon']))
        db.session.add(adresse_arr)
        db.session.commit()

        # Création de la course
        nouvelle_course = modeles.Course(depart=adresse_dep.identifiant,
                                         arrivee=adresse_arr.identifiant,
                                         places=form.nb_passagers.data,
                                         commentaire=form.commentaire.data,
                                         debut=date_course,
                                         trouvee=False,
                                         finie=False)

        if current_user.is_authenticated:
            # Pas sur de ça
            current_user.categorie = form.categorie.data
            nouvelle_course.utilisateur = current_user.telephone
        else:
            nouvelle_course.utilisateur = form.telephone.data

        db.session.add(nouvelle_course)
        db.session.commit()

        # Création d'une nouvelle facture
        facture = modeles.Facture(course=nouvelle_course.numero,
                                  paiement=form.paiement.data,
                                  estimation=0,
                                  montant=0,
                                  rabais=0)

        db.session.add(facture)
        db.session.commit()

        flash('La demande de réservation a été prise en compte.', 'positive')

        donnees = form.data
        return redirect(url_for('devis', form=donnees))
    return render_template('index.html', form=form, titre='Réserver un taxi')
Beispiel #7
0
def type_tarif(demande):
    
#On récupère la date et l'heure de départ
    date = demande['date_debut'].split('-')
    annee_depart = int(date[0])
    mois_depart = int(date[1])
    jour_depart = int(date[2])
    heure_depart = int(demande['heures'])
    minutes_depart = int(demande['minutes'])
    
    #Mise en forme de la date
    date = datetime(annee_depart,mois_depart,jour_depart,heure_depart,minutes_depart)
    
    #On concatenne les adresses de départ et d'arrivée
    depart = demande['numero_dep'] + ' ' + demande['adresse_dep'] + ' ' + demande['cp_dep'] + ' ' + demande['ville_dep']
    arrive = demande['numero_arr'] + ' ' + demande['adresse_arr'] + ' ' + demande['cp_arr'] + ' ' + demande['ville_arr']       

    #Recherche du tarif: Jour ou Nuit/JourFerie/Dimanche    
    #On calcule la date d'arrivée estimée du trajet
    temps_trajet = timedelta(minutes=Par(geo.geocoder(depart),geo.geocoder(arrive),str(date)).temps)
    date_arrive = date + temps_trajet

    #On définit les limites de passages aux horaires jour et nuit
    date_lim_jour = datetime.strptime(str(annee_depart) + '-' + str(mois_depart) + '-' + str(jour_depart) + ' 08:00:00', '%Y-%m-%d %H:%M:%S')
    date_lim_soir = datetime.strptime(str(annee_depart) + '-' + str(mois_depart) + '-' + str(jour_depart) + ' 19:00:00', '%Y-%m-%d %H:%M:%S')

    #On calcule le pourcentage de temps passé avec chaque tarif (nuit/jour) lorsqu'il y a un changement de tarif en cours de trajet
    #Si le départ est avant 8h
    if date < date_lim_jour:
        #Si l'arrivée est entre 8h et 19h
        if date_arrive >= date_lim_jour and date_arrive < date_lim_soir:
            temps_nuit = (date_lim_jour - date)/temps_trajet
            temps_jour = (date_arrive - date_lim_jour)/temps_trajet
            intervalle = [round(temps_nuit,2), round(temps_jour,2)]
        #Si l'arrivée est après 19h
        elif date_arrive >= date_lim_soir:
            temps_nuit = ((date_lim_jour - date) + (date_arrive - date_lim_soir))/temps_trajet
            temps_jour = (date_lim_soir - date_lim_jour)/temps_trajet
            intervalle = [round(temps_nuit,2), round(temps_jour,2)]
        #Si le trajet est seulement de nuit
        else:
            intervalle = [1,0]
            Type_tarif = 'TarifD'
    #Si le départ est avant 19h
    elif date < date_lim_soir:
        #Si l'arrivée est après 19h et avant 8h le lendemain
        if date_arrive >= date_lim_soir and date_arrive < date_lim_jour + timedelta(days=1):
            temps_jour = (date_lim_soir - date)/temps_trajet
            temps_nuit = (date_arrive - date_lim_soir)/temps_trajet
            intervalle = [round(temps_nuit,2), round(temps_jour,2)]
        #Si l'arrivée est après 8h le lendemain
        elif date_arrive >= date_lim_jour + timedelta(days=1):
            temps_nuit = ((date_lim_jour + timedelta(days=1)) - date_lim_soir)/temps_trajet
            temps_jour = ((date_lim_soir - date) + (date_arrive - date_lim_jour + timedelta(days=1)))/temps_trajet
            intervalle = [round(temps_nuit,2), round(temps_jour,2)]
        #Si le trajet est seulement de jour
        elif date_arrive < date_lim_soir: 
            intervalle = [0,1]
            Type_tarif = 'TarifC'
    #Si le départ est après 19h
    elif date >= date_lim_soir:
        #Si l'arrivée est entre 8h et 19h le lendemain
        if date_arrive >= date_lim_jour + timedelta(days=1) and date_arrive < date_lim_soir + timedelta(days=1):
            temps_nuit = ((date_lim_jour + timedelta(days=1)) - date) / temps_trajet
            temps_jour = (date_arrive - date_lim_jour + timedelta(day=1))/temps_trajet
            intervalle = [round(temps_nuit,2), round(temps_jour,2)]
        #Si l'arrivée est après 19h le lendemain
        elif date_arrive >= date_lim_soir + timedelta(days=1):
            temps_nuit = (date + (date_lim_jour + timedelta(days=1)) + (date_arrive - (date_lim_soir + timedelta(days=1))))/temps_trajet
            temps_jour = ((date_lim_soir + timedelta(days=1)) - (date_lim_jour + timedelta(days=1)))/temps_trajet
            intervalle = [round(temps_nuit,2), round(temps_jour,2)]
        #Si le trajet est seulement de nuit
        else:
            intervalle = [1,0]
            Type_tarif = 'TarifD'
   
 
    #On concaténe le mois et le jour de façon a avoir une chaine de la forme 'jour/mois'  
    dateC = str(date.day)+ '/' +str(date.month)
    
    #On vérifie si la date en entrée est un jour ferie
    ferie = dateC in [
        '1/1',
        '1/5',
        '8/5',
        '14/7',
        '15/8',
        '1/11',
        '11/11',
        '25/12'
    ]+feries(date.year)    
    
    #On vérifie si le jour est un dimanche
    dimanche = date.weekday()
   
    if ferie == True or dimanche == 6:
        intervalle = [1,0]
        Type_tarif = 'TarifD'
        
  #Initialise les tarifs à utiliser en cas de changement de tarifs en cours de trajet           
    double_tarif = ['TarifD','TarifC']
    
    
    return Type_tarif, intervalle, double_tarif,temps_trajet
Beispiel #8
0
def accepter():

    # Récupération des données et formatage du JSON
    data = request.get_json()

    data = data.replace('&#39;', '"')

    data = eval(data)

    demande = data['demande']

    # On insère l'utilisateur s'il n'est pas dans la base
    if current_user.is_authenticated == False:
        utilisateur = modeles.Utilisateur(
            telephone=demande['telephone'],
            prenom=demande['prenom'],
            nom=demande['nom'],
            email=demande['mail'],
            civilite=demande['civilite'],
        )
        db.session.add(utilisateur)
        db.session.commit()

    # Géocalisation des adressses de départ et d'arrivée
    positions = {
        'depart': geographie.geocoder(demande['adresse_dep']),
        'arrivee': geographie.geocoder(demande['adresse_arr'])
    }

    # Adresse de départ
    adresse_dep = modeles.Adresse(
        position='POINT({0} {1})'.format(
            positions['depart']['lat'],
            positions['depart']['lon']
        )
    )
    db.session.add(adresse_dep)
    db.session.commit()

    # Adresse d'arrivée
    adresse_arr = modeles.Adresse(
        position='POINT({0} {1})'.format(
            positions['arrivee']['lat'],
            positions['arrivee']['lon']
        )
    )
    db.session.add(adresse_arr)
    db.session.commit()

    # Création de la course
    nouvelle_course = modeles.Course(
        depart = adresse_dep.identifiant,
        arrivee = adresse_arr.identifiant,
        places = demande['nb_passagers'],
        commentaire = demande['commentaire'],
        debut = demande['debut'],
        trouvee = False,
        finie = False,
        animaux = demande['nb_animaux'],
        bagages = demande['nb_bagages'],
        animaux_grands = demande['animaux_grands']
    )

    if current_user.is_authenticated:
        # Pas sur de ça
        nouvelle_course.utilisateur = current_user.telephone
    else:
        nouvelle_course.utilisateur = demande['telephone']

    db.session.add(nouvelle_course)
    db.session.commit()

    # Création d'une nouvelle facture
    facture = modeles.Facture(
        course=nouvelle_course.numero,
        type_paiement=demande['paiement'],
        estimation_1=0,
        montant=0
    )

    db.session.add(facture)
    db.session.commit()

    # Envoi d'un email
    if current_user.is_authenticated == False:
        adresse_mail = demande['mail']
    else:
        adresse_mail = current_user.email

    devis = data['devis']

    # Sujet du mail à envoyer
    sujet = 'Votre demande de réservation a été prise en compte.'
    # Le corps du mail est un template écrit en HTML
    html = render_template('email/facture.html', devis=devis)
    # Envoyer le mail à l'utilisateur
    email.envoyer(adresse_mail, sujet, html)

    flash('La demande de réservation a été prise en compte.', 'positive')
    return jsonify({'statut': 'succes'})
Beispiel #9
0
def estimation(demande):
    ''' Calculer le devis d'une demande. '''

    # On récupère les tarifs applicables
    tarifs = utile.lire_json('app/devis/data/tarifs.json')
    supplements = utile.lire_json('app/devis/data/supplements.json')


    # Extraction des information de départ
    depart = geo.geocoder(demande['adresse_dep'])
    arrivee = geo.geocoder(demande['adresse_arr'])
    debut = demande['debut']

    # Simulation de la course
    simulation = calculer.simuler(depart, arrivee, debut)
    duree = simulation['duree']
    distance = simulation['distance']
    jour = simulation['ratios']['jour']
    nuit = simulation['ratios']['nuit']

    # Savoir si c'est un jour ferié ou un dimanche
    date = '{0}/{1}'.format(debut.day, debut.month)
    jours_feries = calendrier.feries(debut.year)
    ferie = date in jours_feries
    dimanche = debut.weekday() == 6

    # Décider du tarif à appliquer
    if ferie or dimanche:
        prix_par_km = tarifs['D']
    else:
        prix_par_km = jour * tarifs['C'] + nuit * tarifs['D']


    # Calculer le prix de la course
    montant = round(distance,1) * round(prix_par_km,2)


    # Calculer le supplément
    supplement = calculer_supplement(demande, supplements)

    # Tarif supplémentaire appliqué à un trajet ralenti (si temps de trajet plus long de 5 minutes 
    # par rapport à temps de trajet de référence, on applique une nouvelle tarification par minute de trajet supplémentaire)

    if round(simulation['ecart']/60) > 5:
        diff_minutes = round(simulation['ecart']/60) - 5
    else:
        diff_minutes = 0

    tarif_trajet_ralenti = diff_minutes * supplements['prix_trajet_ralenti']/60



    # Calcul du total minimum estimé
    total = montant + supplement + tarif_trajet_ralenti
    # Prise en compte du tarif minimum
    total = max(total, supplements['tarif_minimum'])


    # On retourne l'estimation à travers un dictionnaire de données

    estimation = {
        'prix': {
            'montant': round(montant, 2),
            'supplement': round(supplement, 2),
            'total': round(total,2)

        },
        'detail': {
            'parcours': {
                'duree': str(duree),
                'distance': round(distance,2),
                'prix_par_km': round(prix_par_km,2)
            },
            'bagages': {
                'nb': demande['nb_bagages'],
                'prix': supplements['bagage'],
                'total': round(int(demande['nb_bagages']) * supplements['bagage'],2)
            },
            'animaux': {
                'nb': demande['nb_animaux'],
                'prix': supplements['animal'],
                'total': round(int(demande['nb_animaux']) * supplements['animal'],2)
            },
            'personnes': {
                'nb': demande['nb_passagers'],
                'supplementaires': {
                    'nb': max(0, int(demande['nb_passagers']) - 4),
                    'prix': supplements['personne_sup'],
                    'total': round(max(0, int(demande['nb_passagers']) - 4) * supplements['personne_sup'],2)
                }
            },
            'gare': {
                'prise_en_charge': demande['gare'],
                'prix': 0 if not demande['gare'] else supplements['gare']
            },
            'aeroport': {
                'prise_en_charge': demande['aeroport'],
                'prix': 0 if not demande['aeroport'] else supplements['aeroport']
            },
            'prise_en_charge': supplements['prise_en_charge'],
            'tarif_trajet_ralenti' : round(tarif_trajet_ralenti,2),
            'trajet_a_vide':supplements['trajet_a_vide']
        }
    }
    return estimation
Beispiel #10
0
 def __call__(self, form, field):
     print(field.data)
     position = geographie.geocoder(field.data)
     if position['statut'] == 'echec':
         raise ValidationError(self.message)
Beispiel #11
0
 def __call__(self, form, field):
     print(field.data)
     position = geographie.geocoder(field.data)
     if position['statut'] == 'echec':
         raise ValidationError(self.message)
Beispiel #12
0
def tarifs(demande):

    supp = pd.read_csv('app/devis/data/supplements.csv', encoding='utf8')
    heures_tarif = pd.read_csv('app/devis/data/tarifs.csv', encoding='utf8')

    #On initialise les prix de départ et les suppléments
    prise_en_charge = supp[supp['Supplements'] == 'Prise_en_charge']

    #On récupère la date et l'heure de départ
    date = demande['date_debut'].split('-')
    annee = int(date[0])
    mois = int(date[1])
    jour = int(date[2])
    heure = int(demande['heures'])
    minutes = int(demande['minutes'])

    #Mise en forme de la date
    date = datetime(annee, mois, jour, heure, minutes)

    #On prend les lignes selon les types de tarifs et on en tire le prix associé
    if tt.type_tarif(demande)[1] == [0, 1
                                     ] or tt.type_tarif(demande)[1] == [1, 0]:
        #Tout le trajet en jour ou en nuit
        ligne = heures_tarif[heures_tarif['Type_Tarif'] == tt.type_tarif(
            demande)[0]]
        prix = float(ligne['tarif_par_km'])
    else:
        #Trajet en partie en jour et en nuit
        #Récupération du tarif de nuit
        ligne = heures_tarif[heures_tarif['Type_Tarif'] == tt.type_tarif(
            demande)[2][0]]
        #Récupération du tarif de jour
        ligne2 = heures_tarif[heures_tarif['Type_Tarif'] == tt.type_tarif(
            demande)[2][1]]
        #Calcul du prix/km par pourcentage du temps passé en tarif jour et nuit
        prix = float(ligne['tarif_par_km']) * tt.type_tarif(
            demande)[1][0] + float(ligne2['tarif_par_km']) * tt.type_tarif(
                demande)[1][1]  #avec pourcentage de jour et de nuit

    #Calcul des suppléments
    #On récupère les lignes selon les suppléments et leurs prix
    an = supp[supp['Supplements'] == 'Animal']
    bag = supp[supp['Supplements'] == 'Bagage']
    PerS = supp[supp['Supplements'] == 'PersonneSup']
    Gar = supp[supp['Supplements'] == 'Gare']
    Aer = supp[supp['Supplements'] == 'Aeroport']

    #Calcul du montant total des suppléments
    #Suppléments pour bagages et/ou animaux
    supplement = float(demande['bagage']) * float(bag['Prix']) + float(
        demande['animaux']) * 1

    #Suppléments pour un passager supplémentaire
    if int(demande['nb_passagers']) > 4:
        supplement += (float(demande['nb_passagers']) - 4) * float(
            PerS['Prix'])

    #Suppléments pour la prise en charge à la gare
    if demande['gare'] == 'True':
        supplement += float(Gar['Prix'])

    #Suppléments pour la prise en charge à l'aéroport
    if demande['aeroport'] == 'True':
        supplement += float(Aer['Prix'])

    #On concatenne les adresses de départ et d'arrivée
    depart = demande['numero_dep'] + ' ' + demande[
        'adresse_dep'] + ' ' + demande['cp_dep'] + ' ' + demande['ville_dep']
    arrive = demande['numero_arr'] + ' ' + demande[
        'adresse_arr'] + ' ' + demande['cp_arr'] + ' ' + demande['ville_arr']

    #On calcule le prix total
    # prix = coût de prise en charge + tarif par km * nombre de km + coût des suppléments
    prixTotal = float(prise_en_charge['Prix']) + prix * round(
        float(
            Par(geo.geocoder(depart), geo.geocoder(arrive),
                str(date)).distance), 2) + supplement

    #On vérifie que le prix total soit supérieur au prix minimal
    prixMinimal = float(supp[supp['Supplements'] == 'Tarif_minimum']['Prix'])

    if prixTotal < prixMinimal:
        prixTotal = prixMinimal

#On retourne le prix total via un dictionnaire de données
#Gestion des conditions

#Si le client est pris à l'aéroport
    if demande['aeroport'] == 'True':
        prixA = float(Aer['Prix'])
    else:
        prixA = 0

    #Si le nombre de personne est supérieur à 4
    if int(demande['nb_passagers']) > 4:
        nbPersonnes = float(demande['nb_passagers']) - 4
    else:
        nbPersonnes = 0

    #Si le client est pris à la gare
    if demande['gare'] == 'True':
        prixG = float(Gar['Prix'])
    else:
        prixG = 0

    dico = {
        'Prix_Total': str(round(prixTotal, 2)),
        'Prise_en_charge': str(float(prise_en_charge['Prix'])),
        'Prix_par_km': prix,
        'Nombre_km': Par(geo.geocoder(depart), geo.geocoder(arrive),
                         str(date)).distance,
        'Nombre_bagage': str(demande['bagage']),
        'Prix_1_bagage': str(float(bag['Prix'])),
        'prix_total_bagage':
        str(float(demande['bagage']) * float(bag['Prix'])),
        'animal': str(demande['animaux']),
        'prix_animal': str(float(an['Prix'])),
        'prix_total_animal':
        str(float(demande['animaux']) * float(an['Prix'])),
        'Gare': str(demande['gare']),
        'Prix_Gare': str(prixG),
        'Nombres_personnes_sup': nbPersonnes,
        'Prix_par_personnes_sup': str(float(PerS['Prix'])),
        'Prix_personnes_sup': str((nbPersonnes) * float(PerS['Prix'])),
        'Aeroport': str(demande['aeroport']),
        'Prix_Aeroport': str(prixA),
        'Temps_course': str(tt.type_tarif(demande)[3])
    }

    #On retourne le prix total
    return dico
Beispiel #13
0
def accepter():

    # Récupération des données et formatage du JSON
    data = request.get_json()

    data = data.replace('&#39;', '"')

    data = eval(data)

    print(data)

    demande = data['demande']

    # On insère l'utilisateur s'il n'est pas dans la base
    if current_user.is_authenticated == False:
        utilisateur = modeles.Utilisateur(telephone=demande['telephone'],
                                          prenom=demande['prenom'],
                                          nom=demande['nom'],
                                          email=demande['mail'],
                                          civilite=demande['civilite'],
                                          avoir_compte=False,
                                          mdp=" ")
        # L'utilisateur est-il déja dans la BD ?
        check_Utilisateur = modeles.Utilisateur.query.filter_by(
            telephone=demande['telephone']).first()
        # Si l'utilisateur existe
        if check_Utilisateur is not None:
            # Alors on regarde s'il a un compte ou non
            if check_Utilisateur.avoir_compte == False:
                check_Utilisateur.nom = demande['nom']
                check_Utilisateur.prenom = demande['prenom'],
                check_Utilisateur.nom = demande['nom'],
                check_Utilisateur.email = demande['mail'],
                check_Utilisateur.avoir_compte = False,
                # Sauvegarde des modifications
                db.session.commit()

        # S'il n'existe pas, on l'ajoute à la BD
        else:
            db.session.add(utilisateur)
            db.session.commit()

    # Géocalisation des adressses de départ et d'arrivée
    positions = {
        'depart': geographie.geocoder(demande['adresse_dep']),
        'arrivee': geographie.geocoder(demande['adresse_arr'])
    }

    # Adresse de départ
    adresse_dep = modeles.Adresse(position='POINT({0} {1})'.format(
        positions['depart']['lat'], positions['depart']['lon']),
                                  adr_complete=demande['adresse_dep'])
    db.session.add(adresse_dep)
    db.session.commit()

    # Adresse d'arrivée
    adresse_arr = modeles.Adresse(position='POINT({0} {1})'.format(
        positions['arrivee']['lat'], positions['arrivee']['lon']),
                                  adr_complete=demande['adresse_arr'])
    db.session.add(adresse_arr)
    db.session.commit()

    # Création de la course
    nouvelle_course = modeles.Course(depart=adresse_dep.identifiant,
                                     arrivee=adresse_arr.identifiant,
                                     places=demande['nb_passagers'],
                                     commentaire=demande['commentaire'],
                                     debut=demande['debut'],
                                     trouvee=False,
                                     finie=False,
                                     animaux=demande['nb_animaux'],
                                     bagages=demande['nb_bagages'],
                                     animaux_grands=demande['animaux_grands'],
                                     anglais=demande['langue'])

    if current_user.is_authenticated:
        # Pas sur de ça
        nouvelle_course.utilisateur = current_user.telephone
    else:
        nouvelle_course.utilisateur = demande['telephone']

    db.session.add(nouvelle_course)
    db.session.commit()

    devis = data['devis']

    # Création d'une nouvelle facture
    facture = modeles.Facture(course=nouvelle_course.numero,
                              type_paiement=demande['paiement'],
                              estimation_1=devis['prix']['total'],
                              montant=0)

    db.session.add(facture)
    db.session.commit()

    # Envoi d'un email
    if current_user.is_authenticated == False:
        adresse_mail = demande['mail']
    else:
        adresse_mail = current_user.email

    # Sujet du mail à envoyer
    sujet = 'Votre demande de réservation a été prise en compte.'
    # Le corps du mail est un template écrit en HTML
    html = render_template('email/facture.html', devis=devis)
    # Envoyer le mail à l'utilisateur
    email.envoyer(adresse_mail, sujet, html)

    # Appeler la fonction Scheduler
    # planification.scheduler.add_job(attribution_course, demande['debut'], args=[str(nouvelle_course.numero)])

    flash('La demande de réservation a été prise en compte.', 'positive')
    return jsonify({'statut': 'succes'})
Beispiel #14
0
def index():

    if current_user.is_authenticated == False:
        form = rs.Demande_NonAuth()
    else:
        form = rs.Demande_Auth()

    if form.validate_on_submit():

        # Formattage de la date
        date_course = str(form.date_debut.data) + " " + \
            str(form.heures.data) + ":" + str(form.minutes.data) + ":00"

        # On insère l'utilisateur s'il n'est pas dans la base
        if current_user.is_authenticated == False:
            utilisateur = modeles.Utilisateur(
                telephone = form.telephone.data,
                prenom = form.prenom.data,
                nom = form.nom.data,
                email = form.mail.data,
                categorie = form.categorie.data,
                civilite = form.civilite.data
            )
            db.session.add(utilisateur)
            db.session.commit()

        # On construit les adresses pour les géolocaliser
        localisation_dep = ' '.join([
            form.numero_dep.data,
            form.adresse_dep.data,
            form.ville_dep.data
        ])

        localisation_arr = ' '.join([
            form.numero_arr.data,
            form.adresse_arr.data,
            form.ville_arr.data
        ])

        # Géocalisation des adressses de départ et d'arrivée
        positions = {
            'depart': geographie.geocoder(localisation_dep),
            'arrivee': geographie.geocoder(localisation_arr)
        }

        # Adresse de départ
        adresse_dep = modeles.Adresse(
            nom_rue = form.adresse_dep.data,
            numero = form.numero_dep.data,
            cp = form.cp_dep.data,
            ville = form.ville_dep.data,
            position = 'POINT({0} {1})'.format(
                positions['depart']['lat'],
                positions['depart']['lon']
            )
        )
        db.session.add(adresse_dep)
        db.session.commit()

        # Adresse d'arrivée
        adresse_arr = modeles.Adresse(
            nom_rue = form.adresse_arr.data,
            numero = form.numero_arr.data,
            cp = form.cp_arr.data,
            ville = form.ville_arr.data,
            position = 'POINT({0} {1})'.format(
                positions['arrivee']['lat'],
                positions['arrivee']['lon']
            )
        )
        db.session.add(adresse_arr)
        db.session.commit()

        # Création de la course
        nouvelle_course = modeles.Course(
            depart = adresse_dep.identifiant,
            arrivee = adresse_arr.identifiant,
            places = form.nb_passagers.data,
            commentaire = form.commentaire.data,
            debut = date_course,
            trouvee = False,
            finie = False
        )

        if current_user.is_authenticated:
            # Pas sur de ça
            current_user.categorie = form.categorie.data
            nouvelle_course.utilisateur = current_user.telephone
        else:
            nouvelle_course.utilisateur = form.telephone.data

        db.session.add(nouvelle_course)
        db.session.commit()

        # Création d'une nouvelle facture
        facture = modeles.Facture(
            course = nouvelle_course.numero,
            paiement = form.paiement.data,
            estimation = 0,
            montant = 0,
            rabais = 0
        )

        db.session.add(facture)
        db.session.commit()

        flash('La demande de réservation a été prise en compte.', 'positive')

        donnees = form.data
        return redirect(url_for('devis', form=donnees))
    return render_template('index.html', form=form, titre='Réserver un taxi')
def gps(depart, arrivee):
    arrivee = geocoder(arrivee)
    base = 'https://maps.googleapis.com/maps/api/directions/json?'
    key = 'AIzaSyCBQSQ2Ze-8wEnZcT1V8__ug2WLdRmtdmA'
    url = '{0}'
def index():
    form = rs.Demande()
    # Formattage de la date
    date_course = str(form.date_debut.data) + " " + \
        str(form.heures.data) + ":" + str(form.minutes.data) + ":00"
    if form.validate_on_submit():

        if current_user.is_authenticated == False:
            utilisateur = modeles.Utilisateur(
                telephone=form.telephone.data,
                prenom=form.prenom.data,
                nom=form.nom.data,
                email=form.mail.data,
                categorie=form.categorie.data
            )
            # Ajout de l'utilisateur à la BD
            db.session.add(utilisateur)
            db.session.commit()

        # Géolocaliser les adresses
        localisation_dep = ' '.join([
            form.numero_dep.data,
            form.adresse_dep.data,
            form.ville_dep.data
        ])

        localisation_arr = ' '.join([
            form.numero_arr.data,
            form.adresse_arr.data,
            form.ville_arr.data
        ])

        # Géocalisation des adressses de départ et d'arrivée
        depart = {'position': geographie.geocoder(localisation_dep)}
        arrivee = {'position': geographie.geocoder(localisation_arr)}

        # Adresse de départ
        adresse_dep = modeles.Adresse(
            adresse=form.adresse_dep.data,
            numero=form.numero_dep.data,
            cp=form.cp_dep.data,
            ville=form.ville_dep.data,
            position='POINT({0} {1})'.format(
                depart['position']['lat'], depart['position']['lon'])
        )

        # Adresse d'arrivée
        adresse_arr = modeles.Adresse(
            adresse=form.adresse_arr.data,
            numero=form.numero_arr.data,
            cp=form.cp_arr.data,
            ville=form.ville_arr.data,
            position='POINT({0} {1})'.format(
                arrivee['position']['lat'], arrivee['position']['lon'])
        )
        # Ajouter l'adresse à la BD
        db.session.add(adresse_dep)
        db.session.add(adresse_arr)

        # Modification de la tarification appliquée à l'utilisateur si il est
        # connecté
        if current_user.is_authenticated:
            current_user.categorie = form.categorie.data

            # Création d'une nouvelle course pour un utilisateur connecté
            nouvelle_course = modeles.Course(
                utilisateur=current_user.telephone,
                depart=adresse_dep.identifiant,
                arrivee=adresse_arr.identifiant,
                places=form.nb_passagers.data,
                commentaire=form.commentaire.data,
                debut=date_course,
                trouvee=False,
                finie=False)
        else:
            # Création d'une nouvelle course pour un utilisateur non-connecté
            nouvelle_course = modeles.Course(
                utilisateur=form.telephone.data,
                depart=adresse_dep.identifiant,
                arrivee=adresse_arr.identifiant,
                places=form.nb_passagers.data,
                commentaire=form.commentaire.data,
                debut=date_course,
                trouvee=False,
                finie=False)

        # Ajout de la course à la BD
        db.session.add(nouvelle_course)
        db.session.commit()

        # Création d'une nouvelle facture
        nouvelle_facture = modeles.Facture(
            course=nouvelle_course.numero,
            paiement=form.paiement.data,
            estimation=0,
            montant=0,
            rabais=0
        )

        # Ajout de la facture à la BD
        db.session.add(nouvelle_facture)

        # Sauvegarde des transations
        db.session.commit()

        flash('La demande de réservation a été prise en compte.', 'positive')
        return redirect(url_for('index'))
    return render_template('index.html', form=form, titre='Réserver un taxi')
Beispiel #17
0
def tarifs(demande):
    
    supp = pd.read_csv('app/devis/data/supplements.csv', encoding='utf8')
    heures_tarif = pd.read_csv('app/devis/data/tarifs.csv', encoding='utf8')

    #On initialise les prix de départ et les suppléments
    prise_en_charge = supp[supp['Supplements'] == 'Prise_en_charge']
    
    #On récupère la date et l'heure de départ
    date = demande['date_debut'].split('-')
    annee = int(date[0])
    mois = int(date[1])
    jour = int(date[2])
    heure = int(demande['heures'])
    minutes = int(demande['minutes'])
    
    #Mise en forme de la date
    date = datetime(
        annee,
        mois,
        jour,
        heure,
        minutes
    )

 #On prend les lignes selon les types de tarifs et on en tire le prix associé
    if tt.type_tarif(demande)[1] == [0,1] or tt.type_tarif(demande)[1] == [1,0]:
        #Tout le trajet en jour ou en nuit
        ligne = heures_tarif[heures_tarif['Type_Tarif'] == tt.type_tarif(demande)[0]]
        prix = float(ligne['tarif_par_km'])
    else:
        #Trajet en partie en jour et en nuit
        #Récupération du tarif de nuit
        ligne = heures_tarif[heures_tarif['Type_Tarif'] == tt.type_tarif(demande)[2][0]]
        #Récupération du tarif de jour
        ligne2 = heures_tarif[heures_tarif['Type_Tarif'] == tt.type_tarif(demande)[2][1]]
        #Calcul du prix/km par pourcentage du temps passé en tarif jour et nuit
        prix = float(ligne['tarif_par_km']) * tt.type_tarif(demande)[1][0] + float(ligne2['tarif_par_km']) * tt.type_tarif(demande)[1][1] #avec pourcentage de jour et de nuit
       
    #Calcul des suppléments
    #On récupère les lignes selon les suppléments et leurs prix
    an= supp[supp['Supplements'] == 'Animal']
    bag = supp[supp['Supplements'] == 'Bagage']
    PerS = supp[supp['Supplements'] == 'PersonneSup']
    Gar = supp[supp['Supplements'] == 'Gare']
    Aer = supp[supp['Supplements'] == 'Aeroport']
    
    #Calcul du montant total des suppléments
    #Suppléments pour bagages et/ou animaux
    supplement = float(demande['bagage']) * float(bag['Prix']) + float(demande['animaux']) * 1
    
    #Suppléments pour un passager supplémentaire
    if int(demande['nb_passagers']) > 4:
        supplement += (float(demande['nb_passagers'])-4) * float(PerS['Prix'])
    
    #Suppléments pour la prise en charge à la gare
    if demande['gare'] == 'True':
        supplement += float(Gar['Prix'])
	
    #Suppléments pour la prise en charge à l'aéroport	
    if demande['aeroport'] == 'True':
        supplement += float(Aer['Prix'])

    #On concatenne les adresses de départ et d'arrivée
    depart = demande['numero_dep'] + ' ' + demande['adresse_dep'] + ' ' + demande['cp_dep'] + ' ' + demande['ville_dep']
    arrive = demande['numero_arr'] + ' ' + demande['adresse_arr'] + ' ' + demande['cp_arr'] + ' ' + demande['ville_arr']       

    #On calcule le prix total
    # prix = coût de prise en charge + tarif par km * nombre de km + coût des suppléments 
    prixTotal = float(prise_en_charge['Prix']) + prix * round(float(Par(geo.geocoder(depart),geo.geocoder(arrive),str(date)).distance),2) + supplement
          
    #On vérifie que le prix total soit supérieur au prix minimal
    prixMinimal = float(supp[supp['Supplements'] == 'Tarif_minimum']['Prix'])
    
    if prixTotal < prixMinimal:
        prixTotal = prixMinimal
    
#On retourne le prix total via un dictionnaire de données
#Gestion des conditions

    #Si le client est pris à l'aéroport
    if demande['aeroport'] == 'True':   
        prixA = float(Aer['Prix'])
    else:
        prixA = 0
        
    #Si le nombre de personne est supérieur à 4
    if int(demande['nb_passagers']) > 4:
        nbPersonnes =  float(demande['nb_passagers']) - 4
    else:
        nbPersonnes = 0
   
     #Si le client est pris à la gare
    if demande['gare'] == 'True':
        prixG = float(Gar['Prix'])
    else:
        prixG = 0
                

    dico = {
                'Prix_Total' : str(round(prixTotal,2)), 
                'Prise_en_charge' : str(float(prise_en_charge['Prix'])),
                'Prix_par_km' : prix,
                'Nombre_km' : Par(geo.geocoder(depart),geo.geocoder(arrive),str(date)).distance,
                'Nombre_bagage' : str(demande['bagage']),
                'Prix_1_bagage' : str(float(bag['Prix'])),
                'prix_total_bagage' : str(float(demande['bagage']) * float(bag['Prix'])),
                'animal' : str(demande['animaux']),
                'prix_animal' : str(float(an['Prix'])),
                'prix_total_animal' : str(float(demande['animaux']) * float(an['Prix'])),
                'Gare' : str(demande['gare']),
                'Prix_Gare' : str(prixG),
                'Nombres_personnes_sup' : nbPersonnes,
                'Prix_par_personnes_sup' : str(float(PerS['Prix'])),
                'Prix_personnes_sup' : str((nbPersonnes) * float(PerS['Prix'])),
                'Aeroport' : str(demande['aeroport']),
                'Prix_Aeroport':str(prixA)
                }

    #On retourne le prix total
    return dico    
Beispiel #18
0
def estimation(demande):
    ''' Calculer le devis d'une demande. '''

    # On récupère les tarifs applicables
    tarifs = utile.lire_json('app/devis/data/tarifs.json')
    supplements = utile.lire_json('app/devis/data/supplements.json')

    # Prise en charge de départ
    prise_en_charge = supplements['prise_en_charge']

    # Extraction des information de départ
    depart = geo.geocoder(demande['adresse_dep'])
    arrivee = geo.geocoder(demande['adresse_arr'])
    debut = demande['debut']

    # Simulation de la course
    simulation = calculer.simuler(depart, arrivee, debut)
    duree = simulation['duree']
    distance = simulation['distance']
    jour = simulation['ratios']['jour']
    nuit = simulation['ratios']['nuit']

    # Savoir si c'est un jour ferié ou un dimanche
    date = '{0}/{1}'.format(debut.day, debut.month)
    jours_feries = calendrier.feries(debut.year)
    ferie = date in jours_feries
    dimanche = debut.weekday() == 6

    # Décider du tarif à appliquer
    if ferie or dimanche:
        prix_par_km = tarifs['D']
    else:
        prix_par_km = jour * tarifs['C'] + nuit * tarifs['D']


    # Calculer le prix de la course
    montant = distance * prix_par_km

    # Prix du trajet à vide
    tav = supplements['trajet_a_vide']

    # Calculer le supplément
    supplement = calculer_supplement(demande, supplements)

    # Tarif supplémentaire appliqué à un trajet ralenti (si temps de trajet plus long de 5 minutes 
    # par rapport à temps de trajet de référence, on applique une nouvelle tarification par minute de trajet supplémentaire)

    if round(simulation['ecart']/60) > 5:
        diff_minutes = round(simulation['ecart']/60) - 5
    else:
        diff_minutes = 0

    estimation = diff_minutes * supplements['prix_trajet_ralenti']/60



    # Calcul du total minimum estimé
    total = montant + supplement + tav + estimation
    # Prise en compte du tarif minimum
    total = max(total, supplements['tarif_minimum'])


    # On retourne l'estimation à travers un dictionnaire de données

    estimation = {
        'prix': {
            'montant': round(montant, 2),
            'supplement': round(supplement, 2),
            'trajet_a_vide' : tav,
            'total': round(total,2)

        },
        'detail': {
            'parcours': {
                'duree': str(duree),
                'distance': round(distance,1),
                'prix_par_km': prix_par_km
            },
            'bagages': {
                'nb': demande['nb_bagages'],
                'prix': supplements['bagage'],
                'total': int(demande['nb_bagages']) * supplements['bagage']
            },
            'animaux': {
                'nb': demande['nb_animaux'],
                'prix': supplements['animal'],
                'total': int(demande['nb_animaux']) * supplements['animal']
            },
            'personnes': {
                'nb': demande['nb_passagers'],
                'supplementaires': {
                    'nb': max(0, int(demande['nb_passagers']) - 4),
                    'prix': supplements['personne_sup'],
                    'total': max(0, int(demande['nb_passagers']) - 4) * supplements['personne_sup']
                }
            },
            'gare': {
                'prise_en_charge': demande['gare'],
                'prix': 0 if not demande['gare'] else supplements['gare']
            },
            'aeroport': {
                'prise_en_charge': demande['aeroport'],
                'prix': 0 if not demande['aeroport'] else supplements['aeroport']
            },
            'prise_en_charge': supplements['prise_en_charge']
        }
    }
    return estimation