This commit is contained in:
2026-03-27 17:52:41 +01:00
parent 3cf8233054
commit 8320738acb
32 changed files with 5113 additions and 1385 deletions
+148
View File
@@ -148,6 +148,76 @@ def dashboard():
)
# ============================================
# ROUTES - PROFIL
# ============================================
@app.route('/profile', methods=['GET', 'POST'])
@login_required
def profile():
"""Page de profil pour gerer la securite et les infos persos."""
token = session['token']
if request.method == 'POST':
action = request.form.get('action')
if action == 'update_profile':
phone = request.form.get('phone', '')
address = request.form.get('address', '')
data, status = api_request('PUT', '/api/user/profile', {
'phone': phone,
'address': address
}, token=token)
if status == 200:
flash('Informations personnelles mises a jour !', 'success')
else:
flash(data.get('error', 'Erreur lors de la mise a jour'), 'danger')
elif action == 'update_password':
current_password = request.form.get('current_password')
new_password = request.form.get('new_password')
confirm_password = request.form.get('confirm_password')
if new_password != confirm_password:
flash('Les nouveaux mots de passe ne correspondent pas', 'danger')
else:
data, status = api_request('PUT', '/api/user/security/password', {
'current_password': current_password,
'new_password': new_password
}, token=token)
if status == 200:
flash('Mot de passe mis a jour avec succes !', 'success')
else:
flash(data.get('error', 'Erreur'), 'danger')
elif action == 'update_email':
password = request.form.get('password')
new_email = request.form.get('new_email')
data, status = api_request('PUT', '/api/user/security/email', {
'password': password,
'new_email': new_email
}, token=token)
if status == 200:
flash('Email mis a jour avec succes. Vous devez vous reconnecter pour valider les changements.', 'success')
session.clear()
return redirect(url_for('login'))
else:
flash(data.get('error', 'Erreur'), 'danger')
# Recuperation complete du profil et des comptes
profile_data, status_profile = api_request('GET', '/api/user/profile', token=token)
accounts_data, status_accounts = api_request('GET', '/api/accounts', token=token)
user_profile = profile_data.get('user', session.get('user', {})) if status_profile == 200 else session.get('user', {})
accounts_list = accounts_data.get('accounts', []) if status_accounts == 200 else []
return render_template('profile.html', user_profile=user_profile, accounts=accounts_list)
# ============================================
# ROUTES - COMPTES
# ============================================
@@ -349,6 +419,84 @@ def transactions():
)
# ============================================
# ROUTES - EXPORT CSV
# ============================================
@app.route('/transactions/export')
@login_required
def export_transactions():
"""Redirige vers le backend pour télécharger le CSV des transactions."""
import requests as req
token = session['token']
account_id = request.args.get('account_id', '')
endpoint = f"{BACKEND_URL}/api/transactions/export"
if account_id:
endpoint += f"?account_id={account_id}"
headers = {
'Authorization': f'Bearer {token}',
'Content-Type': 'application/json'
}
try:
resp = req.get(endpoint, headers=headers, timeout=15)
if resp.status_code == 200:
from flask import Response
return Response(
resp.content,
mimetype='text/csv',
headers={
'Content-Disposition': 'attachment; filename="dragonbank_transactions.csv"'
}
)
else:
flash('Erreur lors de la génération du CSV', 'danger')
return redirect(url_for('transactions'))
except Exception as e:
flash('Impossible de contacter le serveur', 'danger')
return redirect(url_for('transactions'))
# ============================================
# ROUTES - SIMULATEUR D'ÉPARGNE
# ============================================
@app.route('/simulator', methods=['GET', 'POST'])
@login_required
def simulator():
"""Simulateur de croissance de l'épargne avec graphique."""
token = session['token']
resultat = None
# Récupération des comptes épargne pour pré-remplir le simulateur
accounts_data, _ = api_request('GET', '/api/accounts', token=token)
comptes_epargne = [
a for a in accounts_data.get('accounts', [])
if a.get('account_type') in ('livret_a', 'assurance_vie')
]
if request.method == 'POST':
form_data = {
'capital_initial': float(request.form.get('capital_initial', 0)),
'taux_annuel': float(request.form.get('taux_annuel', 3)),
'duree_annees': int(request.form.get('duree_annees', 10)),
'versement_mensuel': float(request.form.get('versement_mensuel', 0))
}
data, status = api_request('POST', '/api/simulator', data=form_data, token=token)
if status == 200:
resultat = data
else:
flash(data.get('error', 'Erreur de simulation'), 'danger')
return render_template('simulator.html',
user=session.get('user', {}),
comptes_epargne=comptes_epargne,
resultat=resultat
)
# ============================================
# DÉMARRAGE
# ============================================