wpw-final/internal/biz/core/handler_wajib_pajak.go
2022-12-02 20:40:23 +07:00

181 lines
4.2 KiB
Go

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
}