From 3542104050717a26694b5a9b8382d4a2a38a114c Mon Sep 17 00:00:00 2001 From: Efril Date: Mon, 27 Apr 2026 13:24:16 +0700 Subject: [PATCH] fix sales --- internal/repository/analytics_repository.go | 52 ++++++++++++--------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/internal/repository/analytics_repository.go b/internal/repository/analytics_repository.go index 0ee622e..a43970e 100644 --- a/internal/repository/analytics_repository.go +++ b/internal/repository/analytics_repository.go @@ -77,33 +77,43 @@ func (r *AnalyticsRepositoryImpl) GetSalesAnalytics(ctx context.Context, organiz dateFormat = "DATE(o.created_at)" } - query := r.db.WithContext(ctx). - Table("orders o"). - Select(` - `+dateFormat+` as date, + outletFilter := "" + args := []interface{}{organizationID, false, false, string(entities.PaymentStatusCompleted), dateFrom, dateTo} + if outletID != nil { + outletFilter = "AND o.outlet_id = ?" + args = append(args, *outletID) + } + + rawQuery := ` + SELECT + ` + dateFormat + ` as date, COALESCE(SUM(o.total_amount), 0) as sales, COUNT(o.id) as orders, - COALESCE(SUM(CASE WHEN oi.status != 'cancelled' AND oi.is_fully_refunded = false THEN oi.quantity - COALESCE(oi.refund_quantity, 0) ELSE 0 END), 0) as items, + COALESCE(SUM(oi_agg.total_items), 0) as items, COALESCE(SUM(o.tax_amount), 0) as tax, COALESCE(SUM(o.discount_amount), 0) as discount, COALESCE(SUM(o.total_amount - o.tax_amount - o.discount_amount), 0) as net_sales - `). - Joins("LEFT JOIN order_items oi ON o.id = oi.order_id"). - Where("o.organization_id = ?", organizationID). - Where("o.is_void = ?", false). - Where("o.is_refund = ?", false). - Where("o.payment_status = ?", entities.PaymentStatusCompleted). - Where("o.created_at >= ? AND o.created_at <= ?", dateFrom, dateTo) - - if outletID != nil { - query = query.Where("o.outlet_id = ?", *outletID) - } - - err := query. - Group("date"). - Order("date ASC"). - Scan(&results).Error + FROM orders o + LEFT JOIN ( + SELECT + oi.order_id, + SUM(oi.quantity - COALESCE(oi.refund_quantity, 0)) as total_items + FROM order_items oi + WHERE oi.status != 'cancelled' + AND oi.is_fully_refunded = false + GROUP BY oi.order_id + ) oi_agg ON oi_agg.order_id = o.id + WHERE o.organization_id = ? + AND o.is_void = ? + AND o.is_refund = ? + AND o.payment_status = ? + AND o.created_at >= ? AND o.created_at <= ? + ` + outletFilter + ` + GROUP BY date + ORDER BY date ASC + ` + err := r.db.WithContext(ctx).Raw(rawQuery, args...).Scan(&results).Error return results, err }