diff --git a/internal/handler/finance.go b/internal/handler/finance.go index 32ca323..d2da18a 100644 --- a/internal/handler/finance.go +++ b/internal/handler/finance.go @@ -253,11 +253,21 @@ func (h *FinanceHandler) Analytics(w http.ResponseWriter, r *http.Request) { if !ok { return } - months, _ := strconv.Atoi(r.URL.Query().Get("months")) + q := r.URL.Query() + months, _ := strconv.Atoi(q.Get("months")) if months <= 0 { 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 { writeError(w, "failed to get analytics", http.StatusInternalServerError) return diff --git a/internal/repository/finance.go b/internal/repository/finance.go index ac4a885..1bc1fad 100644 --- a/internal/repository/finance.go +++ b/internal/repository/finance.go @@ -317,7 +317,7 @@ func (r *FinanceRepository) GetSummary(userID int64, month, year int) (*model.Fi 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{} // Monthly trend @@ -342,27 +342,27 @@ func (r *FinanceRepository) GetAnalytics(userID int64, months int) (*model.Finan analytics.MonthlyTrend = []model.MonthlyTrend{} } - // Avg daily expense for current month - now := time.Now() + // Avg daily expense for selected month var totalExpense float64 var dayCount int r.db.QueryRow(`SELECT COALESCE(SUM(amount),0), COUNT(DISTINCT date) FROM finance_transactions WHERE user_id=$1 AND type='expense' 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 { analytics.AvgDailyExpense = totalExpense / float64(dayCount) } // 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 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`, - userID, int(now.Month()), now.Year()).Scan(¤tMonthExp) + userID, month, year).Scan(¤tMonthExp) 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`, - userID, int(prevMonth.Month()), prevMonth.Year()).Scan(&prevMonthExp) + userID, int(prevMonthTime.Month()), prevMonthTime.Year()).Scan(&prevMonthExp) analytics.ComparisonPrevMonth = model.Comparison{ Current: currentMonthExp, diff --git a/internal/service/finance.go b/internal/service/finance.go index a046d1f..1bd4fd8 100644 --- a/internal/service/finance.go +++ b/internal/service/finance.go @@ -162,6 +162,6 @@ func (s *FinanceService) GetSummary(userID int64, month, year int) (*model.Finan return s.repo.GetSummary(userID, month, year) } -func (s *FinanceService) GetAnalytics(userID int64, months int) (*model.FinanceAnalytics, error) { - return s.repo.GetAnalytics(userID, months) +func (s *FinanceService) GetAnalytics(userID int64, months, month, year int) (*model.FinanceAnalytics, error) { + return s.repo.GetAnalytics(userID, months, month, year) }