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 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.Select("id, name").First(&company, *user.CompanyID).Error; err == nil {
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:"-"`