fix request outlet id at analytic

This commit is contained in:
efrilm 2026-05-13 14:23:27 +07:00
parent d38a770ec5
commit fa037b4d2a
3 changed files with 47 additions and 34 deletions

View File

@ -7,11 +7,11 @@ import (
) )
type PaymentMethodAnalyticsRequest struct { type PaymentMethodAnalyticsRequest struct {
OrganizationID uuid.UUID `form:"organization_id"` OrganizationID uuid.UUID `form:"organization_id"`
OutletID *uuid.UUID `form:"outlet_id,omitempty"` OutletID *string `form:"outlet_id,omitempty"`
DateFrom string `form:"date_from" validate:"required"` DateFrom string `form:"date_from" validate:"required"`
DateTo string `form:"date_to" validate:"required"` DateTo string `form:"date_to" validate:"required"`
GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"`
} }
// PaymentMethodAnalyticsResponse represents the response for payment method analytics // PaymentMethodAnalyticsResponse represents the response for payment method analytics
@ -45,10 +45,10 @@ type PaymentMethodAnalyticsData struct {
type SalesAnalyticsRequest struct { type SalesAnalyticsRequest struct {
OrganizationID uuid.UUID OrganizationID uuid.UUID
OutletID *uuid.UUID `form:"outlet_id,omitempty"` OutletID *string `form:"outlet_id,omitempty"`
DateFrom string `form:"date_from" validate:"required"` DateFrom string `form:"date_from" validate:"required"`
DateTo string `form:"date_to" validate:"required"` DateTo string `form:"date_to" validate:"required"`
GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"`
} }
type SalesAnalyticsResponse struct { type SalesAnalyticsResponse struct {
@ -86,10 +86,10 @@ type SalesAnalyticsData struct {
// ProductAnalyticsRequest represents the request for product analytics // ProductAnalyticsRequest represents the request for product analytics
type ProductAnalyticsRequest struct { type ProductAnalyticsRequest struct {
OrganizationID uuid.UUID OrganizationID uuid.UUID
OutletID *uuid.UUID `form:"outlet_id,omitempty"` OutletID *string `form:"outlet_id,omitempty"`
DateFrom string `form:"date_from" validate:"required"` DateFrom string `form:"date_from" validate:"required"`
DateTo string `form:"date_to" validate:"required"` DateTo string `form:"date_to" validate:"required"`
Limit int `form:"limit,default=1000" validate:"min=1,max=1000"` Limit int `form:"limit,default=1000" validate:"min=1,max=1000"`
} }
// ProductAnalyticsResponse represents the response for product analytics // ProductAnalyticsResponse represents the response for product analytics
@ -123,9 +123,9 @@ type ProductAnalyticsData struct {
// ProductAnalyticsPerCategoryRequest represents the request for product analytics per category // ProductAnalyticsPerCategoryRequest represents the request for product analytics per category
type ProductAnalyticsPerCategoryRequest struct { type ProductAnalyticsPerCategoryRequest struct {
OrganizationID uuid.UUID OrganizationID uuid.UUID
OutletID *uuid.UUID `form:"outlet_id,omitempty"` OutletID *string `form:"outlet_id,omitempty"`
DateFrom string `form:"date_from" validate:"required"` DateFrom string `form:"date_from" validate:"required"`
DateTo string `form:"date_to" validate:"required"` DateTo string `form:"date_to" validate:"required"`
} }
// ProductAnalyticsPerCategoryResponse represents the response for product analytics per category // ProductAnalyticsPerCategoryResponse represents the response for product analytics per category
@ -152,9 +152,9 @@ type ProductAnalyticsPerCategoryData struct {
// DashboardAnalyticsRequest represents the request for dashboard analytics // DashboardAnalyticsRequest represents the request for dashboard analytics
type DashboardAnalyticsRequest struct { type DashboardAnalyticsRequest struct {
OrganizationID uuid.UUID OrganizationID uuid.UUID
OutletID *uuid.UUID `form:"outlet_id,omitempty"` OutletID *string `form:"outlet_id,omitempty"`
DateFrom string `form:"date_from" validate:"required"` DateFrom string `form:"date_from" validate:"required"`
DateTo string `form:"date_to" validate:"required"` DateTo string `form:"date_to" validate:"required"`
} }
// DashboardAnalyticsResponse represents the response for dashboard analytics // DashboardAnalyticsResponse represents the response for dashboard analytics
@ -182,10 +182,10 @@ type DashboardOverview struct {
// ProfitLossAnalyticsRequest represents the request for profit and loss analytics // ProfitLossAnalyticsRequest represents the request for profit and loss analytics
type ProfitLossAnalyticsRequest struct { type ProfitLossAnalyticsRequest struct {
OrganizationID uuid.UUID OrganizationID uuid.UUID
OutletID *uuid.UUID `form:"outlet_id,omitempty"` OutletID *string `form:"outlet_id,omitempty"`
DateFrom string `form:"date_from" validate:"required"` DateFrom string `form:"date_from" validate:"required"`
DateTo string `form:"date_to" validate:"required"` DateTo string `form:"date_to" validate:"required"`
GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"`
} }
// ProfitLossAnalyticsResponse represents the response for profit and loss analytics // ProfitLossAnalyticsResponse represents the response for profit and loss analytics

View File

@ -26,14 +26,13 @@ func NewAnalyticsHandler(
} }
} }
func (h *AnalyticsHandler) resolveOutletID(c *gin.Context, contextOutletID uuid.UUID) *uuid.UUID { func (h *AnalyticsHandler) resolveOutletID(c *gin.Context, contextOutletID uuid.UUID) *string {
if outletIDStr := c.Query("outlet_id"); outletIDStr != "" { if outletIDStr := c.Query("outlet_id"); outletIDStr != "" {
if parsedID, err := uuid.Parse(outletIDStr); err == nil { return &outletIDStr
return &parsedID
}
} }
if contextOutletID != uuid.Nil { if contextOutletID != uuid.Nil {
return &contextOutletID s := contextOutletID.String()
return &s
} }
return nil return nil
} }

View File

@ -6,8 +6,22 @@ import (
"apskel-pos-be/internal/util" "apskel-pos-be/internal/util"
"fmt" "fmt"
"time" "time"
"github.com/google/uuid"
) )
// parseOutletID converts a *string outlet ID to *uuid.UUID, returning nil for invalid/empty values.
func parseOutletID(s *string) *uuid.UUID {
if s == nil {
return nil
}
id, err := uuid.Parse(*s)
if err != nil {
return nil
}
return &id
}
// PaymentMethodAnalyticsContractToModel converts contract request to model // PaymentMethodAnalyticsContractToModel converts contract request to model
func PaymentMethodAnalyticsContractToModel(req *contract.PaymentMethodAnalyticsRequest) *models.PaymentMethodAnalyticsRequest { func PaymentMethodAnalyticsContractToModel(req *contract.PaymentMethodAnalyticsRequest) *models.PaymentMethodAnalyticsRequest {
var dateFrom, dateTo time.Time var dateFrom, dateTo time.Time
@ -23,7 +37,7 @@ func PaymentMethodAnalyticsContractToModel(req *contract.PaymentMethodAnalyticsR
return &models.PaymentMethodAnalyticsRequest{ return &models.PaymentMethodAnalyticsRequest{
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
OutletID: req.OutletID, OutletID: parseOutletID(req.OutletID),
DateFrom: dateFrom, DateFrom: dateFrom,
DateTo: dateTo, DateTo: dateTo,
GroupBy: req.GroupBy, GroupBy: req.GroupBy,
@ -79,7 +93,7 @@ func SalesAnalyticsContractToModel(req *contract.SalesAnalyticsRequest) *models.
return &models.SalesAnalyticsRequest{ return &models.SalesAnalyticsRequest{
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
OutletID: req.OutletID, OutletID: parseOutletID(req.OutletID),
DateFrom: dateFrom, DateFrom: dateFrom,
DateTo: dateTo, DateTo: dateTo,
GroupBy: req.GroupBy, GroupBy: req.GroupBy,
@ -139,7 +153,7 @@ func ProductAnalyticsContractToModel(req *contract.ProductAnalyticsRequest) *mod
return &models.ProductAnalyticsRequest{ return &models.ProductAnalyticsRequest{
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
OutletID: req.OutletID, OutletID: parseOutletID(req.OutletID),
DateFrom: dateFrom, DateFrom: dateFrom,
DateTo: dateTo, DateTo: dateTo,
Limit: req.Limit, Limit: req.Limit,
@ -199,7 +213,7 @@ func ProductAnalyticsPerCategoryContractToModel(req *contract.ProductAnalyticsPe
return &models.ProductAnalyticsPerCategoryRequest{ return &models.ProductAnalyticsPerCategoryRequest{
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
OutletID: req.OutletID, OutletID: parseOutletID(req.OutletID),
DateFrom: dateFrom, DateFrom: dateFrom,
DateTo: dateTo, DateTo: dateTo,
} }
@ -251,7 +265,7 @@ func DashboardAnalyticsContractToModel(req *contract.DashboardAnalyticsRequest)
return &models.DashboardAnalyticsRequest{ return &models.DashboardAnalyticsRequest{
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
OutletID: req.OutletID, OutletID: parseOutletID(req.OutletID),
DateFrom: dateFrom, DateFrom: dateFrom,
DateTo: dateTo, DateTo: dateTo,
} }
@ -346,7 +360,7 @@ func ProfitLossAnalyticsContractToModel(req *contract.ProfitLossAnalyticsRequest
return &models.ProfitLossAnalyticsRequest{ return &models.ProfitLossAnalyticsRequest{
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
OutletID: req.OutletID, OutletID: parseOutletID(req.OutletID),
DateFrom: *dateFrom, DateFrom: *dateFrom,
DateTo: *dateTo, DateTo: *dateTo,
GroupBy: req.GroupBy, GroupBy: req.GroupBy,