feat: add outlet name at analytic response and new overview dashboard
This commit is contained in:
@@ -21,6 +21,7 @@ type AnalyticsRepository interface {
|
||||
GetProfitLossAnalytics(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID, dateFrom, dateTo time.Time, groupBy string) (*entities.ProfitLossAnalytics, error)
|
||||
GetExclusiveSummaryAnalytics(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID, dateFrom, dateTo time.Time) (*entities.ExclusiveSummaryAnalytics, error)
|
||||
GetExclusiveSummaryBankBalances(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID) ([]entities.ExclusiveSummaryBankBalance, error)
|
||||
GetOutletName(ctx context.Context, organizationID uuid.UUID, outletID uuid.UUID) (string, error)
|
||||
}
|
||||
|
||||
type AnalyticsRepositoryImpl struct {
|
||||
@@ -40,6 +41,22 @@ func (r *AnalyticsRepositoryImpl) resolveOutletID(query *gorm.DB, outletID *uuid
|
||||
return query
|
||||
}
|
||||
|
||||
func (r *AnalyticsRepositoryImpl) GetOutletName(ctx context.Context, organizationID uuid.UUID, outletID uuid.UUID) (string, error) {
|
||||
var outlet struct {
|
||||
Name string
|
||||
}
|
||||
result := r.db.WithContext(ctx).
|
||||
Table("outlets").
|
||||
Select("name").
|
||||
Where("id = ? AND organization_id = ?", outletID, organizationID).
|
||||
Limit(1).
|
||||
Scan(&outlet)
|
||||
if result.Error != nil {
|
||||
return "", result.Error
|
||||
}
|
||||
return outlet.Name, nil
|
||||
}
|
||||
|
||||
func purchaseOrderItemTotalAmountSQL() string {
|
||||
return "CASE WHEN pc.type = '" + string(entities.PurchaseCategoryTypeRawMaterial) + "' THEN COALESCE(poi.quantity, 0) * poi.amount ELSE poi.amount END"
|
||||
}
|
||||
@@ -471,6 +488,41 @@ func (r *AnalyticsRepositoryImpl) GetDashboardOverview(ctx context.Context, orga
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Total item sold (sum of order_items quantity for completed orders in date range)
|
||||
var totalItemSold int64
|
||||
itemQuery := r.db.WithContext(ctx).
|
||||
Table("order_items oi").
|
||||
Select("COALESCE(SUM(oi.quantity), 0)").
|
||||
Joins("JOIN orders o ON o.id = oi.order_id").
|
||||
Where("o.organization_id = ?", organizationID).
|
||||
Where("o.is_void = false AND o.is_refund = false AND o.payment_status = 'completed'").
|
||||
Where("o.created_at >= ? AND o.created_at <= ?", dateFrom, dateTo)
|
||||
itemQuery = r.resolveOutletID(itemQuery, outletID, "o.outlet_id")
|
||||
itemQuery.Scan(&totalItemSold)
|
||||
result.TotalItemSold = totalItemSold
|
||||
|
||||
// Total low stock (inventory where quantity <= reorder_level)
|
||||
var totalLowStock int64
|
||||
lowStockQuery := r.db.WithContext(ctx).
|
||||
Table("inventory i").
|
||||
Select("COUNT(i.id)").
|
||||
Joins("JOIN products p ON p.id = i.product_id").
|
||||
Where("p.organization_id = ?", organizationID).
|
||||
Where("i.quantity <= i.reorder_level")
|
||||
lowStockQuery = r.resolveOutletID(lowStockQuery, outletID, "i.outlet_id")
|
||||
lowStockQuery.Scan(&totalLowStock)
|
||||
result.TotalLowStock = totalLowStock
|
||||
|
||||
// Total active products
|
||||
var totalProductActive int64
|
||||
productQuery := r.db.WithContext(ctx).
|
||||
Table("products p").
|
||||
Select("COUNT(p.id)").
|
||||
Where("p.organization_id = ?", organizationID).
|
||||
Where("p.is_active = true")
|
||||
productQuery.Scan(&totalProductActive)
|
||||
result.TotalProductActive = totalProductActive
|
||||
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user