fix: analytics avg_daily_expense uses selected month/year instead of current
All checks were successful
CI / ci (push) Successful in 13s

This commit is contained in:
Cosmo
2026-03-01 05:31:05 +00:00
parent 9e06341564
commit 901173a337
3 changed files with 21 additions and 11 deletions

View File

@@ -253,11 +253,21 @@ func (h *FinanceHandler) Analytics(w http.ResponseWriter, r *http.Request) {
if !ok { if !ok {
return return
} }
months, _ := strconv.Atoi(r.URL.Query().Get("months")) q := r.URL.Query()
months, _ := strconv.Atoi(q.Get("months"))
if months <= 0 { if months <= 0 {
months = 6 months = 6
} }
analytics, err := h.svc.GetAnalytics(userID, months) now := time.Now()
month, _ := strconv.Atoi(q.Get("month"))
year, _ := strconv.Atoi(q.Get("year"))
if month <= 0 {
month = int(now.Month())
}
if year <= 0 {
year = now.Year()
}
analytics, err := h.svc.GetAnalytics(userID, months, month, year)
if err != nil { if err != nil {
writeError(w, "failed to get analytics", http.StatusInternalServerError) writeError(w, "failed to get analytics", http.StatusInternalServerError)
return return

View File

@@ -317,7 +317,7 @@ func (r *FinanceRepository) GetSummary(userID int64, month, year int) (*model.Fi
return summary, nil return summary, nil
} }
func (r *FinanceRepository) GetAnalytics(userID int64, months int) (*model.FinanceAnalytics, error) { func (r *FinanceRepository) GetAnalytics(userID int64, months, month, year int) (*model.FinanceAnalytics, error) {
analytics := &model.FinanceAnalytics{} analytics := &model.FinanceAnalytics{}
// Monthly trend // Monthly trend
@@ -342,27 +342,27 @@ func (r *FinanceRepository) GetAnalytics(userID int64, months int) (*model.Finan
analytics.MonthlyTrend = []model.MonthlyTrend{} analytics.MonthlyTrend = []model.MonthlyTrend{}
} }
// Avg daily expense for current month // Avg daily expense for selected month
now := time.Now()
var totalExpense float64 var totalExpense float64
var dayCount int var dayCount int
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0), COUNT(DISTINCT date) r.db.QueryRow(`SELECT COALESCE(SUM(amount),0), COUNT(DISTINCT date)
FROM finance_transactions WHERE user_id=$1 AND type='expense' FROM finance_transactions WHERE user_id=$1 AND type='expense'
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`, AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
userID, int(now.Month()), now.Year()).Scan(&totalExpense, &dayCount) userID, month, year).Scan(&totalExpense, &dayCount)
if dayCount > 0 { if dayCount > 0 {
analytics.AvgDailyExpense = totalExpense / float64(dayCount) analytics.AvgDailyExpense = totalExpense / float64(dayCount)
} }
// Comparison with previous month // Comparison with previous month
prevMonth := now.AddDate(0, -1, 0) selectedMonth := time.Date(year, time.Month(month), 1, 0, 0, 0, 0, time.UTC)
prevMonthTime := selectedMonth.AddDate(0, -1, 0)
var currentMonthExp, prevMonthExp float64 var currentMonthExp, prevMonthExp float64
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM finance_transactions WHERE user_id=$1 AND type='expense' r.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM finance_transactions WHERE user_id=$1 AND type='expense'
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`, AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
userID, int(now.Month()), now.Year()).Scan(&currentMonthExp) userID, month, year).Scan(&currentMonthExp)
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM finance_transactions WHERE user_id=$1 AND type='expense' r.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM finance_transactions WHERE user_id=$1 AND type='expense'
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`, AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
userID, int(prevMonth.Month()), prevMonth.Year()).Scan(&prevMonthExp) userID, int(prevMonthTime.Month()), prevMonthTime.Year()).Scan(&prevMonthExp)
analytics.ComparisonPrevMonth = model.Comparison{ analytics.ComparisonPrevMonth = model.Comparison{
Current: currentMonthExp, Current: currentMonthExp,

View File

@@ -162,6 +162,6 @@ func (s *FinanceService) GetSummary(userID int64, month, year int) (*model.Finan
return s.repo.GetSummary(userID, month, year) return s.repo.GetSummary(userID, month, year)
} }
func (s *FinanceService) GetAnalytics(userID int64, months int) (*model.FinanceAnalytics, error) { func (s *FinanceService) GetAnalytics(userID int64, months, month, year int) (*model.FinanceAnalytics, error) {
return s.repo.GetAnalytics(userID, months) return s.repo.GetAnalytics(userID, months, month, year)
} }