Fix Analytics

This commit is contained in:
Aditya Siregar 2025-08-05 22:50:12 +07:00
parent 5741243425
commit 073681d4d5
6 changed files with 14 additions and 20 deletions

View File

@ -36,6 +36,7 @@ func (h *AnalyticsHandler) GetPaymentMethodAnalytics(c *gin.Context) {
} }
req.OrganizationID = contextInfo.OrganizationID req.OrganizationID = contextInfo.OrganizationID
req.OutletID = &contextInfo.OutletID
modelReq := transformer.PaymentMethodAnalyticsContractToModel(&req) modelReq := transformer.PaymentMethodAnalyticsContractToModel(&req)
response, err := h.analyticsService.GetPaymentMethodAnalytics(ctx, modelReq) response, err := h.analyticsService.GetPaymentMethodAnalytics(ctx, modelReq)
@ -44,12 +45,10 @@ func (h *AnalyticsHandler) GetPaymentMethodAnalytics(c *gin.Context) {
return return
} }
// Transform model to contract
contractResp := transformer.PaymentMethodAnalyticsModelToContract(response) contractResp := transformer.PaymentMethodAnalyticsModelToContract(response)
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetPaymentMethodAnalytics") 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) { func (h *AnalyticsHandler) GetSalesAnalytics(c *gin.Context) {
ctx := c.Request.Context() ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx) contextInfo := appcontext.FromGinContext(ctx)
@ -61,21 +60,19 @@ func (h *AnalyticsHandler) GetSalesAnalytics(c *gin.Context) {
} }
req.OrganizationID = contextInfo.OrganizationID req.OrganizationID = contextInfo.OrganizationID
req.OutletID = &contextInfo.OutletID
modelReq := transformer.SalesAnalyticsContractToModel(&req) modelReq := transformer.SalesAnalyticsContractToModel(&req)
// Call service
response, err := h.analyticsService.GetSalesAnalytics(ctx, modelReq) response, err := h.analyticsService.GetSalesAnalytics(ctx, modelReq)
if err != nil { if err != nil {
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{contract.NewResponseError("internal_error", "AnalyticsHandler::GetSalesAnalytics", err.Error())}), "AnalyticsHandler::GetSalesAnalytics") util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{contract.NewResponseError("internal_error", "AnalyticsHandler::GetSalesAnalytics", err.Error())}), "AnalyticsHandler::GetSalesAnalytics")
return return
} }
// Transform model to contract
contractResp := transformer.SalesAnalyticsModelToContract(response) contractResp := transformer.SalesAnalyticsModelToContract(response)
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetSalesAnalytics") 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) { func (h *AnalyticsHandler) GetProductAnalytics(c *gin.Context) {
ctx := c.Request.Context() ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx) contextInfo := appcontext.FromGinContext(ctx)
@ -87,22 +84,19 @@ func (h *AnalyticsHandler) GetProductAnalytics(c *gin.Context) {
} }
req.OrganizationID = contextInfo.OrganizationID req.OrganizationID = contextInfo.OrganizationID
// Transform contract to model req.OutletID = &contextInfo.OutletID
modelReq := transformer.ProductAnalyticsContractToModel(&req) modelReq := transformer.ProductAnalyticsContractToModel(&req)
// Call service
response, err := h.analyticsService.GetProductAnalytics(ctx, modelReq) response, err := h.analyticsService.GetProductAnalytics(ctx, modelReq)
if err != nil { if err != nil {
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{contract.NewResponseError("internal_error", "AnalyticsHandler::GetProductAnalytics", err.Error())}), "AnalyticsHandler::GetProductAnalytics") util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{contract.NewResponseError("internal_error", "AnalyticsHandler::GetProductAnalytics", err.Error())}), "AnalyticsHandler::GetProductAnalytics")
return return
} }
// Transform model to contract
contractResp := transformer.ProductAnalyticsModelToContract(response) contractResp := transformer.ProductAnalyticsModelToContract(response)
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetProductAnalytics") 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) { func (h *AnalyticsHandler) GetDashboardAnalytics(c *gin.Context) {
ctx := c.Request.Context() ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx) contextInfo := appcontext.FromGinContext(ctx)
@ -114,6 +108,7 @@ func (h *AnalyticsHandler) GetDashboardAnalytics(c *gin.Context) {
} }
req.OrganizationID = contextInfo.OrganizationID req.OrganizationID = contextInfo.OrganizationID
req.OutletID = &contextInfo.OutletID
modelReq := transformer.DashboardAnalyticsContractToModel(&req) modelReq := transformer.DashboardAnalyticsContractToModel(&req)
response, err := h.analyticsService.GetDashboardAnalytics(ctx, modelReq) response, err := h.analyticsService.GetDashboardAnalytics(ctx, modelReq)
@ -122,7 +117,6 @@ func (h *AnalyticsHandler) GetDashboardAnalytics(c *gin.Context) {
return return
} }
// Transform model to contract
contractResp := transformer.DashboardAnalyticsModelToContract(response) contractResp := transformer.DashboardAnalyticsModelToContract(response)
util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetDashboardAnalytics") util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(contractResp), "AnalyticsHandler::GetDashboardAnalytics")
} }

View File

@ -44,6 +44,7 @@ func (m *AuthMiddleware) RequireAuth() gin.HandlerFunc {
setKeyInContext(c, appcontext.UserRoleKey, userResponse.Role) setKeyInContext(c, appcontext.UserRoleKey, userResponse.Role)
setKeyInContext(c, appcontext.OrganizationIDKey, userResponse.OrganizationID.String()) setKeyInContext(c, appcontext.OrganizationIDKey, userResponse.OrganizationID.String())
setKeyInContext(c, appcontext.UserIDKey, userResponse.ID.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) logger.FromContext(c.Request.Context()).Infof("AuthMiddleware::RequireAuth -> User authenticated: %s", userResponse.Email)
c.Next() c.Next()

View File

@ -37,7 +37,6 @@ func (p *AnalyticsProcessorImpl) GetPaymentMethodAnalytics(ctx context.Context,
return nil, fmt.Errorf("failed to get payment method analytics: %w", err) return nil, fmt.Errorf("failed to get payment method analytics: %w", err)
} }
// Calculate summary
var totalAmount float64 var totalAmount float64
var totalOrders int64 var totalOrders int64
var totalPayments int64 var totalPayments int64

View File

@ -23,13 +23,11 @@ func NewIngredientProcessor(ingredientRepo IngredientRepository, unitRepo UnitRe
} }
func (p *IngredientProcessorImpl) CreateIngredient(ctx context.Context, req *models.CreateIngredientRequest) (*models.IngredientResponse, error) { 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) _, err := p.unitRepo.GetByID(ctx, req.UnitID, req.OrganizationID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Create ingredient entity
ingredient := &entities.Ingredient{ ingredient := &entities.Ingredient{
ID: uuid.New(), ID: uuid.New(),
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,

View File

@ -29,12 +29,10 @@ func NewAnalyticsServiceImpl(analyticsProcessor processor.AnalyticsProcessor) *A
} }
func (s *AnalyticsServiceImpl) GetPaymentMethodAnalytics(ctx context.Context, req *models.PaymentMethodAnalyticsRequest) (*models.PaymentMethodAnalyticsResponse, error) { func (s *AnalyticsServiceImpl) GetPaymentMethodAnalytics(ctx context.Context, req *models.PaymentMethodAnalyticsRequest) (*models.PaymentMethodAnalyticsResponse, error) {
// Validate request
if err := s.validatePaymentMethodAnalyticsRequest(req); err != nil { if err := s.validatePaymentMethodAnalyticsRequest(req); err != nil {
return nil, fmt.Errorf("validation error: %w", err) return nil, fmt.Errorf("validation error: %w", err)
} }
// Process analytics request
response, err := s.analyticsProcessor.GetPaymentMethodAnalytics(ctx, req) response, err := s.analyticsProcessor.GetPaymentMethodAnalytics(ctx, req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get payment method analytics: %w", err) 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") return fmt.Errorf("date_from cannot be after date_to")
} }
// Validate groupBy if provided
if req.GroupBy != "" { if req.GroupBy != "" {
validGroupBy := map[string]bool{ validGroupBy := map[string]bool{
"day": true, "day": true,

View File

@ -26,7 +26,7 @@ func PaymentMethodAnalyticsContractToModel(req *contract.PaymentMethodAnalyticsR
} }
if req.DateFrom == req.DateTo { if req.DateFrom == req.DateTo {
dateTo.AddDate(0, 0, 1) dateTo = dateTo.AddDate(0, 0, 1)
} }
return &models.PaymentMethodAnalyticsRequest{ return &models.PaymentMethodAnalyticsRequest{
@ -89,7 +89,7 @@ func SalesAnalyticsContractToModel(req *contract.SalesAnalyticsRequest) *models.
} }
if req.DateFrom == req.DateTo { if req.DateFrom == req.DateTo {
dateTo.AddDate(0, 0, 1) dateTo = dateTo.AddDate(0, 0, 1)
} }
return &models.SalesAnalyticsRequest{ return &models.SalesAnalyticsRequest{
@ -156,9 +156,9 @@ func ProductAnalyticsContractToModel(req *contract.ProductAnalyticsRequest) *mod
} }
if req.DateFrom == req.DateTo { if req.DateFrom == req.DateTo {
dateTo.AddDate(0, 0, 1) dateTo = dateTo.AddDate(0, 0, 1)
} }
return &models.ProductAnalyticsRequest{ return &models.ProductAnalyticsRequest{
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
OutletID: req.OutletID, OutletID: req.OutletID,
@ -212,6 +212,11 @@ func DashboardAnalyticsContractToModel(req *contract.DashboardAnalyticsRequest)
dateTo = dt dateTo = dt
} }
} }
if req.DateFrom == req.DateTo {
dateTo = dateTo.AddDate(0, 0, 1)
}
return &models.DashboardAnalyticsRequest{ return &models.DashboardAnalyticsRequest{
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
OutletID: req.OutletID, OutletID: req.OutletID,