diff --git a/internal/handler/analytics_handler.go b/internal/handler/analytics_handler.go index 5464620..69617d6 100644 --- a/internal/handler/analytics_handler.go +++ b/internal/handler/analytics_handler.go @@ -36,6 +36,7 @@ func (h *AnalyticsHandler) GetPaymentMethodAnalytics(c *gin.Context) { } req.OrganizationID = contextInfo.OrganizationID + req.OutletID = &contextInfo.OutletID modelReq := transformer.PaymentMethodAnalyticsContractToModel(&req) response, err := h.analyticsService.GetPaymentMethodAnalytics(ctx, modelReq) @@ -44,12 +45,10 @@ func (h *AnalyticsHandler) GetPaymentMethodAnalytics(c *gin.Context) { return } - // Transform model to contract contractResp := transformer.PaymentMethodAnalyticsModelToContract(response) util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetPaymentMethodAnalytics") } -// GetSalesAnalytics handles the request to get sales analytics func (h *AnalyticsHandler) GetSalesAnalytics(c *gin.Context) { ctx := c.Request.Context() contextInfo := appcontext.FromGinContext(ctx) @@ -61,21 +60,19 @@ func (h *AnalyticsHandler) GetSalesAnalytics(c *gin.Context) { } req.OrganizationID = contextInfo.OrganizationID + req.OutletID = &contextInfo.OutletID modelReq := transformer.SalesAnalyticsContractToModel(&req) - // Call service response, err := h.analyticsService.GetSalesAnalytics(ctx, modelReq) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{contract.NewResponseError("internal_error", "AnalyticsHandler::GetSalesAnalytics", err.Error())}), "AnalyticsHandler::GetSalesAnalytics") return } - // Transform model to contract contractResp := transformer.SalesAnalyticsModelToContract(response) util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetSalesAnalytics") } -// GetProductAnalytics handles the request to get product analytics func (h *AnalyticsHandler) GetProductAnalytics(c *gin.Context) { ctx := c.Request.Context() contextInfo := appcontext.FromGinContext(ctx) @@ -87,22 +84,19 @@ func (h *AnalyticsHandler) GetProductAnalytics(c *gin.Context) { } req.OrganizationID = contextInfo.OrganizationID - // Transform contract to model + req.OutletID = &contextInfo.OutletID modelReq := transformer.ProductAnalyticsContractToModel(&req) - // Call service response, err := h.analyticsService.GetProductAnalytics(ctx, modelReq) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{contract.NewResponseError("internal_error", "AnalyticsHandler::GetProductAnalytics", err.Error())}), "AnalyticsHandler::GetProductAnalytics") return } - // Transform model to contract contractResp := transformer.ProductAnalyticsModelToContract(response) util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetProductAnalytics") } -// GetDashboardAnalytics handles the request to get dashboard analytics func (h *AnalyticsHandler) GetDashboardAnalytics(c *gin.Context) { ctx := c.Request.Context() contextInfo := appcontext.FromGinContext(ctx) @@ -114,6 +108,7 @@ func (h *AnalyticsHandler) GetDashboardAnalytics(c *gin.Context) { } req.OrganizationID = contextInfo.OrganizationID + req.OutletID = &contextInfo.OutletID modelReq := transformer.DashboardAnalyticsContractToModel(&req) response, err := h.analyticsService.GetDashboardAnalytics(ctx, modelReq) @@ -122,7 +117,6 @@ func (h *AnalyticsHandler) GetDashboardAnalytics(c *gin.Context) { return } - // Transform model to contract contractResp := transformer.DashboardAnalyticsModelToContract(response) util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetDashboardAnalytics") } diff --git a/internal/middleware/auth_middleware.go b/internal/middleware/auth_middleware.go index b43127a..812a605 100644 --- a/internal/middleware/auth_middleware.go +++ b/internal/middleware/auth_middleware.go @@ -44,6 +44,7 @@ func (m *AuthMiddleware) RequireAuth() gin.HandlerFunc { setKeyInContext(c, appcontext.UserRoleKey, userResponse.Role) setKeyInContext(c, appcontext.OrganizationIDKey, userResponse.OrganizationID.String()) setKeyInContext(c, appcontext.UserIDKey, userResponse.ID.String()) + setKeyInContext(c, appcontext.OutletIDKey, userResponse.OutletID.String()) logger.FromContext(c.Request.Context()).Infof("AuthMiddleware::RequireAuth -> User authenticated: %s", userResponse.Email) c.Next() diff --git a/internal/processor/analytics_processor.go b/internal/processor/analytics_processor.go index 5d88ddb..b7e21c6 100644 --- a/internal/processor/analytics_processor.go +++ b/internal/processor/analytics_processor.go @@ -37,7 +37,6 @@ func (p *AnalyticsProcessorImpl) GetPaymentMethodAnalytics(ctx context.Context, return nil, fmt.Errorf("failed to get payment method analytics: %w", err) } - // Calculate summary var totalAmount float64 var totalOrders int64 var totalPayments int64 diff --git a/internal/processor/ingredient_processor.go b/internal/processor/ingredient_processor.go index 6f6faf5..78aa9bb 100644 --- a/internal/processor/ingredient_processor.go +++ b/internal/processor/ingredient_processor.go @@ -23,13 +23,11 @@ func NewIngredientProcessor(ingredientRepo IngredientRepository, unitRepo UnitRe } func (p *IngredientProcessorImpl) CreateIngredient(ctx context.Context, req *models.CreateIngredientRequest) (*models.IngredientResponse, error) { - // Validate unit exists _, err := p.unitRepo.GetByID(ctx, req.UnitID, req.OrganizationID) if err != nil { return nil, err } - // Create ingredient entity ingredient := &entities.Ingredient{ ID: uuid.New(), OrganizationID: req.OrganizationID, diff --git a/internal/service/analytics_service.go b/internal/service/analytics_service.go index 65e955b..bf1f381 100644 --- a/internal/service/analytics_service.go +++ b/internal/service/analytics_service.go @@ -29,12 +29,10 @@ func NewAnalyticsServiceImpl(analyticsProcessor processor.AnalyticsProcessor) *A } func (s *AnalyticsServiceImpl) GetPaymentMethodAnalytics(ctx context.Context, req *models.PaymentMethodAnalyticsRequest) (*models.PaymentMethodAnalyticsResponse, error) { - // Validate request if err := s.validatePaymentMethodAnalyticsRequest(req); err != nil { return nil, fmt.Errorf("validation error: %w", err) } - // Process analytics request response, err := s.analyticsProcessor.GetPaymentMethodAnalytics(ctx, req) if err != nil { return nil, fmt.Errorf("failed to get payment method analytics: %w", err) @@ -106,7 +104,6 @@ func (s *AnalyticsServiceImpl) validatePaymentMethodAnalyticsRequest(req *models return fmt.Errorf("date_from cannot be after date_to") } - // Validate groupBy if provided if req.GroupBy != "" { validGroupBy := map[string]bool{ "day": true, diff --git a/internal/transformer/analytics_transformer.go b/internal/transformer/analytics_transformer.go index 920c9f4..96e663d 100644 --- a/internal/transformer/analytics_transformer.go +++ b/internal/transformer/analytics_transformer.go @@ -26,7 +26,7 @@ func PaymentMethodAnalyticsContractToModel(req *contract.PaymentMethodAnalyticsR } if req.DateFrom == req.DateTo { - dateTo.AddDate(0, 0, 1) + dateTo = dateTo.AddDate(0, 0, 1) } return &models.PaymentMethodAnalyticsRequest{ @@ -89,7 +89,7 @@ func SalesAnalyticsContractToModel(req *contract.SalesAnalyticsRequest) *models. } if req.DateFrom == req.DateTo { - dateTo.AddDate(0, 0, 1) + dateTo = dateTo.AddDate(0, 0, 1) } return &models.SalesAnalyticsRequest{ @@ -156,9 +156,9 @@ func ProductAnalyticsContractToModel(req *contract.ProductAnalyticsRequest) *mod } if req.DateFrom == req.DateTo { - dateTo.AddDate(0, 0, 1) + dateTo = dateTo.AddDate(0, 0, 1) } - + return &models.ProductAnalyticsRequest{ OrganizationID: req.OrganizationID, OutletID: req.OutletID, @@ -212,6 +212,11 @@ func DashboardAnalyticsContractToModel(req *contract.DashboardAnalyticsRequest) dateTo = dt } } + + if req.DateFrom == req.DateTo { + dateTo = dateTo.AddDate(0, 0, 1) + } + return &models.DashboardAnalyticsRequest{ OrganizationID: req.OrganizationID, OutletID: req.OutletID,