Mhamdans17 commited on
Commit ·
88124cb
1
Parent(s): 7121ebc
feat: Add flexible tenant subscription settings (member, voucher, multi-branch, multi-kasir)
Browse files- controllers/auth_controller.go +29 -1
- controllers/company_controller.go +39 -0
- models/models.go +4 -0
controllers/auth_controller.go
CHANGED
|
@@ -82,6 +82,7 @@ type UserResponse struct {
|
|
| 82 |
IsActive bool `json:"is_active"`
|
| 83 |
CompanyName string `json:"company_name,omitempty"`
|
| 84 |
BranchName string `json:"branch_name,omitempty"`
|
|
|
|
| 85 |
CreatedAt time.Time `json:"created_at"`
|
| 86 |
}
|
| 87 |
|
|
@@ -161,6 +162,12 @@ func toUserResponse(user *models.User) UserResponse {
|
|
| 161 |
}
|
| 162 |
if user.Company != nil {
|
| 163 |
resp.CompanyName = user.Company.Name
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 164 |
}
|
| 165 |
if user.Branch != nil {
|
| 166 |
resp.BranchName = user.Branch.Name
|
|
@@ -523,8 +530,14 @@ func GetMe(c *gin.Context) {
|
|
| 523 |
// Attach Company & Branch name jika ada
|
| 524 |
if user.CompanyID != nil {
|
| 525 |
var company models.Company
|
| 526 |
-
if err := config.DB.
|
| 527 |
resp.CompanyName = company.Name
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 528 |
}
|
| 529 |
}
|
| 530 |
|
|
@@ -667,6 +680,21 @@ func CreateKasir(c *gin.Context) {
|
|
| 667 |
return
|
| 668 |
}
|
| 669 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 670 |
hashedPassword, _ := middleware.HashPassword(req.Password)
|
| 671 |
newUser := models.User{
|
| 672 |
Name: req.Name,
|
|
|
|
| 82 |
IsActive bool `json:"is_active"`
|
| 83 |
CompanyName string `json:"company_name,omitempty"`
|
| 84 |
BranchName string `json:"branch_name,omitempty"`
|
| 85 |
+
CompanySettings map[string]interface{} `json:"company_settings,omitempty"`
|
| 86 |
CreatedAt time.Time `json:"created_at"`
|
| 87 |
}
|
| 88 |
|
|
|
|
| 162 |
}
|
| 163 |
if user.Company != nil {
|
| 164 |
resp.CompanyName = user.Company.Name
|
| 165 |
+
resp.CompanySettings = map[string]interface{}{
|
| 166 |
+
"enable_member": user.Company.EnableMember,
|
| 167 |
+
"enable_voucher": user.Company.EnableVoucher,
|
| 168 |
+
"enable_multi_branch": user.Company.EnableMultiBranch,
|
| 169 |
+
"enable_multi_kasir": user.Company.EnableMultiKasir,
|
| 170 |
+
}
|
| 171 |
}
|
| 172 |
if user.Branch != nil {
|
| 173 |
resp.BranchName = user.Branch.Name
|
|
|
|
| 530 |
// Attach Company & Branch name jika ada
|
| 531 |
if user.CompanyID != nil {
|
| 532 |
var company models.Company
|
| 533 |
+
if err := config.DB.First(&company, *user.CompanyID).Error; err == nil {
|
| 534 |
resp.CompanyName = company.Name
|
| 535 |
+
resp.CompanySettings = map[string]interface{}{
|
| 536 |
+
"enable_member": company.EnableMember,
|
| 537 |
+
"enable_voucher": company.EnableVoucher,
|
| 538 |
+
"enable_multi_branch": company.EnableMultiBranch,
|
| 539 |
+
"enable_multi_kasir": company.EnableMultiKasir,
|
| 540 |
+
}
|
| 541 |
}
|
| 542 |
}
|
| 543 |
|
|
|
|
| 680 |
return
|
| 681 |
}
|
| 682 |
|
| 683 |
+
var company models.Company
|
| 684 |
+
if err := config.DB.First(&company, *owner.CompanyID).Error; err != nil {
|
| 685 |
+
c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal mengambil data perusahaan"})
|
| 686 |
+
return
|
| 687 |
+
}
|
| 688 |
+
|
| 689 |
+
if !company.EnableMultiKasir {
|
| 690 |
+
var kasirCount int64
|
| 691 |
+
config.DB.Model(&models.User{}).Where("company_id = ? AND role = ?", *owner.CompanyID, "kasir").Count(&kasirCount)
|
| 692 |
+
if kasirCount >= 1 {
|
| 693 |
+
c.JSON(http.StatusForbidden, gin.H{"detail": "Paket perusahaan Anda tidak mendukung pembuatan lebih dari 1 kasir"})
|
| 694 |
+
return
|
| 695 |
+
}
|
| 696 |
+
}
|
| 697 |
+
|
| 698 |
hashedPassword, _ := middleware.HashPassword(req.Password)
|
| 699 |
newUser := models.User{
|
| 700 |
Name: req.Name,
|
controllers/company_controller.go
CHANGED
|
@@ -34,6 +34,10 @@ type CompanyResponse struct {
|
|
| 34 |
ChargeFeeBeforeDiscount bool `json:"charge_fee_before_discount"`
|
| 35 |
WalletBalance float64 `json:"wallet_balance"`
|
| 36 |
WalletLimit float64 `json:"wallet_limit"`
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
ApprovedAt *time.Time `json:"approved_at"`
|
| 38 |
OwnerVerified *bool `json:"owner_verified,omitempty"`
|
| 39 |
OwnerName string `json:"owner_name,omitempty"`
|
|
@@ -211,6 +215,10 @@ func ListCompanies(c *gin.Context) {
|
|
| 211 |
ChargeFeeBeforeDiscount: comp.ChargeFeeBeforeDiscount,
|
| 212 |
WalletBalance: comp.WalletBalance,
|
| 213 |
WalletLimit: comp.WalletLimit,
|
|
|
|
|
|
|
|
|
|
|
|
|
| 214 |
CreatedAt: comp.CreatedAt,
|
| 215 |
})
|
| 216 |
}
|
|
@@ -707,6 +715,21 @@ func CreateBranch(c *gin.Context) {
|
|
| 707 |
return
|
| 708 |
}
|
| 709 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 710 |
isPointEnabled := true
|
| 711 |
if req.IsPointEnabled != nil {
|
| 712 |
isPointEnabled = *req.IsPointEnabled
|
|
@@ -937,6 +960,10 @@ func ToggleProductAvailability(c *gin.Context) {
|
|
| 937 |
|
| 938 |
type UpdateCompanySettingsRequest struct {
|
| 939 |
ChargeFeeBeforeDiscount *bool `json:"charge_fee_before_discount"`
|
|
|
|
|
|
|
|
|
|
|
|
|
| 940 |
}
|
| 941 |
|
| 942 |
func AdminUpdateCompanySettings(c *gin.Context) {
|
|
@@ -962,6 +989,18 @@ func AdminUpdateCompanySettings(c *gin.Context) {
|
|
| 962 |
if req.ChargeFeeBeforeDiscount != nil {
|
| 963 |
company.ChargeFeeBeforeDiscount = *req.ChargeFeeBeforeDiscount
|
| 964 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 965 |
|
| 966 |
if err := config.DB.Save(&company).Error; err != nil {
|
| 967 |
c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal menyimpan pengaturan"})
|
|
|
|
| 34 |
ChargeFeeBeforeDiscount bool `json:"charge_fee_before_discount"`
|
| 35 |
WalletBalance float64 `json:"wallet_balance"`
|
| 36 |
WalletLimit float64 `json:"wallet_limit"`
|
| 37 |
+
EnableMember bool `json:"enable_member"`
|
| 38 |
+
EnableVoucher bool `json:"enable_voucher"`
|
| 39 |
+
EnableMultiBranch bool `json:"enable_multi_branch"`
|
| 40 |
+
EnableMultiKasir bool `json:"enable_multi_kasir"`
|
| 41 |
ApprovedAt *time.Time `json:"approved_at"`
|
| 42 |
OwnerVerified *bool `json:"owner_verified,omitempty"`
|
| 43 |
OwnerName string `json:"owner_name,omitempty"`
|
|
|
|
| 215 |
ChargeFeeBeforeDiscount: comp.ChargeFeeBeforeDiscount,
|
| 216 |
WalletBalance: comp.WalletBalance,
|
| 217 |
WalletLimit: comp.WalletLimit,
|
| 218 |
+
EnableMember: comp.EnableMember,
|
| 219 |
+
EnableVoucher: comp.EnableVoucher,
|
| 220 |
+
EnableMultiBranch: comp.EnableMultiBranch,
|
| 221 |
+
EnableMultiKasir: comp.EnableMultiKasir,
|
| 222 |
CreatedAt: comp.CreatedAt,
|
| 223 |
})
|
| 224 |
}
|
|
|
|
| 715 |
return
|
| 716 |
}
|
| 717 |
|
| 718 |
+
var company models.Company
|
| 719 |
+
if err := config.DB.First(&company, *owner.CompanyID).Error; err != nil {
|
| 720 |
+
c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal mengambil data perusahaan"})
|
| 721 |
+
return
|
| 722 |
+
}
|
| 723 |
+
|
| 724 |
+
if !company.EnableMultiBranch {
|
| 725 |
+
var branchCount int64
|
| 726 |
+
config.DB.Model(&models.Branch{}).Where("company_id = ?", *owner.CompanyID).Count(&branchCount)
|
| 727 |
+
if branchCount >= 1 {
|
| 728 |
+
c.JSON(http.StatusForbidden, gin.H{"detail": "Paket perusahaan Anda tidak mendukung pembuatan lebih dari 1 cabang"})
|
| 729 |
+
return
|
| 730 |
+
}
|
| 731 |
+
}
|
| 732 |
+
|
| 733 |
isPointEnabled := true
|
| 734 |
if req.IsPointEnabled != nil {
|
| 735 |
isPointEnabled = *req.IsPointEnabled
|
|
|
|
| 960 |
|
| 961 |
type UpdateCompanySettingsRequest struct {
|
| 962 |
ChargeFeeBeforeDiscount *bool `json:"charge_fee_before_discount"`
|
| 963 |
+
EnableMember *bool `json:"enable_member"`
|
| 964 |
+
EnableVoucher *bool `json:"enable_voucher"`
|
| 965 |
+
EnableMultiBranch *bool `json:"enable_multi_branch"`
|
| 966 |
+
EnableMultiKasir *bool `json:"enable_multi_kasir"`
|
| 967 |
}
|
| 968 |
|
| 969 |
func AdminUpdateCompanySettings(c *gin.Context) {
|
|
|
|
| 989 |
if req.ChargeFeeBeforeDiscount != nil {
|
| 990 |
company.ChargeFeeBeforeDiscount = *req.ChargeFeeBeforeDiscount
|
| 991 |
}
|
| 992 |
+
if req.EnableMember != nil {
|
| 993 |
+
company.EnableMember = *req.EnableMember
|
| 994 |
+
}
|
| 995 |
+
if req.EnableVoucher != nil {
|
| 996 |
+
company.EnableVoucher = *req.EnableVoucher
|
| 997 |
+
}
|
| 998 |
+
if req.EnableMultiBranch != nil {
|
| 999 |
+
company.EnableMultiBranch = *req.EnableMultiBranch
|
| 1000 |
+
}
|
| 1001 |
+
if req.EnableMultiKasir != nil {
|
| 1002 |
+
company.EnableMultiKasir = *req.EnableMultiKasir
|
| 1003 |
+
}
|
| 1004 |
|
| 1005 |
if err := config.DB.Save(&company).Error; err != nil {
|
| 1006 |
c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal menyimpan pengaturan"})
|
models/models.go
CHANGED
|
@@ -30,6 +30,10 @@ type Company struct {
|
|
| 30 |
ChargeFeeBeforeDiscount bool `gorm:"default:false" json:"charge_fee_before_discount"`
|
| 31 |
WalletBalance float64 `gorm:"type:float;default:0.0" json:"wallet_balance"`
|
| 32 |
WalletLimit float64 `gorm:"type:float;default:-50000.0" json:"wallet_limit"`
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
PointRules []PointRule `gorm:"foreignKey:CompanyID;constraint:OnDelete:CASCADE" json:"point_rules"`
|
| 34 |
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
| 35 |
Branches []Branch `gorm:"foreignKey:CompanyID;constraint:OnDelete:CASCADE" json:"-"`
|
|
|
|
| 30 |
ChargeFeeBeforeDiscount bool `gorm:"default:false" json:"charge_fee_before_discount"`
|
| 31 |
WalletBalance float64 `gorm:"type:float;default:0.0" json:"wallet_balance"`
|
| 32 |
WalletLimit float64 `gorm:"type:float;default:-50000.0" json:"wallet_limit"`
|
| 33 |
+
EnableMember bool `gorm:"default:true" json:"enable_member"`
|
| 34 |
+
EnableVoucher bool `gorm:"default:true" json:"enable_voucher"`
|
| 35 |
+
EnableMultiBranch bool `gorm:"default:false" json:"enable_multi_branch"`
|
| 36 |
+
EnableMultiKasir bool `gorm:"default:false" json:"enable_multi_kasir"`
|
| 37 |
PointRules []PointRule `gorm:"foreignKey:CompanyID;constraint:OnDelete:CASCADE" json:"point_rules"`
|
| 38 |
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
| 39 |
Branches []Branch `gorm:"foreignKey:CompanyID;constraint:OnDelete:CASCADE" json:"-"`
|