From 44302e043ae8f00355f260cf436d5d4522c8ff4f Mon Sep 17 00:00:00 2001 From: "aditya.siregar" Date: Fri, 2 Aug 2024 18:35:42 +0700 Subject: [PATCH] Add Filter and Total Tempat WIsata --- internal/entity/sites.go | 1 + internal/handlers/http/sites/sites.go | 4 ++-- internal/handlers/request/site.go | 3 ++- internal/repository/orders/order.go | 6 +++++- internal/repository/repository.go | 1 + internal/repository/sites/sites.go | 4 ++++ internal/repository/users/user.go | 19 +++++++++++++++++++ internal/services/sites/sites.go | 16 +++++++++++++++- 8 files changed, 49 insertions(+), 5 deletions(-) diff --git a/internal/entity/sites.go b/internal/entity/sites.go index a2bbd52..ac4fe78 100644 --- a/internal/entity/sites.go +++ b/internal/entity/sites.go @@ -29,6 +29,7 @@ type Site struct { type SiteSearch struct { PartnerID *int64 + SiteID *int64 IsAdmin bool Search string Name string diff --git a/internal/handlers/http/sites/sites.go b/internal/handlers/http/sites/sites.go index f8d0e88..aa9f740 100644 --- a/internal/handlers/http/sites/sites.go +++ b/internal/handlers/http/sites/sites.go @@ -150,7 +150,7 @@ func (h *Handler) GetAll(c *gin.Context) { } ctx := request.GetMyContext(c) - Sites, total, err := h.service.GetAll(c.Request.Context(), req.ToEntity(ctx, ctx.GetPartnerID())) + Sites, total, err := h.service.GetAll(c.Request.Context(), req.ToEntity(ctx, ctx.GetPartnerID(), ctx.GetSiteID())) if err != nil { response.ErrorWrapper(c, err) return @@ -252,7 +252,7 @@ func (h *Handler) Count(c *gin.Context) { } ctx := request.GetMyContext(c) - res, err := h.service.Count(ctx, req.ToEntity(ctx, ctx.GetPartnerID())) + res, err := h.service.Count(ctx, req.ToEntity(ctx, ctx.GetPartnerID(), ctx.GetSiteID())) if err != nil { response.ErrorWrapper(c, err) diff --git a/internal/handlers/request/site.go b/internal/handlers/request/site.go index 5d4125f..51c26e4 100644 --- a/internal/handlers/request/site.go +++ b/internal/handlers/request/site.go @@ -67,10 +67,11 @@ type SiteParam struct { Offset int `form:"offset,default=0"` } -func (r *SiteParam) ToEntity(ctx mycontext.Context, partnerID *int64) entity.SiteSearch { +func (r *SiteParam) ToEntity(ctx mycontext.Context, partnerID *int64, siteID *int64) entity.SiteSearch { return entity.SiteSearch{ PartnerID: partnerID, IsAdmin: ctx.IsAdmin(), + SiteID: siteID, Search: r.Search, Name: r.Name, Limit: r.Limit, diff --git a/internal/repository/orders/order.go b/internal/repository/orders/order.go index 70a1b21..0a8f40e 100644 --- a/internal/repository/orders/order.go +++ b/internal/repository/orders/order.go @@ -188,10 +188,14 @@ func (r *OrderRepository) SumAmount(ctx mycontext.Context, req entity.OrderSearc Where("date(created_at) = ?", today). Where("status = ?", "PAID") - if !req.IsAdmin { + if req.PartnerID != nil { query = query.Where("orders.partner_id = ?", req.PartnerID) } + if req.SiteID != nil { + query = query.Where("orders.site_id = ?", req.SiteID) + } + if err := query.Scan(&amount).Error; err != nil { logger.ContextLogger(ctx).Error("error when get cash amount", zap.Error(err)) return nil, err diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 1d25a16..37729d8 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -109,6 +109,7 @@ type User interface { GetUserByEmail(ctx context.Context, email string) (*entity.UserDB, error) UpdateUser(ctx context.Context, user *entity.UserDB) (*entity.UserDB, error) UpdateUserWithTx(ctx context.Context, tx *gorm.DB, user *entity.UserDB) (*entity.UserDB, error) + CountUsersByRoleAndSiteOrPartner(ctx context.Context, roleID int, siteID *int64) (int, error) } type Branch interface { diff --git a/internal/repository/sites/sites.go b/internal/repository/sites/sites.go index f97b9ac..124cc10 100644 --- a/internal/repository/sites/sites.go +++ b/internal/repository/sites/sites.go @@ -105,6 +105,10 @@ func (r *SiteRepository) GetAll(ctx context.Context, req entity.SiteSearch) (ent query = query.Where("partner_id = ?", req.PartnerID) } + if req.SiteID != nil { + query = query.Where("id = ?", req.SiteID) + } + if req.Limit > 0 { query = query.Limit(req.Limit) } diff --git a/internal/repository/users/user.go b/internal/repository/users/user.go index a0b186c..4c48e88 100644 --- a/internal/repository/users/user.go +++ b/internal/repository/users/user.go @@ -207,3 +207,22 @@ func (r *UserRepository) UpdateUserWithTx(ctx context.Context, tx *gorm.DB, user func logError(ctx context.Context, action string, err error) { logger.ContextLogger(ctx).Error("error when "+action, zap.Error(err)) } + +func (r *UserRepository) CountUsersByRoleAndSiteOrPartner(ctx context.Context, roleID int, siteID *int64) (int, error) { + var count int64 + + query := r.db.Table("users"). + Joins("LEFT JOIN user_roles ur ON users.id = ur.user_id"). + Where("ur.role_id = ?", roleID) + + if siteID != nil { + query = query.Where("ur.site_id = ?", siteID) + } + + if err := query.Count(&count).Error; err != nil { + logger.ContextLogger(ctx).Error("error when counting users by role and site/partner", zap.Error(err)) + return 0, err + } + + return int(count), nil +} diff --git a/internal/services/sites/sites.go b/internal/services/sites/sites.go index ca62133..360417a 100644 --- a/internal/services/sites/sites.go +++ b/internal/services/sites/sites.go @@ -4,14 +4,17 @@ import ( "context" "furtuna-be/internal/common/logger" "furtuna-be/internal/common/mycontext" + "furtuna-be/internal/constants/role" "furtuna-be/internal/entity" "furtuna-be/internal/repository" + "furtuna-be/internal/repository/users" "go.uber.org/zap" ) type SiteService struct { repo repository.SiteRepository + user users.UserRepository } func NewSiteService(repo repository.SiteRepository) *SiteService { @@ -89,6 +92,17 @@ func (s *SiteService) Delete(ctx mycontext.Context, id int64) error { } func (s *SiteService) Count(ctx mycontext.Context, req entity.SiteSearch) (*entity.SiteCount, error) { + if req.SiteID != nil { + total, err := s.user.CountUsersByRoleAndSiteOrPartner(ctx, int(role.Casheer), req.SiteID) + if err != nil { + logger.ContextLogger(ctx).Error("error when getting count user", zap.Error(err)) + return nil, err + } + return &entity.SiteCount{ + Count: total, + }, nil + } + count, err := s.repo.Count(ctx, req) if err != nil { logger.ContextLogger(ctx).Error("error when getting all sites", zap.Error(err)) @@ -96,4 +110,4 @@ func (s *SiteService) Count(ctx mycontext.Context, req entity.SiteSearch) (*enti } return count.ToSiteCount(), nil -} \ No newline at end of file +}