diff --git a/internal/entity/order.go b/internal/entity/order.go index ff945d6..fed75f4 100644 --- a/internal/entity/order.go +++ b/internal/entity/order.go @@ -126,6 +126,7 @@ type OrderSearch struct { Offset int StartDate string EndDate string + Period string } type HistoryOrderList []*HistoryOrderDB @@ -180,7 +181,9 @@ func (e *TicketSoldDB) ToTicketSold() *TicketSold { } type ProductDailySales struct { - Day time.Time - ProductID int64 - TotalQuantity int + Day time.Time + SiteID int64 + SiteName string + PaymentType string + Total float64 } diff --git a/internal/handlers/http/order/order.go b/internal/handlers/http/order/order.go index a29a25c..51db59c 100644 --- a/internal/handlers/http/order/order.go +++ b/internal/handlers/http/order/order.go @@ -282,9 +282,11 @@ func (h *Handler) toDailySales(resp []entity.ProductDailySales) []response.Produ var dailySales []response.ProductDailySales for _, b := range resp { dailySales = append(dailySales, response.ProductDailySales{ - Day: b.Day, - ProductID: b.ProductID, - TotalQuantity: b.TotalQuantity, + Day: b.Day, + SiteID: b.SiteID, + Total: b.Total, + SiteName: b.SiteName, + PaymentType: b.PaymentType, }) } return dailySales diff --git a/internal/handlers/request/order.go b/internal/handlers/request/order.go index cdc66a6..63d23fe 100644 --- a/internal/handlers/request/order.go +++ b/internal/handlers/request/order.go @@ -19,6 +19,7 @@ type OrderParam struct { Status string `form:"status" json:"status"` Limit int `form:"limit" json:"limit" example:"10"` Offset int `form:"offset" json:"offset" example:"0"` + Period string `form:"period" json:"period" example:"1d,7d,1m"` } func (o *OrderParam) ToOrderEntity(ctx mycontext.Context) entity.OrderSearch { @@ -32,6 +33,7 @@ func (o *OrderParam) ToOrderEntity(ctx mycontext.Context) entity.OrderSearch { StartDate: o.StartDate, EndDate: o.EndDate, Status: o.Status, + Period: o.Period, } } diff --git a/internal/handlers/response/order.go b/internal/handlers/response/order.go index b2520a6..d4e558d 100644 --- a/internal/handlers/response/order.go +++ b/internal/handlers/response/order.go @@ -113,7 +113,9 @@ type CreateOrderItemResponse struct { } type ProductDailySales struct { - Day time.Time - ProductID int64 - TotalQuantity int + Day time.Time `json:"day"` + SiteID int64 `json:"site_id"` + SiteName string `json:"site_name"` + PaymentType string `json:"payment_type"` + Total float64 `json:"total"` } diff --git a/internal/repository/orders/order.go b/internal/repository/orders/order.go index 2c6c49c..52765d2 100644 --- a/internal/repository/orders/order.go +++ b/internal/repository/orders/order.go @@ -203,25 +203,47 @@ func (r *OrderRepository) SumAmount(ctx mycontext.Context, req entity.OrderSearc func (r *OrderRepository) GetDailySalesMetrics(ctx context.Context, req entity.OrderSearch) ([]entity.ProductDailySales, error) { var sales []entity.ProductDailySales + var dateTrunc, periodFilter string + now := time.Now() + + switch req.Period { + case "1d": + dateTrunc = "hour" + periodFilter = now.Add(-24 * time.Hour).Format("2006-01-02 15:04:05") + case "7d": + dateTrunc = "day" + periodFilter = now.Add(-7 * 24 * time.Hour).Format("2006-01-02 15:04:05") + case "1m": + dateTrunc = "day" + periodFilter = now.AddDate(0, -1, 0).Format("2006-01-02 15:04:05") + case "1y": + dateTrunc = "week" + periodFilter = now.AddDate(-1, 0, 0).Format("2006-01-02 15:04:05") + default: + dateTrunc = "day" + periodFilter = now.AddDate(0, -1, 0).Format("2006-01-02 15:04:05") // Default to last month + } + // Build the query with GORM query := r.db.WithContext(ctx). Table("orders o"). - Select(`DATE_TRUNC('day', o.created_at) AS day, oi.item_id, SUM(oi.qty) AS total_quantity`). - Joins("LEFT JOIN order_items oi ON o.id = oi.order_id"). + Select(`DATE_TRUNC(?, o.created_at) AS day, s.id AS site_id, s.name AS site_name, o.payment_type, SUM(oi.qty * oi.price) AS total_quantity`, dateTrunc). + Joins("JOIN order_items oi ON o.id = oi.order_id"). + Joins("JOIN sites s ON o.site_id = s.id"). Where("o.status = ?", "PAID"). - Where("o.created_at >= ?", time.Now().AddDate(0, 0, -30)). // Last 30 days - Group("day, oi.item_id"). - Order("day") + Where("o.created_at >= ?", periodFilter) - // Apply filters based on the presence of PartnerID and SiteID if req.PartnerID != nil { query = query.Where("o.partner_id = ?", *req.PartnerID) } + if req.SiteID != nil { query = query.Where("o.site_id = ?", *req.SiteID) } - // Execute the query and scan the results + query = query.Group("day, s.id, s.name, o.payment_type"). + Order("day") + if err := query.Find(&sales).Error; err != nil { return nil, err }