from datetime import timedelta from peewee import fn import database def get_start_end_dates(period, date): if period == 'daily': start_date = date end_date = date + timedelta(days=1) elif period == 'weekly': start_date = date - timedelta(days=date.weekday()) end_date = start_date + timedelta(days=7) elif period == 'monthly': start_date = date.replace(day=1) next_month = start_date + timedelta(days=32) end_date = next_month.replace(day=1) elif period == 'yearly': start_date = date.replace(day=1, month=1) end_date = start_date.replace(year=start_date.year + 1) else: raise ValueError("Invalid period specified") return start_date, end_date def aggregate_transactions_by_category(user_id, start_date, end_date): query = (database.Transaction .select(database.TransactionCategory.name, fn.SUM(database.Transaction.amount).alias('total')) .join(database.TransactionCategory, on=(database.Transaction.subcategory == database.TransactionCategory.primary_key)) .where( (database.Transaction.user == user_id) & (database.Transaction.transaction_date >= start_date) & (database.Transaction.transaction_date < end_date)) .group_by(database.TransactionCategory.name)) return [{transaction.subcategory.name: transaction.total} for transaction in query]