181 lines
4.2 KiB
Go
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
|
|
}
|