⚠️ {alert_message}
{alert_description}
{details_title}
{category_label}: {category_name}
{threshold_label}: {threshold}%
""" Budget Alert System Monitors spending and sends email alerts when budget limits are exceeded """ from flask import render_template_string from flask_mail import Mail, Message from app.models.category import Category from app.models.user import User from app import db from datetime import datetime import os mail = None def init_mail(app): """Initialize Flask-Mail with app configuration""" global mail # Email configuration from environment variables app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER', 'smtp.gmail.com') app.config['MAIL_PORT'] = int(os.environ.get('MAIL_PORT', 587)) app.config['MAIL_USE_TLS'] = os.environ.get('MAIL_USE_TLS', 'true').lower() == 'true' app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') app.config['MAIL_DEFAULT_SENDER'] = os.environ.get('MAIL_DEFAULT_SENDER', 'noreply@fina.app') mail = Mail(app) return mail def check_budget_alerts(): """Check all categories for budget overruns and send alerts""" if not mail: print("[Budget Alerts] Mail not configured") return 0 alerts_sent = 0 # Get all categories with budgets that need checking categories = Category.query.filter( Category.monthly_budget.isnot(None), Category.monthly_budget > 0 ).all() for category in categories: if category.should_send_budget_alert(): user = User.query.get(category.user_id) if user and user.budget_alerts_enabled: if send_budget_alert(user, category): category.budget_alert_sent = True category.last_budget_check = datetime.now() alerts_sent += 1 db.session.commit() return alerts_sent def send_budget_alert(user, category): """Send budget alert email to user""" if not mail: print(f"[Budget Alert] Mail not configured, skipping alert for {user.email}") return False try: status = category.get_budget_status() alert_email = user.alert_email or user.email # Get user's language lang = user.language or 'en' # Email templates in multiple languages subjects = { 'en': f'⚠️ Budget Alert: {category.name}', 'ro': f'⚠️ Alertă Buget: {category.name}', 'es': f'⚠️ Alerta de Presupuesto: {category.name}' } # Email body template html_template = """
{alert_description}
{category_label}: {category_name}
{threshold_label}: {threshold}%
This is a test email from the FINA budget alert system.
If you received this message, your email configuration is working correctly!
FINA Finance Tracker
''' ) mail.send(msg) return True, "Test email sent successfully" except Exception as e: return False, str(e)