Mhamdans17 commited on
Commit
f086228
·
1 Parent(s): 6650d27

Fix GORM method chaining state sharing bug in GetFeeReport

Browse files
Files changed (1) hide show
  1. controllers/fee_controller.go +14 -11
controllers/fee_controller.go CHANGED
@@ -10,6 +10,7 @@ import (
10
  "service-warungpos-go/models"
11
 
12
  "github.com/gin-gonic/gin"
 
13
  )
14
 
15
  type FeeSummaryData struct {
@@ -92,18 +93,21 @@ func GetFeeReport(c *gin.Context) {
92
  startDt := time.Date(dFrom.Year(), dFrom.Month(), dFrom.Day(), 0, 0, 0, 0, loc)
93
  endDt := time.Date(dTo.Year(), dTo.Month(), dTo.Day(), 23, 59, 59, 0, loc)
94
 
95
- baseQuery := config.DB.Table("orders").
96
- Where("orders.payment_status = ? AND orders.created_at >= ? AND orders.created_at <= ?", "paid", startDt, endDt)
97
-
98
- if companyIDStr != "" {
99
- if cID, err := strconv.Atoi(companyIDStr); err == nil {
100
- baseQuery = baseQuery.Where("orders.company_id = ?", cID)
 
 
101
  }
 
102
  }
103
 
104
  // 1. Summary keseluruhan
105
  var summary FeeSummaryData
106
- baseQuery.Select(`
107
  count(orders.id) as total_transactions,
108
  coalesce(sum(orders.total_amount), 0) as total_revenue,
109
  coalesce(sum(orders.platform_fee), 0) as total_fee,
@@ -115,7 +119,7 @@ func GetFeeReport(c *gin.Context) {
115
 
116
  // 2. Summary per perusahaan
117
  var perCompany []CompanyFeeRow
118
- baseQuery.Select(`
119
  orders.company_id,
120
  companies.name as company_name,
121
  companies.fee_percentage,
@@ -132,7 +136,7 @@ func GetFeeReport(c *gin.Context) {
132
 
133
  // 3. Summary per cabang
134
  var perBranch []BranchFeeRow
135
- baseQuery.Select(`
136
  orders.company_id,
137
  companies.name as company_name,
138
  orders.branch_id,
@@ -151,8 +155,7 @@ func GetFeeReport(c *gin.Context) {
151
 
152
  // 4. Daily breakdown
153
  var dailyBreakdown []DailyFeeRow
154
- // SQL DATE(created_at) di PostgreSQL
155
- baseQuery.Select(`
156
  DATE(orders.created_at) as day,
157
  orders.company_id,
158
  companies.name as company_name,
 
10
  "service-warungpos-go/models"
11
 
12
  "github.com/gin-gonic/gin"
13
+ "gorm.io/gorm"
14
  )
15
 
16
  type FeeSummaryData struct {
 
93
  startDt := time.Date(dFrom.Year(), dFrom.Month(), dFrom.Day(), 0, 0, 0, 0, loc)
94
  endDt := time.Date(dTo.Year(), dTo.Month(), dTo.Day(), 23, 59, 59, 0, loc)
95
 
96
+ // Helper local untuk membikin query fresh guna menghindari GORM method chaining state sharing bug (table name specified more than once)
97
+ getFreshFeeQuery := func() *gorm.DB {
98
+ q := config.DB.Table("orders").
99
+ Where("orders.payment_status = ? AND orders.created_at >= ? AND orders.created_at <= ?", "paid", startDt, endDt)
100
+ if companyIDStr != "" {
101
+ if cID, err := strconv.Atoi(companyIDStr); err == nil {
102
+ q = q.Where("orders.company_id = ?", cID)
103
+ }
104
  }
105
+ return q
106
  }
107
 
108
  // 1. Summary keseluruhan
109
  var summary FeeSummaryData
110
+ getFreshFeeQuery().Select(`
111
  count(orders.id) as total_transactions,
112
  coalesce(sum(orders.total_amount), 0) as total_revenue,
113
  coalesce(sum(orders.platform_fee), 0) as total_fee,
 
119
 
120
  // 2. Summary per perusahaan
121
  var perCompany []CompanyFeeRow
122
+ getFreshFeeQuery().Select(`
123
  orders.company_id,
124
  companies.name as company_name,
125
  companies.fee_percentage,
 
136
 
137
  // 3. Summary per cabang
138
  var perBranch []BranchFeeRow
139
+ getFreshFeeQuery().Select(`
140
  orders.company_id,
141
  companies.name as company_name,
142
  orders.branch_id,
 
155
 
156
  // 4. Daily breakdown
157
  var dailyBreakdown []DailyFeeRow
158
+ getFreshFeeQuery().Select(`
 
159
  DATE(orders.created_at) as day,
160
  orders.company_id,
161
  companies.name as company_name,