@@ -18,22 +18,14 @@ func NewReportHandler(db *sql.DB, exchangeService *services.ExchangeService) *Re
1818 return & ReportHandler {db : db , exchangeService : exchangeService }
1919}
2020
21- type CategoryReport struct {
22- Category string `json:"category"`
23- Amount float64 `json:"amount"`
24- Budget * float64 `json:"budget,omitempty"`
25- Percentage * float64 `json:"percentage,omitempty"`
26- Remaining * float64 `json:"remaining,omitempty"`
27- }
28-
2921type ReportResponse struct {
30- PeriodStart string `json:"period_start"`
31- PeriodEnd string `json:"period_end"`
32- Currency string `json:"currency"`
33- TotalIncome float64 `json:"total_income"`
34- TotalExpenses float64 `json:"total_expenses"`
35- ExpensesByCategory [] CategoryReport `json:"expenses_by_category"`
36- FirstTransactionDate * string `json:"first_transaction_date"`
22+ PeriodStart string `json:"period_start"`
23+ PeriodEnd string `json:"period_end"`
24+ Currency string `json:"currency"`
25+ TotalIncome float64 `json:"total_income"`
26+ TotalExpenses float64 `json:"total_expenses"`
27+ ExpensesByCategory map [ string ] float64 `json:"expenses_by_category"`
28+ FirstTransactionDate * string `json:"first_transaction_date"`
3729}
3830
3931func (h * ReportHandler ) GetReport (w http.ResponseWriter , r * http.Request ) {
@@ -139,7 +131,7 @@ func (h *ReportHandler) GetReport(w http.ResponseWriter, r *http.Request) {
139131 Currency : baseCurrency ,
140132 TotalIncome : 0 ,
141133 TotalExpenses : 0 ,
142- ExpensesByCategory : [] CategoryReport {} ,
134+ ExpensesByCategory : make ( map [ string ] float64 ) ,
143135 }, http .StatusOK )
144136 return
145137 }
@@ -185,9 +177,10 @@ func (h *ReportHandler) GetReport(w http.ResponseWriter, r *http.Request) {
185177 }
186178
187179 // Categorize based on transaction type
188- if txType == "deposit" {
180+ switch txType {
181+ case "deposit" :
189182 totalIncome += convertedAmount
190- } else if txType == "withdrawal" || txType == "expense" {
183+ case "withdrawal" , "expense" :
191184 totalExpenses += convertedAmount
192185 expensesByCategory [category ] += convertedAmount
193186 }
@@ -209,53 +202,13 @@ func (h *ReportHandler) GetReport(w http.ResponseWriter, r *http.Request) {
209202 firstTxDate = & dateStr
210203 }
211204
212- // Fetch user's budgets (only for monthly reports)
213- budgets := make (map [string ]float64 )
214- if period == "month" {
215- budgetRows , err := h .db .Query (`
216- SELECT category, monthly_limit
217- FROM category_budgets
218- WHERE user_id = ?
219- ` , userID )
220- if err == nil {
221- defer budgetRows .Close ()
222- for budgetRows .Next () {
223- var category string
224- var limit float64
225- if err := budgetRows .Scan (& category , & limit ); err == nil {
226- budgets [category ] = limit
227- }
228- }
229- }
230- }
231-
232- // Build category reports with budget information
233- categoryReports := make ([]CategoryReport , 0 , len (expensesByCategory ))
234- for category , amount := range expensesByCategory {
235- catReport := CategoryReport {
236- Category : category ,
237- Amount : amount ,
238- }
239-
240- // Add budget info if exists for this category
241- if budget , hasBudget := budgets [category ]; hasBudget {
242- catReport .Budget = & budget
243- percentage := (amount / budget ) * 100
244- catReport .Percentage = & percentage
245- remaining := budget - amount
246- catReport .Remaining = & remaining
247- }
248-
249- categoryReports = append (categoryReports , catReport )
250- }
251-
252205 report := ReportResponse {
253206 PeriodStart : startDate .Format ("2006-01-02" ),
254207 PeriodEnd : endDate .Format ("2006-01-02" ),
255208 Currency : baseCurrency ,
256209 TotalIncome : totalIncome ,
257210 TotalExpenses : totalExpenses ,
258- ExpensesByCategory : categoryReports ,
211+ ExpensesByCategory : expensesByCategory ,
259212 FirstTransactionDate : firstTxDate ,
260213 }
261214
0 commit comments