package coresvc import ( "context" "wpw-common/pkg/gen/biz/core" "wpw-common/pkg/gen/biz/core/structs" "gorm.io/gorm" ) var _ core.CoreService = (*CoreService)(nil) func (c *CoreService) GetWajibPajakList(ctx context.Context, request *structs.GetWajibPajakListRequest) (r *structs.GetWajibPajakListResponse, err error) { c.logger.Infow("get wajib pajak request", "req", request) var user *structs.User if user, err = c.getAndCheckSession(ctx); err != nil { return } _ = user if err = c.checkRequest(ctx, request); err != nil { return } r = structs.NewGetWajibPajakListResponse() r.Pagination = request.Pagination // query scopes scopes := []scopeFunc{ c.ScPaginate(request.Pagination), } // using search term if searchTerm := request.SearchTerm; searchTerm != "" { scopes = append(scopes, c.ScSearchTerm(request.SearchTerm, "profile_npwp", "profile_display_name", "profile_address")) } // admin user, ignoring the `ownership` if c.isSystemUser(user) { // get all wps tx := c.db.Scopes(scopes...). Find(&r.WajibPajakList) if err = tx.Error; err != nil { return } // get all wps count tx = c.db.Model(structs.WajibPajak{}).Count(&r.TotalWajibPajak) if err = tx.Error; err != nil { return } return } // normal user var tx *gorm.DB switch request.Ownership { case structs.WajibPajakOwnership_OWNED: tx = c.db. Preload("OwnedWajibPajakList"). Where(user). First(&user) if err = tx.Error; err != nil { err = c.wrapServiceError(err) return } r.WajibPajakList = user.OwnedWajibPajakList r.TotalWajibPajak = int64(len(user.OwnedWajibPajakList)) // TODO: temporary case structs.WajibPajakOwnership_ROLE: tx = c.db. Preload("RolesWajibPajakList"). Preload("RolesWajibPajakList.WajibPajakList"). Where(user).First(&user) if err = tx.Error; err != nil { err = c.wrapServiceError(err) return } for _, role := range user.Roles { r.WajibPajakList = append(r.WajibPajakList, role.WajibPajakList...) } r.TotalWajibPajak = int64(len(r.WajibPajakList)) // TODO: temporary default: err = c.wrapServiceError(ErrBadRequest) return } return } func (c *CoreService) CreateWajibPajak(ctx context.Context, request *structs.CreateWajibPajakRequest) (r *structs.CreateWajibPajakResponse, err error) { c.logger.Infow("create wajib pajajk request", "req", request) var user *structs.User if user, err = c.getAndCheckSession(ctx); err != nil { return } _ = user if err = c.checkRequest(ctx, request); err != nil { return } var wp structs.WajibPajak wp.Profile = request.WajibPajak.Profile wp.Owners = []*structs.User{ // set authenticated user as the ownner of the Wajib Pajak user, } tx := c.db.Create(&wp) if err = tx.Error; err != nil { err = c.wrapServiceError(err) return } r = structs.NewCreateWajibPajakResponse() return } func (c *CoreService) DeleteWajibPajakList(ctx context.Context, request *structs.DeleteWajibpajakListRequest) (r *structs.DeleteWajibpajakListResponse, err error) { c.logger.Infow("delete wajib pajak request", "req", request) var user *structs.User if user, err = c.getAndCheckSession(ctx); err != nil { return } _ = user if err = c.checkRequest(ctx, request); err != nil { return } var targetWps []*structs.WajibPajak tx := c.db. Where("id IN ?", request.WpIds). Select("id"). Preload("Owners"). Find(&targetWps) if err = tx.Error; err != nil { err = c.wrapServiceError(err) return } var ( qsTargetWps []*structs.WajibPajak idsSuccess []int64 idsIgnored []int64 ) err = c.db.Transaction(func(tx *gorm.DB) (err error) { for _, targetWp := range targetWps { var found bool for _, owner := range targetWp.Owners { if owner.ID == user.ID { qsTargetWps = append(qsTargetWps, targetWp) found = true break } } if found { idsSuccess = append(idsSuccess, targetWp.ID) } else { idsIgnored = append(idsIgnored, targetWp.ID) } } tx = tx.Delete(qsTargetWps) if err = tx.Error; err != nil { err = c.wrapServiceError(err) return } return }) if err != nil { err = c.wrapServiceError(err) return } r = structs.NewDeleteWajibpajakListResponse() r.Success = idsSuccess r.Ignored = idsIgnored return }